laforge has uploaded this change for review.
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);
To view, visit change 35124. To unsubscribe, or for help writing mail filters, visit settings.