<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>