aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@osmocom.org>2021-03-04 14:16:49 +0100
committerHarald Welte <laforge@osmocom.org>2021-03-23 15:22:59 +0100
commit2a6159b43987767a78f43e98a58484d96b62ff76 (patch)
treee9f32c2b2c2610d64acc6b7446b73a987fa51678
parent694dad502a461a286234fd9f577e1ceb25f66cf2 (diff)
gprs_ns2: Introduce gprs_ns2_create_nse2() for SGSN side SNS
gprs_ns2_create_nse() doesn't allow the caller to specify if the BSS or the SGSN role of IP-SNS shall be implemented. Add gprs_ns2_create_nse2() to fix that. Change-Id: I6db8c36f7c69b592d7d0fbcf323804f7e9912be2 Related: OS#3373
-rw-r--r--include/osmocom/gprs/gprs_ns2.h3
-rw-r--r--src/gb/gprs_ns2.c22
-rw-r--r--src/gb/gprs_ns2_internal.h3
-rw-r--r--src/gb/libosmogb.map1
4 files changed, 26 insertions, 3 deletions
diff --git a/include/osmocom/gprs/gprs_ns2.h b/include/osmocom/gprs/gprs_ns2.h
index 56a9b4f4..be59a679 100644
--- a/include/osmocom/gprs/gprs_ns2.h
+++ b/include/osmocom/gprs/gprs_ns2.h
@@ -158,6 +158,9 @@ struct gprs_ns2_nse *gprs_ns2_nse_by_nsei(struct gprs_ns2_inst *nsi, uint16_t ns
struct gprs_ns2_nse *gprs_ns2_create_nse(struct gprs_ns2_inst *nsi, uint16_t nsei,
enum gprs_ns2_ll linklayer,
enum gprs_ns2_dialect dialect);
+struct gprs_ns2_nse *gprs_ns2_create_nse2(struct gprs_ns2_inst *nsi, uint16_t nsei,
+ enum gprs_ns2_ll linklayer,
+ enum gprs_ns2_dialect dialect, bool local_sgsn_role);
uint16_t gprs_ns2_nse_nsei(struct gprs_ns2_nse *nse);
void gprs_ns2_free_nse(struct gprs_ns2_nse *nse);
void gprs_ns2_free_nses(struct gprs_ns2_inst *nsi);
diff --git a/src/gb/gprs_ns2.c b/src/gb/gprs_ns2.c
index 93b7c3a0..5b91ab89 100644
--- a/src/gb/gprs_ns2.c
+++ b/src/gb/gprs_ns2.c
@@ -776,9 +776,11 @@ struct gprs_ns2_vc *gprs_ns2_nsvc_by_nsvci(struct gprs_ns2_inst *nsi, uint16_t n
/*! Create a NS Entity within given NS instance.
* \param[in] nsi NS instance in which to create NS Entity
* \param[in] nsei NS Entity Identifier of to-be-created NSE
+ * \param[in] local_sgsn_role Does local side implement SGSN role?
* \returns newly-allocated NS-E in successful case; NULL on error */
-struct gprs_ns2_nse *gprs_ns2_create_nse(struct gprs_ns2_inst *nsi, uint16_t nsei,
- enum gprs_ns2_ll linklayer, enum gprs_ns2_dialect dialect)
+struct gprs_ns2_nse *gprs_ns2_create_nse2(struct gprs_ns2_inst *nsi, uint16_t nsei,
+ enum gprs_ns2_ll linklayer, enum gprs_ns2_dialect dialect,
+ bool local_sgsn_role)
{
struct gprs_ns2_nse *nse;
@@ -792,6 +794,7 @@ struct gprs_ns2_nse *gprs_ns2_create_nse(struct gprs_ns2_inst *nsi, uint16_t nse
if (!nse)
return NULL;
nse->dialect = GPRS_NS2_DIALECT_UNDEF;
+ nse->sgsn_role = local_sgsn_role;
if (ns2_nse_set_dialect(nse, dialect) < 0) {
talloc_free(nse);
@@ -820,7 +823,10 @@ int ns2_nse_set_dialect(struct gprs_ns2_nse *nse, enum gprs_ns2_dialect dialect)
case GPRS_NS2_DIALECT_UNDEF:
if (dialect == GPRS_NS2_DIALECT_SNS) {
snprintf(sns, sizeof(sns), "NSE%05u-SNS", nse->nsei);
- nse->bss_sns_fi = ns2_sns_bss_fsm_alloc(nse, sns);
+ if (nse->sgsn_role)
+ nse->bss_sns_fi = ns2_sns_sgsn_fsm_alloc(nse, sns);
+ else
+ nse->bss_sns_fi = ns2_sns_bss_fsm_alloc(nse, sns);
if (!nse->bss_sns_fi)
return -1;
}
@@ -841,6 +847,16 @@ int ns2_nse_set_dialect(struct gprs_ns2_nse *nse, enum gprs_ns2_dialect dialect)
return 0;
}
+/*! Create a NS Entity within given NS instance.
+ * \param[in] nsi NS instance in which to create NS Entity
+ * \param[in] nsei NS Entity Identifier of to-be-created NSE
+ * \returns newly-allocated NS-E in successful case; NULL on error */
+struct gprs_ns2_nse *gprs_ns2_create_nse(struct gprs_ns2_inst *nsi, uint16_t nsei,
+ enum gprs_ns2_ll linklayer, enum gprs_ns2_dialect dialect)
+{
+ return gprs_ns2_create_nse2(nsi, nsei, linklayer, dialect, false);
+}
+
/*! Return the NSEI
* \param[in] nse NS Entity
* \return the nsei.
diff --git a/src/gb/gprs_ns2_internal.h b/src/gb/gprs_ns2_internal.h
index 9b138e5d..f0dd9bfe 100644
--- a/src/gb/gprs_ns2_internal.h
+++ b/src/gb/gprs_ns2_internal.h
@@ -182,6 +182,9 @@ struct gprs_ns2_nse {
/*! MTU of a NS PDU. This is the lowest MTU of all NSVCs */
uint16_t mtu;
+
+ /*! are we implementing the SGSN role? */
+ bool sgsn_role;
};
/*! Structure representing a single NS-VC */
diff --git a/src/gb/libosmogb.map b/src/gb/libosmogb.map
index 588fabfb..fc8ab458 100644
--- a/src/gb/libosmogb.map
+++ b/src/gb/libosmogb.map
@@ -139,6 +139,7 @@ gprs_ns2_aff_cause_prim_strs;
gprs_ns2_bind_by_name;
gprs_ns2_cause_strs;
gprs_ns2_create_nse;
+gprs_ns2_create_nse2;
gprs_ns2_find_vc_by_sockaddr;
gprs_ns2_free;
gprs_ns2_free_bind;