pespin has submitted this change. (
https://gerrit.osmocom.org/c/osmo-bts/+/32240 )
Change subject: Move GPRS NSE under BTS SiteMgr
......................................................................
Move GPRS NSE under BTS SiteMgr
As per ipaccess expectancies and following TS 12.21.
Change-Id: If44d8f256cab7b2660900cedfb0ed9fe67eb3420
---
M include/osmo-bts/bts.h
M include/osmo-bts/bts_sm.h
M src/common/bts.c
M src/common/bts_sm.c
M src/common/nm_bts_sm_fsm.c
M src/common/nm_gprs_cell_fsm.c
M src/common/nm_gprs_nse_fsm.c
M src/common/nm_gprs_nsvc_fsm.c
M src/common/oml.c
M src/common/pcu_sock.c
M src/common/vty.c
11 files changed, 88 insertions(+), 65 deletions(-)
Approvals:
Jenkins Builder: Verified
fixeria: Looks good to me, approved
diff --git a/include/osmo-bts/bts.h b/include/osmo-bts/bts.h
index b792fe9..6b5fe6f 100644
--- a/include/osmo-bts/bts.h
+++ b/include/osmo-bts/bts.h
@@ -119,27 +119,6 @@
} pf;
};
-/* GPRS NSVC; ip.access specific NM Object */
-struct gsm_gprs_nse;
-struct gsm_gprs_nsvc {
- struct gsm_abis_mo mo;
- struct gsm_gprs_nse *nse;
- /* data read via VTY config file, to configure the BTS
- * via OML from BSC */
- int id;
- uint16_t nsvci;
- struct osmo_sockaddr local; /* on the BTS */
- struct osmo_sockaddr remote; /* on the SGSN */
-};
-
-/* GPRS NSE; ip.access specific NM Object */
-struct gsm_gprs_nse {
- struct gsm_abis_mo mo;
- uint16_t nsei;
- uint8_t timer[7];
- struct gsm_gprs_nsvc nsvc[2];
-};
-
/* GPRS CELL; ip.access specific NM Object */
struct gsm_gprs_cell {
struct gsm_abis_mo mo;
@@ -236,7 +215,6 @@
/* Not entirely sure how ip.access specific this is */
struct {
- struct gsm_gprs_nse nse;
struct gsm_gprs_cell cell;
uint8_t rac;
} gprs;
@@ -394,11 +372,6 @@
#define GSM_BTS_HAS_SI(bts, i) ((bts)->si_valid & (1 << i))
#define GSM_BTS_SI(bts, i) (void *)((bts)->si_buf[i][0])
-static inline struct gsm_bts *gsm_gprs_nse_get_bts(struct gsm_gprs_nse *nse)
-{
- return (struct gsm_bts *)container_of(nse, struct gsm_bts, gprs.nse);
-}
-
static inline struct gsm_bts *gsm_gprs_cell_get_bts(struct gsm_gprs_cell *cell)
{
return (struct gsm_bts *)container_of(cell, struct gsm_bts, gprs.cell);
diff --git a/include/osmo-bts/bts_sm.h b/include/osmo-bts/bts_sm.h
index 60ee87c..3106115 100644
--- a/include/osmo-bts/bts_sm.h
+++ b/include/osmo-bts/bts_sm.h
@@ -1,12 +1,36 @@
#pragma once
#include <osmocom/core/linuxlist.h>
+#include <osmocom/core/socket.h>
#include <osmocom/gsm/gsm23003.h>
#include <osmo-bts/oml.h>
struct pcu_sock_state;
+/* GPRS NSVC; ip.access specific NM Object */
+struct gsm_gprs_nse;
+struct gsm_gprs_nsvc {
+ struct gsm_abis_mo mo;
+ struct gsm_gprs_nse *nse;
+ /* data read via VTY config file, to configure the BTS
+ * via OML from BSC */
+ int id;
+ uint16_t nsvci;
+ struct osmo_sockaddr local; /* on the BTS */
+ struct osmo_sockaddr remote; /* on the SGSN */
+};
+
+/* GPRS NSE; ip.access specific NM Object */
+struct gsm_gprs_nse {
+ struct gsm_abis_mo mo;
+ uint16_t nsei;
+ uint8_t timer[7];
+ struct gsm_gprs_nsvc nsvc[2];
+};
+
+struct gsm_bts *gsm_gprs_nse_get_bts(const struct gsm_gprs_nse *nse);
+
/* BTS Site Manager */
struct gsm_bts_sm {
struct gsm_abis_mo mo;
@@ -14,6 +38,9 @@
unsigned int num_bts;
struct osmo_plmn_id plmn;
struct pcu_sock_state *pcu_state;
+ struct {
+ struct gsm_gprs_nse nse;
+ } gprs;
};
extern struct gsm_bts_sm *g_bts_sm;
diff --git a/src/common/bts.c b/src/common/bts.c
index a7178a2..0dd830a 100644
--- a/src/common/bts.c
+++ b/src/common/bts.c
@@ -145,7 +145,6 @@
{}
};
-static const uint8_t bts_nse_timer_default[] = { 3, 3, 3, 3, 30, 3, 10 };
static const uint8_t bts_cell_timer_default[] =
{ 3, 3, 3, 3, 3, 10, 3, 10, 3, 10, 3 };
static const struct gprs_rlc_cfg rlc_cfg_default = {
@@ -226,8 +225,6 @@
struct gsm_bts *gsm_bts_alloc(struct gsm_bts_sm *bts_sm, uint8_t bts_num)
{
struct gsm_bts *bts = talloc_zero(bts_sm, struct gsm_bts);
- struct gsm_gprs_nse *nse = &bts->gprs.nse;
- int i;
if (!bts)
return NULL;
@@ -256,13 +253,6 @@
osmo_fsm_inst_update_id_f(bts->mo.fi, "bts%d", bts->nr);
gsm_mo_init(&bts->mo, bts, NM_OC_BTS, bts->nr, 0xff, 0xff);
- /* NM GPRS NSE */
- nse->mo.fi = osmo_fsm_inst_alloc(&nm_gprs_nse_fsm, bts, nse,
- LOGL_INFO, NULL);
- osmo_fsm_inst_update_id_f(nse->mo.fi, "gprs_nse%d", bts->nr);
- gsm_mo_init(&nse->mo, bts, NM_OC_GPRS_NSE, bts->nr, 0xff, 0xff);
- memcpy(&nse->timer, bts_nse_timer_default, sizeof(nse->timer));
-
/* NM GPRS CELL */
bts->gprs.cell.mo.fi = osmo_fsm_inst_alloc(&nm_gprs_cell_fsm, bts,
&bts->gprs.cell,
LOGL_INFO, NULL);
@@ -271,18 +261,6 @@
memcpy(&bts->gprs.cell.rlc_cfg, &rlc_cfg_default,
sizeof(bts->gprs.cell.rlc_cfg));
memcpy(&bts->gprs.cell.timer, bts_cell_timer_default,
sizeof(bts->gprs.cell.timer));
- /* NM GPRS NSVCs */
- for (i = 0; i < ARRAY_SIZE(nse->nsvc); i++) {
- struct gsm_gprs_nsvc *nsvc = &nse->nsvc[i];
- nsvc->nse = nse;
- nsvc->id = i;
- nsvc->mo.fi = osmo_fsm_inst_alloc(&nm_gprs_nsvc_fsm, bts, nsvc,
- LOGL_INFO, NULL);
- osmo_fsm_inst_update_id_f(nsvc->mo.fi, "gprs_nsvc%d-%d",
- nse->mo.obj_inst.bts_nr, i);
- gsm_mo_init(&nsvc->mo, bts, NM_OC_GPRS_NSVC, nse->mo.obj_inst.bts_nr, i,
0xff);
- }
-
/* create our primary TRX. It will be initialized during bts_init() */
bts->c0 = gsm_bts_trx_alloc(bts);
if (!bts->c0) {
@@ -371,12 +349,7 @@
/* Start with the BTS */
oml_mo_state_init(&bts->mo, NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED);
- oml_mo_state_init(&bts->gprs.nse.mo, NM_OPSTATE_DISABLED,
NM_AVSTATE_NOT_INSTALLED);
oml_mo_state_init(&bts->gprs.cell.mo, NM_OPSTATE_DISABLED,
NM_AVSTATE_NOT_INSTALLED);
- for (i = 0; i < ARRAY_SIZE(bts->gprs.nse.nsvc); i++) {
- struct gsm_gprs_nsvc *nsvc = &bts->gprs.nse.nsvc[i];
- oml_mo_state_init(&nsvc->mo, NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED);
- }
/* allocate a talloc pool for ORTP to ensure it doesn't have to go back
* to the libc malloc all the time */
diff --git a/src/common/bts_sm.c b/src/common/bts_sm.c
index a5ddd3a..63200ef 100644
--- a/src/common/bts_sm.c
+++ b/src/common/bts_sm.c
@@ -29,6 +29,13 @@
struct gsm_bts_sm *g_bts_sm;
+static const uint8_t nse_timer_default[] = { 3, 3, 3, 3, 30, 3, 10 };
+
+struct gsm_bts *gsm_gprs_nse_get_bts(const struct gsm_gprs_nse *nse)
+{
+ return gsm_bts_num(g_bts_sm, nse->mo.obj_inst.bts_nr);
+}
+
static int gsm_bts_sm_talloc_destructor(struct gsm_bts_sm *bts_sm)
{
struct gsm_bts *bts;
@@ -47,6 +54,8 @@
struct gsm_bts_sm *gsm_bts_sm_alloc(void *talloc_ctx)
{
struct gsm_bts_sm *bts_sm = talloc_zero(talloc_ctx, struct gsm_bts_sm);
+ struct gsm_gprs_nse *nse = &bts_sm->gprs.nse;
+ unsigned int i;
if (!bts_sm)
return NULL;
@@ -60,8 +69,27 @@
LOGL_INFO, "bts_sm");
gsm_mo_init(&bts_sm->mo, NULL, NM_OC_SITE_MANAGER,
0xff, 0xff, 0xff);
-
oml_mo_state_init(&bts_sm->mo, NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED);
+ /* NM GPRS NSE */
+ nse->mo.fi = osmo_fsm_inst_alloc(&nm_gprs_nse_fsm, bts_sm, nse,
+ LOGL_INFO, "gprs_nse0");
+ gsm_mo_init(&nse->mo, NULL, NM_OC_GPRS_NSE, 0, 0xff, 0xff);
+ oml_mo_state_init(&nse->mo, NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED);
+ memcpy(&nse->timer, nse_timer_default, sizeof(nse->timer));
+
+ /* NM GPRS NSVCs */
+ for (i = 0; i < ARRAY_SIZE(nse->nsvc); i++) {
+ struct gsm_gprs_nsvc *nsvc = &nse->nsvc[i];
+ nsvc->nse = nse;
+ nsvc->id = i;
+ nsvc->mo.fi = osmo_fsm_inst_alloc(&nm_gprs_nsvc_fsm, bts_sm, nsvc,
+ LOGL_INFO, NULL);
+ osmo_fsm_inst_update_id_f(nsvc->mo.fi, "gprs_nsvc%d-%d",
+ nse->mo.obj_inst.bts_nr, i);
+ gsm_mo_init(&nsvc->mo, NULL, NM_OC_GPRS_NSVC, nse->mo.obj_inst.bts_nr, i,
0xff);
+ oml_mo_state_init(&nsvc->mo, NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED);
+ }
+
return bts_sm;
}
diff --git a/src/common/nm_bts_sm_fsm.c b/src/common/nm_bts_sm_fsm.c
index 586cfb1..01f5f99 100644
--- a/src/common/nm_bts_sm_fsm.c
+++ b/src/common/nm_bts_sm_fsm.c
@@ -46,8 +46,8 @@
static void ev_dispatch_children(struct gsm_bts_sm *site_mgr, uint32_t event)
{
struct gsm_bts *bts;
+ osmo_fsm_inst_dispatch(site_mgr->gprs.nse.mo.fi, event, NULL);
llist_for_each_entry(bts, &site_mgr->bts_list, list) {
- osmo_fsm_inst_dispatch(bts->gprs.nse.mo.fi, event, NULL);
osmo_fsm_inst_dispatch(bts->mo.fi, event, NULL);
}
}
diff --git a/src/common/nm_gprs_cell_fsm.c b/src/common/nm_gprs_cell_fsm.c
index 036df3e..aaebe59 100644
--- a/src/common/nm_gprs_cell_fsm.c
+++ b/src/common/nm_gprs_cell_fsm.c
@@ -32,6 +32,7 @@
#include <osmo-bts/gsm_data.h>
#include <osmo-bts/bts_model.h>
#include <osmo-bts/bts.h>
+#include <osmo-bts/bts_sm.h>
#include <osmo-bts/rsl.h>
#include <osmo-bts/nm_common_fsm.h>
@@ -44,7 +45,7 @@
static bool gprs_cell_can_be_enabled(struct gsm_gprs_cell *cell)
{
struct gsm_bts *bts = gsm_gprs_cell_get_bts(cell);
- return bts->gprs.nse.mo.nm_state.operational == NM_OPSTATE_ENABLED;
+ return bts->site_mgr->gprs.nse.mo.nm_state.operational == NM_OPSTATE_ENABLED;
}
diff --git a/src/common/nm_gprs_nse_fsm.c b/src/common/nm_gprs_nse_fsm.c
index 4f02078..fa9c651 100644
--- a/src/common/nm_gprs_nse_fsm.c
+++ b/src/common/nm_gprs_nse_fsm.c
@@ -32,6 +32,7 @@
#include <osmo-bts/gsm_data.h>
#include <osmo-bts/bts_model.h>
#include <osmo-bts/bts.h>
+#include <osmo-bts/bts_sm.h>
#include <osmo-bts/rsl.h>
#include <osmo-bts/nm_common_fsm.h>
#include <osmo-bts/phy_link.h>
diff --git a/src/common/nm_gprs_nsvc_fsm.c b/src/common/nm_gprs_nsvc_fsm.c
index 5a7967d..05d7ff1 100644
--- a/src/common/nm_gprs_nsvc_fsm.c
+++ b/src/common/nm_gprs_nsvc_fsm.c
@@ -32,6 +32,7 @@
#include <osmo-bts/gsm_data.h>
#include <osmo-bts/bts_model.h>
#include <osmo-bts/bts.h>
+#include <osmo-bts/bts_sm.h>
#include <osmo-bts/rsl.h>
#include <osmo-bts/nm_common_fsm.h>
diff --git a/src/common/oml.c b/src/common/oml.c
index 4190727..2d6694a 100644
--- a/src/common/oml.c
+++ b/src/common/oml.c
@@ -1760,15 +1760,19 @@
mo = &g_bts_sm->mo;
break;
case NM_OC_GPRS_NSE:
- mo = &bts->gprs.nse.mo;
+ if (obj_inst->bts_nr > 0)
+ return NULL;
+ mo = &g_bts_sm->gprs.nse.mo;
break;
case NM_OC_GPRS_CELL:
mo = &bts->gprs.cell.mo;
break;
case NM_OC_GPRS_NSVC:
- if (obj_inst->trx_nr >= ARRAY_SIZE(bts->gprs.nse.nsvc))
+ if (obj_inst->bts_nr > 0)
return NULL;
- mo = &bts->gprs.nse.nsvc[obj_inst->trx_nr].mo;
+ if (obj_inst->trx_nr >= ARRAY_SIZE(g_bts_sm->gprs.nse.nsvc))
+ return NULL;
+ mo = &g_bts_sm->gprs.nse.nsvc[obj_inst->trx_nr].mo;
break;
}
return mo;
@@ -1827,15 +1831,19 @@
obj = g_bts_sm;
break;
case NM_OC_GPRS_NSE:
- obj = &bts->gprs.nse;
+ if (obj_inst->bts_nr > 0)
+ return NULL;
+ obj = &g_bts_sm->gprs.nse;
break;
case NM_OC_GPRS_CELL:
obj = &bts->gprs.cell;
break;
case NM_OC_GPRS_NSVC:
- if (obj_inst->trx_nr >= ARRAY_SIZE(bts->gprs.nse.nsvc))
+ if (obj_inst->bts_nr > 0)
return NULL;
- obj = &bts->gprs.nse.nsvc[obj_inst->trx_nr];
+ if (obj_inst->trx_nr >= ARRAY_SIZE(g_bts_sm->gprs.nse.nsvc))
+ return NULL;
+ obj = &g_bts_sm->gprs.nse.nsvc[obj_inst->trx_nr];
break;
}
return obj;
diff --git a/src/common/pcu_sock.c b/src/common/pcu_sock.c
index bccef97..fe2dc17 100644
--- a/src/common/pcu_sock.c
+++ b/src/common/pcu_sock.c
@@ -242,9 +242,9 @@
LOGP(DPCU, LOGL_INFO, "Sending info\n");
+ nse = &g_bts_sm->gprs.nse;
/* FIXME: allow multiple BTS */
bts = llist_entry(g_bts_sm->bts_list.next, struct gsm_bts, list);
- nse = &bts->gprs.nse;
rlcc = &bts->gprs.cell.rlc_cfg;
msg = pcu_msgb_alloc(PCU_IF_MSG_INFO_IND, bts->nr);
diff --git a/src/common/vty.c b/src/common/vty.c
index 051ad92..fd28828 100644
--- a/src/common/vty.c
+++ b/src/common/vty.c
@@ -1352,7 +1352,7 @@
static void gprs_dump_vty(struct vty *vty, const struct gsm_bts *bts)
{
unsigned int i;
- const struct gsm_gprs_nse *nse = &bts->gprs.nse;
+ const struct gsm_gprs_nse *nse = &bts->site_mgr->gprs.nse;
/* GPRS parameters received from the BSC */
vty_out(vty, "BTS %u, RAC %u, NSEI %u, BVCI %u%s",
--
To view, visit
https://gerrit.osmocom.org/c/osmo-bts/+/32240
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-bts
Gerrit-Branch: master
Gerrit-Change-Id: If44d8f256cab7b2660900cedfb0ed9fe67eb3420
Gerrit-Change-Number: 32240
Gerrit-PatchSet: 2
Gerrit-Owner: pespin <pespin(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
Gerrit-MessageType: merged