[PATCH 3/3] Add gsmtap support to generic bts

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/OpenBSC@lists.osmocom.org/.

msuraev at sysmocom.de msuraev at sysmocom.de
Fri Feb 19 18:20:14 UTC 2016


From: Max <msuraev at sysmocom.de>

Instrument TX and RX functions dealing with regular BTS (without direct
DSP access) to use GSMTAP. Previously only DSP-related functions were
instrumented.

Signed-off-by: Max <msuraev at sysmocom.de>
---
 src/pcu_l1_if.cpp | 36 ++++++++++++++++++++++++++----------
 1 file changed, 26 insertions(+), 10 deletions(-)

diff --git a/src/pcu_l1_if.cpp b/src/pcu_l1_if.cpp
index e816e6f..1b727a5 100644
--- a/src/pcu_l1_if.cpp
+++ b/src/pcu_l1_if.cpp
@@ -30,6 +30,8 @@ extern "C" {
 #include <osmocom/core/talloc.h>
 #include <osmocom/core/select.h>
 #include <osmocom/core/msgb.h>
+#include <osmocom/core/gsmtap_util.h>
+#include <osmocom/core/gsmtap.h>
 }
 
 #include <gprs_rlcmac.h>
@@ -93,7 +95,7 @@ static int pcu_tx_act_req(uint8_t trx, uint8_t ts, uint8_t activate)
 
 static int pcu_tx_data_req(uint8_t trx, uint8_t ts, uint8_t sapi,
 	uint16_t arfcn, uint32_t fn, uint8_t block_nr, uint8_t *data,
-	uint8_t len)
+	uint8_t len, struct gsmtap_inst *gsmtap)
 {
 	struct msgb *msg;
 	struct gsm_pcu_if *pcu_prim;
@@ -118,54 +120,58 @@ static int pcu_tx_data_req(uint8_t trx, uint8_t ts, uint8_t sapi,
 	memcpy(data_req->data, data, len);
 	data_req->len = len;
 
+	gsmtap_send(gsmtap, arfcn, ts, GSMTAP_CHANNEL_PACCH, 0,	fn, 0, 0, data,	len);
+
 	return pcu_sock_send(msg);
 }
 
 void pcu_l1if_tx_pdtch(msgb *msg, uint8_t trx, uint8_t ts, uint16_t arfcn,
 	uint32_t fn, uint8_t block_nr)
 {
-#ifdef ENABLE_SYSMODSP
 	struct gprs_rlcmac_bts *bts = bts_main_data();
 
+#ifdef ENABLE_SYSMODSP
 	if (bts->trx[trx].fl1h)
 		l1if_pdch_req(bts->trx[trx].fl1h, ts, 0, fn, arfcn, block_nr,
 			msg->data, msg->len);
 	else
 #endif
 		pcu_tx_data_req(trx, ts, PCU_IF_SAPI_PDTCH, arfcn, fn, block_nr,
-			msg->data, msg->len);
+			msg->data, msg->len, bts->gsmtap);
 	msgb_free(msg);
 }
 
 void pcu_l1if_tx_ptcch(msgb *msg, uint8_t trx, uint8_t ts, uint16_t arfcn,
 	uint32_t fn, uint8_t block_nr)
 {
-#ifdef ENABLE_SYSMODSP
 	struct gprs_rlcmac_bts *bts = bts_main_data();
 
+#ifdef ENABLE_SYSMODSP
 	if (bts->trx[trx].fl1h)
 		l1if_pdch_req(bts->trx[trx].fl1h, ts, 1, fn, arfcn, block_nr,
 			msg->data, msg->len);
 	else
 #endif
 		pcu_tx_data_req(trx, ts, PCU_IF_SAPI_PTCCH, arfcn, fn, block_nr,
-			msg->data, msg->len);
+			msg->data, msg->len, bts->gsmtap);
 	msgb_free(msg);
 }
 
 void pcu_l1if_tx_agch(bitvec * block, int plen)
 {
 	uint8_t data[23]; /* prefix PLEN */
-	
+	struct gprs_rlcmac_bts *bts = bts_main_data();
+
 	/* FIXME: why does OpenBTS has no PLEN and no fill in message? */
 	bitvec_pack(block, data + 1);
 	data[0] = (plen << 2) | 0x01;
-	pcu_tx_data_req(0, 0, PCU_IF_SAPI_AGCH, 0, 0, 0, data, 23);
+	pcu_tx_data_req(0, 0, PCU_IF_SAPI_AGCH, 0, 0, 0, data, 23, bts->gsmtap);
 }
 
 void pcu_l1if_tx_pch(bitvec * block, int plen, const char *imsi)
 {
 	uint8_t data[23+3]; /* prefix PLEN */
+	struct gprs_rlcmac_bts *bts = bts_main_data();
 
 	/* paging group */
 	if (!imsi || strlen(imsi) < 3)
@@ -177,7 +183,7 @@ void pcu_l1if_tx_pch(bitvec * block, int plen, const char *imsi)
 
 	bitvec_pack(block, data + 3+1);
 	data[3] = (plen << 2) | 0x01;
-	pcu_tx_data_req(0, 0, PCU_IF_SAPI_PCH, 0, 0, 0, data, 23+3);
+	pcu_tx_data_req(0, 0, PCU_IF_SAPI_PCH, 0, 0, 0, data, 23+3, bts->gsmtap);
 }
 
 extern "C" void pcu_rx_block_time(uint16_t arfcn, uint32_t fn, uint8_t ts_no)
@@ -200,7 +206,7 @@ extern "C" int pcu_rx_data_ind_pdtch(uint8_t trx_no, uint8_t ts_no, uint8_t *dat
 	return pdch->rcv_block(data, len, fn, meas);
 }
 
-static int pcu_rx_data_ind(struct gsm_pcu_if_data *data_ind)
+static int pcu_rx_data_ind(struct gsm_pcu_if_data *data_ind, struct gsmtap_inst *gsmtap)
 {
 	int rc = 0;
 	pcu_l1_meas meas;
@@ -223,6 +229,15 @@ static int pcu_rx_data_ind(struct gsm_pcu_if_data *data_ind)
 		rc = -EINVAL;
 	}
 
+	if (rc < 0)
+		return rc;
+
+	int r = gsmtap_send(gsmtap, data_ind->arfcn | GSMTAP_ARFCN_F_UPLINK, data_ind->ts_nr,
+			    GSMTAP_CHANNEL_PACCH, 0, data_ind->fn, 0, 0, data_ind->data, data_ind->len);
+	if (r < 0) {
+	  LOGP(DL1IF, LOGL_ERROR, "Sending RX data via GSMTAP failed: %d\n", r);
+	}
+
 	return rc;
 }
 
@@ -508,10 +523,11 @@ static int pcu_rx_pag_req(struct gsm_pcu_if_pag_req *pag_req)
 int pcu_rx(uint8_t msg_type, struct gsm_pcu_if *pcu_prim)
 {
 	int rc = 0;
+	struct gprs_rlcmac_bts *bts = bts_main_data();
 
 	switch (msg_type) {
 	case PCU_IF_MSG_DATA_IND:
-		rc = pcu_rx_data_ind(&pcu_prim->u.data_ind);
+		rc = pcu_rx_data_ind(&pcu_prim->u.data_ind, bts->gsmtap);
 		break;
 	case PCU_IF_MSG_DATA_CNF:
 		rc = pcu_rx_data_cnf(&pcu_prim->u.data_cnf);
-- 
2.7.1




More information about the OpenBSC mailing list