This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
neels gerrit-no-reply at lists.osmocom.orgneels has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-bsc/+/24524 ) Change subject: RSL chan_nr: replace OSMO_ASSERT with error handling ...................................................................... RSL chan_nr: replace OSMO_ASSERT with error handling It's bad to abort the program for an incompatible chan_nr. Instead of OSMO_ASSERT(), make sure that error handling happens all they way to the original callers of gsm_lchan2chan_nr etc. This is also preparation to add further error causes: Osmocom specific cbits needed for a non-Osmo BTS. Related: SYS#5315 OS#4940 Change-Id: I71ed6437c403a3f9336e17a94b4948fca295d853 --- M include/osmocom/bsc/gsm_data.h M src/osmo-bsc/abis_rsl.c M src/osmo-bsc/gsm_04_08_rr.c M src/osmo-bsc/gsm_data.c M src/osmo-bsc/lcs_loc_req.c M src/osmo-bsc/osmo_bsc_lcls.c M src/osmo-bsc/system_information.c M tests/handover/handover_test.c 8 files changed, 184 insertions(+), 60 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/24/24524/1 diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h index 800dcf5..ce56952 100644 --- a/include/osmocom/bsc/gsm_data.h +++ b/include/osmocom/bsc/gsm_data.h @@ -1027,17 +1027,17 @@ gsm_objclass2obj(struct gsm_bts *bts, uint8_t obj_class, const struct abis_om_obj_inst *obj_inst); -uint8_t gsm_pchan2chan_nr(enum gsm_phys_chan_config pchan, - uint8_t ts_nr, uint8_t lchan_nr); -uint8_t gsm_lchan2chan_nr(const struct gsm_lchan *lchan); -uint8_t gsm_lchan_as_pchan2chan_nr(const struct gsm_lchan *lchan, - enum gsm_phys_chan_config as_pchan); +int gsm_pchan2chan_nr(enum gsm_phys_chan_config pchan, + uint8_t ts_nr, uint8_t lchan_nr); +int gsm_lchan2chan_nr(const struct gsm_lchan *lchan); +int gsm_lchan_as_pchan2chan_nr(const struct gsm_lchan *lchan, + enum gsm_phys_chan_config as_pchan); -void gsm48_lchan2chan_desc(struct gsm48_chan_desc *cd, - const struct gsm_lchan *lchan, - uint8_t tsc); -void gsm48_lchan2chan_desc_as_configured(struct gsm48_chan_desc *cd, const struct gsm_lchan *lchan, - uint8_t tsc); +int gsm48_lchan2chan_desc(struct gsm48_chan_desc *cd, + const struct gsm_lchan *lchan, + uint8_t tsc); +int gsm48_lchan2chan_desc_as_configured(struct gsm48_chan_desc *cd, const struct gsm_lchan *lchan, + uint8_t tsc); uint8_t gsm_ts_tsc(const struct gsm_bts_trx_ts *ts); diff --git a/src/osmo-bsc/abis_rsl.c b/src/osmo-bsc/abis_rsl.c index c7e9821..fe7c480 100644 --- a/src/osmo-bsc/abis_rsl.c +++ b/src/osmo-bsc/abis_rsl.c @@ -279,8 +279,12 @@ const uint8_t *data, int len) { struct abis_rsl_dchan_hdr *dh; - struct msgb *msg = rsl_msgb_alloc(); - uint8_t chan_nr = gsm_lchan2chan_nr(lchan); + struct msgb *msg; + int chan_nr = gsm_lchan2chan_nr(lchan); + if (chan_nr < 0) + return chan_nr; + + msg = rsl_msgb_alloc(); dh = (struct abis_rsl_dchan_hdr *) msgb_put(msg, sizeof(*dh)); init_dchan_hdr(dh, RSL_MT_SACCH_INFO_MODIFY); @@ -299,7 +303,9 @@ { struct abis_rsl_dchan_hdr *dh; struct msgb *msg; - uint8_t chan_nr = gsm_lchan2chan_nr(lchan); + int chan_nr = gsm_lchan2chan_nr(lchan); + if (chan_nr < 0) + return chan_nr; db = abs(db); if (db > 30) @@ -329,7 +335,9 @@ { struct abis_rsl_dchan_hdr *dh; struct msgb *msg; - uint8_t chan_nr = gsm_lchan2chan_nr(lchan); + int chan_nr = gsm_lchan2chan_nr(lchan); + if (chan_nr < 0) + return chan_nr; LOG_LCHAN(lchan, LOGL_DEBUG, "Tx MS POWER CONTROL (ms_power_lvl=%" PRIu8 ")\n", lchan->ms_power); @@ -519,6 +527,9 @@ struct rsl_ie_chan_mode cm; struct gsm48_chan_desc cd; + int chan_nr = gsm_lchan2chan_nr(lchan); + if (chan_nr < 0) + return chan_nr; DEBUGP(DRSL, "%s Tx RSL Channel Activate with act_type=%s\n", gsm_ts_and_pchan_name(lchan->ts), @@ -536,13 +547,17 @@ } memset(&cd, 0, sizeof(cd)); - gsm48_lchan2chan_desc(&cd, lchan, lchan->activate.tsc); + rc = gsm48_lchan2chan_desc(&cd, lchan, lchan->activate.tsc); + if (rc) { + LOG_LCHAN(lchan, LOGL_ERROR, "Error encoding Channel Number\n"); + return rc; + } msg = rsl_msgb_alloc(); dh = (struct abis_rsl_dchan_hdr *) msgb_put(msg, sizeof(*dh)); init_dchan_hdr(dh, RSL_MT_CHAN_ACTIV); - dh->chan_nr = gsm_lchan2chan_nr(lchan); + dh->chan_nr = chan_nr; msgb_tv_put(msg, RSL_IE_ACT_TYPE, act_type); msgb_tlv_put(msg, RSL_IE_CHAN_MODE, sizeof(cm), @@ -648,10 +663,13 @@ struct msgb *msg; int rc; - uint8_t chan_nr = gsm_lchan2chan_nr(lchan); struct rsl_ie_chan_mode cm; struct gsm_bts *bts = lchan->ts->trx->bts; + int chan_nr = gsm_lchan2chan_nr(lchan); + if (chan_nr < 0) + return chan_nr; + rc = channel_mode_from_lchan(&cm, lchan, &lchan->modify.ch_mode_rate, lchan->modify.info.vamos); if (rc < 0) return rc; @@ -703,11 +721,14 @@ { struct abis_rsl_dchan_hdr *dh; struct gsm_lchan *lchan = msg->lchan; - uint8_t chan_nr = gsm_lchan2chan_nr(lchan); uint8_t encr_info[MAX_A5_KEY_LEN+2]; uint8_t l3_len = msg->len; int rc; + int chan_nr = gsm_lchan2chan_nr(lchan); + if (chan_nr < 0) + return chan_nr; + /* First push the L3 IE tag and length */ msgb_tv16_push(msg, RSL_IE_L3_INFO, l3_len); @@ -736,9 +757,13 @@ struct abis_rsl_dchan_hdr *dh; struct msgb *msg = rsl_msgb_alloc(); + int chan_nr = gsm_lchan2chan_nr(lchan); + if (chan_nr < 0) + return chan_nr; + dh = (struct abis_rsl_dchan_hdr *) msgb_put(msg, sizeof(*dh)); init_dchan_hdr(dh, RSL_MT_DEACTIVATE_SACCH); - dh->chan_nr = gsm_lchan2chan_nr(lchan); + dh->chan_nr = chan_nr; msg->lchan = lchan; msg->dst = rsl_chan_link(lchan); @@ -754,10 +779,14 @@ struct abis_rsl_dchan_hdr *dh; struct msgb *msg; + int chan_nr = gsm_lchan2chan_nr(lchan); + if (chan_nr < 0) + return chan_nr; + msg = rsl_msgb_alloc(); dh = (struct abis_rsl_dchan_hdr *) msgb_put(msg, sizeof(*dh)); init_dchan_hdr(dh, RSL_MT_RF_CHAN_REL); - dh->chan_nr = gsm_lchan2chan_nr(lchan); + dh->chan_nr = chan_nr; msg->lchan = lchan; msg->dst = rsl_chan_link(lchan); @@ -886,13 +915,19 @@ /* Send Siemens specific MS RF Power Capability Indication */ int rsl_siemens_mrpci(struct gsm_lchan *lchan, struct rsl_mrpci *mrpci) { - struct msgb *msg = rsl_msgb_alloc(); + struct msgb *msg; struct abis_rsl_dchan_hdr *dh; + int chan_nr = gsm_lchan2chan_nr(lchan); + if (chan_nr < 0) + return chan_nr; + + msg = rsl_msgb_alloc(); + dh = (struct abis_rsl_dchan_hdr *) msgb_put(msg, sizeof(*dh)); init_dchan_hdr(dh, RSL_MT_SIEMENS_MRPCI); dh->c.msg_discr = ABIS_RSL_MDISC_DED_CHAN; - dh->chan_nr = gsm_lchan2chan_nr(lchan); + dh->chan_nr = chan_nr; msgb_tv_put(msg, RSL_IE_SIEMENS_MRPCI, *(uint8_t *)mrpci); DEBUGP(DRSL, "%s TX Siemens MRPCI 0x%02x\n", @@ -908,13 +943,19 @@ /* Chapter 8.3.1 */ int rsl_data_request(struct msgb *msg, uint8_t link_id) { + int chan_nr = gsm_lchan2chan_nr(msg->lchan); + if (chan_nr < 0) { + msgb_free(msg); + return chan_nr; + } + if (msg->lchan == NULL) { LOGP(DRSL, LOGL_ERROR, "cannot send DATA REQUEST to unknown lchan\n"); + msgb_free(msg); return -EINVAL; } - rsl_rll_push_l3(msg, RSL_MT_DATA_REQ, gsm_lchan2chan_nr(msg->lchan), - link_id, 1); + rsl_rll_push_l3(msg, RSL_MT_DATA_REQ, chan_nr, link_id, 1); msg->dst = rsl_chan_link(msg->lchan); @@ -926,9 +967,11 @@ int rsl_establish_request(struct gsm_lchan *lchan, uint8_t link_id) { struct msgb *msg; + int chan_nr = gsm_lchan2chan_nr(lchan); + if (chan_nr < 0) + return chan_nr; - msg = rsl_rll_simple(RSL_MT_EST_REQ, gsm_lchan2chan_nr(lchan), - link_id, 0); + msg = rsl_rll_simple(RSL_MT_EST_REQ, chan_nr, link_id, 0); msg->dst = rsl_chan_link(lchan); DEBUGP(DRLL, "%s RSL RLL ESTABLISH REQ (link_id=0x%02x)\n", @@ -947,9 +990,11 @@ { struct msgb *msg; + int chan_nr = gsm_lchan2chan_nr(lchan); + if (chan_nr < 0) + return chan_nr; - msg = rsl_rll_simple(RSL_MT_REL_REQ, gsm_lchan2chan_nr(lchan), - link_id, 0); + msg = rsl_rll_simple(RSL_MT_REL_REQ, chan_nr, link_id, 0); /* 0 is normal release, 1 is local end */ msgb_tv_put(msg, RSL_IE_RELEASE_MODE, release_mode); @@ -1836,7 +1881,11 @@ ia->proto_discr = GSM48_PDISC_RR; ia->msg_type = GSM48_MT_RR_IMM_ASS; ia->page_mode = GSM48_PM_SAME; - gsm48_lchan2chan_desc(&ia->chan_desc, lchan, lchan->tsc); + rc = gsm48_lchan2chan_desc(&ia->chan_desc, lchan, lchan->tsc); + if (rc) { + LOG_LCHAN(lchan, LOGL_ERROR, "Error encoding Channel Number\n"); + return rc; + } /* use request reference extracted from CHAN_RQD */ memcpy(&ia->req_ref, lchan->rqd_ref, sizeof(ia->req_ref)); @@ -2275,13 +2324,19 @@ */ int rsl_tx_ipacc_crcx(const struct gsm_lchan *lchan) { - struct msgb *msg = rsl_msgb_alloc(); + struct msgb *msg; struct abis_rsl_dchan_hdr *dh; + int chan_nr = gsm_lchan2chan_nr(lchan); + if (chan_nr < 0) + return chan_nr; + + msg = rsl_msgb_alloc(); + dh = (struct abis_rsl_dchan_hdr *) msgb_put(msg, sizeof(*dh)); init_dchan_hdr(dh, RSL_MT_IPAC_CRCX); dh->c.msg_discr = ABIS_RSL_MDISC_IPACCESS; - dh->chan_nr = gsm_lchan2chan_nr(lchan); + dh->chan_nr = chan_nr; /* 0x1- == receive-only, 0x-1 == EFR codec */ msgb_tv_put(msg, RSL_IE_IPAC_SPEECH_MODE, lchan->abis_ip.speech_mode); @@ -2302,14 +2357,20 @@ */ struct msgb *rsl_make_ipacc_mdcx(const struct gsm_lchan *lchan, uint32_t dest_ip, uint16_t dest_port) { - struct msgb *msg = rsl_msgb_alloc(); + struct msgb *msg; struct abis_rsl_dchan_hdr *dh; uint32_t *att_ip; + int chan_nr = gsm_lchan2chan_nr(lchan); + if (chan_nr < 0) + return NULL; + + msg = rsl_msgb_alloc(); + dh = (struct abis_rsl_dchan_hdr *) msgb_put(msg, sizeof(*dh)); init_dchan_hdr(dh, RSL_MT_IPAC_MDCX); dh->c.msg_discr = ABIS_RSL_MDISC_IPACCESS; - dh->chan_nr = gsm_lchan2chan_nr(lchan); + dh->chan_nr = chan_nr; msgb_tv16_put(msg, RSL_IE_IPAC_CONN_ID, lchan->abis_ip.conn_id); msgb_v_put(msg, RSL_IE_IPAC_REMOTE_IP); @@ -2334,6 +2395,9 @@ { struct msgb *msg = rsl_make_ipacc_mdcx(lchan, lchan->abis_ip.connect_ip, lchan->abis_ip.connect_port); + if (!msg) + return -EINVAL; + LOG_LCHAN(lchan, LOGL_DEBUG, "Sending IPACC MDCX to BTS:" " %s:%u rtp_payload=%u rtp_payload2=%u conn_id=%u speech_mode=0x%02x\n", ip_to_a(lchan->abis_ip.connect_ip), @@ -2525,13 +2589,19 @@ /*! Tx simplified channel (de-)activation message for non-standard ip.access dyn TS PDCH type. */ static int send_ipacc_style_pdch_act(struct gsm_bts_trx_ts *ts, bool activate) { - struct msgb *msg = rsl_msgb_alloc(); + struct msgb *msg; struct abis_rsl_dchan_hdr *dh; + int chan_nr = gsm_pchan2chan_nr(GSM_PCHAN_TCH_F, ts->nr, 0); + if (chan_nr < 0) + return chan_nr; + + msg = rsl_msgb_alloc(); + dh = (struct abis_rsl_dchan_hdr *) msgb_put(msg, sizeof(*dh)); init_dchan_hdr(dh, activate ? RSL_MT_IPAC_PDCH_ACT : RSL_MT_IPAC_PDCH_DEACT); dh->c.msg_discr = ABIS_RSL_MDISC_DED_CHAN; - dh->chan_nr = gsm_pchan2chan_nr(GSM_PCHAN_TCH_F, ts->nr, 0); + dh->chan_nr = chan_nr; msg->dst = ts->trx->rsl_link_primary; return abis_rsl_sendmsg(msg); diff --git a/src/osmo-bsc/gsm_04_08_rr.c b/src/osmo-bsc/gsm_04_08_rr.c index 7cc5664..dc6434b 100644 --- a/src/osmo-bsc/gsm_04_08_rr.c +++ b/src/osmo-bsc/gsm_04_08_rr.c @@ -546,7 +546,10 @@ /* mandatory bits */ gsm48_cell_desc(&ho->cell_desc, new_lchan->ts->trx->bts); - gsm48_lchan2chan_desc(&ho->chan_desc, new_lchan, gsm_ts_tsc(new_lchan->ts)); + if (gsm48_lchan2chan_desc(&ho->chan_desc, new_lchan, gsm_ts_tsc(new_lchan->ts))) { + msgb_free(msg); + return NULL; + } ho->ho_ref = ho_ref; ho->power_command = power_command; @@ -597,6 +600,7 @@ /* Chapter 9.1.2: Assignment Command */ int gsm48_send_rr_ass_cmd(struct gsm_lchan *current_lchan, struct gsm_lchan *new_lchan, uint8_t power_command) { + int rc; struct msgb *msg = gsm48_msgb_alloc_name("GSM 04.08 ASS CMD"); struct gsm48_hdr *gh = (struct gsm48_hdr *) msgb_put(msg, sizeof(*gh)); struct gsm48_ass_cmd *ass = @@ -618,7 +622,11 @@ * the chan_desc. But as long as multi-slot configurations * are not used we seem to be fine. */ - gsm48_lchan2chan_desc(&ass->chan_desc, new_lchan, new_lchan->tsc); + rc = gsm48_lchan2chan_desc(&ass->chan_desc, new_lchan, new_lchan->tsc); + if (rc) { + msgb_free(msg); + return rc; + } ass->power_command = power_command; /* Cell Channel Description (freq. hopping), TV (see 3GPP TS 44.018, 10.5.2.1b) */ @@ -682,6 +690,7 @@ /* 9.1.5 Channel mode modify: Modify the mode on the MS side */ int gsm48_lchan_modify(struct gsm_lchan *lchan, uint8_t mode) { + int rc; struct msgb *msg = gsm48_msgb_alloc_name("GSM 04.08 CHN MOD"); struct gsm48_hdr *gh = (struct gsm48_hdr *) msgb_put(msg, sizeof(*gh)); struct gsm48_chan_mode_modify *cmm = @@ -694,7 +703,11 @@ gh->proto_discr = GSM48_PDISC_RR; gh->msg_type = GSM48_MT_RR_CHAN_MODE_MODIF; - gsm48_lchan2chan_desc(&cmm->chan_desc, lchan, lchan->modify.tsc); + rc = gsm48_lchan2chan_desc(&cmm->chan_desc, lchan, lchan->modify.tsc); + if (rc) { + msgb_free(msg); + return rc; + } cmm->mode = mode; /* in case of multi rate we need to attach a config */ diff --git a/src/osmo-bsc/gsm_data.c b/src/osmo-bsc/gsm_data.c index c43fbe9..ecbf7b9 100644 --- a/src/osmo-bsc/gsm_data.c +++ b/src/osmo-bsc/gsm_data.c @@ -495,23 +495,26 @@ } /* See Table 10.5.25 of GSM04.08 */ -uint8_t gsm_pchan2chan_nr(enum gsm_phys_chan_config pchan, - uint8_t ts_nr, uint8_t lchan_nr) +int gsm_pchan2chan_nr(enum gsm_phys_chan_config pchan, + uint8_t ts_nr, uint8_t lchan_nr) { uint8_t cbits, chan_nr; switch (pchan) { case GSM_PCHAN_TCH_F: case GSM_PCHAN_TCH_F_PDCH: - OSMO_ASSERT(lchan_nr == 0); + if (lchan_nr != 0) + return -EINVAL; cbits = 0x01; break; case GSM_PCHAN_PDCH: - OSMO_ASSERT(lchan_nr == 0); + if (lchan_nr != 0) + return -EINVAL; cbits = RSL_CHAN_OSMO_PDCH >> 3; break; case GSM_PCHAN_TCH_H: - OSMO_ASSERT(lchan_nr < 2); + if (lchan_nr > 1) + return -EINVAL; cbits = 0x02; cbits += lchan_nr; break; @@ -525,19 +528,21 @@ if (lchan_nr == CCCH_LCHAN) chan_nr = 0; else - OSMO_ASSERT(lchan_nr < 4); + return -EINVAL; cbits = 0x04; cbits += lchan_nr; break; case GSM_PCHAN_SDCCH8_SACCH8C: case GSM_PCHAN_SDCCH8_SACCH8C_CBCH: - OSMO_ASSERT(lchan_nr < 8); + if (lchan_nr > 7) + return -EINVAL; cbits = 0x08; cbits += lchan_nr; break; default: case GSM_PCHAN_CCCH: - OSMO_ASSERT(lchan_nr == 0); + if (lchan_nr != 0) + return -EINVAL; cbits = 0x10; break; } @@ -547,15 +552,23 @@ return chan_nr; } -uint8_t gsm_lchan2chan_nr(const struct gsm_lchan *lchan) +int gsm_lchan2chan_nr(const struct gsm_lchan *lchan) { + int rc; uint8_t lchan_nr = lchan->nr; /* The VAMOS lchans are behind the primary ones in the ts->lchan[] array. They keep their lchan->nr as in the * array, but on the wire they are the "shadow" lchans for the primary lchans. For example, for TCH/F, there is * a primary ts->lchan[0] and a VAMOS ts->lchan[1]. Still, the VAMOS lchan should send chan_nr = 0. */ if (lchan->vamos.is_secondary) lchan_nr -= lchan->ts->max_primary_lchans; - return gsm_pchan2chan_nr(lchan->ts->pchan_is, lchan->ts->nr, lchan_nr); + rc = gsm_pchan2chan_nr(lchan->ts->pchan_is, lchan->ts->nr, lchan_nr); + /* Log an error so that we don't need to add logging to each caller of this function */ + if (rc) + LOG_LCHAN(lchan, LOGL_ERROR, + "Error encoding Channel Number: pchan %s ts %u ss %u%s\n", + gsm_pchan_name(lchan->ts->pchan_from_config), lchan->ts->nr, lchan->nr, + lchan->vamos.is_secondary ? " (VAMOS shadow)" : ""); + return rc; } static const uint8_t subslots_per_pchan[] = { @@ -677,23 +690,40 @@ } } -void gsm48_lchan2chan_desc(struct gsm48_chan_desc *cd, - const struct gsm_lchan *lchan, - uint8_t tsc) +int gsm48_lchan2chan_desc(struct gsm48_chan_desc *cd, + const struct gsm_lchan *lchan, + uint8_t tsc) { - cd->chan_nr = gsm_lchan2chan_nr(lchan); + int chan_nr = gsm_lchan2chan_nr(lchan); + if (chan_nr < 0) { + /* Log an error so that we don't need to add logging to each caller of this function */ + LOG_LCHAN(lchan, LOGL_ERROR, "Error encoding Channel Number\n"); + return chan_nr; + } + cd->chan_nr = chan_nr; _chan_desc_fill_tail(cd, lchan, tsc); + return 0; } /* like gsm48_lchan2chan_desc() above, but use ts->pchan_from_config to * return a channel description based on what is configured, rather than * what the current state of the pchan type is */ -void gsm48_lchan2chan_desc_as_configured(struct gsm48_chan_desc *cd, - const struct gsm_lchan *lchan, - uint8_t tsc) +int gsm48_lchan2chan_desc_as_configured(struct gsm48_chan_desc *cd, + const struct gsm_lchan *lchan, + uint8_t tsc) { - cd->chan_nr = gsm_pchan2chan_nr(lchan->ts->pchan_from_config, lchan->ts->nr, lchan->nr); + int chan_nr = gsm_pchan2chan_nr(lchan->ts->pchan_from_config, lchan->ts->nr, lchan->nr); + if (chan_nr < 0) { + /* Log an error so that we don't need to add logging to each caller of this function */ + LOG_LCHAN(lchan, LOGL_ERROR, + "Error encoding Channel Number: pchan %s ts %u ss %u%s (rc = %d)\n", + gsm_pchan_name(lchan->ts->pchan_from_config), lchan->ts->nr, lchan->nr, + lchan->vamos.is_secondary ? " (VAMOS shadow)" : "", chan_nr); + return chan_nr; + } + cd->chan_nr = chan_nr; _chan_desc_fill_tail(cd, lchan, tsc); + return 0; } uint8_t gsm_ts_tsc(const struct gsm_bts_trx_ts *ts) diff --git a/src/osmo-bsc/lcs_loc_req.c b/src/osmo-bsc/lcs_loc_req.c index ee85c91..94c4e3b 100644 --- a/src/osmo-bsc/lcs_loc_req.c +++ b/src/osmo-bsc/lcs_loc_req.c @@ -369,7 +369,10 @@ .cause = BSSLAP_CAUSE_INTRA_BSS_HO, }, }; - gsm48_lchan2chan_desc(&apdu->reset.chan_desc, lchan, lchan->tsc); + if (gsm48_lchan2chan_desc(&apdu->reset.chan_desc, lchan, lchan->tsc)) { + lcs_loc_req_fail(LCS_CAUSE_SYSTEM_FAILURE, "Error encoding Channel Number"); + return; + } } lcs_loc_req_send(lcs_loc_req, &bsslap); diff --git a/src/osmo-bsc/osmo_bsc_lcls.c b/src/osmo-bsc/osmo_bsc_lcls.c index 2c90d01..542bbf5 100644 --- a/src/osmo-bsc/osmo_bsc_lcls.c +++ b/src/osmo-bsc/osmo_bsc_lcls.c @@ -243,13 +243,19 @@ uint32_t ip = enable ? conn->lcls.other->lchan->abis_ip.bound_ip : lchan->abis_ip.connect_ip; /* RSL_IE_IPAC_REMOTE_PORT */ uint16_t port = enable ? conn->lcls.other->lchan->abis_ip.bound_port : lchan->abis_ip.connect_port; + struct msgb *msg; if (!conn->lcls.other) { LOGPFSM(conn->lcls.fi, "%s LCLS: other conn is not available!\n", enable ? "enable" : "disable"); return; } - abis_rsl_sendmsg(rsl_make_ipacc_mdcx(lchan, ip, port)); + msg = rsl_make_ipacc_mdcx(lchan, ip, port); + if (!msg) { + LOGPFSML(conn->lcls.fi, LOGL_ERROR, "Error encoding IPACC MDCX\n"); + return; + } + abis_rsl_sendmsg(msg); } static inline bool lcls_check_toggle_allowed(const struct gsm_subscriber_connection *conn, bool enable) diff --git a/src/osmo-bsc/system_information.c b/src/osmo-bsc/system_information.c index 21cbcae..e8b3b7d 100644 --- a/src/osmo-bsc/system_information.c +++ b/src/osmo-bsc/system_information.c @@ -1018,7 +1018,8 @@ struct gsm48_chan_desc cd; /* 10.5.2.5 (TV) CBCH Channel Description IE */ - gsm48_lchan2chan_desc_as_configured(&cd, cbch_lchan, gsm_ts_tsc(cbch_lchan->ts)); + if (gsm48_lchan2chan_desc_as_configured(&cd, cbch_lchan, gsm_ts_tsc(cbch_lchan->ts))) + return -EINVAL; tail = tv_fixed_put(tail, GSM48_IE_CBCH_CHAN_DESC, sizeof(cd), (uint8_t *) &cd); l2_plen += 1 + sizeof(cd); diff --git a/tests/handover/handover_test.c b/tests/handover/handover_test.c index e653920..b741e25 100644 --- a/tests/handover/handover_test.c +++ b/tests/handover/handover_test.c @@ -100,10 +100,11 @@ { struct msgb *msg = msgb_alloc_headroom(256, 64, "RSL"); struct abis_rsl_dchan_hdr *dh; - uint8_t chan_nr = gsm_lchan2chan_nr(lchan); uint8_t ulm[3], l1i[2], *buf; struct gsm48_hdr *gh; struct gsm48_meas_res *mr; + int chan_nr = gsm_lchan2chan_nr(lchan); + OSMO_ASSERT(chan_nr >= 0); dh = (struct abis_rsl_dchan_hdr *) msgb_put(msg, sizeof(*dh)); dh->c.msg_discr = ABIS_RSL_MDISC_DED_CHAN; -- To view, visit https://gerrit.osmocom.org/c/osmo-bsc/+/24524 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-bsc Gerrit-Branch: master Gerrit-Change-Id: I71ed6437c403a3f9336e17a94b4948fca295d853 Gerrit-Change-Number: 24524 Gerrit-PatchSet: 1 Gerrit-Owner: neels <nhofmeyr at sysmocom.de> Gerrit-MessageType: newchange -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20210602/028ca9bf/attachment.htm>