gprs_ns2_sns: introduce SNS Size/Config retries

According to 3GPP Size and Config procedure can
have retries in case the timeout of the procedure runs out.

Change-Id: I00e9023a6e7adc6ad48f4016fcaef189ac8b353e
This commit is contained in:
Alexander Couzens 2020-12-07 06:18:32 +01:00 committed by lynxis lazus
parent 81ae0aa67f
commit 90ee963570
3 changed files with 19 additions and 5 deletions

View File

@ -1153,6 +1153,8 @@ struct gprs_ns2_inst *gprs_ns2_instantiate(void *ctx, osmo_prim_cb cb, void *cb_
nsi->timeout[NS_TOUT_TNS_ALIVE] = 3;
nsi->timeout[NS_TOUT_TNS_ALIVE_RETRIES] = 10;
nsi->timeout[NS_TOUT_TSNS_PROV] = 3; /* 1..10 */
nsi->timeout[NS_TOUT_TSNS_SIZE_RETRIES] = 3;
nsi->timeout[NS_TOUT_TSNS_CONFIG_RETRIES] = 3;
return nsi;
}

View File

@ -15,10 +15,8 @@ struct vty;
struct gprs_ns2_vc_driver;
struct gprs_ns2_vc_bind;
#define NS_TIMERS_COUNT 8
#define NS_TIMERS "(tns-block|tns-block-retries|tns-reset|tns-reset-retries|tns-test|tns-alive|tns-alive-retries|tsns-prov)"
#define NS_TIMERS_COUNT 10
#define NS_TIMERS "(tns-block|tns-block-retries|tns-reset|tns-reset-retries|tns-test|tns-alive|tns-alive-retries|tsns-prov|tsns-prov-retries)"
#define NS_TIMERS_HELP \
"(un)blocking Timer (Tns-block) timeout\n" \
"(un)blocking Timer (Tns-block) number of retries\n" \
@ -27,7 +25,9 @@ struct gprs_ns2_vc_bind;
"Test Timer (Tns-test) timeout\n" \
"Alive Timer (Tns-alive) timeout\n" \
"Alive Timer (Tns-alive) number of retries\n" \
"SNS Provision Timer (Tsns-prov) timeout\n"
"SNS Provision Timer (Tsns-prov) timeout\n" \
"SNS Size number of retries\n" \
"SNS Config number of retries\n" \
/* Educated guess - LLC user payload is 1500 bytes plus possible headers */
#define NS_ALLOC_SIZE 3072
@ -42,6 +42,8 @@ enum ns2_timeout {
NS_TOUT_TNS_ALIVE,
NS_TOUT_TNS_ALIVE_RETRIES,
NS_TOUT_TSNS_PROV,
NS_TOUT_TSNS_SIZE_RETRIES,
NS_TOUT_TSNS_CONFIG_RETRIES,
};
enum nsvc_timer_mode {

View File

@ -119,6 +119,8 @@ struct ns2_sns_state {
struct gprs_ns2_vc *sns_nsvc;
/* iterate over the binds after all remote has been tested */
int bind_offset;
/* timer N */
int N;
/* local configuration to send to the remote end */
struct gprs_ns_ie_ip4_elem *ip4_local;
@ -1304,14 +1306,22 @@ static const struct osmo_fsm_state ns2_sns_bss_states[] = {
static int ns2_sns_fsm_bss_timer_cb(struct osmo_fsm_inst *fi)
{
struct ns2_sns_state *gss = (struct ns2_sns_state *) fi->priv;
struct gprs_ns2_nse *nse = nse_inst_from_fi(fi);
struct gprs_ns2_inst *nsi = nse->nsi;
gss->N++;
switch (fi->T) {
case 1:
if (gss->N >= nsi->timeout[NS_TOUT_TSNS_SIZE_RETRIES])
osmo_fsm_inst_dispatch(fi, GPRS_SNS_EV_SELECT_ENDPOINT, NULL);
osmo_fsm_inst_state_chg(fi, GPRS_SNS_ST_SIZE, nsi->timeout[NS_TOUT_TSNS_PROV], 1);
break;
case 2:
if (gss->N >= nsi->timeout[NS_TOUT_TSNS_CONFIG_RETRIES])
osmo_fsm_inst_dispatch(fi, GPRS_SNS_EV_SELECT_ENDPOINT, NULL);
osmo_fsm_inst_state_chg(fi, GPRS_SNS_ST_CONFIG_BSS, nsi->timeout[NS_TOUT_TSNS_PROV], 2);
break;
}