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