laforge has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-bts/+/35124?usp=email )
Change subject: Add GSMTAP encapsulation of RLP frames in CSD NT mode ......................................................................
Add GSMTAP encapsulation of RLP frames in CSD NT mode
In CSD (Circuit Switched Data) NT (Non-Transparent) mode, there are RLP (Radio Link Protocol) frames inside the modified V.110.
wireshark alrady has a dissector for this, and we've introduced a GSMTAP type for RLP some time ago. So with this patch, we now generate such GSMTAP RLP frames.
Change-Id: I6a258458822bcb3fe7290a9b9b3d104beecda219 --- M src/common/l1sap.c 1 file changed, 55 insertions(+), 3 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/24/35124/1
diff --git a/src/common/l1sap.c b/src/common/l1sap.c index c599726..4b2ca02 100644 --- a/src/common/l1sap.c +++ b/src/common/l1sap.c @@ -1841,19 +1841,54 @@ return 1; }
-static void send_ul_rtp_packet_data(struct gsm_lchan *lchan, uint32_t fn, +static void gsmtap_csd_ul(struct gsm_lchan *lchan, const struct ph_tch_param *tch_ind, const uint8_t *data, unsigned int data_len) +{ + struct gsm_bts_trx *trx = lchan->ts->trx; + struct gsmtap_inst *inst = trx->bts->gsmtap.inst; + if (!inst) + return; + + if (lchan->csd_mode == LCHAN_CSD_M_NT) { + pbit_t buf[data_len/8+1]; + int len = osmo_ubit2pbit_ext(buf, 0, data, 0, data_len, 1); + gsmtap_send_ex(inst, GSMTAP_TYPE_GSM_RLP, trx->arfcn | GSMTAP_ARFCN_F_UPLINK, lchan->ts->nr, + lchan->type == GSM_LCHAN_TCH_H ? GSMTAP_CHANNEL_TCH_H : GSMTAP_CHANNEL_TCH_F, + lchan->nr, tch_ind->fn, tch_ind->rssi, 0, buf, len); + + } +} + +static void gsmtap_csd_dl(struct gsm_lchan *lchan, const uint8_t *data, unsigned int data_len) +{ + struct gsm_bts_trx *trx = lchan->ts->trx; + struct gsmtap_inst *inst = trx->bts->gsmtap.inst; + if (!inst) + return; + + if (lchan->csd_mode == LCHAN_CSD_M_NT) { + pbit_t buf[data_len/8+1]; + int len = osmo_ubit2pbit_ext(buf, 0, data, 0, data_len, 1); + gsmtap_send_ex(inst, GSMTAP_TYPE_GSM_RLP, trx->arfcn, lchan->ts->nr, + lchan->type == GSM_LCHAN_TCH_H ? GSMTAP_CHANNEL_TCH_H : GSMTAP_CHANNEL_TCH_F, + lchan->nr, 0, 0, 0, buf, len); + } +} + +static void send_ul_rtp_packet_data(struct gsm_lchan *lchan, const struct ph_tch_param *tch_ind, const uint8_t *data, uint16_t data_len) { uint8_t rtp_pl[RFC4040_RTP_PLEN]; int rc;
+ gsmtap_csd_ul(lchan, tch_ind, data, data_len); + rc = csd_v110_rtp_encode(lchan, &rtp_pl[0], data, data_len); if (rc < 0) return;
osmo_rtp_send_frame_ext(lchan->abis_ip.rtp_socket, &rtp_pl[0], sizeof(rtp_pl), - fn_ms_adj(fn, lchan), + fn_ms_adj(tch_ind->fn, lchan), lchan->rtp_tx_marker); /* Only clear the marker bit once we have sent a RTP packet with it */ lchan->rtp_tx_marker = false; @@ -1987,7 +2022,7 @@ send_ul_rtp_packet_speech(lchan, fn, msg->data, msg->len); break; case RSL_CMOD_SPD_DATA: - send_ul_rtp_packet_data(lchan, fn, msg->data, msg->len); + send_ul_rtp_packet_data(lchan, tch_ind, msg->data, msg->len); break; case RSL_CMOD_SPD_SIGN: return 0; /* drop stale TCH.ind */ @@ -2296,6 +2331,7 @@ int rc = csd_v110_rtp_decode(lchan, msg->tail, rtp_pl, rtp_pl_len); if (rc > 0) { + gsmtap_csd_dl(lchan, msg->tail, rc); msgb_put(msg, rc); } else { msgb_free(msg);