From 02d99db08b13589e1417c3448a07747f8805ba88 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Fri, 24 Aug 2018 23:37:45 +0200 Subject: 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 --- include/osmo-bts/l1sap.h | 1 + src/common/l1sap.c | 6 ++++++ src/osmo-bts-litecell15/l1_if.c | 8 +++----- src/osmo-bts-octphy/l1_if.c | 8 +++----- src/osmo-bts-sysmo/l1_if.c | 8 +++----- 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 #include #include +#include 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 #include #include -#include #include #include #include @@ -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 #include #include -#include #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 #include #include -#include #include #include #include @@ -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; -- cgit v1.2.3