aboutsummaryrefslogtreecommitdiffstats
path: root/src/gb
diff options
context:
space:
mode:
authorAlexander Couzens <lynxis@fe80.eu>2020-12-07 06:18:32 +0100
committerlynxis lazus <lynxis@fe80.eu>2020-12-15 11:46:45 +0000
commit90ee963570429f92a70cc6d5fd36675eb56223d5 (patch)
treeeb3d0d959b6262a810969c414ccc5b599d0b521c /src/gb
parent81ae0aa67fdcf7a791a968131a28836d6f6bc902 (diff)
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
Diffstat (limited to 'src/gb')
-rw-r--r--src/gb/gprs_ns2.c2
-rw-r--r--src/gb/gprs_ns2_internal.h12
-rw-r--r--src/gb/gprs_ns2_sns.c10
3 files changed, 19 insertions, 5 deletions
diff --git a/src/gb/gprs_ns2.c b/src/gb/gprs_ns2.c
index 5e5dd83b..fd016e6d 100644
--- a/src/gb/gprs_ns2.c
+++ b/src/gb/gprs_ns2.c
@@ -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;
}
diff --git a/src/gb/gprs_ns2_internal.h b/src/gb/gprs_ns2_internal.h
index d12c6636..9e63c70f 100644
--- a/src/gb/gprs_ns2_internal.h
+++ b/src/gb/gprs_ns2_internal.h
@@ -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 {
diff --git a/src/gb/gprs_ns2_sns.c b/src/gb/gprs_ns2_sns.c
index 0676b619..f25d93ab 100644
--- a/src/gb/gprs_ns2_sns.c
+++ b/src/gb/gprs_ns2_sns.c
@@ -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;
}