<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/10603">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Harald Welte: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">CBCH: Implement CBCH support for osmo-bts-{trx,virtual}<br><br>This patch adds scheduler support for the channel combinations that<br>substitute SDCCH index 2 for a CBCH in either a SDCCH/8 or SDCCH/4.<br><br>Change-Id: Icc15603079a1709ec094f400a9bcf0008211890f<br>Closes: OS#1617<br>---<br>M README.md<br>M include/osmo-bts/scheduler.h<br>M src/common/scheduler.c<br>M src/common/scheduler_mframe.c<br>M src/osmo-bts-trx/main.c<br>M src/osmo-bts-virtual/main.c<br>6 files changed, 223 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/README.md b/README.md</span><br><span>index 43c27b2..38b4bd9 100644</span><br><span>--- a/README.md</span><br><span>+++ b/README.md</span><br><span>@@ -124,4 +124,3 @@</span><br><span>  * TCH/F_PDCH cannel not working as voice (https://osmocom.org/issues/1865)</span><br><span>  * No BER value delivered to OsmoPCU (https://osmocom.org/issues/1855)</span><br><span>  * No 11bit RACH support (https://osmocom.org/issues/1854)</span><br><span style="color: hsl(0, 100%, 40%);">- * No CBCH support (https://osmocom.org/issues/1617)</span><br><span>diff --git a/include/osmo-bts/scheduler.h b/include/osmo-bts/scheduler.h</span><br><span>index 3fe7978..32d6e91 100644</span><br><span>--- a/include/osmo-bts/scheduler.h</span><br><span>+++ b/include/osmo-bts/scheduler.h</span><br><span>@@ -47,6 +47,7 @@</span><br><span>  TRXC_SACCH8_7,</span><br><span>       TRXC_PDTCH,</span><br><span>  TRXC_PTCCH,</span><br><span style="color: hsl(120, 100%, 40%);">+   TRXC_CBCH,</span><br><span>   _TRX_CHAN_MAX</span><br><span> };</span><br><span> </span><br><span>diff --git a/src/common/scheduler.c b/src/common/scheduler.c</span><br><span>index 5c250e4..8a6c007 100644</span><br><span>--- a/src/common/scheduler.c</span><br><span>+++ b/src/common/scheduler.c</span><br><span>@@ -116,6 +116,7 @@</span><br><span>  */</span><br><span> </span><br><span> const struct trx_chan_desc trx_chan_desc[_TRX_CHAN_MAX] = {</span><br><span style="color: hsl(120, 100%, 40%);">+  /*      is_pdch chan_type       chan_nr link_id         name            rts_fn          dl_fn           ul_fn   auto_active */</span><br><span>       {       0,      TRXC_IDLE,      0,      LID_DEDIC,      "IDLE",               NULL,           tx_idle_fn,     NULL,           1 },</span><br><span>       { 0,      TRXC_FCCH,      0,      LID_DEDIC,      "FCCH",               NULL,           tx_fcch_fn,     NULL,           1 },</span><br><span>       { 0,      TRXC_SCH,       0,      LID_DEDIC,      "SCH",                NULL,           tx_sch_fn,      NULL,           1 },</span><br><span>@@ -154,6 +155,7 @@</span><br><span>       {   0,      TRXC_SACCH8_7,  0x78,   LID_SACCH,      "SACCH/8(7)", rts_data_fn,    tx_data_fn,     rx_data_fn,     0 },</span><br><span>       { 1,      TRXC_PDTCH,     0xc0,   LID_DEDIC,      "PDTCH",      rts_data_fn,    tx_pdtch_fn,    rx_pdtch_fn,    0 },</span><br><span>       { 1,      TRXC_PTCCH,     0xc0,   LID_DEDIC,      "PTCCH",      rts_data_fn,    tx_data_fn,     rx_data_fn,     0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      {   0,      TRXC_CBCH,      0xc8,   LID_DEDIC,      "CBCH",               rts_data_fn,    tx_data_fn,     NULL,           1 },</span><br><span> };</span><br><span> </span><br><span> const struct value_string trx_chan_type_names[] = {</span><br><span>@@ -195,6 +197,7 @@</span><br><span>  OSMO_VALUE_STRING(TRXC_SACCH8_7),</span><br><span>    OSMO_VALUE_STRING(TRXC_PDTCH),</span><br><span>       OSMO_VALUE_STRING(TRXC_PTCCH),</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_VALUE_STRING(TRXC_CBCH),</span><br><span>        OSMO_VALUE_STRING(_TRX_CHAN_MAX),</span><br><span>    { 0, NULL }</span><br><span> };</span><br><span>diff --git a/src/common/scheduler_mframe.c b/src/common/scheduler_mframe.c</span><br><span>index ab0b5b6..b78ffa8 100644</span><br><span>--- a/src/common/scheduler_mframe.c</span><br><span>+++ b/src/common/scheduler_mframe.c</span><br><span>@@ -2,7 +2,7 @@</span><br><span> </span><br><span> /* (C) 2013 by Andreas Eversberg <jolly@eversberg.eu></span><br><span>  * (C) 2015 by Alexander Chemeris <Alexander.Chemeris@fairwaves.co></span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2015-2017 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2015-2018 by Harald Welte <laforge@gnumonks.org></span><br><span>  *</span><br><span>  * All Rights Reserved</span><br><span>  *</span><br><span>@@ -170,6 +170,113 @@</span><br><span>       {       TRXC_IDLE,      0,      TRXC_SDCCH4_2,  3 },</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static const struct trx_sched_frame frame_bcch_sdcch4_cbch[102] = {</span><br><span style="color: hsl(120, 100%, 40%);">+/* dl_chan         dl_bid  ul_chan         ul_bid */</span><br><span style="color: hsl(120, 100%, 40%);">+      {      TRXC_FCCH,      0,      TRXC_SDCCH4_3,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      {   TRXC_SCH,       0,      TRXC_SDCCH4_3,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_BCCH,        0,      TRXC_SDCCH4_3,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_BCCH,        1,      TRXC_SDCCH4_3,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_BCCH,        2,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_BCCH,        3,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CCCH,        0,      TRXC_IDLE,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CCCH,        1,      TRXC_IDLE,      1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CCCH,        2,      TRXC_IDLE,      2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CCCH,        3,      TRXC_IDLE,      3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      {   TRXC_FCCH,      0,      TRXC_SACCH4_3,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      {   TRXC_SCH,       0,      TRXC_SACCH4_3,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CCCH,        0,      TRXC_SACCH4_3,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CCCH,        1,      TRXC_SACCH4_3,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CCCH,        2,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CCCH,        3,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CCCH,        0,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CCCH,        1,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CCCH,        2,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CCCH,        3,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      {   TRXC_FCCH,      0,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      {   TRXC_SCH,       0,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH4_0,    0,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH4_0,    1,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH4_0,    2,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH4_0,    3,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH4_1,    0,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH4_1,    1,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH4_1,    2,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH4_1,    3,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      {   TRXC_FCCH,      0,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      {   TRXC_SCH,       0,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CBCH,        0,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CBCH,        1,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CBCH,        2,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CBCH,        3,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH4_3,    0,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH4_3,    1,      TRXC_SDCCH4_0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH4_3,    2,      TRXC_SDCCH4_0,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH4_3,    3,      TRXC_SDCCH4_0,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      {   TRXC_FCCH,      0,      TRXC_SDCCH4_0,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      {   TRXC_SCH,       0,      TRXC_SDCCH4_1,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH4_0,    0,      TRXC_SDCCH4_1,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH4_0,    1,      TRXC_SDCCH4_1,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH4_0,    2,      TRXC_SDCCH4_1,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH4_0,    3,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH4_1,    0,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH4_1,    1,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH4_1,    2,      TRXC_RACH,      1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH4_1,    3,      TRXC_RACH,      2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      {   TRXC_IDLE,      0,      TRXC_RACH,      3 },</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_FCCH,      0,      TRXC_SDCCH4_3,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      {   TRXC_SCH,       0,      TRXC_SDCCH4_3,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_BCCH,        0,      TRXC_SDCCH4_3,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_BCCH,        1,      TRXC_SDCCH4_3,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_BCCH,        2,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_BCCH,        3,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CCCH,        0,      TRXC_SACCH4_0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CCCH,        1,      TRXC_SACCH4_0,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CCCH,        2,      TRXC_SACCH4_0,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CCCH,        3,      TRXC_SACCH4_0,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      {   TRXC_FCCH,      0,      TRXC_SACCH4_1,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      {   TRXC_SCH,       0,      TRXC_SACCH4_1,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CCCH,        0,      TRXC_SACCH4_1,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CCCH,        1,      TRXC_SACCH4_1,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CCCH,        2,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CCCH,        3,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CCCH,        0,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CCCH,        1,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CCCH,        2,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CCCH,        3,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      {   TRXC_FCCH,      0,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      {   TRXC_SCH,       0,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH4_0,    0,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH4_0,    1,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH4_0,    2,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH4_0,    3,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH4_1,    0,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH4_1,    1,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH4_1,    2,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH4_1,    3,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      {   TRXC_FCCH,      0,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      {   TRXC_SCH,       0,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CBCH,        0,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CBCH,        1,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CBCH,        2,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CBCH,        3,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH4_3,    0,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH4_3,    1,      TRXC_SDCCH4_0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH4_3,    2,      TRXC_SDCCH4_0,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH4_3,    3,      TRXC_SDCCH4_0,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      {   TRXC_FCCH,      0,      TRXC_SDCCH4_0,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      {   TRXC_SCH,       0,      TRXC_SDCCH4_1,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_IDLE,        0,      TRXC_SDCCH4_1,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_IDLE,        1,      TRXC_SDCCH4_1,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_IDLE,        2,      TRXC_SDCCH4_1,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_IDLE,        3,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH4_3,    0,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH4_3,    1,      TRXC_RACH,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH4_3,    2,      TRXC_RACH,      1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH4_3,    3,      TRXC_RACH,      2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      {   TRXC_IDLE,      0,      TRXC_SDCCH4_2,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static const struct trx_sched_frame frame_sdcch8[102] = {</span><br><span> /*   dl_chan         dl_bid  ul_chan         ul_bid */</span><br><span>       { TRXC_SDCCH8_0,     0,      TRXC_SACCH8_5,  0 },</span><br><span>@@ -277,6 +384,113 @@</span><br><span>       { TRXC_IDLE,      0,      TRXC_SACCH8_4,  3 },</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static const struct trx_sched_frame frame_sdcch8_cbch[102] = {</span><br><span style="color: hsl(120, 100%, 40%);">+/*      dl_chan         dl_bid  ul_chan         ul_bid */</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_0,       0,      TRXC_SACCH8_5,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_0,    1,      TRXC_SACCH8_5,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_0,    2,      TRXC_SACCH8_5,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_0,    3,      TRXC_SACCH8_5,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_1,    0,      TRXC_SACCH8_6,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_1,    1,      TRXC_SACCH8_6,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_1,    2,      TRXC_SACCH8_6,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_1,    3,      TRXC_SACCH8_6,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CBCH,        0,      TRXC_SACCH8_7,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CBCH,        1,      TRXC_SACCH8_7,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CBCH,        2,      TRXC_SACCH8_7,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CBCH,        3,      TRXC_SACCH8_7,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_3,    0,      TRXC_IDLE,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_3,    1,      TRXC_IDLE,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_3,    2,      TRXC_IDLE,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_3,    3,      TRXC_SDCCH8_0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_4,    0,      TRXC_SDCCH8_0,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_4,    1,      TRXC_SDCCH8_0,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_4,    2,      TRXC_SDCCH8_0,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_4,    3,      TRXC_SDCCH8_1,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_5,    0,      TRXC_SDCCH8_1,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_5,    1,      TRXC_SDCCH8_1,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_5,    2,      TRXC_SDCCH8_1,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_5,    3,      TRXC_IDLE,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_6,    0,      TRXC_IDLE,      1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_6,    1,      TRXC_IDLE,      2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_6,    2,      TRXC_IDLE,      3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_6,    3,      TRXC_SDCCH8_3,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_7,    0,      TRXC_SDCCH8_3,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_7,    1,      TRXC_SDCCH8_3,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_7,    2,      TRXC_SDCCH8_3,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_7,    3,      TRXC_SDCCH8_4,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH8_0,    0,      TRXC_SDCCH8_4,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH8_0,    1,      TRXC_SDCCH8_4,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH8_0,    2,      TRXC_SDCCH8_4,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH8_0,    3,      TRXC_SDCCH8_5,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH8_1,    0,      TRXC_SDCCH8_5,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH8_1,    1,      TRXC_SDCCH8_5,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH8_1,    2,      TRXC_SDCCH8_5,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH8_1,    3,      TRXC_SDCCH8_6,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_IDLE,        0,      TRXC_SDCCH8_6,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_IDLE,        1,      TRXC_SDCCH8_6,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_IDLE,        2,      TRXC_SDCCH8_6,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_IDLE,        3,      TRXC_SDCCH8_7,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH8_3,    0,      TRXC_SDCCH8_7,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH8_3,    1,      TRXC_SDCCH8_7,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH8_3,    2,      TRXC_SDCCH8_7,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH8_3,    3,      TRXC_SACCH8_0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_IDLE,        0,      TRXC_SACCH8_0,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_IDLE,        0,      TRXC_SACCH8_0,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_IDLE,        0,      TRXC_SACCH8_0,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_0,  0,      TRXC_SACCH8_1,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_0,    1,      TRXC_SACCH8_1,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_0,    2,      TRXC_SACCH8_1,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_0,    3,      TRXC_SACCH8_1,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_1,    0,      TRXC_IDLE,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_1,    1,      TRXC_IDLE,      1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_1,    2,      TRXC_IDLE,      2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_1,    3,      TRXC_IDLE,      3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CBCH,        0,      TRXC_SACCH8_3,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CBCH,        1,      TRXC_SACCH8_3,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CBCH,        2,      TRXC_SACCH8_3,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_CBCH,        3,      TRXC_SACCH8_3,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_3,    0,      TRXC_IDLE,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_3,    1,      TRXC_IDLE,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_3,    2,      TRXC_IDLE,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_3,    3,      TRXC_SDCCH8_0,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_4,    0,      TRXC_SDCCH8_0,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_4,    1,      TRXC_SDCCH8_0,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_4,    2,      TRXC_SDCCH8_0,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_4,    3,      TRXC_SDCCH8_1,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_5,    0,      TRXC_SDCCH8_1,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_5,    1,      TRXC_SDCCH8_1,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_5,    2,      TRXC_SDCCH8_1,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_5,    3,      TRXC_IDLE,      0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_6,    0,      TRXC_IDLE,      1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_6,    1,      TRXC_IDLE,      2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_6,    2,      TRXC_IDLE,      3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_6,    3,      TRXC_SDCCH8_3,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_7,    0,      TRXC_SDCCH8_3,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_7,    1,      TRXC_SDCCH8_3,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_7,    2,      TRXC_SDCCH8_3,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SDCCH8_7,    3,      TRXC_SDCCH8_4,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH8_4,    0,      TRXC_SDCCH8_4,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH8_4,    1,      TRXC_SDCCH8_4,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH8_4,    2,      TRXC_SDCCH8_4,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH8_4,    3,      TRXC_SDCCH8_5,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH8_5,    0,      TRXC_SDCCH8_5,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH8_5,    1,      TRXC_SDCCH8_5,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH8_5,    2,      TRXC_SDCCH8_5,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH8_5,    3,      TRXC_SDCCH8_6,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH8_6,    0,      TRXC_SDCCH8_6,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH8_6,    1,      TRXC_SDCCH8_6,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH8_6,    2,      TRXC_SDCCH8_6,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH8_6,    3,      TRXC_SDCCH8_7,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH8_7,    0,      TRXC_SDCCH8_7,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH8_7,    1,      TRXC_SDCCH8_7,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH8_7,    2,      TRXC_SDCCH8_7,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_SACCH8_7,    3,      TRXC_SACCH8_4,  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_IDLE,        0,      TRXC_SACCH8_4,  1 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_IDLE,        0,      TRXC_SACCH8_4,  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TRXC_IDLE,        0,      TRXC_SACCH8_4,  3 },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static const struct trx_sched_frame frame_tchf_ts0[104] = {</span><br><span> /* dl_chan         dl_bid  ul_chan         ul_bid */</span><br><span>       { TRXC_TCHF, 0,      TRXC_TCHF,      0 }, { TRXC_TCHF,       1,      TRXC_TCHF,      1 }, { TRXC_TCHF,       2,      TRXC_TCHF,      2 }, { TRXC_TCHF,       3,      TRXC_TCHF,      3 },</span><br><span>@@ -749,7 +963,9 @@</span><br><span>   { GSM_PCHAN_NONE,               0xff,   0,      NULL,                   "NONE"},</span><br><span>   { GSM_PCHAN_CCCH,               0xff,   51,     frame_bcch,             "BCCH+CCCH" },</span><br><span>     { GSM_PCHAN_CCCH_SDCCH4,        0xff,   102,    frame_bcch_sdcch4,      "BCCH+CCCH+SDCCH/4+SACCH/4" },</span><br><span style="color: hsl(120, 100%, 40%);">+      { GSM_PCHAN_CCCH_SDCCH4_CBCH,   0xff,   102,    frame_bcch_sdcch4_cbch, "BCCH+CCCH+SDCCH/4+SACCH/4+CBCH" },</span><br><span>        { GSM_PCHAN_SDCCH8_SACCH8C,     0xff,   102,    frame_sdcch8,           "SDCCH/8+SACCH/8" },</span><br><span style="color: hsl(120, 100%, 40%);">+        { GSM_PCHAN_SDCCH8_SACCH8C_CBCH,0xff,   102,    frame_sdcch8_cbch,      "SDCCH/8+SACCH/8+CBCH" },</span><br><span>  { GSM_PCHAN_TCH_F,              0x01,   104,    frame_tchf_ts0,         "TCH/F+SACCH" },</span><br><span>   { GSM_PCHAN_TCH_F,              0x02,   104,    frame_tchf_ts1,         "TCH/F+SACCH" },</span><br><span>   { GSM_PCHAN_TCH_F,              0x04,   104,    frame_tchf_ts2,         "TCH/F+SACCH" },</span><br><span>diff --git a/src/osmo-bts-trx/main.c b/src/osmo-bts-trx/main.c</span><br><span>index 3b82e42..61610f7 100644</span><br><span>--- a/src/osmo-bts-trx/main.c</span><br><span>+++ b/src/osmo-bts-trx/main.c</span><br><span>@@ -111,6 +111,7 @@</span><br><span>    gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_EFR);</span><br><span>     gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_AMR);</span><br><span>     gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_H_AMR);</span><br><span style="color: hsl(120, 100%, 40%);">+      gsm_bts_set_feature(bts, BTS_FEAT_CBCH);</span><br><span> </span><br><span>         bts_model_vty_init(bts);</span><br><span> </span><br><span>diff --git a/src/osmo-bts-virtual/main.c b/src/osmo-bts-virtual/main.c</span><br><span>index 81fb958..b66a3ff 100644</span><br><span>--- a/src/osmo-bts-virtual/main.c</span><br><span>+++ b/src/osmo-bts-virtual/main.c</span><br><span>@@ -65,6 +65,7 @@</span><br><span>    gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_EFR);</span><br><span>     gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_AMR);</span><br><span>     gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_H_AMR);</span><br><span style="color: hsl(120, 100%, 40%);">+      gsm_bts_set_feature(bts, BTS_FEAT_CBCH);</span><br><span> </span><br><span>         bts_model_vty_init(bts);</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10603">change 10603</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/10603"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bts </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: Icc15603079a1709ec094f400a9bcf0008211890f </div>
<div style="display:none"> Gerrit-Change-Number: 10603 </div>
<div style="display:none"> Gerrit-PatchSet: 6 </div>
<div style="display:none"> Gerrit-Owner: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Vadim Yanitskiy <axilirator@gmail.com> </div>