From 7de4f058f390460694093ec716a2e95958d05649 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Fri, 15 Apr 2022 20:17:55 +0200 Subject: [PATCH] Add 'raw_prbs' handler to transmit a PRBS15 sequence --- Makefile | 2 +- capi.c | 1 + hdlr_raw_prbs.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 hdlr_raw_prbs.c diff --git a/Makefile b/Makefile index 35f9f5e..5c1071c 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ clean: %.o: %.c $(CC) $(CFLAGS) -o $@ -c $^ -capi-test: capi.o capiconn.o bchan.o hdlr_raw_loop.o +capi-test: capi.o capiconn.o bchan.o hdlr_raw_loop.o hdlr_raw_prbs.o $(CC) $(LDFLAGS) -o $@ $^ $(LIBS) diff --git a/capi.c b/capi.c index 38ce5c1..4a5fbe4 100644 --- a/capi.c +++ b/capi.c @@ -305,6 +305,7 @@ int main(int argc, char **argv) osmo_init_logging2(ctx, &log_info); capi_init(ctx); + bchan_route_add(-1, "142", "raw_prbs"); bchan_route_add(-1, NULL, "raw_loop"); while (1) { diff --git a/hdlr_raw_prbs.c b/hdlr_raw_prbs.c new file mode 100644 index 0000000..0eb6383 --- /dev/null +++ b/hdlr_raw_prbs.c @@ -0,0 +1,61 @@ + +#include +#include + +#include "bchan.h" +#include "errno.h" + +struct raw_prbs_priv { + struct osmo_prbs_state prbs; +}; + +static int raw_prbs_init(struct call_state *cst) +{ + struct raw_prbs_priv *rpp; + rpp = cst->priv = talloc_zero(cst, struct raw_prbs_priv); + if (!rpp) + return -ENOMEM; + osmo_prbs_state_init(&rpp->prbs, &osmo_prbs15); + return 0; +} + +static void raw_prbs_rx(struct call_state *cst, const uint8_t *data, uint8_t len) +{ + struct raw_prbs_priv *rpp = cst->priv; + uint8_t tx_ubit[len*8]; + uint8_t tx_pbit[len]; + /* TODO: process what we received */ + + /* generate respective number of PRBS bits and transmit them */ + osmo_prbs_get_ubits(tx_ubit, len, &rpp->prbs); + osmo_ubit2pbit(tx_pbit, tx_ubit, len*8); + bchan_call_tx(cst, tx_pbit, len); +} + +static void raw_prbs_fini(struct call_state *cst) +{ + struct raw_prbs_priv *rpp = cst->priv; + talloc_free(rpp); + cst->priv = NULL; +} + + +static struct bchan_handler bch_raw_prbs = { + .name = "raw_prbs", + .cfg = { + .proto = { 1, 1, 0 }, + .ncpi = NULL, + .max_b_data_blocks = 10, + .max_b_data_len = 32, + }, + .ops = { + .init = raw_prbs_init, + .rx_data = raw_prbs_rx, + .fini = raw_prbs_fini, + }, +}; + +static __attribute__((constructor)) void hdlr_raw_prbs_init(void) +{ + bchan_handler_register(&bch_raw_prbs); +}