pespin has uploaded this change for review. ( 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, 89 insertions(+), 65 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/40/32240/1
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..4450cba 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,28 @@ 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, NULL); + osmo_fsm_inst_update_id_f(nse->mo.fi, "gprs_nse%d", 0); + 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 937fe73..227158c 100644 --- a/src/common/oml.c +++ b/src/common/oml.c @@ -1759,15 +1759,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; @@ -1826,15 +1830,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 36520fb..2946607 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",