aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/Makefile.am2
-rw-r--r--src/common/cbch.c8
-rw-r--r--src/common/measurement.c4
-rw-r--r--src/common/oml.c18
-rw-r--r--src/common/rsl.c6
-rw-r--r--src/common/support.c4
-rw-r--r--src/osmo-bts-sysmo/l1_if.c4
-rw-r--r--src/osmo-bts-sysmo/oml.c17
8 files changed, 58 insertions, 5 deletions
diff --git a/src/common/Makefile.am b/src/common/Makefile.am
index 77395020..dd4dd216 100644
--- a/src/common/Makefile.am
+++ b/src/common/Makefile.am
@@ -8,4 +8,4 @@ libbts_a_SOURCES = gsm_data_shared.c sysinfo.c logging.c abis.c oml.c bts.c \
load_indication.c pcu_sock.c handover.c msg_utils.c \
load_indication.c pcu_sock.c handover.c msg_utils.c \
tx_power.c bts_ctrl_commands.c bts_ctrl_lookup.c \
- etws_p1.c
+ etws_p1.c cbch.c
diff --git a/src/common/cbch.c b/src/common/cbch.c
new file mode 100644
index 00000000..e3ce8975
--- /dev/null
+++ b/src/common/cbch.c
@@ -0,0 +1,8 @@
+
+#include <osmo-bts/bts.h>
+
+int bts_cbch_get(struct gsm_bts *bts, uint8_t *outbuf, struct gsm_time *g_time)
+{
+ /* FIXME: Actaully schedule + return CBCH messages */
+ return 0;
+}
diff --git a/src/common/measurement.c b/src/common/measurement.c
index f497e40e..41a01708 100644
--- a/src/common/measurement.c
+++ b/src/common/measurement.c
@@ -70,11 +70,13 @@ static int is_meas_complete(enum gsm_phys_chan_config pchan, unsigned int ts,
rc = 1;
break;
case GSM_PCHAN_SDCCH8_SACCH8C:
+ case GSM_PCHAN_SDCCH8_SACCH8C_CBCH:
fn_mod = fn % 102;
if (fn_mod == 11)
rc = 1;
break;
case GSM_PCHAN_CCCH_SDCCH4:
+ case GSM_PCHAN_CCCH_SDCCH4_CBCH:
fn_mod = fn % 102;
if (fn_mod == 36)
rc = 1;
@@ -214,9 +216,11 @@ static const uint8_t subslots_per_pchan[_GSM_PCHAN_MAX] = {
[GSM_PCHAN_NONE] = 0,
[GSM_PCHAN_CCCH] = 0,
[GSM_PCHAN_CCCH_SDCCH4] = 4,
+ [GSM_PCHAN_CCCH_SDCCH4_CBCH] = 4,
[GSM_PCHAN_TCH_F] = 1,
[GSM_PCHAN_TCH_H] = 2,
[GSM_PCHAN_SDCCH8_SACCH8C] = 8,
+ [GSM_PCHAN_SDCCH8_SACCH8C_CBCH] = 8,
/* FIXME: what about dynamic TCH_F_TCH_H ? */
[GSM_PCHAN_TCH_F_PDCH] = 1,
};
diff --git a/src/common/oml.c b/src/common/oml.c
index 65152953..5f9c0a2b 100644
--- a/src/common/oml.c
+++ b/src/common/oml.c
@@ -601,10 +601,17 @@ static int conf_lchans_for_pchan(struct gsm_bts_trx_ts *ts)
unsigned int i;
switch (ts->pchan) {
+ case GSM_PCHAN_CCCH_SDCCH4_CBCH:
+ /* fallthrough */
case GSM_PCHAN_CCCH_SDCCH4:
for (i = 0; i < 4; i++) {
lchan = &ts->lchan[i];
- lchan->type = GSM_LCHAN_SDCCH;
+ if (ts->pchan == GSM_PCHAN_CCCH_SDCCH4_CBCH
+ && i == 2) {
+ lchan->type = GSM_LCHAN_CBCH;
+ } else {
+ lchan->type = GSM_LCHAN_SDCCH;
+ }
}
/* fallthrough */
case GSM_PCHAN_CCCH:
@@ -621,10 +628,17 @@ static int conf_lchans_for_pchan(struct gsm_bts_trx_ts *ts)
lchan->type = GSM_LCHAN_TCH_H;
}
break;
+ case GSM_PCHAN_SDCCH8_SACCH8C_CBCH:
+ /* fallthrough */
case GSM_PCHAN_SDCCH8_SACCH8C:
for (i = 0; i < 8; i++) {
lchan = &ts->lchan[i];
- lchan->type = GSM_LCHAN_SDCCH;
+ if (ts->pchan == GSM_PCHAN_SDCCH8_SACCH8C_CBCH
+ && i == 2) {
+ lchan->type = GSM_LCHAN_CBCH;
+ } else {
+ lchan->type = GSM_LCHAN_SDCCH;
+ }
}
break;
case GSM_PCHAN_PDCH:
diff --git a/src/common/rsl.c b/src/common/rsl.c
index 11c7c715..000c1797 100644
--- a/src/common/rsl.c
+++ b/src/common/rsl.c
@@ -162,12 +162,14 @@ struct gsm_lchan *rsl_lchan_lookup(struct gsm_bts_trx *trx, uint8_t chan_nr)
chan_nr, ts->pchan);
} else if ((cbits & 0x1c) == 0x04) {
lch_idx = cbits & 0x3; /* SDCCH/4 */
- if (ts->pchan != GSM_PCHAN_CCCH_SDCCH4)
+ if (ts->pchan != GSM_PCHAN_CCCH_SDCCH4 &&
+ ts->pchan != GSM_PCHAN_CCCH_SDCCH4_CBCH)
LOGP(DRSL, LOGL_ERROR, "chan_nr=0x%02x but pchan=%u\n",
chan_nr, ts->pchan);
} else if ((cbits & 0x18) == 0x08) {
lch_idx = cbits & 0x7; /* SDCCH/8 */
- if (ts->pchan != GSM_PCHAN_SDCCH8_SACCH8C)
+ if (ts->pchan != GSM_PCHAN_SDCCH8_SACCH8C &&
+ ts->pchan != GSM_PCHAN_SDCCH8_SACCH8C_CBCH)
LOGP(DRSL, LOGL_ERROR, "chan_nr=0x%02x but pchan=%u\n",
chan_nr, ts->pchan);
} else if (cbits == 0x10 || cbits == 0x11 || cbits == 0x12) {
diff --git a/src/common/support.c b/src/common/support.c
index e271b957..d47a6a99 100644
--- a/src/common/support.c
+++ b/src/common/support.c
@@ -70,8 +70,12 @@ char *bts_support_comb_name(uint8_t chan_comb)
return("BCCH");
if (chan_comb == NM_CHANC_BCCHComb)
return("BCCH+SDCCH/4");
+ if (chan_comb == NM_CHANC_BCCH_CBCH)
+ return("BCCH+CBCH+SDCCH/4");
if (chan_comb == NM_CHANC_SDCCH)
return("SDCCH/8");
+ if (chan_comb == NM_CHANC_SDCCH_CBCH)
+ return("SDCCH/8+CBCH");
if (chan_comb == NM_CHANC_TCHFull)
return("TCH/F");
if (chan_comb == NM_CHANC_TCHHalf)
diff --git a/src/osmo-bts-sysmo/l1_if.c b/src/osmo-bts-sysmo/l1_if.c
index 4b9ab3e8..44eff967 100644
--- a/src/osmo-bts-sysmo/l1_if.c
+++ b/src/osmo-bts-sysmo/l1_if.c
@@ -587,6 +587,10 @@ static int handle_ph_readytosend_ind(struct femtol1_hdl *fl1,
case GsmL1_Sapi_Prach:
goto empty_frame;
break;
+ case GsmL1_Sapi_Cbch:
+ /* get them from bts->si_buf[] */
+ bts_cbch_get(bts, msu_param->u8Buffer, &g_time);
+ break;
default:
memcpy(msu_param->u8Buffer, fill_frame, GSM_MACBLOCK_LEN);
break;
diff --git a/src/osmo-bts-sysmo/oml.c b/src/osmo-bts-sysmo/oml.c
index f2aabb9f..2bfc241c 100644
--- a/src/osmo-bts-sysmo/oml.c
+++ b/src/osmo-bts-sysmo/oml.c
@@ -63,9 +63,11 @@ static const enum GsmL1_LogChComb_t pchan_to_logChComb[_GSM_PCHAN_MAX] = {
[GSM_PCHAN_NONE] = GsmL1_LogChComb_0,
[GSM_PCHAN_CCCH] = GsmL1_LogChComb_IV,
[GSM_PCHAN_CCCH_SDCCH4] = GsmL1_LogChComb_V,
+ [GSM_PCHAN_CCCH_SDCCH4_CBCH] = GsmL1_LogChComb_V,
[GSM_PCHAN_TCH_F] = GsmL1_LogChComb_I,
[GSM_PCHAN_TCH_H] = GsmL1_LogChComb_II,
[GSM_PCHAN_SDCCH8_SACCH8C] = GsmL1_LogChComb_VII,
+ [GSM_PCHAN_SDCCH8_SACCH8C_CBCH] = GsmL1_LogChComb_VII,
[GSM_PCHAN_PDCH] = GsmL1_LogChComb_XIII,
//[GSM_PCHAN_TCH_F_PDCH] = FIXME,
[GSM_PCHAN_UNKNOWN] = GsmL1_LogChComb_0,
@@ -207,9 +209,12 @@ static int opstart_compl(struct gsm_abis_mo *mo, struct msgb *l1_msg)
/* ugly hack to auto-activate all SAPIs for the BCCH/CCCH on TS0 */
if (mo->obj_class == NM_OC_CHANNEL && mo->obj_inst.trx_nr == 0 &&
mo->obj_inst.ts_nr == 0) {
+ struct gsm_lchan *cbch = gsm_bts_get_cbch(mo->bts);
DEBUGP(DL1C, "====> trying to activate lchans of BCCH\n");
mo->bts->c0->ts[0].lchan[4].rel_act_kind = LCHAN_REL_ACT_OML;
lchan_activate(&mo->bts->c0->ts[0].lchan[4]);
+ if (cbch)
+ lchan_activate(cbch);
}
/* Send OPSTART ack */
@@ -430,11 +435,13 @@ GsmL1_SubCh_t lchan_to_GsmL1_SubCh_t(const struct gsm_lchan *lchan)
{
switch (lchan->ts->pchan) {
case GSM_PCHAN_CCCH_SDCCH4:
+ case GSM_PCHAN_CCCH_SDCCH4_CBCH:
if (lchan->type == GSM_LCHAN_CCCH)
return GsmL1_SubCh_NA;
/* fall-through */
case GSM_PCHAN_TCH_H:
case GSM_PCHAN_SDCCH8_SACCH8C:
+ case GSM_PCHAN_SDCCH8_SACCH8C_CBCH:
return lchan->nr;
case GSM_PCHAN_NONE:
case GSM_PCHAN_CCCH:
@@ -487,6 +494,12 @@ static const struct sapi_dir sdcch_sapis[] = {
{ GsmL1_Sapi_Sacch, GsmL1_Dir_RxUplink },
};
+static const struct sapi_dir cbch_sapis[] = {
+ { GsmL1_Sapi_Cbch, GsmL1_Dir_TxDownlink },
+ /* Does the CBCH really have a SACCH in Downlink? */
+ { GsmL1_Sapi_Sacch, GsmL1_Dir_TxDownlink },
+};
+
static const struct sapi_dir pdtch_sapis[] = {
{ GsmL1_Sapi_Pdtch, GsmL1_Dir_TxDownlink },
{ GsmL1_Sapi_Pdtch, GsmL1_Dir_RxUplink },
@@ -528,6 +541,10 @@ static const struct lchan_sapis sapis_for_lchan[_GSM_LCHAN_MAX] = {
.sapis = pdtch_sapis,
.num_sapis = ARRAY_SIZE(pdtch_sapis),
},
+ [GSM_LCHAN_CBCH] = {
+ .sapis = cbch_sapis,
+ .num_sapis = ARRAY_SIZE(cbch_sapis),
+ },
};
static const struct lchan_sapis sapis_for_ho = {