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