<p>Harald Welte has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/10603">View Change</a></p><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, 222 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/03/10603/1</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..6d8bf72 100644</span><br><span>--- a/src/common/scheduler.c</span><br><span>+++ b/src/common/scheduler.c</span><br><span>@@ -154,6 +154,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, 0xc1, LID_DEDIC, "PTCCH", 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 +196,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: newchange </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: 1 </div>
<div style="display:none"> Gerrit-Owner: Harald Welte <laforge@gnumonks.org> </div>