<p>Vadim Yanitskiy has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/11174">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">layer23/app_ccch_scan.c: clean up System Information handling<br><br>Change-Id: I8c2594920fcad8a3e346b938bd0c20409f4d01c9<br>---<br>M src/host/layer23/src/misc/app_ccch_scan.c<br>1 file changed, 98 insertions(+), 93 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/74/11174/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/host/layer23/src/misc/app_ccch_scan.c b/src/host/layer23/src/misc/app_ccch_scan.c</span><br><span>index 31b72f8..49adee9 100644</span><br><span>--- a/src/host/layer23/src/misc/app_ccch_scan.c</span><br><span>+++ b/src/host/layer23/src/misc/app_ccch_scan.c</span><br><span>@@ -45,108 +45,113 @@</span><br><span>  int ccch_mode;</span><br><span> } app_state;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int bcch_check_tc(uint8_t si_type, uint8_t tc)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  /* FIXME: there is no tc information (always 0) */</span><br><span style="color: hsl(120, 100%, 40%);">+    return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   switch (si_type) {</span><br><span style="color: hsl(120, 100%, 40%);">+    case GSM48_MT_RR_SYSINFO_1:</span><br><span style="color: hsl(120, 100%, 40%);">+           if (tc != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                  return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM48_MT_RR_SYSINFO_2:</span><br><span style="color: hsl(120, 100%, 40%);">+           if (tc != 1)</span><br><span style="color: hsl(120, 100%, 40%);">+                  return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM48_MT_RR_SYSINFO_3:</span><br><span style="color: hsl(120, 100%, 40%);">+           if (tc != 2 && tc != 6)</span><br><span style="color: hsl(120, 100%, 40%);">+                       return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM48_MT_RR_SYSINFO_4:</span><br><span style="color: hsl(120, 100%, 40%);">+           if (tc != 3 && tc != 7)</span><br><span style="color: hsl(120, 100%, 40%);">+                       return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM48_MT_RR_SYSINFO_7:</span><br><span style="color: hsl(120, 100%, 40%);">+           if (tc != 7)</span><br><span style="color: hsl(120, 100%, 40%);">+                  return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM48_MT_RR_SYSINFO_8:</span><br><span style="color: hsl(120, 100%, 40%);">+           if (tc != 3)</span><br><span style="color: hsl(120, 100%, 40%);">+                  return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM48_MT_RR_SYSINFO_9:</span><br><span style="color: hsl(120, 100%, 40%);">+           if (tc != 4)</span><br><span style="color: hsl(120, 100%, 40%);">+                  return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM48_MT_RR_SYSINFO_13:</span><br><span style="color: hsl(120, 100%, 40%);">+          if (tc != 4 && tc != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                       return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM48_MT_RR_SYSINFO_16:</span><br><span style="color: hsl(120, 100%, 40%);">+          if (tc != 6)</span><br><span style="color: hsl(120, 100%, 40%);">+                  return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM48_MT_RR_SYSINFO_17:</span><br><span style="color: hsl(120, 100%, 40%);">+          if (tc != 2)</span><br><span style="color: hsl(120, 100%, 40%);">+                  return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM48_MT_RR_SYSINFO_2bis:</span><br><span style="color: hsl(120, 100%, 40%);">+                if (tc != 5)</span><br><span style="color: hsl(120, 100%, 40%);">+                  return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM48_MT_RR_SYSINFO_2ter:</span><br><span style="color: hsl(120, 100%, 40%);">+                if (tc != 5 && tc != 4)</span><br><span style="color: hsl(120, 100%, 40%);">+                       return -EINVAL;</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%);">+      /* The following types are used on SACCH only */</span><br><span style="color: hsl(120, 100%, 40%);">+      case GSM48_MT_RR_SYSINFO_5:</span><br><span style="color: hsl(120, 100%, 40%);">+   case GSM48_MT_RR_SYSINFO_6:</span><br><span style="color: hsl(120, 100%, 40%);">+   case GSM48_MT_RR_SYSINFO_5bis:</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM48_MT_RR_SYSINFO_5ter:</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%);">+      /* Unknown SI type */</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DRR, LOGL_INFO, "Unknown SI (type=0x%02x)\n", si_type);</span><br><span style="color: hsl(120, 100%, 40%);">+                return -ENOTSUP;</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%);">+  return 0;</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%);">+static void handle_si3(struct osmocom_ms *ms,</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm48_system_information_type_3 *si)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        if (app_state.ccch_mode != CCCH_MODE_NONE)</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%);">+     if (si->control_channel_desc.ccch_conf == RSL_BCCH_CCCH_CONF_1_C)</span><br><span style="color: hsl(120, 100%, 40%);">+          app_state.ccch_mode = CCCH_MODE_COMBINED;</span><br><span style="color: hsl(120, 100%, 40%);">+     else</span><br><span style="color: hsl(120, 100%, 40%);">+          app_state.ccch_mode = CCCH_MODE_NON_COMBINED;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       l1ctl_tx_ccch_mode_req(ms, app_state.ccch_mode);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void dump_bcch(struct osmocom_ms *ms, uint8_t tc, const uint8_t *data)</span><br><span> {</span><br><span>  struct gsm48_system_information_type_header *si_hdr;</span><br><span>         si_hdr = (struct gsm48_system_information_type_header *) data;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t si_type = si_hdr->system_information;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    LOGP(DRR, LOGL_INFO, "BCCH message (type=0x%02x): %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+            si_type, gsm48_rr_msg_name(si_type));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (bcch_check_tc(si_type, tc) == -EINVAL)</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGP(DRR, LOGL_INFO, "SI on wrong tc=%u\n", tc);</span><br><span> </span><br><span>       /* GSM 05.02 ยง6.3.1.3 Mapping of BCCH data */</span><br><span style="color: hsl(0, 100%, 40%);">-  switch (si_hdr->system_information) {</span><br><span style="color: hsl(0, 100%, 40%);">-        case GSM48_MT_RR_SYSINFO_1:</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef BCCH_TC_CHECK</span><br><span style="color: hsl(0, 100%, 40%);">-         if (tc != 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                    LOGP(DRR, LOGL_ERROR, "SI1 on the wrong TC: %d\n", tc);</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-         break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM48_MT_RR_SYSINFO_2:</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef BCCH_TC_CHECK</span><br><span style="color: hsl(0, 100%, 40%);">-         if (tc != 1)</span><br><span style="color: hsl(0, 100%, 40%);">-                    LOGP(DRR, LOGL_ERROR, "SI2 on the wrong TC: %d\n", tc);</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        switch (si_type) {</span><br><span>   case GSM48_MT_RR_SYSINFO_3:</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef BCCH_TC_CHECK</span><br><span style="color: hsl(0, 100%, 40%);">-         if (tc != 2 && tc != 6)</span><br><span style="color: hsl(0, 100%, 40%);">-                 LOGP(DRR, LOGL_ERROR, "SI3 on the wrong TC: %d\n", tc);</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-         if (app_state.ccch_mode == CCCH_MODE_NONE) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    struct gsm48_system_information_type_3 *si3 =</span><br><span style="color: hsl(0, 100%, 40%);">-                           (struct gsm48_system_information_type_3 *)data;</span><br><span style="color: hsl(120, 100%, 40%);">+               handle_si3(ms,</span><br><span style="color: hsl(120, 100%, 40%);">+                        (struct gsm48_system_information_type_3 *) data);</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                      if (si3->control_channel_desc.ccch_conf == RSL_BCCH_CCCH_CONF_1_C)</span><br><span style="color: hsl(0, 100%, 40%);">-                           app_state.ccch_mode = CCCH_MODE_COMBINED;</span><br><span style="color: hsl(0, 100%, 40%);">-                       else</span><br><span style="color: hsl(0, 100%, 40%);">-                            app_state.ccch_mode = CCCH_MODE_NON_COMBINED;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                   l1ctl_tx_ccch_mode_req(ms, app_state.ccch_mode);</span><br><span style="color: hsl(0, 100%, 40%);">-                }</span><br><span style="color: hsl(0, 100%, 40%);">-               break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM48_MT_RR_SYSINFO_4:</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef BCCH_TC_CHECK</span><br><span style="color: hsl(0, 100%, 40%);">-         if (tc != 3 && tc != 7)</span><br><span style="color: hsl(0, 100%, 40%);">-                 LOGP(DRR, LOGL_ERROR, "SI4 on the wrong TC: %d\n", tc);</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-         break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM48_MT_RR_SYSINFO_5:</span><br><span style="color: hsl(0, 100%, 40%);">-             break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM48_MT_RR_SYSINFO_6:</span><br><span style="color: hsl(0, 100%, 40%);">-             break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM48_MT_RR_SYSINFO_7:</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef BCCH_TC_CHECK</span><br><span style="color: hsl(0, 100%, 40%);">-         if (tc != 7)</span><br><span style="color: hsl(0, 100%, 40%);">-                    LOGP(DRR, LOGL_ERROR, "SI7 on the wrong TC: %d\n", tc);</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-         break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM48_MT_RR_SYSINFO_8:</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef BCCH_TC_CHECK</span><br><span style="color: hsl(0, 100%, 40%);">-         if (tc != 3)</span><br><span style="color: hsl(0, 100%, 40%);">-                    LOGP(DRR, LOGL_ERROR, "SI8 on the wrong TC: %d\n", tc);</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-         break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM48_MT_RR_SYSINFO_9:</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef BCCH_TC_CHECK</span><br><span style="color: hsl(0, 100%, 40%);">-         if (tc != 4)</span><br><span style="color: hsl(0, 100%, 40%);">-                    LOGP(DRR, LOGL_ERROR, "SI9 on the wrong TC: %d\n", tc);</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-         break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM48_MT_RR_SYSINFO_13:</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef BCCH_TC_CHECK</span><br><span style="color: hsl(0, 100%, 40%);">-                if (tc != 4 && tc != 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                 LOGP(DRR, LOGL_ERROR, "SI13 on the wrong TC: %d\n", tc);</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-                break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM48_MT_RR_SYSINFO_16:</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef BCCH_TC_CHECK</span><br><span style="color: hsl(0, 100%, 40%);">-                if (tc != 6)</span><br><span style="color: hsl(0, 100%, 40%);">-                    LOGP(DRR, LOGL_ERROR, "SI16 on the wrong TC: %d\n", tc);</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-                break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM48_MT_RR_SYSINFO_17:</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef BCCH_TC_CHECK</span><br><span style="color: hsl(0, 100%, 40%);">-                if (tc != 2)</span><br><span style="color: hsl(0, 100%, 40%);">-                    LOGP(DRR, LOGL_ERROR, "SI17 on the wrong TC: %d\n", tc);</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-                break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM48_MT_RR_SYSINFO_2bis:</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef BCCH_TC_CHECK</span><br><span style="color: hsl(0, 100%, 40%);">-              if (tc != 5)</span><br><span style="color: hsl(0, 100%, 40%);">-                    LOGP(DRR, LOGL_ERROR, "SI2bis on the wrong TC: %d\n", tc);</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-              break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM48_MT_RR_SYSINFO_2ter:</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef BCCH_TC_CHECK</span><br><span style="color: hsl(0, 100%, 40%);">-              if (tc != 5 && tc != 4)</span><br><span style="color: hsl(0, 100%, 40%);">-                 LOGP(DRR, LOGL_ERROR, "SI2ter on the wrong TC: %d\n", tc);</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-              break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM48_MT_RR_SYSINFO_5bis:</span><br><span style="color: hsl(0, 100%, 40%);">-          break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM48_MT_RR_SYSINFO_5ter:</span><br><span style="color: hsl(0, 100%, 40%);">-          break;</span><br><span>       default:</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGP(DRR, LOGL_ERROR, "Unknown SI: %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                  si_hdr->system_information);</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(120, 100%, 40%);">+                /* We don't care about other types of SI */</span><br><span style="color: hsl(120, 100%, 40%);">+               break; /* thus there is nothing to do */</span><br><span>     };</span><br><span> }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/11174">change 11174</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/11174"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmocom-bb </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I8c2594920fcad8a3e346b938bd0c20409f4d01c9 </div>
<div style="display:none"> Gerrit-Change-Number: 11174 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Vadim Yanitskiy <axilirator@gmail.com> </div>