<p>Vadim Yanitskiy has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/11251">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">layer23/common: move signal loss criteria to L23SAP<br><br>Change-Id: Ib70bf9104cf3b5489413dd90819fd4955ec16f95<br>---<br>M src/host/layer23/src/common/l1ctl.c<br>M src/host/layer23/src/common/l23sap.c<br>2 files changed, 83 insertions(+), 67 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/51/11251/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/host/layer23/src/common/l1ctl.c b/src/host/layer23/src/common/l1ctl.c</span><br><span>index 4346da9..a08fac2 100644</span><br><span>--- a/src/host/layer23/src/common/l1ctl.c</span><br><span>+++ b/src/host/layer23/src/common/l1ctl.c</span><br><span>@@ -122,8 +122,6 @@</span><br><span> {</span><br><span>      struct l1ctl_info_dl *dl;</span><br><span>    struct l1ctl_data_ind *ccch;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct rx_meas_stat *meas = &ms->meas;</span><br><span style="color: hsl(0, 100%, 40%);">-   uint8_t chan_type, chan_ts, chan_ss;</span><br><span>         struct gsm_time tm;</span><br><span> </span><br><span>      if (msgb_l1len(msg) < sizeof(*dl)) {</span><br><span>@@ -138,76 +136,11 @@</span><br><span>      ccch = (struct l1ctl_data_ind *) msg->l2h;</span><br><span> </span><br><span>    gsm_fn2gsmtime(&tm, ntohl(dl->frame_nr));</span><br><span style="color: hsl(0, 100%, 40%);">-        rsl_dec_chan_nr(dl->chan_nr, &chan_type, &chan_ss, &chan_ts);</span><br><span>         DEBUGP(DL1C, "%s (%.4u/%.2u/%.2u) %d dBm: %s\n",</span><br><span>           rsl_chan_nr_str(dl->chan_nr), tm.t1, tm.t2, tm.t3,</span><br><span>                (int)dl->rx_level-110,</span><br><span>            osmo_hexdump(ccch->data, sizeof(ccch->data)));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        meas->last_fn = ntohl(dl->frame_nr);</span><br><span style="color: hsl(0, 100%, 40%);">-      meas->frames++;</span><br><span style="color: hsl(0, 100%, 40%);">-      meas->snr += dl->snr;</span><br><span style="color: hsl(0, 100%, 40%);">-     meas->berr += dl->num_biterr;</span><br><span style="color: hsl(0, 100%, 40%);">-     meas->rxlev += dl->rx_level;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* counting loss criteria */</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!(dl->link_id & 0x40)) {</span><br><span style="color: hsl(0, 100%, 40%);">-             switch (chan_type) {</span><br><span style="color: hsl(0, 100%, 40%);">-            case RSL_CHAN_PCH_AGCH:</span><br><span style="color: hsl(0, 100%, 40%);">-                 /* only look at one CCCH frame in each 51 multiframe.</span><br><span style="color: hsl(0, 100%, 40%);">-                    * FIXME: implement DRX</span><br><span style="color: hsl(0, 100%, 40%);">-                  * - select correct paging block that is for us.</span><br><span style="color: hsl(0, 100%, 40%);">-                         * - initialize ds_fail according to BS_PA_MFRMS.</span><br><span style="color: hsl(0, 100%, 40%);">-                        */</span><br><span style="color: hsl(0, 100%, 40%);">-                     if ((dl->frame_nr % 51) != 6)</span><br><span style="color: hsl(0, 100%, 40%);">-                                break;</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (!meas->ds_fail)</span><br><span style="color: hsl(0, 100%, 40%);">-                          break;</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (dl->fire_crc >= 2)</span><br><span style="color: hsl(0, 100%, 40%);">-                            meas->dsc -= 4;</span><br><span style="color: hsl(0, 100%, 40%);">-                      else</span><br><span style="color: hsl(0, 100%, 40%);">-                            meas->dsc += 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                      if (meas->dsc > meas->ds_fail)</span><br><span style="color: hsl(0, 100%, 40%);">-                         meas->dsc = meas->ds_fail;</span><br><span style="color: hsl(0, 100%, 40%);">-                        if (meas->dsc < meas->ds_fail)</span><br><span style="color: hsl(0, 100%, 40%);">-                         LOGP(DL1C, LOGL_INFO, "LOSS counter for CCCH %d\n", meas->dsc);</span><br><span style="color: hsl(0, 100%, 40%);">-                    if (meas->dsc > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                                break;</span><br><span style="color: hsl(0, 100%, 40%);">-                  meas->ds_fail = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                   osmo_signal_dispatch(SS_L1CTL, S_L1CTL_LOSS_IND, ms);</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%);">-       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                switch (chan_type) {</span><br><span style="color: hsl(0, 100%, 40%);">-            case RSL_CHAN_Bm_ACCHs:</span><br><span style="color: hsl(0, 100%, 40%);">-         case RSL_CHAN_Lm_ACCHs:</span><br><span style="color: hsl(0, 100%, 40%);">-         case RSL_CHAN_SDCCH4_ACCH:</span><br><span style="color: hsl(0, 100%, 40%);">-              case RSL_CHAN_SDCCH8_ACCH:</span><br><span style="color: hsl(0, 100%, 40%);">-                      if (!meas->rl_fail)</span><br><span style="color: hsl(0, 100%, 40%);">-                          break;</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (dl->fire_crc >= 2)</span><br><span style="color: hsl(0, 100%, 40%);">-                            meas->s -= 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                        else</span><br><span style="color: hsl(0, 100%, 40%);">-                            meas->s += 2;</span><br><span style="color: hsl(0, 100%, 40%);">-                        if (meas->s > meas->rl_fail)</span><br><span style="color: hsl(0, 100%, 40%);">-                           meas->s = meas->rl_fail;</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (meas->s < meas->rl_fail)</span><br><span style="color: hsl(0, 100%, 40%);">-                           LOGP(DL1C, LOGL_NOTICE, "LOSS counter for ACCH %d\n", meas->s);</span><br><span style="color: hsl(0, 100%, 40%);">-                    if (meas->s > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                          break;</span><br><span style="color: hsl(0, 100%, 40%);">-                  meas->rl_fail = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                   osmo_signal_dispatch(SS_L1CTL, S_L1CTL_LOSS_IND, ms);</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%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (dl->fire_crc >= 2) {</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGP(DL1C, LOGL_NOTICE, "Dropping frame with %u bit errors\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                        dl->num_biterr);</span><br><span style="color: hsl(0, 100%, 40%);">-             msgb_free(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-         return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>    /* Send it up towards LAPDm via L23SAP */</span><br><span>    return l23sap_data_ind(ms, msg);</span><br><span> }</span><br><span>diff --git a/src/host/layer23/src/common/l23sap.c b/src/host/layer23/src/common/l23sap.c</span><br><span>index a34f515..fbdc75c 100644</span><br><span>--- a/src/host/layer23/src/common/l23sap.c</span><br><span>+++ b/src/host/layer23/src/common/l23sap.c</span><br><span>@@ -2,6 +2,7 @@</span><br><span>  * L23SAP (L2&3 Service Access Point), an interface between</span><br><span>  * L1 implementation and the upper layers (i.e. L2&3).</span><br><span>  *</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2010 by Andreas Eversberg <jolly@eversberg.eu></span><br><span>  * (C) 2011 by Harald Welte <laforge@gnumonks.org></span><br><span>  * (C) 2018 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span>  *</span><br><span>@@ -34,6 +35,7 @@</span><br><span> #include <osmocom/core/logging.h></span><br><span> #include <osmocom/core/gsmtap_util.h></span><br><span> #include <osmocom/core/gsmtap.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/signal.h></span><br><span> #include <osmocom/core/prim.h></span><br><span> #include <osmocom/core/msgb.h></span><br><span> </span><br><span>@@ -47,6 +49,81 @@</span><br><span> </span><br><span> extern struct gsmtap_inst *gsmtap_inst;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int l23sap_check_dl_loss(struct osmocom_ms *ms,</span><br><span style="color: hsl(120, 100%, 40%);">+ struct l1ctl_info_dl *dl)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct rx_meas_stat *meas = &ms->meas;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t chan_type, chan_ts, chan_ss;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Update measurements */</span><br><span style="color: hsl(120, 100%, 40%);">+     meas->last_fn = ntohl(dl->frame_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+    meas->frames++;</span><br><span style="color: hsl(120, 100%, 40%);">+    meas->snr += dl->snr;</span><br><span style="color: hsl(120, 100%, 40%);">+   meas->berr += dl->num_biterr;</span><br><span style="color: hsl(120, 100%, 40%);">+   meas->rxlev += dl->rx_level;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  rsl_dec_chan_nr(dl->chan_nr, &chan_type, &chan_ss, &chan_ts);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* counting loss criteria */</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!(dl->link_id & 0x40)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           switch (chan_type) {</span><br><span style="color: hsl(120, 100%, 40%);">+          case RSL_CHAN_PCH_AGCH:</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* only look at one CCCH frame in each 51 multiframe.</span><br><span style="color: hsl(120, 100%, 40%);">+                  * FIXME: implement DRX</span><br><span style="color: hsl(120, 100%, 40%);">+                        * - select correct paging block that is for us.</span><br><span style="color: hsl(120, 100%, 40%);">+                       * - initialize ds_fail according to BS_PA_MFRMS.</span><br><span style="color: hsl(120, 100%, 40%);">+                      */</span><br><span style="color: hsl(120, 100%, 40%);">+                   if ((dl->frame_nr % 51) != 6)</span><br><span style="color: hsl(120, 100%, 40%);">+                              break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (!meas->ds_fail)</span><br><span style="color: hsl(120, 100%, 40%);">+                                break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (dl->fire_crc >= 2)</span><br><span style="color: hsl(120, 100%, 40%);">+                          meas->dsc -= 4;</span><br><span style="color: hsl(120, 100%, 40%);">+                    else</span><br><span style="color: hsl(120, 100%, 40%);">+                          meas->dsc += 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (meas->dsc > meas->ds_fail)</span><br><span style="color: hsl(120, 100%, 40%);">+                               meas->dsc = meas->ds_fail;</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (meas->dsc < meas->ds_fail)</span><br><span style="color: hsl(120, 100%, 40%);">+                               LOGP(DL23SAP, LOGL_INFO, "LOSS counter for CCCH %d\n", meas->dsc);</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (meas->dsc > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                              break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        meas->ds_fail = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                 osmo_signal_dispatch(SS_L1CTL, S_L1CTL_LOSS_IND, ms);</span><br><span style="color: hsl(120, 100%, 40%);">+                 break;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              switch (chan_type) {</span><br><span style="color: hsl(120, 100%, 40%);">+          case RSL_CHAN_Bm_ACCHs:</span><br><span style="color: hsl(120, 100%, 40%);">+               case RSL_CHAN_Lm_ACCHs:</span><br><span style="color: hsl(120, 100%, 40%);">+               case RSL_CHAN_SDCCH4_ACCH:</span><br><span style="color: hsl(120, 100%, 40%);">+            case RSL_CHAN_SDCCH8_ACCH:</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!meas->rl_fail)</span><br><span style="color: hsl(120, 100%, 40%);">+                                break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (dl->fire_crc >= 2)</span><br><span style="color: hsl(120, 100%, 40%);">+                          meas->s -= 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                      else</span><br><span style="color: hsl(120, 100%, 40%);">+                          meas->s += 2;</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (meas->s > meas->rl_fail)</span><br><span style="color: hsl(120, 100%, 40%);">+                         meas->s = meas->rl_fail;</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (meas->s < meas->rl_fail)</span><br><span style="color: hsl(120, 100%, 40%);">+                         LOGP(DL23SAP, LOGL_NOTICE, "LOSS counter for ACCH %d\n", meas->s);</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (meas->s > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                                break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        meas->rl_fail = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                 osmo_signal_dispatch(SS_L1CTL, S_L1CTL_LOSS_IND, ms);</span><br><span style="color: hsl(120, 100%, 40%);">+                 break;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (dl->fire_crc >= 2) {</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGP(DL23SAP, LOGL_NOTICE, "Dropping frame with %u bit "</span><br><span style="color: hsl(120, 100%, 40%);">+                    "errors\n", dl->num_biterr);</span><br><span style="color: hsl(120, 100%, 40%);">+             return -EBADMSG;</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%);">+   return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int l23sap_gsmtap_data_ind(struct osmocom_ms *ms, struct msgb *msg)</span><br><span> {</span><br><span>   struct l1ctl_info_dl *dl = (struct l1ctl_info_dl *) msg->l1h;</span><br><span>@@ -102,6 +179,12 @@</span><br><span>      struct osmo_phsap_prim pp;</span><br><span>   struct lapdm_entity *le;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  /* Check for decoding errors (path loss) */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (l23sap_check_dl_loss(ms, dl)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           msgb_free(msg);</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>  /* Init a new DATA IND primitive */</span><br><span>  osmo_prim_init(&pp.oph, SAP_GSM_PH, PRIM_PH_DATA,</span><br><span>                PRIM_OP_INDICATION, msg);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/11251">change 11251</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/11251"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmocom-bb </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Ib70bf9104cf3b5489413dd90819fd4955ec16f95 </div>
<div style="display:none"> Gerrit-Change-Number: 11251 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Vadim Yanitskiy <axilirator@gmail.com> </div>