Projects
osmocom:latest
osmo-bsc
Log In
Username
Password
We truncated the diff of some files because they were too big. If you want to see the full diff for every file,
click here
.
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 16
View file
osmo-bsc_1.13.3.dsc -> osmo-bsc_1.14.0.dsc
Changed
@@ -2,13 +2,13 @@ Source: osmo-bsc Binary: osmo-bsc, osmo-bsc-dbg, abisip-find, osmo-bsc-ipaccess-utils, osmo-bsc-bs11-utils, osmo-bsc-meas-utils, osmo-bsc-doc Architecture: any all -Version: 1.13.3 +Version: 1.14.0 Maintainer: Osmocom team <openbsc@lists.osmocom.org> Homepage: https://projects.osmocom.org/projects/osmo-bsc Standards-Version: 3.9.8 Vcs-Browser: https://gitea.osmocom.org/cellular-infrastructure/osmo-bsc Vcs-Git: https://gitea.osmocom.org/cellular-infrastructure/osmo-bsc -Build-Depends: debhelper (>= 10), dh-autoreconf, autotools-dev, autoconf, automake, libtool, pkg-config, python3-minimal, libcdk5-dev, libtalloc-dev, libosmocore-dev (>= 1.11.0), libosmo-sigtran-dev (>= 2.1.0), libosmo-abis-dev (>= 2.0.0), libosmo-netif-dev (>= 1.6.0), libosmo-mgcp-client-dev (>= 1.14.0), osmo-gsm-manuals-dev (>= 1.6.0) +Build-Depends: debhelper (>= 10), dh-autoreconf, autotools-dev, autoconf, automake, libtool, pkg-config, python3-minimal, libcdk5-dev, libtalloc-dev, libosmocore-dev (>= 1.12.0), libosmo-sigtran-dev (>= 2.2.0), libosmo-abis-dev (>= 2.1.0), libosmo-netif-dev (>= 1.7.0), libosmo-mgcp-client-dev (>= 1.15.0), osmo-gsm-manuals-dev (>= 1.7.0) Package-List: abisip-find deb net extra arch=any osmo-bsc deb net extra arch=any @@ -18,8 +18,8 @@ osmo-bsc-ipaccess-utils deb net extra arch=any osmo-bsc-meas-utils deb net extra arch=any Checksums-Sha1: - 40148a1f47b1edd8e8d943842819e99eb29afb16 631060 osmo-bsc_1.13.3.tar.xz + d17075238df31c70e2ec4235b919c063a00f80c5 634152 osmo-bsc_1.14.0.tar.xz Checksums-Sha256: - 41fba921c07e7c472cc8836c59f6e96cedaa56705d2017cea8319529dfb338fc 631060 osmo-bsc_1.13.3.tar.xz + 49026c80f4ca068bb1cb0d442ef8d8d9f8d4d6ada06dc815981946489870c97b 634152 osmo-bsc_1.14.0.tar.xz Files: - 287d1f1f304cd075255ab4ffd1b675db 631060 osmo-bsc_1.13.3.tar.xz + 5d7313bfb6c639596a329889f100c67b 634152 osmo-bsc_1.14.0.tar.xz
View file
osmo-bsc_1.13.3.tar.xz/.tarball-version -> osmo-bsc_1.14.0.tar.xz/.tarball-version
Changed
@@ -1 +1 @@ -1.13.3 +1.14.0
View file
osmo-bsc_1.13.3.tar.xz/configure.ac -> osmo-bsc_1.14.0.tar.xz/configure.ac
Changed
@@ -61,14 +61,14 @@ AC_SUBST(osmo_ac_meas_vis) dnl checks for libraries -PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.11.0) -PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 1.11.0) -PKG_CHECK_MODULES(LIBOSMOCTRL, libosmoctrl >= 1.11.0) -PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 1.11.0) -PKG_CHECK_MODULES(LIBOSMOABIS, libosmoabis >= 2.0.0) -PKG_CHECK_MODULES(LIBOSMONETIF, libosmo-netif >= 1.6.0) -PKG_CHECK_MODULES(LIBOSMOSIGTRAN, libosmo-sigtran >= 2.1.0) -PKG_CHECK_MODULES(LIBOSMOMGCPCLIENT, libosmo-mgcp-client >= 1.14.0) +PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.12.0) +PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 1.12.0) +PKG_CHECK_MODULES(LIBOSMOCTRL, libosmoctrl >= 1.12.0) +PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 1.12.0) +PKG_CHECK_MODULES(LIBOSMOABIS, libosmoabis >= 2.1.0) +PKG_CHECK_MODULES(LIBOSMONETIF, libosmo-netif >= 1.7.0) +PKG_CHECK_MODULES(LIBOSMOSIGTRAN, libosmo-sigtran >= 2.2.0) +PKG_CHECK_MODULES(LIBOSMOMGCPCLIENT, libosmo-mgcp-client >= 1.15.0) dnl checks for header files AC_HEADER_STDC
View file
osmo-bsc_1.13.3.tar.xz/debian/changelog -> osmo-bsc_1.14.0.tar.xz/debian/changelog
Changed
@@ -1,24 +1,56 @@ -osmo-bsc (1.13.3) unstable; urgency=medium +osmo-bsc (1.14.0) unstable; urgency=medium - * Don't crash on loc req with disabled SMLC - - -- Oliver Smith <osmith@sysmocom.de> Fri, 31 Oct 2025 13:42:24 +0100 - -osmo-bsc (1.13.2) unstable; urgency=medium - - Keith Whyte - * Fix missing LAC/CI hashtable update upon CTRL SET + csaba.sipos + * nokia_site: Add object_identity, object_state and object_identity_state attributes + * nokia_site: add function to unlock and reset TRXes Pau Espin Pedrol + * Drop use of deprecated vty is_config_node() cb + * nokia: Fix uninitialized access + * vty: Improve cmd 'cell barred' description + * cosmetic: Improve documentation with spec references about several parameters + * cosmetic: Update 3GPP spec reference + * meas_feed: Increase default txqueue len to 1024 + * bsc: Make sure MSC PC is added to sccp-addressbook + * sigtran: Log N-PCSTATE.ind PC with configured format + * sigtran: Avoid potential uninitialized ptr dereference + * Introduce LOG_MSC log macro + * sccp: Handle N-NOTICE.ind (Routing Failure of SCCP CL messages) + * sigtran: Compare sccp_addr using osmo_sccp_addr_ri_cmp() * Fix wrong list entry derreference during bts_depend_find_entry() + * sccplite: Avoid msgb_free() during ss7 rx_unknown_cb() + * Replace ipa_prepend_header() with osmo_ipa_msg_push_header(s)() + * sccplite: Handle MGCP/CTRL over SCCPLite multiplex using MTP-TRANSFER.req/ind + * sccplite: rx mgcp: Make sure payload string is null-terminated + * sigtran: Fix potential null ptr derreference + + Mychaela N. Falconia + * E1 BTS: direct MGW to 8k subslots for TCH/H + * TW-TS-* support: pass RTP extensions to MGW - -- Pau Espin Pedrol <pespin@sysmocom.de> Tue, 02 Sep 2025 15:54:44 +0200 + Vadim Yanitskiy + * bts_vty: drop NL in 'ncc-permitted' commands -osmo-bsc (1.13.1) unstable; urgency=medium + Michael Iedema + * meas_json: add command line option to specify binding ip + Oliver Smith * Fix building for debian 13 armv7l + * Don't crash on loc req with disabled SMLC + + Keith Whyte + * Fix missing LAC/CI hashtable update upon CTRL SET + + Matan Perelman + * handover: Move log macros to handover_fsm.h + * handover_decision_2: Drop unused include + * handover_decision: Check for connection prerequisites + + Andreas Eversberg + * Add ER-GSM band support + * ASCI: Fix removal of call notification when lchan fails - -- Oliver Smith <osmith@sysmocom.de> Tue, 26 Aug 2025 16:39:28 +0200 + -- Pau Espin Pedrol <pespin@sysmocom.de> Wed, 03 Dec 2025 19:32:45 +0100 osmo-bsc (1.13.0) unstable; urgency=medium
View file
osmo-bsc_1.13.3.tar.xz/debian/control -> osmo-bsc_1.14.0.tar.xz/debian/control
Changed
@@ -12,12 +12,12 @@ python3-minimal, libcdk5-dev, libtalloc-dev, - libosmocore-dev (>= 1.11.0), - libosmo-sigtran-dev (>= 2.1.0), - libosmo-abis-dev (>= 2.0.0), - libosmo-netif-dev (>= 1.6.0), - libosmo-mgcp-client-dev (>= 1.14.0), - osmo-gsm-manuals-dev (>= 1.6.0) + libosmocore-dev (>= 1.12.0), + libosmo-sigtran-dev (>= 2.2.0), + libosmo-abis-dev (>= 2.1.0), + libosmo-netif-dev (>= 1.7.0), + libosmo-mgcp-client-dev (>= 1.15.0), + osmo-gsm-manuals-dev (>= 1.7.0) Standards-Version: 3.9.8 Vcs-Git: https://gitea.osmocom.org/cellular-infrastructure/osmo-bsc Vcs-Browser: https://gitea.osmocom.org/cellular-infrastructure/osmo-bsc
View file
osmo-bsc_1.13.3.tar.xz/include/osmocom/bsc/bsc_msc_data.h -> osmo-bsc_1.14.0.tar.xz/include/osmocom/bsc/bsc_msc_data.h
Changed
@@ -175,6 +175,7 @@ bool cs7_instance_valid; struct osmo_sccp_instance *sccp; struct osmo_sccp_user *sccp_user; + struct osmo_ss7_user *mtp_user; /* IPA or M3UA or SUA? */ enum osmo_ss7_asp_protocol asp_proto; @@ -272,4 +273,10 @@ } } +#define LOG_MSC_CAT(msc, subsys, level, fmt, args...) \ + LOGP(subsys, level, "(msc=%d) " fmt, (msc)->nr, ## args) +#define LOG_MSC(msc, level, fmt, args...) \ + LOG_MSC_CAT(msc, DMSC, level, fmt, ## args) + + #endif
View file
osmo-bsc_1.13.3.tar.xz/include/osmocom/bsc/gsm_data.h -> osmo-bsc_1.14.0.tar.xz/include/osmocom/bsc/gsm_data.h
Changed
@@ -472,6 +472,8 @@ struct gsm_subscriber_connection *call; /* Cell (BTS) FSM */ struct osmo_fsm_inst *fi; + /* BTS to notify about ongoing call */ + struct gsm_bts *notify_bts; /* lchan to be assigned */ struct gsm_lchan *new_lchan; /* MGW peer */
View file
osmo-bsc_1.13.3.tar.xz/include/osmocom/bsc/handover_fsm.h -> osmo-bsc_1.14.0.tar.xz/include/osmocom/bsc/handover_fsm.h
Changed
@@ -4,6 +4,51 @@ #include <osmocom/bsc/debug.h> #include <osmocom/bsc/handover.h> +#define LOGPHOBTS(bts, level, fmt, args...) \ + LOGP(DHODEC, level, "(BTS %u) " fmt, bts->nr, ## args) + +#define LOGPHOLCHAN(lchan, level, fmt, args...) \ + LOGP(DHODEC, level, "(lchan %u.%u%u%u %s %s) (subscr %s) " fmt, \ + lchan->ts->trx->bts->nr, \ + lchan->ts->trx->nr, \ + lchan->ts->nr, \ + lchan->nr, \ + gsm_chan_t_name(lchan->type), \ + gsm48_chan_mode_name(lchan->current_ch_mode_rate.chan_mode), \ + bsc_subscr_name(lchan->conn ? lchan->conn->bsub : NULL), \ + ## args) + +#define LOGPHOLCHANTOBTS(lchan, new_bts, level, fmt, args...) \ + LOGP(DHODEC, level, "(lchan %u.%u%u%u %s %s)->(BTS %u) (subscr %s) " fmt, \ + lchan->ts->trx->bts->nr, \ + lchan->ts->trx->nr, \ + lchan->ts->nr, \ + lchan->nr, \ + gsm_chan_t_name(lchan->type), \ + gsm48_chan_mode_name(lchan->current_ch_mode_rate.chan_mode), \ + new_bts->nr, \ + bsc_subscr_name(lchan->conn ? lchan->conn->bsub : NULL), \ + ## args) + +#define LOGPHOLCHANTOREMOTE(lchan, remote_cil, level, fmt, args...) \ + LOGP(DHODEC, level, "(lchan %u.%u%u%u %s %s)->(remote-BSS %s) (subscr %s) " fmt, \ + lchan->ts->trx->bts->nr, \ + lchan->ts->trx->nr, \ + lchan->ts->nr, \ + lchan->nr, \ + gsm_chan_t_name(lchan->type), \ + gsm48_chan_mode_name(lchan->current_ch_mode_rate.chan_mode), \ + gsm0808_cell_id_list_name(remote_cil), \ + bsc_subscr_name(lchan->conn ? lchan->conn->bsub : NULL), \ + ## args) + +#define LOGPHOCAND(candidate, level, fmt, args...) do {\ + if ((candidate)->target.bts) \ + LOGPHOLCHANTOBTS((candidate)->current.lchan, (candidate)->target.bts, level, fmt, ## args); \ + else if ((candidate)->target.cell_ids.id_list_len) \ + LOGPHOLCHANTOREMOTE((candidate)->current.lchan, &(candidate)->target.cell_ids, level, fmt, ## args); \ + } while (0) + /* Terminology: * Intra-Cell: stays within one BTS, this should actually be an Assignment. * Intra-BSC: stays within one BSC, but moves between BTSes.
View file
osmo-bsc_1.13.3.tar.xz/include/osmocom/bsc/meas_feed.h -> osmo-bsc_1.14.0.tar.xz/include/osmocom/bsc/meas_feed.h
Changed
@@ -35,7 +35,7 @@ }; #define MEAS_FEED_VERSION 1 -#define MEAS_FEED_TXQUEUE_MAX_LEN_DEFAULT 100 +#define MEAS_FEED_TXQUEUE_MAX_LEN_DEFAULT 1024 int meas_feed_cfg_set(const char *dst_host, uint16_t dst_port); void meas_feed_scenario_set(const char *name);
View file
osmo-bsc_1.13.3.tar.xz/include/osmocom/bsc/osmo_bsc_sigtran.h -> osmo-bsc_1.14.0.tar.xz/include/osmocom/bsc/osmo_bsc_sigtran.h
Changed
@@ -45,10 +45,10 @@ void osmo_bsc_sigtran_tx_reset_ack(const struct bsc_msc_data *msc); /* receive + process a CTRL command from the piggy-back on the IPA/SCCPlite link */ -int bsc_sccplite_rx_ctrl(struct osmo_ss7_asp *asp, struct msgb *msg); +int bsc_sccplite_rx_ctrl(struct bsc_msc_data *msc, struct msgb *msg); /* receive + process a MGCP message from the piggy-back on the IPA/SCCPlite link */ -int bsc_sccplite_rx_mgcp(struct osmo_ss7_asp *asp, struct msgb *msg); +int bsc_sccplite_rx_mgcp(struct bsc_msc_data *msc, struct msgb *msg); /* send a message via SCCPLite to given MSC */ int bsc_sccplite_msc_send(struct bsc_msc_data *msc, struct msgb *msg);
View file
osmo-bsc_1.13.3.tar.xz/src/ipaccess/ipaccess-config-e1-driver.c -> osmo-bsc_1.14.0.tar.xz/src/ipaccess/ipaccess-config-e1-driver.c
Changed
@@ -179,8 +179,8 @@ return -EINVAL; } - msg->l2h = msg->data; - ipa_prepend_header(msg, sign_link->tei); + /* msg->l2h is set here: */ + osmo_ipa_msg_push_header(msg, sign_link->tei); LOGPITS(e1i_ts, DLMI, LOGL_DEBUG, "TX: %s\n", osmo_hexdump(msg->l2h, msgb_l2len(msg))); osmo_stream_cli_send(cli, msg); @@ -213,7 +213,7 @@ if (!nmsg2) return NULL; msgb_v_put(nmsg2, IPAC_MSGT_ID_ACK); - ipa_prepend_header(nmsg2, IPAC_PROTO_IPACCESS); + osmo_ipa_msg_push_header(nmsg2, IPAC_PROTO_IPACCESS); return nmsg2; }
View file
osmo-bsc_1.13.3.tar.xz/src/osmo-bsc/a_reset.c -> osmo-bsc_1.14.0.tar.xz/src/osmo-bsc/a_reset.c
Changed
@@ -42,7 +42,7 @@ static void a_reset_link_up(void *data) { struct bsc_msc_data *msc = data; - LOGP(DMSC, LOGL_NOTICE, "(msc%d) BSSMAP association is up\n", msc->nr); + LOG_MSC(msc, LOGL_NOTICE, "BSSMAP association is up\n"); osmo_stat_item_inc(osmo_stat_item_group_get_item(msc->msc_statg, MSC_STAT_MSC_LINKS_ACTIVE), 1); osmo_stat_item_inc(osmo_stat_item_group_get_item(msc->network->bsc_statg, BSC_STAT_NUM_MSC_CONNECTED), 1); osmo_signal_dispatch(SS_MSC, S_MSC_CONNECTED, msc); @@ -51,7 +51,7 @@ static void a_reset_link_lost(void *data) { struct bsc_msc_data *msc = data; - LOGP(DMSC, LOGL_NOTICE, "(msc%d) BSSMAP association is down\n", msc->nr); + LOG_MSC(msc, LOGL_NOTICE, "BSSMAP association is down\n"); osmo_stat_item_dec(osmo_stat_item_group_get_item(msc->msc_statg, MSC_STAT_MSC_LINKS_ACTIVE), 1); osmo_stat_item_dec(osmo_stat_item_group_get_item(msc->network->bsc_statg, BSC_STAT_NUM_MSC_CONNECTED), 1); osmo_signal_dispatch(SS_MSC, S_MSC_LOST, msc); @@ -74,7 +74,7 @@ /* There must not be any double allocation! */ if (msc->a.bssmap_reset) { - LOGP(DMSC, LOGL_ERROR, "(msc%d) will not allocate a second reset FSM for this MSC\n", msc->nr); + LOG_MSC(msc, LOGL_ERROR, "will not allocate a second reset FSM for this MSC\n"); return; }
View file
osmo-bsc_1.13.3.tar.xz/src/osmo-bsc/assignment_fsm.c -> osmo-bsc_1.14.0.tar.xz/src/osmo-bsc/assignment_fsm.c
Changed
@@ -541,6 +541,11 @@ * This function checks whether or not we can fulfill that request * based on BTS capabilities, and sets the bitmask of accepted extensions * that will be passed on to the BTS via Abis RSL. + * + * Note that specific BTS features are needed only for IP-based BTS; + * for E1 BTS no special support is needed from the BTS itself in order + * to enable these RTP extensions, as they are implemented entirely + * in the BSC-controlled MGW in this case. */ static void handle_rtp_extensions(struct gsm_subscriber_connection *conn, struct gsm_bts *bts) @@ -550,11 +555,11 @@ uint8_t accepted_ext = 0; if ((requested_ext & OSMO_RTP_EXT_TWTS001) && - osmo_bts_has_feature(&bts->features, BTS_FEAT_TWTS001)) + (osmo_bts_has_feature(&bts->features, BTS_FEAT_TWTS001) || is_e1_bts(bts))) accepted_ext |= OSMO_RTP_EXT_TWTS001; if ((requested_ext & OSMO_RTP_EXT_TWTS002) && - osmo_bts_has_feature(&bts->features, BTS_FEAT_TWTS002)) + (osmo_bts_has_feature(&bts->features, BTS_FEAT_TWTS002) || is_e1_bts(bts))) accepted_ext |= OSMO_RTP_EXT_TWTS002; conn->user_plane.rtp_extensions = accepted_ext;
View file
osmo-bsc_1.13.3.tar.xz/src/osmo-bsc/bsc_ctrl.c -> osmo-bsc_1.14.0.tar.xz/src/osmo-bsc/bsc_ctrl.c
Changed
@@ -32,6 +32,10 @@ #include <osmocom/vty/misc.h> #include <osmocom/gsm/gsm48.h> + +#include <osmocom/sigtran/protocol/mtp.h> +#include <osmocom/sigtran/mtp_sap.h> + #include <osmocom/bsc/ipaccess.h> #include <osmocom/bsc/gsm_data.h> #include <osmocom/bsc/abis_nm.h> @@ -628,71 +632,40 @@ return 0; } -/* Obtain SS7 application server currently handling given MSC (DPC) */ -static struct osmo_ss7_as *msc_get_ss7_as(struct bsc_msc_data *msc) -{ - struct osmo_ss7_route *rt; - struct osmo_ss7_as *as; - struct osmo_ss7_instance *ss7 = osmo_sccp_get_ss7(msc->a.sccp); - rt = osmo_ss7_route_lookup(ss7, msc->a.msc_addr.pc); - if (!rt) - return NULL; - as = osmo_ss7_route_get_dest_as(rt); - if (!as) - return NULL; - return as; -} - int bsc_sccplite_msc_send(struct bsc_msc_data *msc, struct msgb *msg) { - struct osmo_ss7_as *as; - struct osmo_ss7_asp *asp; - - as = msc_get_ss7_as(msc); - if (!as) { - msgb_free(msg); - return -1; - } + struct osmo_ss7_instance *ss7 = osmo_sccp_get_ss7(msc->a.sccp); + struct osmo_mtp_prim *omp; + struct osmo_mtp_transfer_param *param; - /* don't attempt to send CTRL on a non-SCCPlite AS */ - if (osmo_ss7_as_get_asp_protocol(as) != OSMO_SS7_ASP_PROT_IPA) { - msgb_free(msg); - return 0; - } + /* Wrap into MTP-TRANSFER.req primitive */ + omp = osmo_mtp_prim_xfer_req_prepend(NULL, msg); + OSMO_ASSERT(omp); + param = &omp->u.transfer; + param->opc = osmo_ss7_instance_get_primary_pc(ss7); + param->dpc = msc->a.msc_addr.pc; + param->sls = 0; + param->sio = MTP_SIO(MTP_SI_NI11_OSMO_IPA, osmo_ss7_instance_get_network_indicator(ss7)); - asp = osmo_ss7_as_select_asp(as); - if (!asp) { - LOGP(DCTRL, LOGL_NOTICE, "No ASP found for AS, dropping message\n"); - msgb_free(msg); - return -1; - } - return osmo_ss7_asp_send(asp, msg); + /* 3) send via MTP Transfer SAP (osmo_ss7_instance) */ + return osmo_ss7_user_mtp_sap_prim_down(msc->a.mtp_user, omp); } /* Encode a CTRL command and send it to the given ASP - * \paramin asp ASP through which we shall send the encoded message + * \paramin msc MSC through which we shall send the encoded message * \paramin cmd decoded CTRL command to be encoded and sent. Ownership is *NOT* * transferred, to permit caller to send the same CMD to several ASPs. * Caller must hence free 'cmd' itself. * \returns 0 on success; negative on error */ -static int sccplite_asp_ctrl_cmd_send(struct osmo_ss7_asp *asp, struct ctrl_cmd *cmd) +static int bsc_sccplite_msc_ctrl_cmd_send(struct bsc_msc_data *msc, struct ctrl_cmd *cmd) { /* this is basically like libosmoctrl:ctrl_cmd_send(), not for a dedicated * CTRL connection but for the CTRL piggy-back on the IPA/SCCPlite link */ - struct msgb *msg; - - /* don't attempt to send CTRL on a non-SCCPlite ASP */ - if (osmo_ss7_asp_get_proto(asp) != OSMO_SS7_ASP_PROT_IPA) - return 0; - - msg = ctrl_cmd_make(cmd); + struct msgb *msg = ctrl_cmd_make(cmd); if (!msg) return -1; - - ipa_prepend_header_ext(msg, IPAC_PROTO_EXT_CTRL); - ipa_prepend_header(msg, IPAC_PROTO_OSMO); - - return osmo_ss7_asp_send(asp, msg); + osmo_ipa_msg_push_headers(msg, IPAC_PROTO_OSMO, IPAC_PROTO_EXT_CTRL); + return bsc_sccplite_msc_send(msc, msg); } /* Ownership of 'cmd' is *NOT* transferred, to permit caller to send the same CMD to several ASPs. @@ -705,15 +678,13 @@ if (!msg) return -1; - ipa_prepend_header_ext(msg, IPAC_PROTO_EXT_CTRL); - ipa_prepend_header(msg, IPAC_PROTO_OSMO); - + osmo_ipa_msg_push_headers(msg, IPAC_PROTO_OSMO, IPAC_PROTO_EXT_CTRL); return bsc_sccplite_msc_send(msc, msg); } /* receive + process a CTRL command from the piggy-back on the IPA/SCCPlite link. - * Transfers msg ownership. */ -int bsc_sccplite_rx_ctrl(struct osmo_ss7_asp *asp, struct msgb *msg) + * msg is owned by the caller. */ +int bsc_sccplite_rx_ctrl(struct bsc_msc_data *msc, struct msgb *msg) { struct ctrl_cmd *cmd; bool parse_failed; @@ -723,9 +694,8 @@ OSMO_ASSERT(msg->l2h); /* prase raw (ASCII) CTRL command into ctrl_cmd */ - cmd = ctrl_cmd_parse3(asp, msg, &parse_failed); + cmd = ctrl_cmd_parse3(msc, msg, &parse_failed); OSMO_ASSERT(cmd); - msgb_free(msg); if (cmd->type == CTRL_TYPE_ERROR && parse_failed) goto send_reply; @@ -733,7 +703,7 @@ ctrl_cmd_handle(bsc_gsmnet->ctrl, cmd, bsc_gsmnet); send_reply: - rc = sccplite_asp_ctrl_cmd_send(asp, cmd); + rc = bsc_sccplite_msc_ctrl_cmd_send(msc, cmd); talloc_free(cmd); return rc; }
View file
osmo-bsc_1.13.3.tar.xz/src/osmo-bsc/bsc_subscr_conn_fsm.c -> osmo-bsc_1.14.0.tar.xz/src/osmo-bsc/bsc_subscr_conn_fsm.c
Changed
@@ -746,15 +746,20 @@ /* use dynamic RTPBRIDGE endpoint allocation in MGW */ epname = mgcp_client_rtpbridge_wildcard(mgcp_client); else { - uint8_t i460_bit_offs; + uint8_t i460_bit_offs, i460_rate = 16; if (for_lchan->ts->e1_link.e1_ts_ss == E1_SUBSLOT_FULL) i460_bit_offs = 0; else i460_bit_offs = for_lchan->ts->e1_link.e1_ts_ss * 2; + if (for_lchan->type == GSM_LCHAN_TCH_H) { + i460_rate = 8; + i460_bit_offs += for_lchan->nr; + } + epname = mgcp_client_e1_epname(conn, mgcp_client, for_lchan->ts->e1_link.e1_nr, - for_lchan->ts->e1_link.e1_ts, 16, - i460_bit_offs); + for_lchan->ts->e1_link.e1_ts, + i460_rate, i460_bit_offs); } conn->user_plane.mgw_endpoint =
View file
osmo-bsc_1.13.3.tar.xz/src/osmo-bsc/bsc_vty.c -> osmo-bsc_1.14.0.tar.xz/src/osmo-bsc/bsc_vty.c
Changed
@@ -1189,8 +1189,8 @@ #define NRI_ARGS_TO_STR_FMT "%s%s%s" #define NRI_ARGS_TO_STR_ARGS(ARGC, ARGV) ARGV0, (ARGC>1)? ".." : "", (ARGC>1)? ARGV1 : "" #define NRI_WARN(MSC, FORMAT, args...) do { \ - vty_out(vty, "%% Warning: msc %d: " FORMAT "%s", MSC->nr, ##args, VTY_NEWLINE); \ - LOGP(DMSC, LOGL_ERROR, "msc %d: " FORMAT "\n", MSC->nr, ##args); \ + vty_out(vty, "%% Warning: msc %d: " FORMAT "%s", (MSC)->nr, ##args, VTY_NEWLINE); \ + LOG_MSC(MSC, LOGL_ERROR, FORMAT "\n", ##args); \ } while (0) DEFUN_ATTR(cfg_net_nri_bitlen, @@ -2946,7 +2946,8 @@ /* Make sure only standard SSN numbers are used. If no ssn number is * configured, silently apply the default SSN */ -static void enforce_standard_ssn(struct vty *vty, struct osmo_sccp_addr *addr) +static void enforce_standard_ssn(struct vty *vty, struct osmo_ss7_instance *ss7, + const char *addr_name, struct osmo_sccp_addr *addr) { if (addr->presence & OSMO_SCCP_ADDR_T_SSN) { if (addr->ssn != OSMO_SCCP_SSN_BSSAP) @@ -2957,6 +2958,7 @@ addr->presence |= OSMO_SCCP_ADDR_T_SSN; addr->ssn = OSMO_SCCP_SSN_BSSAP; + osmo_sccp_addr_update(ss7, addr_name, addr); } DEFUN(cfg_msc_cs7_bsc_addr, @@ -2988,8 +2990,8 @@ msc->a.cs7_instance = ss7_id; msc->a.cs7_instance_valid = true; - enforce_standard_ssn(vty, &msc->a.bsc_addr); msc->a.bsc_addr_name = talloc_strdup(msc, bsc_addr_name); + enforce_standard_ssn(vty, ss7, bsc_addr_name, &msc->a.bsc_addr); return CMD_SUCCESS; } @@ -3022,8 +3024,8 @@ msc->a.cs7_instance = ss7_id; msc->a.cs7_instance_valid = true; - enforce_standard_ssn(vty, &msc->a.msc_addr); msc->a.msc_addr_name = talloc_strdup(msc, msc_addr_name); + enforce_standard_ssn(vty, ss7, msc_addr_name, &msc->a.msc_addr); return CMD_SUCCESS; } @@ -3611,7 +3613,7 @@ return CMD_WARNING; } - LOGP(DMSC, LOGL_NOTICE, "(msc%d) VTY requests BSSMAP RESET\n", msc_nr); + LOG_MSC(msc, LOGL_NOTICE, "VTY requests BSSMAP RESET\n"); bssmap_reset_resend_reset(msc->a.bssmap_reset); return CMD_SUCCESS; }
View file
osmo-bsc_1.13.3.tar.xz/src/osmo-bsc/bts.c -> osmo-bsc_1.14.0.tar.xz/src/osmo-bsc/bts.c
Changed
@@ -525,9 +525,9 @@ } break; case GSM_BAND_900: - if ((bts->c0->arfcn > 124 && bts->c0->arfcn < 955) || + if ((bts->c0->arfcn > 124 && bts->c0->arfcn < 940) || bts->c0->arfcn > 1023) { - LOGP(DNM, LOGL_ERROR, "(bts=%u) GSM900 channel (%u) must be between 0-124, 955-1023.\n", + LOGP(DNM, LOGL_ERROR, "(bts=%u) GSM900 channel (%u) must be between 0-124, 940-1023.\n", bts->nr, bts->c0->arfcn); return -EINVAL; }
View file
osmo-bsc_1.13.3.tar.xz/src/osmo-bsc/bts_nokia_site.c -> osmo-bsc_1.14.0.tar.xz/src/osmo-bsc/bts_nokia_site.c
Changed
@@ -613,6 +613,42 @@ return get_value_string(nokia_reset_type, reset_type); } +static const struct value_string nokia_object_identity = { + { 0x01, "BCF" }, /* Base Control Function */ + { 0x02, "OMU" }, /* Operation and Maintenance Unit */ + { 0x04, "TRX" }, /* Transceiver (FU + CU) */ + { 0x05, "BTS" }, /* Base Transceiver Station (1..248) */ + { 0x07, "FU" }, /* Frame Unit */ + { 0x08, "CU" }, /* Carrier Unit */ + { 0x10, "TRE" }, /* Transmission Equipment (0..15) */ + { 0x11, "TRU" }, /* Transmission Unit */ + { 0x13, "RTSL" }, /* Radio Timeslot of a FU (0..7) */ + { 0x14, "DMR" }, /* Digital Microwave Radio Link */ + { 0x15, "CF" }, /* Conversion Function */ + { 0x64, "RTC" }, /* Remote Tune Combiner */ + { 0, NULL } +}; + +static const char *get_object_identity_string(uint16_t object_identity) +{ + return get_value_string(nokia_object_identity, object_identity); +} + +static const struct value_string nokia_object_state = { + { 0x0, "Enabled" }, + { 0x1, "Disabled" }, + { 0x2, "Locked" }, + { 0x3, "Unlocked" }, + { 0x4, "Shutdown" }, /* reserved for BTS MMI use */ + { 0x5, "Powersave" }, /* reserved for BTS MMI use */ + { 0, NULL } +}; + +static const char *get_object_state_string(uint8_t object_state) +{ + return get_value_string(nokia_object_state, object_state); +} + /* TODO: put in a separate file ? */ /* some message IDs */ @@ -628,6 +664,7 @@ #define NOKIA_MSG_BLOCK_CTRL_REQ 168 #define NOKIA_MSG_STATE_CHANGED 172 #define NOKIA_MSG_ALARM 174 +#define NOKIA_MSG_CHA_ADM_STATE 175 /* some element IDs */ @@ -637,6 +674,9 @@ #define NOKIA_EI_SEVERITY 0x4B #define NOKIA_EI_ALARM_DETAIL 0x94 #define NOKIA_EI_RESET_TYPE 0x18 +#define NOKIA_EI_OBJ_ID 0x40 +#define NOKIA_EI_OBJ_STATE 0x44 +#define NOKIA_EI_OBJ_ID_STATE 0x65 #define OM_ALLOC_SIZE 1024 #define OM_HEADROOM_SIZE 128 @@ -740,7 +780,7 @@ /* ID = 0x44 (Object current state) */ /* length = 1 */ /* 93 */ - 0x03, + 0x02, 0x7F, 0x7C, 0x0A, /* ID = 0x7C (FU BSIC) ## constructed ## */ @@ -1301,6 +1341,55 @@ return abis_nm_send(bts, NOKIA_MSG_RESET_REQ, ref, data, len_data); } +static uint8_t trx_unlock = { + 0x7F, 0x65, 0x0B, + /* ID = 0x65 (Obj. identity and obj. state) ## constructed ## */ + /* length = 11 */ + /* 83 */ + + 0x5F, 0x40, 0x04, + /* ID = 0x40 (Object identity) */ + /* length = 4 */ + /* 86 */ + 0x00, 0x04, 0x01, 0xFF, + + 0x5F, 0x44, 0x01, + /* ID = 0x44 (Object current state) */ + /* length = 1 */ + /* 93 */ + 0x03, +}; + +static int abis_nm_cha_adm_trx_unlock(struct gsm_bts *bts, uint8_t trx_id, uint16_t ref) +{ + /* BTS_CHA_ADM_STATE */ + /* object_identity = TRX; object_state = locked/unlocked */ + uint8_t *data = trx_unlock; + data8 = trx_id; + int len_data = sizeof(trx_unlock); + LOG_BTS(bts, DNM, LOGL_INFO, "TRX=%d Admin state change: UNLOCKED\n", trx_id); + dump_elements(data, len_data); + return abis_nm_send(bts, NOKIA_MSG_CHA_ADM_STATE, ref, data, len_data); +} + +static uint8_t trx_reset = { + 0x5F, 0x40, 0x04, + /* ID = 0x40 (Object identity) */ + /* length = 4 */ + /* 3 */ + 0x00, 0x04, 0x01, 0xFF, +}; + +static int abis_nm_trx_reset(struct gsm_bts *bts, uint8_t trx_id, uint16_t ref) +{ + uint8_t *data = trx_reset; + data5 = trx_id; + int len_data = sizeof(trx_reset); + LOG_BTS(bts, DNM, LOGL_INFO, "TRX=%d Reset!\n", trx_id); + dump_elements(data, len_data); + return abis_nm_send(bts, NOKIA_MSG_RESET_REQ, ref, data, len_data); +} + /* TODO: put in a separate file ? */ static int abis_nm_send_multi_segments(struct gsm_bts *bts, uint8_t msg_type, @@ -1674,6 +1763,7 @@ has not been tested yet. */ +#define FIND_ELEM(data, data_len, ei, var, len) (find_element(data, data_len, ei, var, len) == len) static int abis_nm_rcvmsg_fom(struct msgb *mb) { struct e1inp_sign_link *sign_link = (struct e1inp_sign_link *)mb->dst; @@ -1687,9 +1777,15 @@ uint8_t ack = 0xFF; uint8_t severity = 0xFF; uint8_t reset_type = 0xFF; - int str_len; + uint8_t object_identity4 = {0}; + uint8_t object_state = 0xFF; + uint8_t object_id_state11 = {0}; + int severity_len = 0; + int ei_add_info_len = 0; + int ei_alarm_detail_len = 0; int len_data; + if (bts->nokia.wait_reset) { LOG_BTS(bts, DNM, LOGL_INFO, "Ignoring message while waiting for reset: %s\n", msgb_hexdump(mb)); return ret; @@ -1708,16 +1804,14 @@ switch (mt) { case NOKIA_MSG_OMU_STARTED: - if (find_element(noh->data, len_data, - NOKIA_EI_BTS_TYPE, &bts->nokia.bts_type, - sizeof(uint8_t)) == sizeof(uint8_t)) { - LOG_BTS(bts, DNM, LOGL_INFO, "Rx BTS type = %d (%s)\n", bts->nokia.bts_type, + if (FIND_ELEM(noh->data, len_data, NOKIA_EI_BTS_TYPE, &bts->nokia.bts_type, sizeof(bts->nokia.bts_type))) { + LOG_BTS(bts, DNM, LOGL_INFO, "Rx BTS type = %d (%s)\n", + bts->nokia.bts_type, get_bts_type_string(bts->nokia.bts_type)); } else { LOG_BTS(bts, DNM, LOGL_ERROR, "BTS type not found in NOKIA_MSG_OMU_STARTED\n"); } - if (find_element(noh->data, len_data, NOKIA_EI_RESET_TYPE, &reset_type, - sizeof(reset_type))) { + if (FIND_ELEM(noh->data, len_data, NOKIA_EI_RESET_TYPE, &reset_type, sizeof(reset_type))) { LOG_BTS(bts, DNM, LOGL_INFO, "Rx BTS reset type = '%s'\n", get_reset_type_string(reset_type)); } else { @@ -1737,9 +1831,7 @@ bts->nokia.configured = 1; break; case NOKIA_MSG_ACK: - if (find_element - (noh->data, len_data, NOKIA_EI_ACK, &ack, - sizeof(uint8_t)) == sizeof(uint8_t)) { + if (FIND_ELEM(noh->data, len_data, NOKIA_EI_ACK, &ack, sizeof(ack))) { LOG_BTS(bts, DNM, LOGL_INFO, "Rx ACK = %u\n", ack); if (ack != 1) { LOG_BTS(bts, DNM, LOGL_ERROR, "Rx No ACK (%u): don't know how to proceed\n", ack); @@ -1778,11 +1870,41 @@ case NOKIA_MSG_STATE_CHANGED: /* send ACK */ abis_nm_ack(bts, ref); + if (!FIND_ELEM(noh->data, len_data, NOKIA_EI_OBJ_ID_STATE, object_id_state, sizeof(object_id_state))) { + LOG_BTS(bts, DNM, LOGL_NOTICE, "Missing NOKIA_EI_OBJ_ID_STATE\n"); + return -EINVAL; + } + LOG_BTS(bts, DNM, LOGL_NOTICE, "State changed: %s=%d, %s\n", + get_object_identity_string(object_id_state4), + object_id_state5, + get_object_state_string(object_id_state10)); break; case NOKIA_MSG_CONF_COMPLETE: /* send ACK */ abis_nm_ack(bts, ref); if (bts->nokia.configured != 0) {
View file
osmo-bsc_1.13.3.tar.xz/src/osmo-bsc/bts_vty.c -> osmo-bsc_1.14.0.tar.xz/src/osmo-bsc/bts_vty.c
Changed
@@ -1198,10 +1198,10 @@ cfg_bts_cell_barred_cmd, X(BSC_VTY_ATTR_RESTART_ABIS_RSL_LINK), "cell barred (0|1)", - "Should this cell be barred from access?\n" - "Should this cell be barred from access?\n" - "Cell should NOT be barred\n" - "Cell should be barred\n") + "Should this cell be barred from access? (CELL_BAR_ACCESS)\n" + "Should this cell be barred from access? (CELL_BAR_ACCESS)\n" + "The cell is not barred, see 3GPP TS 23.022\n" + "The cell is barred, see 3GPP TS 23.022\n") { struct gsm_bts *bts = vty->index; @@ -1302,6 +1302,7 @@ return CMD_SUCCESS; } +/* MS_TXPWR_MAX_CCH, 3GPP TS 45.008 and 3GPP TS 44.018 */ DEFUN_USRATTR(cfg_bts_ms_max_power, cfg_bts_ms_max_power_cmd, X(BSC_VTY_ATTR_NEW_LCHAN), @@ -1320,6 +1321,7 @@ #define CELL_STR "Cell Parameters\n" +/* CELL_RESELECT_HYSTERESIS, 3GPP TS 45.008 and 3GPP TS 44.018 */ DEFUN_USRATTR(cfg_bts_cell_resel_hyst, cfg_bts_cell_resel_hyst_cmd, X(BSC_VTY_ATTR_RESTART_ABIS_RSL_LINK), @@ -1335,6 +1337,7 @@ return CMD_SUCCESS; } +/* RXLEV_ACCESS_MIN, 3GPP TS 45.008 and 3GPP TS 44.018 */ DEFUN_USRATTR(cfg_bts_rxlev_acc_min, cfg_bts_rxlev_acc_min_cmd, X(BSC_VTY_ATTR_RESTART_ABIS_RSL_LINK), @@ -1351,11 +1354,12 @@ return CMD_SUCCESS; } +/* CELL_BAR_QUALIFY, 3GPP TS 45.008 and 3GPP TS 44.018 */ DEFUN_USRATTR(cfg_bts_cell_bar_qualify, cfg_bts_cell_bar_qualify_cmd, X(BSC_VTY_ATTR_RESTART_ABIS_RSL_LINK), "cell bar qualify (0|1)", - CELL_STR "Cell Bar Qualify\n" "Cell Bar Qualify\n" + CELL_STR "Cell Bar Qualify (CELL_BAR_QUALIFY)\n" "Cell Bar Qualify (CELL_BAR_QUALIFY)\n" "Set CBQ to 0\n" "Set CBQ to 1\n") { struct gsm_bts *bts = vty->index; @@ -1366,6 +1370,7 @@ return CMD_SUCCESS; } +/* CELL_RESELECT_OFFSET, 3GPP TS 45.008 and 3GPP TS 44.018 */ DEFUN_USRATTR(cfg_bts_cell_resel_ofs, cfg_bts_cell_resel_ofs_cmd, X(BSC_VTY_ATTR_RESTART_ABIS_RSL_LINK), @@ -1382,6 +1387,7 @@ return CMD_SUCCESS; } +/* TEMPORARY_OFFSET, 3GPP TS 45.008 and 3GPP TS 44.018 */ DEFUN_USRATTR(cfg_bts_temp_ofs, cfg_bts_temp_ofs_cmd, X(BSC_VTY_ATTR_RESTART_ABIS_RSL_LINK), @@ -1398,6 +1404,7 @@ return CMD_SUCCESS; } +/* TEMPORARY_OFFSET, 3GPP TS 45.008 and 3GPP TS 44.018 */ DEFUN_USRATTR(cfg_bts_temp_ofs_inf, cfg_bts_temp_ofs_inf_cmd, X(BSC_VTY_ATTR_RESTART_ABIS_RSL_LINK), @@ -1414,6 +1421,7 @@ return CMD_SUCCESS; } +/* PENALTY_TIME, 3GPP TS 45.008 and 3GPP TS 44.018 */ DEFUN_USRATTR(cfg_bts_penalty_time, cfg_bts_penalty_time_cmd, X(BSC_VTY_ATTR_RESTART_ABIS_RSL_LINK), @@ -1430,6 +1438,7 @@ return CMD_SUCCESS; } +/* PENALTY_TIME, 3GPP TS 45.008 and 3GPP TS 44.018 */ DEFUN_USRATTR(cfg_bts_penalty_time_rsvd, cfg_bts_penalty_time_rsvd_cmd, X(BSC_VTY_ATTR_RESTART_ABIS_RSL_LINK), @@ -1454,7 +1463,7 @@ DEFUN_USRATTR(cfg_bts_ncc_permitted_all, cfg_bts_ncc_permitted_all_cmd, X(BSC_VTY_ATTR_RESTART_ABIS_RSL_LINK), - "ncc-permitted all\n", + "ncc-permitted all", NCC_PERMITTED_STR "Permit all NCCs (default)\n") { @@ -1467,7 +1476,7 @@ DEFUN_USRATTR(cfg_bts_ncc_permitted, cfg_bts_ncc_permitted_cmd, X(BSC_VTY_ATTR_RESTART_ABIS_RSL_LINK), - "ncc-permitted <1-8> <1-8> <1-8> <1-8> <1-8> <1-8> <1-8>\n", + "ncc-permitted <1-8> <1-8> <1-8> <1-8> <1-8> <1-8> <1-8>", NCC_PERMITTED_STR NCC_STR NCC_STR NCC_STR NCC_STR NCC_STR NCC_STR NCC_STR) {
View file
osmo-bsc_1.13.3.tar.xz/src/osmo-bsc/codec_pref.c -> osmo-bsc_1.14.0.tar.xz/src/osmo-bsc/codec_pref.c
Changed
@@ -475,9 +475,9 @@ llist_for_each_entry(bts, &msc->network->bts_list, list) { gen_bss_supported_codec_list(&scl, msc, bts); if (scl.len <= 0) { - LOGP(DMSC, LOGL_FATAL, - "codec-support/trx config of BTS %u does not intersect with codec-list of MSC %u\n", - bts->nr, msc->nr); + LOG_MSC(msc, LOGL_FATAL, + "codec-support/trx config of BTS %u does not intersect with codec-list of this MSC\n", + bts->nr); rc = -1; } @@ -486,9 +486,9 @@ bts_gsm48_ie = (struct gsm48_multi_rate_conf *)&bts->mr_full.gsm48_ie; rc_rate = calc_amr_rate_intersection(NULL, &msc->amr_conf, bts_gsm48_ie); if (rc_rate < 0) { - LOGP(DMSC, LOGL_FATAL, - "network amr tch-f mode config of BTS %u does not intersect with amr-config of MSC %u\n", - bts->nr, msc->nr); + LOG_MSC(msc, LOGL_FATAL, + "network amr tch-f mode config of BTS %u does not intersect with amr-config of this MSC\n", + bts->nr); rc = -1; } } @@ -498,9 +498,9 @@ bts_gsm48_ie = (struct gsm48_multi_rate_conf *)&bts->mr_half.gsm48_ie; rc_rate = calc_amr_rate_intersection(NULL, &msc->amr_conf, bts_gsm48_ie); if (rc_rate < 0) { - LOGP(DMSC, LOGL_FATAL, - "network amr tch-h mode config of BTS %u does not intersect with amr-config of MSC %u\n", - bts->nr, msc->nr); + LOG_MSC(msc, LOGL_FATAL, + "network amr tch-h mode config of BTS %u does not intersect with amr-config of this MSC\n", + bts->nr); rc = -1; } }
View file
osmo-bsc_1.13.3.tar.xz/src/osmo-bsc/gsm_08_08.c -> osmo-bsc_1.14.0.tar.xz/src/osmo-bsc/gsm_08_08.c
Changed
@@ -275,8 +275,8 @@ return NULL; } - LOGP(DMSC, LOGL_DEBUG, "New subscriber %s: MSC round-robin selects msc %d\n", - osmo_mobile_identity_to_str_c(OTC_SELECT, mi), msc_target->nr); + LOG_MSC(msc_target, LOGL_DEBUG, "round-robin selects this MSC for new subscriber %s\n", + osmo_mobile_identity_to_str_c(OTC_SELECT, mi)); if (is_null_nri) rate_ctr_inc(rate_ctr_group_get_ctr(msc_target->msc_ctrs, MSC_CTR_MSCPOOL_SUBSCR_REATTACH));
View file
osmo-bsc_1.13.3.tar.xz/src/osmo-bsc/handover_decision.c -> osmo-bsc_1.14.0.tar.xz/src/osmo-bsc/handover_decision.c
Changed
@@ -234,6 +234,20 @@ if (mr->num_cell > 0 && mr->num_cell < 7) process_meas_neigh(mr); + /* check for ongoing handover/assignment */ + if (!mr->lchan->conn) { + LOGPHOLCHAN(mr->lchan, LOGL_ERROR, "Skipping, No subscriber connection???\n"); + return; + } + if (mr->lchan->conn->assignment.new_lchan) { + LOGPHOLCHAN(mr->lchan, LOGL_INFO, "Skipping, Initial Assignment is still ongoing\n"); + return; + } + if (mr->lchan->conn->ho.fi) { + LOGPHOLCHAN(mr->lchan, LOGL_INFO, "Skipping, Handover still ongoing\n"); + return; + } + av_rxlev = get_meas_rep_avg(mr->lchan, TDMA_MEAS_FIELD_RXLEV, TDMA_MEAS_DIR_DL, TDMA_MEAS_SET_AUTO, ho_get_hodec1_rxlev_avg_win(bts->ho));
View file
osmo-bsc_1.13.3.tar.xz/src/osmo-bsc/handover_decision_2.c -> osmo-bsc_1.14.0.tar.xz/src/osmo-bsc/handover_decision_2.c
Changed
@@ -31,7 +31,6 @@ #include <osmocom/bsc/gsm_data.h> #include <osmocom/bsc/assignment_fsm.h> #include <osmocom/bsc/handover_fsm.h> -#include <osmocom/bsc/handover_decision.h> #include <osmocom/bsc/handover_decision_2.h> #include <osmocom/bsc/handover_cfg.h> #include <osmocom/bsc/bsc_subscriber.h> @@ -44,51 +43,6 @@ #include <osmocom/bsc/lchan_select.h> #include <osmocom/bsc/chan_counts.h> -#define LOGPHOBTS(bts, level, fmt, args...) \ - LOGP(DHODEC, level, "(BTS %u) " fmt, bts->nr, ## args) - -#define LOGPHOLCHAN(lchan, level, fmt, args...) \ - LOGP(DHODEC, level, "(lchan %u.%u%u%u %s %s) (subscr %s) " fmt, \ - lchan->ts->trx->bts->nr, \ - lchan->ts->trx->nr, \ - lchan->ts->nr, \ - lchan->nr, \ - gsm_chan_t_name(lchan->type), \ - gsm48_chan_mode_name(lchan->current_ch_mode_rate.chan_mode), \ - bsc_subscr_name(lchan->conn? lchan->conn->bsub : NULL), \ - ## args) - -#define LOGPHOLCHANTOBTS(lchan, new_bts, level, fmt, args...) \ - LOGP(DHODEC, level, "(lchan %u.%u%u%u %s %s)->(BTS %u) (subscr %s) " fmt, \ - lchan->ts->trx->bts->nr, \ - lchan->ts->trx->nr, \ - lchan->ts->nr, \ - lchan->nr, \ - gsm_chan_t_name(lchan->type), \ - gsm48_chan_mode_name(lchan->current_ch_mode_rate.chan_mode), \ - new_bts->nr, \ - bsc_subscr_name(lchan->conn? lchan->conn->bsub : NULL), \ - ## args) - -#define LOGPHOLCHANTOREMOTE(lchan, remote_cil, level, fmt, args...) \ - LOGP(DHODEC, level, "(lchan %u.%u%u%u %s %s)->(remote-BSS %s) (subscr %s) " fmt, \ - lchan->ts->trx->bts->nr, \ - lchan->ts->trx->nr, \ - lchan->ts->nr, \ - lchan->nr, \ - gsm_chan_t_name(lchan->type), \ - gsm48_chan_mode_name(lchan->current_ch_mode_rate.chan_mode), \ - gsm0808_cell_id_list_name(remote_cil), \ - bsc_subscr_name(lchan->conn? lchan->conn->bsub : NULL), \ - ## args) - -#define LOGPHOCAND(candidate, level, fmt, args...) do {\ - if ((candidate)->target.bts) \ - LOGPHOLCHANTOBTS((candidate)->current.lchan, (candidate)->target.bts, level, fmt, ## args); \ - else if ((candidate)->target.cell_ids.id_list_len) \ - LOGPHOLCHANTOREMOTE((candidate)->current.lchan, &(candidate)->target.cell_ids, level, fmt, ## args); \ - } while (0) - #define REQUIREMENT_A_TCHF 0x01 #define REQUIREMENT_B_TCHF 0x02
View file
osmo-bsc_1.13.3.tar.xz/src/osmo-bsc/lchan_rtp_fsm.c -> osmo-bsc_1.14.0.tar.xz/src/osmo-bsc/lchan_rtp_fsm.c
Changed
@@ -21,6 +21,7 @@ */ #include <osmocom/core/fsm.h> +#include <osmocom/gsm/rtp_extensions.h> #include <osmocom/netif/rtp.h> #include <osmocom/mgcp_client/mgcp_client_endpoint_fsm.h> @@ -954,6 +955,35 @@ else if (!bss_side && verb_info->codecs0 == CODEC_AMR_8000_1) { verb_info->param.amr_octet_aligned = lchan->conn->sccp.msc->amr_octet_aligned; } + + /* If the CN has requested RTP payload format extensions (change from + * RFC 3551 to TW-TS-001 for FR/EFR, or from RFC 5993 to TW-TS-002 + * for HRv1) via BSSMAP IE of TW-TS-003, we need to pass this request + * to the MGW. With E1 BTS our MGW is the origin of the RTP stream + * and thus the party responsible for payload format choices; with + * IP BTS our MGW is merely a forwarder and thus can get by without + * this detailed knowledge, but it doesn't hurt to inform the MGW + * in all cases. + * + * Note that the following code does not perform conditional checks + * of whether the selected codec is FR/EFR for TW-TS-001 or HRv1 + * for TW-TS-002, but instead checks only the extension mode bits. + * This simplification is allowed by libosmo-mgcp-client API: + * struct mgcp_codec_param has dedicated fields for fr_efr_twts001 + * and hr_twts002 parameters, and the code in libosmo-mgcp-client + * then emits the corresponding a=fmtp lines only when the SDP + * includes those codecs to which these attributes apply. + */ + if (lchan->conn->user_plane.rtp_extensions & OSMO_RTP_EXT_TWTS001) { + verb_info->param_present = true; + verb_info->param.fr_efr_twts001_present = true; + verb_info->param.fr_efr_twts001 = true; + } + if (lchan->conn->user_plane.rtp_extensions & OSMO_RTP_EXT_TWTS002) { + verb_info->param_present = true; + verb_info->param.hr_twts002_present = true; + verb_info->param.hr_twts002 = true; + } } bool mgcp_codec_is_picked(const struct mgcp_conn_peer *verb_info, enum mgcp_codecs codec)
View file
osmo-bsc_1.13.3.tar.xz/src/osmo-bsc/osmo_bsc_bssap.c -> osmo-bsc_1.14.0.tar.xz/src/osmo-bsc/osmo_bsc_bssap.c
Changed
@@ -1,4 +1,4 @@ -/* GSM 08.08 BSSMAP handling */ +/* 3GPP TS 48.008(GSM 08.08) BSSMAP handling */ /* (C) 2009-2012 by Holger Hans Peter Freyther <zecke@selfish.org> * (C) 2009-2012 by On-Waves * (C) 2017 by Harald Welte <laforge@gnumonks.org> @@ -69,21 +69,21 @@ rc = osmo_bssap_tlv_parse(&tp, msg->l4h + 1, length - 1); if (rc < 0) - LOGP(DMSC, LOGL_NOTICE, "Failed parsing TLV looking for Osmux support\n"); + LOG_MSC(msc, LOGL_NOTICE, "Failed parsing TLV looking for Osmux support\n"); msc->remote_supports_osmux = !!TLVP_PRESENT(&tp, GSM0808_IE_OSMO_OSMUX_SUPPORT); if (old_value != msc->remote_supports_osmux) - LOGP(DMSC, LOGL_INFO, "MSC detected AoIP Osmux support changed: %d->%d\n", - old_value, msc->remote_supports_osmux); + LOG_MSC(msc, LOGL_INFO, "MSC detected AoIP Osmux support changed: %d->%d\n", + old_value, msc->remote_supports_osmux); } static int bssmap_handle_reset_ack(struct bsc_msc_data *msc, struct msgb *msg, unsigned int length) { - LOGP(DMSC, LOGL_NOTICE, "RESET ACK from MSC: %s\n", - osmo_sccp_addr_name(osmo_ss7_instance_find(msc->a.cs7_instance), - &msc->a.msc_addr)); + LOG_MSC(msc, LOGL_NOTICE, "RESET ACK from MSC: %s\n", + osmo_sccp_addr_name(osmo_ss7_instance_find(msc->a.cs7_instance), + &msc->a.msc_addr)); /* Inform the FSM that controls the RESET/RESET-ACK procedure * that we have successfully received the reset-ack message */ @@ -98,14 +98,14 @@ static int bssmap_handle_reset(struct bsc_msc_data *msc, struct msgb *msg, unsigned int length) { - LOGP(DMSC, LOGL_NOTICE, "RESET from MSC: %s\n", - osmo_sccp_addr_name(osmo_ss7_instance_find(msc->a.cs7_instance), - &msc->a.msc_addr)); + LOG_MSC(msc, LOGL_NOTICE, "RESET from MSC: %s\n", + osmo_sccp_addr_name(osmo_ss7_instance_find(msc->a.cs7_instance), + &msc->a.msc_addr)); update_msc_osmux_support(msc, msg, length); if (!msc->a.bssmap_reset) { - LOGP(DMSC, LOGL_ERROR, "(msc%d) missing RESET FSM\n", msc->nr); + LOG_MSC(msc, LOGL_ERROR, "(msc%d) missing RESET FSM\n", msc->nr); /* Make sure to shut down all open connections, if any */ osmo_bsc_sigtran_reset(msc); return -1; @@ -277,22 +277,22 @@ }; if (osmo_bssap_tlv_parse(&tp, msg->l4h + 1, payload_length - 1) < 0) { - LOGP(DMSC, LOGL_ERROR, "%s(): tlv_parse() failed\n", __func__); + LOG_MSC(msc, LOGL_ERROR, "%s(): tlv_parse() failed\n", __func__); return -1; } remain = payload_length - 1; if (!TLVP_PRESENT(&tp, GSM0808_IE_IMSI)) { - LOGP(DMSC, LOGL_ERROR, "Mandatory IMSI not present.\n"); + LOG_MSC(msc, LOGL_ERROR, "Mandatory IMSI not present.\n"); return -1; } else if ((TLVP_VAL(&tp, GSM0808_IE_IMSI)0 & GSM_MI_TYPE_MASK) != GSM_MI_TYPE_IMSI) { - LOGP(DMSC, LOGL_ERROR, "Wrong content in the IMSI\n"); + LOG_MSC(msc, LOGL_ERROR, "Wrong content in the IMSI\n"); return -1; } remain -= TLVP_LEN(&tp, GSM0808_IE_IMSI); if (!TLVP_PRESENT(&tp, GSM0808_IE_CELL_IDENTIFIER_LIST)) { - LOGP(DMSC, LOGL_ERROR, "Mandatory CELL IDENTIFIER LIST not present.\n"); + LOG_MSC(msc, LOGL_ERROR, "Mandatory CELL IDENTIFIER LIST not present.\n"); return -1; } @@ -303,7 +303,7 @@ } if (remain <= 0) { - LOGP(DMSC, LOGL_ERROR, "Payload too short.\n"); + LOG_MSC(msc, LOGL_ERROR, "Payload too short.\n"); return -1; } @@ -312,7 +312,7 @@ */ if (osmo_mobile_identity_decode(&paging.imsi, TLVP_VAL(&tp, GSM0808_IE_IMSI), TLVP_LEN(&tp, GSM0808_IE_IMSI), false) || paging.imsi.type != GSM_MI_TYPE_IMSI) { - LOGP(DMSC, LOGL_ERROR, "Paging: could not parse IMSI\n"); + LOG_MSC(msc, LOGL_ERROR, "Paging: could not parse IMSI\n"); return -1; } @@ -749,15 +749,13 @@ struct gsm_subscriber_connection *conn, struct gsm_bts *bts) { int rc, i, nc = 0; - struct bsc_msc_data *msc; + struct bsc_msc_data *msc = conn->sccp.msc; if (!bts) { - LOGP(DMSC, LOGL_ERROR, "No lchan, cannot select codecs\n"); + LOG_MSC(msc, LOGL_ERROR, "No lchan, cannot select codecs\n"); return -EINVAL; } - msc = conn->sccp.msc; - switch (ct->ch_rate_type) { case GSM0808_SPEECH_FULL_BM: rc = match_codec_pref(&req->ch_mode_rate_listnc, ct, &conn->codec_list, msc, bts, @@ -795,21 +793,21 @@ } if (!nc) { - LOGP(DMSC, LOGL_ERROR, "No supported audio type found for channel_type =" - " { ch_indctr=0x%x, ch_rate_type=0x%x, perm_spch=%s }\n", - ct->ch_indctr, ct->ch_rate_type, osmo_hexdump(ct->perm_spch, ct->perm_spch_len)); + LOG_MSC(msc, LOGL_ERROR, "No supported audio type found for channel_type =" + " { ch_indctr=0x%x, ch_rate_type=0x%x, perm_spch=%s }\n", + ct->ch_indctr, ct->ch_rate_type, osmo_hexdump(ct->perm_spch, ct->perm_spch_len)); /* TODO: actually output codec names, e.g. implement * gsm0808_permitted_speech_names and iterate perm_spch. */ return -EINVAL; } for (i = 0; i < nc; i++ ) { - DEBUGP(DMSC, "Found matching audio type (pref=%d): %s %s for channel_type =" - " { ch_indctr=0x%x, ch_rate_type=0x%x, perm_spch= %s }\n", - i, - req->ch_mode_rate_listi.chan_rate == CH_RATE_FULL ? "full rate" : "half rate", - get_value_string(gsm48_chan_mode_names, req->ch_mode_rate_listi.chan_mode), - ct->ch_indctr, ct->ch_rate_type, osmo_hexdump(ct->perm_spch, ct->perm_spch_len)); + LOG_MSC(msc, LOGL_DEBUG, "Found matching audio type (pref=%d): %s %s for channel_type =" + " { ch_indctr=0x%x, ch_rate_type=0x%x, perm_spch= %s }\n", + i, + req->ch_mode_rate_listi.chan_rate == CH_RATE_FULL ? "full rate" : "half rate", + get_value_string(gsm48_chan_mode_names, req->ch_mode_rate_listi.chan_mode), + ct->ch_indctr, ct->ch_rate_type, osmo_hexdump(ct->perm_spch, ct->perm_spch_len)); } req->n_ch_mode_rate = nc; @@ -933,10 +931,11 @@ bool *use_osmux, uint8_t *osmux_cid, uint8_t *cause) { int rc; + struct bsc_msc_data *msc = conn->sccp.msc; if (TLVP_PRESENT(tp, GSM0808_IE_OSMO_OSMUX_CID)) { - if (conn->sccp.msc->use_osmux == OSMUX_USAGE_OFF) { - LOGP(DMSC, LOGL_ERROR, "MSC using Osmux but we have it disabled.\n"); + if (msc->use_osmux == OSMUX_USAGE_OFF) { + LOG_MSC(msc, LOGL_ERROR, "MSC using Osmux but we have it disabled.\n"); *cause = GSM0808_CAUSE_INCORRECT_VALUE; return -1; } @@ -945,21 +944,21 @@ TLVP_VAL(tp, GSM0808_IE_OSMO_OSMUX_CID), TLVP_LEN(tp, GSM0808_IE_OSMO_OSMUX_CID)); if (rc < 0) { - LOGP(DMSC, LOGL_ERROR, "Unable to decode Osmux CID.\n"); + LOG_MSC(msc, LOGL_ERROR, "Unable to decode Osmux CID.\n"); *cause = GSM0808_CAUSE_INCORRECT_VALUE; return -1; } return 0; } - if (conn->sccp.msc->use_osmux == OSMUX_USAGE_ONLY) { - LOGP(DMSC, LOGL_ERROR, "MSC not using Osmux but we are forced to use it.\n"); + if (msc->use_osmux == OSMUX_USAGE_ONLY) { + LOG_MSC(msc, LOGL_ERROR, "MSC not using Osmux but we are forced to use it.\n"); *cause = GSM0808_CAUSE_INCORRECT_VALUE; return -1; } - if (conn->sccp.msc->use_osmux == OSMUX_USAGE_ON) - LOGP(DMSC, LOGL_NOTICE, "MSC not using Osmux but we have Osmux enabled.\n"); + if (msc->use_osmux == OSMUX_USAGE_ON) + LOG_MSC(msc, LOGL_NOTICE, "MSC not using Osmux but we have Osmux enabled.\n"); return 0; } @@ -1461,11 +1460,11 @@ struct rate_ctr *ctrs = msc->msc_ctrs->ctr; if (length < 1) { - LOGP(DMSC, LOGL_ERROR, "Not enough room: %d\n", length); + LOG_MSC(msc, LOGL_ERROR, "Not enough room: %d\n", length); return -1; } - LOGP(DMSC, LOGL_INFO, "Rx MSC UDT BSSMAP %s\n", + LOG_MSC(msc, LOGL_INFO, "Rx MSC UDT BSSMAP %s\n", gsm0808_bssmap_name(msg->l4h0));
View file
osmo-bsc_1.13.3.tar.xz/src/osmo-bsc/osmo_bsc_main.c -> osmo-bsc_1.14.0.tar.xz/src/osmo-bsc/osmo_bsc_main.c
Changed
@@ -631,25 +631,6 @@ return vty->node; } -static int bsc_vty_is_config_node(struct vty *vty, int node) -{ - /* Check if libosmo-sccp declares the node in - * question as config node */ - if (osmo_ss7_is_config_node(vty, node)) - return 1; - - switch (node) { - /* add items that are not config */ - case OML_NODE: - case OM2K_NODE: - case CONFIG_NODE: - return 0; - - default: - return 1; - } -} - static struct vty_app_info vty_info = { .name = "OsmoBSC", .copyright = @@ -663,7 +644,6 @@ "There is NO WARRANTY, to the extent permitted by law.\r\n", .version = PACKAGE_VERSION, .go_parent_cb = bsc_vty_go_parent, - .is_config_node = bsc_vty_is_config_node, .usr_attr_desc = { BSC_VTY_ATTR_RESTART_ABIS_OML_LINK = \ "This command applies on A-bis OML link (re)establishment",
View file
osmo-bsc_1.13.3.tar.xz/src/osmo-bsc/osmo_bsc_mgcp.c -> osmo-bsc_1.14.0.tar.xz/src/osmo-bsc/osmo_bsc_mgcp.c
Changed
@@ -39,23 +39,6 @@ #include <arpa/inet.h> -/* Determine MSC based on the ASP over which the message was received */ -static struct bsc_msc_data *msc_from_asp(struct osmo_ss7_asp *asp) -{ - int msc_nr; - const char *asp_name = osmo_ss7_asp_get_name(asp); - /* this is rather ugly, as we of course have MTP-level routing between - * the local SCCP user (BSC) and the AS/ASPs. However, for the most simple - * SCCPlite case, there is a 1:1 mapping between ASP and AS, and using - * the libosmo-sigtran "simple client", the names are "asp-clnt-msc-%u", - * as set in osmo_bsc_sigtran_init() */ - if (!asp_name || sscanf(asp_name, "asp-clnt-msc-%u", &msc_nr) != 1) { - LOGP(DMSC, LOGL_ERROR, "Cannot find to which MSC the ASP '%s' belongs\n", asp_name); - return NULL; - } - return osmo_msc_data_find(bsc_gsmnet, msc_nr); -} - /* negative on error, zero upon success */ static int parse_local_endpoint_name(char *buf, size_t buf_len, const char *data) { @@ -91,10 +74,8 @@ return 0; } -/* We received an IPA-encapsulated MGCP message from a MSC. Transfers msg ownership. */ -int bsc_sccplite_rx_mgcp(struct osmo_ss7_asp *asp, struct msgb *msg) +static int _bsc_sccplite_rx_mgcp(struct bsc_msc_data *msc, struct msgb *msg) { - struct bsc_msc_data *msc; struct gsm_subscriber_connection *conn; char rcv_ep_local_name1024; struct osmo_sockaddr_str osa_str = {}; @@ -103,20 +84,13 @@ struct mgcp_client *mgcp_cli = NULL; int rc; - LOGP(DMSC, LOGL_INFO, "%s: Received IPA-encapsulated MGCP: %s\n", - osmo_ss7_asp_get_name(asp), msg->l2h); - - msc = msc_from_asp(asp); - if (!msc) { - rc = 0; - goto free_msg_ret; - } + LOG_MSC(msc, LOGL_INFO, "Received IPA-encapsulated MGCP: %s\n", (const char *)msgb_l2(msg)); - rc = parse_local_endpoint_name(rcv_ep_local_name, sizeof(rcv_ep_local_name), (const char *)msg->l2h); + rc = parse_local_endpoint_name(rcv_ep_local_name, sizeof(rcv_ep_local_name), + (const char *)msgb_l2(msg)); if (rc < 0) { - LOGP(DMSC, LOGL_ERROR, "(%s:) Received IPA-encapsulated MGCP: Failed to parse CIC\n", - osmo_ss7_asp_get_name(asp)); - goto free_msg_ret; + LOG_MSC(msc, LOGL_ERROR, "Received IPA-encapsulated MGCP: Failed to parse CIC\n"); + return rc; } /* Lookup which conn attached to the MSC holds an MGW endpoint with the @@ -143,28 +117,26 @@ } if (!mgcp_cli) { - LOGP(DMSC, LOGL_ERROR, "(%s:) Received IPA-encapsulated MGCP: Failed to find associated MGW\n", - osmo_ss7_asp_get_name(asp)); - rc = 0; - goto free_msg_ret; + LOG_MSC(msc, LOGL_ERROR, "Received IPA-encapsulated MGCP: Failed to find associated MGW\n"); + return 0; } rc = osmo_sockaddr_str_from_str(&osa_str, mgcp_client_remote_addr_str(mgcp_cli), mgcp_client_remote_port(mgcp_cli)); if (rc < 0) { - LOGP(DMSC, LOGL_ERROR, "(%s:) Received IPA-encapsulated MGCP: Failed to parse MGCP address %s:%u\n", - osmo_ss7_asp_get_name(asp), mgcp_client_remote_addr_str(mgcp_cli), mgcp_client_remote_port(mgcp_cli)); - goto free_msg_ret; + LOG_MSC(msc, LOGL_ERROR, "Received IPA-encapsulated MGCP: Failed to parse MGCP address %s:%u\n", + mgcp_client_remote_addr_str(mgcp_cli), mgcp_client_remote_port(mgcp_cli)); + return rc; } - LOGP(DMSC, LOGL_NOTICE, "%s: Forwarding IPA-encapsulated MGCP to MGW at " OSMO_SOCKADDR_STR_FMT "\n", - osmo_ss7_asp_get_name(asp), OSMO_SOCKADDR_STR_FMT_ARGS_NOT_NULL(&osa_str)); + LOG_MSC(msc, LOGL_NOTICE, "Forwarding IPA-encapsulated MGCP to MGW at " OSMO_SOCKADDR_STR_FMT "\n", + OSMO_SOCKADDR_STR_FMT_ARGS_NOT_NULL(&osa_str)); rc = osmo_sockaddr_str_to_sockaddr(&osa_str, &osa.u.sas); if (rc < 0) { - LOGP(DMSC, LOGL_ERROR, "(%s:) Received IPA-encapsulated MGCP: Failed to parse MGCP address " OSMO_SOCKADDR_STR_FMT "\n", - osmo_ss7_asp_get_name(asp), OSMO_SOCKADDR_STR_FMT_ARGS_NOT_NULL(&osa_str)); - goto free_msg_ret; + LOG_MSC(msc, LOGL_ERROR, "Received IPA-encapsulated MGCP: Failed to parse MGCP address " OSMO_SOCKADDR_STR_FMT "\n", + OSMO_SOCKADDR_STR_FMT_ARGS_NOT_NULL(&osa_str)); + return rc; } dest_len = osmo_sockaddr_size(&osa); @@ -172,8 +144,36 @@ * to be large enough to deal with whatever small/infrequent MGCP messages */ rc = sendto(msc->mgcp_ipa.ofd.fd, msgb_l2(msg), msgb_l2len(msg), 0, &osa.u.sa, dest_len); -free_msg_ret: - msgb_free(msg); + return rc; +} + +/* We received an IPA-encapsulated MGCP message from MSC. msg owned by caller. */ +int bsc_sccplite_rx_mgcp(struct bsc_msc_data *msc, struct msgb *msg) +{ + int rc; + struct msgb *msg_resized; + + if (msgb_l2len(msg) == 0) { + LOG_MSC(msc, LOGL_NOTICE, "Received empty IPA-encapsulated MGCP\n"); + return -ENODATA; + } + + /* Make sure we have a NULL-terminated string to be on the safe side: */ + if (*((const char *)msgb_l2(msg) + msgb_l2len(msg) - 1) == '\0') + return _bsc_sccplite_rx_mgcp(msc, msg); + + /* If there's extra space available in msgb from lower layers, simply nullify next char: */ + if (msgb_tailroom(msg) > 0) { + *msg->tail = '\0'; + return _bsc_sccplite_rx_mgcp(msc, msg); + } + + /* Otherwise, craft a resized message: */ + msg_resized = msgb_copy_resize(msg, msgb_length(msg)+1, "mgcp-resized"); + OSMO_ASSERT(msgb_tailroom(msg) == 1); + *msg->tail = '\0'; + rc = _bsc_sccplite_rx_mgcp(msc, msg_resized); + msgb_free(msg_resized); return rc; } @@ -187,7 +187,7 @@ if (!(what & OSMO_FD_READ)) return 0; - msg = msgb_alloc_headroom(1024, 16, "MGCP->IPA"); + msg = msgb_alloc_headroom(1400, 64, "MGCP->IPA"); OSMO_ASSERT(msg); rc = recv(ofd->fd, msg->data, msgb_tailroom(msg), 0); if (rc <= 0) { @@ -200,6 +200,6 @@ msg->l2hrc = '\0'; LOGP(DMSC, LOGL_NOTICE, "Received MGCP on UDP proxy socket: %s\n", msg->l2h); - ipa_prepend_header(msg, IPAC_PROTO_MGCP_OLD); + osmo_ipa_msg_push_header(msg, IPAC_PROTO_MGCP_OLD); return bsc_sccplite_msc_send(msc, msg); }
View file
osmo-bsc_1.13.3.tar.xz/src/osmo-bsc/osmo_bsc_msc.c -> osmo-bsc_1.14.0.tar.xz/src/osmo-bsc/osmo_bsc_msc.c
Changed
@@ -384,12 +384,11 @@ msc->mgcp_ipa.local_addr, msc->mgcp_ipa.local_port, NULL, 0, OSMO_SOCK_F_BIND); if (rc < 0) { - LOGP(DMSC, LOGL_ERROR, "msc %u: Could not create/connect/bind MGCP proxy socket: %d\n", - msc->nr, rc); + LOG_MSC(msc, LOGL_ERROR, "Could not create/connect/bind MGCP proxy socket: %d\n", rc); return rc; } - LOGP(DMSC, LOGL_INFO, "msc %u: Socket forwarding IPA-encapsulated MGCP messages towards MGW: %s\n", - msc->nr, osmo_sock_get_name2(msc->mgcp_ipa.ofd.fd)); + LOG_MSC(msc, LOGL_INFO, "Socket forwarding IPA-encapsulated MGCP messages towards MGW: %s\n", + osmo_sock_get_name2(msc->mgcp_ipa.ofd.fd)); return 0; }
View file
osmo-bsc_1.13.3.tar.xz/src/osmo-bsc/osmo_bsc_sigtran.c -> osmo-bsc_1.14.0.tar.xz/src/osmo-bsc/osmo_bsc_sigtran.c
Changed
@@ -1,4 +1,4 @@ -/* (C) 2017 by sysmocom s.f.m.c. GmbH, Author: Philipp Maier +/* (C) 2017-2025 by sysmocom s.f.m.c. GmbH, Author: Philipp Maier * (C) 2017-2018 by Harald Welte <laforge@gnumonks.org> * All Rights Reserved * @@ -22,6 +22,9 @@ #include <osmocom/core/fsm.h> #include <osmocom/sigtran/osmo_ss7.h> #include <osmocom/sigtran/sccp_sap.h> +#include <osmocom/sigtran/protocol/mtp.h> +#include <osmocom/sigtran/mtp_sap.h> +#include <osmocom/sccp/sccp_types.h> #include <osmocom/core/linuxlist.h> #include <osmocom/gsm/gsm0808.h> #include <osmocom/gsm/protocol/ipaccess.h> @@ -63,7 +66,7 @@ ss7 = osmo_ss7_instance_find(msc->a.cs7_instance); OSMO_ASSERT(ss7); - LOGP(DRESET, LOGL_INFO, "Sending RESET to MSC: %s\n", osmo_sccp_addr_name(ss7, &msc->a.msc_addr)); + LOG_MSC_CAT(msc, DRESET, LOGL_INFO, "Sending RESET to MSC: %s\n", osmo_sccp_addr_name(ss7, &msc->a.msc_addr)); msg = gsm0808_create_reset(); if (msc_is_aoip(msc) && msc->use_osmux != OSMUX_USAGE_OFF) @@ -83,7 +86,7 @@ ss7 = osmo_ss7_instance_find(msc->a.cs7_instance); OSMO_ASSERT(ss7); - LOGP(DRESET, LOGL_NOTICE, "Sending RESET ACK to MSC: %s\n", osmo_sccp_addr_name(ss7, &msc->a.msc_addr)); + LOG_MSC_CAT(msc, DRESET, LOGL_NOTICE, "Sending RESET ACK to MSC: %s\n", osmo_sccp_addr_name(ss7, &msc->a.msc_addr)); msg = gsm0808_create_reset_ack(); if (msc_is_aoip(msc) && msc->use_osmux != OSMUX_USAGE_OFF) @@ -97,15 +100,13 @@ /* Find an MSC by its remote SCCP address */ static struct bsc_msc_data *get_msc_by_addr(const struct osmo_sccp_addr *msc_addr) { - struct osmo_ss7_instance *ss7; struct bsc_msc_data *msc; llist_for_each_entry(msc, msc_list, entry) { - if (memcmp(msc_addr, &msc->a.msc_addr, sizeof(*msc_addr)) == 0) + if (osmo_sccp_addr_ri_cmp(msc_addr, &msc->a.msc_addr) == 0) return msc; } - - ss7 = osmo_ss7_instance_find(msc->a.cs7_instance); - LOGP(DMSC, LOGL_ERROR, "Unable to find MSC data under address: %s\n", osmo_sccp_addr_name(ss7, msc_addr)); + LOGP(DMSC, LOGL_ERROR, "Unable to find MSC data under address: %s\n", + osmo_sccp_addr_dump(msc_addr)); return NULL; } @@ -152,6 +153,37 @@ return rc; } +static int handle_notice_ind(struct osmo_ss7_instance *cs7, const struct osmo_scu_notice_param *ni) +{ + int rc = 0; + struct bsc_msc_data *msc = get_msc_by_addr(&ni->calling_addr); + if (!msc) { + LOGP(DMSC, LOGL_DEBUG, "(calling_addr=%s) N-NOTICE.ind cause=%u='%s' importance=%u didn't match any MSC, ignoring\n", + osmo_sccp_addr_dump(&ni->calling_addr), + ni->cause, osmo_sccp_return_cause_name(ni->cause), + ni->importance); + return rc; + } + + LOG_MSC(msc, LOGL_NOTICE, "(calling_addr=%s) N-NOTICE.ind cause=%u='%s' importance=%u\n", + osmo_sccp_addr_dump(&ni->calling_addr), + ni->cause, osmo_sccp_return_cause_name(ni->cause), + ni->importance); + + switch (ni->cause) { + case SCCP_RETURN_CAUSE_SUBSYSTEM_CONGESTION: + case SCCP_RETURN_CAUSE_NETWORK_CONGESTION: + /* Transient failures (hopefully), keep going. */ + return rc; + default: + break; + } + + /* Messages are not arriving to MSC. Kick the BSSMAP back to DISC state. */ + bssmap_reset_set_disconnected(msc->a.bssmap_reset); + return rc; +} + static int handle_n_connect_from_msc(struct osmo_sccp_user *scu, struct osmo_scu_prim *scu_prim) { struct bsc_msc_data *msc = get_msc_by_addr(&scu_prim->u.connect.calling_addr); @@ -180,9 +212,9 @@ goto refuse; } - LOGP(DMSC, LOGL_DEBUG, "(calling_addr=%s conn_id=%u) N-CONNECT.ind from MSC %d\n", - osmo_sccp_addr_dump(&scu_prim->u.connect.calling_addr), - scu_prim->u.connect.conn_id, msc->nr); + LOG_MSC(msc, LOGL_DEBUG, "(calling_addr=%s conn_id=%u) N-CONNECT.ind\n", + osmo_sccp_addr_dump(&scu_prim->u.connect.calling_addr), + scu_prim->u.connect.conn_id); conn = bsc_subscr_con_allocate(bsc_gsmnet); if (!conn) @@ -190,8 +222,8 @@ conn->sccp.msc = msc; conn->sccp.conn.conn_id = scu_prim->u.connect.conn_id; if (bsc_sccp_inst_register_gscon(bsc_sccp, &conn->sccp.conn) < 0) { - LOGP(DMSC, LOGL_NOTICE, "(calling_addr=%s conn_id=%u) N-CONNECT.ind failed registering conn\n", - osmo_sccp_addr_dump(&scu_prim->u.connect.calling_addr), scu_prim->u.connect.conn_id); + LOG_MSC(msc, LOGL_NOTICE, "(calling_addr=%s conn_id=%u) N-CONNECT.ind failed registering conn\n", + osmo_sccp_addr_dump(&scu_prim->u.connect.calling_addr), scu_prim->u.connect.conn_id); osmo_fsm_inst_term(conn->fi, OSMO_FSM_TERM_REQUEST, NULL); rc = -ENOENT; goto refuse; @@ -212,8 +244,9 @@ bool connected; bool disconnected; - LOGP(DMSC, LOGL_DEBUG, "N-PCSTATE ind: affected_pc=%u sp_status=%s remote_sccp_status=%s\n", - pcst->affected_pc, osmo_sccp_sp_status_name(pcst->sp_status), + LOGP(DMSC, LOGL_DEBUG, "N-PCSTATE ind: affected_pc=%u=%s sp_status=%s remote_sccp_status=%s\n", + pcst->affected_pc, osmo_ss7_pointcode_print(cs7, pcst->affected_pc), + osmo_sccp_sp_status_name(pcst->sp_status), osmo_sccp_rem_sccp_status_name(pcst->remote_sccp_status)); /* If we don't care about that point-code, ignore PCSTATE. */ @@ -275,19 +308,19 @@ } if (disconnected && a_reset_conn_ready(msc)) { - LOGP(DMSC, LOGL_NOTICE, - "(msc%d) now unreachable: N-PCSTATE ind: pc=%u sp_status=%s remote_sccp_status=%s\n", - msc->nr, pcst->affected_pc, - osmo_sccp_sp_status_name(pcst->sp_status), - osmo_sccp_rem_sccp_status_name(pcst->remote_sccp_status)); + LOG_MSC(msc, LOGL_NOTICE, + "now unreachable: N-PCSTATE ind: pc=%u=%s sp_status=%s remote_sccp_status=%s\n", + pcst->affected_pc, osmo_ss7_pointcode_print(cs7, pcst->affected_pc), + osmo_sccp_sp_status_name(pcst->sp_status), + osmo_sccp_rem_sccp_status_name(pcst->remote_sccp_status)); /* A previously usable MSC has disconnected. Kick the BSSMAP back to DISC state. */ bssmap_reset_set_disconnected(msc->a.bssmap_reset); } else if (connected && !a_reset_conn_ready(msc)) { - LOGP(DMSC, LOGL_NOTICE, - "(msc%d) now available: N-PCSTATE ind: pc=%u sp_status=%s remote_sccp_status=%s\n", - msc->nr, pcst->affected_pc, - osmo_sccp_sp_status_name(pcst->sp_status), - osmo_sccp_rem_sccp_status_name(pcst->remote_sccp_status)); + LOG_MSC(msc, LOGL_NOTICE, + "now available: N-PCSTATE ind: pc=%u=%s sp_status=%s remote_sccp_status=%s\n", + pcst->affected_pc, osmo_ss7_pointcode_print(cs7, pcst->affected_pc), + osmo_sccp_sp_status_name(pcst->sp_status), + osmo_sccp_rem_sccp_status_name(pcst->remote_sccp_status)); /* A previously unusable MSC has become reachable. Trigger immediate BSSMAP RESET -- we would resend a * RESET either way, but we might as well do it now to speed up connecting. */ bssmap_reset_resend_reset(msc->a.bssmap_reset); @@ -311,6 +344,11 @@ rc = handle_unitdata_from_msc(&scu_prim->u.unitdata.calling_addr, oph->msg, scu); break; + case OSMO_PRIM(OSMO_SCU_PRIM_N_NOTICE, PRIM_OP_INDICATION): + DEBUGP(DMSC, "N-NOTICE.ind(%s)\n", osmo_hexdump(msgb_l2(oph->msg), msgb_l2len(oph->msg))); + rc = handle_notice_ind(osmo_sccp_get_ss7(sccp), &scu_prim->u.notice); + break; + case OSMO_PRIM(OSMO_SCU_PRIM_N_CONNECT, PRIM_OP_INDICATION): /* Handle inbound connections */ DEBUGP(DMSC, "N-CONNECT.ind(X->%u)\n", scu_prim->u.connect.conn_id); @@ -382,6 +420,106 @@ return rc; } +/* Determine MSC based on OPC/DPC of received message. */ +static struct bsc_msc_data *msc_from_mtp_label(const struct osmo_mtp_transfer_param *param) +{ + struct bsc_msc_data *msc; + llist_for_each_entry(msc, &bsc_gsmnet->mscs, entry) { + if (msc->a.bsc_addr.pc != param->dpc) + continue; + if (msc->a.msc_addr.pc != param->opc) + continue; + return msc; + } + + return NULL; +} + +/* Callback function, called by the MTP stack for MGCP/CTRL over IPA from MSC (SCCPlite). + * msgb ownership is transferred to this callback and hence must be freed. */ +static int mtp_sap_up(struct osmo_prim_hdr *oph, void *data) +{ + struct osmo_mtp_prim *mtp_prim = (struct osmo_mtp_prim *)oph; + struct osmo_ss7_instance *s7i = data; + struct msgb *msg = oph->msg; + struct bsc_msc_data *msc; + struct ipa_head *ih; + struct ipa_head_ext *ihext; + int rc = 0; +
View file
osmo-bsc_1.13.3.tar.xz/src/osmo-bsc/system_information.c -> osmo-bsc_1.14.0.tar.xz/src/osmo-bsc/system_information.c
Changed
@@ -535,6 +535,7 @@ const struct gsm_bts *bts, bool bis, bool ter) { int i, rc, min = -1, max = -1, arfcns = 0; + const int min_arfcn = 940; bool pgsm = false; memset(chan_list, 0, 16); @@ -545,8 +546,8 @@ /* Check presence of E-GSM ARFCN 0 */ if (pgsm && bitvec_get_bit_pos(bv, 0) == ONE) pgsm = false; - /* Check presence of R-GSM / E-GSM ARFCNs 955..1023 */ - for (i = 955; pgsm && i <= 1023; i++) { + /* Check presence of (E)R-GSM / E-GSM ARFCNs 940..1023 */ + for (i = min_arfcn; pgsm && i <= 1023; i++) { if (bitvec_get_bit_pos(bv, i) == ONE) pgsm = false; } @@ -577,22 +578,22 @@ /* count the arfcns we want to carry */ arfcns += 1; - /* 955..1023 < 0..885 */ + /* 940..1023 < 0..885 */ if (min < 0) min = i; - if (i >= 955 && min < 955) + if (i >= min_arfcn && min < min_arfcn) min = i; - if (i >= 955 && min >= 955 && i < min) + if (i >= min_arfcn && min >= min_arfcn && i < min) min = i; - if (i < 955 && min < 955 && i < min) + if (i < min_arfcn && min < min_arfcn && i < min) min = i; if (max < 0) max = i; - if (i < 955 && max >= 955) + if (i < min_arfcn && max >= min_arfcn) max = i; - if (i >= 955 && max >= 955 && i > max) + if (i >= min_arfcn && max >= min_arfcn && i > max) max = i; - if (i < 955 && max < 955 && i > max) + if (i < min_arfcn && max < min_arfcn && i > max) max = i; } @@ -1041,7 +1042,7 @@ si_info.early_cm_restrict_3g = !bts->early_classmark_allowed_3g; /* SI3 Rest Octets (10.5.2.34), containing - CBQ, CELL_RESELECT_OFFSET, TEMPORARY_OFFSET, PENALTY_TIME + CELL_BAR_QUALIFY/CBQ, CELL_RESELECT_OFFSET, TEMPORARY_OFFSET, PENALTY_TIME Power Offset, 2ter Indicator, Early Classmark Sending, Scheduling if and WHERE, GPRS Indicator, SI13 position */ rc = osmo_gsm48_rest_octets_si3_encode(si3->rest_octets, &si_info);
View file
osmo-bsc_1.13.3.tar.xz/src/osmo-bsc/vgcs_fsm.c -> osmo-bsc_1.14.0.tar.xz/src/osmo-bsc/vgcs_fsm.c
Changed
@@ -602,10 +602,7 @@ if (conn->vgcs_chan.fi->state != VGCS_CHAN_ST_WAIT_EST) { /* Remove call from notification channel. */ - if (conn->lchan) - rsl_notification_cmd(conn->lchan->ts->trx->bts, NULL, &conn->vgcs_chan.gc_ie, NULL); - else - LOG_CHAN(conn, LOGL_ERROR, "Unable to remove notification, lchan is already gone.\n"); + rsl_notification_cmd(conn->vgcs_chan.notify_bts, NULL, &conn->vgcs_chan.gc_ie, NULL); } /* Detach from call, if not already. */ @@ -731,7 +728,7 @@ osmo_fsm_inst_state_chg(fi, VGCS_CHAN_ST_ACTIVE_BLOCKED, 0, 0); if (conn->vgcs_chan.call) { /* Add call to notification channel. */ - rsl_notification_cmd(conn->lchan->ts->trx->bts, conn->lchan, &conn->vgcs_chan.gc_ie, NULL); + rsl_notification_cmd(conn->vgcs_chan.notify_bts, conn->lchan, &conn->vgcs_chan.gc_ie, NULL); /* Add/update SI10. */ si10_update(conn->vgcs_chan.call); } @@ -798,7 +795,7 @@ if (conn->vgcs_chan.call) osmo_fsm_inst_dispatch(conn->vgcs_chan.call->vgcs_call.fi, VGCS_EV_CALLING_ASSIGNED, conn); /* Repeat notification for the MS that has been assigned. */ - rsl_notification_cmd(conn->lchan->ts->trx->bts, conn->lchan, &conn->vgcs_chan.gc_ie, NULL); + rsl_notification_cmd(conn->vgcs_chan.notify_bts, conn->lchan, &conn->vgcs_chan.gc_ie, NULL); break; case VGCS_EV_CLEANUP: LOG_CHAN(conn, LOGL_DEBUG, "SCCP connection clearing.\n"); @@ -1248,6 +1245,9 @@ } conn->vgcs_chan.new_lchan = lchan; + /* Set BTS that receives notification. */ + conn->vgcs_chan.notify_bts = bts; + /* Create VGCS FSM. */ conn->vgcs_chan.fi = osmo_fsm_inst_alloc(&vgcs_chan_fsm, conn->network, conn, LOGL_DEBUG, NULL); if (!conn->vgcs_chan.fi)
View file
osmo-bsc_1.13.3.tar.xz/src/utils/meas_json.c -> osmo-bsc_1.14.0.tar.xz/src/utils/meas_json.c
Changed
@@ -31,6 +31,8 @@ #include <netinet/in.h> +#include <getopt.h> + #include <osmocom/core/socket.h> #include <osmocom/core/msgb.h> #include <osmocom/core/select.h> @@ -41,6 +43,9 @@ #include <osmocom/bsc/gsm_data.h> #include <osmocom/bsc/meas_feed.h> +/* binding IP */ +static char *bind_ip; + static void print_meas_rep_uni_json(struct gsm_meas_rep_unidir *mru) { printf("\"RXL-FULL\":%d, \"RXL-SUB\":%d, ", @@ -172,6 +177,68 @@ return 0; } +static void print_help(void) +{ + printf(" -h --help. This help text.\n"); + printf(" -b --bind-ip. The IP to bind to.\n"); +} + +static void print_usage(void) +{ + printf("Usage: meas_json options\n"); +} + +static void handle_options(int argc, char **argv) +{ + int options_mask = 0; + + /* disable explicit missing arguments error output from getopt_long */ + opterr = 0; + + while (1) { + int option_index = 0, c; + static struct option long_options = { + {"help", 0, 0, 'h'}, + {"bind-ip", 0, 0, 'b'}, + {0, 0, 0, 0} + }; + + c = getopt_long(argc, argv, "hb:", + long_options, &option_index); + if (c == -1) + break; + + switch (c) { + case 'h': + print_usage(); + print_help(); + exit(0); + case 'b': + bind_ip = optarg; + break; + case '?': + if (optopt) { + printf("ERROR: missing mandatory argument " + "for `%s' option\n", argvoptind-1); + } else { + printf("ERROR: unknown option `%s'\n", + argvoptind-1); + } + print_usage(); + print_help(); + exit(EXIT_FAILURE); + break; + default: + /* ignore */ + break; + } + } + if (argc > optind) { + fprintf(stderr, "Unsupported positional arguments on command line\n"); + exit(2); + } +} + /* default categories */ static struct log_info_cat default_categories = { }; @@ -187,11 +254,13 @@ void *tall_ctx = talloc_named_const(NULL, 0, "meas_json"); osmo_init_logging2(tall_ctx, &meas_json_log_info); + handle_options(argc, argv); + int rc; struct osmo_fd udp_ofd; udp_ofd.cb = udp_fd_cb; - rc = osmo_sock_init_ofd(&udp_ofd, AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 8888, OSMO_SOCK_F_BIND); + rc = osmo_sock_init_ofd(&udp_ofd, AF_INET, SOCK_DGRAM, IPPROTO_UDP, bind_ip, 8888, OSMO_SOCK_F_BIND); if (rc < 0) exit(1);
View file
osmo-bsc_1.13.3.tar.xz/tests/handover/handover_test.c -> osmo-bsc_1.14.0.tar.xz/tests/handover/handover_test.c
Changed
@@ -437,7 +437,7 @@ osmo_fsm_inst_dispatch(conn->fi, GSCON_EV_A_CONN_CFM, NULL); } -struct gsm_lchan *lchan_act(struct gsm_lchan *lchan, int full_rate, const char *codec) +struct gsm_lchan *lchan_act_without_conn(struct gsm_lchan *lchan, int full_rate, const char *codec) { /* serious hack into osmo_fsm */ lchan->fi->state = LCHAN_ST_ESTABLISHED; @@ -455,7 +455,6 @@ LOG_LCHAN(lchan, LOGL_DEBUG, "activated by handover_test.c\n"); - create_conn(lchan); if (!strcasecmp(codec, "FR") && full_rate) lchan->current_ch_mode_rate.chan_mode = GSM48_CMODE_SPEECH_V1; else if (!strcasecmp(codec, "HR") && !full_rate) @@ -470,6 +469,15 @@ exit(EXIT_FAILURE); } + chan_counts_ts_update(lchan->ts); + + return lchan; +} + +struct gsm_lchan *lchan_act(struct gsm_lchan *lchan, int full_rate, const char *codec) +{ + lchan_act_without_conn(lchan, full_rate, codec); + create_conn(lchan); lchan->conn->codec_list = (struct gsm0808_speech_codec_list){ .codec = { { .fi=true, .type=GSM0808_SCT_FR1, }, @@ -480,9 +488,6 @@ }, .len = 5, }; - - chan_counts_ts_update(lchan->ts); - return lchan; } @@ -500,6 +505,20 @@ return lchan_act(lchan, full_rate, codec); } +struct gsm_lchan *create_lchan_without_conn(struct gsm_bts *bts, int full_rate, const char *codec) +{ + struct gsm_lchan *lchan; + + lchan = lchan_select_by_type(bts, (full_rate) ? GSM_LCHAN_TCH_F : GSM_LCHAN_TCH_H, + SELECT_FOR_HANDOVER, NULL); + if (!lchan) { + fprintf(stderr, "No resource for lchan\n"); + exit(EXIT_FAILURE); + } + + return lchan_act_without_conn(lchan, full_rate, codec); +} + static void lchan_release_ack(struct gsm_lchan *lchan) { if (!lchan->fi || lchan->fi->state != LCHAN_ST_WAIT_BEFORE_RF_RELEASE) @@ -975,6 +994,30 @@ return CMD_SUCCESS; } +DEFUN(create_empty_lchan, create_empty_lchan_cmd, + "create-empty-lchan bts <0-999> (TCH/F|TCH/H) (AMR|HR|EFR)", + "Create channel using the next free matching lchan on a given BTS, simulate not yet connected MS\n" + "BTS index to create on\n" + "lchan type to select\n" + "codec\n") +{ + const char *bts_nr_str = argv0; + const char *tch_type = argv1; + const char *codec = argv2; + struct gsm_lchan *lchan; + VTY_ECHO(); + fprintf(stderr, "- Creating mobile at BTS %s on " + "%s with %s codec\n", bts_nr_str, tch_type, codec); + lchan = create_lchan_without_conn(bts_by_num_str(bts_nr_str), + !strcmp(tch_type, "TCH/F"), codec); + if (!lchan) { + fprintf(stderr, "Failed to create lchan!\n"); + return CMD_WARNING; + } + fprintf(stderr, " * New channel is at %s\n", gsm_lchan_name(lchan)); + return CMD_SUCCESS; +} + struct meas_rep_data { int argc; const char **argv; @@ -1527,6 +1570,7 @@ install_element(CONFIG_NODE, &create_n_bts_cmd); install_element(CONFIG_NODE, &create_bts_cmd); install_element(CONFIG_NODE, &create_ms_cmd); + install_element(CONFIG_NODE, &create_empty_lchan_cmd); install_element(CONFIG_NODE, &meas_rep_cmd); install_element(CONFIG_NODE, &meas_rep_repeat_cmd); install_element(CONFIG_NODE, &meas_rep_repeat_bspower_cmd);
View file
osmo-bsc_1.13.3.tar.xz/tests/handover/handover_tests.ok -> osmo-bsc_1.14.0.tar.xz/tests/handover/handover_tests.ok
Changed
@@ -33,6 +33,7 @@ pass test_dyn_ts_favor_half_used_tch_h_as_target.ho_vty pass test_dyn_ts_favor_moving_half_used_tch_h.ho_vty pass test_dyn_ts_favor_static_ts_as_target.ho_vty +pass test_ho_1_rxqual_before_connection.ho_vty pass test_ho_to_better_cell.ho_vty pass test_ho_to_better_cell_2.ho_vty pass test_hysteresis.ho_vty
View file
osmo-bsc_1.14.0.tar.xz/tests/handover/test_ho_1_rxqual_before_connection.ho_vty
Added
@@ -0,0 +1,14 @@ +# Do not try to handover (algorithm 1) if connection is not yet created. + +create-n-bts 1 + +network + bts 0 + handover algorithm 1 + neighbor-list mode manual-si5 + neighbor-list add arfcn 100 + si5 neighbor-list add arfcn 100 + +create-empty-lchan bts 0 TCH/F AMR +meas-rep repeat 3 lchan 0 0 1 0 rxlev 0 rxqual 6 ta 0 neighbors 30 +expect-ts-use trx 0 0 states * TCH/F - - - - - -
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.