<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-sgsn/+/21591">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gb_proxy: Use osmo_tlv_prot_parse() to validate mandatory IEs<br><br>We recently introduced code to libosmocore which allows us to validate<br>the mandatory IE presence (and length) in a generic way.  Let's use it.<br><br>Change-Id: I0ea3f5f9566d9bf5a8429c3ee748e3e90cda6cd7<br>Depends: libosmocore.git I7e4226463f3c935134b5c2c737696fbfd1dd5815<br>---<br>M src/gbproxy/gb_proxy.c<br>1 file changed, 45 insertions(+), 12 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/gbproxy/gb_proxy.c b/src/gbproxy/gb_proxy.c</span><br><span>index a90030e..8be67f7 100644</span><br><span>--- a/src/gbproxy/gb_proxy.c</span><br><span>+++ b/src/gbproxy/gb_proxy.c</span><br><span>@@ -104,6 +104,20 @@</span><br><span>      return 1;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* generate BVC-STATUS message with cause value derived from TLV-parser error */</span><br><span style="color: hsl(120, 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%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t bssgp_cause;</span><br><span style="color: hsl(120, 100%, 40%);">+  switch (tlv_p_err) {</span><br><span style="color: hsl(120, 100%, 40%);">+  case OSMO_TLVP_ERR_MAND_IE_MISSING:</span><br><span style="color: hsl(120, 100%, 40%);">+           bssgp_cause = BSSGP_CAUSE_MISSING_MAND_IE;</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              bssgp_cause = BSSGP_CAUSE_PROTO_ERR_UNSPEC;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     return bssgp_tx_status(bssgp_cause, NULL, orig_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* strip off the NS header */</span><br><span> static void strip_ns_hdr(struct msgb *msg)</span><br><span> {</span><br><span>@@ -423,26 +437,34 @@</span><br><span>        int data_len = msgb_bssgp_len(msg) - sizeof(*bgph);</span><br><span>  struct gbproxy_bvc *from_bvc = NULL;</span><br><span>         struct gprs_ra_id raid;</span><br><span style="color: hsl(120, 100%, 40%);">+       char log_pfx[32];</span><br><span>    int rc;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   snprintf(log_pfx, sizeof(log_pfx), "NSE(%05u/BSS)", nsei);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       if (ns_bvci != 0 && ns_bvci != 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGP(DGPRS, LOGL_NOTICE, "NSE(%05u/BSS) BVCI=%05u is not signalling\n", nsei, ns_bvci);</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP(DGPRS, LOGL_NOTICE, "%s BVCI=%05u is not signalling\n", log_pfx, ns_bvci);</span><br><span>            return bssgp_tx_status(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 style="color: hsl(0, 100%, 40%);">-           LOGP(DGPRS, LOGL_NOTICE, "NSE(%05u/BSS) %s not allowed in signalling BVC\n",</span><br><span style="color: hsl(0, 100%, 40%);">-               nsei, osmo_tlv_prot_msg_name(&osmo_pdef_bssgp, pdu_type));</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DGPRS, LOGL_NOTICE, "%s %s not allowed in signalling BVC\n", log_pfx,</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo_tlv_prot_msg_name(&osmo_pdef_bssgp, pdu_type));</span><br><span>                return bssgp_tx_status(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 style="color: hsl(0, 100%, 40%);">-            LOGP(DGPRS, LOGL_NOTICE, "NSE(%05u/BSS) %s not allowed in uplink direction\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                     nsei, osmo_tlv_prot_msg_name(&osmo_pdef_bssgp, pdu_type));</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DGPRS, LOGL_NOTICE, "%s %s not allowed in uplink direction\n", log_pfx,</span><br><span style="color: hsl(120, 100%, 40%);">+                     osmo_tlv_prot_msg_name(&osmo_pdef_bssgp, pdu_type));</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%);">-   bssgp_tlv_parse(&tp, bgph->data, data_len);</span><br><span style="color: hsl(120, 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%);">+                            DGPRS, log_pfx);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              rate_ctr_inc(&cfg->ctrg->ctr[GBPROX_GLOB_CTR_PROTO_ERR_BSS]);</span><br><span style="color: hsl(120, 100%, 40%);">+               return tx_status_from_tlvp(rc, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span> </span><br><span>        switch (pdu_type) {</span><br><span>  case BSSGP_PDUT_SUSPEND:</span><br><span>@@ -626,24 +648,27 @@</span><br><span>     struct gbproxy_bvc *bvc;</span><br><span>     uint16_t bvci;</span><br><span>       struct msgb *msg;</span><br><span style="color: hsl(120, 100%, 40%);">+     char log_pfx[32];</span><br><span>    int rc = 0;</span><br><span>  int cause;</span><br><span>   int i;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    snprintf(log_pfx, sizeof(log_pfx), "NSE(%05u/SGSN)", nsei);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      if (ns_bvci != 0 && ns_bvci != 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGP(DGPRS, LOGL_NOTICE, "NSE(%05u/SGSN) BVCI=%05u is not signalling\n", nsei, ns_bvci);</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGP(DGPRS, LOGL_NOTICE, "%s BVCI=%05u is not signalling\n", log_pfx, ns_bvci);</span><br><span>            return bssgp_tx_status(BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, orig_msg);</span><br><span>        }</span><br><span> </span><br><span>        if (!(bssgp_pdu_type_flags(pdu_type) & BSSGP_PDUF_SIG)) {</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGP(DGPRS, LOGL_NOTICE, "NSE(%05u/SGSN) %s not allowed in signalling BVC\n",</span><br><span style="color: hsl(0, 100%, 40%);">-              nsei, osmo_tlv_prot_msg_name(&osmo_pdef_bssgp, pdu_type));</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DGPRS, LOGL_NOTICE, "%s %s not allowed in signalling BVC\n", log_pfx,</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo_tlv_prot_msg_name(&osmo_pdef_bssgp, pdu_type));</span><br><span>                return bssgp_tx_status(BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, orig_msg);</span><br><span>        }</span><br><span> </span><br><span>        if (!(bssgp_pdu_type_flags(pdu_type) & BSSGP_PDUF_DL)) {</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGP(DGPRS, LOGL_NOTICE, "NSE(%05u/SGSN) %s not allowed in downlink direction\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                  nsei, osmo_tlv_prot_msg_name(&osmo_pdef_bssgp, pdu_type));</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DGPRS, LOGL_NOTICE, "%s %s not allowed in downlink direction\n", log_pfx,</span><br><span style="color: hsl(120, 100%, 40%);">+                   osmo_tlv_prot_msg_name(&osmo_pdef_bssgp, pdu_type));</span><br><span>                return bssgp_tx_status(BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, orig_msg);</span><br><span>        }</span><br><span> </span><br><span>@@ -651,7 +676,15 @@</span><br><span>         /* Update message info */</span><br><span>    bgph = (struct bssgp_normal_hdr *) msgb_bssgph(msg);</span><br><span>         data_len = msgb_bssgp_len(orig_msg) - sizeof(*bgph);</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = bssgp_tlv_parse(&tp, bgph->data, data_len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 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%);">+                            DGPRS, log_pfx);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              rc = tx_status_from_tlvp(rc, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+            msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+               rate_ctr_inc(&cfg->ctrg->ctr[GBPROX_GLOB_CTR_PROTO_ERR_SGSN]);</span><br><span style="color: hsl(120, 100%, 40%);">+              return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span> </span><br><span>        switch (pdu_type) {</span><br><span>  case BSSGP_PDUT_BVC_RESET:</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-sgsn/+/21591">change 21591</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-sgsn/+/21591"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-sgsn </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I0ea3f5f9566d9bf5a8429c3ee748e3e90cda6cd7 </div>
<div style="display:none"> Gerrit-Change-Number: 21591 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>