<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>