<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/24851">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">hodec2: [2/2] implement automatic choice between FULL and SUBSET measurements<br><br>Add TDMA_MEAS_SET_AUTO to indicate automatic choice between FULL and<br>SUBSET measurements depending on DTX in both hodec1 and hodec2.<br><br>TDMA_MEAS_SET_AUTO looks at each individual measurement report's DTX<br>flag and for each report chooses FULL if DTX is not used, or SUB if DTX<br>is used.<br><br>The default setting for 'handover2 tdma-measurement' is still 'subset'.<br>To use the automatic choice, users need configure<br>  handover2 tdma-measurement auto<br><br>Change-Id: I67dce55ccf892c8679272ee5dfedc25620f0f725<br>---<br>M include/osmocom/bsc/handover_cfg.h<br>M include/osmocom/bsc/meas_rep.h<br>M src/osmo-bsc/handover_decision_2.c<br>M src/osmo-bsc/meas_rep.c<br>M tests/bsc/Makefile.am<br>M tests/handover_cfg.vty<br>6 files changed, 35 insertions(+), 22 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/51/24851/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/handover_cfg.h b/include/osmocom/bsc/handover_cfg.h</span><br><span>index 6e003af..551ce8d 100644</span><br><span>--- a/include/osmocom/bsc/handover_cfg.h</span><br><span>+++ b/include/osmocom/bsc/handover_cfg.h</span><br><span>@@ -38,18 +38,6 @@</span><br><span>       return arg? 1 : 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static inline bool a2tdma(const char *arg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  if (!strcmp(arg, "full"))</span><br><span style="color: hsl(0, 100%, 40%);">-             return true;</span><br><span style="color: hsl(0, 100%, 40%);">-    return false;</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%);">-static inline const char *tdma2a(bool val)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       return val? "full" : "subset";</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* The HO_CFG_ONE_MEMBER macro gets redefined, depending on whether to define struct members,</span><br><span>  * function declarations or definitions... It is of the format</span><br><span>  *   HO_CFG_ONE_MEMBER(TYPE, NAME, DEFAULT_VAL,</span><br><span>@@ -188,10 +176,13 @@</span><br><span>            "Disable in-call assignment\n" \</span><br><span>           "Enable in-call assignment\n") \</span><br><span>   \</span><br><span style="color: hsl(0, 100%, 40%);">-       HO_CFG_ONE_MEMBER(bool, hodec2_full_tdma, subset, \</span><br><span style="color: hsl(0, 100%, 40%);">-             "handover2 ", "tdma-measurement", "full|subset", a2tdma, "%s", tdma2a, \</span><br><span style="color: hsl(120, 100%, 40%);">+      HO_CFG_ONE_MEMBER(enum tdma_meas_set, hodec2_tdma_meas_set, subset, \</span><br><span style="color: hsl(120, 100%, 40%);">+         "handover2 ", "tdma-measurement", "auto|full|subset", \</span><br><span style="color: hsl(120, 100%, 40%);">+         tdma_meas_set_from_str, "%s", tdma_meas_set_name, \</span><br><span>                HO_CFG_STR_HANDOVER2 \</span><br><span>               "Define measurement set of TDMA frames\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+         "Use full set when DTX is not in use, use subset when DTX is in use," \</span><br><span style="color: hsl(120, 100%, 40%);">+             " as indicated by each Measurement Report\n" \</span><br><span>             "Full set of 102/104 TDMA frames\n" \</span><br><span>              "Sub set of 4 TDMA frames (SACCH)\n") \</span><br><span>    \</span><br><span>diff --git a/include/osmocom/bsc/meas_rep.h b/include/osmocom/bsc/meas_rep.h</span><br><span>index 77af365..e30121f 100644</span><br><span>--- a/include/osmocom/bsc/meas_rep.h</span><br><span>+++ b/include/osmocom/bsc/meas_rep.h</span><br><span>@@ -67,6 +67,12 @@</span><br><span>  TDMA_MEAS_SET_AUTO,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+extern const struct value_string tdma_meas_set_names[];</span><br><span style="color: hsl(120, 100%, 40%);">+static inline const char *tdma_meas_set_name(enum tdma_meas_set val)</span><br><span style="color: hsl(120, 100%, 40%);">+{ return get_value_string(tdma_meas_set_names, val); }</span><br><span style="color: hsl(120, 100%, 40%);">+static inline enum tdma_meas_set tdma_meas_set_from_str(const char *name)</span><br><span style="color: hsl(120, 100%, 40%);">+{ return get_string_value(tdma_meas_set_names, name); }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* obtain an average over the last 'num' fields in the meas reps */</span><br><span> int get_meas_rep_avg(const struct gsm_lchan *lchan,</span><br><span>                  enum tdma_meas_field field, enum tdma_meas_dir dir, enum tdma_meas_set set,</span><br><span>diff --git a/src/osmo-bsc/handover_decision_2.c b/src/osmo-bsc/handover_decision_2.c</span><br><span>index c3674ff..dd35c73 100644</span><br><span>--- a/src/osmo-bsc/handover_decision_2.c</span><br><span>+++ b/src/osmo-bsc/handover_decision_2.c</span><br><span>@@ -244,16 +244,14 @@</span><br><span> static int current_rxlev(struct gsm_lchan *lchan)</span><br><span> {</span><br><span>      struct gsm_bts *bts = lchan->ts->trx->bts;</span><br><span style="color: hsl(0, 100%, 40%);">-     return get_meas_rep_avg(lchan, TDMA_MEAS_FIELD_RXLEV, TDMA_MEAS_DIR_DL,</span><br><span style="color: hsl(0, 100%, 40%);">-                         ho_get_hodec2_full_tdma(bts->ho) ? TDMA_MEAS_SET_FULL : TDMA_MEAS_SET_SUB,</span><br><span style="color: hsl(120, 100%, 40%);">+ return get_meas_rep_avg(lchan, TDMA_MEAS_FIELD_RXLEV, TDMA_MEAS_DIR_DL, ho_get_hodec2_tdma_meas_set(bts->ho),</span><br><span>                             ho_get_hodec2_rxlev_avg_win(bts->ho));</span><br><span> }</span><br><span> </span><br><span> static int current_rxqual(struct gsm_lchan *lchan)</span><br><span> {</span><br><span>        struct gsm_bts *bts = lchan->ts->trx->bts;</span><br><span style="color: hsl(0, 100%, 40%);">-     return get_meas_rep_avg(lchan, TDMA_MEAS_FIELD_RXQUAL, TDMA_MEAS_DIR_DL,</span><br><span style="color: hsl(0, 100%, 40%);">-                                ho_get_hodec2_full_tdma(bts->ho) ? TDMA_MEAS_SET_FULL : TDMA_MEAS_SET_SUB,</span><br><span style="color: hsl(120, 100%, 40%);">+ return get_meas_rep_avg(lchan, TDMA_MEAS_FIELD_RXQUAL, TDMA_MEAS_DIR_DL, ho_get_hodec2_tdma_meas_set(bts->ho),</span><br><span>                            ho_get_hodec2_rxqual_avg_win(bts->ho));</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/osmo-bsc/meas_rep.c b/src/osmo-bsc/meas_rep.c</span><br><span>index 0ddf349..ee8555d 100644</span><br><span>--- a/src/osmo-bsc/meas_rep.c</span><br><span>+++ b/src/osmo-bsc/meas_rep.c</span><br><span>@@ -81,7 +81,7 @@</span><br><span> }</span><br><span> </span><br><span> static inline enum meas_rep_field choose_meas_rep_field(enum tdma_meas_field field, enum tdma_meas_dir dir,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                        enum tdma_meas_set set)</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       enum tdma_meas_set set, const struct gsm_meas_rep *meas_rep)</span><br><span> {</span><br><span>    const enum meas_rep_field map[2][2][2] = {</span><br><span>           [TDMA_MEAS_FIELD_RXLEV] = {</span><br><span>@@ -106,6 +106,14 @@</span><br><span>           },</span><br><span>   };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        if (set == TDMA_MEAS_SET_AUTO) {</span><br><span style="color: hsl(120, 100%, 40%);">+              bool dtx_in_use;</span><br><span style="color: hsl(120, 100%, 40%);">+              OSMO_ASSERT(meas_rep);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              dtx_in_use = (meas_rep->flags & ((dir == TDMA_MEAS_DIR_UL) ? MEAS_REP_F_UL_DTX : MEAS_REP_F_DL_DTX));</span><br><span style="color: hsl(120, 100%, 40%);">+          set = (dtx_in_use ? TDMA_MEAS_SET_SUB : TDMA_MEAS_SET_FULL);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  OSMO_ASSERT(field == TDMA_MEAS_FIELD_RXQUAL || field == TDMA_MEAS_FIELD_RXLEV);</span><br><span>      OSMO_ASSERT(dir == TDMA_MEAS_DIR_UL || dir == TDMA_MEAS_DIR_DL);</span><br><span>     OSMO_ASSERT(set == TDMA_MEAS_SET_FULL || set == TDMA_MEAS_SET_SUB);</span><br><span>@@ -135,7 +143,7 @@</span><br><span>            enum meas_rep_field use_field;</span><br><span>               int val;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-            use_field = choose_meas_rep_field(field, dir, set);</span><br><span style="color: hsl(120, 100%, 40%);">+           use_field = choose_meas_rep_field(field, dir, set, &lchan->meas_rep[j]);</span><br><span>              val = get_field(&lchan->meas_rep[j], use_field);</span><br><span> </span><br><span>          if (val >= 0) {</span><br><span>@@ -166,7 +174,7 @@</span><br><span>             enum meas_rep_field use_field;</span><br><span>               int val;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-            use_field = choose_meas_rep_field(field, dir, set);</span><br><span style="color: hsl(120, 100%, 40%);">+           use_field = choose_meas_rep_field(field, dir, set, &lchan->meas_rep[j]);</span><br><span>              val = get_field(&lchan->meas_rep[j], use_field);</span><br><span> </span><br><span>          if (val >= be) /* implies that val < 0 will not count */</span><br><span>@@ -178,3 +186,10 @@</span><br><span> </span><br><span>    return 0;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+const struct value_string tdma_meas_set_names[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ { TDMA_MEAS_SET_FULL, "full" },</span><br><span style="color: hsl(120, 100%, 40%);">+     { TDMA_MEAS_SET_SUB, "subset" },</span><br><span style="color: hsl(120, 100%, 40%);">+    { TDMA_MEAS_SET_AUTO, "auto" },</span><br><span style="color: hsl(120, 100%, 40%);">+     {}</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span>diff --git a/tests/bsc/Makefile.am b/tests/bsc/Makefile.am</span><br><span>index a0bbb81..2f66778 100644</span><br><span>--- a/tests/bsc/Makefile.am</span><br><span>+++ b/tests/bsc/Makefile.am</span><br><span>@@ -46,6 +46,7 @@</span><br><span>  $(top_builddir)/src/osmo-bsc/gsm_data.o \</span><br><span>    $(top_builddir)/src/osmo-bsc/handover_cfg.o \</span><br><span>        $(top_builddir)/src/osmo-bsc/handover_logic.o \</span><br><span style="color: hsl(120, 100%, 40%);">+       $(top_builddir)/src/osmo-bsc/meas_rep.o \</span><br><span>    $(top_builddir)/src/osmo-bsc/neighbor_ident.o \</span><br><span>      $(top_builddir)/src/osmo-bsc/net_init.o \</span><br><span>    $(top_builddir)/src/osmo-bsc/nm_common_fsm.o \</span><br><span>diff --git a/tests/handover_cfg.vty b/tests/handover_cfg.vty</span><br><span>index 4bafd72..ccb1a6b 100644</span><br><span>--- a/tests/handover_cfg.vty</span><br><span>+++ b/tests/handover_cfg.vty</span><br><span>@@ -178,7 +178,7 @@</span><br><span>   handover2 power budget hysteresis (<0-999>|default)</span><br><span>   handover2 maximum distance (<0-9999>|default)</span><br><span>   handover2 assignment (0|1|default)</span><br><span style="color: hsl(0, 100%, 40%);">-  handover2 tdma-measurement (full|subset|default)</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 tdma-measurement (auto|full|subset|default)</span><br><span>   handover2 min rxlev (<-110--50>|default)</span><br><span>   handover2 min rxqual (<0-7>|default)</span><br><span>   handover2 afs-bias rxlev (<0-20>|default)</span><br><span>@@ -335,6 +335,7 @@</span><br><span>   default  Use default (0), remove explicit setting on this node</span><br><span> </span><br><span> OsmoBSC(config-net)# handover2 tdma-measurement ?</span><br><span style="color: hsl(120, 100%, 40%);">+  auto     Use full set when DTX is not in use, use subset when DTX is in use, as indicated by each Measurement Report</span><br><span>   full     Full set of 102/104 TDMA frames</span><br><span>   subset   Sub set of 4 TDMA frames (SACCH)</span><br><span>   default  Use default (subset), remove explicit setting on this node</span><br><span>@@ -553,6 +554,7 @@</span><br><span>   default  Use default (0), remove explicit setting on this node</span><br><span> </span><br><span> OsmoBSC(config-net-bts)# handover2 tdma-measurement ?</span><br><span style="color: hsl(120, 100%, 40%);">+  auto     Use full set when DTX is not in use, use subset when DTX is in use, as indicated by each Measurement Report</span><br><span>   full     Full set of 102/104 TDMA frames</span><br><span>   subset   Sub set of 4 TDMA frames (SACCH)</span><br><span>   default  Use default (subset), remove explicit setting on this node</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/24851">change 24851</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-bsc/+/24851"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I67dce55ccf892c8679272ee5dfedc25620f0f725 </div>
<div style="display:none"> Gerrit-Change-Number: 24851 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>