<p>Max has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/13402">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Update MCS selection for retransmission<br><br>In 3GPP TS 44.060 the selection of MCS for retransmissions is defined as<br>separate tables (8.1.1.1 and 8.1.1.2) depending on the value of<br>resegmentation bit (which is opposite to the way EGPRS_ARQ are defined<br>in the source code). Let's follow the same idea and explicitly check for<br>resegmentation bit value and use separate tables. This also makes it<br>easier to add proper support for special cases (MCS-6-9 and MCS-5-7) and<br>padding in future independently for different ARQ types. The code is<br>also moved to c to avoid unnecessary conversions to and from cpp class.<br><br>Change-Id: Ia73baeefee7a58834f0fc50e3b8bf8d5e3eb7815<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/tbf_dl.cpp<br>5 files changed, 40 insertions(+), 50 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/02/13402/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 a4ae882..48a74cd 100644</span><br><span>--- a/src/coding_scheme.c</span><br><span>+++ b/src/coding_scheme.c</span><br><span>@@ -127,3 +127,39 @@</span><br><span> const char *mode_name(enum mcs_kind val) {</span><br><span>         return get_value_string(mode_names, val);</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* FIXME: take into account padding and special cases of commanded MCS (MCS-6-9 and MCS-5-7) */</span><br><span style="color: hsl(120, 100%, 40%);">+enum CodingScheme get_retx_mcs(enum CodingScheme initial_mcs, enum CodingScheme demanded_mcs, bool resegment_bit)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_ASSERT(mcs_is_edge(initial_mcs));</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(mcs_is_edge(demanded_mcs));</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_ASSERT(NUM_SCHEMES - MCS1 == 9);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (resegment_bit) { /* 3GPP TS 44.060 Table 8.1.1.1, reflected over antidiagonal */</span><br><span style="color: hsl(120, 100%, 40%);">+          enum CodingScheme egprs_reseg[NUM_SCHEMES - MCS1][NUM_SCHEMES - MCS1] = {</span><br><span style="color: hsl(120, 100%, 40%);">+                     { MCS1, MCS1, MCS1, MCS1, MCS1, MCS1, MCS1, MCS1, MCS1 },</span><br><span style="color: hsl(120, 100%, 40%);">+                     { MCS2, MCS2, MCS2, MCS2, MCS2, MCS2, MCS2, MCS2, MCS2 },</span><br><span style="color: hsl(120, 100%, 40%);">+                     { MCS3, MCS3, MCS3, MCS3, MCS3, MCS3, MCS3, MCS3, MCS3 },</span><br><span style="color: hsl(120, 100%, 40%);">+                     { MCS1, MCS1, MCS1, MCS4, MCS4, MCS4, MCS4, MCS4, MCS4 },</span><br><span style="color: hsl(120, 100%, 40%);">+                     { MCS2, MCS2, MCS2, MCS2, MCS5, MCS5, MCS7, MCS7, MCS7 },</span><br><span style="color: hsl(120, 100%, 40%);">+                     { MCS3, MCS3, MCS3, MCS3, MCS3, MCS6, MCS6, MCS6, MCS9 },</span><br><span style="color: hsl(120, 100%, 40%);">+                     { MCS2, MCS2, MCS2, MCS2, MCS5, MCS5, MCS7, MCS7, MCS7 },</span><br><span style="color: hsl(120, 100%, 40%);">+                     { MCS3, MCS3, MCS3, MCS3, MCS3, MCS6, MCS6, MCS8, MCS8 },</span><br><span style="color: hsl(120, 100%, 40%);">+                     { MCS3, MCS3, MCS3, MCS3, MCS3, MCS6, MCS6, MCS6, MCS9 },</span><br><span style="color: hsl(120, 100%, 40%);">+             };</span><br><span style="color: hsl(120, 100%, 40%);">+            return egprs_reseg[mcs_chan_code(initial_mcs)][mcs_chan_code(demanded_mcs)];</span><br><span style="color: hsl(120, 100%, 40%);">+  } else { /* 3GPP TS 44.060 Table 8.1.1.2, reflected over antidiagonal */</span><br><span style="color: hsl(120, 100%, 40%);">+              enum CodingScheme egprs_no_reseg[NUM_SCHEMES - MCS1][NUM_SCHEMES - MCS1] = {</span><br><span style="color: hsl(120, 100%, 40%);">+                  { MCS1, MCS1, MCS1, MCS1, MCS1, MCS1, MCS1, MCS1, MCS1 },</span><br><span style="color: hsl(120, 100%, 40%);">+                     { MCS2, MCS2, MCS2, MCS2, MCS2, MCS2, MCS2, MCS2, MCS2 },</span><br><span style="color: hsl(120, 100%, 40%);">+                     { MCS3, MCS3, MCS3, MCS3, MCS3, MCS3, MCS3, MCS3, MCS3 },</span><br><span style="color: hsl(120, 100%, 40%);">+                     { MCS4, MCS4, MCS4, MCS4, MCS4, MCS4, MCS4, MCS4, MCS4 },</span><br><span style="color: hsl(120, 100%, 40%);">+                     { MCS5, MCS5, MCS5, MCS5, MCS5, MCS5, MCS7, MCS7, MCS7 },</span><br><span style="color: hsl(120, 100%, 40%);">+                     { MCS6, MCS6, MCS6, MCS6, MCS6, MCS6, MCS6, MCS6, MCS9 },</span><br><span style="color: hsl(120, 100%, 40%);">+                     { MCS5, MCS5, MCS5, MCS5, MCS5, MCS5, MCS7, MCS7, MCS7 },</span><br><span style="color: hsl(120, 100%, 40%);">+                     { MCS6, MCS6, MCS6, MCS6, MCS6, MCS6, MCS6, MCS8, MCS8 },</span><br><span style="color: hsl(120, 100%, 40%);">+                     { MCS6, MCS6, MCS6, MCS6, MCS6, MCS6, MCS6, MCS6, MCS9 },</span><br><span style="color: hsl(120, 100%, 40%);">+             };</span><br><span style="color: hsl(120, 100%, 40%);">+            return egprs_no_reseg[mcs_chan_code(initial_mcs)][mcs_chan_code(demanded_mcs)];</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/coding_scheme.h b/src/coding_scheme.h</span><br><span>index aac4bba..f93a4a2 100644</span><br><span>--- a/src/coding_scheme.h</span><br><span>+++ b/src/coding_scheme.h</span><br><span>@@ -32,6 +32,7 @@</span><br><span> </span><br><span> extern const struct value_string mcs_names[];</span><br><span> const char *mcs_name(enum CodingScheme val);</span><br><span style="color: hsl(120, 100%, 40%);">+enum CodingScheme get_retx_mcs(enum CodingScheme initial_mcs, enum CodingScheme demanded_mcs, bool resegment_bit);</span><br><span> </span><br><span> bool mcs_is_gprs(enum CodingScheme cs);</span><br><span> bool mcs_is_edge(enum CodingScheme cs);</span><br><span>diff --git a/src/gprs_coding_scheme.cpp b/src/gprs_coding_scheme.cpp</span><br><span>index a149f81..0c22670 100644</span><br><span>--- a/src/gprs_coding_scheme.cpp</span><br><span>+++ b/src/gprs_coding_scheme.cpp</span><br><span>@@ -21,41 +21,6 @@</span><br><span> </span><br><span> #include "gprs_coding_scheme.h"</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define MAX_NUM_ARQ           2     /* max. number of ARQ */</span><br><span style="color: hsl(0, 100%, 40%);">-#define MAX_NUM_MCS           9     /* max. number of MCS */</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%);">- * 44.060 Table 8.1.1.1 and Table 8.1.1.2</span><br><span style="color: hsl(0, 100%, 40%);">- * It has 3 level indexing. 0th level is ARQ type</span><br><span style="color: hsl(0, 100%, 40%);">- * 1st level is Original MCS( index 0 corresponds to MCS1 and so on)</span><br><span style="color: hsl(0, 100%, 40%);">- * 2nd level is MS MCS (index 0 corresponds to MCS1 and so on)</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static enum CodingScheme egprs_mcs_retx_tbl[MAX_NUM_ARQ]</span><br><span style="color: hsl(0, 100%, 40%);">-                    [MAX_NUM_MCS][MAX_NUM_MCS] = {</span><br><span style="color: hsl(0, 100%, 40%);">-          {</span><br><span style="color: hsl(0, 100%, 40%);">-                       {MCS1, MCS1, MCS1, MCS1, MCS1, MCS1, MCS1, MCS1, MCS1},</span><br><span style="color: hsl(0, 100%, 40%);">-                 {MCS2, MCS2, MCS2, MCS2, MCS2, MCS2, MCS2, MCS2, MCS2},</span><br><span style="color: hsl(0, 100%, 40%);">-                 {MCS3, MCS3, MCS3, MCS3, MCS3, MCS3, MCS3, MCS3, MCS3},</span><br><span style="color: hsl(0, 100%, 40%);">-                 {MCS1, MCS1, MCS1, MCS4, MCS4, MCS4, MCS4, MCS4, MCS4},</span><br><span style="color: hsl(0, 100%, 40%);">-                 {MCS2, MCS2, MCS2, MCS2, MCS5, MCS5, MCS7, MCS7, MCS7},</span><br><span style="color: hsl(0, 100%, 40%);">-                 {MCS3, MCS3, MCS3, MCS3, MCS3, MCS6, MCS6, MCS6, MCS9},</span><br><span style="color: hsl(0, 100%, 40%);">-                 {MCS2, MCS2, MCS2, MCS2, MCS5, MCS5, MCS7, MCS7, MCS7},</span><br><span style="color: hsl(0, 100%, 40%);">-                 {MCS3, MCS3, MCS3, MCS3, MCS3, MCS6, MCS6, MCS8, MCS8},</span><br><span style="color: hsl(0, 100%, 40%);">-                 {MCS3, MCS3, MCS3, MCS3, MCS3, MCS6, MCS6, MCS6, MCS9}</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%);">-                       {MCS1, MCS1, MCS1, MCS1, MCS1, MCS1, MCS1, MCS1, MCS1},</span><br><span style="color: hsl(0, 100%, 40%);">-                 {MCS2, MCS2, MCS2, MCS2, MCS2, MCS2, MCS2, MCS2, MCS2},</span><br><span style="color: hsl(0, 100%, 40%);">-                 {MCS3, MCS3, MCS3, MCS3, MCS3, MCS3, MCS3, MCS3, MCS3},</span><br><span style="color: hsl(0, 100%, 40%);">-                 {MCS4, MCS4, MCS4, MCS4, MCS4, MCS4, MCS4, MCS4, MCS4},</span><br><span style="color: hsl(0, 100%, 40%);">-                 {MCS5, MCS5, MCS5, MCS5, MCS5, MCS5, MCS7, MCS7, MCS7},</span><br><span style="color: hsl(0, 100%, 40%);">-                 {MCS6, MCS6, MCS6, MCS6, MCS6, MCS6, MCS6, MCS6, MCS9},</span><br><span style="color: hsl(0, 100%, 40%);">-                 {MCS5, MCS5, MCS5, MCS5, MCS5, MCS5, MCS7, MCS7, MCS7},</span><br><span style="color: hsl(0, 100%, 40%);">-                 {MCS6, MCS6, MCS6, MCS6, MCS6, MCS6, MCS6, MCS8, MCS8},</span><br><span style="color: hsl(0, 100%, 40%);">-                 {MCS6, MCS6, MCS6, MCS6, MCS6, MCS6, MCS6, MCS6, MCS9}</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%);">-</span><br><span> enum Family {</span><br><span>  FAMILY_INVALID,</span><br><span>      FAMILY_A,</span><br><span>@@ -63,13 +28,6 @@</span><br><span>       FAMILY_C,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-CodingScheme GprsCodingScheme::get_retx_mcs(const GprsCodingScheme mcs,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                      const GprsCodingScheme demanded_mcs,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                    const unsigned arq_type)</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_chan_code(mcs)][mcs_chan_code(demanded_mcs)];</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static struct {</span><br><span>    struct {</span><br><span>             uint8_t bytes;</span><br><span>diff --git a/src/gprs_coding_scheme.h b/src/gprs_coding_scheme.h</span><br><span>index d5604fb..c31f58f 100644</span><br><span>--- a/src/gprs_coding_scheme.h</span><br><span>+++ b/src/gprs_coding_scheme.h</span><br><span>@@ -73,9 +73,6 @@</span><br><span>      static GprsCodingScheme getGprsByNum(unsigned num);</span><br><span>  static GprsCodingScheme getEgprsByNum(unsigned num);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        static CodingScheme get_retx_mcs(const GprsCodingScheme mcs,</span><br><span style="color: hsl(0, 100%, 40%);">-                            const GprsCodingScheme retx_mcs,</span><br><span style="color: hsl(0, 100%, 40%);">-                                const unsigned arq_type);</span><br><span> private:</span><br><span>        GprsCodingScheme(int s); /* fail on use */</span><br><span>   GprsCodingScheme& operator =(int s); /* fail on use */</span><br><span>diff --git a/src/tbf_dl.cpp b/src/tbf_dl.cpp</span><br><span>index 08df05a..c97436a 100644</span><br><span>--- a/src/tbf_dl.cpp</span><br><span>+++ b/src/tbf_dl.cpp</span><br><span>@@ -378,11 +378,9 @@</span><br><span> </span><br><span>           if (is_egprs_enabled()) {</span><br><span>                    /* Table 8.1.1.2 and Table 8.1.1.1 of 44.060 */</span><br><span style="color: hsl(0, 100%, 40%);">-                 m_rlc.block(bsn)->cs_current_trans =</span><br><span style="color: hsl(0, 100%, 40%);">-                         GprsCodingScheme::get_retx_mcs(</span><br><span style="color: hsl(0, 100%, 40%);">-                                 m_rlc.block(bsn)->cs_init,</span><br><span style="color: hsl(0, 100%, 40%);">-                                   ms()->current_cs_dl(),</span><br><span style="color: hsl(0, 100%, 40%);">-                                       bts->bts_data()->dl_arq_type);</span><br><span style="color: hsl(120, 100%, 40%);">+                  m_rlc.block(bsn)->cs_current_trans = get_retx_mcs(m_rlc.block(bsn)->cs_init,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                      ms()->current_cs_dl(),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                     !bts->bts_data()->dl_arq_type);</span><br><span> </span><br><span>                  LOGPTBFDL(this, LOGL_DEBUG,</span><br><span>                            "initial_cs_dl(%s) last_mcs(%s) demanded_mcs(%s) cs_trans(%s) arq_type(%d) bsn(%d)\n",</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13402">change 13402</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/13402"/><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: Ia73baeefee7a58834f0fc50e3b8bf8d5e3eb7815 </div>
<div style="display:none"> Gerrit-Change-Number: 13402 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Max <msuraev@sysmocom.de> </div>