fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-trx/+/43105?usp=email )
Change subject: libosmo-trx/trxd: support NOPE.{ind,req} in TRXDv0/v1 PDUs ......................................................................
libosmo-trx/trxd: support NOPE.{ind,req} in TRXDv0/v1 PDUs
TRXDv0 (and TRXDv1 in the downlink direction) has no MTS field, but NOPE indications/requests do exist there in practice: the burst payload is simply omitted, i.e. a header-only PDU. This is how osmocom-bb's trxcon transmits NOPE.req (see trx_if_handle_phyif_burst_req()).
Change-Id: I1a59f31d0f00c8509a016dc2bac71b6aa467f3a4 --- M libosmo-trx/include/osmocom/trx/trxd.h M libosmo-trx/src/trxd.c M tests/libosmo-trx/trxd_test.c M tests/libosmo-trx/trxd_test.ok 4 files changed, 73 insertions(+), 18 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-trx refs/changes/05/43105/1
diff --git a/libosmo-trx/include/osmocom/trx/trxd.h b/libosmo-trx/include/osmocom/trx/trxd.h index 9ed8275..d9e1632 100644 --- a/libosmo-trx/include/osmocom/trx/trxd.h +++ b/libosmo-trx/include/osmocom/trx/trxd.h @@ -38,6 +38,8 @@
/* Presence/meta flags for osmo_trxd_burst_{ind,req} */ #define OSMO_TRXD_F_NOPE_IND (1 << 0) /*!< no burst detected / idle indication */ +/*! alias of OSMO_TRXD_F_NOPE_IND, reading cleaner in BURST.req context */ +#define OSMO_TRXD_F_NOPE_REQ OSMO_TRXD_F_NOPE_IND #define OSMO_TRXD_F_MOD_TYPE (1 << 1) /*!< 'mod' is valid */ #define OSMO_TRXD_F_TS_INFO (1 << 2) /*!< 'tsc_set'/'tsc' are valid */ #define OSMO_TRXD_F_CI_CB (1 << 3) /*!< 'ci_cb' is valid */ diff --git a/libosmo-trx/src/trxd.c b/libosmo-trx/src/trxd.c index d8c6a89..e3b51c4 100644 --- a/libosmo-trx/src/trxd.c +++ b/libosmo-trx/src/trxd.c @@ -211,6 +211,12 @@
trxd_burst_ind_parse_hdr_v0(bi, buf);
+ /* NOPE.ind: TRXDv0 has no MTS, the burst payload is simply omitted */ + if (burst_len == 0) { + bi->flags |= OSMO_TRXD_F_NOPE_IND; + return buf_len; + } + switch (burst_len) { case OSMO_TRXD_BURST_LEN_GMSK: case OSMO_TRXD_BURST_LEN_GMSK + 2: @@ -383,9 +389,9 @@ * \param[inout] msg destination message buffer * \param[in] pdu_ver TRXD PDU version to encode * \param[in] bi burst indication to be encoded - * \returns 0 on success; negative on error. Note that TRXDv0 cannot - * carry NOPE.ind PDUs: -ENOTSUP is returned and the caller - * shall skip (not send) them. */ + * \returns 0 on success; negative on error. Note that TRXDv0 has no + * MTS field, so a NOPE.ind is encoded as a header-only PDU + * with the burst payload omitted. */ int osmo_trxd_burst_ind_build(struct msgb *msg, uint8_t pdu_ver, const struct osmo_trxd_burst_ind *bi) { @@ -395,9 +401,6 @@
switch (pdu_ver) { case 0: - /* v0 doesn't support NOPE.ind, the caller shall skip it */ - if (bi->flags & OSMO_TRXD_F_NOPE_IND) - return -ENOTSUP; buf = msgb_put(msg, TRXD_IND_V0HDR_LEN); buf[0] = ((pdu_ver & 0x0f) << 4) | (bi->tn & 0x07); osmo_store32be(bi->fn, buf + 1); @@ -461,6 +464,12 @@ br->fn = osmo_load32be(&buf[1]); br->att = buf[5];
+ /* NOPE.req: TRXDv0/v1 have no MTS, the burst payload is simply omitted */ + if (burst_len == 0) { + br->flags |= OSMO_TRXD_F_NOPE_REQ; + return buf_len; + } + switch (burst_len) { case OSMO_TRXD_BURST_LEN_8PSK: br->mod = OSMO_TRXD_MOD_T_8PSK; @@ -514,6 +523,12 @@ br->fn = st->fn; }
+ /* NOPE.req contains no burst */ + if (br->flags & OSMO_TRXD_F_NOPE_REQ) { + br->burst_len = 0; + return hdr_len; + } + burst_len = burst_len_by_mod(br->mod); if (burst_len < 0) return burst_len; @@ -630,9 +645,11 @@ return -ENOTSUP; }
- /* copy hard-bits {0,1} */ - memcpy(msgb_put(msg, br->burst_len), - &br->burst[0], br->burst_len); + if (~br->flags & OSMO_TRXD_F_NOPE_REQ) { + /* copy hard-bits {0,1} */ + memcpy(msgb_put(msg, br->burst_len), + &br->burst[0], br->burst_len); + }
return 0; } @@ -684,9 +701,13 @@ static __thread char buf[256]; struct osmo_strbuf sb = { .buf = buf, .len = sizeof(buf) };
- OSMO_STRBUF_PRINTF(sb, "BURST.req tn=%u fn=%u att=%u", br->tn, br->fn, br->att); + OSMO_STRBUF_PRINTF(sb, "%s tn=%u fn=%u att=%u", + (br->flags & OSMO_TRXD_F_NOPE_REQ) ? "NOPE.req" : "BURST.req", + br->tn, br->fn, br->att); if (br->flags & OSMO_TRXD_F_TRX_NUM) OSMO_STRBUF_PRINTF(sb, " trx_num=%u", br->trx_num); + if (br->flags & OSMO_TRXD_F_NOPE_REQ) + return buf; if (br->flags & OSMO_TRXD_F_MOD_TYPE) OSMO_STRBUF_PRINTF(sb, " mod=%s", osmo_trxd_mod_type_name(br->mod)); if (br->flags & OSMO_TRXD_F_TS_INFO) diff --git a/tests/libosmo-trx/trxd_test.c b/tests/libosmo-trx/trxd_test.c index 7cb3d94..d19c88c 100644 --- a/tests/libosmo-trx/trxd_test.c +++ b/tests/libosmo-trx/trxd_test.c @@ -124,13 +124,6 @@ bi.flags = OSMO_TRXD_F_NOPE_IND | OSMO_TRXD_F_CI_CB;
rc = osmo_trxd_burst_ind_build(msg, pdu_ver, &bi); - if (pdu_ver == 0) { - /* TRXDv0 cannot carry NOPE.ind */ - printf("build: rc=%d (expected -ENOTSUP)\n", rc); - OSMO_ASSERT(rc == -ENOTSUP); - msgb_free(msg); - return; - } OSMO_ASSERT(rc == 0); osmo_trxd_build_fin(msg, pdu_ver); printf("build: %s\n", osmo_trxd_burst_ind_name(&bi)); @@ -259,6 +252,34 @@ msgb_free(msg); }
+static void test_burst_req_nope(uint8_t pdu_ver) +{ + struct osmo_trxd_parse_state st; + struct osmo_trxd_burst_req br, br2; + struct msgb *msg = msgb_alloc(4096, "nope"); + int rc; + + printf("=== %s(v%u) ===\n", __func__, pdu_ver); + + fill_burst_req(&br, 0); + br.flags = OSMO_TRXD_F_NOPE_REQ; + + rc = osmo_trxd_burst_req_build(msg, pdu_ver, &br); + OSMO_ASSERT(rc == 0); + osmo_trxd_build_fin(msg, pdu_ver); + printf("build: %s\n", osmo_trxd_burst_req_name(&br)); + + osmo_trxd_parse_state_init(&st); + rc = osmo_trxd_burst_req_parse(&st, &br2, msgb_data(msg), msgb_length(msg)); + OSMO_ASSERT(rc == (int)msgb_length(msg)); + printf("parse: %s\n", osmo_trxd_burst_req_name(&br2)); + + OSMO_ASSERT(br2.flags & OSMO_TRXD_F_NOPE_REQ); + OSMO_ASSERT(br2.burst_len == 0); + + msgb_free(msg); +} + static void test_burst_req_batch(uint8_t pdu_ver) { struct osmo_trxd_parse_state st; @@ -389,6 +410,7 @@ for (uint8_t pdu_ver = 0; pdu_ver <= OSMO_TRXD_PDU_VER_MAX; pdu_ver++) { test_burst_req(pdu_ver, OSMO_TRXD_BURST_LEN_GMSK); test_burst_req(pdu_ver, OSMO_TRXD_BURST_LEN_8PSK); + test_burst_req_nope(pdu_ver); test_burst_req_batch(pdu_ver);
test_burst_ind(pdu_ver, OSMO_TRXD_BURST_LEN_GMSK); diff --git a/tests/libosmo-trx/trxd_test.ok b/tests/libosmo-trx/trxd_test.ok index e4f22da..963322b 100644 --- a/tests/libosmo-trx/trxd_test.ok +++ b/tests/libosmo-trx/trxd_test.ok @@ -6,6 +6,9 @@ build: BURST.req tn=2 fn=2654321 att=10 mod=8-PSK set=0 tsc=3 burst_len=444 datagram (450 bytes): 02002880710a00010001000100010001... parse: BURST.req tn=2 fn=2654321 att=10 mod=8-PSK burst_len=444 +=== test_burst_req_nope(v0) === +build: NOPE.req tn=2 fn=2654321 att=10 +parse: NOPE.req tn=2 fn=2654321 att=10 === test_burst_ind(v0, burst_len=148) === build: BURST.ind tn=5 fn=1234567 rssi=-63 toa256=-512 C/I=-150 cB mod=GMSK set=1 tsc=7 burst_len=148 datagram (156 bytes): 050012d6873ffe001be31be31be31be3... @@ -15,7 +18,8 @@ datagram (452 bytes): 050012d6873ffe001be31be31be31be3... parse: BURST.ind tn=5 fn=1234567 rssi=-63 toa256=-512 mod=8-PSK burst_len=444 === test_burst_ind_nope(v0) === -build: rc=-95 (expected -ENOTSUP) +build: NOPE.ind tn=5 fn=1234567 rssi=-63 toa256=-512 C/I=-150 cB +parse: NOPE.ind tn=5 fn=1234567 rssi=-63 toa256=-512 === test_burst_req(v1, burst_len=148) === build: BURST.req tn=2 fn=2654321 att=10 mod=GMSK set=0 tsc=3 burst_len=148 datagram (154 bytes): 12002880710a00010001000100010001... @@ -24,6 +28,9 @@ build: BURST.req tn=2 fn=2654321 att=10 mod=8-PSK set=0 tsc=3 burst_len=444 datagram (450 bytes): 12002880710a00010001000100010001... parse: BURST.req tn=2 fn=2654321 att=10 mod=8-PSK burst_len=444 +=== test_burst_req_nope(v1) === +build: NOPE.req tn=2 fn=2654321 att=10 +parse: NOPE.req tn=2 fn=2654321 att=10 === test_burst_ind(v1, burst_len=148) === build: BURST.ind tn=5 fn=1234567 rssi=-63 toa256=-512 C/I=-150 cB mod=GMSK set=1 tsc=7 burst_len=148 datagram (159 bytes): 150012d6873ffe000fff6a1be31be31b... @@ -43,6 +50,9 @@ build: BURST.req tn=2 fn=2654321 att=10 mod=8-PSK set=0 tsc=3 burst_len=444 datagram (456 bytes): 2200230a000000000028807100010001... parse: BURST.req tn=2 fn=2654321 att=10 trx_num=0 mod=8-PSK set=0 tsc=3 burst_len=444 +=== test_burst_req_nope(v2) === +build: NOPE.req tn=2 fn=2654321 att=10 +parse: NOPE.req tn=2 fn=2654321 att=10 trx_num=0 === test_burst_req_batch(v2) === datagram (472 bytes) parse[0]: BURST.req tn=0 fn=2654321 att=10 trx_num=0 mod=GMSK set=0 tsc=3 burst_len=148