<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/23832">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">osmo-bts-trx: refactor handling of version specific TRXD parts<br><br>Change-Id: I7aedd85a8d4f6d6191cd3b75272a688208fb2879<br>Related: SYS#4895, OS#4941, OS#4006<br>---<br>M src/osmo-bts-trx/trx_if.c<br>1 file changed, 103 insertions(+), 122 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/32/23832/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo-bts-trx/trx_if.c b/src/osmo-bts-trx/trx_if.c</span><br><span>index a458fa6..bd04f5c 100644</span><br><span>--- a/src/osmo-bts-trx/trx_if.c</span><br><span>+++ b/src/osmo-bts-trx/trx_if.c</span><br><span>@@ -723,29 +723,18 @@</span><br><span> /* Uplink TRXDv1 header length: additional MTS + C/I */</span><br><span> #define TRX_UL_V1HDR_LEN (TRX_UL_V0HDR_LEN + 1 + 2)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* TRXD header dissector for version 0 */</span><br><span style="color: hsl(0, 100%, 40%);">-static int trx_data_handle_hdr_v0(struct trx_l1h *l1h,</span><br><span style="color: hsl(0, 100%, 40%);">- struct trx_ul_burst_ind *bi,</span><br><span style="color: hsl(0, 100%, 40%);">- const uint8_t *buf, size_t buf_len)</span><br><span style="color: hsl(120, 100%, 40%);">+/* Parser for TRXDv0 header (and part of TRXDv1) */</span><br><span style="color: hsl(120, 100%, 40%);">+static inline void trx_data_parse_hdr_v0(struct trx_ul_burst_ind *bi,</span><br><span style="color: hsl(120, 100%, 40%);">+ const uint8_t *buf)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- /* Make sure we have enough data */</span><br><span style="color: hsl(0, 100%, 40%);">- if (buf_len < TRX_UL_V0HDR_LEN) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGPPHI(l1h->phy_inst, DTRX, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">- "Short read on TRXD, missing version 0 header "</span><br><span style="color: hsl(0, 100%, 40%);">- "(len=%zu vs expected %d)\n", buf_len, TRX_UL_V0HDR_LEN);</span><br><span style="color: hsl(0, 100%, 40%);">- return -EIO;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> bi->tn = buf[0] & 0b111;</span><br><span> bi->fn = osmo_load32be(buf + 1);</span><br><span> bi->rssi = -(int8_t)buf[5];</span><br><span> bi->toa256 = (int16_t) osmo_load16be(buf + 6);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return TRX_UL_V0HDR_LEN;</span><br><span> }</span><br><span> </span><br><span> /* Parser for MTS (Modulation and Training Sequence) */</span><br><span style="color: hsl(0, 100%, 40%);">-static int trx_data_parse_mts(struct trx_l1h *l1h,</span><br><span style="color: hsl(120, 100%, 40%);">+static int trx_data_parse_mts(struct phy_instance *phy_inst,</span><br><span> struct trx_ul_burst_ind *bi,</span><br><span> const uint8_t mts)</span><br><span> {</span><br><span>@@ -764,7 +753,7 @@</span><br><span> bi->mod = TRX_MOD_T_8PSK;</span><br><span> bi->tsc_set = (mts >> 3) & 0x01;</span><br><span> } else {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGPPHI(l1h->phy_inst, DTRX, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPPHI(phy_inst, DTRX, LOGL_ERROR,</span><br><span> "Rx TRXD PDU with unknown or not supported "</span><br><span> "modulation (MTS=0x%02x)\n", mts);</span><br><span> return -ENOTSUP;</span><br><span>@@ -778,32 +767,51 @@</span><br><span> return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* TRXD header dissector for version 0x01 */</span><br><span style="color: hsl(0, 100%, 40%);">-static int trx_data_handle_hdr_v1(struct trx_l1h *l1h,</span><br><span style="color: hsl(0, 100%, 40%);">- struct trx_ul_burst_ind *bi,</span><br><span style="color: hsl(0, 100%, 40%);">- const uint8_t *buf, size_t buf_len)</span><br><span style="color: hsl(120, 100%, 40%);">+/* Parser for TRXDv0 PDU */</span><br><span style="color: hsl(120, 100%, 40%);">+static int trx_data_parse_pdu_v0(struct phy_instance *phy_inst,</span><br><span style="color: hsl(120, 100%, 40%);">+ struct trx_ul_burst_ind *bi,</span><br><span style="color: hsl(120, 100%, 40%);">+ const uint8_t *buf, size_t buf_len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Parse TRXDv0 specific header part */</span><br><span style="color: hsl(120, 100%, 40%);">+ trx_data_parse_hdr_v0(bi, buf);</span><br><span style="color: hsl(120, 100%, 40%);">+ buf_len -= TRX_UL_V0HDR_LEN;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Guess modulation and burst length by the rest octets.</span><br><span style="color: hsl(120, 100%, 40%);">+ * NOTE: a legacy transceiver may append two garbage bytes. */</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (buf_len) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case EGPRS_BURST_LEN + 2:</span><br><span style="color: hsl(120, 100%, 40%);">+ case EGPRS_BURST_LEN:</span><br><span style="color: hsl(120, 100%, 40%);">+ bi->burst_len = EGPRS_BURST_LEN;</span><br><span style="color: hsl(120, 100%, 40%);">+ bi->mod = TRX_MOD_T_GMSK;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM_BURST_LEN + 2:</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM_BURST_LEN:</span><br><span style="color: hsl(120, 100%, 40%);">+ bi->burst_len = GSM_BURST_LEN;</span><br><span style="color: hsl(120, 100%, 40%);">+ bi->mod = TRX_MOD_T_GMSK;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPPHI(phy_inst, DTRX, LOGL_NOTICE,</span><br><span style="color: hsl(120, 100%, 40%);">+ "Rx TRXD PDU with odd burst length %zu\n", buf_len);</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return TRX_UL_V0HDR_LEN;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Parser for TRXDv1 PDU */</span><br><span style="color: hsl(120, 100%, 40%);">+static int trx_data_parse_pdu_v1(struct phy_instance *phy_inst,</span><br><span style="color: hsl(120, 100%, 40%);">+ struct trx_ul_burst_ind *bi,</span><br><span style="color: hsl(120, 100%, 40%);">+ const uint8_t *buf, size_t buf_len)</span><br><span> {</span><br><span> int rc;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Make sure we have enough data */</span><br><span style="color: hsl(0, 100%, 40%);">- if (buf_len < TRX_UL_V1HDR_LEN) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGPPHI(l1h->phy_inst, DTRX, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">- "Short read on TRXD, missing version 1 header "</span><br><span style="color: hsl(0, 100%, 40%);">- "(len=%zu vs expected %d)\n", buf_len, TRX_UL_V1HDR_LEN);</span><br><span style="color: hsl(0, 100%, 40%);">- return -EIO;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Parse v0 specific part */</span><br><span style="color: hsl(0, 100%, 40%);">- rc = trx_data_handle_hdr_v0(l1h, bi, buf, buf_len);</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc < 0)</span><br><span style="color: hsl(0, 100%, 40%);">- return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Move closer to the v1 specific part */</span><br><span style="color: hsl(0, 100%, 40%);">- buf_len -= rc;</span><br><span style="color: hsl(0, 100%, 40%);">- buf += rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Parse TRXDv0 specific header part */</span><br><span style="color: hsl(120, 100%, 40%);">+ trx_data_parse_hdr_v0(bi, buf);</span><br><span style="color: hsl(120, 100%, 40%);">+ buf_len -= TRX_UL_V0HDR_LEN;</span><br><span style="color: hsl(120, 100%, 40%);">+ buf += TRX_UL_V0HDR_LEN;</span><br><span> </span><br><span> /* MTS (Modulation and Training Sequence) */</span><br><span style="color: hsl(0, 100%, 40%);">- rc = trx_data_parse_mts(l1h, bi, buf[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = trx_data_parse_mts(phy_inst, bi, buf[0]);</span><br><span> if (rc < 0)</span><br><span> return rc;</span><br><span> </span><br><span>@@ -814,31 +822,28 @@</span><br><span> return TRX_UL_V1HDR_LEN;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* TRXD burst handler for PDU version 0 */</span><br><span style="color: hsl(0, 100%, 40%);">-static int trx_data_handle_burst_v0(struct trx_l1h *l1h,</span><br><span style="color: hsl(0, 100%, 40%);">- struct trx_ul_burst_ind *bi,</span><br><span style="color: hsl(0, 100%, 40%);">- const uint8_t *buf, size_t buf_len)</span><br><span style="color: hsl(120, 100%, 40%);">+/* Parser for burst bits (version independent) */</span><br><span style="color: hsl(120, 100%, 40%);">+static int trx_data_parse_burst(struct trx_ul_burst_ind *bi,</span><br><span style="color: hsl(120, 100%, 40%);">+ const uint8_t *buf, size_t buf_len)</span><br><span> {</span><br><span> size_t i;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Verify burst length */</span><br><span style="color: hsl(0, 100%, 40%);">- switch (buf_len) {</span><br><span style="color: hsl(0, 100%, 40%);">- /* Legacy transceivers append two padding bytes */</span><br><span style="color: hsl(0, 100%, 40%);">- case EGPRS_BURST_LEN + 2:</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM_BURST_LEN + 2:</span><br><span style="color: hsl(0, 100%, 40%);">- bi->burst_len = buf_len - 2;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case EGPRS_BURST_LEN:</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM_BURST_LEN:</span><br><span style="color: hsl(0, 100%, 40%);">- bi->burst_len = buf_len;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">- LOGPPHI(l1h->phy_inst, DTRX, LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">- "Rx TRXD message with odd burst length %zu\n", buf_len);</span><br><span style="color: hsl(0, 100%, 40%);">- return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* NOPE.ind contains no burst */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bi->flags | TRX_BI_F_NOPE_IND) {</span><br><span style="color: hsl(120, 100%, 40%);">+ bi->burst_len = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Modulation types defined in 3GPP TS 45.002 */</span><br><span style="color: hsl(120, 100%, 40%);">+ static const size_t bl[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRX_MOD_T_GMSK] = 148, /* 1 bit per symbol */</span><br><span style="color: hsl(120, 100%, 40%);">+ [TRX_MOD_T_8PSK] = 444, /* 3 bits per symbol */</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ bi->burst_len = bl[bi->mod];</span><br><span style="color: hsl(120, 100%, 40%);">+ if (buf_len < bi->burst_len)</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Convert unsigned soft-bits [254..0] to soft-bits [-127..127] */</span><br><span> for (i = 0; i < bi->burst_len; i++) {</span><br><span> if (buf[i] == 255)</span><br><span>@@ -850,30 +855,6 @@</span><br><span> return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* TRXD burst handler for PDU version 1 */</span><br><span style="color: hsl(0, 100%, 40%);">-static int trx_data_handle_burst_v1(struct trx_l1h *l1h,</span><br><span style="color: hsl(0, 100%, 40%);">- struct trx_ul_burst_ind *bi,</span><br><span style="color: hsl(0, 100%, 40%);">- const uint8_t *buf, size_t buf_len)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- /* Modulation types defined in 3GPP TS 45.002 */</span><br><span style="color: hsl(0, 100%, 40%);">- static const size_t bl[] = {</span><br><span style="color: hsl(0, 100%, 40%);">- [TRX_MOD_T_GMSK] = 148, /* 1 bit per symbol */</span><br><span style="color: hsl(0, 100%, 40%);">- [TRX_MOD_T_8PSK] = 444, /* 3 bits per symbol */</span><br><span style="color: hsl(0, 100%, 40%);">- };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Verify burst length */</span><br><span style="color: hsl(0, 100%, 40%);">- if (bl[bi->mod] != buf_len) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGPPHI(l1h->phy_inst, DTRX, LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">- "Rx TRXD message with odd burst length %zu, "</span><br><span style="color: hsl(0, 100%, 40%);">- "expected %zu\n", buf_len, bl[bi->mod]);</span><br><span style="color: hsl(0, 100%, 40%);">- return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* The PDU format is the same as for version 0.</span><br><span style="color: hsl(0, 100%, 40%);">- * NOTE: other modulation types to be handled separately. */</span><br><span style="color: hsl(0, 100%, 40%);">- return trx_data_handle_burst_v0(l1h, bi, buf, buf_len);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static const char *trx_data_desc_msg(const struct trx_ul_burst_ind *bi)</span><br><span> {</span><br><span> struct osmo_strbuf sb;</span><br><span>@@ -916,15 +897,31 @@</span><br><span> return buf;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static const struct {</span><br><span style="color: hsl(120, 100%, 40%);">+ int (*parse)(struct phy_instance *phy_inst,</span><br><span style="color: hsl(120, 100%, 40%);">+ struct trx_ul_burst_ind *bi,</span><br><span style="color: hsl(120, 100%, 40%);">+ const uint8_t *buf, size_t buf_len);</span><br><span style="color: hsl(120, 100%, 40%);">+ size_t hdr_len;</span><br><span style="color: hsl(120, 100%, 40%);">+} trx_data_codec[16] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ [0] = { /* TRXDv0 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .hdr_len = TRX_UL_V0HDR_LEN,</span><br><span style="color: hsl(120, 100%, 40%);">+ .parse = &trx_data_parse_pdu_v0,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ [1] = { /* TRXDv1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ .hdr_len = TRX_UL_V1HDR_LEN,</span><br><span style="color: hsl(120, 100%, 40%);">+ .parse = &trx_data_parse_pdu_v1,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Parse TRXD message from transceiver, compose an UL burst indication. */</span><br><span> static int trx_data_read_cb(struct osmo_fd *ofd, unsigned int what)</span><br><span> {</span><br><span> struct trx_l1h *l1h = ofd->data;</span><br><span> uint8_t buf[TRXD_MSG_BUF_SIZE];</span><br><span style="color: hsl(120, 100%, 40%);">+ const uint8_t *ptr = &buf[0];</span><br><span> struct trx_ul_burst_ind bi;</span><br><span> ssize_t hdr_len, buf_len;</span><br><span> uint8_t pdu_ver;</span><br><span style="color: hsl(0, 100%, 40%);">- int rc;</span><br><span> </span><br><span> buf_len = recv(ofd->fd, buf, sizeof(buf), 0);</span><br><span> if (buf_len <= 0) {</span><br><span>@@ -948,56 +945,40 @@</span><br><span> return -EIO;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Parse header depending on the PDU version */</span><br><span style="color: hsl(0, 100%, 40%);">- switch (pdu_ver) {</span><br><span style="color: hsl(0, 100%, 40%);">- case 0:</span><br><span style="color: hsl(0, 100%, 40%);">- /* Legacy protocol has no version indicator */</span><br><span style="color: hsl(0, 100%, 40%);">- hdr_len = trx_data_handle_hdr_v0(l1h, &bi, buf, buf_len);</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case 1:</span><br><span style="color: hsl(0, 100%, 40%);">- hdr_len = trx_data_handle_hdr_v1(l1h, &bi, buf, buf_len);</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(trx_data_codec[pdu_ver].parse != NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Make sure that we have enough bytes to parse the header */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (buf_len < trx_data_codec[pdu_ver].hdr_len) {</span><br><span> LOGPPHI(l1h->phy_inst, DTRX, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">- "TRXD PDU version %u is not supported\n", pdu_ver);</span><br><span style="color: hsl(0, 100%, 40%);">- return -ENOTSUP;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Header parsing error */</span><br><span style="color: hsl(0, 100%, 40%);">- if (hdr_len < 0)</span><br><span style="color: hsl(0, 100%, 40%);">- return hdr_len;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (bi.fn >= GSM_TDMA_HYPERFRAME) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGPPHI(l1h->phy_inst, DTRX, LOGL_ERROR, "Illegal TDMA fn=%u\n", bi.fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ "Rx malformed TRXDv%u PDU: len=%zd < expected %zu\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ pdu_ver, buf_len, trx_data_codec[pdu_ver].hdr_len);</span><br><span> return -EINVAL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (bi.flags & TRX_BI_F_NOPE_IND) {</span><br><span style="color: hsl(0, 100%, 40%);">- bi.burst_len = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- goto skip_burst;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Call version specific header parser */</span><br><span style="color: hsl(120, 100%, 40%);">+ hdr_len = trx_data_codec[pdu_ver].parse(l1h->phy_inst, &bi, buf, buf_len);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (hdr_len < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ return hdr_len;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* We're done with the header now */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* We're done with the header */</span><br><span> buf_len -= hdr_len;</span><br><span style="color: hsl(120, 100%, 40%);">+ ptr += hdr_len;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Handle burst bits */</span><br><span style="color: hsl(0, 100%, 40%);">- switch (pdu_ver) {</span><br><span style="color: hsl(0, 100%, 40%);">- case 0:</span><br><span style="color: hsl(0, 100%, 40%);">- rc = trx_data_handle_burst_v0(l1h, &bi, buf + hdr_len, buf_len);</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case 1:</span><br><span style="color: hsl(0, 100%, 40%);">- rc = trx_data_handle_burst_v1(l1h, &bi, buf + hdr_len, buf_len);</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">- /* Shall not happen, just to make GCC happy */</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(0);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bi.fn >= GSM_TDMA_HYPERFRAME) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPPHI(l1h->phy_inst, DTRX, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+ "Rx malformed TRXDv%u PDU: illegal TDMA fn=%u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ pdu_ver, bi.fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EINVAL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Burst parsing error */</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc < 0)</span><br><span style="color: hsl(0, 100%, 40%);">- return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Calculate burst length and parse it (if present) */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (trx_data_parse_burst(&bi, ptr, buf_len) != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPPHI(l1h->phy_inst, DTRX, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+ "Rx malformed TRXDv%u PDU: odd burst length=%zd\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ pdu_ver, buf_len);</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-skip_burst:</span><br><span> /* Print header & burst info */</span><br><span> LOGPPHI(l1h->phy_inst, DTRX, LOGL_DEBUG, "Rx %s (pdu_ver=%u): %s\n",</span><br><span> (bi.flags & TRX_BI_F_NOPE_IND) ? "NOPE.ind" : "UL burst",</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/23832">change 23832</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-bts/+/23832"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-bts </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I7aedd85a8d4f6d6191cd3b75272a688208fb2879 </div>
<div style="display:none"> Gerrit-Change-Number: 23832 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>