<p>dexter <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-gbproxy/+/22797">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  daniel: Looks good to me, but someone else must approve
  pespin: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gb_proxy: extend TLV parser<br><br>In BSSGP RIM the routing information IE is appearing twice (source and<br>destination). The current one dimensional TLV parsing method would only<br>give us access to the first routing information IE (destination), so<br>lets increase the dimension to 2, so that we get also IEs that appear<br>twice.<br><br>Change-Id: Ieed7160e3005210a9cdeb5c4db28bc3ed031449c<br>Related: SYS#5103<br>---<br>M src/gb_proxy.c<br>1 file changed, 29 insertions(+), 29 deletions(-)<br><br></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 116530f..f773584 100644</span><br><span>--- a/src/gb_proxy.c</span><br><span>+++ b/src/gb_proxy.c</span><br><span>@@ -893,7 +893,7 @@</span><br><span>         struct bssgp_normal_hdr *bgph = (struct bssgp_normal_hdr *) msgb_bssgph(msg);</span><br><span>        uint8_t pdu_type = bgph->pdu_type;</span><br><span>        const char *pdut_name = osmo_tlv_prot_msg_name(&osmo_pdef_bssgp, bgph->pdu_type);</span><br><span style="color: hsl(0, 100%, 40%);">-        struct tlv_parsed tp;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct tlv_parsed tp[2];</span><br><span>     int data_len = msgb_bssgp_len(msg) - sizeof(*bgph);</span><br><span>  struct gbproxy_bvc *from_bvc = NULL;</span><br><span>         char log_pfx[32];</span><br><span>@@ -920,34 +920,34 @@</span><br><span>            return bssgp_tx_status(BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg);</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   rc = osmo_tlv_prot_parse(&osmo_pdef_bssgp, &tp, 1, pdu_type, bgph->data, data_len, 0, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+   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>              return tx_status_from_tlvp(rc, msg);</span><br><span>         }</span><br><span>    /* hack to get both msg + tlv_parsed passed via osmo_fsm_inst_dispatch */</span><br><span style="color: hsl(0, 100%, 40%);">-       msgb_bcid(msg) = (void *)&tp;</span><br><span style="color: hsl(120, 100%, 40%);">+     msgb_bcid(msg) = (void *)tp;</span><br><span> </span><br><span>     /* special case handling for some PDU types */</span><br><span>       switch (pdu_type) {</span><br><span>  case BSSGP_PDUT_BVC_RESET:</span><br><span>           /* resolve or create gbproxy_bvc + handlei n BVC-FSM */</span><br><span style="color: hsl(0, 100%, 40%);">-         return rx_bvc_reset_from_bss(nse, msg, &tp);</span><br><span style="color: hsl(120, 100%, 40%);">+              return rx_bvc_reset_from_bss(nse, msg, &tp[0]);</span><br><span>  case BSSGP_PDUT_BVC_RESET_ACK:</span><br><span style="color: hsl(0, 100%, 40%);">-          ptp_bvci = ntohs(tlvp_val16_unal(&tp, BSSGP_IE_BVCI));</span><br><span style="color: hsl(120, 100%, 40%);">+            ptp_bvci = ntohs(tlvp_val16_unal(&tp[0], BSSGP_IE_BVCI));</span><br><span>                from_bvc = gbproxy_bvc_by_bvci(nse, ptp_bvci);</span><br><span>               if (!from_bvc)</span><br><span>                       goto err_no_bvc;</span><br><span>             return osmo_fsm_inst_dispatch(from_bvc->fi, BSSGP_BVCFSM_E_RX_RESET_ACK, msg);</span><br><span>    case BSSGP_PDUT_BVC_BLOCK:</span><br><span style="color: hsl(0, 100%, 40%);">-              ptp_bvci = ntohs(tlvp_val16_unal(&tp, BSSGP_IE_BVCI));</span><br><span style="color: hsl(120, 100%, 40%);">+            ptp_bvci = ntohs(tlvp_val16_unal(&tp[0], BSSGP_IE_BVCI));</span><br><span>                from_bvc = gbproxy_bvc_by_bvci(nse, ptp_bvci);</span><br><span>               if (!from_bvc)</span><br><span>                       goto err_no_bvc;</span><br><span>             return osmo_fsm_inst_dispatch(from_bvc->fi, BSSGP_BVCFSM_E_RX_BLOCK, msg);</span><br><span>        case BSSGP_PDUT_BVC_UNBLOCK:</span><br><span style="color: hsl(0, 100%, 40%);">-            ptp_bvci = ntohs(tlvp_val16_unal(&tp, BSSGP_IE_BVCI));</span><br><span style="color: hsl(120, 100%, 40%);">+            ptp_bvci = ntohs(tlvp_val16_unal(&tp[0], BSSGP_IE_BVCI));</span><br><span>                from_bvc = gbproxy_bvc_by_bvci(nse, ptp_bvci);</span><br><span>               if (!from_bvc)</span><br><span>                       goto err_no_bvc;</span><br><span>@@ -957,7 +957,7 @@</span><br><span>       {</span><br><span>            struct gbproxy_sgsn *sgsn;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-          tlli = osmo_load32be(TLVP_VAL(&tp, BSSGP_IE_TLLI));</span><br><span style="color: hsl(120, 100%, 40%);">+               tlli = osmo_load32be(TLVP_VAL(&tp[0], BSSGP_IE_TLLI));</span><br><span>           sgsn = gbproxy_select_sgsn(nse->cfg, &tlli);</span><br><span>          if (!sgsn) {</span><br><span>                         LOGP(DGPRS, LOGL_ERROR, "Could not find any SGSN for TLLI, dropping message!\n");</span><br><span>@@ -971,7 +971,7 @@</span><br><span> #if 0</span><br><span>           /* TODO: Validate the RAI for consistency with the RAI</span><br><span>                * we expect for any of the BVC within this BSS side NSE */</span><br><span style="color: hsl(0, 100%, 40%);">-             memcpy(ra, TLVP_VAL(&tp, BSSGP_IE_ROUTEING_AREA), sizeof(from_bvc->ra));</span><br><span style="color: hsl(120, 100%, 40%);">+               memcpy(ra, TLVP_VAL(&tp[0], BSSGP_IE_ROUTEING_AREA), sizeof(from_bvc->ra));</span><br><span>           gsm48_parse_ra(&raid, from_bvc->ra);</span><br><span> #endif</span><br><span>                break;</span><br><span>@@ -991,8 +991,8 @@</span><br><span>         case BSSGP_PDUT_LLC_DISCARD:</span><br><span>         case BSSGP_PDUT_FLUSH_LL_ACK:</span><br><span>                /* route based on BVCI + TLLI */</span><br><span style="color: hsl(0, 100%, 40%);">-                ptp_bvci = ntohs(tlvp_val16_unal(&tp, BSSGP_IE_BVCI));</span><br><span style="color: hsl(0, 100%, 40%);">-              tlli = osmo_load32be(TLVP_VAL(&tp, BSSGP_IE_TLLI));</span><br><span style="color: hsl(120, 100%, 40%);">+               ptp_bvci = ntohs(tlvp_val16_unal(&tp[0], BSSGP_IE_BVCI));</span><br><span style="color: hsl(120, 100%, 40%);">+         tlli = osmo_load32be(TLVP_VAL(&tp[0], BSSGP_IE_TLLI));</span><br><span>           from_bvc = gbproxy_bvc_by_bvci(nse, ptp_bvci);</span><br><span>               if (!from_bvc)</span><br><span>                       goto err_no_bvc;</span><br><span>@@ -1003,8 +1003,8 @@</span><br><span>     {</span><br><span>            /* Route according to IMSI<->NSE cache entry */</span><br><span>                struct osmo_mobile_identity mi;</span><br><span style="color: hsl(0, 100%, 40%);">-         const uint8_t *mi_data = TLVP_VAL(&tp, BSSGP_IE_IMSI);</span><br><span style="color: hsl(0, 100%, 40%);">-              uint8_t mi_len = TLVP_LEN(&tp, BSSGP_IE_IMSI);</span><br><span style="color: hsl(120, 100%, 40%);">+            const uint8_t *mi_data = TLVP_VAL(&tp[0], BSSGP_IE_IMSI);</span><br><span style="color: hsl(120, 100%, 40%);">+         uint8_t mi_len = TLVP_LEN(&tp[0], BSSGP_IE_IMSI);</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>@@ -1143,7 +1143,7 @@</span><br><span>  const char *pdut_name = osmo_tlv_prot_msg_name(&osmo_pdef_bssgp, bgph->pdu_type);</span><br><span>     struct gbproxy_config *cfg = nse->cfg;</span><br><span>    struct gbproxy_bvc *sgsn_bvc;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct tlv_parsed tp;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct tlv_parsed tp[2];</span><br><span>     int data_len;</span><br><span>        uint16_t bvci;</span><br><span>       char log_pfx[32];</span><br><span>@@ -1173,7 +1173,7 @@</span><br><span> </span><br><span>        data_len = msgb_bssgp_len(msg) - sizeof(*bgph);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     rc = osmo_tlv_prot_parse(&osmo_pdef_bssgp, &tp, 1, pdu_type, bgph->data, data_len, 0, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+   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>             rc = tx_status_from_tlvp(rc, msg);</span><br><span>@@ -1181,30 +1181,30 @@</span><br><span>                 return rc;</span><br><span>   }</span><br><span>    /* hack to get both msg + tlv_parsed passed via osmo_fsm_inst_dispatch */</span><br><span style="color: hsl(0, 100%, 40%);">-       msgb_bcid(msg) = (void *)&tp;</span><br><span style="color: hsl(120, 100%, 40%);">+     msgb_bcid(msg) = (void *)tp;</span><br><span> </span><br><span>     switch (pdu_type) {</span><br><span>  case BSSGP_PDUT_BVC_RESET:</span><br><span>           /* resolve or create ggbproxy_bvc + handle in BVC-FSM */</span><br><span style="color: hsl(0, 100%, 40%);">-                bvci = ntohs(tlvp_val16_unal(&tp, BSSGP_IE_BVCI));</span><br><span style="color: hsl(0, 100%, 40%);">-          rc = rx_bvc_reset_from_sgsn(nse, msg, &tp, ns_bvci);</span><br><span style="color: hsl(120, 100%, 40%);">+              bvci = ntohs(tlvp_val16_unal(&tp[0], BSSGP_IE_BVCI));</span><br><span style="color: hsl(120, 100%, 40%);">+             rc = rx_bvc_reset_from_sgsn(nse, msg, &tp[0], ns_bvci);</span><br><span>          break;</span><br><span>       case BSSGP_PDUT_BVC_RESET_ACK:</span><br><span style="color: hsl(0, 100%, 40%);">-          bvci = ntohs(tlvp_val16_unal(&tp, BSSGP_IE_BVCI));</span><br><span style="color: hsl(120, 100%, 40%);">+                bvci = ntohs(tlvp_val16_unal(&tp[0], BSSGP_IE_BVCI));</span><br><span>            sgsn_bvc = gbproxy_bvc_by_bvci(nse, bvci);</span><br><span>           if (!sgsn_bvc)</span><br><span>                       goto err_no_bvc;</span><br><span>             rc = osmo_fsm_inst_dispatch(sgsn_bvc->fi, BSSGP_BVCFSM_E_RX_RESET_ACK, msg);</span><br><span>              break;</span><br><span>       case BSSGP_PDUT_BVC_BLOCK_ACK:</span><br><span style="color: hsl(0, 100%, 40%);">-          bvci = ntohs(tlvp_val16_unal(&tp, BSSGP_IE_BVCI));</span><br><span style="color: hsl(120, 100%, 40%);">+                bvci = ntohs(tlvp_val16_unal(&tp[0], BSSGP_IE_BVCI));</span><br><span>            sgsn_bvc = gbproxy_bvc_by_bvci(nse, bvci);</span><br><span>           if (!sgsn_bvc)</span><br><span>                       goto err_no_bvc;</span><br><span>             rc = osmo_fsm_inst_dispatch(sgsn_bvc->fi, BSSGP_BVCFSM_E_RX_BLOCK_ACK, msg);</span><br><span>              break;</span><br><span>       case BSSGP_PDUT_BVC_UNBLOCK_ACK:</span><br><span style="color: hsl(0, 100%, 40%);">-                bvci = ntohs(tlvp_val16_unal(&tp, BSSGP_IE_BVCI));</span><br><span style="color: hsl(120, 100%, 40%);">+                bvci = ntohs(tlvp_val16_unal(&tp[0], BSSGP_IE_BVCI));</span><br><span>            sgsn_bvc = gbproxy_bvc_by_bvci(nse, bvci);</span><br><span>           if (!sgsn_bvc)</span><br><span>                       goto err_no_bvc;</span><br><span>@@ -1212,7 +1212,7 @@</span><br><span>             break;</span><br><span>       case BSSGP_PDUT_FLUSH_LL:</span><br><span>            /* simple case: BVCI IE is mandatory */</span><br><span style="color: hsl(0, 100%, 40%);">-         bvci = ntohs(tlvp_val16_unal(&tp, BSSGP_IE_BVCI));</span><br><span style="color: hsl(120, 100%, 40%);">+                bvci = ntohs(tlvp_val16_unal(&tp[0], BSSGP_IE_BVCI));</span><br><span>            sgsn_bvc = gbproxy_bvc_by_bvci(nse, bvci);</span><br><span>           if (!sgsn_bvc)</span><br><span>                       goto err_no_bvc;</span><br><span>@@ -1228,23 +1228,23 @@</span><br><span>   {</span><br><span>            /* Cache the IMSI<->NSE to route PAGING REJECT */</span><br><span>              struct osmo_mobile_identity mi;</span><br><span style="color: hsl(0, 100%, 40%);">-         const uint8_t *mi_data = TLVP_VAL(&tp, BSSGP_IE_IMSI);</span><br><span style="color: hsl(0, 100%, 40%);">-              uint8_t mi_len = TLVP_LEN(&tp, BSSGP_IE_IMSI);</span><br><span style="color: hsl(120, 100%, 40%);">+            const uint8_t *mi_data = TLVP_VAL(&tp[0], BSSGP_IE_IMSI);</span><br><span style="color: hsl(120, 100%, 40%);">+         uint8_t mi_len = TLVP_LEN(&tp[0], BSSGP_IE_IMSI);</span><br><span>                osmo_mobile_identity_decode(&mi, mi_data, mi_len, false);</span><br><span>                gbproxy_imsi_cache_update(nse, mi.imsi);</span><br><span>             /* fall through */</span><br><span>   }</span><br><span>    case BSSGP_PDUT_PAGING_CS:</span><br><span>           /* process the paging request (LAI/RAI lookup) */</span><br><span style="color: hsl(0, 100%, 40%);">-               rc = gbprox_rx_paging(nse, msg, pdut_name, &tp, ns_bvci, paging_bc);</span><br><span style="color: hsl(120, 100%, 40%);">+              rc = gbprox_rx_paging(nse, msg, pdut_name, &tp[0], ns_bvci, paging_bc);</span><br><span>          break;</span><br><span>       case BSSGP_PDUT_STATUS:</span><br><span>              /* Some exception has occurred */</span><br><span style="color: hsl(0, 100%, 40%);">-               cause = *TLVP_VAL(&tp, BSSGP_IE_CAUSE);</span><br><span style="color: hsl(120, 100%, 40%);">+           cause = *TLVP_VAL(&tp[0], BSSGP_IE_CAUSE);</span><br><span>               LOGPNSE(nse, LOGL_NOTICE, "Rx STATUS cause=0x%02x(%s) ", cause,</span><br><span>                    bssgp_cause_str(cause));</span><br><span style="color: hsl(0, 100%, 40%);">-                if (TLVP_PRES_LEN(&tp, BSSGP_IE_BVCI, 2)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 bvci = ntohs(tlvp_val16_unal(&tp, BSSGP_IE_BVCI));</span><br><span style="color: hsl(120, 100%, 40%);">+                if (TLVP_PRES_LEN(&tp[0], BSSGP_IE_BVCI, 2)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    bvci = ntohs(tlvp_val16_unal(&tp[0], BSSGP_IE_BVCI));</span><br><span>                    LOGPC(DGPRS, LOGL_NOTICE, "BVCI=%05u\n", bvci);</span><br><span>                    sgsn_bvc = gbproxy_bvc_by_bvci(nse, bvci);</span><br><span>                   /* don't send STATUS in response to STATUS if !bvc */</span><br><span>@@ -1260,7 +1260,7 @@</span><br><span>    case BSSGP_PDUT_RESUME_NACK:</span><br><span>         {</span><br><span>            struct gbproxy_nse *nse_peer;</span><br><span style="color: hsl(0, 100%, 40%);">-           uint32_t tlli = osmo_load32be(TLVP_VAL(&tp, BSSGP_IE_TLLI));</span><br><span style="color: hsl(120, 100%, 40%);">+              uint32_t tlli = osmo_load32be(TLVP_VAL(&tp[0], BSSGP_IE_TLLI));</span><br><span> </span><br><span>              nse_peer = gbproxy_nse_by_tlli(cfg, tlli);</span><br><span>           if (!nse_peer) {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-gbproxy/+/22797">change 22797</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/+/22797"/><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: Ieed7160e3005210a9cdeb5c4db28bc3ed031449c </div>
<div style="display:none"> Gerrit-Change-Number: 22797 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>