<p>Vadim Yanitskiy has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/11246">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">layer23/common: introduce L23SAP API for L1CTL<br><br>Having a separate abstraction layer between both L1CTL interface<br>and the upper layers would allow to keep the L1CTL implementation<br>clean from GSMTAP / LAPDm / measurement specific stuff.<br><br>Change-Id: I22d7932ddc03c692f2616726ced53b6e8eef822d<br>---<br>M src/host/layer23/include/osmocom/bb/common/Makefile.am<br>A src/host/layer23/include/osmocom/bb/common/l23sap.h<br>M src/host/layer23/include/osmocom/bb/common/logging.h<br>M src/host/layer23/src/common/Makefile.am<br>M src/host/layer23/src/common/l1ctl.c<br>A src/host/layer23/src/common/l23sap.c<br>M src/host/layer23/src/common/logging.c<br>7 files changed, 134 insertions(+), 51 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/46/11246/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/host/layer23/include/osmocom/bb/common/Makefile.am b/src/host/layer23/include/osmocom/bb/common/Makefile.am</span><br><span>index cd3437e..5a137df 100644</span><br><span>--- a/src/host/layer23/include/osmocom/bb/common/Makefile.am</span><br><span>+++ b/src/host/layer23/include/osmocom/bb/common/Makefile.am</span><br><span>@@ -1,2 +1,2 @@</span><br><span> noinst_HEADERS = l1ctl.h l1l2_interface.h l23_app.h logging.h \</span><br><span style="color: hsl(0, 100%, 40%);">-           networks.h gps.h sysinfo.h osmocom_data.h utils.h</span><br><span style="color: hsl(120, 100%, 40%);">+             networks.h gps.h sysinfo.h osmocom_data.h utils.h l23sap.h</span><br><span>diff --git a/src/host/layer23/include/osmocom/bb/common/l23sap.h b/src/host/layer23/include/osmocom/bb/common/l23sap.h</span><br><span>new file mode 100644</span><br><span>index 0000000..814fb7d</span><br><span>--- /dev/null</span><br><span>+++ b/src/host/layer23/include/osmocom/bb/common/l23sap.h</span><br><span>@@ -0,0 +1,15 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#pragma once</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/msgb.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bb/common/osmocom_data.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Logical channel link ID */</span><br><span style="color: hsl(120, 100%, 40%);">+#define LID_SACCH 0x40</span><br><span style="color: hsl(120, 100%, 40%);">+#define LID_DEDIC 0x00</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define CHAN_IS_SACCH(link_id) \</span><br><span style="color: hsl(120, 100%, 40%);">+     ((link_id & 0xc0) == LID_SACCH)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int l23sap_data_ind(struct osmocom_ms *ms, struct msgb *msg);</span><br><span style="color: hsl(120, 100%, 40%);">+int l23sap_data_conf(struct osmocom_ms *ms, struct msgb *msg);</span><br><span style="color: hsl(120, 100%, 40%);">+int l23sap_rach_conf(struct osmocom_ms *ms, struct msgb *msg);</span><br><span>diff --git a/src/host/layer23/include/osmocom/bb/common/logging.h b/src/host/layer23/include/osmocom/bb/common/logging.h</span><br><span>index bf6e6aa..10b2f7f 100644</span><br><span>--- a/src/host/layer23/include/osmocom/bb/common/logging.h</span><br><span>+++ b/src/host/layer23/include/osmocom/bb/common/logging.h</span><br><span>@@ -25,6 +25,7 @@</span><br><span>        DMOB,</span><br><span>        DPRIM,</span><br><span>       DLUA,</span><br><span style="color: hsl(120, 100%, 40%);">+ DL23SAP,</span><br><span> };</span><br><span> </span><br><span> extern const struct log_info log_info;</span><br><span>diff --git a/src/host/layer23/src/common/Makefile.am b/src/host/layer23/src/common/Makefile.am</span><br><span>index b76094c..e1b7b44 100644</span><br><span>--- a/src/host/layer23/src/common/Makefile.am</span><br><span>+++ b/src/host/layer23/src/common/Makefile.am</span><br><span>@@ -3,4 +3,4 @@</span><br><span> </span><br><span> noinst_LIBRARIES = liblayer23.a</span><br><span> liblayer23_a_SOURCES = l1ctl.c l1l2_interface.c sap_interface.c \</span><br><span style="color: hsl(0, 100%, 40%);">-     logging.c networks.c sim.c sysinfo.c gps.c l1ctl_lapdm_glue.c utils.c</span><br><span style="color: hsl(120, 100%, 40%);">+ logging.c networks.c sim.c sysinfo.c gps.c l1ctl_lapdm_glue.c utils.c l23sap.c</span><br><span>diff --git a/src/host/layer23/src/common/l1ctl.c b/src/host/layer23/src/common/l1ctl.c</span><br><span>index 6f4a6d8..8a45ebe 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>@@ -43,9 +43,9 @@</span><br><span> #include <osmocom/gsm/rsl.h></span><br><span> </span><br><span> #include <osmocom/bb/common/l1ctl.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bb/common/l23sap.h></span><br><span> #include <osmocom/bb/common/osmocom_data.h></span><br><span> #include <osmocom/bb/common/l1l2_interface.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/lapdm.h></span><br><span> #include <osmocom/bb/common/logging.h></span><br><span> </span><br><span> extern struct gsmtap_inst *gsmtap_inst;</span><br><span>@@ -117,34 +117,21 @@</span><br><span> </span><br><span> static int rx_l1_rach_conf(struct osmocom_ms *ms, struct msgb *msg)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- struct lapdm_entity *le = &ms->lapdm_channel.lapdm_dcch;</span><br><span style="color: hsl(0, 100%, 40%);">- struct osmo_phsap_prim pp;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct l1ctl_info_dl *dl;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (msgb_l1len(msg) < sizeof(*dl)) {</span><br><span style="color: hsl(120, 100%, 40%);">+       if (msgb_l1len(msg) < sizeof(struct l1ctl_info_dl)) {</span><br><span>             LOGP(DL1C, LOGL_ERROR, "RACH CONF MSG too short "</span><br><span>                  "(len=%u), missing DL info header\n", msgb_l1len(msg));</span><br><span>            msgb_free(msg);</span><br><span>              return -1;</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   dl = (struct l1ctl_info_dl *) msg->l1h;</span><br><span style="color: hsl(0, 100%, 40%);">-      msg->l2h = msg->l3h = dl->payload;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_prim_init(&pp.oph, SAP_GSM_PH, PRIM_PH_RACH,</span><br><span style="color: hsl(0, 100%, 40%);">-                   PRIM_OP_CONFIRM, msg);</span><br><span style="color: hsl(0, 100%, 40%);">-  pp.u.rach_ind.fn = ntohl(dl->frame_nr);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      return lapdm_phsap_up(&pp.oph, le);</span><br><span style="color: hsl(120, 100%, 40%);">+       return l23sap_rach_conf(ms, msg);</span><br><span> }</span><br><span> </span><br><span> /* Receive L1CTL_DATA_IND (Data Indication from L1) */</span><br><span style="color: hsl(0, 100%, 40%);">-static int rx_ph_data_ind(struct osmocom_ms *ms, struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+static int rx_data_ind(struct osmocom_ms *ms, struct msgb *msg)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    struct osmo_phsap_prim pp;</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 lapdm_entity *le;</span><br><span>     struct rx_meas_stat *meas = &ms->meas;</span><br><span>        uint8_t chan_type, chan_ts, chan_ss;</span><br><span>         uint8_t gsmtap_chan_type;</span><br><span>@@ -238,46 +225,22 @@</span><br><span>                gsmtap_chan_type, chan_ss, tm.fn, dl->rx_level-110,</span><br><span>               dl->snr, ccch->data, sizeof(ccch->data));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      /* determine LAPDm entity based on SACCH or not */</span><br><span style="color: hsl(0, 100%, 40%);">-      if (dl->link_id & 0x40)</span><br><span style="color: hsl(0, 100%, 40%);">-          le = &ms->lapdm_channel.lapdm_acch;</span><br><span style="color: hsl(0, 100%, 40%);">-      else</span><br><span style="color: hsl(0, 100%, 40%);">-            le = &ms->lapdm_channel.lapdm_dcch;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      osmo_prim_init(&pp.oph, SAP_GSM_PH, PRIM_PH_DATA,</span><br><span style="color: hsl(0, 100%, 40%);">-                   PRIM_OP_INDICATION, msg);</span><br><span style="color: hsl(0, 100%, 40%);">-       pp.u.data.chan_nr = dl->chan_nr;</span><br><span style="color: hsl(0, 100%, 40%);">-     pp.u.data.link_id = dl->link_id;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* send it up into LAPDm */</span><br><span style="color: hsl(0, 100%, 40%);">-     return lapdm_phsap_up(&pp.oph, le);</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Send it up towards LAPDm via L23SAP */</span><br><span style="color: hsl(120, 100%, 40%);">+     return l23sap_data_ind(ms, msg);</span><br><span> }</span><br><span> </span><br><span> /* Receive L1CTL_DATA_CONF (Data Confirm from L1) */</span><br><span style="color: hsl(0, 100%, 40%);">-static int rx_ph_data_conf(struct osmocom_ms *ms, struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+static int rx_data_conf(struct osmocom_ms *ms, struct msgb *msg)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct osmo_phsap_prim pp;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct l1ctl_info_dl *dl = (struct l1ctl_info_dl *) msg->l1h;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct lapdm_entity *le;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (msgb_l1len(msg) < sizeof(*dl)) {</span><br><span style="color: hsl(120, 100%, 40%);">+       if (msgb_l1len(msg) < sizeof(struct l1ctl_info_dl)) {</span><br><span>             LOGP(DL1C, LOGL_ERROR, "DATA CONF MSG too short (len=%u), "</span><br><span>                        "missing UL info header\n", msgb_l1len(msg));</span><br><span>              msgb_free(msg);</span><br><span>              return -1;</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   osmo_prim_init(&pp.oph, SAP_GSM_PH, PRIM_PH_RTS,</span><br><span style="color: hsl(0, 100%, 40%);">-                    PRIM_OP_INDICATION, msg);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* determine LAPDm entity based on SACCH or not */</span><br><span style="color: hsl(0, 100%, 40%);">-      if (dl->link_id & 0x40)</span><br><span style="color: hsl(0, 100%, 40%);">-          le = &ms->lapdm_channel.lapdm_acch;</span><br><span style="color: hsl(0, 100%, 40%);">-      else</span><br><span style="color: hsl(0, 100%, 40%);">-            le = &ms->lapdm_channel.lapdm_dcch;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* send it up into LAPDm */</span><br><span style="color: hsl(0, 100%, 40%);">-     return lapdm_phsap_up(&pp.oph, le);</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Send it up towards LAPDm via L23SAP */</span><br><span style="color: hsl(120, 100%, 40%);">+     return l23sap_data_conf(ms, msg);</span><br><span> }</span><br><span> </span><br><span> /* Transmit L1CTL_DATA_REQ */</span><br><span>@@ -919,10 +882,10 @@</span><br><span>          msgb_free(msg);</span><br><span>              break;</span><br><span>       case L1CTL_DATA_IND:</span><br><span style="color: hsl(0, 100%, 40%);">-            rc = rx_ph_data_ind(ms, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+         rc = rx_data_ind(ms, msg);</span><br><span>           break;</span><br><span>       case L1CTL_DATA_CONF:</span><br><span style="color: hsl(0, 100%, 40%);">-           rc = rx_ph_data_conf(ms, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+                rc = rx_data_conf(ms, msg);</span><br><span>          break;</span><br><span>       case L1CTL_RESET_IND:</span><br><span>        case L1CTL_RESET_CONF:</span><br><span>diff --git a/src/host/layer23/src/common/l23sap.c b/src/host/layer23/src/common/l23sap.c</span><br><span>new file mode 100644</span><br><span>index 0000000..b07265a</span><br><span>--- /dev/null</span><br><span>+++ b/src/host/layer23/src/common/l23sap.c</span><br><span>@@ -0,0 +1,98 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * L23SAP (L2&3 Service Access Point), an interface between</span><br><span style="color: hsl(120, 100%, 40%);">+ * L1 implementation and the upper layers (i.e. L2&3).</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2011 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2018 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU General Public License along</span><br><span style="color: hsl(120, 100%, 40%);">+ * with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span style="color: hsl(120, 100%, 40%);">+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</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%);">+#include <errno.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <arpa/inet.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <l1ctl_proto.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/prim.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/msgb.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/lapdm.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bb/common/osmocom_data.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bb/common/logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bb/common/l23sap.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int l23sap_data_ind(struct osmocom_ms *ms, struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct l1ctl_info_dl *dl = (struct l1ctl_info_dl *) msg->l1h;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct osmo_phsap_prim pp;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct lapdm_entity *le;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Init a new DATA IND primitive */</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_prim_init(&pp.oph, SAP_GSM_PH, PRIM_PH_DATA,</span><br><span style="color: hsl(120, 100%, 40%);">+         PRIM_OP_INDICATION, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+     pp.u.data.chan_nr = dl->chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+   pp.u.data.link_id = dl->link_id;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Determine LAPDm entity based on SACCH or not */</span><br><span style="color: hsl(120, 100%, 40%);">+    if (CHAN_IS_SACCH(dl->link_id))</span><br><span style="color: hsl(120, 100%, 40%);">+            le = &ms->lapdm_channel.lapdm_acch;</span><br><span style="color: hsl(120, 100%, 40%);">+    else</span><br><span style="color: hsl(120, 100%, 40%);">+          le = &ms->lapdm_channel.lapdm_dcch;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Send it up into LAPDm */</span><br><span style="color: hsl(120, 100%, 40%);">+   return lapdm_phsap_up(&pp.oph, le);</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%);">+int l23sap_data_conf(struct osmocom_ms *ms, struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct l1ctl_info_dl *dl = (struct l1ctl_info_dl *) msg->l1h;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct osmo_phsap_prim pp;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct lapdm_entity *le;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    osmo_prim_init(&pp.oph, SAP_GSM_PH, PRIM_PH_RTS,</span><br><span style="color: hsl(120, 100%, 40%);">+          PRIM_OP_INDICATION, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Determine LAPDm entity based on SACCH or not */</span><br><span style="color: hsl(120, 100%, 40%);">+    if (CHAN_IS_SACCH(dl->link_id))</span><br><span style="color: hsl(120, 100%, 40%);">+            le = &ms->lapdm_channel.lapdm_acch;</span><br><span style="color: hsl(120, 100%, 40%);">+    else</span><br><span style="color: hsl(120, 100%, 40%);">+          le = &ms->lapdm_channel.lapdm_dcch;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Send it up into LAPDm */</span><br><span style="color: hsl(120, 100%, 40%);">+   return lapdm_phsap_up(&pp.oph, le);</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%);">+int l23sap_rach_conf(struct osmocom_ms *ms, struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct l1ctl_info_dl *dl = (struct l1ctl_info_dl *) msg->l1h;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct osmo_phsap_prim pp;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_prim_init(&pp.oph, SAP_GSM_PH, PRIM_PH_RACH,</span><br><span style="color: hsl(120, 100%, 40%);">+         PRIM_OP_CONFIRM, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+        pp.u.rach_ind.fn = ntohl(dl->frame_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* TODO: do we really need this? */</span><br><span style="color: hsl(120, 100%, 40%);">+   msg->l2h = msg->l3h = dl->payload;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Send it up into LAPDm */</span><br><span style="color: hsl(120, 100%, 40%);">+   return lapdm_phsap_up(&pp.oph,</span><br><span style="color: hsl(120, 100%, 40%);">+            &ms->lapdm_channel.lapdm_dcch);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/host/layer23/src/common/logging.c b/src/host/layer23/src/common/logging.c</span><br><span>index ed79991..2f43fff 100644</span><br><span>--- a/src/host/layer23/src/common/logging.c</span><br><span>+++ b/src/host/layer23/src/common/logging.c</span><br><span>@@ -145,6 +145,12 @@</span><br><span>            .color = "\033[1;32m",</span><br><span>             .enabled = 1, .loglevel = LOGL_DEBUG,</span><br><span>        },</span><br><span style="color: hsl(120, 100%, 40%);">+    [DL23SAP] = {</span><br><span style="color: hsl(120, 100%, 40%);">+         .name = "DL23SAP",</span><br><span style="color: hsl(120, 100%, 40%);">+          .description = "L2&3 SAP (Service Access Point)",</span><br><span style="color: hsl(120, 100%, 40%);">+               .color = "\033[1;36m",</span><br><span style="color: hsl(120, 100%, 40%);">+              .enabled = 1, .loglevel = LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span> };</span><br><span> </span><br><span> const struct log_info log_info = {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/11246">change 11246</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/11246"/><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: I22d7932ddc03c692f2616726ced53b6e8eef822d </div>
<div style="display:none"> Gerrit-Change-Number: 11246 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Vadim Yanitskiy <axilirator@gmail.com> </div>