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