<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/15932">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;">osmo_bsc_main.c: verify the physical channel mapping at startup<br><br>As per 3GPP TS 45.002, section 3.3.2.3, and table 3 of clause 7,<br>the following limitations apply mapping of CCCH/BCCH channels:<br><br>  - TS0/C0 shall be configured as CCCH/BCCH (optionally combined);<br>  - combined CCCH (CCCH+SDCCH4) can only be used on TS0;<br>  - additional CCCHs can be on TS2, TS4, and TS6;<br>  - additional CCCHs are not allowed if TS0 is combined.<br><br>Let's make sure that OsmoBSC is properly configured before starring.<br><br>Change-Id: I758ef80f7884ba35cdf59d671ee30222ffb9d68b<br>---<br>M include/osmocom/bsc/gsm_data.h<br>M src/osmo-bsc/gsm_data.c<br>M src/osmo-bsc/osmo_bsc_main.c<br>3 files changed, 63 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h</span><br><span>index ca9d294..23aacd6 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -1749,4 +1749,6 @@</span><br><span> </span><br><span> int bts_count_free_ts(struct gsm_bts *bts, enum gsm_phys_chan_config pchan);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+bool trx_has_valid_pchan_config(const struct gsm_bts_trx *trx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #endif /* _GSM_DATA_H */</span><br><span>diff --git a/src/osmo-bsc/gsm_data.c b/src/osmo-bsc/gsm_data.c</span><br><span>index 88981c0..e7fe065 100644</span><br><span>--- a/src/osmo-bsc/gsm_data.c</span><br><span>+++ b/src/osmo-bsc/gsm_data.c</span><br><span>@@ -1693,3 +1693,54 @@</span><br><span>     OSMO_VALUE_STRING(FOR_VTY),</span><br><span>  {}</span><br><span> };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+bool trx_has_valid_pchan_config(const struct gsm_bts_trx *trx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ bool combined = false;</span><br><span style="color: hsl(120, 100%, 40%);">+        bool result = true;</span><br><span style="color: hsl(120, 100%, 40%);">+   unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Iterate over all timeslots */</span><br><span style="color: hsl(120, 100%, 40%);">+      for (i = 0; i < 8; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+          const struct gsm_bts_trx_ts *ts = &trx->ts[i];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               switch (ts->pchan_from_config) {</span><br><span style="color: hsl(120, 100%, 40%);">+           case GSM_PCHAN_CCCH_SDCCH4_CBCH:</span><br><span style="color: hsl(120, 100%, 40%);">+              case GSM_PCHAN_CCCH_SDCCH4:</span><br><span style="color: hsl(120, 100%, 40%);">+                   /* CCCH+SDCCH4 can only be configured on TS0 */</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (i > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                               LOGP(DNM, LOGL_ERROR, "Combined CCCH is not allowed "</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     "on TS%u > 0\n", i);</span><br><span style="color: hsl(120, 100%, 40%);">+                               result = false;</span><br><span style="color: hsl(120, 100%, 40%);">+                       }</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (i == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                           combined = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* fall-through */</span><br><span style="color: hsl(120, 100%, 40%);">+            case GSM_PCHAN_CCCH:</span><br><span style="color: hsl(120, 100%, 40%);">+                  /* 3GPP TS 45.002, Table 3, CCCH: TS (0, 2, 4, 6) */</span><br><span style="color: hsl(120, 100%, 40%);">+                  if (i % 2 != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                             LOGP(DNM, LOGL_ERROR, "%s is not allowed on odd TS%u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 gsm_pchan_name(ts->pchan_from_config), i);</span><br><span style="color: hsl(120, 100%, 40%);">+                            result = false;</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%);">+                   /* There can be no more CCCHs if TS0/C0 is combined */</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (i > 0 && combined) {</span><br><span style="color: hsl(120, 100%, 40%);">+                           LOGP(DNM, LOGL_ERROR, "%s is not allowed on TS%u, "</span><br><span style="color: hsl(120, 100%, 40%);">+                              "because TS0 is using combined channel configuration\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                    gsm_pchan_name(ts->pchan_from_config), i);</span><br><span style="color: hsl(120, 100%, 40%);">+                            result = false;</span><br><span style="color: hsl(120, 100%, 40%);">+                       }</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%);">+                      /* CCCH on TS0 is mandatory for C0 */</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (trx->bts->c0 == trx && i == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                            LOGP(DNM, LOGL_ERROR, "TS0 on C0 must be CCCH/BCCH\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                             result = false;</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%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return result;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_main.c b/src/osmo-bsc/osmo_bsc_main.c</span><br><span>index dacd61a..3acdf30 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_main.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_main.c</span><br><span>@@ -401,6 +401,7 @@</span><br><span> </span><br><span> static int bootstrap_bts(struct gsm_bts *bts)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gsm_bts_trx *trx;</span><br><span>     int i, n;</span><br><span> </span><br><span>        if (!bts->model)</span><br><span>@@ -447,6 +448,15 @@</span><br><span>           return -EINVAL;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Verify the physical channel mapping */</span><br><span style="color: hsl(120, 100%, 40%);">+     llist_for_each_entry(trx, &bts->trx_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (!trx_has_valid_pchan_config(trx)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       LOGP(DNM, LOGL_ERROR, "TRX %u has invalid timeslot "</span><br><span style="color: hsl(120, 100%, 40%);">+                                              "configuration\n", trx->nr);</span><br><span style="color: hsl(120, 100%, 40%);">+                       return -EINVAL;</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%);">+</span><br><span>  /* Control Channel Description is set from vty/config */</span><br><span> </span><br><span>         /* Set ccch config by looking at ts config */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/15932">change 15932</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/+/15932"/><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: I758ef80f7884ba35cdf59d671ee30222ffb9d68b </div>
<div style="display:none"> Gerrit-Change-Number: 15932 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: fixeria <axilirator@gmail.com> </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>