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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">compl l3: separate paging handling from bsc_scan_bts_msg()<br><br>bsc_scan_bts_msg() essentially updates the MS power class for LU and CM<br>Service, and also stops the paging and counts the response for a Paging<br>Response. Separate that.<br><br>Reduce code dup by one common parse_power_cap() function for both LU and CM<br>Service.<br><br>Call handle_page_resp() separately.<br><br>(Upcoming patches will add more reasons to read the gsm48_hdr's pdisc and mtype<br>in bsc_compl_l3().)<br><br>Change-Id: If14284494c74a396fabebd79da8079342e65dcc2<br>---<br>M src/osmo-bsc/gsm_08_08.c<br>1 file changed, 59 insertions(+), 83 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo-bsc/gsm_08_08.c b/src/osmo-bsc/gsm_08_08.c</span><br><span>index 59032d6..9dc54d1 100644</span><br><span>--- a/src/osmo-bsc/gsm_08_08.c</span><br><span>+++ b/src/osmo-bsc/gsm_08_08.c</span><br><span>@@ -387,94 +387,57 @@</span><br><span>       return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* TS 04.08 sec 9.2.15 "Location updating request" */</span><br><span style="color: hsl(0, 100%, 40%);">-static void handle_lu_request(struct gsm_subscriber_connection *conn,</span><br><span style="color: hsl(0, 100%, 40%);">-                        struct msgb *msg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gsm48_hdr *gh;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gsm48_loc_upd_req *lu;</span><br><span style="color: hsl(0, 100%, 40%);">-   int8_t rc8;</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gsm_bts *bts = conn_get_bts(conn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!bts) {</span><br><span style="color: hsl(0, 100%, 40%);">-             /* should never happen */</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGP(DRSL, LOGL_ERROR, "LU Request without lchan\n");</span><br><span style="color: hsl(0, 100%, 40%);">-         return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (msgb_l3len(msg) < sizeof(*gh) + sizeof(*lu)) {</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGP(DMSC, LOGL_ERROR, "LU too small to look at: %u\n", msgb_l3len(msg));</span><br><span style="color: hsl(0, 100%, 40%);">-             return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       gh = msgb_l3(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-      lu = (struct gsm48_loc_upd_req *) gh->data;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  rc8 = osmo_gsm48_rfpowercap2powerclass(bts->band, lu->classmark1.pwr_lev);</span><br><span style="color: hsl(0, 100%, 40%);">-        if (rc8 < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGP(DMSC, LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">-              "Unable to decode RF power capability %x from classmark1 during LU.\n",</span><br><span style="color: hsl(0, 100%, 40%);">-               lu->classmark1.pwr_lev);</span><br><span style="color: hsl(0, 100%, 40%);">-                rc8 = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-       conn_update_ms_power_class(conn, rc8);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* TS 04.08 sec 9.2.15 "Location updating request" */</span><br><span style="color: hsl(0, 100%, 40%);">-static void handle_cm_serv_req(struct gsm_subscriber_connection *conn,</span><br><span style="color: hsl(0, 100%, 40%);">-                          struct msgb *msg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gsm48_hdr *gh;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gsm48_service_request *serv_req;</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm48_classmark2* cm2;</span><br><span style="color: hsl(0, 100%, 40%);">-   int8_t rc8;</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gsm_bts *bts = conn_get_bts(conn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!bts) {</span><br><span style="color: hsl(0, 100%, 40%);">-             /* should never happen */</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGP(DRSL, LOGL_ERROR, "CM Service Request without lchan\n");</span><br><span style="color: hsl(0, 100%, 40%);">-         return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (msgb_l3len(msg) < sizeof(*gh) + sizeof(*serv_req)) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGP(DMSC, LOGL_ERROR, "CM Serv Req too small to look at: %u\n", msgb_l3len(msg));</span><br><span style="color: hsl(0, 100%, 40%);">-            return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       gh = msgb_l3(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-      serv_req = (struct gsm48_service_request *) gh->data;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        cm2 = (struct gsm48_classmark2*)(((uint8_t*)&serv_req->classmark)+1);</span><br><span style="color: hsl(0, 100%, 40%);">-    /* FIXME: one classmark2 is available in libosmocore:</span><br><span style="color: hsl(0, 100%, 40%);">-   cm2 = &serv_req->classmark2; */</span><br><span style="color: hsl(0, 100%, 40%);">-  rc8 = osmo_gsm48_rfpowercap2powerclass(bts->band, cm2->pwr_lev);</span><br><span style="color: hsl(0, 100%, 40%);">-  if (rc8 < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGP(DMSC, LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">-              "Unable to decode RF power capability %x from classmark2 during CM Service Req.\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                   cm2->pwr_lev);</span><br><span style="color: hsl(0, 100%, 40%);">-          rc8 = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-       conn_update_ms_power_class(conn, rc8);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int bsc_scan_bts_msg(struct gsm_subscriber_connection *conn, struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+static void parse_powercap(struct gsm_subscriber_connection *conn, struct msgb *msg)</span><br><span> {</span><br><span>     struct gsm48_hdr *gh = msgb_l3(msg);</span><br><span>         uint8_t pdisc = gsm48_hdr_pdisc(gh);</span><br><span>         uint8_t mtype = gsm48_hdr_msg_type(gh);</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm48_loc_upd_req *lu;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm48_service_request *serv_req;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t pwr_lev;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gsm_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+  int8_t rc8;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (pdisc == GSM48_PDISC_MM) {</span><br><span style="color: hsl(0, 100%, 40%);">-          if (mtype == GSM48_MT_MM_LOC_UPD_REQUEST)</span><br><span style="color: hsl(0, 100%, 40%);">-                       handle_lu_request(conn, msg);</span><br><span style="color: hsl(0, 100%, 40%);">-           else if(mtype == GSM48_MT_MM_CM_SERV_REQ)</span><br><span style="color: hsl(0, 100%, 40%);">-                       handle_cm_serv_req(conn, msg);</span><br><span style="color: hsl(0, 100%, 40%);">-  } else if (pdisc == GSM48_PDISC_RR) {</span><br><span style="color: hsl(0, 100%, 40%);">-           if (mtype == GSM48_MT_RR_PAG_RESP)</span><br><span style="color: hsl(0, 100%, 40%);">-                      handle_page_resp(conn, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+  switch (pdisc) {</span><br><span style="color: hsl(120, 100%, 40%);">+      case GSM48_PDISC_MM:</span><br><span style="color: hsl(120, 100%, 40%);">+          switch (mtype) {</span><br><span style="color: hsl(120, 100%, 40%);">+              case GSM48_MT_MM_LOC_UPD_REQUEST:</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (msgb_l3len(msg) < sizeof(*gh) + sizeof(*lu)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         LOGPFSML(conn->fi, LOGL_ERROR, "rx Location Updating message too short: %u\n", msgb_l3len(msg));</span><br><span style="color: hsl(120, 100%, 40%);">+                         return;</span><br><span style="color: hsl(120, 100%, 40%);">+                       }</span><br><span style="color: hsl(120, 100%, 40%);">+                     lu = (struct gsm48_loc_upd_req *) gh->data;</span><br><span style="color: hsl(120, 100%, 40%);">+                        pwr_lev = lu->classmark1.pwr_lev;</span><br><span style="color: hsl(120, 100%, 40%);">+                  break;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              case GSM48_MT_MM_CM_SERV_REQ:</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (msgb_l3len(msg) < sizeof(*gh) + sizeof(*serv_req)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                           LOGPFSML(conn->fi, LOGL_ERROR, "rx CM Service Request message too short: %u\n", msgb_l3len(msg));</span><br><span style="color: hsl(120, 100%, 40%);">+                                return;</span><br><span style="color: hsl(120, 100%, 40%);">+                       }</span><br><span style="color: hsl(120, 100%, 40%);">+                     serv_req = (struct gsm48_service_request *) gh->data;</span><br><span style="color: hsl(120, 100%, 40%);">+                      pwr_lev = serv_req->classmark2.pwr_lev;</span><br><span style="color: hsl(120, 100%, 40%);">+                    break;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              default:</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* No power cap in other messages */</span><br><span style="color: hsl(120, 100%, 40%);">+                  return;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* FIXME: pwr_lev in Paging Response? */</span><br><span style="color: hsl(120, 100%, 40%);">+      default:</span><br><span style="color: hsl(120, 100%, 40%);">+              /* No power cap in other messages */</span><br><span style="color: hsl(120, 100%, 40%);">+          return;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     bts = conn_get_bts(conn);</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(bts);</span><br><span style="color: hsl(120, 100%, 40%);">+     rc8 = osmo_gsm48_rfpowercap2powerclass(bts->band, pwr_lev);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (rc8 < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGPFSML(conn->fi, LOGL_NOTICE, "%s %s: Unable to decode RF power capability 0x%x\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                     gsm48_pdisc_name(pdisc), gsm48_pdisc_msgtype_name(pdisc, mtype), pwr_lev);</span><br><span style="color: hsl(120, 100%, 40%);">+           rc8 = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     conn_update_ms_power_class(conn, rc8);</span><br><span> }</span><br><span> </span><br><span> /*! MS->MSC: New MM context with L3 payload. */</span><br><span>@@ -486,6 +449,17 @@</span><br><span>         int rc = -2;</span><br><span>         struct gsm_bts *bts;</span><br><span>         struct osmo_cell_global_id *cgi;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gsm48_hdr *gh;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t pdisc, mtype;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (msgb_l3len(msg) < sizeof(*gh)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGP(DRSL, LOGL_ERROR, "There is no GSM48 header here.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         goto early_fail;</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%);">+   gh = msgb_l3(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+    pdisc = gsm48_hdr_pdisc(gh);</span><br><span style="color: hsl(120, 100%, 40%);">+  mtype = gsm48_hdr_msg_type(gh);</span><br><span> </span><br><span>  log_set_context(LOG_CTX_BSC_SUBSCR, conn->bsub);</span><br><span> </span><br><span>@@ -513,7 +487,9 @@</span><br><span>                goto early_fail;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   bsc_scan_bts_msg(conn, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+  parse_powercap(conn, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (pdisc == GSM48_PDISC_RR && mtype == GSM48_MT_RR_PAG_RESP)</span><br><span style="color: hsl(120, 100%, 40%);">+         handle_page_resp(conn, msg);</span><br><span> </span><br><span>     if (gscon_is_aoip(conn)) {</span><br><span>           gen_bss_supported_codec_list(&scl, msc, bts);</span><br><span>@@ -550,7 +526,7 @@</span><br><span> </span><br><span>  LOGP(DMSC, LOGL_INFO, "Tx MSC DTAP LINK_ID=0x%02x\n", link_id);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   bsc_scan_bts_msg(conn, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+  parse_powercap(conn, msg);</span><br><span> </span><br><span>       /* Store link_id in msg->cb */</span><br><span>    OBSC_LINKID_CB(msg) = link_id;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/20340">change 20340</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-bsc/+/20340"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: If14284494c74a396fabebd79da8079342e65dcc2 </div>
<div style="display:none"> Gerrit-Change-Number: 20340 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: Vadim Yanitskiy <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-CC: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>