From: Max <[email protected]>

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 <[email protected]>
---
 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

Reply via email to