aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@osmocom.org>2023-11-26 18:28:26 +0100
committerHarald Welte <laforge@osmocom.org>2023-11-26 18:37:37 +0100
commit9bfed7fed73633a3f0e9be9d52660d6f4625310c (patch)
treebd0e2afa090257755850d4b24871f1c9d31472cf
parentAdd GSMTAP encapsulation of RLP frames in CSD NT mode (diff)
downloadOsmoBTS-laforge/csd_gsmtap.tar.xz
OsmoBTS-laforge/csd_gsmtap.zip
gsmtap-rlp: Add support for skipping generating NULL frameslaforge/csd_gsmtap
If there's nothing to transmit over a CSD NT channel, both ends generate NULL frames. Let's add an option to suppress GSMTAP output for those, creating pcap files with less noise. Change-Id: I85a2159cfaa01bfb4205c1462e3a9dbda68e4bad
-rw-r--r--TODO-RELEASE1
-rw-r--r--include/osmo-bts/bts.h1
-rw-r--r--src/common/l1sap.c8
-rw-r--r--src/common/vty.c17
4 files changed, 23 insertions, 4 deletions
diff --git a/TODO-RELEASE b/TODO-RELEASE
index 1ed7b53d..2bbfab59 100644
--- a/TODO-RELEASE
+++ b/TODO-RELEASE
@@ -8,3 +8,4 @@
# If any interfaces have been removed or changed since the last public release: c:r:0.
#library what description / commit summary line
libosmogsm >1.9.0 added new PRIM_INFO to include/osmocom/gsm/l1sap.h
+libosmogsm >1.9.0 use of RLP code in libosmogsm
diff --git a/include/osmo-bts/bts.h b/include/osmo-bts/bts.h
index f9ddb1e9..8f1f1ab6 100644
--- a/include/osmo-bts/bts.h
+++ b/include/osmo-bts/bts.h
@@ -378,6 +378,7 @@ struct gsm_bts {
uint32_t sapi_mask;
uint8_t sapi_acch;
bool rlp;
+ bool rlp_skip_null;
} gsmtap;
struct osmux_state osmux;
diff --git a/src/common/l1sap.c b/src/common/l1sap.c
index ece18e04..7c60d70e 100644
--- a/src/common/l1sap.c
+++ b/src/common/l1sap.c
@@ -33,6 +33,7 @@
#include <osmocom/gsm/l1sap.h>
#include <osmocom/gsm/gsm_utils.h>
#include <osmocom/gsm/rsl.h>
+#include <osmocom/gsm/rlp.h>
#include <osmocom/core/gsmtap.h>
#include <osmocom/core/gsmtap_util.h>
#include <osmocom/core/utils.h>
@@ -1848,6 +1849,7 @@ static void gsmtap_csd_rlp_process(struct gsm_lchan *lchan, bool is_uplink,
{
struct gsm_bts_trx *trx = lchan->ts->trx;
struct gsmtap_inst *inst = trx->bts->gsmtap.inst;
+ struct osmo_rlp_frame_decoded rlpf;
pbit_t *rlp_buf;
int byte_len;
@@ -1898,6 +1900,12 @@ static void gsmtap_csd_rlp_process(struct gsm_lchan *lchan, bool is_uplink,
byte_len = osmo_ubit2pbit_ext(rlp_buf, 0, data, 0, data_len, 1);
}
+ if (trx->bts->gsmtap.rlp_skip_null) {
+ int rc = osmo_rlp_decode(&rlpf, 0, rlp_buf, byte_len);
+ if (rc == 0 && rlpf.ftype == OSMO_RLP_FT_U && rlpf.u_ftype == OSMO_RLP_U_FT_NULL)
+ return;
+ }
+
gsmtap_send_ex(inst, GSMTAP_TYPE_GSM_RLP, trx->arfcn | is_uplink ? GSMTAP_ARFCN_F_UPLINK : 0,
lchan->ts->nr,
lchan->type == GSM_LCHAN_TCH_H ? GSMTAP_CHANNEL_VOICE_H : GSMTAP_CHANNEL_VOICE_F,
diff --git a/src/common/vty.c b/src/common/vty.c
index b5ab132c..2bc5bf8f 100644
--- a/src/common/vty.c
+++ b/src/common/vty.c
@@ -447,8 +447,12 @@ static void config_write_bts_single(struct vty *vty, const struct gsm_bts *bts)
sapi_buf = osmo_str_tolower(get_value_string(gsmtap_sapi_names, GSMTAP_CHANNEL_ACCH));
vty_out(vty, " gsmtap-sapi %s%s", sapi_buf, VTY_NEWLINE);
}
- if (bts->gsmtap.rlp)
- vty_out(vty, " gsmtap-rlp%s", VTY_NEWLINE);
+ if (bts->gsmtap.rlp) {
+ if (bts->gsmtap.rlp_skip_null)
+ vty_out(vty, " gsmtap-rlp skip-null%s", VTY_NEWLINE);
+ else
+ vty_out(vty, " gsmtap-rlp%s", VTY_NEWLINE);
+ }
vty_out(vty, " min-qual-rach %d%s", bts->min_qual_rach,
VTY_NEWLINE);
vty_out(vty, " min-qual-norm %d%s", bts->min_qual_norm,
@@ -2389,11 +2393,16 @@ DEFUN(cfg_bts_no_gsmtap_sapi, cfg_bts_no_gsmtap_sapi_cmd,
}
DEFUN(cfg_bts_gsmtap_rlp, cfg_bts_gsmtap_rlp_cmd,
- "gsmtap-rlp",
- "Enable generation of GSMTAP frames for RLP (non-transparent CSD)\n")
+ "gsmtap-rlp [skip-null]",
+ "Enable generation of GSMTAP frames for RLP (non-transparent CSD)\n"
+ "Skip the generation of GSMTAP for RLP NULL frames\n")
{
struct gsm_bts *bts = vty->index;
bts->gsmtap.rlp = true;
+ if (argc >= 1 && !strcmp(argv[0], "skip-null"))
+ bts->gsmtap.rlp_skip_null = true;
+ else
+ bts->gsmtap.rlp_skip_null = false;
return CMD_SUCCESS;
}