aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2018-08-24 23:37:45 +0200
committerHarald Welte <laforge@gnumonks.org>2018-09-09 15:40:58 +0000
commit02d99db08b13589e1417c3448a07747f8805ba88 (patch)
treea54221a2e25add9a0d15df940aba855d5bad6827
parent4280829dfae0620c2326ba44caa31f5205d52a91 (diff)
CBCH: Move processing via L1SAP
for some historical reason, CBCH handling was not using the normal L1SAP boundary. Let's change that and traverse L1SAP just like for e.g. BCCH which is quite similar to CBCH handling. This also has the added benefit of logging CBCH via GSMTAP. Change-Id: Ibdba4c5e808330f8406f441a97fe0e81170fce97 Closes: OS#3534
-rw-r--r--include/osmo-bts/l1sap.h1
-rw-r--r--src/common/l1sap.c6
-rw-r--r--src/osmo-bts-litecell15/l1_if.c8
-rw-r--r--src/osmo-bts-octphy/l1_if.c8
-rw-r--r--src/osmo-bts-sysmo/l1_if.c8
5 files changed, 16 insertions, 15 deletions
diff --git a/include/osmo-bts/l1sap.h b/include/osmo-bts/l1sap.h
index 4568b7ed..3225a60f 100644
--- a/include/osmo-bts/l1sap.h
+++ b/include/osmo-bts/l1sap.h
@@ -23,6 +23,7 @@
#define L1SAP_IS_CHAN_RACH(chan_nr) ((chan_nr & 0xf8) == 0x88)
#define L1SAP_IS_CHAN_AGCH_PCH(chan_nr) ((chan_nr & 0xf8) == 0x90)
#define L1SAP_IS_CHAN_PDCH(chan_nr) ((chan_nr & 0xf8) == 0xc0)
+#define L1SAP_IS_CHAN_CBCH(chan_nr) ((chan_nr & 0xf8) == 0xc8)
/* rach type from ra */
#define L1SAP_IS_PACKET_RACH(ra) ((ra & 0xf0) == 0x70 && (ra & 0x0f) != 0x0f)
diff --git a/src/common/l1sap.c b/src/common/l1sap.c
index 55b4a4bb..b29fcc71 100644
--- a/src/common/l1sap.c
+++ b/src/common/l1sap.c
@@ -53,6 +53,7 @@
#include <osmo-bts/power_control.h>
#include <osmo-bts/msg_utils.h>
#include <osmo-bts/pcuif_proto.h>
+#include <osmo-bts/cbch.h>
struct gsm_lchan *get_lchan_by_chan_nr(struct gsm_bts_trx *trx,
unsigned int chan_nr)
@@ -265,6 +266,8 @@ static int gsmtap_ph_data(struct osmo_phsap_prim *l1sap, uint8_t *chan_type,
*chan_type = GSMTAP_CHANNEL_PCH;
else
*chan_type = GSMTAP_CHANNEL_AGCH;
+ } else if (L1SAP_IS_CHAN_CBCH(chan_nr)) {
+ *chan_type = GSMTAP_CHANNEL_CBCH51;
} else if (L1SAP_IS_CHAN_PDCH(chan_nr)) {
*chan_type = GSMTAP_CHANNEL_PDTCH;
}
@@ -737,6 +740,9 @@ static int l1sap_ph_rts_ind(struct gsm_bts_trx *trx,
memcpy(p, si, GSM_MACBLOCK_LEN);
else
memcpy(p, fill_frame, GSM_MACBLOCK_LEN);
+ } else if (L1SAP_IS_CHAN_CBCH(chan_nr)) {
+ p = msgb_put(msg, GSM_MACBLOCK_LEN);
+ bts_cbch_get(trx->bts, p, &g_time);
} else if (!(chan_nr & 0x80)) { /* only TCH/F, TCH/H, SDCCH/4 and SDCCH/8 have C5 bit cleared */
lchan = get_active_lchan_by_chan_nr(trx, chan_nr);
if (!lchan) {
diff --git a/src/osmo-bts-litecell15/l1_if.c b/src/osmo-bts-litecell15/l1_if.c
index f582bf2c..82299ff4 100644
--- a/src/osmo-bts-litecell15/l1_if.c
+++ b/src/osmo-bts-litecell15/l1_if.c
@@ -50,7 +50,6 @@
#include <osmo-bts/measurement.h>
#include <osmo-bts/pcu_if.h>
#include <osmo-bts/handover.h>
-#include <osmo-bts/cbch.h>
#include <osmo-bts/bts_model.h>
#include <osmo-bts/l1sap.h>
#include <osmo-bts/msg_utils.h>
@@ -700,6 +699,9 @@ static uint8_t chan_nr_by_sapi(struct gsm_bts_trx_ts *ts,
case GsmL1_Sapi_Bcch:
cbits = 0x10;
break;
+ case GsmL1_Sapi_Cbch:
+ cbits = 0xc8; /* Osmocom extension for CBCH via L1SAP */
+ break;
case GsmL1_Sapi_Sacch:
switch(pchan) {
case GSM_PCHAN_TCH_F:
@@ -867,10 +869,6 @@ static int handle_ph_readytosend_ind(struct lc15l1_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-octphy/l1_if.c b/src/osmo-bts-octphy/l1_if.c
index 91ef07b9..35d0aa33 100644
--- a/src/osmo-bts-octphy/l1_if.c
+++ b/src/osmo-bts-octphy/l1_if.c
@@ -43,7 +43,6 @@
#include <osmo-bts/logging.h>
#include <osmo-bts/l1sap.h>
#include <osmo-bts/handover.h>
-#include <osmo-bts/cbch.h>
#include "l1_if.h"
#include "l1_oml.h"
@@ -357,6 +356,9 @@ static uint8_t chan_nr_by_sapi(struct gsm_bts_trx_ts *ts,
case cOCTVC1_GSM_SAPI_ENUM_BCCH:
cbits = 0x10;
break;
+ case cOCTVC1_GSM_SAPI_ENUM_CBCH:
+ cbits = 0xc8; /* Osmocom extension for CBCH via L1SAP */
+ break;
case cOCTVC1_GSM_SAPI_ENUM_SACCH:
switch (pchan) {
case GSM_PCHAN_TCH_F:
@@ -1017,10 +1019,6 @@ static int handle_ph_readytosend_ind(struct octphy_hdl *fl1,
(g_time.t1 << 7) | (g_time.t2 << 2) | (t3p >> 1);
data_req->Data.abyDataContent[3] = (t3p & 1);
break;
- case cOCTVC1_GSM_SAPI_ENUM_CBCH:
- rc = bts_cbch_get(bts, data_req->Data.abyDataContent, &g_time);
- data_req->Data.ulDataLength = 23; /* GSM MAX BLK SIZE */
- break;
case cOCTVC1_GSM_SAPI_ENUM_PRACH:
#if 0
/* in case we decide to send an empty frame... */
diff --git a/src/osmo-bts-sysmo/l1_if.c b/src/osmo-bts-sysmo/l1_if.c
index 1321fe66..c0b42b42 100644
--- a/src/osmo-bts-sysmo/l1_if.c
+++ b/src/osmo-bts-sysmo/l1_if.c
@@ -46,7 +46,6 @@
#include <osmo-bts/measurement.h>
#include <osmo-bts/pcu_if.h>
#include <osmo-bts/handover.h>
-#include <osmo-bts/cbch.h>
#include <osmo-bts/bts_model.h>
#include <osmo-bts/l1sap.h>
#include <osmo-bts/msg_utils.h>
@@ -697,6 +696,9 @@ static uint8_t chan_nr_by_sapi(struct gsm_bts_trx_ts *ts,
case GsmL1_Sapi_Bcch:
cbits = 0x10;
break;
+ case GsmL1_Sapi_Cbch:
+ cbits = 0xc8; /* Osmocom extension for CBCH via L1SAP */
+ break;
case GsmL1_Sapi_Sacch:
switch(pchan) {
case GSM_PCHAN_TCH_F:
@@ -864,10 +866,6 @@ 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;