Store GPRS MOs directly under BTS SiteMgr object
The only real 1-1 relationship between BTS NM objects is the one between GPRS Cell and BTS (which is actually a BTS cell). In our current osmo-bts implementation we don't care much since we only handle 1-cell BTSses, but let's make the data structure organization more generic. Implementation notes: The gsm_bts_sm is moved to its own file, APIs to allocate are added and the new public object is hooked correctly in the allocation process of osmo-bsc. Change-Id: I06461b7784fa2a78de37383406e35beae85fbad8
This commit is contained in:
parent
8c03bf3f3c
commit
64c422858d
|
@ -11,6 +11,7 @@ noinst_HEADERS = \
|
||||||
bsc_subscr_conn_fsm.h \
|
bsc_subscr_conn_fsm.h \
|
||||||
bss.h \
|
bss.h \
|
||||||
bts.h \
|
bts.h \
|
||||||
|
bts_sm.h \
|
||||||
bts_trx.h \
|
bts_trx.h \
|
||||||
bts_ipaccess_nanobts_omlattr.h \
|
bts_ipaccess_nanobts_omlattr.h \
|
||||||
chan_alloc.h \
|
chan_alloc.h \
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
#include "osmocom/bsc/gsm_data.h"
|
#include "osmocom/bsc/gsm_data.h"
|
||||||
#include "osmocom/bsc/bts_trx.h"
|
#include "osmocom/bsc/bts_trx.h"
|
||||||
|
#include "osmocom/bsc/bts_sm.h"
|
||||||
|
|
||||||
enum bts_counter_id {
|
enum bts_counter_id {
|
||||||
BTS_CTR_CHREQ_TOTAL,
|
BTS_CTR_CHREQ_TOTAL,
|
||||||
|
@ -197,15 +198,11 @@ struct gsm_bts_model {
|
||||||
uint8_t _features_data[MAX_BTS_FEATURES/8];
|
uint8_t _features_data[MAX_BTS_FEATURES/8];
|
||||||
};
|
};
|
||||||
|
|
||||||
/* BTS Site Manager */
|
struct gsm_gprs_cell {
|
||||||
struct gsm_bts_sm {
|
|
||||||
struct gsm_abis_mo mo;
|
struct gsm_abis_mo mo;
|
||||||
/* nanoBTS and old versions of osmo-bts behaves this way due to
|
uint16_t bvci;
|
||||||
broken FSMs not following TS 12.21: they never do
|
uint8_t timer[11];
|
||||||
Dependency->Offline transition, but they should be OPSTARTed
|
struct gprs_rlc_cfg rlc_cfg;
|
||||||
nevertheless during Dependnecy state to work. This field is
|
|
||||||
used by all dependent NM objects. */
|
|
||||||
bool peer_has_no_avstate_offline;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* One BTS */
|
/* One BTS */
|
||||||
|
@ -272,7 +269,7 @@ struct gsm_bts {
|
||||||
/* CCCH is on C0 */
|
/* CCCH is on C0 */
|
||||||
struct gsm_bts_trx *c0;
|
struct gsm_bts_trx *c0;
|
||||||
|
|
||||||
struct gsm_bts_sm site_mgr;
|
struct gsm_bts_sm *site_mgr; /* backpointer */
|
||||||
|
|
||||||
/* bitmask of all SI that are present/valid in si_buf */
|
/* bitmask of all SI that are present/valid in si_buf */
|
||||||
uint32_t si_valid;
|
uint32_t si_valid;
|
||||||
|
@ -354,18 +351,7 @@ struct gsm_bts {
|
||||||
/* Not entirely sure how ip.access specific this is */
|
/* Not entirely sure how ip.access specific this is */
|
||||||
struct {
|
struct {
|
||||||
enum bts_gprs_mode mode;
|
enum bts_gprs_mode mode;
|
||||||
struct {
|
struct gsm_gprs_cell cell;
|
||||||
struct gsm_abis_mo mo;
|
|
||||||
uint16_t nsei;
|
|
||||||
uint8_t timer[7];
|
|
||||||
} nse;
|
|
||||||
struct {
|
|
||||||
struct gsm_abis_mo mo;
|
|
||||||
uint16_t bvci;
|
|
||||||
uint8_t timer[11];
|
|
||||||
struct gprs_rlc_cfg rlc_cfg;
|
|
||||||
} cell;
|
|
||||||
struct gsm_bts_gprs_nsvc nsvc[2];
|
|
||||||
uint8_t rac;
|
uint8_t rac;
|
||||||
uint8_t net_ctrl_ord;
|
uint8_t net_ctrl_ord;
|
||||||
bool ctrl_ack_type_use_block;
|
bool ctrl_ack_type_use_block;
|
||||||
|
@ -574,11 +560,7 @@ static inline const struct osmo_location_area_id *bts_lai(struct gsm_bts *bts)
|
||||||
return &lai;
|
return &lai;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct gsm_bts *gsm_bts_sm_get_bts(struct gsm_bts_sm *site_mgr) {
|
struct gsm_bts *gsm_bts_alloc(struct gsm_network *net, struct gsm_bts_sm *bts_sm, uint8_t bts_num);
|
||||||
return (struct gsm_bts *)container_of(site_mgr, struct gsm_bts, site_mgr);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct gsm_bts *gsm_bts_alloc(struct gsm_network *net, uint8_t bts_num);
|
|
||||||
|
|
||||||
char *gsm_bts_name(const struct gsm_bts *bts);
|
char *gsm_bts_name(const struct gsm_bts *bts);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,72 @@
|
||||||
|
/* BTS Site Manager */
|
||||||
|
|
||||||
|
/* (C) 2020 by sysmocom - s.m.f.c. GmbH <info@sysmocom.de>
|
||||||
|
* Author: Pau Espin Pedrol <pespin@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/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "osmocom/bsc/gsm_data.h"
|
||||||
|
|
||||||
|
struct gsm_bts;
|
||||||
|
|
||||||
|
struct gsm_gprs_nse {
|
||||||
|
struct gsm_abis_mo mo;
|
||||||
|
uint16_t nsei;
|
||||||
|
uint8_t timer[7];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct gsm_gprs_nsvc {
|
||||||
|
struct gsm_bts *bts;
|
||||||
|
/* data read via VTY config file, to configure the BTS
|
||||||
|
* via OML from BSC */
|
||||||
|
int id;
|
||||||
|
uint16_t nsvci;
|
||||||
|
uint16_t local_port; /* on the BTS */
|
||||||
|
struct osmo_sockaddr remote;
|
||||||
|
struct gsm_abis_mo mo;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* BTS Site Manager */
|
||||||
|
struct gsm_bts_sm {
|
||||||
|
struct gsm_bts *bts[1]; /* only one bts supported so far */
|
||||||
|
struct gsm_abis_mo mo;
|
||||||
|
/* nanoBTS and old versions of osmo-bts behaves this way due to
|
||||||
|
broken FSMs not following TS 12.21: they never do
|
||||||
|
Dependency->Offline transition, but they should be OPSTARTed
|
||||||
|
nevertheless during Dependnecy state to work. This field is
|
||||||
|
used by all dependent NM objects. */
|
||||||
|
bool peer_has_no_avstate_offline;
|
||||||
|
struct {
|
||||||
|
struct gsm_gprs_nse nse;
|
||||||
|
struct gsm_gprs_nsvc nsvc[2];
|
||||||
|
} gprs;
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline struct gsm_bts *gsm_bts_sm_get_bts(struct gsm_bts_sm *site_mgr) {
|
||||||
|
return site_mgr->bts[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
struct gsm_bts_sm *gsm_bts_sm_alloc(struct gsm_network *net, uint8_t bts_num);
|
||||||
|
|
||||||
|
void gsm_bts_sm_mo_reset(struct gsm_bts_sm *bts_sm);
|
|
@ -767,17 +767,6 @@ struct gsm_envabtse {
|
||||||
struct gsm_abis_mo mo;
|
struct gsm_abis_mo mo;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct gsm_bts_gprs_nsvc {
|
|
||||||
struct gsm_bts *bts;
|
|
||||||
/* data read via VTY config file, to configure the BTS
|
|
||||||
* via OML from BSC */
|
|
||||||
int id;
|
|
||||||
uint16_t nsvci;
|
|
||||||
uint16_t local_port; /* on the BTS */
|
|
||||||
struct osmo_sockaddr remote;
|
|
||||||
struct gsm_abis_mo mo;
|
|
||||||
};
|
|
||||||
|
|
||||||
enum gprs_rlc_par {
|
enum gprs_rlc_par {
|
||||||
RLC_T3142,
|
RLC_T3142,
|
||||||
RLC_T3169,
|
RLC_T3169,
|
||||||
|
|
|
@ -47,6 +47,7 @@ ipaccess_config_SOURCES = \
|
||||||
# FIXME: resolve the bogus dependencies patched around here:
|
# FIXME: resolve the bogus dependencies patched around here:
|
||||||
ipaccess_config_LDADD = \
|
ipaccess_config_LDADD = \
|
||||||
$(top_builddir)/src/osmo-bsc/bts.o \
|
$(top_builddir)/src/osmo-bsc/bts.o \
|
||||||
|
$(top_builddir)/src/osmo-bsc/bts_sm.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts_trx.o \
|
$(top_builddir)/src/osmo-bsc/bts_trx.o \
|
||||||
$(top_builddir)/src/osmo-bsc/abis_nm.o \
|
$(top_builddir)/src/osmo-bsc/abis_nm.o \
|
||||||
$(top_builddir)/src/osmo-bsc/acc.o \
|
$(top_builddir)/src/osmo-bsc/acc.o \
|
||||||
|
@ -72,6 +73,7 @@ ipaccess_proxy_LDADD = \
|
||||||
$(top_builddir)/src/osmo-bsc/abis_nm.o \
|
$(top_builddir)/src/osmo-bsc/abis_nm.o \
|
||||||
$(top_builddir)/src/osmo-bsc/acc.o \
|
$(top_builddir)/src/osmo-bsc/acc.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts.o \
|
$(top_builddir)/src/osmo-bsc/bts.o \
|
||||||
|
$(top_builddir)/src/osmo-bsc/bts_sm.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \
|
$(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts_trx.o \
|
$(top_builddir)/src/osmo-bsc/bts_trx.o \
|
||||||
$(top_builddir)/src/osmo-bsc/gsm_data.o \
|
$(top_builddir)/src/osmo-bsc/gsm_data.o \
|
||||||
|
|
|
@ -52,6 +52,7 @@ osmo_bsc_SOURCES = \
|
||||||
bts_ipaccess_nanobts_omlattr.c \
|
bts_ipaccess_nanobts_omlattr.c \
|
||||||
bts_nokia_site.c \
|
bts_nokia_site.c \
|
||||||
bts_siemens_bs11.c \
|
bts_siemens_bs11.c \
|
||||||
|
bts_sm.c \
|
||||||
bts_sysmobts.c \
|
bts_sysmobts.c \
|
||||||
bts_unknown.c \
|
bts_unknown.c \
|
||||||
chan_alloc.c \
|
chan_alloc.c \
|
||||||
|
|
|
@ -866,11 +866,11 @@ bool all_trx_rsl_connected_unlocked(const struct gsm_bts *bts)
|
||||||
if (bts->gprs.cell.mo.nm_state.administrative == NM_STATE_LOCKED)
|
if (bts->gprs.cell.mo.nm_state.administrative == NM_STATE_LOCKED)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (bts->gprs.nse.mo.nm_state.administrative == NM_STATE_LOCKED)
|
if (bts->site_mgr->gprs.nse.mo.nm_state.administrative == NM_STATE_LOCKED)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (bts->gprs.nsvc[0].mo.nm_state.administrative == NM_STATE_LOCKED &&
|
if (bts->site_mgr->gprs.nsvc[0].mo.nm_state.administrative == NM_STATE_LOCKED &&
|
||||||
bts->gprs.nsvc[1].mo.nm_state.administrative == NM_STATE_LOCKED)
|
bts->site_mgr->gprs.nsvc[1].mo.nm_state.administrative == NM_STATE_LOCKED)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -463,17 +463,17 @@ static void bts_dump_vty(struct vty *vty, struct gsm_bts *bts)
|
||||||
vty_out(vty, " NM State: ");
|
vty_out(vty, " NM State: ");
|
||||||
net_dump_nmstate(vty, &bts->mo.nm_state);
|
net_dump_nmstate(vty, &bts->mo.nm_state);
|
||||||
vty_out(vty, " Site Mgr NM State: ");
|
vty_out(vty, " Site Mgr NM State: ");
|
||||||
net_dump_nmstate(vty, &bts->site_mgr.mo.nm_state);
|
net_dump_nmstate(vty, &bts->site_mgr->mo.nm_state);
|
||||||
|
|
||||||
if (bts->gprs.mode != BTS_GPRS_NONE) {
|
if (bts->gprs.mode != BTS_GPRS_NONE) {
|
||||||
vty_out(vty, " GPRS NSE: ");
|
vty_out(vty, " GPRS NSE: ");
|
||||||
net_dump_nmstate(vty, &bts->gprs.nse.mo.nm_state);
|
net_dump_nmstate(vty, &bts->site_mgr->gprs.nse.mo.nm_state);
|
||||||
vty_out(vty, " GPRS CELL: ");
|
vty_out(vty, " GPRS CELL: ");
|
||||||
net_dump_nmstate(vty, &bts->gprs.cell.mo.nm_state);
|
net_dump_nmstate(vty, &bts->gprs.cell.mo.nm_state);
|
||||||
vty_out(vty, " GPRS NSVC0: ");
|
vty_out(vty, " GPRS NSVC0: ");
|
||||||
net_dump_nmstate(vty, &bts->gprs.nsvc[0].mo.nm_state);
|
net_dump_nmstate(vty, &bts->site_mgr->gprs.nsvc[0].mo.nm_state);
|
||||||
vty_out(vty, " GPRS NSVC1: ");
|
vty_out(vty, " GPRS NSVC1: ");
|
||||||
net_dump_nmstate(vty, &bts->gprs.nsvc[1].mo.nm_state);
|
net_dump_nmstate(vty, &bts->site_mgr->gprs.nsvc[1].mo.nm_state);
|
||||||
} else
|
} else
|
||||||
vty_out(vty, " GPRS: not configured%s", VTY_NEWLINE);
|
vty_out(vty, " GPRS: not configured%s", VTY_NEWLINE);
|
||||||
|
|
||||||
|
@ -740,6 +740,7 @@ static void config_write_trx_single(struct vty *vty, struct gsm_bts_trx *trx)
|
||||||
static void config_write_bts_gprs(struct vty *vty, struct gsm_bts *bts)
|
static void config_write_bts_gprs(struct vty *vty, struct gsm_bts *bts)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
struct gsm_bts_sm *bts_sm = bts->site_mgr;
|
||||||
vty_out(vty, " gprs mode %s%s", bts_gprs_mode_name(bts->gprs.mode),
|
vty_out(vty, " gprs mode %s%s", bts_gprs_mode_name(bts->gprs.mode),
|
||||||
VTY_NEWLINE);
|
VTY_NEWLINE);
|
||||||
if (bts->gprs.mode == BTS_GPRS_NONE)
|
if (bts->gprs.mode == BTS_GPRS_NONE)
|
||||||
|
@ -757,15 +758,15 @@ static void config_write_bts_gprs(struct vty *vty, struct gsm_bts *bts)
|
||||||
vty_out(vty, " gprs cell timer %s %u%s",
|
vty_out(vty, " gprs cell timer %s %u%s",
|
||||||
get_value_string(gprs_bssgp_cfg_strs, i),
|
get_value_string(gprs_bssgp_cfg_strs, i),
|
||||||
bts->gprs.cell.timer[i], VTY_NEWLINE);
|
bts->gprs.cell.timer[i], VTY_NEWLINE);
|
||||||
vty_out(vty, " gprs nsei %u%s", bts->gprs.nse.nsei,
|
vty_out(vty, " gprs nsei %u%s", bts_sm->gprs.nse.nsei,
|
||||||
VTY_NEWLINE);
|
VTY_NEWLINE);
|
||||||
for (i = 0; i < ARRAY_SIZE(bts->gprs.nse.timer); i++)
|
for (i = 0; i < ARRAY_SIZE(bts_sm->gprs.nse.timer); i++)
|
||||||
vty_out(vty, " gprs ns timer %s %u%s",
|
vty_out(vty, " gprs ns timer %s %u%s",
|
||||||
get_value_string(gprs_ns_timer_strs, i),
|
get_value_string(gprs_ns_timer_strs, i),
|
||||||
bts->gprs.nse.timer[i], VTY_NEWLINE);
|
bts_sm->gprs.nse.timer[i], VTY_NEWLINE);
|
||||||
for (i = 0; i < ARRAY_SIZE(bts->gprs.nsvc); i++) {
|
for (i = 0; i < ARRAY_SIZE(bts_sm->gprs.nsvc); i++) {
|
||||||
struct gsm_bts_gprs_nsvc *nsvc =
|
struct gsm_gprs_nsvc *nsvc =
|
||||||
&bts->gprs.nsvc[i];
|
&bts_sm->gprs.nsvc[i];
|
||||||
struct osmo_sockaddr_str remote = {};
|
struct osmo_sockaddr_str remote = {};
|
||||||
uint16_t port;
|
uint16_t port;
|
||||||
|
|
||||||
|
@ -3190,7 +3191,7 @@ DEFUN_USRATTR(cfg_bts_gprs_nsei,
|
||||||
|
|
||||||
GPRS_CHECK_ENABLED(bts);
|
GPRS_CHECK_ENABLED(bts);
|
||||||
|
|
||||||
bts->gprs.nse.nsei = atoi(argv[0]);
|
bts->site_mgr->gprs.nse.nsei = atoi(argv[0]);
|
||||||
|
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -3211,7 +3212,7 @@ DEFUN_USRATTR(cfg_bts_gprs_nsvci,
|
||||||
|
|
||||||
GPRS_CHECK_ENABLED(bts);
|
GPRS_CHECK_ENABLED(bts);
|
||||||
|
|
||||||
bts->gprs.nsvc[idx].nsvci = atoi(argv[1]);
|
bts->site_mgr->gprs.nsvc[idx].nsvci = atoi(argv[1]);
|
||||||
|
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -3231,7 +3232,7 @@ DEFUN_USRATTR(cfg_bts_gprs_nsvc_lport,
|
||||||
|
|
||||||
GPRS_CHECK_ENABLED(bts);
|
GPRS_CHECK_ENABLED(bts);
|
||||||
|
|
||||||
bts->gprs.nsvc[idx].local_port = atoi(argv[1]);
|
bts->site_mgr->gprs.nsvc[idx].local_port = atoi(argv[1]);
|
||||||
|
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -3252,7 +3253,7 @@ DEFUN_USRATTR(cfg_bts_gprs_nsvc_rport,
|
||||||
GPRS_CHECK_ENABLED(bts);
|
GPRS_CHECK_ENABLED(bts);
|
||||||
|
|
||||||
/* sockaddr_in and sockaddr_in6 have the port at the same position */
|
/* sockaddr_in and sockaddr_in6 have the port at the same position */
|
||||||
bts->gprs.nsvc[idx].remote.u.sin.sin_port = htons(atoi(argv[1]));
|
bts->site_mgr->gprs.nsvc[idx].remote.u.sin.sin_port = htons(atoi(argv[1]));
|
||||||
|
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -3281,13 +3282,13 @@ DEFUN_USRATTR(cfg_bts_gprs_nsvc_rip,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Can't use osmo_sockaddr_str_to_sockaddr() because the port would be overriden */
|
/* Can't use osmo_sockaddr_str_to_sockaddr() because the port would be overriden */
|
||||||
bts->gprs.nsvc[idx].remote.u.sas.ss_family = remote.af;
|
bts->site_mgr->gprs.nsvc[idx].remote.u.sas.ss_family = remote.af;
|
||||||
switch (remote.af) {
|
switch (remote.af) {
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
osmo_sockaddr_str_to_in_addr(&remote, &bts->gprs.nsvc[idx].remote.u.sin.sin_addr);
|
osmo_sockaddr_str_to_in_addr(&remote, &bts->site_mgr->gprs.nsvc[idx].remote.u.sin.sin_addr);
|
||||||
break;
|
break;
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
osmo_sockaddr_str_to_in6_addr(&remote, &bts->gprs.nsvc[idx].remote.u.sin6.sin6_addr);
|
osmo_sockaddr_str_to_in6_addr(&remote, &bts->site_mgr->gprs.nsvc[idx].remote.u.sin6.sin6_addr);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3321,10 +3322,10 @@ DEFUN_USRATTR(cfg_bts_gprs_ns_timer,
|
||||||
|
|
||||||
GPRS_CHECK_ENABLED(bts);
|
GPRS_CHECK_ENABLED(bts);
|
||||||
|
|
||||||
if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.nse.timer))
|
if (idx < 0 || idx >= ARRAY_SIZE(bts->site_mgr->gprs.nse.timer))
|
||||||
return CMD_WARNING;
|
return CMD_WARNING;
|
||||||
|
|
||||||
bts->gprs.nse.timer[idx] = val;
|
bts->site_mgr->gprs.nse.timer[idx] = val;
|
||||||
|
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -121,7 +121,6 @@ int gsm_bts_model_register(struct gsm_bts_model *model)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const uint8_t bts_nse_timer_default[] = { 3, 3, 3, 3, 30, 3, 10 };
|
|
||||||
static const uint8_t bts_cell_timer_default[] =
|
static const uint8_t bts_cell_timer_default[] =
|
||||||
{ 3, 3, 3, 3, 3, 10, 3, 10, 3, 10, 3 };
|
{ 3, 3, 3, 3, 3, 10, 3, 10, 3, 10, 3 };
|
||||||
static const struct gprs_rlc_cfg rlc_cfg_default = {
|
static const struct gprs_rlc_cfg rlc_cfg_default = {
|
||||||
|
@ -149,10 +148,7 @@ static const struct gprs_rlc_cfg rlc_cfg_default = {
|
||||||
|
|
||||||
static int gsm_bts_talloc_destructor(struct gsm_bts *bts)
|
static int gsm_bts_talloc_destructor(struct gsm_bts *bts)
|
||||||
{
|
{
|
||||||
if (bts->site_mgr.mo.fi) {
|
bts->site_mgr->bts[0] = NULL;
|
||||||
osmo_fsm_inst_free(bts->site_mgr.mo.fi);
|
|
||||||
bts->site_mgr.mo.fi = NULL;
|
|
||||||
}
|
|
||||||
if (bts->mo.fi) {
|
if (bts->mo.fi) {
|
||||||
osmo_fsm_inst_free(bts->mo.fi);
|
osmo_fsm_inst_free(bts->mo.fi);
|
||||||
bts->mo.fi = NULL;
|
bts->mo.fi = NULL;
|
||||||
|
@ -164,9 +160,9 @@ static int gsm_bts_talloc_destructor(struct gsm_bts *bts)
|
||||||
* This part is shared among the thin programs in osmo-bsc/src/utils/.
|
* This part is shared among the thin programs in osmo-bsc/src/utils/.
|
||||||
* osmo-bsc requires further initialization that pulls in more dependencies (see
|
* osmo-bsc requires further initialization that pulls in more dependencies (see
|
||||||
* bsc_bts_alloc_register()). */
|
* bsc_bts_alloc_register()). */
|
||||||
struct gsm_bts *gsm_bts_alloc(struct gsm_network *net, uint8_t bts_num)
|
struct gsm_bts *gsm_bts_alloc(struct gsm_network *net, struct gsm_bts_sm *bts_sm, uint8_t bts_num)
|
||||||
{
|
{
|
||||||
struct gsm_bts *bts = talloc_zero(net, struct gsm_bts);
|
struct gsm_bts *bts = talloc_zero(bts_sm, struct gsm_bts);
|
||||||
struct gsm48_multi_rate_conf mr_cfg;
|
struct gsm48_multi_rate_conf mr_cfg;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -182,26 +178,13 @@ struct gsm_bts *gsm_bts_alloc(struct gsm_network *net, uint8_t bts_num)
|
||||||
|
|
||||||
bts->ms_max_power = 15; /* dBm */
|
bts->ms_max_power = 15; /* dBm */
|
||||||
|
|
||||||
bts->site_mgr.mo.fi = osmo_fsm_inst_alloc(&nm_bts_sm_fsm, bts, &bts->site_mgr,
|
bts->site_mgr = bts_sm;
|
||||||
LOGL_INFO, NULL);
|
|
||||||
osmo_fsm_inst_update_id_f(bts->site_mgr.mo.fi, "bts_sm");
|
|
||||||
gsm_mo_init(&bts->site_mgr.mo, bts, NM_OC_SITE_MANAGER, 0xff, 0xff, 0xff);
|
|
||||||
|
|
||||||
bts->mo.fi = osmo_fsm_inst_alloc(&nm_bts_fsm, bts, bts,
|
bts->mo.fi = osmo_fsm_inst_alloc(&nm_bts_fsm, bts, bts,
|
||||||
LOGL_INFO, NULL);
|
LOGL_INFO, NULL);
|
||||||
osmo_fsm_inst_update_id_f(bts->mo.fi, "bts%d", bts->nr);
|
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);
|
gsm_mo_init(&bts->mo, bts, NM_OC_BTS, bts->nr, 0xff, 0xff);
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(bts->gprs.nsvc); i++) {
|
|
||||||
bts->gprs.nsvc[i].bts = bts;
|
|
||||||
bts->gprs.nsvc[i].id = i;
|
|
||||||
gsm_mo_init(&bts->gprs.nsvc[i].mo, bts, NM_OC_GPRS_NSVC,
|
|
||||||
bts->nr, i, 0xff);
|
|
||||||
}
|
|
||||||
memcpy(&bts->gprs.nse.timer, bts_nse_timer_default,
|
|
||||||
sizeof(bts->gprs.nse.timer));
|
|
||||||
gsm_mo_init(&bts->gprs.nse.mo, bts, NM_OC_GPRS_NSE,
|
|
||||||
bts->nr, 0xff, 0xff);
|
|
||||||
memcpy(&bts->gprs.cell.timer, bts_cell_timer_default,
|
memcpy(&bts->gprs.cell.timer, bts_cell_timer_default,
|
||||||
sizeof(bts->gprs.cell.timer));
|
sizeof(bts->gprs.cell.timer));
|
||||||
gsm_mo_init(&bts->gprs.cell.mo, bts, NM_OC_GPRS_CELL,
|
gsm_mo_init(&bts->gprs.cell.mo, bts, NM_OC_GPRS_CELL,
|
||||||
|
@ -589,10 +572,6 @@ void gsm_bts_mo_reset(struct gsm_bts *bts)
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
gsm_abis_mo_reset(&bts->mo);
|
gsm_abis_mo_reset(&bts->mo);
|
||||||
gsm_abis_mo_reset(&bts->site_mgr.mo);
|
|
||||||
for (i = 0; i < ARRAY_SIZE(bts->gprs.nsvc); i++)
|
|
||||||
gsm_abis_mo_reset(&bts->gprs.nsvc[i].mo);
|
|
||||||
gsm_abis_mo_reset(&bts->gprs.nse.mo);
|
|
||||||
gsm_abis_mo_reset(&bts->gprs.cell.mo);
|
gsm_abis_mo_reset(&bts->gprs.cell.mo);
|
||||||
|
|
||||||
llist_for_each_entry(trx, &bts->trx_list, list) {
|
llist_for_each_entry(trx, &bts->trx_list, list) {
|
||||||
|
|
|
@ -133,7 +133,7 @@ static int nm_statechg_event(int evt, struct nm_statechg_signal_data *nsd)
|
||||||
struct gsm_bts_trx *trx;
|
struct gsm_bts_trx *trx;
|
||||||
struct gsm_bts_bb_trx *bb_transc;
|
struct gsm_bts_bb_trx *bb_transc;
|
||||||
struct gsm_bts_trx_ts *ts;
|
struct gsm_bts_trx_ts *ts;
|
||||||
struct gsm_bts_gprs_nsvc *nsvc;
|
struct gsm_gprs_nsvc *nsvc;
|
||||||
|
|
||||||
struct msgb *msgb;
|
struct msgb *msgb;
|
||||||
|
|
||||||
|
@ -174,7 +174,8 @@ static int nm_statechg_event(int evt, struct nm_statechg_signal_data *nsd)
|
||||||
osmo_fsm_inst_dispatch(trx->mo.fi, NM_EV_STATE_CHG_REP, nsd);
|
osmo_fsm_inst_dispatch(trx->mo.fi, NM_EV_STATE_CHG_REP, nsd);
|
||||||
break;
|
break;
|
||||||
case NM_OC_GPRS_NSE:
|
case NM_OC_GPRS_NSE:
|
||||||
bts = container_of(obj, struct gsm_bts, gprs.nse);
|
bts_sm = container_of(obj, struct gsm_bts_sm, gprs.nse);
|
||||||
|
bts = bts_sm->bts[0];
|
||||||
if (bts->gprs.mode == BTS_GPRS_NONE)
|
if (bts->gprs.mode == BTS_GPRS_NONE)
|
||||||
break;
|
break;
|
||||||
if (new_state->availability == NM_AVSTATE_DEPENDENCY) {
|
if (new_state->availability == NM_AVSTATE_DEPENDENCY) {
|
||||||
|
@ -258,7 +259,7 @@ static int sw_activ_rep(struct msgb *mb)
|
||||||
|
|
||||||
switch (foh->obj_class) {
|
switch (foh->obj_class) {
|
||||||
case NM_OC_SITE_MANAGER:
|
case NM_OC_SITE_MANAGER:
|
||||||
osmo_fsm_inst_dispatch(bts->site_mgr.mo.fi, NM_EV_SW_ACT_REP, NULL);
|
osmo_fsm_inst_dispatch(bts->site_mgr->mo.fi, NM_EV_SW_ACT_REP, NULL);
|
||||||
break;
|
break;
|
||||||
case NM_OC_BTS:
|
case NM_OC_BTS:
|
||||||
osmo_fsm_inst_dispatch(bts->mo.fi, NM_EV_SW_ACT_REP, NULL);
|
osmo_fsm_inst_dispatch(bts->mo.fi, NM_EV_SW_ACT_REP, NULL);
|
||||||
|
@ -306,7 +307,7 @@ static void nm_rx_opstart_ack(struct msgb *oml_msg)
|
||||||
|
|
||||||
switch (foh->obj_class) {
|
switch (foh->obj_class) {
|
||||||
case NM_OC_SITE_MANAGER:
|
case NM_OC_SITE_MANAGER:
|
||||||
osmo_fsm_inst_dispatch(bts->site_mgr.mo.fi, NM_EV_OPSTART_ACK, NULL);
|
osmo_fsm_inst_dispatch(bts->site_mgr->mo.fi, NM_EV_OPSTART_ACK, NULL);
|
||||||
break;
|
break;
|
||||||
case NM_OC_BTS:
|
case NM_OC_BTS:
|
||||||
osmo_fsm_inst_dispatch(bts->mo.fi, NM_EV_OPSTART_ACK, NULL);
|
osmo_fsm_inst_dispatch(bts->mo.fi, NM_EV_OPSTART_ACK, NULL);
|
||||||
|
@ -339,7 +340,7 @@ static void nm_rx_opstart_nack(struct msgb *oml_msg)
|
||||||
|
|
||||||
switch (foh->obj_class) {
|
switch (foh->obj_class) {
|
||||||
case NM_OC_SITE_MANAGER:
|
case NM_OC_SITE_MANAGER:
|
||||||
osmo_fsm_inst_dispatch(bts->site_mgr.mo.fi, NM_EV_OPSTART_NACK, NULL);
|
osmo_fsm_inst_dispatch(bts->site_mgr->mo.fi, NM_EV_OPSTART_NACK, NULL);
|
||||||
break;
|
break;
|
||||||
case NM_OC_BTS:
|
case NM_OC_BTS:
|
||||||
osmo_fsm_inst_dispatch(bts->mo.fi, NM_EV_OPSTART_ACK, NULL);
|
osmo_fsm_inst_dispatch(bts->mo.fi, NM_EV_OPSTART_ACK, NULL);
|
||||||
|
@ -522,7 +523,7 @@ void ipaccess_drop_oml(struct gsm_bts *bts, const char *reason)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
osmo_fsm_inst_dispatch(bts->site_mgr.mo.fi, NM_EV_OML_DOWN, NULL);
|
osmo_fsm_inst_dispatch(bts->site_mgr->mo.fi, NM_EV_OML_DOWN, NULL);
|
||||||
osmo_fsm_inst_dispatch(bts->mo.fi, NM_EV_OML_DOWN, NULL);
|
osmo_fsm_inst_dispatch(bts->mo.fi, NM_EV_OML_DOWN, NULL);
|
||||||
gsm_bts_all_ts_dispatch(bts, TS_EV_OML_DOWN, NULL);
|
gsm_bts_all_ts_dispatch(bts, TS_EV_OML_DOWN, NULL);
|
||||||
|
|
||||||
|
|
|
@ -105,18 +105,19 @@ struct msgb *nanobts_attr_nse_get(struct gsm_bts *bts)
|
||||||
{
|
{
|
||||||
struct msgb *msgb;
|
struct msgb *msgb;
|
||||||
uint8_t buf[256];
|
uint8_t buf[256];
|
||||||
|
struct gsm_bts_sm *bts_sm = bts->site_mgr;
|
||||||
msgb = msgb_alloc(1024, "nanobts_attr_bts");
|
msgb = msgb_alloc(1024, "nanobts_attr_bts");
|
||||||
if (!msgb)
|
if (!msgb)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* NSEI 925 */
|
/* NSEI 925 */
|
||||||
buf[0] = bts->gprs.nse.nsei >> 8;
|
buf[0] = bts_sm->gprs.nse.nsei >> 8;
|
||||||
buf[1] = bts->gprs.nse.nsei & 0xff;
|
buf[1] = bts_sm->gprs.nse.nsei & 0xff;
|
||||||
msgb_tl16v_put(msgb, NM_ATT_IPACC_NSEI, 2, buf);
|
msgb_tl16v_put(msgb, NM_ATT_IPACC_NSEI, 2, buf);
|
||||||
|
|
||||||
/* all timers in seconds */
|
/* all timers in seconds */
|
||||||
OSMO_ASSERT(ARRAY_SIZE(bts->gprs.nse.timer) < sizeof(buf));
|
OSMO_ASSERT(ARRAY_SIZE(bts_sm->gprs.nse.timer) < sizeof(buf));
|
||||||
memcpy(buf, bts->gprs.nse.timer, ARRAY_SIZE(bts->gprs.nse.timer));
|
memcpy(buf, bts_sm->gprs.nse.timer, ARRAY_SIZE(bts_sm->gprs.nse.timer));
|
||||||
msgb_tl16v_put(msgb, NM_ATT_IPACC_NS_CFG, 7, buf);
|
msgb_tl16v_put(msgb, NM_ATT_IPACC_NS_CFG, 7, buf);
|
||||||
|
|
||||||
/* all timers in seconds */
|
/* all timers in seconds */
|
||||||
|
@ -202,16 +203,17 @@ struct msgb *nanobts_attr_nscv_get(struct gsm_bts *bts)
|
||||||
{
|
{
|
||||||
struct msgb *msgb;
|
struct msgb *msgb;
|
||||||
uint8_t buf[256];
|
uint8_t buf[256];
|
||||||
|
struct gsm_bts_sm *bts_sm = bts->site_mgr;
|
||||||
msgb = msgb_alloc(1024, "nanobts_attr_bts");
|
msgb = msgb_alloc(1024, "nanobts_attr_bts");
|
||||||
if (!msgb)
|
if (!msgb)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* 925 */
|
/* 925 */
|
||||||
buf[0] = bts->gprs.nsvc[0].nsvci >> 8;
|
buf[0] = bts_sm->gprs.nsvc[0].nsvci >> 8;
|
||||||
buf[1] = bts->gprs.nsvc[0].nsvci & 0xff;
|
buf[1] = bts_sm->gprs.nsvc[0].nsvci & 0xff;
|
||||||
msgb_tl16v_put(msgb, NM_ATT_IPACC_NSVCI, 2, buf);
|
msgb_tl16v_put(msgb, NM_ATT_IPACC_NSVCI, 2, buf);
|
||||||
|
|
||||||
switch (bts->gprs.nsvc->remote.u.sa.sa_family) {
|
switch (bts_sm->gprs.nsvc->remote.u.sa.sa_family) {
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
/* all fields are encoded in network byte order */
|
/* all fields are encoded in network byte order */
|
||||||
/* protocol family */
|
/* protocol family */
|
||||||
|
@ -219,20 +221,20 @@ struct msgb *nanobts_attr_nscv_get(struct gsm_bts *bts)
|
||||||
/* padding */
|
/* padding */
|
||||||
buf[1] = 0x00;
|
buf[1] = 0x00;
|
||||||
/* local udp port */
|
/* local udp port */
|
||||||
osmo_store16be(bts->gprs.nsvc[0].local_port, &buf[2]);
|
osmo_store16be(bts_sm->gprs.nsvc[0].local_port, &buf[2]);
|
||||||
/* remote udp port */
|
/* remote udp port */
|
||||||
memcpy(&buf[4], &bts->gprs.nsvc[0].remote.u.sin6.sin6_port, sizeof(uint16_t));
|
memcpy(&buf[4], &bts_sm->gprs.nsvc[0].remote.u.sin6.sin6_port, sizeof(uint16_t));
|
||||||
/* remote ip address */
|
/* remote ip address */
|
||||||
memcpy(&buf[6], &bts->gprs.nsvc[0].remote.u.sin6.sin6_addr, sizeof(struct in6_addr));
|
memcpy(&buf[6], &bts_sm->gprs.nsvc[0].remote.u.sin6.sin6_addr, sizeof(struct in6_addr));
|
||||||
msgb_tl16v_put(msgb, NM_ATT_OSMO_NS_LINK_CFG, 6 + sizeof(struct in6_addr), buf);
|
msgb_tl16v_put(msgb, NM_ATT_OSMO_NS_LINK_CFG, 6 + sizeof(struct in6_addr), buf);
|
||||||
break;
|
break;
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
/* remote udp port */
|
/* remote udp port */
|
||||||
memcpy(&buf[0], &bts->gprs.nsvc[0].remote.u.sin.sin_port, sizeof(uint16_t));
|
memcpy(&buf[0], &bts_sm->gprs.nsvc[0].remote.u.sin.sin_port, sizeof(uint16_t));
|
||||||
/* remote ip address */
|
/* remote ip address */
|
||||||
memcpy(&buf[2], &bts->gprs.nsvc[0].remote.u.sin.sin_addr, sizeof(struct in_addr));
|
memcpy(&buf[2], &bts_sm->gprs.nsvc[0].remote.u.sin.sin_addr, sizeof(struct in_addr));
|
||||||
/* local udp port */
|
/* local udp port */
|
||||||
osmo_store16be(bts->gprs.nsvc[0].local_port, &buf[6]);
|
osmo_store16be(bts_sm->gprs.nsvc[0].local_port, &buf[6]);
|
||||||
msgb_tl16v_put(msgb, NM_ATT_IPACC_NS_LINK_CFG, 8, buf);
|
msgb_tl16v_put(msgb, NM_ATT_IPACC_NS_LINK_CFG, 8, buf);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -1452,7 +1452,7 @@ static void nokia_abis_nm_fake_1221_ok(struct gsm_bts *bts)
|
||||||
struct gsm_bts_trx *trx;
|
struct gsm_bts_trx *trx;
|
||||||
|
|
||||||
mo_ok(&bts->mo);
|
mo_ok(&bts->mo);
|
||||||
mo_ok(&bts->site_mgr.mo);
|
mo_ok(&bts->site_mgr->mo);
|
||||||
|
|
||||||
llist_for_each_entry(trx, &bts->trx_list, list) {
|
llist_for_each_entry(trx, &bts->trx_list, list) {
|
||||||
int i;
|
int i;
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
/* (C) 2008-2018 by Harald Welte <laforge@gnumonks.org>
|
||||||
|
* (C) 2020 by sysmocom s.f.m.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 Affero 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/gsm/abis_nm.h>
|
||||||
|
|
||||||
|
#include <osmocom/bsc/gsm_data.h>
|
||||||
|
#include <osmocom/bsc/bts.h>
|
||||||
|
#include <osmocom/bsc/debug.h>
|
||||||
|
#include <osmocom/bsc/nm_common_fsm.h>
|
||||||
|
|
||||||
|
static const uint8_t bts_nse_timer_default[] = { 3, 3, 3, 3, 30, 3, 10 };
|
||||||
|
|
||||||
|
static int gsm_bts_sm_talloc_destructor(struct gsm_bts_sm *bts_sm)
|
||||||
|
{
|
||||||
|
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(struct gsm_network *net, uint8_t bts_num)
|
||||||
|
{
|
||||||
|
struct gsm_bts_sm *bts_sm = talloc_zero(net, struct gsm_bts_sm);
|
||||||
|
struct gsm_bts *bts;
|
||||||
|
int i;
|
||||||
|
if (!bts_sm)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
talloc_set_destructor(bts_sm, gsm_bts_sm_talloc_destructor);
|
||||||
|
bts_sm->mo.fi = osmo_fsm_inst_alloc(&nm_bts_sm_fsm, bts_sm, bts_sm,
|
||||||
|
LOGL_INFO, NULL);
|
||||||
|
osmo_fsm_inst_update_id_f(bts_sm->mo.fi, "bts_sm");
|
||||||
|
|
||||||
|
bts = gsm_bts_alloc(net, bts_sm, bts_num);
|
||||||
|
if (!bts) {
|
||||||
|
talloc_free(bts_sm);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
bts_sm->bts[0] = bts;
|
||||||
|
|
||||||
|
gsm_mo_init(&bts_sm->mo, bts, NM_OC_SITE_MANAGER, 0xff, 0xff, 0xff);
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(bts_sm->gprs.nsvc); i++) {
|
||||||
|
bts_sm->gprs.nsvc[i].bts = bts;
|
||||||
|
bts_sm->gprs.nsvc[i].id = i;
|
||||||
|
gsm_mo_init(&bts_sm->gprs.nsvc[i].mo, bts, NM_OC_GPRS_NSVC,
|
||||||
|
bts->nr, i, 0xff);
|
||||||
|
}
|
||||||
|
memcpy(&bts_sm->gprs.nse.timer, bts_nse_timer_default,
|
||||||
|
sizeof(bts_sm->gprs.nse.timer));
|
||||||
|
gsm_mo_init(&bts_sm->gprs.nse.mo, bts, NM_OC_GPRS_NSE,
|
||||||
|
bts->nr, 0xff, 0xff);
|
||||||
|
|
||||||
|
return bts_sm;
|
||||||
|
}
|
||||||
|
|
||||||
|
void gsm_bts_sm_mo_reset(struct gsm_bts_sm *bts_sm)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
gsm_abis_mo_reset(&bts_sm->mo);
|
||||||
|
|
||||||
|
gsm_abis_mo_reset(&bts_sm->gprs.nse.mo);
|
||||||
|
for (i = 0; i < ARRAY_SIZE(bts_sm->gprs.nsvc); i++)
|
||||||
|
gsm_abis_mo_reset(&bts_sm->gprs.nsvc[i].mo);
|
||||||
|
|
||||||
|
gsm_bts_mo_reset(bts_sm->bts[0]);
|
||||||
|
}
|
|
@ -110,14 +110,16 @@ struct gsm_bts *gsm_bts_alloc_register(struct gsm_network *net, enum gsm_bts_typ
|
||||||
uint8_t bsic)
|
uint8_t bsic)
|
||||||
{
|
{
|
||||||
struct gsm_bts_model *model = bts_model_find(type);
|
struct gsm_bts_model *model = bts_model_find(type);
|
||||||
|
struct gsm_bts_sm *bts_sm;
|
||||||
struct gsm_bts *bts;
|
struct gsm_bts *bts;
|
||||||
|
|
||||||
if (!model && type != GSM_BTS_TYPE_UNKNOWN)
|
if (!model && type != GSM_BTS_TYPE_UNKNOWN)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
bts = gsm_bts_alloc(net, net->num_bts);
|
bts_sm = gsm_bts_sm_alloc(net, net->num_bts);
|
||||||
if (!bts)
|
if (!bts_sm)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
bts = bts_sm->bts[0];
|
||||||
|
|
||||||
net->num_bts++;
|
net->num_bts++;
|
||||||
|
|
||||||
|
@ -378,7 +380,7 @@ gsm_objclass2mo(struct gsm_bts *bts, uint8_t obj_class,
|
||||||
mo = &trx->ts[obj_inst->ts_nr].mo;
|
mo = &trx->ts[obj_inst->ts_nr].mo;
|
||||||
break;
|
break;
|
||||||
case NM_OC_SITE_MANAGER:
|
case NM_OC_SITE_MANAGER:
|
||||||
mo = &bts->site_mgr.mo;
|
mo = &bts->site_mgr->mo;
|
||||||
break;
|
break;
|
||||||
case NM_OC_BS11:
|
case NM_OC_BS11:
|
||||||
switch (obj_inst->bts_nr) {
|
switch (obj_inst->bts_nr) {
|
||||||
|
@ -410,15 +412,15 @@ gsm_objclass2mo(struct gsm_bts *bts, uint8_t obj_class,
|
||||||
mo = &bts->bs11.envabtse[obj_inst->trx_nr].mo;
|
mo = &bts->bs11.envabtse[obj_inst->trx_nr].mo;
|
||||||
break;
|
break;
|
||||||
case NM_OC_GPRS_NSE:
|
case NM_OC_GPRS_NSE:
|
||||||
mo = &bts->gprs.nse.mo;
|
mo = &bts->site_mgr->gprs.nse.mo;
|
||||||
break;
|
break;
|
||||||
case NM_OC_GPRS_CELL:
|
case NM_OC_GPRS_CELL:
|
||||||
mo = &bts->gprs.cell.mo;
|
mo = &bts->gprs.cell.mo;
|
||||||
break;
|
break;
|
||||||
case NM_OC_GPRS_NSVC:
|
case NM_OC_GPRS_NSVC:
|
||||||
if (obj_inst->trx_nr >= ARRAY_SIZE(bts->gprs.nsvc))
|
if (obj_inst->trx_nr >= ARRAY_SIZE(bts->site_mgr->gprs.nsvc))
|
||||||
return NULL;
|
return NULL;
|
||||||
mo = &bts->gprs.nsvc[obj_inst->trx_nr].mo;
|
mo = &bts->site_mgr->gprs.nsvc[obj_inst->trx_nr].mo;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return mo;
|
return mo;
|
||||||
|
@ -474,18 +476,18 @@ gsm_objclass2obj(struct gsm_bts *bts, uint8_t obj_class,
|
||||||
obj = &trx->ts[obj_inst->ts_nr];
|
obj = &trx->ts[obj_inst->ts_nr];
|
||||||
break;
|
break;
|
||||||
case NM_OC_SITE_MANAGER:
|
case NM_OC_SITE_MANAGER:
|
||||||
obj = &bts->site_mgr;
|
obj = bts->site_mgr;
|
||||||
break;
|
break;
|
||||||
case NM_OC_GPRS_NSE:
|
case NM_OC_GPRS_NSE:
|
||||||
obj = &bts->gprs.nse;
|
obj = &bts->site_mgr->gprs.nse;
|
||||||
break;
|
break;
|
||||||
case NM_OC_GPRS_CELL:
|
case NM_OC_GPRS_CELL:
|
||||||
obj = &bts->gprs.cell;
|
obj = &bts->gprs.cell;
|
||||||
break;
|
break;
|
||||||
case NM_OC_GPRS_NSVC:
|
case NM_OC_GPRS_NSVC:
|
||||||
if (obj_inst->trx_nr >= ARRAY_SIZE(bts->gprs.nsvc))
|
if (obj_inst->trx_nr >= ARRAY_SIZE(bts->site_mgr->gprs.nsvc))
|
||||||
return NULL;
|
return NULL;
|
||||||
obj = &bts->gprs.nsvc[obj_inst->trx_nr];
|
obj = &bts->site_mgr->gprs.nsvc[obj_inst->trx_nr];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return obj;
|
return obj;
|
||||||
|
|
|
@ -113,7 +113,7 @@ static void st_op_disabled_dependency_on_enter(struct osmo_fsm_inst *fi, uint32_
|
||||||
struct gsm_bts_bb_trx *bb_transc = (struct gsm_bts_bb_trx *)fi->priv;
|
struct gsm_bts_bb_trx *bb_transc = (struct gsm_bts_bb_trx *)fi->priv;
|
||||||
struct gsm_bts_trx *trx = gsm_bts_bb_trx_get_trx(bb_transc);
|
struct gsm_bts_trx *trx = gsm_bts_bb_trx_get_trx(bb_transc);
|
||||||
|
|
||||||
if (trx->bts->site_mgr.peer_has_no_avstate_offline) {
|
if (trx->bts->site_mgr->peer_has_no_avstate_offline) {
|
||||||
nm_bb_transc_fsm_state_chg(fi, NM_BB_TRANSC_ST_OP_DISABLED_OFFLINE);
|
nm_bb_transc_fsm_state_chg(fi, NM_BB_TRANSC_ST_OP_DISABLED_OFFLINE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -187,7 +187,7 @@ static void st_op_disabled_offline(struct osmo_fsm_inst *fi, uint32_t event, voi
|
||||||
case NM_AVSTATE_DEPENDENCY:
|
case NM_AVSTATE_DEPENDENCY:
|
||||||
/* There's no point in moving back to Dependency, since it's broken
|
/* There's no point in moving back to Dependency, since it's broken
|
||||||
and it acts actually as if it was in Offline state */
|
and it acts actually as if it was in Offline state */
|
||||||
if (!trx->bts->site_mgr.peer_has_no_avstate_offline) {
|
if (!trx->bts->site_mgr->peer_has_no_avstate_offline) {
|
||||||
nm_bb_transc_fsm_state_chg(fi, NM_BB_TRANSC_ST_OP_DISABLED_DEPENDENCY);
|
nm_bb_transc_fsm_state_chg(fi, NM_BB_TRANSC_ST_OP_DISABLED_DEPENDENCY);
|
||||||
} else {
|
} else {
|
||||||
/* Moreover, in nanoBTS we need to check here for tx
|
/* Moreover, in nanoBTS we need to check here for tx
|
||||||
|
|
|
@ -119,7 +119,7 @@ static void st_op_disabled_dependency_on_enter(struct osmo_fsm_inst *fi, uint32_
|
||||||
/* nanoBTS is broken, doesn't follow TS 12.21. Opstart MUST be sent
|
/* nanoBTS is broken, doesn't follow TS 12.21. Opstart MUST be sent
|
||||||
during Dependency, so we simply move to OFFLINE state here to avoid
|
during Dependency, so we simply move to OFFLINE state here to avoid
|
||||||
duplicating code */
|
duplicating code */
|
||||||
if (bts->site_mgr.peer_has_no_avstate_offline) {
|
if (bts->site_mgr->peer_has_no_avstate_offline) {
|
||||||
nm_bts_fsm_state_chg(fi, NM_BTS_ST_OP_DISABLED_OFFLINE);
|
nm_bts_fsm_state_chg(fi, NM_BTS_ST_OP_DISABLED_OFFLINE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -202,7 +202,7 @@ static void st_op_disabled_offline(struct osmo_fsm_inst *fi, uint32_t event, voi
|
||||||
case NM_AVSTATE_DEPENDENCY:
|
case NM_AVSTATE_DEPENDENCY:
|
||||||
/* There's no point in moving back to Dependency, since it's broken
|
/* There's no point in moving back to Dependency, since it's broken
|
||||||
and it acts actually as if it was in Offline state */
|
and it acts actually as if it was in Offline state */
|
||||||
if (!bts->site_mgr.peer_has_no_avstate_offline) {
|
if (!bts->site_mgr->peer_has_no_avstate_offline) {
|
||||||
nm_bts_fsm_state_chg(fi, NM_BTS_ST_OP_DISABLED_DEPENDENCY);
|
nm_bts_fsm_state_chg(fi, NM_BTS_ST_OP_DISABLED_DEPENDENCY);
|
||||||
} else {
|
} else {
|
||||||
/* Moreover, in nanoBTS we need to check here for tx
|
/* Moreover, in nanoBTS we need to check here for tx
|
||||||
|
|
|
@ -78,7 +78,7 @@ static void st_op_disabled_notinstalled(struct osmo_fsm_inst *fi, uint32_t event
|
||||||
"have your .cfg with 'type nanobts'. Otherwise, you probably "
|
"have your .cfg with 'type nanobts'. Otherwise, you probably "
|
||||||
"are using an old osmo-bts; automatically adjusting OML "
|
"are using an old osmo-bts; automatically adjusting OML "
|
||||||
"behavior to be backward-compatible.\n");
|
"behavior to be backward-compatible.\n");
|
||||||
bts->site_mgr.peer_has_no_avstate_offline = true;
|
site_mgr->peer_has_no_avstate_offline = true;
|
||||||
}
|
}
|
||||||
nm_bts_sm_fsm_state_chg(fi, NM_BTS_SM_ST_OP_ENABLED);
|
nm_bts_sm_fsm_state_chg(fi, NM_BTS_SM_ST_OP_ENABLED);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -125,7 +125,7 @@ static void st_op_disabled_dependency_on_enter(struct osmo_fsm_inst *fi, uint32_
|
||||||
{
|
{
|
||||||
struct gsm_bts_trx_ts *ts = (struct gsm_bts_trx_ts *)fi->priv;
|
struct gsm_bts_trx_ts *ts = (struct gsm_bts_trx_ts *)fi->priv;
|
||||||
|
|
||||||
if (ts->trx->bts->site_mgr.peer_has_no_avstate_offline) {
|
if (ts->trx->bts->site_mgr->peer_has_no_avstate_offline) {
|
||||||
nm_chan_fsm_state_chg(fi, NM_CHAN_ST_OP_DISABLED_OFFLINE);
|
nm_chan_fsm_state_chg(fi, NM_CHAN_ST_OP_DISABLED_OFFLINE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -208,7 +208,7 @@ static void st_op_disabled_offline(struct osmo_fsm_inst *fi, uint32_t event, voi
|
||||||
case NM_AVSTATE_DEPENDENCY:
|
case NM_AVSTATE_DEPENDENCY:
|
||||||
/* There's no point in moving back to Dependency, since it's broken
|
/* There's no point in moving back to Dependency, since it's broken
|
||||||
and it acts actually as if it was in Offline state */
|
and it acts actually as if it was in Offline state */
|
||||||
if (!ts->trx->bts->site_mgr.peer_has_no_avstate_offline) {
|
if (!ts->trx->bts->site_mgr->peer_has_no_avstate_offline) {
|
||||||
nm_chan_fsm_state_chg(fi, NM_CHAN_ST_OP_DISABLED_DEPENDENCY);
|
nm_chan_fsm_state_chg(fi, NM_CHAN_ST_OP_DISABLED_DEPENDENCY);
|
||||||
} else {
|
} else {
|
||||||
/* Moreover, in nanoBTS we need to check here for tx
|
/* Moreover, in nanoBTS we need to check here for tx
|
||||||
|
|
|
@ -424,7 +424,7 @@ static int inp_sig_cb(unsigned int subsys, unsigned int signal,
|
||||||
osmo_timer_del(&trx->bts->cbch_timer);
|
osmo_timer_del(&trx->bts->cbch_timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
gsm_bts_mo_reset(trx->bts);
|
gsm_bts_sm_mo_reset(trx->bts->site_mgr);
|
||||||
|
|
||||||
abis_nm_clear_queue(trx->bts);
|
abis_nm_clear_queue(trx->bts);
|
||||||
break;
|
break;
|
||||||
|
@ -529,7 +529,7 @@ static int bootstrap_bts(struct gsm_bts *bts)
|
||||||
/* ACC ramping is initialized from vty/config */
|
/* ACC ramping is initialized from vty/config */
|
||||||
|
|
||||||
/* Initialize the BTS state */
|
/* Initialize the BTS state */
|
||||||
gsm_bts_mo_reset(bts);
|
gsm_bts_sm_mo_reset(bts->site_mgr);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,6 +46,7 @@
|
||||||
#include <osmocom/bsc/abis_rsl.h>
|
#include <osmocom/bsc/abis_rsl.h>
|
||||||
#include <osmocom/bsc/gsm_04_08_rr.h>
|
#include <osmocom/bsc/gsm_04_08_rr.h>
|
||||||
#include <osmocom/bsc/bts.h>
|
#include <osmocom/bsc/bts.h>
|
||||||
|
#include <osmocom/bsc/bts_sm.h>
|
||||||
|
|
||||||
static int pcu_sock_send(struct gsm_bts *bts, struct msgb *msg);
|
static int pcu_sock_send(struct gsm_bts *bts, struct msgb *msg);
|
||||||
uint32_t trx_get_hlayer1(struct gsm_bts_trx *trx);
|
uint32_t trx_get_hlayer1(struct gsm_bts_trx *trx);
|
||||||
|
@ -115,13 +116,17 @@ static int pcu_tx_info_ind(struct gsm_bts *bts)
|
||||||
struct gsm_pcu_if *pcu_prim;
|
struct gsm_pcu_if *pcu_prim;
|
||||||
struct gsm_pcu_if_info_ind *info_ind;
|
struct gsm_pcu_if_info_ind *info_ind;
|
||||||
struct gprs_rlc_cfg *rlcc;
|
struct gprs_rlc_cfg *rlcc;
|
||||||
struct gsm_bts_gprs_nsvc *nsvc;
|
struct gsm_bts_sm *bts_sm;
|
||||||
|
struct gsm_gprs_nsvc *nsvc;
|
||||||
struct gsm_bts_trx *trx;
|
struct gsm_bts_trx *trx;
|
||||||
struct gsm_bts_trx_ts *ts;
|
struct gsm_bts_trx_ts *ts;
|
||||||
int i, tn;
|
int i, tn;
|
||||||
|
|
||||||
OSMO_ASSERT(bts);
|
OSMO_ASSERT(bts);
|
||||||
OSMO_ASSERT(bts->network);
|
OSMO_ASSERT(bts->network);
|
||||||
|
OSMO_ASSERT(bts->site_mgr);
|
||||||
|
|
||||||
|
bts_sm = bts->site_mgr;
|
||||||
|
|
||||||
LOGP(DPCU, LOGL_INFO, "Sending info for BTS %d\n",bts->nr);
|
LOGP(DPCU, LOGL_INFO, "Sending info for BTS %d\n",bts->nr);
|
||||||
|
|
||||||
|
@ -147,8 +152,8 @@ static int pcu_tx_info_ind(struct gsm_bts *bts)
|
||||||
info_ind->rac = bts->gprs.rac;
|
info_ind->rac = bts->gprs.rac;
|
||||||
|
|
||||||
/* NSE */
|
/* NSE */
|
||||||
info_ind->nsei = bts->gprs.nse.nsei;
|
info_ind->nsei = bts_sm->gprs.nse.nsei;
|
||||||
memcpy(info_ind->nse_timer, bts->gprs.nse.timer, 7);
|
memcpy(info_ind->nse_timer, bts_sm->gprs.nse.timer, 7);
|
||||||
memcpy(info_ind->cell_timer, bts->gprs.cell.timer, 11);
|
memcpy(info_ind->cell_timer, bts->gprs.cell.timer, 11);
|
||||||
|
|
||||||
/* cell attributes */
|
/* cell attributes */
|
||||||
|
@ -202,7 +207,7 @@ static int pcu_tx_info_ind(struct gsm_bts *bts)
|
||||||
|
|
||||||
/* NSVC */
|
/* NSVC */
|
||||||
for (i = 0; i < ARRAY_SIZE(info_ind->nsvci); i++) {
|
for (i = 0; i < ARRAY_SIZE(info_ind->nsvci); i++) {
|
||||||
nsvc = &bts->gprs.nsvc[i];
|
nsvc = &bts->site_mgr->gprs.nsvc[i];
|
||||||
|
|
||||||
info_ind->nsvci[i] = nsvc->nsvci;
|
info_ind->nsvci[i] = nsvc->nsvci;
|
||||||
info_ind->local_port[i] = nsvc->local_port;
|
info_ind->local_port[i] = nsvc->local_port;
|
||||||
|
|
|
@ -50,6 +50,7 @@ bs11_config_LDADD = \
|
||||||
$(top_builddir)/src/osmo-bsc/abis_nm.o \
|
$(top_builddir)/src/osmo-bsc/abis_nm.o \
|
||||||
$(top_builddir)/src/osmo-bsc/acc.o \
|
$(top_builddir)/src/osmo-bsc/acc.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts.o \
|
$(top_builddir)/src/osmo-bsc/bts.o \
|
||||||
|
$(top_builddir)/src/osmo-bsc/bts_sm.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts_trx.o \
|
$(top_builddir)/src/osmo-bsc/bts_trx.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts_siemens_bs11.o \
|
$(top_builddir)/src/osmo-bsc/bts_siemens_bs11.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \
|
$(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \
|
||||||
|
@ -130,6 +131,7 @@ meas_json_LDADD = \
|
||||||
$(top_builddir)/src/osmo-bsc/abis_nm.o \
|
$(top_builddir)/src/osmo-bsc/abis_nm.o \
|
||||||
$(top_builddir)/src/osmo-bsc/acc.o \
|
$(top_builddir)/src/osmo-bsc/acc.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts.o \
|
$(top_builddir)/src/osmo-bsc/bts.o \
|
||||||
|
$(top_builddir)/src/osmo-bsc/bts_sm.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \
|
$(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts_trx.o \
|
$(top_builddir)/src/osmo-bsc/bts_trx.o \
|
||||||
$(top_builddir)/src/osmo-bsc/gsm_data.o \
|
$(top_builddir)/src/osmo-bsc/gsm_data.o \
|
||||||
|
|
|
@ -29,6 +29,7 @@ abis_test_LDADD = \
|
||||||
$(top_builddir)/src/osmo-bsc/acc.o \
|
$(top_builddir)/src/osmo-bsc/acc.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts.o \
|
$(top_builddir)/src/osmo-bsc/bts.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \
|
$(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \
|
||||||
|
$(top_builddir)/src/osmo-bsc/bts_sm.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts_trx.o \
|
$(top_builddir)/src/osmo-bsc/bts_trx.o \
|
||||||
$(top_builddir)/src/osmo-bsc/gsm_data.o \
|
$(top_builddir)/src/osmo-bsc/gsm_data.o \
|
||||||
$(top_builddir)/src/osmo-bsc/net_init.o \
|
$(top_builddir)/src/osmo-bsc/net_init.o \
|
||||||
|
|
|
@ -28,6 +28,7 @@ acc_test_LDADD = \
|
||||||
$(top_builddir)/src/osmo-bsc/abis_nm.o \
|
$(top_builddir)/src/osmo-bsc/abis_nm.o \
|
||||||
$(top_builddir)/src/osmo-bsc/acc.o \
|
$(top_builddir)/src/osmo-bsc/acc.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts.o \
|
$(top_builddir)/src/osmo-bsc/bts.o \
|
||||||
|
$(top_builddir)/src/osmo-bsc/bts_sm.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \
|
$(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts_trx.o \
|
$(top_builddir)/src/osmo-bsc/bts_trx.o \
|
||||||
$(top_builddir)/src/osmo-bsc/gsm_data.o \
|
$(top_builddir)/src/osmo-bsc/gsm_data.o \
|
||||||
|
|
|
@ -44,7 +44,8 @@ static void clock_debug(char* str)
|
||||||
#define bts_init(net) _bts_init(net, __func__)
|
#define bts_init(net) _bts_init(net, __func__)
|
||||||
static inline struct gsm_bts *_bts_init(struct gsm_network *net, const char *msg)
|
static inline struct gsm_bts *_bts_init(struct gsm_network *net, const char *msg)
|
||||||
{
|
{
|
||||||
struct gsm_bts *bts = gsm_bts_alloc(net, 0);
|
struct gsm_bts_sm *bts_sm = gsm_bts_sm_alloc(net, 0);
|
||||||
|
struct gsm_bts *bts = bts_sm->bts[0];
|
||||||
if (!bts) {
|
if (!bts) {
|
||||||
fprintf(stderr, "BTS allocation failure in %s()\n", msg);
|
fprintf(stderr, "BTS allocation failure in %s()\n", msg);
|
||||||
exit(1);
|
exit(1);
|
||||||
|
@ -66,7 +67,7 @@ static inline void _bts_del(struct gsm_bts *bts, const char *msg)
|
||||||
if (osmo_timer_pending(&bts->acc_ramp.step_timer))
|
if (osmo_timer_pending(&bts->acc_ramp.step_timer))
|
||||||
osmo_timer_del(&bts->acc_ramp.step_timer);
|
osmo_timer_del(&bts->acc_ramp.step_timer);
|
||||||
/* no need to llist_del(&bts->list), we never registered the bts there. */
|
/* no need to llist_del(&bts->list), we never registered the bts there. */
|
||||||
talloc_free(bts);
|
talloc_free(bts->site_mgr);
|
||||||
fprintf(stderr, "BTS deallocated OK in %s()\n", msg);
|
fprintf(stderr, "BTS deallocated OK in %s()\n", msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,6 +39,7 @@ bsc_test_LDADD = \
|
||||||
$(top_builddir)/src/osmo-bsc/osmo_bsc_filter.o \
|
$(top_builddir)/src/osmo-bsc/osmo_bsc_filter.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bsc_subscriber.o \
|
$(top_builddir)/src/osmo-bsc/bsc_subscriber.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts.o \
|
$(top_builddir)/src/osmo-bsc/bts.o \
|
||||||
|
$(top_builddir)/src/osmo-bsc/bts_sm.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \
|
$(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts_trx.o \
|
$(top_builddir)/src/osmo-bsc/bts_trx.o \
|
||||||
$(top_builddir)/src/osmo-bsc/gsm_data.o \
|
$(top_builddir)/src/osmo-bsc/gsm_data.o \
|
||||||
|
|
|
@ -29,6 +29,7 @@ gsm0408_test_LDADD = \
|
||||||
$(top_builddir)/src/osmo-bsc/arfcn_range_encode.o \
|
$(top_builddir)/src/osmo-bsc/arfcn_range_encode.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts.o \
|
$(top_builddir)/src/osmo-bsc/bts.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \
|
$(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \
|
||||||
|
$(top_builddir)/src/osmo-bsc/bts_sm.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts_trx.o \
|
$(top_builddir)/src/osmo-bsc/bts_trx.o \
|
||||||
$(top_builddir)/src/osmo-bsc/gsm_data.o \
|
$(top_builddir)/src/osmo-bsc/gsm_data.o \
|
||||||
$(top_builddir)/src/osmo-bsc/net_init.o \
|
$(top_builddir)/src/osmo-bsc/net_init.o \
|
||||||
|
|
|
@ -123,7 +123,8 @@ static inline void _bts_uarfcn_add(struct gsm_bts *bts, uint16_t arfcn, uint16_t
|
||||||
#define bts_init(net) _bts_init(net, __func__)
|
#define bts_init(net) _bts_init(net, __func__)
|
||||||
static inline struct gsm_bts *_bts_init(struct gsm_network *net, const char *msg)
|
static inline struct gsm_bts *_bts_init(struct gsm_network *net, const char *msg)
|
||||||
{
|
{
|
||||||
struct gsm_bts *bts = gsm_bts_alloc(net, 0);
|
struct gsm_bts_sm *bts_sm = gsm_bts_sm_alloc(net, 0);
|
||||||
|
struct gsm_bts *bts = bts_sm->bts[0];
|
||||||
if (!bts) {
|
if (!bts) {
|
||||||
printf("BTS allocation failure in %s()\n", msg);
|
printf("BTS allocation failure in %s()\n", msg);
|
||||||
exit(1);
|
exit(1);
|
||||||
|
@ -143,7 +144,7 @@ static inline void _bts_del(struct gsm_bts *bts, const char *msg)
|
||||||
if (osmo_timer_pending(&bts->acc_mgr.rotate_timer))
|
if (osmo_timer_pending(&bts->acc_mgr.rotate_timer))
|
||||||
osmo_timer_del(&bts->acc_mgr.rotate_timer);
|
osmo_timer_del(&bts->acc_mgr.rotate_timer);
|
||||||
/* no need to llist_del(&bts->list), we never registered the bts there. */
|
/* no need to llist_del(&bts->list), we never registered the bts there. */
|
||||||
talloc_free(bts);
|
talloc_free(bts->site_mgr);
|
||||||
printf("BTS deallocated OK in %s()\n", msg);
|
printf("BTS deallocated OK in %s()\n", msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,6 +58,7 @@ handover_test_LDADD = \
|
||||||
$(top_builddir)/src/osmo-bsc/bsc_subscriber.o \
|
$(top_builddir)/src/osmo-bsc/bsc_subscriber.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bsc_vty.o \
|
$(top_builddir)/src/osmo-bsc/bsc_vty.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts.o \
|
$(top_builddir)/src/osmo-bsc/bts.o \
|
||||||
|
$(top_builddir)/src/osmo-bsc/bts_sm.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts_trx.o \
|
$(top_builddir)/src/osmo-bsc/bts_trx.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts.o \
|
$(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \
|
$(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \
|
||||||
|
|
|
@ -27,6 +27,7 @@ nanobts_omlattr_test_LDADD = \
|
||||||
$(top_builddir)/src/osmo-bsc/acc.o \
|
$(top_builddir)/src/osmo-bsc/acc.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \
|
$(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts.o \
|
$(top_builddir)/src/osmo-bsc/bts.o \
|
||||||
|
$(top_builddir)/src/osmo-bsc/bts_sm.o \
|
||||||
$(top_builddir)/src/osmo-bsc/bts_trx.o \
|
$(top_builddir)/src/osmo-bsc/bts_trx.o \
|
||||||
$(top_builddir)/src/osmo-bsc/gsm_data.o \
|
$(top_builddir)/src/osmo-bsc/gsm_data.o \
|
||||||
$(top_builddir)/src/osmo-bsc/nm_common_fsm.o \
|
$(top_builddir)/src/osmo-bsc/nm_common_fsm.o \
|
||||||
|
|
|
@ -243,7 +243,7 @@ int main(int argc, char **argv)
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Parameters needed to test nanobts_attr_nse_get() */
|
/* Parameters needed to test nanobts_attr_nse_get() */
|
||||||
bts->gprs.nse.nsei = 101;
|
bts->site_mgr->gprs.nse.nsei = 101;
|
||||||
uint8_t attr_nse_expected[] =
|
uint8_t attr_nse_expected[] =
|
||||||
{ 0x9d, 0x00, 0x02, 0x00, 0x65, 0xa0, 0x00, 0x07, 0x03, 0x03, 0x03,
|
{ 0x9d, 0x00, 0x02, 0x00, 0x65, 0xa0, 0x00, 0x07, 0x03, 0x03, 0x03,
|
||||||
0x03, 0x1e, 0x03, 0x0a, 0xa1, 0x00, 0x0b, 0x03, 0x03, 0x03,
|
0x03, 0x1e, 0x03, 0x0a, 0xa1, 0x00, 0x0b, 0x03, 0x03, 0x03,
|
||||||
|
@ -266,9 +266,9 @@ int main(int argc, char **argv)
|
||||||
/* Parameters needed to test nanobts_attr_nscv_get() */
|
/* Parameters needed to test nanobts_attr_nscv_get() */
|
||||||
struct osmo_sockaddr_str addr;
|
struct osmo_sockaddr_str addr;
|
||||||
osmo_sockaddr_str_from_str(&addr, "10.9.1.101", 23000);
|
osmo_sockaddr_str_from_str(&addr, "10.9.1.101", 23000);
|
||||||
osmo_sockaddr_str_to_sockaddr(&addr, &bts->gprs.nsvc[0].remote.u.sas);
|
osmo_sockaddr_str_to_sockaddr(&addr, &bts->site_mgr->gprs.nsvc[0].remote.u.sas);
|
||||||
bts->gprs.nsvc[0].nsvci = 0x65;
|
bts->site_mgr->gprs.nsvc[0].nsvci = 0x65;
|
||||||
bts->gprs.nsvc[0].local_port = 0x5a3c;
|
bts->site_mgr->gprs.nsvc[0].local_port = 0x5a3c;
|
||||||
uint8_t attr_nscv_expected[] =
|
uint8_t attr_nscv_expected[] =
|
||||||
{ 0x9f, 0x00, 0x02, 0x00, 0x65, 0xa2, 0x00, 0x08, 0x59, 0xd8, 0x0a,
|
{ 0x9f, 0x00, 0x02, 0x00, 0x65, 0xa2, 0x00, 0x08, 0x59, 0xd8, 0x0a,
|
||||||
0x09, 0x01, 0x65, 0x5a, 0x3c
|
0x09, 0x01, 0x65, 0x5a, 0x3c
|
||||||
|
@ -291,9 +291,9 @@ int main(int argc, char **argv)
|
||||||
/* NSVC IPv6 test */
|
/* NSVC IPv6 test */
|
||||||
struct osmo_sockaddr_str addr6;
|
struct osmo_sockaddr_str addr6;
|
||||||
osmo_sockaddr_str_from_str(&addr6, "fd00:5678:9012:3456:7890:1234:5678:9012", 23010);
|
osmo_sockaddr_str_from_str(&addr6, "fd00:5678:9012:3456:7890:1234:5678:9012", 23010);
|
||||||
osmo_sockaddr_str_to_sockaddr(&addr6, &bts->gprs.nsvc[0].remote.u.sas);
|
osmo_sockaddr_str_to_sockaddr(&addr6, &bts->site_mgr->gprs.nsvc[0].remote.u.sas);
|
||||||
bts->gprs.nsvc[0].nsvci = 0x65;
|
bts->site_mgr->gprs.nsvc[0].nsvci = 0x65;
|
||||||
bts->gprs.nsvc[0].local_port = 0x5a3c;
|
bts->site_mgr->gprs.nsvc[0].local_port = 0x5a3c;
|
||||||
uint8_t attr_nscv6_expected[] =
|
uint8_t attr_nscv6_expected[] =
|
||||||
/* |- oml attr |-16bit length */
|
/* |- oml attr |-16bit length */
|
||||||
{ 0x9f, 0x00, 0x02, 0x00, 0x65, 0xfd, 0x00, 0x16,
|
{ 0x9f, 0x00, 0x02, 0x00, 0x65, 0xfd, 0x00, 0x16,
|
||||||
|
|
Loading…
Reference in New Issue