<p>fixeria <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/23832">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, but someone else must approve
  fixeria: Looks good to me, approved
  pespin: Looks good to me, but someone else must approve
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">osmo-bts-trx: refactor handling of version specific TRXD parts<br><br>This is a preparatory change for the upcoming TRXDv2 support:<br><br>* move common TRXDv0/v1 header parser into a separate function;<br>* move burst handling into a single, version independent function;<br>** determine modulation and burst length in trx_data_parse_pdu_v0();<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, 58 insertions(+), 81 deletions(-)<br><br></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 d2ad877..46b4601 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>@@ -729,15 +729,41 @@</span><br><span>     TRX_UL_V1HDR_LEN, /* TRXDv1 */</span><br><span> };</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 phy_instance *phy_inst,</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%);">+/* Header dissector for TRXDv0 (and part of TRXDv1) */</span><br><span style="color: hsl(120, 100%, 40%);">+static inline void trx_data_handle_hdr_v0_part(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>      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(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* TRXD header dissector for version 0x00 */</span><br><span style="color: hsl(120, 100%, 40%);">+static int trx_data_handle_hdr_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_handle_hdr_v0_part(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->mod = TRX_MOD_T_8PSK;</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->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> </span><br><span>        return TRX_UL_V0HDR_LEN;</span><br><span> }</span><br><span>@@ -783,14 +809,9 @@</span><br><span> {</span><br><span>    int rc;</span><br><span> </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(phy_inst, 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_handle_hdr_v0_part(bi, buf);</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>         rc = trx_data_parse_mts(phy_inst, bi, buf[0]);</span><br><span>@@ -804,31 +825,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 phy_instance *phy_inst,</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%);">+/* TRXD burst handler (version independent) */</span><br><span style="color: hsl(120, 100%, 40%);">+static int trx_data_handle_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(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>@@ -840,30 +858,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 phy_instance *phy_inst,</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(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(phy_inst, 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>@@ -914,7 +908,6 @@</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,11 +941,10 @@</span><br><span> </span><br><span>   /* Parse header depending on the PDU version */</span><br><span>      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(120, 100%, 40%);">+        case 0: /* TRXDv0 */</span><br><span>                 hdr_len = trx_data_handle_hdr_v0(l1h->phy_inst, &bi, buf, buf_len);</span><br><span>           break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case 1:</span><br><span style="color: hsl(120, 100%, 40%);">+       case 1: /* TRXDv1 */</span><br><span>                 hdr_len = trx_data_handle_hdr_v1(l1h->phy_inst, &bi, buf, buf_len);</span><br><span>           break;</span><br><span>       default:</span><br><span>@@ -971,32 +963,17 @@</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(0, 100%, 40%);">-</span><br><span>    /* We're done with the header now */</span><br><span>     buf_len -= 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->phy_inst, &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->phy_inst, &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%);">+       /* Calculate burst length and parse it (if present) */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (trx_data_handle_burst(&bi, buf + hdr_len, 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>      }</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(0, 100%, 40%);">-</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: 7 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>