<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/24550">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">WIP: Support OSMO IPA multiplex<br><br>Change-Id: I21beb4e5c101157cd0977fd9a607c2fe5350befe<br>---<br>M include/osmocom/bsc/Makefile.am<br>A include/osmocom/bsc/abis_osmo.h<br>M include/osmocom/bsc/bts.h<br>M include/osmocom/bsc/gsm_04_08_rr.h<br>M include/osmocom/bsc/gsm_data.h<br>M include/osmocom/bsc/pcuif_proto.h<br>M src/ipaccess/Makefile.am<br>M src/osmo-bsc/Makefile.am<br>A src/osmo-bsc/abis_osmo.c<br>M src/osmo-bsc/bsc_init.c<br>M src/osmo-bsc/bts.c<br>M src/osmo-bsc/bts_ipaccess_nanobts.c<br>M src/osmo-bsc/gsm_04_08_rr.c<br>M src/utils/Makefile.am<br>M tests/abis/Makefile.am<br>M tests/acc/Makefile.am<br>M tests/bsc/Makefile.am<br>M tests/gsm0408/Makefile.am<br>M tests/handover/Makefile.am<br>M tests/nanobts_omlattr/Makefile.am<br>20 files changed, 244 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/50/24550/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/Makefile.am b/include/osmocom/bsc/Makefile.am</span><br><span>index be27dae..5e866cc 100644</span><br><span>--- a/include/osmocom/bsc/Makefile.am</span><br><span>+++ b/include/osmocom/bsc/Makefile.am</span><br><span>@@ -2,6 +2,7 @@</span><br><span>        a_reset.h \</span><br><span>  abis_nm.h \</span><br><span>  abis_om2000.h \</span><br><span style="color: hsl(120, 100%, 40%);">+       abis_osmo.h \</span><br><span>        abis_rsl.h \</span><br><span>         acc.h \</span><br><span>      assignment_fsm.h \</span><br><span>diff --git a/include/osmocom/bsc/abis_osmo.h b/include/osmocom/bsc/abis_osmo.h</span><br><span>new file mode 100644</span><br><span>index 0000000..6083e1e</span><br><span>--- /dev/null</span><br><span>+++ b/include/osmocom/bsc/abis_osmo.h</span><br><span>@@ -0,0 +1,35 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* GSM Network Management messages on the A-bis interface</span><br><span style="color: hsl(120, 100%, 40%);">+ * 3GPP TS 12.21 version 8.0.0 Release 1999 / ETSI TS 100 623 V8.0.0 */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2008-2009 by Harald Welte <laforge@gnumonks.org></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 Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 3 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 Affero 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 Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.</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%);">+#pragma once</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/protocol/gsm_04_08.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_bts;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int abis_osmo_rcvmsg(struct msgb *msg);</span><br><span style="color: hsl(120, 100%, 40%);">+int abis_osmo_sendmsg(struct gsm_bts *bts, struct msgb *msg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int abis_osmo_pcu_measure_neighbours_req(struct gsm_bts *bts, const struct gsm48_cell_desc *cell_desc_li, unsigned int num_cells);</span><br><span>diff --git a/include/osmocom/bsc/bts.h b/include/osmocom/bsc/bts.h</span><br><span>index 7a491d9..545f92f 100644</span><br><span>--- a/include/osmocom/bsc/bts.h</span><br><span>+++ b/include/osmocom/bsc/bts.h</span><br><span>@@ -284,6 +284,8 @@</span><br><span> </span><br><span>        /* Connected PCU version (if any) */</span><br><span>         char pcu_version[MAX_VERSION_LENGTH];</span><br><span style="color: hsl(120, 100%, 40%);">+ /* PCU sign_link, over OML line: */</span><br><span style="color: hsl(120, 100%, 40%);">+   struct e1inp_sign_link *osmo_link;</span><br><span> </span><br><span>       /* maximum Tx power that the MS is permitted to use in this cell */</span><br><span>  int ms_max_power;</span><br><span>@@ -650,6 +652,9 @@</span><br><span> #define BTS_STORE_UPTIME_INTERVAL 10 /* in seconds */</span><br><span> void bts_store_uptime(struct gsm_bts *bts);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define ANR_REQUEST_INTERVAL 60 /* in seconds */</span><br><span style="color: hsl(120, 100%, 40%);">+int bts_anr_request(struct gsm_bts *bts, const struct gsm48_cell_desc *cell_desc_li, unsigned int num_cells);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> unsigned long long bts_uptime(const struct gsm_bts *bts);</span><br><span> </span><br><span> char *get_model_oml_status(const struct gsm_bts *bts);</span><br><span>diff --git a/include/osmocom/bsc/gsm_04_08_rr.h b/include/osmocom/bsc/gsm_04_08_rr.h</span><br><span>index 5ddee7f..ebba0f8 100644</span><br><span>--- a/include/osmocom/bsc/gsm_04_08_rr.h</span><br><span>+++ b/include/osmocom/bsc/gsm_04_08_rr.h</span><br><span>@@ -12,6 +12,7 @@</span><br><span> struct gsm_meas_rep;</span><br><span> struct gsm_network;</span><br><span> struct gsm_subscriber_connection;</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_bts;</span><br><span> </span><br><span> void gsm_net_update_ctype(struct gsm_network *network);</span><br><span> enum gsm_chan_t get_ctype_by_chreq(struct gsm_network *network, uint8_t ra);</span><br><span>@@ -43,6 +44,8 @@</span><br><span> struct msgb *gsm48_create_rr_status(uint8_t cause);</span><br><span> int gsm48_tx_rr_status(struct gsm_subscriber_connection *conn, uint8_t cause);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void gsm48_cell_desc(struct gsm48_cell_desc *cd, const struct gsm_bts *bts);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #define GSM48_ALLOC_SIZE        2048</span><br><span> #define GSM48_ALLOC_HEADROOM    256</span><br><span> </span><br><span>diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h</span><br><span>index 831463a..5ebcccb 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -1271,6 +1271,9 @@</span><br><span>      /* Timer to write each BTS's uptime counter state to the stats system. */</span><br><span>        struct osmo_timer_list bts_store_uptime_timer;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    /* Timer to submit Measure Neighbours Request from time to time. */</span><br><span style="color: hsl(120, 100%, 40%);">+   struct osmo_timer_list anr_request_timer;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  struct {</span><br><span>             struct mgcp_client_conf *conf;</span><br><span>               struct mgcp_client *client;</span><br><span>diff --git a/include/osmocom/bsc/pcuif_proto.h b/include/osmocom/bsc/pcuif_proto.h</span><br><span>index 8f72602..771eb9c 100644</span><br><span>--- a/include/osmocom/bsc/pcuif_proto.h</span><br><span>+++ b/include/osmocom/bsc/pcuif_proto.h</span><br><span>@@ -23,6 +23,8 @@</span><br><span> #define PCU_IF_MSG_TIME_IND 0x52    /* GSM time indication */</span><br><span> #define PCU_IF_MSG_PAG_REQ 0x60    /* paging request */</span><br><span> #define PCU_IF_MSG_TXT_IND      0x70    /* Text indication for BTS */</span><br><span style="color: hsl(120, 100%, 40%);">+/* msg_type coming from BSC */</span><br><span style="color: hsl(120, 100%, 40%);">+#define PCU_IF_MSG_ANR_REQ       0x80    /* Automatic Neighbor Registration Request */</span><br><span> </span><br><span> /* sapi */</span><br><span> #define PCU_IF_SAPI_RACH     0x01    /* channel request on CCCH */</span><br><span>@@ -208,6 +210,12 @@</span><br><span>         uint8_t         cause;</span><br><span> } __attribute__ ((packed));</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* BSC sends some message to PCU, potentially forwarded by BTS via IPA/PCU */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_pcu_if_anr_req {</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t         num_cells;</span><br><span style="color: hsl(120, 100%, 40%);">+    uint16_t        cell_list[80];  /* struct gsm48_cell_desc */</span><br><span style="color: hsl(120, 100%, 40%);">+} __attribute__ ((packed));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct gsm_pcu_if {</span><br><span>   /* context based information */</span><br><span>      uint8_t         msg_type;       /* message type */</span><br><span>@@ -228,6 +236,7 @@</span><br><span>             struct gsm_pcu_if_time_ind      time_ind;</span><br><span>            struct gsm_pcu_if_pag_req       pag_req;</span><br><span>             struct gsm_pcu_if_app_info_req  app_info_req;</span><br><span style="color: hsl(120, 100%, 40%);">+         struct gsm_pcu_if_anr_req       anr_req;</span><br><span>     } u;</span><br><span> } __attribute__ ((packed));</span><br><span> </span><br><span>diff --git a/src/ipaccess/Makefile.am b/src/ipaccess/Makefile.am</span><br><span>index e282c6f..351f618 100644</span><br><span>--- a/src/ipaccess/Makefile.am</span><br><span>+++ b/src/ipaccess/Makefile.am</span><br><span>@@ -50,6 +50,7 @@</span><br><span>     $(top_builddir)/src/osmo-bsc/bts_sm.o \</span><br><span>      $(top_builddir)/src/osmo-bsc/bts_trx.o \</span><br><span>     $(top_builddir)/src/osmo-bsc/abis_nm.o \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(top_builddir)/src/osmo-bsc/abis_osmo.o \</span><br><span>   $(top_builddir)/src/osmo-bsc/acc.o \</span><br><span>         $(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts.o \</span><br><span>        $(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \</span><br><span>@@ -74,6 +75,7 @@</span><br><span> </span><br><span> ipaccess_proxy_LDADD = \</span><br><span>    $(top_builddir)/src/osmo-bsc/abis_nm.o \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(top_builddir)/src/osmo-bsc/abis_osmo.o \</span><br><span>   $(top_builddir)/src/osmo-bsc/acc.o \</span><br><span>         $(top_builddir)/src/osmo-bsc/bts.o \</span><br><span>         $(top_builddir)/src/osmo-bsc/bts_sm.o \</span><br><span>diff --git a/src/osmo-bsc/Makefile.am b/src/osmo-bsc/Makefile.am</span><br><span>index f91c6bf..df4e0c3 100644</span><br><span>--- a/src/osmo-bsc/Makefile.am</span><br><span>+++ b/src/osmo-bsc/Makefile.am</span><br><span>@@ -31,6 +31,7 @@</span><br><span>     abis_nm_vty.c \</span><br><span>      abis_om2000.c \</span><br><span>      abis_om2000_vty.c \</span><br><span style="color: hsl(120, 100%, 40%);">+   abis_osmo.c \</span><br><span>        abis_rsl.c \</span><br><span>         acc.c \</span><br><span>      assignment_fsm.c \</span><br><span>diff --git a/src/osmo-bsc/abis_osmo.c b/src/osmo-bsc/abis_osmo.c</span><br><span>new file mode 100644</span><br><span>index 0000000..7745ac5</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo-bsc/abis_osmo.c</span><br><span>@@ -0,0 +1,119 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* Osmocom specific protocols over Abis (IPA) */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2021 sysmocom - s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * Author: Pau Espin Pedrol <pespin@sysmocom.de></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 Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 3 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 Affero 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 Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.</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 <osmocom/core/logging.h></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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/protocol/ipaccess.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/ipa.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/protocol/gsm_12_21.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/protocol/osmo_pcu.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/abis_osmo.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/debug.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/bts.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/pcuif_proto.h></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%);">+#define OM_ALLOC_SIZE          1024</span><br><span style="color: hsl(120, 100%, 40%);">+#define OM_HEADROOM_SIZE  128</span><br><span style="color: hsl(120, 100%, 40%);">+#define IPACC_SEGMENT_SIZE 245</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%);">+// OSMO ABIS extensions (PCU)</span><br><span style="color: hsl(120, 100%, 40%);">+///////////////////////////////////////</span><br><span style="color: hsl(120, 100%, 40%);">+static struct msgb *abis_osmo_pcu_msgb_alloc(uint8_t msg_type, uint8_t bts_nr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct msgb *msg;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gsm_pcu_if *pcu_prim;</span><br><span style="color: hsl(120, 100%, 40%);">+  msg = msgb_alloc_headroom(sizeof(struct gsm_pcu_if) + OM_HEADROOM_SIZE,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 OM_HEADROOM_SIZE, "IPA/ABIS/OSMO");</span><br><span style="color: hsl(120, 100%, 40%);">+       msgb_put(msg, sizeof(struct gsm_pcu_if));</span><br><span style="color: hsl(120, 100%, 40%);">+     pcu_prim = (struct gsm_pcu_if *) msg->data;</span><br><span style="color: hsl(120, 100%, 40%);">+        pcu_prim->msg_type = msg_type;</span><br><span style="color: hsl(120, 100%, 40%);">+     pcu_prim->bts_nr = bts_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+ return msg;</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%);">+/* Send a OML NM Message from BSC to BTS */</span><br><span style="color: hsl(120, 100%, 40%);">+static int abis_osmo_pcu_sendmsg(struct gsm_bts *bts, struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     ipa_prepend_header_ext(msg, IPAC_PROTO_EXT_PCU);</span><br><span style="color: hsl(120, 100%, 40%);">+      return abis_osmo_sendmsg(bts, msg);</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 abis_osmo_pcu_measure_neighbours_req(struct gsm_bts *bts, const struct gsm48_cell_desc *cell_desc_li, unsigned int num_cells)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct msgb *msg = abis_osmo_pcu_msgb_alloc(PCU_IF_MSG_ANR_REQ, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_pcu_if *pcu_prim = (struct gsm_pcu_if *) msgb_data(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_pcu_if_anr_req *anr_req = &pcu_prim->u.anr_req;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   anr_req->num_cells = num_cells;</span><br><span style="color: hsl(120, 100%, 40%);">+    if (num_cells)</span><br><span style="color: hsl(120, 100%, 40%);">+                memcpy(anr_req->cell_list, cell_desc_li, sizeof(*cell_desc_li) * num_cells);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     return abis_osmo_pcu_sendmsg(bts, msg);</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%);">+static int rcvmsg_pcu(struct msgb *msg)</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 style="color: hsl(120, 100%, 40%);">+////////////////////////////////////////</span><br><span style="color: hsl(120, 100%, 40%);">+// OSMO ABIS extensions (generic code)</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%);">+/* High-Level API */</span><br><span style="color: hsl(120, 100%, 40%);">+/* Entry-point where L2 OSMO from BTS enters the NM code */</span><br><span style="color: hsl(120, 100%, 40%);">+int abis_osmo_rcvmsg(struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t *osmo_type = msgb_l2(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+    msg->l2h = osmo_type + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        switch (*osmo_type) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case IPAC_PROTO_EXT_PCU:</span><br><span style="color: hsl(120, 100%, 40%);">+              rc = rcvmsg_pcu(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DNM, LOGL_ERROR, "IPAC_PROTO_EXT 0x%x not supported!\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                    *osmo_type);</span><br><span style="color: hsl(120, 100%, 40%);">+             rc = -EINVAL;</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%);">+   msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+       return rc;</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%);">+/* Send a OML NM Message from BSC to BTS */</span><br><span style="color: hsl(120, 100%, 40%);">+int abis_osmo_sendmsg(struct gsm_bts *bts, struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       msg->dst = bts->osmo_link;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    msg->l2h = msg->data;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return abis_sendmsg(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/osmo-bsc/bsc_init.c b/src/osmo-bsc/bsc_init.c</span><br><span>index 24596f4..55a507b 100644</span><br><span>--- a/src/osmo-bsc/bsc_init.c</span><br><span>+++ b/src/osmo-bsc/bsc_init.c</span><br><span>@@ -97,6 +97,32 @@</span><br><span>         osmo_timer_schedule(&net->bts_store_uptime_timer, BTS_STORE_UPTIME_INTERVAL, 0);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void bsc_anr_request(void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm_network *net = data;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm48_cell_desc cell_desc[256];</span><br><span style="color: hsl(120, 100%, 40%);">+        unsigned int num_cells = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Build list of ARFCN+BSIC: */</span><br><span style="color: hsl(120, 100%, 40%);">+       llist_for_each_entry(bts, &net->bts_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (num_cells == ARRAY_SIZE(cell_desc)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     LOGP(DNM, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                     "ANR Req: Unable to build list larger than %zu elements",</span><br><span style="color: hsl(120, 100%, 40%);">+                           ARRAY_SIZE(cell_desc));</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%);">+             gsm48_cell_desc(&cell_desc[num_cells], bts);</span><br><span style="color: hsl(120, 100%, 40%);">+              num_cells++;</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%);">+   llist_for_each_entry(bts, &net->bts_list, list)</span><br><span style="color: hsl(120, 100%, 40%);">+                bts_anr_request(bts, cell_desc, num_cells);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Keep this timer ticking. */</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_timer_schedule(&net->anr_request_timer, ANR_REQUEST_INTERVAL, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static struct gsm_network *bsc_network_init(void *ctx)</span><br><span> {</span><br><span>    struct gsm_network *net = gsm_network_init(ctx);</span><br><span>@@ -144,6 +170,10 @@</span><br><span>      osmo_timer_setup(&net->bts_store_uptime_timer, bsc_store_bts_uptime, net);</span><br><span>    osmo_timer_schedule(&net->bts_store_uptime_timer, BTS_STORE_UPTIME_INTERVAL, 0);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   /* Init uptime tracking timer. */</span><br><span style="color: hsl(120, 100%, 40%);">+     osmo_timer_setup(&net->anr_request_timer, bsc_anr_request, net);</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_timer_schedule(&net->anr_request_timer, ANR_REQUEST_INTERVAL, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      net->cbc->net = net;</span><br><span>   net->cbc->mode = BSC_CBC_LINK_MODE_DISABLED;</span><br><span>   net->cbc->server.local_addr = bsc_cbc_default_server_local_addr;</span><br><span>diff --git a/src/osmo-bsc/bts.c b/src/osmo-bsc/bts.c</span><br><span>index 857ddd2..87cfb9a 100644</span><br><span>--- a/src/osmo-bsc/bts.c</span><br><span>+++ b/src/osmo-bsc/bts.c</span><br><span>@@ -24,6 +24,7 @@</span><br><span> #include <osmocom/bsc/bts.h></span><br><span> #include <osmocom/bsc/debug.h></span><br><span> #include <osmocom/bsc/nm_common_fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/abis_osmo.h></span><br><span> </span><br><span> const struct value_string bts_attribute_names[] = {</span><br><span>   OSMO_VALUE_STRING(BTS_TYPE_VARIANT),</span><br><span>@@ -579,6 +580,20 @@</span><br><span>  return difftime(tp.tv_sec, bts->uptime);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int bts_anr_request(struct gsm_bts *bts, const struct gsm48_cell_desc *cell_desc_li, unsigned int num_cells)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!bts->osmo_link) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP(DNM, LOGL_INFO, "BTS%u: ANR Req: OSMO link is down\n", bts->nr);</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%);">+     if (!osmo_bts_has_feature(&bts->features, BTS_FEAT_ABIS_OSMO_PCU)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DNM, LOGL_INFO, "BTS%u: ANR Req: Abis OSMO_PCU proto not supported\n", bts->nr);</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%);">+     LOGP(DNM, LOGL_INFO, "BTS%u: ANR Req (%u cells)\n", bts->nr, num_cells);</span><br><span style="color: hsl(120, 100%, 40%);">+ return abis_osmo_pcu_measure_neighbours_req(bts, cell_desc_li, num_cells);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> char *get_model_oml_status(const struct gsm_bts *bts)</span><br><span> {</span><br><span>        if (bts->model->oml_status)</span><br><span>diff --git a/src/osmo-bsc/bts_ipaccess_nanobts.c b/src/osmo-bsc/bts_ipaccess_nanobts.c</span><br><span>index 1e3e9c1..db91b01 100644</span><br><span>--- a/src/osmo-bsc/bts_ipaccess_nanobts.c</span><br><span>+++ b/src/osmo-bsc/bts_ipaccess_nanobts.c</span><br><span>@@ -37,6 +37,7 @@</span><br><span> #include <osmocom/bsc/gsm_data.h></span><br><span> #include <osmocom/bsc/abis_nm.h></span><br><span> #include <osmocom/bsc/abis_rsl.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/abis_osmo.h></span><br><span> #include <osmocom/bsc/debug.h></span><br><span> #include <osmocom/abis/subchan_demux.h></span><br><span> #include <osmocom/gsm/ipa.h></span><br><span>@@ -557,6 +558,10 @@</span><br><span>       bts->uptime = 0;</span><br><span>  osmo_stat_item_dec(bts->bts_statg->items[BTS_STAT_OML_CONNECTED], 1);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+       /* Also drop the associated OSMO link */</span><br><span style="color: hsl(120, 100%, 40%);">+      e1inp_sign_link_destroy(bts->osmo_link);</span><br><span style="color: hsl(120, 100%, 40%);">+   bts->osmo_link = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* we have issues reconnecting RSL, drop everything. */</span><br><span>      llist_for_each_entry(trx, &bts->trx_list, list) {</span><br><span>             ipaccess_drop_rsl(trx, "OML link drop");</span><br><span>@@ -713,6 +718,10 @@</span><br><span>                    sign_link->trx->bts->ip_access.flags |= OML_UP;</span><br><span>             }</span><br><span>            osmo_stat_item_inc(bts->bts_statg->items[BTS_STAT_OML_CONNECTED], 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         /* Create link for E1INP_SIGN_OSMO */</span><br><span style="color: hsl(120, 100%, 40%);">+         //SAPI must be 0, no IPAC_PROTO_EXT_PCU, see ipaccess_bts_read_cb</span><br><span style="color: hsl(120, 100%, 40%);">+             bts->osmo_link = e1inp_sign_link_create(sign_ts, E1INP_SIGN_OSMO, bts->c0, IPAC_PROTO_OSMO, 0);</span><br><span>                break;</span><br><span>       case E1INP_SIGN_RSL: {</span><br><span>               struct e1inp_ts *ts;</span><br><span>@@ -785,6 +794,9 @@</span><br><span>   case E1INP_SIGN_OML:</span><br><span>                 ret = abis_nm_rcvmsg(msg);</span><br><span>           break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case E1INP_SIGN_OSMO:</span><br><span style="color: hsl(120, 100%, 40%);">+         ret = abis_osmo_rcvmsg(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</span><br><span>       default:</span><br><span>             LOGP(DLINP, LOGL_ERROR, "Unknown signal link type %d\n",</span><br><span>                   link->type);</span><br><span>diff --git a/src/osmo-bsc/gsm_04_08_rr.c b/src/osmo-bsc/gsm_04_08_rr.c</span><br><span>index 058a107..be1eadc 100644</span><br><span>--- a/src/osmo-bsc/gsm_04_08_rr.c</span><br><span>+++ b/src/osmo-bsc/gsm_04_08_rr.c</span><br><span>@@ -387,7 +387,7 @@</span><br><span>       return rsl_encryption_cmd(msg);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void gsm48_cell_desc(struct gsm48_cell_desc *cd,</span><br><span style="color: hsl(120, 100%, 40%);">+void gsm48_cell_desc(struct gsm48_cell_desc *cd,</span><br><span>                        const struct gsm_bts *bts)</span><br><span> {</span><br><span>  cd->ncc = (bts->bsic >> 3 & 0x7);</span><br><span>diff --git a/src/utils/Makefile.am b/src/utils/Makefile.am</span><br><span>index c180390..39d2417 100644</span><br><span>--- a/src/utils/Makefile.am</span><br><span>+++ b/src/utils/Makefile.am</span><br><span>@@ -48,6 +48,7 @@</span><br><span> </span><br><span> bs11_config_LDADD = \</span><br><span>  $(top_builddir)/src/osmo-bsc/abis_nm.o \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(top_builddir)/src/osmo-bsc/abis_osmo.o \</span><br><span>   $(top_builddir)/src/osmo-bsc/acc.o \</span><br><span>         $(top_builddir)/src/osmo-bsc/bts.o \</span><br><span>         $(top_builddir)/src/osmo-bsc/bts_sm.o \</span><br><span>@@ -132,6 +133,7 @@</span><br><span> </span><br><span> meas_json_LDADD = \</span><br><span>     $(top_builddir)/src/osmo-bsc/abis_nm.o \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(top_builddir)/src/osmo-bsc/abis_osmo.o \</span><br><span>   $(top_builddir)/src/osmo-bsc/acc.o \</span><br><span>         $(top_builddir)/src/osmo-bsc/bts.o \</span><br><span>         $(top_builddir)/src/osmo-bsc/bts_sm.o \</span><br><span>diff --git a/tests/abis/Makefile.am b/tests/abis/Makefile.am</span><br><span>index cb327fb..0612827 100644</span><br><span>--- a/tests/abis/Makefile.am</span><br><span>+++ b/tests/abis/Makefile.am</span><br><span>@@ -26,6 +26,7 @@</span><br><span> </span><br><span> abis_test_LDADD = \</span><br><span>  $(top_builddir)/src/osmo-bsc/abis_nm.o \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(top_builddir)/src/osmo-bsc/abis_osmo.o \</span><br><span>   $(top_builddir)/src/osmo-bsc/acc.o \</span><br><span>         $(top_builddir)/src/osmo-bsc/bts.o \</span><br><span>         $(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \</span><br><span>diff --git a/tests/acc/Makefile.am b/tests/acc/Makefile.am</span><br><span>index 9351545..e0044d0 100644</span><br><span>--- a/tests/acc/Makefile.am</span><br><span>+++ b/tests/acc/Makefile.am</span><br><span>@@ -26,6 +26,7 @@</span><br><span> </span><br><span> acc_test_LDADD = \</span><br><span>         $(top_builddir)/src/osmo-bsc/abis_nm.o \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(top_builddir)/src/osmo-bsc/abis_osmo.o \</span><br><span>   $(top_builddir)/src/osmo-bsc/acc.o \</span><br><span>         $(top_builddir)/src/osmo-bsc/bts.o \</span><br><span>         $(top_builddir)/src/osmo-bsc/bts_sm.o \</span><br><span>diff --git a/tests/bsc/Makefile.am b/tests/bsc/Makefile.am</span><br><span>index d08ca18..a0bbb81 100644</span><br><span>--- a/tests/bsc/Makefile.am</span><br><span>+++ b/tests/bsc/Makefile.am</span><br><span>@@ -35,6 +35,7 @@</span><br><span> </span><br><span> bsc_test_LDADD = \</span><br><span>       $(top_builddir)/src/osmo-bsc/abis_nm.o \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(top_builddir)/src/osmo-bsc/abis_osmo.o \</span><br><span>   $(top_builddir)/src/osmo-bsc/acc.o \</span><br><span>         $(top_builddir)/src/osmo-bsc/osmo_bsc_filter.o \</span><br><span>     $(top_builddir)/src/osmo-bsc/bsc_subscriber.o \</span><br><span>diff --git a/tests/gsm0408/Makefile.am b/tests/gsm0408/Makefile.am</span><br><span>index 271a0fd..186dc39 100644</span><br><span>--- a/tests/gsm0408/Makefile.am</span><br><span>+++ b/tests/gsm0408/Makefile.am</span><br><span>@@ -25,6 +25,7 @@</span><br><span> </span><br><span> gsm0408_test_LDADD = \</span><br><span>   $(top_builddir)/src/osmo-bsc/abis_nm.o \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(top_builddir)/src/osmo-bsc/abis_osmo.o \</span><br><span>   $(top_builddir)/src/osmo-bsc/acc.o \</span><br><span>         $(top_builddir)/src/osmo-bsc/gsm_04_08_rr.o \</span><br><span>        $(top_builddir)/src/osmo-bsc/bts.o \</span><br><span>diff --git a/tests/handover/Makefile.am b/tests/handover/Makefile.am</span><br><span>index f0b2e7a..65eb6a8 100644</span><br><span>--- a/tests/handover/Makefile.am</span><br><span>+++ b/tests/handover/Makefile.am</span><br><span>@@ -45,6 +45,7 @@</span><br><span>        $(top_builddir)/src/osmo-bsc/abis_nm_vty.o \</span><br><span>         $(top_builddir)/src/osmo-bsc/abis_om2000.o \</span><br><span>         $(top_builddir)/src/osmo-bsc/abis_om2000_vty.o \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(top_builddir)/src/osmo-bsc/abis_osmo.o \</span><br><span>   $(top_builddir)/src/osmo-bsc/abis_rsl.o \</span><br><span>    $(top_builddir)/src/osmo-bsc/acc.o \</span><br><span>         $(top_builddir)/src/osmo-bsc/assignment_fsm.o \</span><br><span>diff --git a/tests/nanobts_omlattr/Makefile.am b/tests/nanobts_omlattr/Makefile.am</span><br><span>index f2afa2b..e31b8e9 100644</span><br><span>--- a/tests/nanobts_omlattr/Makefile.am</span><br><span>+++ b/tests/nanobts_omlattr/Makefile.am</span><br><span>@@ -24,6 +24,7 @@</span><br><span> </span><br><span> nanobts_omlattr_test_LDADD = \</span><br><span>   $(top_builddir)/src/osmo-bsc/abis_nm.o \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(top_builddir)/src/osmo-bsc/abis_osmo.o \</span><br><span>   $(top_builddir)/src/osmo-bsc/acc.o \</span><br><span>         $(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \</span><br><span>        $(top_builddir)/src/osmo-bsc/bts.o \</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/24550">change 24550</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/+/24550"/><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: I21beb4e5c101157cd0977fd9a607c2fe5350befe </div>
<div style="display:none"> Gerrit-Change-Number: 24550 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>