aboutsummaryrefslogtreecommitdiffstats
path: root/src/gb/gprs_ns2.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gb/gprs_ns2.c')
-rw-r--r--src/gb/gprs_ns2.c45
1 files changed, 36 insertions, 9 deletions
diff --git a/src/gb/gprs_ns2.c b/src/gb/gprs_ns2.c
index e19ae780..93b7c3a0 100644
--- a/src/gb/gprs_ns2.c
+++ b/src/gb/gprs_ns2.c
@@ -781,7 +781,6 @@ struct gprs_ns2_nse *gprs_ns2_create_nse(struct gprs_ns2_inst *nsi, uint16_t nse
enum gprs_ns2_ll linklayer, enum gprs_ns2_dialect dialect)
{
struct gprs_ns2_nse *nse;
- char sns[16];
nse = gprs_ns2_nse_by_nsei(nsi, nsei);
if (nse) {
@@ -792,17 +791,13 @@ struct gprs_ns2_nse *gprs_ns2_create_nse(struct gprs_ns2_inst *nsi, uint16_t nse
nse = talloc_zero(nsi, struct gprs_ns2_nse);
if (!nse)
return NULL;
+ nse->dialect = GPRS_NS2_DIALECT_UNDEF;
- if (dialect == GPRS_NS2_DIALECT_SNS) {
- snprintf(sns, sizeof(sns), "NSE%05u-SNS", nsei);
- nse->bss_sns_fi = ns2_sns_bss_fsm_alloc(nse, sns);
- if (!nse->bss_sns_fi) {
- talloc_free(nse);
- return NULL;
- }
+ if (ns2_nse_set_dialect(nse, dialect) < 0) {
+ talloc_free(nse);
+ return NULL;
}
- nse->dialect = dialect;
nse->ll = linklayer;
nse->nsei = nsei;
nse->nsi = nsi;
@@ -814,6 +809,38 @@ struct gprs_ns2_nse *gprs_ns2_create_nse(struct gprs_ns2_inst *nsi, uint16_t nse
return nse;
}
+int ns2_nse_set_dialect(struct gprs_ns2_nse *nse, enum gprs_ns2_dialect dialect)
+{
+ char sns[16];
+
+ if (nse->dialect == dialect)
+ return 0;
+
+ switch (nse->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->bss_sns_fi)
+ return -1;
+ }
+ nse->dialect = dialect;
+ break;
+ default:
+ if (dialect == GPRS_NS2_DIALECT_UNDEF) {
+ if (nse->bss_sns_fi)
+ osmo_fsm_inst_term(nse->bss_sns_fi, OSMO_FSM_TERM_REQUEST, NULL);
+ nse->bss_sns_fi = NULL;
+ nse->dialect = GPRS_NS2_DIALECT_UNDEF;
+ } else {
+ /* we don't support arbitrary changes without going through UNDEF first */
+ return -EPERM;
+ }
+ }
+
+ return 0;
+}
+
/*! Return the NSEI
* \param[in] nse NS Entity
* \return the nsei.