Projects
osmocom:master
osmo-bsc
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 321
View file
commit_107391d8c16b7f0898ee7e63fb859669793069ce.txt
Added
View file
commit_b5554a67722a0660a78ab882d425ca45596c849b.txt
Deleted
View file
osmo-bsc_1.14.0.16.b5554.dsc -> osmo-bsc_1.14.0.22.1073.dsc
Changed
@@ -2,7 +2,7 @@ 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.14.0.16.b5554 +Version: 1.14.0.22.1073 Maintainer: Osmocom team <openbsc@lists.osmocom.org> Homepage: https://projects.osmocom.org/projects/osmo-bsc Standards-Version: 3.9.8 @@ -18,8 +18,8 @@ osmo-bsc-ipaccess-utils deb net extra arch=any osmo-bsc-meas-utils deb net extra arch=any Checksums-Sha1: - d2469716ad6a4f572769e2199ce6d04d9d71bca1 634908 osmo-bsc_1.14.0.16.b5554.tar.xz + c11a090929f67b4a1aeb8e27078c75ea1d84b798 635576 osmo-bsc_1.14.0.22.1073.tar.xz Checksums-Sha256: - 361d77113faaf6284aab903c8ff8fa6d3ac9c326736b716ebb64266c47610701 634908 osmo-bsc_1.14.0.16.b5554.tar.xz + 5b64c53091361cd403c80f04f13276cb82183d7fc4c7d78900eb604f2942ec01 635576 osmo-bsc_1.14.0.22.1073.tar.xz Files: - b990548598449eedc3d3881a4937aa43 634908 osmo-bsc_1.14.0.16.b5554.tar.xz + 3cfc468162d0890aa38c4fc7b2cc9c84 635576 osmo-bsc_1.14.0.22.1073.tar.xz
View file
osmo-bsc_1.14.0.16.b5554.tar.xz/.tarball-version -> osmo-bsc_1.14.0.22.1073.tar.xz/.tarball-version
Changed
@@ -1 +1 @@ -1.14.0.16-b5554 +1.14.0.22-1073
View file
osmo-bsc_1.14.0.16.b5554.tar.xz/debian/changelog -> osmo-bsc_1.14.0.22.1073.tar.xz/debian/changelog
Changed
@@ -1,8 +1,8 @@ -osmo-bsc (1.14.0.16.b5554) unstable; urgency=medium +osmo-bsc (1.14.0.22.1073) unstable; urgency=medium * Automatically generated changelog entry for building the Osmocom master feed - -- Osmocom OBS scripts <info@osmocom.org> Wed, 08 Apr 2026 09:05:34 +0000 + -- Osmocom OBS scripts <info@osmocom.org> Wed, 08 Apr 2026 16:31:30 +0000 osmo-bsc (1.14.0) unstable; urgency=medium
View file
osmo-bsc_1.14.0.16.b5554.tar.xz/include/osmocom/bsc/gsm_data.h -> osmo-bsc_1.14.0.22.1073.tar.xz/include/osmocom/bsc/gsm_data.h
Changed
@@ -533,6 +533,11 @@ uint8_t availability; }; +struct ipacc_supp_feat { + bool present; + uint32_t val; +}; + struct gsm_abis_mo { uint8_t obj_class; uint8_t procedure_pending; @@ -555,6 +560,18 @@ union { struct { uint8_t obj_version; + /* relevant for NM_OC_BTS */ + struct ipacc_supp_feat max_ta; + /* relevant for NM_OC_RADIO_CARRIER */ + struct ipacc_supp_feat freq_bands; + /* relevant for NM_OC_BASEB_TRANSC */ + struct ipacc_supp_feat ciph_algos; + struct ipacc_supp_feat chan_types; + struct ipacc_supp_feat chan_modes; + struct ipacc_supp_feat rtp_features; + struct ipacc_supp_feat rsl_features; + /* relevant for NM_OC_GPRS_CELL */ + struct ipacc_supp_feat gprs_coding; } ipaccess; }; };
View file
osmo-bsc_1.14.0.16.b5554.tar.xz/src/osmo-bsc/assignment_fsm.c -> osmo-bsc_1.14.0.22.1073.tar.xz/src/osmo-bsc/assignment_fsm.c
Changed
@@ -365,14 +365,97 @@ new_lchan->ts->max_primary_lchans : 0)); } -static bool lchan_type_compat_with_mode(enum gsm_chan_t type, const struct channel_mode_and_rate *ch_mode_rate) +/* Check whether the ipaccess BTS supports the requested channel mode. + * Returns false if the BTS has reported its supported channel modes and the + * requested mode is absent from that list. Returns true if the Supported + * Features IE was never received (older osmo-bts versions do not send it). */ +static bool ipacc_chan_mode_supported(const struct gsm_lchan *lchan, + const struct channel_mode_and_rate *ch_mode_rate) +{ + const struct ipacc_supp_feat *feat = + &lchan->ts->trx->bb_transc.mo.ipaccess.chan_modes; + uint32_t flag = 0; + + /* Supported Features IE was not received */ + if (!feat->present) + return true; + + switch (gsm48_chan_mode_to_non_vamos(ch_mode_rate->chan_mode)) { + case GSM48_CMODE_SPEECH_V1: + flag = (lchan->type == GSM_LCHAN_TCH_H) + ? NM_IPAC_F_CHANM_SPEECH_HS : NM_IPAC_F_CHANM_SPEECH_FS; + break; + case GSM48_CMODE_SPEECH_EFR: + flag = NM_IPAC_F_CHANM_SPEECH_EFS; + break; + case GSM48_CMODE_SPEECH_AMR: + flag = (lchan->type == GSM_LCHAN_TCH_H) + ? NM_IPAC_F_CHANM_SPEECH_AHS : NM_IPAC_F_CHANM_SPEECH_AFS; + break; + case GSM48_CMODE_DATA_3k6: + case GSM48_CMODE_DATA_6k0: + case GSM48_CMODE_DATA_12k0: + case GSM48_CMODE_DATA_14k5: + if (ch_mode_rate->data_transparent) { + switch (ch_mode_rate->data_rate.t) { + case RSL_CMOD_CSD_T_1200_75: + flag = NM_IPAC_F_CHANM_CSD_T_1200_75; + break; + case RSL_CMOD_CSD_T_600: + flag = NM_IPAC_F_CHANM_CSD_T_600; + break; + case RSL_CMOD_CSD_T_1k2: + flag = NM_IPAC_F_CHANM_CSD_T_1k2; + break; + case RSL_CMOD_CSD_T_2k4: + flag = NM_IPAC_F_CHANM_CSD_T_2k4; + break; + case RSL_CMOD_CSD_T_4k8: + flag = NM_IPAC_F_CHANM_CSD_T_4k8; + break; + case RSL_CMOD_CSD_T_9k6: + flag = NM_IPAC_F_CHANM_CSD_T_9k6; + break; + case RSL_CMOD_CSD_T_14k4: + flag = NM_IPAC_F_CHANM_CSD_T_14k4; + break; + default: + return true; /* unhandled T rate */ + } + } else { + switch (ch_mode_rate->data_rate.nt) { + case RSL_CMOD_CSD_NT_6k0: + flag = NM_IPAC_F_CHANM_CSD_NT_4k8; + break; + case RSL_CMOD_CSD_NT_12k0: + flag = NM_IPAC_F_CHANM_CSD_NT_9k6; + break; + case RSL_CMOD_CSD_NT_14k5: + flag = NM_IPAC_F_CHANM_CSD_NT_14k4; + break; + default: + return true; /* unhandled NT rate */ + } + } + break; + default: + return true; /* unknown channel mode */ + } + + return (feat->val & flag) != 0; +} + +static bool lchan_type_compat_with_mode(const struct gsm_lchan *lchan, + const struct channel_mode_and_rate *ch_mode_rate) { enum gsm48_chan_mode chan_mode = ch_mode_rate->chan_mode; enum channel_rate chan_rate = ch_mode_rate->chan_rate; switch (gsm48_chan_mode_to_non_vamos(chan_mode)) { case GSM48_CMODE_SIGN: - switch (type) { + /* Signalling does not require a specific channel mode on the BTS, + * so skip the ipaccess feature check (below) and return directly. */ + switch (lchan->type) { case GSM_LCHAN_TCH_F: return chan_rate == CH_RATE_FULL; case GSM_LCHAN_TCH_H: return chan_rate == CH_RATE_HALF; case GSM_LCHAN_SDCCH: return chan_rate == CH_RATE_SDCCH; @@ -385,24 +468,41 @@ case GSM48_CMODE_DATA_6k0: /* these services can all run on TCH/H, but we may have * an explicit override by the 'chan_rate' argument */ - switch (type) { + switch (lchan->type) { case GSM_LCHAN_TCH_F: - return chan_rate == CH_RATE_FULL; + if (chan_rate != CH_RATE_FULL) + return false; + break; case GSM_LCHAN_TCH_H: - return chan_rate == CH_RATE_HALF; + if (chan_rate != CH_RATE_HALF) + return false; + break; default: return false; } + break; case GSM48_CMODE_DATA_12k0: case GSM48_CMODE_DATA_14k5: case GSM48_CMODE_SPEECH_EFR: /* these services all explicitly require a TCH/F */ - return type == GSM_LCHAN_TCH_F; + if (lchan->type != GSM_LCHAN_TCH_F) + return false; + break; default: return false; } + + switch (lchan->ts->trx->bts->type) { + case GSM_BTS_TYPE_NANOBTS: + case GSM_BTS_TYPE_OSMOBTS: + /* osmo-bts and nanoBTS report supported channel modes during + * the OML bring-up - additionally check them */ + return ipacc_chan_mode_supported(lchan, ch_mode_rate); + default: + return true; + } } static __attribute__((constructor)) void assignment_fsm_init(void) @@ -473,7 +573,7 @@ /* Check if the currently existing lchan is compatible with the * preferred rate/codec. */ for (i = 0; i < req->n_ch_mode_rate; i++) { - if (!lchan_type_compat_with_mode(conn->lchan->type, &req->ch_mode_rate_listi)) + if (!lchan_type_compat_with_mode(conn->lchan, &req->ch_mode_rate_listi)) continue; conn->assignment.selected_ch_mode_rate = req->ch_mode_rate_listi; return true; @@ -664,7 +764,7 @@ conn->assignment.new_lchan = req->target_lchan; matching_mode = false; for (i = 0; i < req->n_ch_mode_rate; i++) { - if (!lchan_type_compat_with_mode(conn->assignment.new_lchan->type, &req->ch_mode_rate_listi)) + if (!lchan_type_compat_with_mode(conn->assignment.new_lchan, &req->ch_mode_rate_listi)) continue; conn->assignment.selected_ch_mode_rate = req->ch_mode_rate_listi; matching_mode = true;
View file
osmo-bsc_1.14.0.16.b5554.tar.xz/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.c -> osmo-bsc_1.14.0.22.1073.tar.xz/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.c
Changed
@@ -40,29 +40,42 @@ } }; -static inline uint32_t ipacc_parse_supp_flags(const struct abis_om_fom_hdr *foh, - const struct value_string *flags, - const struct tlv_p_entry *e, - const char *text) +static void ipacc_parse_supp_flags(const struct abis_om_fom_hdr *foh, + const struct tlv_parsed *tp, + const enum ipac_eie tag, + struct ipacc_supp_feat *feat, + const struct value_string *flags, + const char *text) { - uint32_t u32 = 0; + const struct tlv_p_entry *e; + + feat->present = false; + feat->val = 0; + + if ((e = TLVP_GET(tp, tag)) == NULL) + return; + + for (unsigned int i = 0; i < OSMO_MIN(e->len, sizeof(feat->val)); i++) + feat->val |= e->vali << (i * 8); + feat->present = true; + + if (flags == NULL) { + LOGPFOH(DNM, LOGL_INFO, foh, "%s: %u\n", text, feat->val); + return; + } - for (unsigned int i = 0; i < OSMO_MIN(e->len, sizeof(u32)); i++) - u32 |= e->vali << (i * 8); for (const struct value_string *vs = flags; vs->value && vs->str; vs++) { - if (u32 & vs->value) + if (feat->val & vs->value) LOGPFOH(DNM, LOGL_INFO, foh, "%s '%s' is supported\n", text, vs->str); } - - return u32; } /* Parse ip.access Supported Features IE */ -int ipacc_parse_supp_features(const struct gsm_bts *bts, +int ipacc_parse_supp_features(struct gsm_bts *bts, const struct abis_om_fom_hdr *foh, const uint8_t *data, uint16_t data_len) { - const struct tlv_p_entry *e; + struct gsm_abis_mo *mo; struct tlv_parsed tp; if (tlv_parse(&tp, &ipacc_eie_tlv_def, data, data_len, 0, 0) < 0) { @@ -70,24 +83,67 @@ return -EINVAL; } - /* TODO: store the flags in the respective MO state */ - if ((e = TLVP_GET(&tp, NM_IPAC_EIE_FREQ_BANDS)) != NULL) - ipacc_parse_supp_flags(foh, abis_nm_ipacc_freq_band_desc, e, "Freq. band"); - if ((e = TLVP_GET(&tp, NM_IPAC_EIE_CIPH_ALGOS)) != NULL) - ipacc_parse_supp_flags(foh, abis_nm_ipacc_ciph_algo_desc, e, "Ciphering algorithm"); - if ((e = TLVP_GET(&tp, NM_IPAC_EIE_CHAN_TYPES)) != NULL) - ipacc_parse_supp_flags(foh, abis_nm_ipacc_chant_desc, e, "Channel type"); - if ((e = TLVP_GET(&tp, NM_IPAC_EIE_CHAN_MODES)) != NULL) - ipacc_parse_supp_flags(foh, abis_nm_ipacc_chanm_desc, e, "Channel mode"); - if ((e = TLVP_GET(&tp, NM_IPAC_EIE_GPRS_CODING)) != NULL) - ipacc_parse_supp_flags(foh, abis_nm_ipacc_gprs_coding_desc, e, "GPRS Coding Scheme"); - if ((e = TLVP_GET(&tp, NM_IPAC_EIE_RTP_FEATURES)) != NULL) - ipacc_parse_supp_flags(foh, abis_nm_ipacc_rtp_feat_desc, e, "RTP Feature"); - if ((e = TLVP_GET(&tp, NM_IPAC_EIE_RSL_FEATURES)) != NULL) - ipacc_parse_supp_flags(foh, abis_nm_ipacc_rsl_feat_desc, e, "RSL Feature"); - if (TLVP_PRES_LEN(&tp, NM_IPAC_EIE_MAX_TA, 1)) { - uint8_t u8 = *TLVP_VAL(&tp, NM_IPAC_EIE_MAX_TA); - LOGPFOH(DNM, LOGL_DEBUG, foh, "Max Timing Advance %u\n", u8); + /* store the flags to the respective MO state */ + mo = gsm_objclass2mo(bts, foh->obj_class, &foh->obj_inst); + if (mo == NULL) { + LOGPFOH(DNM, LOGL_ERROR, foh, + "%s(): gsm_objclass2mo() failed\n", __func__); + return -ENODEV; + } + + switch (mo->obj_class) { + case NM_OC_BTS: + ipacc_parse_supp_flags(foh, &tp, + NM_IPAC_EIE_MAX_TA, + &mo->ipaccess.max_ta, + NULL, "Max Timing Advance"); + break; + case NM_OC_RADIO_CARRIER: + ipacc_parse_supp_flags(foh, &tp, + NM_IPAC_EIE_FREQ_BANDS, + &mo->ipaccess.freq_bands, + abis_nm_ipacc_freq_band_desc, + "Freq. band"); + break; + case NM_OC_BASEB_TRANSC: + ipacc_parse_supp_flags(foh, &tp, + NM_IPAC_EIE_CIPH_ALGOS, + &mo->ipaccess.ciph_algos, + abis_nm_ipacc_ciph_algo_desc, + "Ciphering algorithm"); + ipacc_parse_supp_flags(foh, &tp, + NM_IPAC_EIE_CHAN_TYPES, + &mo->ipaccess.chan_types, + abis_nm_ipacc_chant_desc, + "Channel type"); + ipacc_parse_supp_flags(foh, &tp, + NM_IPAC_EIE_CHAN_MODES, + &mo->ipaccess.chan_modes, + abis_nm_ipacc_chanm_desc, + "Channel mode"); + ipacc_parse_supp_flags(foh, &tp, + NM_IPAC_EIE_RTP_FEATURES, + &mo->ipaccess.rtp_features, + abis_nm_ipacc_rtp_feat_desc, + "RTP Feature"); + ipacc_parse_supp_flags(foh, &tp, + NM_IPAC_EIE_RSL_FEATURES, + &mo->ipaccess.rsl_features, + abis_nm_ipacc_rsl_feat_desc, + "RSL Feature"); + break; + case NM_OC_GPRS_CELL: + ipacc_parse_supp_flags(foh, &tp, + NM_IPAC_EIE_GPRS_CODING, + &mo->ipaccess.gprs_coding, + abis_nm_ipacc_gprs_coding_desc, + "GPRS Coding Scheme"); + break; + default: + LOGPFOH(DNM, LOGL_NOTICE, foh, + "Unhandled NM_ATT_IPACC_SUPP_FEATURES IE: %s\n", + osmo_hexdump(data, data_len)); + return -ENOTSUP; } return 0;
View file
osmo-bsc_1.14.0.16.b5554.tar.xz/src/osmo-bsc/handover_fsm.c -> osmo-bsc_1.14.0.22.1073.tar.xz/src/osmo-bsc/handover_fsm.c
Changed
@@ -897,8 +897,8 @@ static void send_handover_performed(struct gsm_subscriber_connection *conn) { - struct gsm_lchan *lchan = conn->lchan; struct handover *ho = &conn->ho; + struct gsm_lchan *lchan = ho->new_lchan; struct osmo_cell_global_id *cell; struct gsm0808_handover_performed ho_perf_params = {}; struct msgb *msg; @@ -909,7 +909,7 @@ ho_perf_params.cause = GSM0808_CAUSE_HANDOVER_SUCCESSFUL; /* Cell Identifier 3.2.2.17 */ - cell = cgi_for_msc(conn->sccp.msc, conn_get_bts(conn)); + cell = cgi_for_msc(conn->sccp.msc, lchan->ts->trx->bts); if (!cell) { LOG_HO(conn, LOGL_ERROR, "Failed to generate Cell Identifier IE, can't send HANDOVER PERFORMED!\n"); return; @@ -941,7 +941,7 @@ if (gscon_is_aoip(conn)) { /* Extrapolate speech codec from speech mode */ gsm0808_speech_codec_from_chan_type(&sc, ho_perf_params.speech_version_chosen); - sc.cfg = conn->lchan->current_ch_mode_rate.s15_s0; + sc.cfg = lchan->current_ch_mode_rate.s15_s0; memcpy(&ho_perf_params.speech_codec_chosen, &sc, sizeof(sc)); ho_perf_params.speech_codec_chosen_present = true; }
View file
osmo-bsc_1.14.0.16.b5554.tar.xz/src/osmo-bsc/lchan_fsm.c -> osmo-bsc_1.14.0.22.1073.tar.xz/src/osmo-bsc/lchan_fsm.c
Changed
@@ -736,6 +736,11 @@ lchan_fsm_state_chg(LCHAN_ST_WAIT_TS_READY); break; + case LCHAN_EV_RTP_RELEASED: + case LCHAN_EV_RTP_ERROR: + /* Ignore late lchan_rtp_fsm events arriving after the lchan is back to UNUSED. */ + break; + default: OSMO_ASSERT(false); } @@ -972,12 +977,22 @@ lchan->release.rsl_error_cause = *(uint8_t*)data; lchan->release.rr_cause = bsc_gsm48_rr_cause_from_rsl_cause(lchan->release.rsl_error_cause); lchan->release.in_error = true; - if (lchan->release.rsl_error_cause != RSL_ERR_RCH_ALR_ACTV_ALLOC) - next_state = LCHAN_ST_BORKEN; - else + switch (lchan->release.rsl_error_cause) { + case RSL_ERR_RCH_ALR_ACTV_ALLOC: /* Taking this over from legacy code: send an RF Chan Release even though * the Activ was NACKed. Is this really correct? */ next_state = LCHAN_ST_WAIT_RF_RELEASE_ACK; + break; + case RSL_ERR_SERV_OPT_UNAVAIL: + case RSL_ERR_SERV_OPT_UNIMPL: + /* BTS does not support the requested service or mode; the lchan + * itself is not broken, so don't mark it as such. */ + next_state = LCHAN_ST_WAIT_AFTER_ERROR; + break; + default: + next_state = LCHAN_ST_BORKEN; + break; + } lchan_fail_to(next_state, "Chan Activ NACK: %s (0x%x)", rsl_err_name(lchan->release.rsl_error_cause), lchan->release.rsl_error_cause); @@ -1710,6 +1725,8 @@ .action = lchan_fsm_unused, .in_event_mask = 0 | S(LCHAN_EV_ACTIVATE) + | S(LCHAN_EV_RTP_RELEASED) /* ignore late lchan_rtp_fsm release events */ + | S(LCHAN_EV_RTP_ERROR) /* ignore late lchan_rtp_fsm error events */ , .out_state_mask = 0 | S(LCHAN_ST_WAIT_TS_READY) @@ -1752,6 +1769,7 @@ .out_state_mask = 0 | S(LCHAN_ST_UNUSED) | S(LCHAN_ST_WAIT_RLL_RTP_ESTABLISH) + | S(LCHAN_ST_WAIT_AFTER_ERROR) | S(LCHAN_ST_BORKEN) | S(LCHAN_ST_WAIT_RF_RELEASE_ACK) , @@ -1869,6 +1887,7 @@ .onenter = lchan_fsm_wait_after_error_onenter, .in_event_mask = 0 | S(LCHAN_EV_RTP_RELEASED) /* ignore late lchan_rtp_fsm release events */ + | S(LCHAN_EV_RTP_ERROR) /* ignore late lchan_rtp_fsm error events */ , .out_state_mask = 0 | S(LCHAN_ST_UNUSED)
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
.