aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Couzens <lynxis@fe80.eu>2021-06-13 00:14:48 +0200
committerAlexander Couzens <lynxis@fe80.eu>2021-08-06 18:34:27 +0200
commit8dc646ba4c747e45d84a212421530d19c119e79a (patch)
treea46ecf46d4f3ff93c484a94f4cb001f24a5073b0
parentb5d3c68e0ed8ad1cee73fdfc9c5788459f868fad (diff)
gprs_ns2_sns: free the NSE if the SIZE PDU is not valid
The SGSN fsm should be freed when becoming invalid instead of going into the unconfigured state. The unconfigured states should be only used when creating the NSE (on the SGSN side). Change-Id: Ife889091ecba4180a90743deb786767008fe863d
-rw-r--r--src/gb/gprs_ns2_sns.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/gb/gprs_ns2_sns.c b/src/gb/gprs_ns2_sns.c
index 5e43d8cf..a9ace5f9 100644
--- a/src/gb/gprs_ns2_sns.c
+++ b/src/gb/gprs_ns2_sns.c
@@ -2246,12 +2246,16 @@ static void ns2_sns_st_all_action_sgsn(struct osmo_fsm_inst *fi, uint32_t event,
!TLVP_PRES_LEN(tp, NS_IE_MAX_NR_NSVC, 2)) {
cause = NS_CAUSE_MISSING_ESSENT_IE;
ns2_tx_sns_size_ack(gss->sns_nsvc, &cause);
+ if (fi->state == GPRS_SNS_ST_UNCONFIGURED)
+ sns_failed(fi, "Rx Size: Missing essential IE");
break;
}
if (!TLVP_PRES_LEN(tp, NS_IE_IPv4_EP_NR, 2) &&
!TLVP_PRES_LEN(tp, NS_IE_IPv6_EP_NR, 2)) {
cause = NS_CAUSE_MISSING_ESSENT_IE;
ns2_tx_sns_size_ack(gss->sns_nsvc, &cause);
+ if (fi->state == GPRS_SNS_ST_UNCONFIGURED)
+ sns_failed(fi, "Rx Size: Missing essential IE");
break;
}
if (TLVP_PRES_LEN(tp, NS_IE_IPv4_EP_NR, 2))
@@ -2275,6 +2279,8 @@ static void ns2_sns_st_all_action_sgsn(struct osmo_fsm_inst *fi, uint32_t event,
else
cause = NS_CAUSE_INVAL_NR_IPv6_EP;
ns2_tx_sns_size_ack(gss->sns_nsvc, &cause);
+ if (fi->state == GPRS_SNS_ST_UNCONFIGURED)
+ sns_failed(fi, "Rx Size: Invalid Nr of IPv4/IPv6 EPs");
break;
}
/* ensure number of NS-VCs is sufficient for full mesh */
@@ -2285,6 +2291,8 @@ static void ns2_sns_st_all_action_sgsn(struct osmo_fsm_inst *fi, uint32_t event,
num_remote_eps, num_local_eps * num_remote_eps, gss->num_max_nsvcs);
cause = NS_CAUSE_INVAL_NR_NS_VC;
ns2_tx_sns_size_ack(gss->sns_nsvc, &cause);
+ if (fi->state == GPRS_SNS_ST_UNCONFIGURED)
+ sns_failed(fi, NULL);
break;
}
/* perform state reset, if requested */
@@ -2309,6 +2317,12 @@ static void ns2_sns_st_all_action_sgsn(struct osmo_fsm_inst *fi, uint32_t event,
}
ns2_sns_compute_local_ep_from_binds(fi);
}
+
+ if (fi->state == GPRS_SNS_ST_UNCONFIGURED && !(flag & 1)) {
+ sns_failed(fi, "Rx Size without Reset flag, but NSE is unknown");
+ break;
+ }
+
/* send SIZE_ACK */
ns2_tx_sns_size_ack(gss->sns_nsvc, NULL);
/* only wait for SNS-CONFIG in case of Reset flag */