<p>Max has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/13215">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">MCS: add Channel Coding Command encoder<br><br>Add function to encode MCS value as proper EDGE or GPRS Channel Coding<br>value according to 3GPP TS 44.060 and corresponding helpers.<br><br>Use it for everything except IA Rest Octet encoding which is done in a<br>follow-up patches to make sure that we distinguish between<br>encoding-related changes to test output and unrelated changes.<br><br>Change-Id: I127fb29f5aaf77a7f6c4c565dfeb3b711af9845d<br>---<br>M src/coding_scheme.c<br>M src/coding_scheme.h<br>M src/gprs_coding_scheme.cpp<br>M src/gprs_coding_scheme.h<br>M src/gprs_ms.cpp<br>M tests/ms/MsTest.cpp<br>M tests/tbf/TbfTest.cpp<br>7 files changed, 31 insertions(+), 20 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-pcu refs/changes/15/13215/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/coding_scheme.c b/src/coding_scheme.c</span><br><span>index 28bd4fb..372da66 100644</span><br><span>--- a/src/coding_scheme.c</span><br><span>+++ b/src/coding_scheme.c</span><br><span>@@ -64,6 +64,19 @@</span><br><span>    return false;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Return 3GPP TS 44.060 ยง12.10d (EDGE) or Table 11.2.28.2 (GPRS) Channel Coding Command value */</span><br><span style="color: hsl(120, 100%, 40%);">+uint8_t mcs_chan_code(enum CodingScheme cs)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    if (mcs_is_gprs(cs))</span><br><span style="color: hsl(120, 100%, 40%);">+          return cs - CS1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (mcs_is_edge(cs))</span><br><span style="color: hsl(120, 100%, 40%);">+          return cs - MCS1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Defaults to (M)CS1 */</span><br><span style="color: hsl(120, 100%, 40%);">+      return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static struct {</span><br><span>    struct {</span><br><span>             uint8_t data_header_bits;</span><br><span>diff --git a/src/coding_scheme.h b/src/coding_scheme.h</span><br><span>index 561e2a4..2befa84 100644</span><br><span>--- a/src/coding_scheme.h</span><br><span>+++ b/src/coding_scheme.h</span><br><span>@@ -37,6 +37,8 @@</span><br><span> bool mcs_is_edge(enum CodingScheme cs);</span><br><span> bool mcs_is_edge_gmsk(enum CodingScheme cs);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+uint8_t mcs_chan_code(enum CodingScheme cs);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> enum HeaderType {</span><br><span>   HEADER_INVALID,</span><br><span>      HEADER_GPRS_CONTROL,</span><br><span>diff --git a/src/gprs_coding_scheme.cpp b/src/gprs_coding_scheme.cpp</span><br><span>index e316097..23e4196 100644</span><br><span>--- a/src/gprs_coding_scheme.cpp</span><br><span>+++ b/src/gprs_coding_scheme.cpp</span><br><span>@@ -67,10 +67,7 @@</span><br><span>                                                       const GprsCodingScheme demanded_mcs,</span><br><span>                                                         const unsigned arq_type)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   OSMO_ASSERT(mcs.to_num() > 0);</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(demanded_mcs.to_num() > 0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      return egprs_mcs_retx_tbl[arq_type][mcs.to_num() - 1][demanded_mcs.to_num() - 1];</span><br><span style="color: hsl(120, 100%, 40%);">+     return egprs_mcs_retx_tbl[arq_type][mcs_chan_code(mcs)][mcs_chan_code(demanded_mcs)];</span><br><span> }</span><br><span> </span><br><span> static struct {</span><br><span>diff --git a/src/gprs_coding_scheme.h b/src/gprs_coding_scheme.h</span><br><span>index d6c0045..99a1d86 100644</span><br><span>--- a/src/gprs_coding_scheme.h</span><br><span>+++ b/src/gprs_coding_scheme.h</span><br><span>@@ -82,6 +82,7 @@</span><br><span>   enum CodingScheme m_scheme;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+// FIXME: remove once < comparison operator below is no longer necessary</span><br><span> inline uint8_t GprsCodingScheme::to_num() const</span><br><span> {</span><br><span>   if (mcs_is_gprs(m_scheme))</span><br><span>diff --git a/src/gprs_ms.cpp b/src/gprs_ms.cpp</span><br><span>index 08b94be..fdcfc3c 100644</span><br><span>--- a/src/gprs_ms.cpp</span><br><span>+++ b/src/gprs_ms.cpp</span><br><span>@@ -523,7 +523,7 @@</span><br><span>    m_nack_rate_dl = error_rate;</span><br><span> </span><br><span>     if (error_rate > bts_data->cs_adj_upper_limit) {</span><br><span style="color: hsl(0, 100%, 40%);">-          if (m_current_cs_dl.to_num() > 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                if (mcs_chan_code(m_current_cs_dl) > 0) {</span><br><span>                         m_current_cs_dl.dec(mode());</span><br><span>                         LOGP(DRLCMACDL, LOGL_INFO,</span><br><span>                           "MS (IMSI %s): High error rate %d%%, "</span><br><span>@@ -621,7 +621,7 @@</span><br><span>       int low;</span><br><span>     int high;</span><br><span>    GprsCodingScheme new_cs_ul = m_current_cs_ul;</span><br><span style="color: hsl(0, 100%, 40%);">-   uint8_t current_cs_num = m_current_cs_ul.to_num();</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t current_cs = mcs_chan_code(m_current_cs_ul);</span><br><span> </span><br><span>     bts_data = m_bts->bts_data();</span><br><span> </span><br><span>@@ -632,8 +632,6 @@</span><br><span>           return;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   OSMO_ASSERT(current_cs_num > 0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>  if (!m_current_cs_ul) {</span><br><span>              LOGP(DRLCMACMEAS, LOGL_ERROR,</span><br><span>                     "Unable to update UL (M)CS because it's not set: %s\n",</span><br><span>@@ -651,15 +649,15 @@</span><br><span>   old_link_qual = meas->link_qual;</span><br><span> </span><br><span>      if (mcs_is_gprs(m_current_cs_ul)) {</span><br><span style="color: hsl(0, 100%, 40%);">-             if (current_cs_num > MAX_GPRS_CS)</span><br><span style="color: hsl(0, 100%, 40%);">-                    current_cs_num = MAX_GPRS_CS;</span><br><span style="color: hsl(0, 100%, 40%);">-           low  = bts_data->cs_lqual_ranges[current_cs_num-1].low;</span><br><span style="color: hsl(0, 100%, 40%);">-              high = bts_data->cs_lqual_ranges[current_cs_num-1].high;</span><br><span style="color: hsl(120, 100%, 40%);">+           if (current_cs >= MAX_GPRS_CS)</span><br><span style="color: hsl(120, 100%, 40%);">+                     current_cs = MAX_GPRS_CS - 1;</span><br><span style="color: hsl(120, 100%, 40%);">+         low  = bts_data->cs_lqual_ranges[current_cs].low;</span><br><span style="color: hsl(120, 100%, 40%);">+          high = bts_data->cs_lqual_ranges[current_cs].high;</span><br><span>        } else if (mcs_is_edge(m_current_cs_ul)) {</span><br><span style="color: hsl(0, 100%, 40%);">-              if (current_cs_num > MAX_EDGE_MCS)</span><br><span style="color: hsl(0, 100%, 40%);">-                   current_cs_num = MAX_EDGE_MCS;</span><br><span style="color: hsl(0, 100%, 40%);">-          low  = bts_data->mcs_lqual_ranges[current_cs_num-1].low;</span><br><span style="color: hsl(0, 100%, 40%);">-             high = bts_data->mcs_lqual_ranges[current_cs_num-1].high;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (current_cs >= MAX_EDGE_MCS)</span><br><span style="color: hsl(120, 100%, 40%);">+                    current_cs = MAX_EDGE_MCS - 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                low  = bts_data->mcs_lqual_ranges[current_cs].low;</span><br><span style="color: hsl(120, 100%, 40%);">+         high = bts_data->mcs_lqual_ranges[current_cs].high;</span><br><span>       } else {</span><br><span>             LOGP(DRLCMACMEAS, LOGL_ERROR,</span><br><span>                     "Unable to update UL (M)CS because it's neither GPRS nor EDGE: %s\n",</span><br><span>diff --git a/tests/ms/MsTest.cpp b/tests/ms/MsTest.cpp</span><br><span>index 728daf6..f5d3fc0 100644</span><br><span>--- a/tests/ms/MsTest.cpp</span><br><span>+++ b/tests/ms/MsTest.cpp</span><br><span>@@ -504,11 +504,11 @@</span><br><span>    dl_tbf->set_ms(ms);</span><br><span>       OSMO_ASSERT(!ms->is_idle());</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     OSMO_ASSERT(ms->current_cs_dl().to_num() == 4);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(mcs_chan_code(ms->current_cs_dl()) == 3);</span><br><span> </span><br><span>         bts->cs_downgrade_threshold = 200;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(ms->current_cs_dl().to_num() == 3);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(mcs_chan_code(ms->current_cs_dl()) == 2);</span><br><span> </span><br><span>         talloc_free(dl_tbf);</span><br><span> </span><br><span>diff --git a/tests/tbf/TbfTest.cpp b/tests/tbf/TbfTest.cpp</span><br><span>index 0d473a1..5145dd6 100644</span><br><span>--- a/tests/tbf/TbfTest.cpp</span><br><span>+++ b/tests/tbf/TbfTest.cpp</span><br><span>@@ -2742,12 +2742,12 @@</span><br><span> </span><br><span> #define CHECK_UNACKED(tbf, cs, bsn) do {                                          \</span><br><span>               OSMO_ASSERT(tbf->window()->m_v_b.is_unacked(bsn));                     \</span><br><span style="color: hsl(0, 100%, 40%);">-          OSMO_ASSERT(tbf->m_rlc.block(bsn)->cs_current_trans.to_num() == cs); \</span><br><span style="color: hsl(120, 100%, 40%);">+          OSMO_ASSERT(mcs_chan_code(tbf->m_rlc.block(bsn)->cs_current_trans) == cs - 1); \</span><br><span>       } while(0)</span><br><span> </span><br><span> #define CHECK_NACKED(tbf, cs, bsn) do {                                                    \</span><br><span>               OSMO_ASSERT(tbf->window()->m_v_b.is_nacked(bsn));              \</span><br><span style="color: hsl(0, 100%, 40%);">-          OSMO_ASSERT(tbf->m_rlc.block(bsn)->cs_current_trans.to_num() == cs); \</span><br><span style="color: hsl(120, 100%, 40%);">+          OSMO_ASSERT(mcs_chan_code(tbf->m_rlc.block(bsn)->cs_current_trans) == cs - 1); \</span><br><span>       } while(0)</span><br><span> </span><br><span> #define MAKE_ACKED(m, tbf, fn, cs, check_unacked) do {                        \</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13215">change 13215</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/13215"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-pcu </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I127fb29f5aaf77a7f6c4c565dfeb3b711af9845d </div>
<div style="display:none"> Gerrit-Change-Number: 13215 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Max <msuraev@sysmocom.de> </div>