mirror of
https://gitea.osmocom.org/cellular-infrastructure/osmo-bts.git
synced 2025-11-02 13:13:27 +00:00
Merge gsm_network into gsm_bts_sm and place gsm_bts under it
This way the data model in TS 12.21 (Figure 1) is followed, where there's a BTS Site Manager containing one or more BTS. In our case we only support 1 BTS (cell) so far. Change-Id: Ideb0d458ec631008223f861cf8b46d09524a1a21 Related: OS#5994
This commit is contained in:
@@ -4,6 +4,7 @@ noinst_HEADERS = \
|
||||
bts.h \
|
||||
bts_model.h \
|
||||
bts_shutdown_fsm.h \
|
||||
bts_sm.h \
|
||||
bts_trx.h \
|
||||
gsm_data.h \
|
||||
logging.h \
|
||||
|
||||
@@ -119,11 +119,6 @@ struct bts_power_ctrl_params {
|
||||
} pf;
|
||||
};
|
||||
|
||||
/* BTS Site Manager */
|
||||
struct gsm_bts_sm {
|
||||
struct gsm_abis_mo mo;
|
||||
};
|
||||
|
||||
/* GPRS NSVC; ip.access specific NM Object */
|
||||
struct gsm_gprs_nse;
|
||||
struct gsm_gprs_nsvc {
|
||||
@@ -161,7 +156,7 @@ struct bsc_oml_host {
|
||||
|
||||
/* One BTS */
|
||||
struct gsm_bts {
|
||||
/* list header in net->bts_list */
|
||||
/* list header in g_bts_sm->bts_list */
|
||||
struct llist_head list;
|
||||
|
||||
/* number of the BTS in network */
|
||||
@@ -211,7 +206,7 @@ struct gsm_bts {
|
||||
/* CCCH is on C0 */
|
||||
struct gsm_bts_trx *c0;
|
||||
|
||||
struct gsm_bts_sm site_mgr;
|
||||
struct gsm_bts_sm *site_mgr;
|
||||
|
||||
/* bitmask of all SI that are present/valid in si_buf */
|
||||
uint32_t si_valid;
|
||||
@@ -399,10 +394,6 @@ extern void *tall_bts_ctx;
|
||||
#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_bts_sm_get_bts(struct gsm_bts_sm *site_mgr) {
|
||||
return (struct gsm_bts *)container_of(site_mgr, struct gsm_bts, site_mgr);
|
||||
}
|
||||
|
||||
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);
|
||||
@@ -413,8 +404,8 @@ 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);
|
||||
}
|
||||
|
||||
struct gsm_bts *gsm_bts_alloc(void *talloc_ctx, uint8_t bts_num);
|
||||
struct gsm_bts *gsm_bts_num(const struct gsm_network *net, int num);
|
||||
struct gsm_bts *gsm_bts_alloc(struct gsm_bts_sm *bts_sm, uint8_t bts_num);
|
||||
struct gsm_bts *gsm_bts_num(const struct gsm_bts_sm *bts_sm, int num);
|
||||
|
||||
int bts_init(struct gsm_bts *bts);
|
||||
void bts_shutdown(struct gsm_bts *bts, const char *reason);
|
||||
|
||||
21
include/osmo-bts/bts_sm.h
Normal file
21
include/osmo-bts/bts_sm.h
Normal file
@@ -0,0 +1,21 @@
|
||||
#pragma once
|
||||
|
||||
#include <osmocom/core/linuxlist.h>
|
||||
#include <osmocom/gsm/gsm23003.h>
|
||||
|
||||
#include <osmo-bts/oml.h>
|
||||
|
||||
struct pcu_sock_state;
|
||||
|
||||
/* BTS Site Manager */
|
||||
struct gsm_bts_sm {
|
||||
struct gsm_abis_mo mo;
|
||||
struct llist_head bts_list;
|
||||
unsigned int num_bts;
|
||||
struct osmo_plmn_id plmn;
|
||||
struct pcu_sock_state *pcu_state;
|
||||
};
|
||||
|
||||
extern struct gsm_bts_sm *g_bts_sm;
|
||||
|
||||
struct gsm_bts_sm *gsm_bts_sm_alloc(void *talloc_ctx);
|
||||
@@ -41,12 +41,6 @@
|
||||
#define GSM_BTS_AGCH_QUEUE_LOW_LEVEL_DEFAULT 41
|
||||
#define GSM_BTS_AGCH_QUEUE_HIGH_LEVEL_DEFAULT 91
|
||||
|
||||
struct gsm_network {
|
||||
struct llist_head bts_list;
|
||||
unsigned int num_bts;
|
||||
struct osmo_plmn_id plmn;
|
||||
struct pcu_sock_state *pcu_state;
|
||||
};
|
||||
|
||||
/* 16 is the max. number of SI2quater messages according to 3GPP TS 44.018 Table 10.5.2.33b.1:
|
||||
4-bit index is used (2#1111 = 10#15) */
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
|
||||
#include <osmo-bts/pcuif_proto.h>
|
||||
|
||||
struct gsm_bts_sm;
|
||||
|
||||
extern int pcu_direct;
|
||||
|
||||
#define PCUIF_HDR_SIZE (sizeof(struct gsm_pcu_if) - sizeof(((struct gsm_pcu_if *)0)->u))
|
||||
@@ -23,7 +25,7 @@ int pcu_tx_interf_ind(const struct gsm_bts_trx *trx, uint32_t fn);
|
||||
int pcu_tx_pag_req(const uint8_t *identity_lv, uint8_t chan_needed);
|
||||
int pcu_tx_pch_data_cnf(uint32_t fn, uint8_t *data, uint8_t len);
|
||||
int pcu_tx_susp_req(struct gsm_lchan *lchan, uint32_t tlli, const uint8_t *ra_id, uint8_t cause);
|
||||
int pcu_sock_send(struct gsm_network *net, struct msgb *msg);
|
||||
int pcu_sock_send(struct msgb *msg);
|
||||
|
||||
int pcu_sock_init(const char *path);
|
||||
void pcu_sock_exit(void);
|
||||
|
||||
@@ -25,8 +25,6 @@ int bts_vty_is_config_node(struct vty *vty, int node);
|
||||
|
||||
int bts_vty_init(void *ctx);
|
||||
|
||||
struct gsm_network *gsmnet_from_vty(struct vty *v);
|
||||
|
||||
extern struct vty_app_info bts_vty_info;
|
||||
extern struct gsm_bts *g_bts;
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@ libbts_a_SOURCES = \
|
||||
oml.c \
|
||||
osmux.c \
|
||||
bts.c \
|
||||
bts_sm.c \
|
||||
bts_trx.c \
|
||||
rsl.c \
|
||||
vty.c \
|
||||
|
||||
@@ -30,8 +30,7 @@
|
||||
#include <osmo-bts/logging.h>
|
||||
#include <osmo-bts/pcu_if.h>
|
||||
#include <osmo-bts/pcuif_proto.h>
|
||||
|
||||
extern struct gsm_network bts_gsmnet;
|
||||
#include <osmo-bts/bts_sm.h>
|
||||
|
||||
#define OM_HEADROOM_SIZE 128
|
||||
|
||||
@@ -106,7 +105,7 @@ static int rx_down_osmo_pcu(struct gsm_bts *bts, struct msgb *msg)
|
||||
/* Trim Abis lower layers: */
|
||||
msgb_pull_to_l2(msg);
|
||||
/* we simply forward it to PCUIF: */
|
||||
return pcu_sock_send(&bts_gsmnet, msg);
|
||||
return pcu_sock_send(msg);
|
||||
}
|
||||
|
||||
/* incoming IPA/OSMO extension Abis message from BSC */
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
#include <osmo-bts/abis.h>
|
||||
#include <osmo-bts/bts.h>
|
||||
#include <osmo-bts/bts_model.h>
|
||||
#include <osmo-bts/bts_sm.h>
|
||||
#include <osmo-bts/dtx_dl_amr_fsm.h>
|
||||
#include <osmo-bts/pcuif_proto.h>
|
||||
#include <osmo-bts/rsl.h>
|
||||
@@ -61,11 +62,6 @@
|
||||
|
||||
static void bts_update_agch_max_queue_length(struct gsm_bts *bts);
|
||||
|
||||
struct gsm_network bts_gsmnet = {
|
||||
.bts_list = { &bts_gsmnet.bts_list, &bts_gsmnet.bts_list },
|
||||
.num_bts = 0,
|
||||
};
|
||||
|
||||
void *tall_bts_ctx;
|
||||
|
||||
/* Table 3.1 TS 04.08: Values of parameter S */
|
||||
@@ -212,10 +208,6 @@ const struct value_string bts_impl_flag_desc[] = {
|
||||
|
||||
static int gsm_bts_talloc_destructor(struct gsm_bts *bts)
|
||||
{
|
||||
if (bts->site_mgr.mo.fi) {
|
||||
osmo_fsm_inst_free(bts->site_mgr.mo.fi);
|
||||
bts->site_mgr.mo.fi = NULL;
|
||||
}
|
||||
if (bts->mo.fi) {
|
||||
osmo_fsm_inst_free(bts->mo.fi);
|
||||
bts->mo.fi = NULL;
|
||||
@@ -231,9 +223,9 @@ static int gsm_bts_talloc_destructor(struct gsm_bts *bts)
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct gsm_bts *gsm_bts_alloc(void *ctx, uint8_t bts_num)
|
||||
struct gsm_bts *gsm_bts_alloc(struct gsm_bts_sm *bts_sm, uint8_t bts_num)
|
||||
{
|
||||
struct gsm_bts *bts = talloc_zero(ctx, struct gsm_bts);
|
||||
struct gsm_bts *bts = talloc_zero(bts_sm, struct gsm_bts);
|
||||
struct gsm_gprs_nse *nse = &bts->gprs.nse;
|
||||
int i;
|
||||
|
||||
@@ -243,8 +235,9 @@ struct gsm_bts *gsm_bts_alloc(void *ctx, uint8_t bts_num)
|
||||
talloc_set_destructor(bts, gsm_bts_talloc_destructor);
|
||||
|
||||
/* add to list of BTSs */
|
||||
llist_add_tail(&bts->list, &bts_gsmnet.bts_list);
|
||||
llist_add_tail(&bts->list, &bts_sm->bts_list);
|
||||
|
||||
bts->site_mgr = bts_sm;
|
||||
bts->nr = bts_num;
|
||||
bts->num_trx = 0;
|
||||
INIT_LLIST_HEAD(&bts->trx_list);
|
||||
@@ -257,12 +250,6 @@ struct gsm_bts *gsm_bts_alloc(void *ctx, uint8_t bts_num)
|
||||
LOGL_INFO, NULL);
|
||||
osmo_fsm_inst_update_id_f(bts->shutdown_fi, "bts%d", bts->nr);
|
||||
|
||||
/* NM SITE_MGR */
|
||||
bts->site_mgr.mo.fi = osmo_fsm_inst_alloc(&nm_bts_sm_fsm, bts, &bts->site_mgr,
|
||||
LOGL_INFO, "bts_sm");
|
||||
gsm_mo_init(&bts->site_mgr.mo, bts, NM_OC_SITE_MANAGER,
|
||||
0xff, 0xff, 0xff);
|
||||
|
||||
/* NM BTS */
|
||||
bts->mo.fi = osmo_fsm_inst_alloc(&nm_bts_fsm, bts, bts,
|
||||
LOGL_INFO, NULL);
|
||||
@@ -310,14 +297,14 @@ struct gsm_bts *gsm_bts_alloc(void *ctx, uint8_t bts_num)
|
||||
return bts;
|
||||
}
|
||||
|
||||
struct gsm_bts *gsm_bts_num(const struct gsm_network *net, int num)
|
||||
struct gsm_bts *gsm_bts_num(const struct gsm_bts_sm *bts_sm, int num)
|
||||
{
|
||||
struct gsm_bts *bts;
|
||||
|
||||
if (num >= net->num_bts)
|
||||
if (num >= bts_sm->num_bts)
|
||||
return NULL;
|
||||
|
||||
llist_for_each_entry(bts, &net->bts_list, list) {
|
||||
llist_for_each_entry(bts, &bts_sm->bts_list, list) {
|
||||
if (bts->nr == num)
|
||||
return bts;
|
||||
}
|
||||
@@ -382,8 +369,7 @@ int bts_init(struct gsm_bts *bts)
|
||||
bts->radio_link_timeout.oml = 32;
|
||||
bts->radio_link_timeout.current = bts->radio_link_timeout.oml;
|
||||
|
||||
/* Start with the site manager */
|
||||
oml_mo_state_init(&bts->site_mgr.mo, NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED);
|
||||
/* 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);
|
||||
@@ -417,7 +403,7 @@ int bts_init(struct gsm_bts *bts)
|
||||
|
||||
/* TRX0 was allocated early during gsm_bts_alloc, not later through VTY */
|
||||
bts_model_trx_init(bts->c0);
|
||||
bts_gsmnet.num_bts++;
|
||||
g_bts_sm->num_bts++;
|
||||
|
||||
if (!initialized) {
|
||||
osmo_signal_register_handler(SS_GLOBAL, bts_signal_cbfn, NULL);
|
||||
@@ -456,7 +442,7 @@ int bts_link_estab(struct gsm_bts *bts)
|
||||
LOGP(DOML, LOGL_INFO, "Main link established, sending NM Status.\n");
|
||||
|
||||
/* BTS SITE MGR becomes Offline (tx SW ACT Report), BTS, NSE, etc. is DEPENDENCY */
|
||||
osmo_fsm_inst_dispatch(bts->site_mgr.mo.fi, NM_EV_SW_ACT, NULL);
|
||||
osmo_fsm_inst_dispatch(bts->site_mgr->mo.fi, NM_EV_SW_ACT, NULL);
|
||||
|
||||
/* All other objects start off-line until the BTS Model code says otherwise */
|
||||
for (i = 0; i < bts->num_trx; i++) {
|
||||
|
||||
@@ -29,6 +29,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/nm_common_fsm.h>
|
||||
|
||||
#define X(s) (1 << (s))
|
||||
@@ -60,7 +61,7 @@ static void st_none(struct osmo_fsm_inst *fi, uint32_t event, void *data)
|
||||
switch(event) {
|
||||
case BTS_SHUTDOWN_EV_START:
|
||||
/* Firt announce to NM objects that we are starting a shutdown procedure: */
|
||||
osmo_fsm_inst_dispatch(bts->site_mgr.mo.fi, NM_EV_SHUTDOWN_START, NULL);
|
||||
osmo_fsm_inst_dispatch(bts->site_mgr->mo.fi, NM_EV_SHUTDOWN_START, NULL);
|
||||
|
||||
count = count_trx_operational(bts);
|
||||
if (count) {
|
||||
@@ -164,7 +165,7 @@ static void st_exit_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state)
|
||||
{
|
||||
struct gsm_bts *bts = (struct gsm_bts *)fi->priv;
|
||||
|
||||
osmo_fsm_inst_dispatch(bts->site_mgr.mo.fi, NM_EV_SHUTDOWN_FINISH, NULL);
|
||||
osmo_fsm_inst_dispatch(bts->site_mgr->mo.fi, NM_EV_SHUTDOWN_FINISH, NULL);
|
||||
|
||||
if (bts->shutdown_fi_exit_proc) {
|
||||
LOGPFSML(fi, LOGL_NOTICE, "Shutdown process completed successfully, exiting process\n");
|
||||
|
||||
67
src/common/bts_sm.c
Normal file
67
src/common/bts_sm.c
Normal file
@@ -0,0 +1,67 @@
|
||||
/* BTS support code common to all supported BTS models */
|
||||
|
||||
/* (C) 2023 by sysmocom - s.m.f.c. GmbH <info@sysmocom.de>
|
||||
*
|
||||
* All Rights Reserved
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <osmocom/core/talloc.h>
|
||||
#include <osmocom/core/linuxlist.h>
|
||||
#include <osmocom/core/fsm.h>
|
||||
|
||||
#include <osmo-bts/bts_sm.h>
|
||||
#include <osmo-bts/bts.h>
|
||||
#include <osmo-bts/nm_common_fsm.h>
|
||||
|
||||
struct gsm_bts_sm *g_bts_sm;
|
||||
|
||||
static int gsm_bts_sm_talloc_destructor(struct gsm_bts_sm *bts_sm)
|
||||
{
|
||||
struct gsm_bts *bts;
|
||||
|
||||
while ((bts = llist_first_entry_or_null(&bts_sm->bts_list, struct gsm_bts, list)))
|
||||
talloc_free(bts);
|
||||
|
||||
if (bts_sm->mo.fi) {
|
||||
osmo_fsm_inst_free(bts_sm->mo.fi);
|
||||
bts_sm->mo.fi = NULL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
if (!bts_sm)
|
||||
return NULL;
|
||||
|
||||
talloc_set_destructor(bts_sm, gsm_bts_sm_talloc_destructor);
|
||||
|
||||
INIT_LLIST_HEAD(&bts_sm->bts_list);
|
||||
|
||||
/* NM SITE_MGR */
|
||||
bts_sm->mo.fi = osmo_fsm_inst_alloc(&nm_bts_sm_fsm, bts_sm, bts_sm,
|
||||
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);
|
||||
|
||||
return bts_sm;
|
||||
}
|
||||
@@ -49,6 +49,7 @@
|
||||
#include <osmo-bts/logging.h>
|
||||
#include <osmo-bts/abis.h>
|
||||
#include <osmo-bts/bts.h>
|
||||
#include <osmo-bts/bts_sm.h>
|
||||
#include <osmo-bts/vty.h>
|
||||
#include <osmo-bts/l1sap.h>
|
||||
#include <osmo-bts/bts_model.h>
|
||||
@@ -292,7 +293,13 @@ int bts_main(int argc, char **argv)
|
||||
if (vty_test_mode)
|
||||
fprintf(stderr, "--- VTY test mode: not connecting to BSC, not exiting ---\n");
|
||||
|
||||
g_bts = gsm_bts_alloc(tall_bts_ctx, 0);
|
||||
g_bts_sm = gsm_bts_sm_alloc(tall_bts_ctx);
|
||||
if (!g_bts_sm) {
|
||||
fprintf(stderr, "Failed to create BTS Site Manager structure\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
g_bts = gsm_bts_alloc(g_bts_sm, 0);
|
||||
if (!g_bts) {
|
||||
fprintf(stderr, "Failed to create BTS structure\n");
|
||||
exit(1);
|
||||
|
||||
@@ -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>
|
||||
@@ -44,9 +45,11 @@
|
||||
|
||||
static void ev_dispatch_children(struct gsm_bts_sm *site_mgr, uint32_t event)
|
||||
{
|
||||
struct gsm_bts *bts = gsm_bts_sm_get_bts(site_mgr);
|
||||
osmo_fsm_inst_dispatch(bts->gprs.nse.mo.fi, event, NULL);
|
||||
osmo_fsm_inst_dispatch(bts->mo.fi, event, NULL);
|
||||
struct gsm_bts *bts;
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
|
||||
#include <osmocom/core/talloc.h>
|
||||
#include <osmocom/core/msgb.h>
|
||||
#include <osmocom/core/utils.h>
|
||||
#include <osmocom/gsm/protocol/gsm_12_21.h>
|
||||
#include <osmocom/gsm/abis_nm.h>
|
||||
#include <osmocom/gsm/tlv.h>
|
||||
@@ -46,6 +47,7 @@
|
||||
#include <osmo-bts/oml.h>
|
||||
#include <osmo-bts/bts_model.h>
|
||||
#include <osmo-bts/bts.h>
|
||||
#include <osmo-bts/bts_sm.h>
|
||||
#include <osmo-bts/signal.h>
|
||||
#include <osmo-bts/phy_link.h>
|
||||
#include <osmo-bts/nm_common_fsm.h>
|
||||
@@ -132,6 +134,7 @@ int oml_send_msg(struct msgb *msg, int is_manuf)
|
||||
int oml_mo_send_msg(const struct gsm_abis_mo *mo, struct msgb *msg, uint8_t msg_type)
|
||||
{
|
||||
struct abis_om_fom_hdr *foh;
|
||||
struct gsm_bts *bts;
|
||||
|
||||
msg->l3h = msgb_push(msg, sizeof(*foh));
|
||||
foh = (struct abis_om_fom_hdr *) msg->l3h;
|
||||
@@ -139,8 +142,22 @@ int oml_mo_send_msg(const struct gsm_abis_mo *mo, struct msgb *msg, uint8_t msg_
|
||||
foh->obj_class = mo->obj_class;
|
||||
memcpy(&foh->obj_inst, &mo->obj_inst, sizeof(foh->obj_inst));
|
||||
|
||||
/* FIXME: This assumption may not always be correct */
|
||||
msg->trx = mo->bts->c0;
|
||||
/* Find and set OML TRX on msg: */
|
||||
switch (mo->obj_class) {
|
||||
case NM_OC_SITE_MANAGER:
|
||||
/* Pick the first BTS: */
|
||||
bts = gsm_bts_num(g_bts_sm, 0);
|
||||
break;
|
||||
default:
|
||||
/* Other objects should have a valid BTS available: */
|
||||
bts = gsm_bts_num(g_bts_sm, mo->obj_inst.bts_nr);
|
||||
}
|
||||
if (OSMO_UNLIKELY(!bts)) {
|
||||
LOGPFOH(DOML, LOGL_NOTICE, foh,
|
||||
"Sending FOM failed (no related BTS object found)\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
msg->trx = bts->c0;
|
||||
|
||||
DEBUGPFOH(DOML, foh, "Tx %s\n", get_value_string(abis_nm_msgtype_names, foh->msg_type));
|
||||
|
||||
@@ -1740,7 +1757,7 @@ gsm_objclass2mo(struct gsm_bts *bts, uint8_t obj_class,
|
||||
mo = &trx->ts[obj_inst->ts_nr].mo;
|
||||
break;
|
||||
case NM_OC_SITE_MANAGER:
|
||||
mo = &bts->site_mgr.mo;
|
||||
mo = &g_bts_sm->mo;
|
||||
break;
|
||||
case NM_OC_GPRS_NSE:
|
||||
mo = &bts->gprs.nse.mo;
|
||||
@@ -1807,7 +1824,7 @@ gsm_objclass2obj(struct gsm_bts *bts, uint8_t obj_class,
|
||||
obj = &trx->ts[obj_inst->ts_nr];
|
||||
break;
|
||||
case NM_OC_SITE_MANAGER:
|
||||
obj = &bts->site_mgr;
|
||||
obj = g_bts_sm;
|
||||
break;
|
||||
case NM_OC_GPRS_NSE:
|
||||
obj = &bts->gprs.nse;
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
#include <osmo-bts/pcu_if.h>
|
||||
#include <osmo-bts/pcuif_proto.h>
|
||||
#include <osmo-bts/bts.h>
|
||||
#include <osmo-bts/bts_sm.h>
|
||||
#include <osmo-bts/rsl.h>
|
||||
#include <osmo-bts/signal.h>
|
||||
#include <osmo-bts/l1sap.h>
|
||||
@@ -46,7 +47,6 @@
|
||||
|
||||
uint32_t trx_get_hlayer1(const struct gsm_bts_trx *trx);
|
||||
|
||||
extern struct gsm_network bts_gsmnet;
|
||||
int pcu_direct = 0;
|
||||
static int avail_lai = 0, avail_nse = 0, avail_cell = 0, avail_nsvc[2] = {0, 0};
|
||||
|
||||
@@ -231,7 +231,6 @@ static void info_ind_fill_trx(struct gsm_pcu_if_info_trx *trx_info,
|
||||
|
||||
int pcu_tx_info_ind(void)
|
||||
{
|
||||
struct gsm_network *net = &bts_gsmnet;
|
||||
struct msgb *msg;
|
||||
struct gsm_pcu_if *pcu_prim;
|
||||
struct gsm_pcu_if_info_ind *info_ind;
|
||||
@@ -244,7 +243,7 @@ int pcu_tx_info_ind(void)
|
||||
LOGP(DPCU, LOGL_INFO, "Sending info\n");
|
||||
|
||||
/* FIXME: allow multiple BTS */
|
||||
bts = llist_entry(net->bts_list.next, struct gsm_bts, list);
|
||||
bts = llist_entry(g_bts_sm->bts_list.next, struct gsm_bts, list);
|
||||
nse = &bts->gprs.nse;
|
||||
rlcc = &bts->gprs.cell.rlc_cfg;
|
||||
|
||||
@@ -266,9 +265,9 @@ int pcu_tx_info_ind(void)
|
||||
|
||||
info_ind->bsic = bts->bsic;
|
||||
/* RAI */
|
||||
info_ind->mcc = net->plmn.mcc;
|
||||
info_ind->mnc = net->plmn.mnc;
|
||||
info_ind->mnc_3_digits = net->plmn.mnc_3_digits;
|
||||
info_ind->mcc = g_bts_sm->plmn.mcc;
|
||||
info_ind->mnc = g_bts_sm->plmn.mnc;
|
||||
info_ind->mnc_3_digits = g_bts_sm->plmn.mnc_3_digits;
|
||||
info_ind->lac = bts->location_area_code;
|
||||
info_ind->rac = bts->gprs.rac;
|
||||
|
||||
@@ -358,13 +357,12 @@ int pcu_tx_info_ind(void)
|
||||
info_ind_fill_trx(&info_ind->trx[trx->nr], trx);
|
||||
}
|
||||
|
||||
return pcu_sock_send(net, msg);
|
||||
return pcu_sock_send(msg);
|
||||
}
|
||||
|
||||
static int pcu_if_signal_cb(unsigned int subsys, unsigned int signal,
|
||||
void *hdlr_data, void *signal_data)
|
||||
{
|
||||
struct gsm_network *net = &bts_gsmnet;
|
||||
struct gsm_gprs_nsvc *nsvc;
|
||||
struct gsm_bts *bts;
|
||||
struct gsm48_system_information_type_3 *si3;
|
||||
@@ -380,7 +378,7 @@ static int pcu_if_signal_cb(unsigned int subsys, unsigned int signal,
|
||||
break;
|
||||
si3 = (struct gsm48_system_information_type_3 *)
|
||||
bts->si_buf[SYSINFO_TYPE_3];
|
||||
osmo_plmn_from_bcd(si3->lai.digits, &net->plmn);
|
||||
osmo_plmn_from_bcd(si3->lai.digits, &g_bts_sm->plmn);
|
||||
bts->location_area_code = ntohs(si3->lai.lac);
|
||||
bts->cell_identity = ntohs(si3->cell_identity);
|
||||
avail_lai = 1;
|
||||
@@ -436,7 +434,7 @@ int pcu_tx_app_info_req(struct gsm_bts *bts, uint8_t app_type, uint8_t len, cons
|
||||
ai_req->len = len;
|
||||
memcpy(ai_req->data, app_data, ai_req->len);
|
||||
|
||||
return pcu_sock_send(&bts_gsmnet, msg);
|
||||
return pcu_sock_send(msg);
|
||||
}
|
||||
|
||||
int pcu_tx_rts_req(struct gsm_bts_trx_ts *ts, uint8_t is_ptcch, uint32_t fn,
|
||||
@@ -463,7 +461,7 @@ int pcu_tx_rts_req(struct gsm_bts_trx_ts *ts, uint8_t is_ptcch, uint32_t fn,
|
||||
rts_req->ts_nr = ts->nr;
|
||||
rts_req->block_nr = block_nr;
|
||||
|
||||
return pcu_sock_send(&bts_gsmnet, msg);
|
||||
return pcu_sock_send(msg);
|
||||
}
|
||||
|
||||
int pcu_tx_data_ind(struct gsm_bts_trx_ts *ts, uint8_t sapi, uint32_t fn,
|
||||
@@ -498,7 +496,7 @@ int pcu_tx_data_ind(struct gsm_bts_trx_ts *ts, uint8_t sapi, uint32_t fn,
|
||||
memcpy(data_ind->data, data, len);
|
||||
data_ind->len = len;
|
||||
|
||||
return pcu_sock_send(&bts_gsmnet, msg);
|
||||
return pcu_sock_send(msg);
|
||||
}
|
||||
|
||||
int pcu_tx_rach_ind(uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr,
|
||||
@@ -527,7 +525,7 @@ int pcu_tx_rach_ind(uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr,
|
||||
rach_ind->trx_nr = trx_nr;
|
||||
rach_ind->ts_nr = ts_nr;
|
||||
|
||||
return pcu_sock_send(&bts_gsmnet, msg);
|
||||
return pcu_sock_send(msg);
|
||||
}
|
||||
|
||||
int pcu_tx_time_ind(uint32_t fn)
|
||||
@@ -549,7 +547,7 @@ int pcu_tx_time_ind(uint32_t fn)
|
||||
|
||||
time_ind->fn = fn;
|
||||
|
||||
return pcu_sock_send(&bts_gsmnet, msg);
|
||||
return pcu_sock_send(msg);
|
||||
}
|
||||
|
||||
int pcu_tx_interf_ind(const struct gsm_bts_trx *trx, uint32_t fn)
|
||||
@@ -582,12 +580,12 @@ int pcu_tx_interf_ind(const struct gsm_bts_trx *trx, uint32_t fn)
|
||||
interf_ind->interf[tn] = -1 * lchan->meas.interf_meas_avg_dbm;
|
||||
}
|
||||
|
||||
return pcu_sock_send(&bts_gsmnet, msg);
|
||||
return pcu_sock_send(msg);
|
||||
}
|
||||
|
||||
int pcu_tx_pag_req(const uint8_t *identity_lv, uint8_t chan_needed)
|
||||
{
|
||||
struct pcu_sock_state *state = bts_gsmnet.pcu_state;
|
||||
struct pcu_sock_state *state = g_bts_sm->pcu_state;
|
||||
struct msgb *msg;
|
||||
struct gsm_pcu_if *pcu_prim;
|
||||
struct gsm_pcu_if_pag_req *pag_req;
|
||||
@@ -615,19 +613,18 @@ int pcu_tx_pag_req(const uint8_t *identity_lv, uint8_t chan_needed)
|
||||
pag_req->chan_needed = chan_needed;
|
||||
memcpy(pag_req->identity_lv, identity_lv, identity_lv[0] + 1);
|
||||
|
||||
return pcu_sock_send(&bts_gsmnet, msg);
|
||||
return pcu_sock_send(msg);
|
||||
}
|
||||
|
||||
int pcu_tx_pch_data_cnf(uint32_t fn, uint8_t *data, uint8_t len)
|
||||
{
|
||||
struct gsm_network *net = &bts_gsmnet;
|
||||
struct gsm_bts *bts;
|
||||
struct msgb *msg;
|
||||
struct gsm_pcu_if *pcu_prim;
|
||||
struct gsm_pcu_if_data *data_cnf;
|
||||
|
||||
/* FIXME: allow multiple BTS */
|
||||
bts = llist_entry(net->bts_list.next, struct gsm_bts, list);
|
||||
bts = llist_entry(g_bts_sm->bts_list.next, struct gsm_bts, list);
|
||||
|
||||
LOGP(DPCU, LOGL_DEBUG, "Sending PCH confirm\n");
|
||||
|
||||
@@ -642,7 +639,7 @@ int pcu_tx_pch_data_cnf(uint32_t fn, uint8_t *data, uint8_t len)
|
||||
memcpy(data_cnf->data, data, len);
|
||||
data_cnf->len = len;
|
||||
|
||||
return pcu_sock_send(&bts_gsmnet, msg);
|
||||
return pcu_sock_send(msg);
|
||||
}
|
||||
|
||||
/* forward data from a RR GPRS SUSPEND REQ towards PCU */
|
||||
@@ -659,7 +656,7 @@ int pcu_tx_susp_req(struct gsm_lchan *lchan, uint32_t tlli, const uint8_t *ra_id
|
||||
memcpy(pcu_prim->u.susp_req.ra_id, ra_id, sizeof(pcu_prim->u.susp_req.ra_id));
|
||||
pcu_prim->u.susp_req.cause = cause;
|
||||
|
||||
return pcu_sock_send(&bts_gsmnet, msg);
|
||||
return pcu_sock_send(msg);
|
||||
}
|
||||
|
||||
static int pcu_rx_data_req(struct gsm_bts *bts, uint8_t msg_type,
|
||||
@@ -897,14 +894,13 @@ static int pcu_rx_act_req(struct gsm_bts *bts,
|
||||
return -EINVAL; \
|
||||
} \
|
||||
} while (0)
|
||||
static int pcu_rx(struct gsm_network *net, uint8_t msg_type,
|
||||
struct gsm_pcu_if *pcu_prim, size_t prim_len)
|
||||
static int pcu_rx(uint8_t msg_type, struct gsm_pcu_if *pcu_prim, size_t prim_len)
|
||||
{
|
||||
int rc = 0;
|
||||
struct gsm_bts *bts;
|
||||
size_t exp_len;
|
||||
|
||||
if ((bts = gsm_bts_num(net, pcu_prim->bts_nr)) == NULL) {
|
||||
if ((bts = gsm_bts_num(g_bts_sm, pcu_prim->bts_nr)) == NULL) {
|
||||
LOGP(DPCU, LOGL_ERROR, "Received PCU Prim for non-existent BTS %u\n", pcu_prim->bts_nr);
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -951,15 +947,15 @@ static int pcu_rx(struct gsm_network *net, uint8_t msg_type,
|
||||
*/
|
||||
|
||||
struct pcu_sock_state {
|
||||
struct gsm_network *net;
|
||||
struct gsm_bts_sm *bts_sm;
|
||||
struct osmo_fd listen_bfd; /* fd for listen socket */
|
||||
struct osmo_fd conn_bfd; /* fd for connection to lcr */
|
||||
struct llist_head upqueue; /* queue for sending messages */
|
||||
};
|
||||
|
||||
int pcu_sock_send(struct gsm_network *net, struct msgb *msg)
|
||||
int pcu_sock_send(struct msgb *msg)
|
||||
{
|
||||
struct pcu_sock_state *state = net->pcu_state;
|
||||
struct pcu_sock_state *state = g_bts_sm->pcu_state;
|
||||
struct osmo_fd *conn_bfd;
|
||||
struct gsm_pcu_if *pcu_prim = (struct gsm_pcu_if *) msg->data;
|
||||
|
||||
@@ -994,7 +990,7 @@ static void pcu_sock_close(struct pcu_sock_state *state)
|
||||
unsigned int tn;
|
||||
|
||||
/* FIXME: allow multiple BTS */
|
||||
bts = llist_entry(state->net->bts_list.next, struct gsm_bts, list);
|
||||
bts = llist_entry(state->bts_sm->bts_list.next, struct gsm_bts, list);
|
||||
|
||||
LOGP(DPCU, LOGL_NOTICE, "PCU socket has LOST connection\n");
|
||||
oml_tx_failure_event_rep(&bts->gprs.cell.mo, NM_SEVER_MAJOR, OSMO_EVT_PCU_VERS,
|
||||
@@ -1073,7 +1069,7 @@ static int pcu_sock_read(struct osmo_fd *bfd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
rc = pcu_rx(state->net, pcu_prim->msg_type, pcu_prim, rc);
|
||||
rc = pcu_rx(pcu_prim->msg_type, pcu_prim, rc);
|
||||
|
||||
/* as we always synchronously process the message in pcu_rx() and
|
||||
* its callbacks, we can free the message here. */
|
||||
@@ -1187,7 +1183,7 @@ int pcu_sock_init(const char *path)
|
||||
return -ENOMEM;
|
||||
|
||||
INIT_LLIST_HEAD(&state->upqueue);
|
||||
state->net = &bts_gsmnet;
|
||||
state->bts_sm = g_bts_sm;
|
||||
state->conn_bfd.fd = -1;
|
||||
|
||||
bfd = &state->listen_bfd;
|
||||
@@ -1213,7 +1209,7 @@ int pcu_sock_init(const char *path)
|
||||
|
||||
osmo_signal_register_handler(SS_GLOBAL, pcu_if_signal_cb, NULL);
|
||||
|
||||
bts_gsmnet.pcu_state = state;
|
||||
g_bts_sm->pcu_state = state;
|
||||
|
||||
LOGP(DPCU, LOGL_INFO, "Started listening on PCU socket: %s\n", path);
|
||||
|
||||
@@ -1222,7 +1218,7 @@ int pcu_sock_init(const char *path)
|
||||
|
||||
void pcu_sock_exit(void)
|
||||
{
|
||||
struct pcu_sock_state *state = bts_gsmnet.pcu_state;
|
||||
struct pcu_sock_state *state = g_bts_sm->pcu_state;
|
||||
struct osmo_fd *bfd, *conn_bfd;
|
||||
|
||||
if (!state)
|
||||
@@ -1236,12 +1232,11 @@ void pcu_sock_exit(void)
|
||||
close(bfd->fd);
|
||||
osmo_fd_unregister(bfd);
|
||||
talloc_free(state);
|
||||
bts_gsmnet.pcu_state = NULL;
|
||||
g_bts_sm->pcu_state = NULL;
|
||||
}
|
||||
|
||||
bool pcu_connected(void) {
|
||||
struct gsm_network *net = &bts_gsmnet;
|
||||
struct pcu_sock_state *state = net->pcu_state;
|
||||
struct pcu_sock_state *state = g_bts_sm->pcu_state;
|
||||
|
||||
if (!state)
|
||||
return false;
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
#include <osmo-bts/phy_link.h>
|
||||
#include <osmo-bts/abis.h>
|
||||
#include <osmo-bts/bts.h>
|
||||
#include <osmo-bts/bts_sm.h>
|
||||
#include <osmo-bts/rsl.h>
|
||||
#include <osmo-bts/oml.h>
|
||||
#include <osmo-bts/signal.h>
|
||||
@@ -174,13 +175,6 @@ struct vty_app_info bts_vty_info = {
|
||||
},
|
||||
};
|
||||
|
||||
extern struct gsm_network bts_gsmnet;
|
||||
|
||||
struct gsm_network *gsmnet_from_vty(struct vty *v)
|
||||
{
|
||||
return &bts_gsmnet;
|
||||
}
|
||||
|
||||
static struct cmd_node bts_node = {
|
||||
BTS_NODE,
|
||||
"%s(bts)# ",
|
||||
@@ -506,10 +500,9 @@ static void config_write_bts_single(struct vty *vty, const struct gsm_bts *bts)
|
||||
|
||||
static int config_write_bts(struct vty *vty)
|
||||
{
|
||||
struct gsm_network *net = gsmnet_from_vty(vty);
|
||||
const struct gsm_bts *bts;
|
||||
|
||||
llist_for_each_entry(bts, &net->bts_list, list)
|
||||
llist_for_each_entry(bts, &g_bts_sm->bts_list, list)
|
||||
config_write_bts_single(vty, bts);
|
||||
|
||||
osmo_tdef_vty_groups_write(vty, "");
|
||||
@@ -568,16 +561,15 @@ DEFUN_ATTR(cfg_bts,
|
||||
"BTS Number\n",
|
||||
CMD_ATTR_IMMEDIATE)
|
||||
{
|
||||
struct gsm_network *gsmnet = gsmnet_from_vty(vty);
|
||||
int bts_nr = atoi(argv[0]);
|
||||
struct gsm_bts *bts;
|
||||
|
||||
if (bts_nr >= gsmnet->num_bts) {
|
||||
if (bts_nr >= g_bts_sm->num_bts) {
|
||||
vty_out(vty, "%% Unknown BTS number %u (num %u)%s",
|
||||
bts_nr, gsmnet->num_bts, VTY_NEWLINE);
|
||||
bts_nr, g_bts_sm->num_bts, VTY_NEWLINE);
|
||||
return CMD_WARNING;
|
||||
} else
|
||||
bts = gsm_bts_num(gsmnet, bts_nr);
|
||||
bts = gsm_bts_num(g_bts_sm, bts_nr);
|
||||
|
||||
vty->index = bts;
|
||||
vty->index_sub = &bts->description;
|
||||
@@ -1278,7 +1270,7 @@ static void bts_dump_vty(struct vty *vty, const struct gsm_bts *bts)
|
||||
vty_out(vty, " NM State: ");
|
||||
net_dump_nmstate(vty, &bts->mo.nm_state);
|
||||
vty_out(vty, " Site Mgr NM State: ");
|
||||
net_dump_nmstate(vty, &bts->site_mgr.mo.nm_state);
|
||||
net_dump_nmstate(vty, &g_bts_sm->mo.nm_state);
|
||||
if (strnlen(bts->pcu_version, MAX_VERSION_LENGTH))
|
||||
vty_out(vty, " PCU version %s connected%s",
|
||||
bts->pcu_version, VTY_NEWLINE);
|
||||
@@ -1337,23 +1329,22 @@ DEFUN(show_bts, show_bts_cmd, "show bts [<0-255>]",
|
||||
SHOW_STR "Display information about a BTS\n"
|
||||
BTS_NR_STR)
|
||||
{
|
||||
const struct gsm_network *net = gsmnet_from_vty(vty);
|
||||
int bts_nr;
|
||||
|
||||
if (argc != 0) {
|
||||
/* use the BTS number that the user has specified */
|
||||
bts_nr = atoi(argv[0]);
|
||||
if (bts_nr >= net->num_bts) {
|
||||
if (bts_nr >= g_bts_sm->num_bts) {
|
||||
vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
|
||||
VTY_NEWLINE);
|
||||
return CMD_WARNING;
|
||||
}
|
||||
bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
|
||||
bts_dump_vty(vty, gsm_bts_num(g_bts_sm, bts_nr));
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
/* print all BTS's */
|
||||
for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++)
|
||||
bts_dump_vty(vty, gsm_bts_num(net, bts_nr));
|
||||
for (bts_nr = 0; bts_nr < g_bts_sm->num_bts; bts_nr++)
|
||||
bts_dump_vty(vty, gsm_bts_num(g_bts_sm, bts_nr));
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
@@ -1411,10 +1402,9 @@ DEFUN(show_bts_gprs, show_bts_gprs_cmd,
|
||||
SHOW_STR "Display information about a BTS\n"
|
||||
BTS_NR_STR "GPRS/EGPRS configuration\n")
|
||||
{
|
||||
const struct gsm_network *net = gsmnet_from_vty(vty);
|
||||
const struct gsm_bts *bts;
|
||||
|
||||
bts = gsm_bts_num(net, atoi(argv[0]));
|
||||
bts = gsm_bts_num(g_bts_sm, atoi(argv[0]));
|
||||
if (bts == NULL) {
|
||||
vty_out(vty, "%% can't find BTS '%s'%s",
|
||||
argv[0], VTY_NEWLINE);
|
||||
@@ -1430,16 +1420,15 @@ DEFUN(test_send_failure_event_report, test_send_failure_event_report_cmd, "test
|
||||
"Various testing commands\n"
|
||||
"Send a test OML failure event report to the BSC\n" BTS_NR_STR)
|
||||
{
|
||||
const struct gsm_network *net = gsmnet_from_vty(vty);
|
||||
int bts_nr = atoi(argv[0]);
|
||||
const struct gsm_bts *bts;
|
||||
|
||||
if (bts_nr >= net->num_bts) {
|
||||
if (bts_nr >= g_bts_sm->num_bts) {
|
||||
vty_out(vty, "%% can't find BTS '%s'%s", argv[0], VTY_NEWLINE);
|
||||
return CMD_WARNING;
|
||||
}
|
||||
|
||||
bts = gsm_bts_num(net, bts_nr);
|
||||
bts = gsm_bts_num(g_bts_sm, bts_nr);
|
||||
oml_tx_failure_event_rep(&bts->mo, NM_SEVER_MINOR, OSMO_EVT_WARN_SW_WARN, "test message sent from VTY");
|
||||
|
||||
return CMD_SUCCESS;
|
||||
@@ -1451,9 +1440,8 @@ DEFUN_HIDDEN(radio_link_timeout, radio_link_timeout_cmd, "bts <0-0> radio-link-t
|
||||
"Use infinite timeout (DANGEROUS: only use during testing!)\n"
|
||||
"Number of lost SACCH blocks\n")
|
||||
{
|
||||
const struct gsm_network *net = gsmnet_from_vty(vty);
|
||||
int bts_nr = atoi(argv[0]);
|
||||
struct gsm_bts *bts = gsm_bts_num(net, bts_nr);
|
||||
struct gsm_bts *bts = gsm_bts_num(g_bts_sm, bts_nr);
|
||||
|
||||
if (!bts) {
|
||||
vty_out(vty, "%% can't find BTS '%s'%s", argv[0], VTY_NEWLINE);
|
||||
@@ -1482,12 +1470,11 @@ DEFUN(bts_c0_power_red,
|
||||
"BCCH carrier power reduction operation\n"
|
||||
"Power reduction value (in dB, even numbers only)\n")
|
||||
{
|
||||
struct gsm_network *net = gsmnet_from_vty(vty);
|
||||
const int bts_nr = atoi(argv[0]);
|
||||
const int red = atoi(argv[1]);
|
||||
struct gsm_bts *bts;
|
||||
|
||||
bts = gsm_bts_num(net, atoi(argv[0]));
|
||||
bts = gsm_bts_num(g_bts_sm, atoi(argv[0]));
|
||||
if (bts == NULL) {
|
||||
vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE);
|
||||
return CMD_WARNING;
|
||||
@@ -1637,19 +1624,18 @@ DEFUN(show_trx,
|
||||
SHOW_STR "Display information about a TRX\n"
|
||||
BTS_TRX_STR)
|
||||
{
|
||||
const struct gsm_network *net = gsmnet_from_vty(vty);
|
||||
const struct gsm_bts *bts = NULL;
|
||||
int bts_nr, trx_nr;
|
||||
|
||||
if (argc >= 1) {
|
||||
/* use the BTS number that the user has specified */
|
||||
bts_nr = atoi(argv[0]);
|
||||
if (bts_nr >= net->num_bts) {
|
||||
if (bts_nr >= g_bts_sm->num_bts) {
|
||||
vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
|
||||
VTY_NEWLINE);
|
||||
return CMD_WARNING;
|
||||
}
|
||||
bts = gsm_bts_num(net, bts_nr);
|
||||
bts = gsm_bts_num(g_bts_sm, bts_nr);
|
||||
}
|
||||
if (argc >= 2) {
|
||||
trx_nr = atoi(argv[1]);
|
||||
@@ -1667,8 +1653,8 @@ DEFUN(show_trx,
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++)
|
||||
print_all_trx(vty, gsm_bts_num(net, bts_nr));
|
||||
for (bts_nr = 0; bts_nr < g_bts_sm->num_bts; bts_nr++)
|
||||
print_all_trx(vty, gsm_bts_num(g_bts_sm, bts_nr));
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
@@ -1693,7 +1679,6 @@ DEFUN(show_ts,
|
||||
SHOW_STR "Display information about a TS\n"
|
||||
BTS_TRX_TS_STR)
|
||||
{
|
||||
const struct gsm_network *net = gsmnet_from_vty(vty);
|
||||
const struct gsm_bts *bts = NULL;
|
||||
const struct gsm_bts_trx *trx = NULL;
|
||||
const struct gsm_bts_trx_ts *ts = NULL;
|
||||
@@ -1702,12 +1687,12 @@ DEFUN(show_ts,
|
||||
if (argc >= 1) {
|
||||
/* use the BTS number that the user has specified */
|
||||
bts_nr = atoi(argv[0]);
|
||||
if (bts_nr >= net->num_bts) {
|
||||
if (bts_nr >= g_bts_sm->num_bts) {
|
||||
vty_out(vty, "%% can't find BTS '%s'%s", argv[0],
|
||||
VTY_NEWLINE);
|
||||
return CMD_WARNING;
|
||||
}
|
||||
bts = gsm_bts_num(net, bts_nr);
|
||||
bts = gsm_bts_num(g_bts_sm, bts_nr);
|
||||
}
|
||||
if (argc >= 2) {
|
||||
trx_nr = atoi(argv[1]);
|
||||
@@ -1748,8 +1733,8 @@ DEFUN(show_ts,
|
||||
}
|
||||
} else {
|
||||
/* Iterate over all BTS, TRX in each BTS, TS in each TRX */
|
||||
for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
|
||||
bts = gsm_bts_num(net, bts_nr);
|
||||
for (bts_nr = 0; bts_nr < g_bts_sm->num_bts; bts_nr++) {
|
||||
bts = gsm_bts_num(g_bts_sm, bts_nr);
|
||||
for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {
|
||||
trx = gsm_bts_trx_num(bts, trx_nr);
|
||||
for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {
|
||||
@@ -2112,7 +2097,6 @@ static int dump_lchan_bts(const struct gsm_bts *bts, struct vty *vty,
|
||||
static int lchan_summary(struct vty *vty, int argc, const char **argv,
|
||||
void (*dump_cb)(struct vty *, const struct gsm_lchan *))
|
||||
{
|
||||
const struct gsm_network *net = gsmnet_from_vty(vty);
|
||||
const struct gsm_bts *bts = NULL; /* initialize to avoid uninitialized false warnings on some gcc versions (11.1.0) */
|
||||
const struct gsm_bts_trx *trx = NULL; /* initialize to avoid uninitialized false warnings on some gcc versions (11.1.0) */
|
||||
const struct gsm_bts_trx_ts *ts = NULL; /* initialize to avoid uninitialized false warnings on some gcc versions (11.1.0) */
|
||||
@@ -2122,12 +2106,12 @@ static int lchan_summary(struct vty *vty, int argc, const char **argv,
|
||||
if (argc >= 1) {
|
||||
/* use the BTS number that the user has specified */
|
||||
bts_nr = atoi(argv[0]);
|
||||
if (bts_nr >= net->num_bts) {
|
||||
if (bts_nr >= g_bts_sm->num_bts) {
|
||||
vty_out(vty, "%% can't find BTS %s%s", argv[0],
|
||||
VTY_NEWLINE);
|
||||
return CMD_WARNING;
|
||||
}
|
||||
bts = gsm_bts_num(net, bts_nr);
|
||||
bts = gsm_bts_num(g_bts_sm, bts_nr);
|
||||
|
||||
if (argc == 1)
|
||||
return dump_lchan_bts(bts, vty, dump_cb);
|
||||
@@ -2168,8 +2152,8 @@ static int lchan_summary(struct vty *vty, int argc, const char **argv,
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {
|
||||
bts = gsm_bts_num(net, bts_nr);
|
||||
for (bts_nr = 0; bts_nr < g_bts_sm->num_bts; bts_nr++) {
|
||||
bts = gsm_bts_num(g_bts_sm, bts_nr);
|
||||
dump_lchan_bts(bts, vty, dump_cb);
|
||||
}
|
||||
|
||||
@@ -2195,8 +2179,7 @@ DEFUN(show_lchan_summary,
|
||||
return lchan_summary(vty, argc, argv, lchan_dump_short_vty);
|
||||
}
|
||||
|
||||
static struct gsm_lchan *resolve_lchan(const struct gsm_network *net,
|
||||
const char **argv, int idx)
|
||||
static struct gsm_lchan *resolve_lchan(const char **argv, int idx)
|
||||
{
|
||||
int bts_nr = atoi(argv[idx+0]);
|
||||
int trx_nr = atoi(argv[idx+1]);
|
||||
@@ -2207,7 +2190,7 @@ static struct gsm_lchan *resolve_lchan(const struct gsm_network *net,
|
||||
struct gsm_bts_trx *trx;
|
||||
struct gsm_bts_trx_ts *ts;
|
||||
|
||||
bts = gsm_bts_num(net, bts_nr);
|
||||
bts = gsm_bts_num(g_bts_sm, bts_nr);
|
||||
if (!bts)
|
||||
return NULL;
|
||||
|
||||
@@ -2472,11 +2455,10 @@ DEFUN(bts_t_t_l_jitter_buf,
|
||||
BTS_T_T_L_STR "RTP settings\n"
|
||||
"Jitter buffer\n" "Size of jitter buffer in (ms)\n")
|
||||
{
|
||||
struct gsm_network *net = gsmnet_from_vty(vty);
|
||||
struct gsm_lchan *lchan;
|
||||
int jitbuf_ms = atoi(argv[4]), rc;
|
||||
|
||||
lchan = resolve_lchan(net, argv, 0);
|
||||
lchan = resolve_lchan(argv, 0);
|
||||
if (!lchan) {
|
||||
vty_out(vty, "%% Could not resolve logical channel%s", VTY_NEWLINE);
|
||||
return CMD_WARNING;
|
||||
@@ -2505,10 +2487,9 @@ DEFUN_ATTR(bts_t_t_l_loopback,
|
||||
BTS_T_T_L_STR "Set loopback\n",
|
||||
CMD_ATTR_HIDDEN)
|
||||
{
|
||||
struct gsm_network *net = gsmnet_from_vty(vty);
|
||||
struct gsm_lchan *lchan;
|
||||
|
||||
lchan = resolve_lchan(net, argv, 0);
|
||||
lchan = resolve_lchan(argv, 0);
|
||||
if (!lchan) {
|
||||
vty_out(vty, "%% Could not resolve logical channel%s", VTY_NEWLINE);
|
||||
return CMD_WARNING;
|
||||
@@ -2524,10 +2505,9 @@ DEFUN_ATTR(no_bts_t_t_l_loopback,
|
||||
NO_STR BTS_T_T_L_STR "Set loopback\n",
|
||||
CMD_ATTR_HIDDEN)
|
||||
{
|
||||
struct gsm_network *net = gsmnet_from_vty(vty);
|
||||
struct gsm_lchan *lchan;
|
||||
|
||||
lchan = resolve_lchan(net, argv, 0);
|
||||
lchan = resolve_lchan(argv, 0);
|
||||
if (!lchan) {
|
||||
vty_out(vty, "%% Could not resolve logical channel%s", VTY_NEWLINE);
|
||||
return CMD_WARNING;
|
||||
@@ -2550,13 +2530,12 @@ DEFUN_ATTR(bts_t_t_l_power_ctrl_mode,
|
||||
"Enable the power control loop\n",
|
||||
CMD_ATTR_HIDDEN)
|
||||
{
|
||||
struct gsm_network *net = gsmnet_from_vty(vty);
|
||||
const struct gsm_power_ctrl_params *params;
|
||||
struct lchan_power_ctrl_state *state;
|
||||
const char **args = argv + 4;
|
||||
struct gsm_lchan *lchan;
|
||||
|
||||
lchan = resolve_lchan(net, argv, 0);
|
||||
lchan = resolve_lchan(argv, 0);
|
||||
if (!lchan) {
|
||||
vty_out(vty, "%% Could not resolve logical channel%s", VTY_NEWLINE);
|
||||
return CMD_WARNING;
|
||||
@@ -2587,12 +2566,11 @@ DEFUN_ATTR(bts_t_t_l_power_ctrl_current_max,
|
||||
"BS power reduction (in dB) or MS power level\n",
|
||||
CMD_ATTR_HIDDEN)
|
||||
{
|
||||
struct gsm_network *net = gsmnet_from_vty(vty);
|
||||
struct lchan_power_ctrl_state *state;
|
||||
const char **args = argv + 4;
|
||||
struct gsm_lchan *lchan;
|
||||
|
||||
lchan = resolve_lchan(net, argv, 0);
|
||||
lchan = resolve_lchan(argv, 0);
|
||||
if (!lchan) {
|
||||
vty_out(vty, "%% Could not resolve logical channel%s", VTY_NEWLINE);
|
||||
return CMD_WARNING;
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
#include <osmo-bts/signal.h>
|
||||
#include <osmo-bts/oml.h>
|
||||
#include <osmo-bts/bts.h>
|
||||
#include <osmo-bts/bts_sm.h>
|
||||
|
||||
#include <osmo-bts/gsm_data.h>
|
||||
#include <osmo-bts/phy_link.h>
|
||||
@@ -412,7 +413,6 @@ DEFUN(cfg_phy_c0_idle_red_pwr, cfg_phy_c0_idle_red_pwr_cmd,
|
||||
|
||||
DEFUN(trigger_ho_cause, trigger_ho_cause_cmd, "HIDDEN", TRX_STR)
|
||||
{
|
||||
struct gsm_network *net = gsmnet_from_vty(vty);
|
||||
struct gsm_bts *bts;
|
||||
struct gsm_bts_trx *trx;
|
||||
struct gsm_bts_trx_ts *ts;
|
||||
@@ -422,7 +422,7 @@ DEFUN(trigger_ho_cause, trigger_ho_cause_cmd, "HIDDEN", TRX_STR)
|
||||
/* uint8_t old_ho_cause; */
|
||||
|
||||
/* get BTS pointer */
|
||||
bts = gsm_bts_num(net, 0);
|
||||
bts = gsm_bts_num(g_bts_sm, 0);
|
||||
if (!bts) {
|
||||
vty_out(vty, "Can not get BTS node %s", VTY_NEWLINE);
|
||||
return CMD_WARNING;
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include <osmo-bts/logging.h>
|
||||
#include <osmo-bts/abis.h>
|
||||
#include <osmo-bts/bts.h>
|
||||
#include <osmo-bts/bts_sm.h>
|
||||
#include <osmo-bts/oml.h>
|
||||
|
||||
static void print_usage(const char *prog_name)
|
||||
@@ -117,9 +118,14 @@ int main(int argc, char **argv)
|
||||
|
||||
osmo_init_logging2(tall_bts_ctx, &bts_log_info);
|
||||
|
||||
bts = gsm_bts_alloc(tall_bts_ctx, 0);
|
||||
g_bts_sm = gsm_bts_sm_alloc(tall_bts_ctx);
|
||||
if (!g_bts_sm)
|
||||
exit(1);
|
||||
|
||||
bts = gsm_bts_alloc(g_bts_sm, 0);
|
||||
if (!bts)
|
||||
exit(1);
|
||||
|
||||
bts->ip_access.site_id = cmdline.site_id;
|
||||
bts->ip_access.bts_id = 0;
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <osmocom/core/application.h>
|
||||
|
||||
#include <osmo-bts/bts.h>
|
||||
#include <osmo-bts/bts_sm.h>
|
||||
#include <osmo-bts/logging.h>
|
||||
#include <osmo-bts/gsm_data.h>
|
||||
|
||||
@@ -225,7 +226,8 @@ int main(int argc, char **argv)
|
||||
|
||||
osmo_init_logging2(tall_bts_ctx, &bts_log_info);
|
||||
|
||||
bts = gsm_bts_alloc(tall_bts_ctx, 0);
|
||||
g_bts_sm = gsm_bts_sm_alloc(tall_bts_ctx);
|
||||
bts = gsm_bts_alloc(g_bts_sm, 0);
|
||||
if (bts_init(bts) < 0) {
|
||||
fprintf(stderr, "unable to open bts\n");
|
||||
exit(1);
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
*/
|
||||
|
||||
#include <osmo-bts/bts.h>
|
||||
#include <osmo-bts/bts_sm.h>
|
||||
#include <osmo-bts/logging.h>
|
||||
#include <osmo-bts/paging.h>
|
||||
#include <osmo-bts/gsm_data.h>
|
||||
@@ -71,7 +72,8 @@ int main(int argc, char **argv)
|
||||
|
||||
osmo_init_logging2(tall_bts_ctx, &bts_log_info);
|
||||
|
||||
bts = gsm_bts_alloc(tall_bts_ctx, 0);
|
||||
g_bts_sm = gsm_bts_sm_alloc(tall_bts_ctx);
|
||||
bts = gsm_bts_alloc(g_bts_sm, 0);
|
||||
if (bts_init(bts) < 0) {
|
||||
fprintf(stderr, "unable to open bts\n");
|
||||
exit(1);
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include <osmo-bts/logging.h>
|
||||
#include <osmo-bts/abis.h>
|
||||
#include <osmo-bts/bts.h>
|
||||
#include <osmo-bts/bts_sm.h>
|
||||
#include <osmo-bts/vty.h>
|
||||
#include <osmo-bts/bts_model.h>
|
||||
#include <osmo-bts/pcu_if.h>
|
||||
@@ -71,7 +72,12 @@ int main(int argc, char **argv)
|
||||
osmo_init_logging2(tall_bts_ctx, &bts_log_info);
|
||||
osmo_stderr_target->categories[DHO].loglevel = LOGL_DEBUG;
|
||||
|
||||
bts = gsm_bts_alloc(tall_bts_ctx, 0);
|
||||
g_bts_sm = gsm_bts_sm_alloc(tall_bts_ctx);
|
||||
if (!g_bts_sm) {
|
||||
fprintf(stderr, "Failed to create BTS Site Manager structure\n");
|
||||
exit(1);
|
||||
}
|
||||
bts = gsm_bts_alloc(g_bts_sm, 0);
|
||||
if (!bts) {
|
||||
fprintf(stderr, "Failed to create BTS structure\n");
|
||||
exit(1);
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <osmo-bts/gsm_data.h>
|
||||
#include <osmo-bts/logging.h>
|
||||
#include <osmo-bts/bts.h>
|
||||
#include <osmo-bts/bts_sm.h>
|
||||
#include <osmo-bts/measurement.h>
|
||||
#include <osmo-bts/rsl.h>
|
||||
|
||||
@@ -457,7 +458,12 @@ int main(int argc, char **argv)
|
||||
osmo_init_logging2(tall_bts_ctx, &bts_log_info);
|
||||
osmo_stderr_target->categories[DMEAS].loglevel = LOGL_DEBUG;
|
||||
|
||||
bts = gsm_bts_alloc(tall_bts_ctx, 0);
|
||||
g_bts_sm = gsm_bts_sm_alloc(tall_bts_ctx);
|
||||
if (!g_bts_sm) {
|
||||
fprintf(stderr, "Failed to create BTS Site Manager structure\n");
|
||||
exit(1);
|
||||
}
|
||||
bts = gsm_bts_alloc(g_bts_sm, 0);
|
||||
if (!bts) {
|
||||
fprintf(stderr, "Failed to create BTS structure\n");
|
||||
exit(1);
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
*/
|
||||
|
||||
#include <osmo-bts/bts.h>
|
||||
#include <osmo-bts/bts_sm.h>
|
||||
#include <osmo-bts/msg_utils.h>
|
||||
#include <osmo-bts/logging.h>
|
||||
|
||||
@@ -165,7 +166,8 @@ static void test_bts_supports_cm(void)
|
||||
struct rsl_ie_chan_mode cm;
|
||||
struct gsm_bts *bts;
|
||||
|
||||
bts = gsm_bts_alloc(ctx, 0);
|
||||
g_bts_sm = gsm_bts_sm_alloc(ctx);
|
||||
bts = gsm_bts_alloc(g_bts_sm, 0);
|
||||
|
||||
/* Signalling shall be supported regardless of the features */
|
||||
cm = (struct rsl_ie_chan_mode) { .chan_rt = RSL_CMOD_CRT_TCH_Bm,
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <osmocom/core/application.h>
|
||||
|
||||
#include <osmo-bts/bts.h>
|
||||
#include <osmo-bts/bts_sm.h>
|
||||
#include <osmo-bts/logging.h>
|
||||
#include <osmo-bts/paging.h>
|
||||
#include <osmo-bts/gsm_data.h>
|
||||
@@ -184,7 +185,12 @@ int main(int argc, char **argv)
|
||||
|
||||
osmo_init_logging2(tall_bts_ctx, &bts_log_info);
|
||||
|
||||
bts = gsm_bts_alloc(tall_bts_ctx, 0);
|
||||
g_bts_sm = gsm_bts_sm_alloc(tall_bts_ctx);
|
||||
if (!g_bts_sm) {
|
||||
fprintf(stderr, "Failed to create BTS Site Manager structure\n");
|
||||
exit(1);
|
||||
}
|
||||
bts = gsm_bts_alloc(g_bts_sm, 0);
|
||||
if (bts_init(bts) < 0) {
|
||||
fprintf(stderr, "unable to open bts\n");
|
||||
exit(1);
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
|
||||
#include <osmo-bts/gsm_data.h>
|
||||
#include <osmo-bts/bts.h>
|
||||
#include <osmo-bts/bts_sm.h>
|
||||
#include <osmo-bts/logging.h>
|
||||
#include <osmo-bts/tx_power.h>
|
||||
|
||||
@@ -252,7 +253,12 @@ int main(int argc, char **argv)
|
||||
log_set_print_category(osmo_stderr_target, 0);
|
||||
log_set_print_category_hex(osmo_stderr_target, 0);
|
||||
|
||||
bts = gsm_bts_alloc(tall_bts_ctx, 0);
|
||||
g_bts_sm = gsm_bts_sm_alloc(tall_bts_ctx);
|
||||
if (!g_bts_sm) {
|
||||
fprintf(stderr, "Failed to create BTS Site Manager structure\n");
|
||||
exit(1);
|
||||
}
|
||||
bts = gsm_bts_alloc(g_bts_sm, 0);
|
||||
if (!bts) {
|
||||
fprintf(stderr, "Failed to create BTS structure\n");
|
||||
exit(1);
|
||||
|
||||
Reference in New Issue
Block a user