<p>daniel has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-gbproxy/+/22876">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gbproxy: Use bssgp2_enc_status when sending STATUS<br><br>bssgp_tx_status() is not aware of the MTU and cannot truncate the PDU if<br>needed. Use the newer bssgp2_enc_status() which supports truncating the<br>PDU.<br><br>Related: OS#4889<br>Change-Id: Id5ddb10385655b339b2a4f04651c1da09b3efb62<br>---<br>M src/gb_proxy.c<br>1 file changed, 66 insertions(+), 44 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-gbproxy refs/changes/76/22876/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/gb_proxy.c b/src/gb_proxy.c</span><br><span>index 8b57315..a226b93 100644</span><br><span>--- a/src/gb_proxy.c</span><br><span>+++ b/src/gb_proxy.c</span><br><span>@@ -84,9 +84,25 @@</span><br><span> static int gbprox_relay2peer(struct msgb *old_msg, struct gbproxy_bvc *bvc,</span><br><span> uint16_t ns_bvci);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int tx_status(struct gbproxy_nse *nse, uint16_t ns_bvci, enum gprs_bssgp_cause cause, const uint16_t *bvci, const struct msgb *old_msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* generate BVC-STATUS message with cause value derived from TLV-parser error */</span><br><span style="color: hsl(0, 100%, 40%);">-static int tx_status_from_tlvp(enum osmo_tlv_parser_error tlv_p_err, struct msgb *orig_msg)</span><br><span style="color: hsl(120, 100%, 40%);">+ struct msgb *msg = bssgp2_enc_status(cause, bvci, old_msg, nse->mtu);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!msg) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPNSE(nse, LOGL_NOTICE, "Unable to encode STATUS message\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return -ENOMEM;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = bssgp2_nsi_tx_ptp(nse->cfg->nsi, nse->nsei, ns_bvci, msg, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPNSE(nse, LOGL_NOTICE, "Unable to send STATUS message\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* generate BVC-STATUS mess</span><br><span style="color: hsl(120, 100%, 40%);">+age with cause value derived from TLV-parser error */</span><br><span style="color: hsl(120, 100%, 40%);">+static int tx_status_from_tlvp(struct gbproxy_nse *nse, enum osmo_tlv_parser_error tlv_p_err, struct msgb *orig_msg)</span><br><span> {</span><br><span> uint8_t bssgp_cause;</span><br><span> switch (tlv_p_err) {</span><br><span>@@ -96,7 +112,7 @@</span><br><span> default:</span><br><span> bssgp_cause = BSSGP_CAUSE_PROTO_ERR_UNSPEC;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(bssgp_cause, NULL, orig_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, msgb_bvci(orig_msg), bssgp_cause, NULL, orig_msg);</span><br><span> }</span><br><span> </span><br><span> /* strip off the NS header */</span><br><span>@@ -380,31 +396,31 @@</span><br><span> </span><br><span> if (ns_bvci == 0 || ns_bvci == 1) {</span><br><span> LOGP(DGPRS, LOGL_NOTICE, "%s BVCI=%05u is not PTP\n", log_pfx, ns_bvci);</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);</span><br><span> }</span><br><span> </span><br><span> if (!(bssgp_pdu_type_flags(bgph->pdu_type) & BSSGP_PDUF_PTP)) {</span><br><span> LOGP(DGPRS, LOGL_NOTICE, "%s %s not allowed in PTP BVC\n", log_pfx, pdut_name);</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);</span><br><span> }</span><br><span> </span><br><span> if (!(bssgp_pdu_type_flags(bgph->pdu_type) & BSSGP_PDUF_UL)) {</span><br><span> LOGP(DGPRS, LOGL_NOTICE, "%s %s not allowed in uplink direction\n", log_pfx, pdut_name);</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);</span><br><span> }</span><br><span> </span><br><span> bss_bvc = gbproxy_bvc_by_bvci(nse, ns_bvci);</span><br><span> if (!bss_bvc) {</span><br><span> LOGP(DGPRS, LOGL_NOTICE, "%s %s - Didn't find BVC for PTP message, discarding\n",</span><br><span> log_pfx, pdut_name);</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_UNKNOWN_BVCI, &ns_bvci, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_UNKNOWN_BVCI, &ns_bvci, msg);</span><br><span> }</span><br><span> </span><br><span> /* UL_UNITDATA has a different header than all other uplink PDUs */</span><br><span> if (bgph->pdu_type == BSSGP_PDUT_UL_UNITDATA) {</span><br><span> const struct bssgp_ud_hdr *budh = (struct bssgp_ud_hdr *) msgb_bssgph(msg);</span><br><span> if (msgb_bssgp_len(msg) < sizeof(*budh))</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_INV_MAND_INF, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_INV_MAND_INF, NULL, msg);</span><br><span> rc = osmo_tlv_prot_parse(&osmo_pdef_bssgp, &tp, 1, bgph->pdu_type, budh->data,</span><br><span> msgb_bssgp_len(msg) - sizeof(*budh), 0, 0, DGPRS, log_pfx);</span><br><span> /* populate TLLI from the fixed headser into the TLV-parsed array so later code</span><br><span>@@ -417,7 +433,7 @@</span><br><span> }</span><br><span> if (rc < 0) {</span><br><span> rate_ctr_inc(&nse->cfg->ctrg->ctr[GBPROX_GLOB_CTR_PROTO_ERR_BSS]);</span><br><span style="color: hsl(0, 100%, 40%);">- return tx_status_from_tlvp(rc, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status_from_tlvp(nse, rc, msg);</span><br><span> }</span><br><span> /* hack to get both msg + tlv_parsed passed via osmo_fsm_inst_dispatch */</span><br><span> msgb_bcid(msg) = (void *)&tp;</span><br><span>@@ -505,17 +521,17 @@</span><br><span> </span><br><span> if (ns_bvci == 0 || ns_bvci == 1) {</span><br><span> LOGP(DGPRS, LOGL_NOTICE, "%s BVCI is not PTP\n", log_pfx);</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);</span><br><span> }</span><br><span> </span><br><span> if (!(bssgp_pdu_type_flags(bgph->pdu_type) & BSSGP_PDUF_PTP)) {</span><br><span> LOGP(DGPRS, LOGL_NOTICE, "%s %s not allowed in PTP BVC\n", log_pfx, pdut_name);</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);</span><br><span> }</span><br><span> </span><br><span> if (!(bssgp_pdu_type_flags(bgph->pdu_type) & BSSGP_PDUF_DL)) {</span><br><span> LOGP(DGPRS, LOGL_NOTICE, "%s %s not allowed in downlink direction\n", log_pfx, pdut_name);</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);</span><br><span> }</span><br><span> </span><br><span> sgsn_bvc = gbproxy_bvc_by_bvci(nse, ns_bvci);</span><br><span>@@ -523,20 +539,20 @@</span><br><span> LOGP(DGPRS, LOGL_NOTICE, "%s %s - Didn't find BVC for for PTP message, discarding\n",</span><br><span> log_pfx, pdut_name);</span><br><span> rate_ctr_inc(&nse->cfg->ctrg-> ctr[GBPROX_GLOB_CTR_INV_BVCI]);</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_UNKNOWN_BVCI, &ns_bvci, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_UNKNOWN_BVCI, &ns_bvci, msg);</span><br><span> }</span><br><span> </span><br><span> if (!bssgp_bvc_fsm_is_unblocked(sgsn_bvc->fi)) {</span><br><span> LOGPBVC(sgsn_bvc, LOGL_NOTICE, "Rx %s: Dropping on blocked BVC\n", pdut_name);</span><br><span> rate_ctr_inc(&sgsn_bvc->ctrg->ctr[GBPROX_PEER_CTR_DROPPED]);</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_BVCI_BLOCKED, &ns_bvci, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_BVCI_BLOCKED, &ns_bvci, msg);</span><br><span> }</span><br><span> </span><br><span> /* DL_UNITDATA has a different header than all other uplink PDUs */</span><br><span> if (bgph->pdu_type == BSSGP_PDUT_DL_UNITDATA) {</span><br><span> const struct bssgp_ud_hdr *budh = (struct bssgp_ud_hdr *) msgb_bssgph(msg);</span><br><span> if (msgb_bssgp_len(msg) < sizeof(*budh))</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_INV_MAND_INF, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_INV_MAND_INF, NULL, msg);</span><br><span> rc = osmo_tlv_prot_parse(&osmo_pdef_bssgp, &tp, 1, bgph->pdu_type, budh->data,</span><br><span> msgb_bssgp_len(msg) - sizeof(*budh), 0, 0, DGPRS, log_pfx);</span><br><span> /* populate TLLI from the fixed headser into the TLV-parsed array so later code</span><br><span>@@ -549,7 +565,7 @@</span><br><span> }</span><br><span> if (rc < 0) {</span><br><span> rate_ctr_inc(&nse->cfg->ctrg->ctr[GBPROX_GLOB_CTR_PROTO_ERR_BSS]);</span><br><span style="color: hsl(0, 100%, 40%);">- return tx_status_from_tlvp(rc, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status_from_tlvp(nse, rc, msg);</span><br><span> }</span><br><span> /* hack to get both msg + tlv_parsed passed via osmo_fsm_inst_dispatch */</span><br><span> msgb_bcid(msg) = (void *)&tp;</span><br><span>@@ -855,7 +871,7 @@</span><br><span> if (!nse_new) {</span><br><span> LOGP(DGPRS, LOGL_NOTICE, "NSE(%05u) Got PtP BVC reset before signalling reset for "</span><br><span> "BVCI=%05u\n", bvci, nsei);</span><br><span style="color: hsl(0, 100%, 40%);">- bssgp_tx_status(BSSGP_CAUSE_PDU_INCOMP_STATE, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ tx_status(nse, ns_bvci, BSSGP_CAUSE_PDU_INCOMP_STATE, NULL, msg);</span><br><span> return 0;</span><br><span> }</span><br><span> </span><br><span>@@ -892,25 +908,26 @@</span><br><span> int rc;</span><br><span> char ri_src_str[64];</span><br><span> char ri_dest_str[64];</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t ns_bvci = msgb_bvci(msg);</span><br><span> </span><br><span> rc = bssgp_parse_rim_ri(&dest_ri, TLVP_VAL(&tp[0], BSSGP_IE_RIM_ROUTING_INFO),</span><br><span> TLVP_LEN(&tp[0], BSSGP_IE_RIM_ROUTING_INFO));</span><br><span> if (rc < 0) {</span><br><span> LOGP(DGPRS, LOGL_ERROR, "%s %s cannot parse destination RIM routing info\n", log_pfx, pdut_name);</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_INV_MAND_INF, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_INV_MAND_INF, NULL, msg);</span><br><span> }</span><br><span> rc = bssgp_parse_rim_ri(&src_ri, TLVP_VAL(&tp[1], BSSGP_IE_RIM_ROUTING_INFO),</span><br><span> TLVP_LEN(&tp[1], BSSGP_IE_RIM_ROUTING_INFO));</span><br><span> if (rc < 0) {</span><br><span> LOGP(DGPRS, LOGL_ERROR, "%s %s cannot parse source RIM routing info\n", log_pfx, pdut_name);</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_INV_MAND_INF, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_INV_MAND_INF, NULL, msg);</span><br><span> }</span><br><span> </span><br><span> /* Since gbproxy is 2G only we do not expect to get RIM messages only from GERAN cells. */</span><br><span> if (src_ri.discr != BSSGP_RIM_ROUTING_INFO_GERAN) {</span><br><span> LOGP(DGPRS, LOGL_ERROR, "%s %s source RIM routing info is not GERAN (%s)\n", log_pfx, pdut_name,</span><br><span> bssgp_rim_ri_name(&src_ri));</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_UNKN_RIM_AI, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_UNKN_RIM_AI, NULL, msg);</span><br><span> }</span><br><span> </span><br><span> /* Lookup source cell to make sure that the source RIM routing information actually belongs</span><br><span>@@ -919,7 +936,7 @@</span><br><span> if (!src_cell) {</span><br><span> LOGP(DGPRS, LOGL_NOTICE, "%s %s cannot find cell for source RIM routing info (%s)\n", log_pfx,</span><br><span> pdut_name, bssgp_rim_ri_name(&src_ri));</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_UNKN_RIM_AI, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_UNKN_RIM_AI, NULL, msg);</span><br><span> }</span><br><span> </span><br><span> /* TODO: Use bssgp_bvc_get_features_negotiated(src_cell->bss_bvc->fi) to check if the the BSS sided BVC actually</span><br><span>@@ -949,7 +966,7 @@</span><br><span> LOGP(DGPRS, LOGL_NOTICE,</span><br><span> "%s %s cannot route RIM message (%s to %s) since no RIM capable SGSN is found!\n", log_pfx,</span><br><span> pdut_name, bssgp_rim_ri_name(&src_ri), bssgp_rim_ri_name(&dest_ri));</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_UNKN_RIM_AI, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_UNKN_RIM_AI, NULL, msg);</span><br><span> }</span><br><span> LOGP(DLBSSGP, LOGL_DEBUG, "%s %s relaying to SGSN(%05u/%s) RIM-PDU: src=%s, dest=%s\n",</span><br><span> log_pfx, pdut_name, sgsn->nse->nsei, sgsn->name,</span><br><span>@@ -979,24 +996,24 @@</span><br><span> </span><br><span> if (ns_bvci != 0 && ns_bvci != 1) {</span><br><span> LOGP(DGPRS, LOGL_NOTICE, "%s %s BVCI=%05u is not signalling\n", log_pfx, pdut_name, ns_bvci);</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);</span><br><span> }</span><br><span> </span><br><span> if (!(bssgp_pdu_type_flags(pdu_type) & BSSGP_PDUF_SIG)) {</span><br><span> LOGP(DGPRS, LOGL_NOTICE, "%s %s not allowed in signalling BVC\n", log_pfx, pdut_name);</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);</span><br><span> }</span><br><span> </span><br><span> if (!(bssgp_pdu_type_flags(pdu_type) & BSSGP_PDUF_UL)) {</span><br><span> LOGP(DGPRS, LOGL_NOTICE, "%s %s not allowed in uplink direction\n", log_pfx, pdut_name);</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);</span><br><span> }</span><br><span> </span><br><span> rc = osmo_tlv_prot_parse(&osmo_pdef_bssgp, tp, ARRAY_SIZE(tp), pdu_type, bgph->data, data_len, 0, 0,</span><br><span> DGPRS, log_pfx);</span><br><span> if (rc < 0) {</span><br><span> rate_ctr_inc(&nse->cfg->ctrg->ctr[GBPROX_GLOB_CTR_PROTO_ERR_BSS]);</span><br><span style="color: hsl(0, 100%, 40%);">- return tx_status_from_tlvp(rc, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status_from_tlvp(nse, rc, msg);</span><br><span> }</span><br><span> /* hack to get both msg + tlv_parsed passed via osmo_fsm_inst_dispatch */</span><br><span> msgb_bcid(msg) = (void *)tp;</span><br><span>@@ -1079,7 +1096,7 @@</span><br><span> osmo_mobile_identity_decode(&mi, mi_data, mi_len, false);</span><br><span> nse = gbproxy_nse_by_imsi(nse->cfg, mi.imsi);</span><br><span> if (!nse) {</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_INV_MAND_INF, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_INV_MAND_INF, NULL, msg);</span><br><span> }</span><br><span> OSMO_ASSERT(nse->sgsn_facing);</span><br><span> rc = gbprox_relay2nse(msg, nse, 0);</span><br><span>@@ -1094,7 +1111,7 @@</span><br><span> err_no_bvc:</span><br><span> LOGPNSE(nse, LOGL_ERROR, "Rx %s: cannot find BVC for BVCI=%05u\n", pdut_name, ptp_bvci);</span><br><span> rate_ctr_inc(&nse->cfg->ctrg->ctr[GBPROX_GLOB_CTR_INV_NSEI]);</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_INV_MAND_INF, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_INV_MAND_INF, NULL, msg);</span><br><span> }</span><br><span> </span><br><span> /* Receive paging request from SGSN, we need to relay to proper BSS */</span><br><span>@@ -1198,7 +1215,7 @@</span><br><span> if (!from_bvc) {</span><br><span> LOGPNSE(nse, LOGL_ERROR, "Rx BVC-RESET BVCI=%05u: Cannot find BVC\n", ptp_bvci);</span><br><span> rate_ctr_inc(&nse->cfg->ctrg->ctr[GBPROX_GLOB_CTR_INV_BVCI]);</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_UNKNOWN_BVCI, &ptp_bvci, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_UNKNOWN_BVCI, &ptp_bvci, msg);</span><br><span> }</span><br><span> osmo_fsm_inst_dispatch(from_bvc->fi, BSSGP_BVCFSM_E_RX_RESET, msg);</span><br><span> }</span><br><span>@@ -1217,6 +1234,7 @@</span><br><span> int rc;</span><br><span> char ri_src_str[64];</span><br><span> char ri_dest_str[64];</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t ns_bvci = msgb_bvci(msg);</span><br><span> </span><br><span> /* TODO: Reply with STATUS if BSSGP didn't negotiate RIM feature, see also comments in</span><br><span> gbprox_rx_rim_from_bss() */</span><br><span>@@ -1225,20 +1243,20 @@</span><br><span> TLVP_LEN(&tp[0], BSSGP_IE_RIM_ROUTING_INFO));</span><br><span> if (rc < 0) {</span><br><span> LOGP(DGPRS, LOGL_ERROR, "%s %s cannot parse destination RIM routing info\n", log_pfx, pdut_name);</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_INV_MAND_INF, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_INV_MAND_INF, NULL, msg);</span><br><span> }</span><br><span> rc = bssgp_parse_rim_ri(&src_ri, TLVP_VAL(&tp[1], BSSGP_IE_RIM_ROUTING_INFO),</span><br><span> TLVP_LEN(&tp[1], BSSGP_IE_RIM_ROUTING_INFO));</span><br><span> if (rc < 0) {</span><br><span> LOGP(DGPRS, LOGL_ERROR, "%s %s cannot parse source RIM routing info\n", log_pfx, pdut_name);</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_INV_MAND_INF, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_INV_MAND_INF, NULL, msg);</span><br><span> }</span><br><span> </span><br><span> /* Since gbproxy is 2G only we do not expect to get RIM messages that target non-GERAN cells. */</span><br><span> if (dest_ri.discr != BSSGP_RIM_ROUTING_INFO_GERAN) {</span><br><span> LOGP(DGPRS, LOGL_ERROR, "%s %s destination RIM routing info is not GERAN (%s)\n", log_pfx, pdut_name,</span><br><span> bssgp_rim_ri_name(&dest_ri));</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_UNKN_RIM_AI, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_UNKN_RIM_AI, NULL, msg);</span><br><span> }</span><br><span> </span><br><span> /* Lookup destination cell */</span><br><span>@@ -1246,7 +1264,7 @@</span><br><span> if (!dest_cell) {</span><br><span> LOGP(DGPRS, LOGL_NOTICE, "%s %s cannot find cell for destination RIM routing info (%s)\n", log_pfx,</span><br><span> pdut_name, bssgp_rim_ri_name(&dest_ri));</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_UNKN_RIM_AI, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_UNKN_RIM_AI, NULL, msg);</span><br><span> }</span><br><span> </span><br><span> /* TODO: Check if the BVC of the destination cell actually did negotiate RIM support, see also comments</span><br><span>@@ -1285,17 +1303,17 @@</span><br><span> </span><br><span> if (ns_bvci != 0 && ns_bvci != 1) {</span><br><span> LOGP(DGPRS, LOGL_NOTICE, "%s BVCI=%05u is not signalling\n", log_pfx, ns_bvci);</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);</span><br><span> }</span><br><span> </span><br><span> if (!(bssgp_pdu_type_flags(pdu_type) & BSSGP_PDUF_SIG)) {</span><br><span> LOGP(DGPRS, LOGL_NOTICE, "%s %s not allowed in signalling BVC\n", log_pfx, pdut_name);</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);</span><br><span> }</span><br><span> </span><br><span> if (!(bssgp_pdu_type_flags(pdu_type) & BSSGP_PDUF_DL)) {</span><br><span> LOGP(DGPRS, LOGL_NOTICE, "%s %s not allowed in downlink direction\n", log_pfx, pdut_name);</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);</span><br><span> }</span><br><span> </span><br><span> data_len = msgb_bssgp_len(msg) - sizeof(*bgph);</span><br><span>@@ -1303,7 +1321,7 @@</span><br><span> rc = osmo_tlv_prot_parse(&osmo_pdef_bssgp, tp, ARRAY_SIZE(tp), pdu_type, bgph->data, data_len, 0, 0,</span><br><span> DGPRS, log_pfx);</span><br><span> if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- rc = tx_status_from_tlvp(rc, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = tx_status_from_tlvp(nse, rc, msg);</span><br><span> rate_ctr_inc(&cfg->ctrg->ctr[GBPROX_GLOB_CTR_PROTO_ERR_SGSN]);</span><br><span> return rc;</span><br><span> }</span><br><span>@@ -1393,7 +1411,7 @@</span><br><span> if (!nse_peer) {</span><br><span> LOGPNSE(nse, LOGL_ERROR, "Rx %s: Cannot find NSE\n", pdut_name);</span><br><span> /* TODO: Counter */</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_INV_MAND_INF, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_INV_MAND_INF, NULL, msg);</span><br><span> }</span><br><span> /* Delete the entry after we're done */</span><br><span> gbproxy_tlli_cache_remove(cfg, tlli);</span><br><span>@@ -1418,7 +1436,7 @@</span><br><span> default:</span><br><span> LOGPNSE(nse, LOGL_NOTICE, "Rx %s: Not supported\n", pdut_name);</span><br><span> rate_ctr_inc(&cfg->ctrg->ctr[GBPROX_GLOB_CTR_PROTO_ERR_SGSN]);</span><br><span style="color: hsl(0, 100%, 40%);">- rc = bssgp_tx_status(BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = tx_status(nse, ns_bvci, BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);</span><br><span> break;</span><br><span> }</span><br><span> </span><br><span>@@ -1427,7 +1445,7 @@</span><br><span> err_no_bvc:</span><br><span> LOGPNSE(nse, LOGL_ERROR, "Rx %s: Cannot find BVC\n", pdut_name);</span><br><span> rate_ctr_inc(&cfg->ctrg-> ctr[GBPROX_GLOB_CTR_INV_RAI]);</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_INV_MAND_INF, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_INV_MAND_INF, NULL, msg);</span><br><span> }</span><br><span> </span><br><span> </span><br><span>@@ -1459,12 +1477,12 @@</span><br><span> uint16_t nsei = msgb_nsei(msg);</span><br><span> struct gbproxy_nse *nse;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* ensure minimum length to decode PCU type */</span><br><span style="color: hsl(0, 100%, 40%);">- if (msgb_bssgp_len(msg) < sizeof(struct bssgp_normal_hdr))</span><br><span style="color: hsl(0, 100%, 40%);">- return bssgp_tx_status(BSSGP_CAUSE_SEM_INCORR_PDU, NULL, msg);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> nse = gbproxy_nse_by_nsei(cfg, nsei, NSE_F_SGSN);</span><br><span> if (nse) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* ensure minimum length to decode PDU type */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (msgb_bssgp_len(msg) < sizeof(struct bssgp_normal_hdr))</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_SEM_INCORR_PDU, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> if (ns_bvci == 0 || ns_bvci == 1)</span><br><span> return gbprox_rx_sig_from_sgsn(nse, msg, ns_bvci);</span><br><span> else</span><br><span>@@ -1477,6 +1495,10 @@</span><br><span> nse = gbproxy_nse_alloc(cfg, nsei, false);</span><br><span> }</span><br><span> if (nse) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* ensure minimum length to decode PDU type */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (msgb_bssgp_len(msg) < sizeof(struct bssgp_normal_hdr))</span><br><span style="color: hsl(120, 100%, 40%);">+ return tx_status(nse, ns_bvci, BSSGP_CAUSE_SEM_INCORR_PDU, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> if (ns_bvci == 0 || ns_bvci == 1)</span><br><span> return gbprox_rx_sig_from_bss(nse, msg, ns_bvci);</span><br><span> else</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-gbproxy/+/22876">change 22876</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-gbproxy/+/22876"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-gbproxy </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Id5ddb10385655b339b2a4f04651c1da09b3efb62 </div>
<div style="display:none"> Gerrit-Change-Number: 22876 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>