<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/10260">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  Harald Welte: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">remove libcommon<br><br>This seems to b remaining from ancient days. The code<br>in there is either no longer needed, or has been moved to libosmocore.<br><br>Change-Id: I9307f9da7f48dd0a2e1cb213072068736e569722<br>---<br>D src/libcommon/Makefile.am<br>D src/libcommon/debug.c<br>D src/libcommon/gsm_data.c<br>D src/libcommon/gsm_data_shared.c<br>D src/libcommon/gsm_subscriber_base.c<br>D src/libcommon/gsup_client.c<br>D src/libcommon/gsup_test_client.c<br>D src/libcommon/socket.c<br>D src/libcommon/talloc_ctx.c<br>9 files changed, 0 insertions(+), 2,446 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/libcommon/Makefile.am b/src/libcommon/Makefile.am</span><br><span>deleted file mode 100644</span><br><span>index 69fb37d..0000000</span><br><span>--- a/src/libcommon/Makefile.am</span><br><span>+++ /dev/null</span><br><span>@@ -1,45 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-AM_CPPFLAGS = \</span><br><span style="color: hsl(0, 100%, 40%);">-       $(all_includes) \</span><br><span style="color: hsl(0, 100%, 40%);">-       -I$(top_srcdir)/include \</span><br><span style="color: hsl(0, 100%, 40%);">-       -I$(top_builddir) \</span><br><span style="color: hsl(0, 100%, 40%);">-     $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AM_CFLAGS = \</span><br><span style="color: hsl(0, 100%, 40%);">-    -Wall \</span><br><span style="color: hsl(0, 100%, 40%);">- $(LIBOSMOCORE_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(LIBOSMOGSM_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">-  $(LIBOSMOVTY_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">-  $(LIBOSMOABIS_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(COVERAGE_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">-    $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-noinst_LIBRARIES = \</span><br><span style="color: hsl(0, 100%, 40%);">-     libcommon.a \</span><br><span style="color: hsl(0, 100%, 40%);">-   $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-libcommon_a_SOURCES = \</span><br><span style="color: hsl(0, 100%, 40%);">-  debug.c \</span><br><span style="color: hsl(0, 100%, 40%);">-       gsm_data.c \</span><br><span style="color: hsl(0, 100%, 40%);">-    gsm_data_shared.c \</span><br><span style="color: hsl(0, 100%, 40%);">-     gsup_client.c \</span><br><span style="color: hsl(0, 100%, 40%);">- oap_client.c \</span><br><span style="color: hsl(0, 100%, 40%);">-  socket.c \</span><br><span style="color: hsl(0, 100%, 40%);">-      talloc_ctx.c \</span><br><span style="color: hsl(0, 100%, 40%);">-  gsm_subscriber_base.c \</span><br><span style="color: hsl(0, 100%, 40%);">- $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-noinst_PROGRAMS = \</span><br><span style="color: hsl(0, 100%, 40%);">-      gsup_test_client \</span><br><span style="color: hsl(0, 100%, 40%);">-      $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-gsup_test_client_SOURCES = \</span><br><span style="color: hsl(0, 100%, 40%);">-     gsup_test_client.c \</span><br><span style="color: hsl(0, 100%, 40%);">-    $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-gsup_test_client_LDADD = \</span><br><span style="color: hsl(0, 100%, 40%);">-       libcommon.a \</span><br><span style="color: hsl(0, 100%, 40%);">-   $(LIBOSMOCORE_LIBS) \</span><br><span style="color: hsl(0, 100%, 40%);">-   $(LIBOSMOGSM_LIBS) \</span><br><span style="color: hsl(0, 100%, 40%);">-    $(LIBOSMOVTY_LIBS) \</span><br><span style="color: hsl(0, 100%, 40%);">-    $(LIBOSMOABIS_LIBS) \</span><br><span style="color: hsl(0, 100%, 40%);">-   -lrt \</span><br><span style="color: hsl(0, 100%, 40%);">-  $(NULL)</span><br><span>diff --git a/src/libcommon/debug.c b/src/libcommon/debug.c</span><br><span>deleted file mode 100644</span><br><span>index 27d7575..0000000</span><br><span>--- a/src/libcommon/debug.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,222 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* OpenBSC Debugging/Logging support code */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* (C) 2008-2010 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2008 by Holger Hans Peter Freyther <zecke@selfish.org></span><br><span style="color: hsl(0, 100%, 40%);">- * All Rights Reserved</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(0, 100%, 40%);">- * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(0, 100%, 40%);">- * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(0, 100%, 40%);">- * (at your option) any later version.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(0, 100%, 40%);">- * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(0, 100%, 40%);">- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(0, 100%, 40%);">- * GNU Affero General Public License for more details.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(0, 100%, 40%);">- * along with this program.  If not, see <http://www.gnu.org/licenses/>.</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%);">-#include <stdarg.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdlib.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdio.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <string.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <strings.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <time.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <errno.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/talloc.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/utils.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/logging.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gprs/gprs_msgb.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/sgsn/gsm_data.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/sgsn/debug.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* default categories */</span><br><span style="color: hsl(0, 100%, 40%);">-static const struct log_info_cat default_categories[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-   [DRLL] = {</span><br><span style="color: hsl(0, 100%, 40%);">-              .name = "DRLL",</span><br><span style="color: hsl(0, 100%, 40%);">-               .description = "A-bis Radio Link Layer (RLL)",</span><br><span style="color: hsl(0, 100%, 40%);">-                .color = "\033[1;31m",</span><br><span style="color: hsl(0, 100%, 40%);">-                .enabled = 1, .loglevel = LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">-  },</span><br><span style="color: hsl(0, 100%, 40%);">-      [DCC] = {</span><br><span style="color: hsl(0, 100%, 40%);">-               .name = "DCC",</span><br><span style="color: hsl(0, 100%, 40%);">-                .description = "Layer3 Call Control (CC)",</span><br><span style="color: hsl(0, 100%, 40%);">-            .color = "\033[1;32m",</span><br><span style="color: hsl(0, 100%, 40%);">-                .enabled = 1, .loglevel = LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">-  },</span><br><span style="color: hsl(0, 100%, 40%);">-      [DMM] = {</span><br><span style="color: hsl(0, 100%, 40%);">-               .name = "DMM",</span><br><span style="color: hsl(0, 100%, 40%);">-                .description = "Layer3 Mobility Management (MM)",</span><br><span style="color: hsl(0, 100%, 40%);">-             .color = "\033[1;33m",</span><br><span style="color: hsl(0, 100%, 40%);">-                .enabled = 1, .loglevel = LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">-  },</span><br><span style="color: hsl(0, 100%, 40%);">-      [DRR] = {</span><br><span style="color: hsl(0, 100%, 40%);">-               .name = "DRR",</span><br><span style="color: hsl(0, 100%, 40%);">-                .description = "Layer3 Radio Resource (RR)",</span><br><span style="color: hsl(0, 100%, 40%);">-          .color = "\033[1;34m",</span><br><span style="color: hsl(0, 100%, 40%);">-                .enabled = 1, .loglevel = LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">-  },</span><br><span style="color: hsl(0, 100%, 40%);">-      [DRSL] = {</span><br><span style="color: hsl(0, 100%, 40%);">-              .name = "DRSL",</span><br><span style="color: hsl(0, 100%, 40%);">-               .description = "A-bis Radio Siganlling Link (RSL)",</span><br><span style="color: hsl(0, 100%, 40%);">-           .color = "\033[1;35m",</span><br><span style="color: hsl(0, 100%, 40%);">-                .enabled = 1, .loglevel = LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">-  },</span><br><span style="color: hsl(0, 100%, 40%);">-      [DNM] = {</span><br><span style="color: hsl(0, 100%, 40%);">-               .name = "DNM",</span><br><span style="color: hsl(0, 100%, 40%);">-                .description = "A-bis Network Management / O&M (NM/OML)",</span><br><span style="color: hsl(0, 100%, 40%);">-         .color = "\033[1;36m",</span><br><span style="color: hsl(0, 100%, 40%);">-                .enabled = 1, .loglevel = LOGL_INFO,</span><br><span style="color: hsl(0, 100%, 40%);">-    },</span><br><span style="color: hsl(0, 100%, 40%);">-      [DMNCC] = {</span><br><span style="color: hsl(0, 100%, 40%);">-             .name = "DMNCC",</span><br><span style="color: hsl(0, 100%, 40%);">-              .description = "MNCC API for Call Control application",</span><br><span style="color: hsl(0, 100%, 40%);">-               .color = "\033[1;39m",</span><br><span style="color: hsl(0, 100%, 40%);">-                .enabled = 1, .loglevel = LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">-  },</span><br><span style="color: hsl(0, 100%, 40%);">-      [DPAG]  = {</span><br><span style="color: hsl(0, 100%, 40%);">-             .name = "DPAG",</span><br><span style="color: hsl(0, 100%, 40%);">-               .description = "Paging Subsystem",</span><br><span style="color: hsl(0, 100%, 40%);">-            .color = "\033[1;38m",</span><br><span style="color: hsl(0, 100%, 40%);">-                .enabled = 1, .loglevel = LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">-  },</span><br><span style="color: hsl(0, 100%, 40%);">-      [DMEAS] = {</span><br><span style="color: hsl(0, 100%, 40%);">-             .name = "DMEAS",</span><br><span style="color: hsl(0, 100%, 40%);">-              .description = "Radio Measurement Processing",</span><br><span style="color: hsl(0, 100%, 40%);">-                .enabled = 0, .loglevel = LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">-  },</span><br><span style="color: hsl(0, 100%, 40%);">-      [DSCCP] = {</span><br><span style="color: hsl(0, 100%, 40%);">-             .name = "DSCCP",</span><br><span style="color: hsl(0, 100%, 40%);">-              .description = "SCCP Protocol",</span><br><span style="color: hsl(0, 100%, 40%);">-               .enabled = 1, .loglevel = LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">-  },</span><br><span style="color: hsl(0, 100%, 40%);">-      [DMSC] = {</span><br><span style="color: hsl(0, 100%, 40%);">-              .name = "DMSC",</span><br><span style="color: hsl(0, 100%, 40%);">-               .description = "Mobile Switching Center",</span><br><span style="color: hsl(0, 100%, 40%);">-             .enabled = 1, .loglevel = LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">-  },</span><br><span style="color: hsl(0, 100%, 40%);">-      [DHO] = {</span><br><span style="color: hsl(0, 100%, 40%);">-               .name = "DHO",</span><br><span style="color: hsl(0, 100%, 40%);">-                .description = "Hand-Over",</span><br><span style="color: hsl(0, 100%, 40%);">-           .enabled = 1, .loglevel = LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">-  },</span><br><span style="color: hsl(0, 100%, 40%);">-      [DDB] = {</span><br><span style="color: hsl(0, 100%, 40%);">-               .name = "DDB",</span><br><span style="color: hsl(0, 100%, 40%);">-                .description = "Database Layer",</span><br><span style="color: hsl(0, 100%, 40%);">-              .enabled = 1, .loglevel = LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">-  },</span><br><span style="color: hsl(0, 100%, 40%);">-      [DREF] = {</span><br><span style="color: hsl(0, 100%, 40%);">-              .name = "DREF",</span><br><span style="color: hsl(0, 100%, 40%);">-               .description = "Reference Counting",</span><br><span style="color: hsl(0, 100%, 40%);">-          .enabled = 0, .loglevel = LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">-  },</span><br><span style="color: hsl(0, 100%, 40%);">-      [DGPRS] = {</span><br><span style="color: hsl(0, 100%, 40%);">-             .name = "DGPRS",</span><br><span style="color: hsl(0, 100%, 40%);">-              .description = "GPRS Packet Service",</span><br><span style="color: hsl(0, 100%, 40%);">-         .enabled = 1, .loglevel = LOGL_DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">-   },</span><br><span style="color: hsl(0, 100%, 40%);">-      [DNS] = {</span><br><span style="color: hsl(0, 100%, 40%);">-               .name = "DNS",</span><br><span style="color: hsl(0, 100%, 40%);">-                .description = "GPRS Network Service (NS)",</span><br><span style="color: hsl(0, 100%, 40%);">-           .enabled = 1, .loglevel = LOGL_INFO,</span><br><span style="color: hsl(0, 100%, 40%);">-    },</span><br><span style="color: hsl(0, 100%, 40%);">-      [DBSSGP] = {</span><br><span style="color: hsl(0, 100%, 40%);">-            .name = "DBSSGP",</span><br><span style="color: hsl(0, 100%, 40%);">-             .description = "GPRS BSS Gateway Protocol (BSSGP)",</span><br><span style="color: hsl(0, 100%, 40%);">-           .enabled = 1, .loglevel = LOGL_DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">-   },</span><br><span style="color: hsl(0, 100%, 40%);">-      [DLLC] = {</span><br><span style="color: hsl(0, 100%, 40%);">-              .name = "DLLC",</span><br><span style="color: hsl(0, 100%, 40%);">-               .description = "GPRS Logical Link Control Protocol (LLC)",</span><br><span style="color: hsl(0, 100%, 40%);">-            .enabled = 1, .loglevel = LOGL_DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">-   },</span><br><span style="color: hsl(0, 100%, 40%);">-      [DSNDCP] = {</span><br><span style="color: hsl(0, 100%, 40%);">-            .name = "DSNDCP",</span><br><span style="color: hsl(0, 100%, 40%);">-             .description = "GPRS Sub-Network Dependent Control Protocol (SNDCP)",</span><br><span style="color: hsl(0, 100%, 40%);">-         .enabled = 1, .loglevel = LOGL_DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">-   },</span><br><span style="color: hsl(0, 100%, 40%);">-      [DNAT] = {</span><br><span style="color: hsl(0, 100%, 40%);">-              .name = "DNAT",</span><br><span style="color: hsl(0, 100%, 40%);">-               .description = "GSM 08.08 NAT/Multiplexer",</span><br><span style="color: hsl(0, 100%, 40%);">-           .enabled = 1, .loglevel = LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">-  },</span><br><span style="color: hsl(0, 100%, 40%);">-      [DCTRL] = {</span><br><span style="color: hsl(0, 100%, 40%);">-             .name = "DCTRL",</span><br><span style="color: hsl(0, 100%, 40%);">-              .description = "Control interface",</span><br><span style="color: hsl(0, 100%, 40%);">-           .enabled = 1, .loglevel = LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">-  },</span><br><span style="color: hsl(0, 100%, 40%);">-      [DFILTER] = {</span><br><span style="color: hsl(0, 100%, 40%);">-           .name = "DFILTER",</span><br><span style="color: hsl(0, 100%, 40%);">-            .description = "BSC/NAT IMSI based filtering",</span><br><span style="color: hsl(0, 100%, 40%);">-                .enabled = 1, .loglevel = LOGL_DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">-   },</span><br><span style="color: hsl(0, 100%, 40%);">-      [DRANAP] = {</span><br><span style="color: hsl(0, 100%, 40%);">-            .name = "DRANAP",</span><br><span style="color: hsl(0, 100%, 40%);">-             .description = "Radio Access Network Application Part Protocol",</span><br><span style="color: hsl(0, 100%, 40%);">-              .enabled = 1, .loglevel = LOGL_DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">-   },</span><br><span style="color: hsl(0, 100%, 40%);">-      [DSUA] = {</span><br><span style="color: hsl(0, 100%, 40%);">-              .name = "DSUA",</span><br><span style="color: hsl(0, 100%, 40%);">-               .description = "SCCP User Adaptation Protocol",</span><br><span style="color: hsl(0, 100%, 40%);">-               .enabled = 1, .loglevel = LOGL_DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">-   },</span><br><span style="color: hsl(0, 100%, 40%);">-      [DPCU] = {</span><br><span style="color: hsl(0, 100%, 40%);">-              .name = "DPCU",</span><br><span style="color: hsl(0, 100%, 40%);">-               .description = "PCU Interface",</span><br><span style="color: hsl(0, 100%, 40%);">-               .enabled = 1, .loglevel = LOGL_DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">-   },</span><br><span style="color: hsl(0, 100%, 40%);">-      [DVLR] = {</span><br><span style="color: hsl(0, 100%, 40%);">-              .name = "DVLR",</span><br><span style="color: hsl(0, 100%, 40%);">-               .description = "Visitor Location Register",</span><br><span style="color: hsl(0, 100%, 40%);">-           .enabled = 1, .loglevel = LOGL_DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">-   },</span><br><span style="color: hsl(0, 100%, 40%);">-      [DIUCS] = {</span><br><span style="color: hsl(0, 100%, 40%);">-             .name = "DIUCS",</span><br><span style="color: hsl(0, 100%, 40%);">-              .description = "Iu-CS Protocol",</span><br><span style="color: hsl(0, 100%, 40%);">-              .enabled = 1, .loglevel = LOGL_DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">-   },</span><br><span style="color: hsl(0, 100%, 40%);">-      [DSIGTRAN] = {</span><br><span style="color: hsl(0, 100%, 40%);">-          .name = "DSIGTRAN",</span><br><span style="color: hsl(0, 100%, 40%);">-           .description = "SIGTRAN Signalling Transport",</span><br><span style="color: hsl(0, 100%, 40%);">-                .color = "\033[1;29m",</span><br><span style="color: hsl(0, 100%, 40%);">-                .enabled = 1, .loglevel = LOGL_DEBUG,</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%);">-static int filter_fn(const struct log_context *ctx, struct log_target *tar)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        const struct vlr_subscr *vsub = ctx->ctx[LOG_CTX_VLR_SUBSCR];</span><br><span style="color: hsl(0, 100%, 40%);">-        const struct bsc_subscr *bsub = ctx->ctx[LOG_CTX_BSC_SUBSCR];</span><br><span style="color: hsl(0, 100%, 40%);">-        const struct gprs_nsvc *nsvc = ctx->ctx[LOG_CTX_GB_NSVC];</span><br><span style="color: hsl(0, 100%, 40%);">-    const struct gprs_nsvc *bvc = ctx->ctx[LOG_CTX_GB_BVC];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if ((tar->filter_map & (1 << LOG_FLT_VLR_SUBSCR)) != 0</span><br><span style="color: hsl(0, 100%, 40%);">-         && vsub && vsub == tar->filter_data[LOG_FLT_VLR_SUBSCR])</span><br><span style="color: hsl(0, 100%, 40%);">-         return 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if ((tar->filter_map & (1 << LOG_FLT_BSC_SUBSCR)) != 0</span><br><span style="color: hsl(0, 100%, 40%);">-         && bsub && bsub == tar->filter_data[LOG_FLT_BSC_SUBSCR])</span><br><span style="color: hsl(0, 100%, 40%);">-         return 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Filter on the NS Virtual Connection */</span><br><span style="color: hsl(0, 100%, 40%);">-       if ((tar->filter_map & (1 << LOG_FLT_GB_NSVC)) != 0</span><br><span style="color: hsl(0, 100%, 40%);">-            && nsvc && (nsvc == tar->filter_data[LOG_FLT_GB_NSVC]))</span><br><span style="color: hsl(0, 100%, 40%);">-          return 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Filter on the NS Virtual Connection */</span><br><span style="color: hsl(0, 100%, 40%);">-       if ((tar->filter_map & (1 << LOG_FLT_GB_BVC)) != 0</span><br><span style="color: hsl(0, 100%, 40%);">-     && bvc && (bvc == tar->filter_data[LOG_FLT_GB_BVC]))</span><br><span style="color: hsl(0, 100%, 40%);">-             return 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</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 style="color: hsl(0, 100%, 40%);">-const struct log_info log_info = {</span><br><span style="color: hsl(0, 100%, 40%);">-    .filter_fn = filter_fn,</span><br><span style="color: hsl(0, 100%, 40%);">- .cat = default_categories,</span><br><span style="color: hsl(0, 100%, 40%);">-      .num_cat = ARRAY_SIZE(default_categories),</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span>diff --git a/src/libcommon/gsm_data.c b/src/libcommon/gsm_data.c</span><br><span>deleted file mode 100644</span><br><span>index 6400963..0000000</span><br><span>--- a/src/libcommon/gsm_data.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,450 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* (C) 2008-2010 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * All Rights Reserved</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(0, 100%, 40%);">- * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(0, 100%, 40%);">- * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(0, 100%, 40%);">- * (at your option) any later version.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(0, 100%, 40%);">- * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(0, 100%, 40%);">- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(0, 100%, 40%);">- * GNU Affero General Public License for more details.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(0, 100%, 40%);">- * along with this program.  If not, see <http://www.gnu.org/licenses/>.</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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdlib.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdio.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <string.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <errno.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <ctype.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdbool.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <netinet/in.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/linuxlist.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/talloc.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/gsm_utils.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/abis_nm.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/statistics.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/protocol/gsm_04_08.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/sgsn/gsm_data.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/sgsn/bsc_msc_data.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/sgsn/abis_nm.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void *tall_bsc_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static LLIST_HEAD(bts_models);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void set_ts_e1link(struct gsm_bts_trx_ts *ts, uint8_t e1_nr,</span><br><span style="color: hsl(0, 100%, 40%);">-                 uint8_t e1_ts, uint8_t e1_ts_ss)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    ts->e1_link.e1_nr = e1_nr;</span><br><span style="color: hsl(0, 100%, 40%);">-   ts->e1_link.e1_ts = e1_ts;</span><br><span style="color: hsl(0, 100%, 40%);">-   ts->e1_link.e1_ts_ss = e1_ts_ss;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct gsm_bts_model *bts_model_find(enum gsm_bts_type type)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gsm_bts_model *model;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    llist_for_each_entry(model, &bts_models, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-            if (model->type == type)</span><br><span style="color: hsl(0, 100%, 40%);">-                     return model;</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%);">-       return NULL;</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%);">-int gsm_bts_model_register(struct gsm_bts_model *model)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   if (bts_model_find(model->type))</span><br><span style="color: hsl(0, 100%, 40%);">-             return -EEXIST;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- tlv_def_patch(&model->nm_att_tlvdef, &abis_nm_att_tlvdef);</span><br><span style="color: hsl(0, 100%, 40%);">-   llist_add_tail(&model->list, &bts_models);</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 style="color: hsl(0, 100%, 40%);">-const struct value_string bts_type_descs[_NUM_GSM_BTS_TYPE+1] = {</span><br><span style="color: hsl(0, 100%, 40%);">-     { GSM_BTS_TYPE_UNKNOWN,         "Unknown BTS Type" },</span><br><span style="color: hsl(0, 100%, 40%);">- { GSM_BTS_TYPE_BS11,            "Siemens BTS (BS-11 or compatible)" },</span><br><span style="color: hsl(0, 100%, 40%);">-        { GSM_BTS_TYPE_NANOBTS,         "ip.access nanoBTS or compatible" },</span><br><span style="color: hsl(0, 100%, 40%);">-  { GSM_BTS_TYPE_RBS2000,         "Ericsson RBS2000 Series" },</span><br><span style="color: hsl(0, 100%, 40%);">-  { GSM_BTS_TYPE_NOKIA_SITE,      "Nokia {Metro,Ultra,In}Site" },</span><br><span style="color: hsl(0, 100%, 40%);">-       { GSM_BTS_TYPE_OSMOBTS,         "sysmocom sysmoBTS" },</span><br><span style="color: hsl(0, 100%, 40%);">-        { 0,                            NULL }</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%);">-struct gsm_bts_trx *gsm_bts_trx_by_nr(struct gsm_bts *bts, int nr)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gsm_bts_trx *trx;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        llist_for_each_entry(trx, &bts->trx_list, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                if (trx->nr == nr)</span><br><span style="color: hsl(0, 100%, 40%);">-                   return trx;</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-       return NULL;</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%);">-/* Search for a BTS in the given Location Area; optionally start searching</span><br><span style="color: hsl(0, 100%, 40%);">- * with start_bts (for continuing to search after the first result) */</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_bts *gsm_bts_by_lac(struct gsm_network *net, unsigned int lac,</span><br><span style="color: hsl(0, 100%, 40%);">-                          struct gsm_bts *start_bts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     int i;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct gsm_bts *bts;</span><br><span style="color: hsl(0, 100%, 40%);">-    int skip = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   if (start_bts)</span><br><span style="color: hsl(0, 100%, 40%);">-          skip = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       for (i = 0; i < net->num_bts; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-              bts = gsm_bts_num(net, i);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              if (skip) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     if (start_bts == bts)</span><br><span style="color: hsl(0, 100%, 40%);">-                           skip = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                       continue;</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 (lac == GSM_LAC_RESERVED_ALL_BTS || bts->location_area_code == lac)</span><br><span style="color: hsl(0, 100%, 40%);">-                       return bts;</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-       return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static const struct value_string auth_policy_names[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-   { GSM_AUTH_POLICY_CLOSED,       "closed" },</span><br><span style="color: hsl(0, 100%, 40%);">-   { GSM_AUTH_POLICY_ACCEPT_ALL,   "accept-all" },</span><br><span style="color: hsl(0, 100%, 40%);">-       { GSM_AUTH_POLICY_TOKEN,        "token" },</span><br><span style="color: hsl(0, 100%, 40%);">-    { GSM_AUTH_POLICY_REGEXP,       "regexp" },</span><br><span style="color: hsl(0, 100%, 40%);">-   { 0,                            NULL }</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%);">-enum gsm_auth_policy gsm_auth_policy_parse(const char *arg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    return get_string_value(auth_policy_names, arg);</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%);">-const char *gsm_auth_policy_name(enum gsm_auth_policy policy)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- return get_value_string(auth_policy_names, policy);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static const struct value_string rrlp_mode_names[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-      { RRLP_MODE_NONE,       "none" },</span><br><span style="color: hsl(0, 100%, 40%);">-     { RRLP_MODE_MS_BASED,   "ms-based" },</span><br><span style="color: hsl(0, 100%, 40%);">- { RRLP_MODE_MS_PREF,    "ms-preferred" },</span><br><span style="color: hsl(0, 100%, 40%);">-     { RRLP_MODE_ASS_PREF,   "ass-preferred" },</span><br><span style="color: hsl(0, 100%, 40%);">-    { 0,                    NULL }</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%);">-enum rrlp_mode rrlp_mode_parse(const char *arg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        return get_string_value(rrlp_mode_names, arg);</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%);">-const char *rrlp_mode_name(enum rrlp_mode mode)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- return get_value_string(rrlp_mode_names, mode);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static const struct value_string bts_gprs_mode_names[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-      { BTS_GPRS_NONE,        "none" },</span><br><span style="color: hsl(0, 100%, 40%);">-     { BTS_GPRS_GPRS,        "gprs" },</span><br><span style="color: hsl(0, 100%, 40%);">-     { BTS_GPRS_EGPRS,       "egprs" },</span><br><span style="color: hsl(0, 100%, 40%);">-    { 0,                    NULL }</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%);">-enum bts_gprs_mode bts_gprs_mode_parse(const char *arg, int *valid)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- rc = get_string_value(bts_gprs_mode_names, arg);</span><br><span style="color: hsl(0, 100%, 40%);">-        if (valid)</span><br><span style="color: hsl(0, 100%, 40%);">-              *valid = rc != -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">- return rc;</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%);">-const char *bts_gprs_mode_name(enum bts_gprs_mode mode)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     return get_value_string(bts_gprs_mode_names, mode);</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%);">-int bts_gprs_mode_is_compat(struct gsm_bts *bts, enum bts_gprs_mode mode)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  if (mode != BTS_GPRS_NONE &&</span><br><span style="color: hsl(0, 100%, 40%);">-        !gsm_btsmodel_has_feature(bts->model, BTS_FEAT_GPRS)) {</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%);">-       if (mode == BTS_GPRS_EGPRS &&</span><br><span style="color: hsl(0, 100%, 40%);">-       !gsm_btsmodel_has_feature(bts->model, BTS_FEAT_EGPRS)) {</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 style="color: hsl(0, 100%, 40%);">-       return 1;</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%);">-int gsm_btsmodel_set_feature(struct gsm_bts_model *model, enum gsm_bts_features feat)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(_NUM_BTS_FEAT < MAX_BTS_FEATURES);</span><br><span style="color: hsl(0, 100%, 40%);">-       return bitvec_set_bit_pos(&model->features, feat, 1);</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%);">-bool gsm_btsmodel_has_feature(struct gsm_bts_model *model, enum gsm_bts_features feat)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(_NUM_BTS_FEAT < MAX_BTS_FEATURES);</span><br><span style="color: hsl(0, 100%, 40%);">-       return bitvec_get_bit_pos(&model->features, feat);</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%);">-int gsm_set_bts_type(struct gsm_bts *bts, enum gsm_bts_type type)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gsm_bts_model *model;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    model = bts_model_find(type);</span><br><span style="color: hsl(0, 100%, 40%);">-   if (!model)</span><br><span style="color: hsl(0, 100%, 40%);">-             return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- bts->type = type;</span><br><span style="color: hsl(0, 100%, 40%);">-    bts->model = model;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  if (model->start && !model->started) {</span><br><span style="color: hsl(0, 100%, 40%);">-            int ret = model->start(bts->network);</span><br><span style="color: hsl(0, 100%, 40%);">-             if (ret < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                 return ret;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-             model->started = true;</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%);">-       switch (bts->type) {</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM_BTS_TYPE_NANOBTS:</span><br><span style="color: hsl(0, 100%, 40%);">-      case GSM_BTS_TYPE_OSMOBTS:</span><br><span style="color: hsl(0, 100%, 40%);">-              /* Set the default OML Stream ID to 0xff */</span><br><span style="color: hsl(0, 100%, 40%);">-             bts->oml_tei = 0xff;</span><br><span style="color: hsl(0, 100%, 40%);">-         bts->c0->nominal_power = 23;</span><br><span style="color: hsl(0, 100%, 40%);">-              break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM_BTS_TYPE_RBS2000:</span><br><span style="color: hsl(0, 100%, 40%);">-              INIT_LLIST_HEAD(&bts->rbs2000.is.conn_groups);</span><br><span style="color: hsl(0, 100%, 40%);">-           INIT_LLIST_HEAD(&bts->rbs2000.con.conn_groups);</span><br><span style="color: hsl(0, 100%, 40%);">-          break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM_BTS_TYPE_BS11:</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM_BTS_TYPE_UNKNOWN:</span><br><span style="color: hsl(0, 100%, 40%);">-      case GSM_BTS_TYPE_NOKIA_SITE:</span><br><span style="color: hsl(0, 100%, 40%);">-           /* Set default BTS reset timer */</span><br><span style="color: hsl(0, 100%, 40%);">-               bts->nokia.bts_reset_timer_cnf = 15;</span><br><span style="color: hsl(0, 100%, 40%);">- case _NUM_GSM_BTS_TYPE:</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%);">-       return 0;</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%);">-struct gsm_bts *gsm_bts_alloc_register(struct gsm_network *net, enum gsm_bts_type type,</span><br><span style="color: hsl(0, 100%, 40%);">-                                       uint8_t bsic)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  struct gsm_bts_model *model = bts_model_find(type);</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gsm_bts *bts;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!model && type != GSM_BTS_TYPE_UNKNOWN)</span><br><span style="color: hsl(0, 100%, 40%);">-             return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    bts = gsm_bts_alloc(net, net->num_bts);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (!bts)</span><br><span style="color: hsl(0, 100%, 40%);">-               return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    net->num_bts++;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      bts->network = net;</span><br><span style="color: hsl(0, 100%, 40%);">-  bts->type = type;</span><br><span style="color: hsl(0, 100%, 40%);">-    bts->model = model;</span><br><span style="color: hsl(0, 100%, 40%);">-  bts->bsic = bsic;</span><br><span style="color: hsl(0, 100%, 40%);">-    bts->dtxu = GSM48_DTX_SHALL_NOT_BE_USED;</span><br><span style="color: hsl(0, 100%, 40%);">-     bts->dtxd = false;</span><br><span style="color: hsl(0, 100%, 40%);">-   bts->gprs.ctrl_ack_type_use_block = true; /* use RLC/MAC control block */</span><br><span style="color: hsl(0, 100%, 40%);">-    bts->neigh_list_manual_mode = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-     bts->si_common.cell_sel_par.cell_resel_hyst = 2; /* 4 dB */</span><br><span style="color: hsl(0, 100%, 40%);">-  bts->si_common.cell_sel_par.rxlev_acc_min = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       bts->si_common.si2quater_neigh_list.arfcn = bts->si_common.data.earfcn_list;</span><br><span style="color: hsl(0, 100%, 40%);">-      bts->si_common.si2quater_neigh_list.meas_bw = bts->si_common.data.meas_bw_list;</span><br><span style="color: hsl(0, 100%, 40%);">-   bts->si_common.si2quater_neigh_list.length = MAX_EARFCN_LIST;</span><br><span style="color: hsl(0, 100%, 40%);">-        bts->si_common.si2quater_neigh_list.thresh_hi = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-   osmo_earfcn_init(&bts->si_common.si2quater_neigh_list);</span><br><span style="color: hsl(0, 100%, 40%);">-  bts->si_common.neigh_list.data = bts->si_common.data.neigh_list;</span><br><span style="color: hsl(0, 100%, 40%);">-  bts->si_common.neigh_list.data_len =</span><br><span style="color: hsl(0, 100%, 40%);">-                         sizeof(bts->si_common.data.neigh_list);</span><br><span style="color: hsl(0, 100%, 40%);">-      bts->si_common.si5_neigh_list.data = bts->si_common.data.si5_neigh_list;</span><br><span style="color: hsl(0, 100%, 40%);">-  bts->si_common.si5_neigh_list.data_len =</span><br><span style="color: hsl(0, 100%, 40%);">-                             sizeof(bts->si_common.data.si5_neigh_list);</span><br><span style="color: hsl(0, 100%, 40%);">-  bts->si_common.cell_alloc.data = bts->si_common.data.cell_alloc;</span><br><span style="color: hsl(0, 100%, 40%);">-  bts->si_common.cell_alloc.data_len =</span><br><span style="color: hsl(0, 100%, 40%);">-                         sizeof(bts->si_common.data.cell_alloc);</span><br><span style="color: hsl(0, 100%, 40%);">-      bts->si_common.rach_control.re = 1; /* no re-establishment */</span><br><span style="color: hsl(0, 100%, 40%);">-        bts->si_common.rach_control.tx_integer = 9;  /* 12 slots spread - 217/115 slots delay */</span><br><span style="color: hsl(0, 100%, 40%);">-     bts->si_common.rach_control.max_trans = 3; /* 7 retransmissions */</span><br><span style="color: hsl(0, 100%, 40%);">-   bts->si_common.rach_control.t2 = 4; /* no emergency calls */</span><br><span style="color: hsl(0, 100%, 40%);">- bts->si_common.chan_desc.att = 1; /* attachment required */</span><br><span style="color: hsl(0, 100%, 40%);">-  bts->si_common.chan_desc.bs_pa_mfrms = RSL_BS_PA_MFRMS_5; /* paging frames */</span><br><span style="color: hsl(0, 100%, 40%);">-        bts->si_common.chan_desc.bs_ag_blks_res = 1; /* reserved AGCH blocks */</span><br><span style="color: hsl(0, 100%, 40%);">-      bts->si_common.chan_desc.t3212 = net->t3212; /* Use network's current value */</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_bts_set_radio_link_timeout(bts, 32); /* Use RADIO LINK TIMEOUT of 32 */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     llist_add_tail(&bts->list, &net->bts_list);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       INIT_LLIST_HEAD(&bts->abis_queue);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       INIT_LLIST_HEAD(&bts->loc_list);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return bts;</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%);">-void gprs_ra_id_by_bts(struct gprs_ra_id *raid, struct gsm_bts *bts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       raid->mcc = bts->network->country_code;</span><br><span style="color: hsl(0, 100%, 40%);">-        raid->mnc = bts->network->network_code;</span><br><span style="color: hsl(0, 100%, 40%);">-        raid->lac = bts->location_area_code;</span><br><span style="color: hsl(0, 100%, 40%);">-      raid->rac = bts->gprs.rac;</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%);">-int gsm_parse_reg(void *ctx, regex_t *reg, char **str, int argc, const char **argv)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   int ret;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        ret = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-        if (*str) {</span><br><span style="color: hsl(0, 100%, 40%);">-             talloc_free(*str);</span><br><span style="color: hsl(0, 100%, 40%);">-              *str = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       regfree(reg);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   if (argc > 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-              *str = talloc_strdup(ctx, argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-             ret = regcomp(reg, argv[0], 0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         /* handle compilation failures */</span><br><span style="color: hsl(0, 100%, 40%);">-               if (ret != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 talloc_free(*str);</span><br><span style="color: hsl(0, 100%, 40%);">-                      *str = NULL;</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%);">-       return ret;</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%);">-/* Assume there are only 256 possible bts */</span><br><span style="color: hsl(0, 100%, 40%);">-osmo_static_assert(sizeof(((struct gsm_bts *) 0)->nr) == 1, _bts_nr_is_256);</span><br><span style="color: hsl(0, 100%, 40%);">-static void depends_calc_index_bit(int bts_nr, int *idx, int *bit)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      *idx = bts_nr / (8 * 4);</span><br><span style="color: hsl(0, 100%, 40%);">-        *bit = bts_nr % (8 * 4);</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%);">-void bts_depend_mark(struct gsm_bts *bts, int dep)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    int idx, bit;</span><br><span style="color: hsl(0, 100%, 40%);">-   depends_calc_index_bit(dep, &idx, &bit);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        bts->depends_on[idx] |= 1 << bit;</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%);">-void bts_depend_clear(struct gsm_bts *bts, int dep)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- int idx, bit;</span><br><span style="color: hsl(0, 100%, 40%);">-   depends_calc_index_bit(dep, &idx, &bit);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        bts->depends_on[idx] &= ~(1 << bit);</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%);">-int bts_depend_is_depedency(struct gsm_bts *base, struct gsm_bts *other)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     int idx, bit;</span><br><span style="color: hsl(0, 100%, 40%);">-   depends_calc_index_bit(other->nr, &idx, &bit);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Check if there is a depends bit */</span><br><span style="color: hsl(0, 100%, 40%);">-   return (base->depends_on[idx] & (1 << bit)) > 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int bts_is_online(struct gsm_bts *bts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- /* TODO: support E1 BTS too */</span><br><span style="color: hsl(0, 100%, 40%);">-  if (!is_ipaccess_bts(bts))</span><br><span style="color: hsl(0, 100%, 40%);">-              return 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!bts->oml_link)</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%);">-       return bts->mo.nm_state.operational == NM_OPSTATE_ENABLED;</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%);">-int bts_depend_check(struct gsm_bts *bts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gsm_bts *other_bts;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      llist_for_each_entry(other_bts, &bts->network->bts_list, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-              if (!bts_depend_is_depedency(bts, other_bts))</span><br><span style="color: hsl(0, 100%, 40%);">-                   continue;</span><br><span style="color: hsl(0, 100%, 40%);">-               if (bts_is_online(other_bts))</span><br><span style="color: hsl(0, 100%, 40%);">-                   continue;</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%);">-       return 1;</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%);">-/* get the radio link timeout (based on SACCH decode errors, according</span><br><span style="color: hsl(0, 100%, 40%);">- * to algorithm specified in TS 05.08 section 5.2.  A value of -1</span><br><span style="color: hsl(0, 100%, 40%);">- * indicates we should use an infinitely long timeout, which only works</span><br><span style="color: hsl(0, 100%, 40%);">- * with OsmoBTS as the BTS implementation */</span><br><span style="color: hsl(0, 100%, 40%);">-int gsm_bts_get_radio_link_timeout(const struct gsm_bts *bts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      const struct gsm48_cell_options *cell_options = &bts->si_common.cell_options;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if (bts->infinite_radio_link_timeout)</span><br><span style="color: hsl(0, 100%, 40%);">-                return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-      else {</span><br><span style="color: hsl(0, 100%, 40%);">-          /* Encoding as per Table 10.5.21 of TS 04.08 */</span><br><span style="color: hsl(0, 100%, 40%);">-         return (cell_options->radio_link_timeout + 1) << 2;</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%);">-/* set the radio link timeout (based on SACCH decode errors, according</span><br><span style="color: hsl(0, 100%, 40%);">- * to algorithm specified in TS 05.08 Section 5.2.  A value of -1</span><br><span style="color: hsl(0, 100%, 40%);">- * indicates we should use an infinitely long timeout, which only works</span><br><span style="color: hsl(0, 100%, 40%);">- * with OsmoBTS as the BTS implementation */</span><br><span style="color: hsl(0, 100%, 40%);">-void gsm_bts_set_radio_link_timeout(struct gsm_bts *bts, int value)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gsm48_cell_options *cell_options = &bts->si_common.cell_options;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  if (value < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-               bts->infinite_radio_link_timeout = true;</span><br><span style="color: hsl(0, 100%, 40%);">-     else {</span><br><span style="color: hsl(0, 100%, 40%);">-          bts->infinite_radio_link_timeout = false;</span><br><span style="color: hsl(0, 100%, 40%);">-            /* Encoding as per Table 10.5.21 of TS 04.08 */</span><br><span style="color: hsl(0, 100%, 40%);">-         if (value < 4)</span><br><span style="color: hsl(0, 100%, 40%);">-                       value = 4;</span><br><span style="color: hsl(0, 100%, 40%);">-              if (value > 64)</span><br><span style="color: hsl(0, 100%, 40%);">-                      value = 64;</span><br><span style="color: hsl(0, 100%, 40%);">-             cell_options->radio_link_timeout = (value >> 2) - 1;</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%);">-bool classmark_is_r99(struct gsm_classmark *cm)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      int rev_lev = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-        if (cm->classmark1_set)</span><br><span style="color: hsl(0, 100%, 40%);">-              rev_lev = cm->classmark1.rev_lev;</span><br><span style="color: hsl(0, 100%, 40%);">-    else if (cm->classmark2_len > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          rev_lev = (cm->classmark2[0] >> 5) & 0x3;</span><br><span style="color: hsl(0, 100%, 40%);">-  return rev_lev >= 2;</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%);">-const struct value_string ran_type_names[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-  OSMO_VALUE_STRING(RAN_UNKNOWN),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(RAN_GERAN_A),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(RAN_UTRAN_IU),</span><br><span style="color: hsl(0, 100%, 40%);">-        { 0, NULL }</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span>diff --git a/src/libcommon/gsm_data_shared.c b/src/libcommon/gsm_data_shared.c</span><br><span>deleted file mode 100644</span><br><span>index 8d5f990..0000000</span><br><span>--- a/src/libcommon/gsm_data_shared.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,853 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* (C) 2008-2010 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * All Rights Reserved</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(0, 100%, 40%);">- * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(0, 100%, 40%);">- * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(0, 100%, 40%);">- * (at your option) any later version.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(0, 100%, 40%);">- * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(0, 100%, 40%);">- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(0, 100%, 40%);">- * GNU Affero General Public License for more details.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(0, 100%, 40%);">- * along with this program.  If not, see <http://www.gnu.org/licenses/>.</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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdlib.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdio.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <string.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <errno.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <ctype.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <netinet/in.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/linuxlist.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/talloc.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/gsm_utils.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/abis_nm.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/statistics.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/sgsn/gsm_data.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void gsm_abis_mo_reset(struct gsm_abis_mo *mo)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    mo->nm_state.operational = NM_OPSTATE_NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-  mo->nm_state.availability = NM_AVSTATE_POWER_OFF;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void gsm_mo_init(struct gsm_abis_mo *mo, struct gsm_bts *bts,</span><br><span style="color: hsl(0, 100%, 40%);">-                       uint8_t obj_class, uint8_t p1, uint8_t p2, uint8_t p3)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- mo->bts = bts;</span><br><span style="color: hsl(0, 100%, 40%);">-       mo->obj_class = obj_class;</span><br><span style="color: hsl(0, 100%, 40%);">-   mo->obj_inst.bts_nr = p1;</span><br><span style="color: hsl(0, 100%, 40%);">-    mo->obj_inst.trx_nr = p2;</span><br><span style="color: hsl(0, 100%, 40%);">-    mo->obj_inst.ts_nr = p3;</span><br><span style="color: hsl(0, 100%, 40%);">-     gsm_abis_mo_reset(mo);</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%);">-const struct value_string bts_attribute_names[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_VALUE_STRING(BTS_TYPE_VARIANT),</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_VALUE_STRING(BTS_SUB_MODEL),</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_VALUE_STRING(TRX_PHY_VERSION),</span><br><span style="color: hsl(0, 100%, 40%);">-     { 0, NULL }</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%);">-enum bts_attribute str2btsattr(const char *s)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     return get_string_value(bts_attribute_names, s);</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%);">-const char *btsatttr2str(enum bts_attribute v)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        return get_value_string(bts_attribute_names, v);</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%);">-const struct value_string osmo_bts_variant_names[_NUM_BTS_VARIANT + 1] = {</span><br><span style="color: hsl(0, 100%, 40%);">-     { BTS_UNKNOWN,          "unknown" },</span><br><span style="color: hsl(0, 100%, 40%);">-  { BTS_OSMO_LITECELL15,  "osmo-bts-lc15" },</span><br><span style="color: hsl(0, 100%, 40%);">-    { BTS_OSMO_OCTPHY,      "osmo-bts-octphy" },</span><br><span style="color: hsl(0, 100%, 40%);">-  { BTS_OSMO_SYSMO,       "osmo-bts-sysmo" },</span><br><span style="color: hsl(0, 100%, 40%);">-   { BTS_OSMO_TRX,         "omso-bts-trx" },</span><br><span style="color: hsl(0, 100%, 40%);">-     { 0, NULL }</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%);">-enum gsm_bts_type_variant str2btsvariant(const char *arg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- return get_string_value(osmo_bts_variant_names, arg);</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%);">-const char *btsvariant2str(enum gsm_bts_type_variant v)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  return get_value_string(osmo_bts_variant_names, v);</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%);">-const struct value_string bts_type_names[_NUM_GSM_BTS_TYPE + 1] = {</span><br><span style="color: hsl(0, 100%, 40%);">- { GSM_BTS_TYPE_UNKNOWN,         "unknown" },</span><br><span style="color: hsl(0, 100%, 40%);">-  { GSM_BTS_TYPE_BS11,            "bs11" },</span><br><span style="color: hsl(0, 100%, 40%);">-     { GSM_BTS_TYPE_NANOBTS,         "nanobts" },</span><br><span style="color: hsl(0, 100%, 40%);">-  { GSM_BTS_TYPE_RBS2000,         "rbs2000" },</span><br><span style="color: hsl(0, 100%, 40%);">-  { GSM_BTS_TYPE_NOKIA_SITE,      "nokia_site" },</span><br><span style="color: hsl(0, 100%, 40%);">-       { GSM_BTS_TYPE_OSMOBTS,         "sysmobts" },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, NULL }</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%);">-enum gsm_bts_type str2btstype(const char *arg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    return get_string_value(bts_type_names, arg);</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%);">-const char *btstype2str(enum gsm_bts_type type)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  return get_value_string(bts_type_names, type);</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%);">-const struct value_string gsm_bts_features_descs[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-   { BTS_FEAT_HSCSD,               "HSCSD" },</span><br><span style="color: hsl(0, 100%, 40%);">-    { BTS_FEAT_GPRS,                "GPRS" },</span><br><span style="color: hsl(0, 100%, 40%);">-     { BTS_FEAT_EGPRS,               "EGPRS" },</span><br><span style="color: hsl(0, 100%, 40%);">-    { BTS_FEAT_ECSD,                "ECSD" },</span><br><span style="color: hsl(0, 100%, 40%);">-     { BTS_FEAT_HOPPING,             "Frequency Hopping" },</span><br><span style="color: hsl(0, 100%, 40%);">-        { BTS_FEAT_MULTI_TSC,           "Multi-TSC" },</span><br><span style="color: hsl(0, 100%, 40%);">-        { BTS_FEAT_OML_ALERTS,          "OML Alerts" },</span><br><span style="color: hsl(0, 100%, 40%);">-       { BTS_FEAT_AGCH_PCH_PROP,       "AGCH/PCH proportional allocation" },</span><br><span style="color: hsl(0, 100%, 40%);">- { BTS_FEAT_CBCH,                "CBCH" },</span><br><span style="color: hsl(0, 100%, 40%);">-     { 0, NULL }</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%);">-const struct value_string gsm_chreq_descs[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-    { GSM_CHREQ_REASON_EMERG,       "emergency call" },</span><br><span style="color: hsl(0, 100%, 40%);">-   { GSM_CHREQ_REASON_PAG,         "answer to paging" },</span><br><span style="color: hsl(0, 100%, 40%);">- { GSM_CHREQ_REASON_CALL,        "call re-establishment" },</span><br><span style="color: hsl(0, 100%, 40%);">-    { GSM_CHREQ_REASON_LOCATION_UPD,"Location updating" },</span><br><span style="color: hsl(0, 100%, 40%);">-        { GSM_CHREQ_REASON_PDCH,        "one phase packet access" },</span><br><span style="color: hsl(0, 100%, 40%);">-  { GSM_CHREQ_REASON_OTHER,       "other" },</span><br><span style="color: hsl(0, 100%, 40%);">-    { 0,                            NULL }</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%);">-const struct value_string gsm_pchant_names[13] = {</span><br><span style="color: hsl(0, 100%, 40%);">-      { GSM_PCHAN_NONE,       "NONE" },</span><br><span style="color: hsl(0, 100%, 40%);">-     { GSM_PCHAN_CCCH,       "CCCH" },</span><br><span style="color: hsl(0, 100%, 40%);">-     { GSM_PCHAN_CCCH_SDCCH4,"CCCH+SDCCH4" },</span><br><span style="color: hsl(0, 100%, 40%);">-      { GSM_PCHAN_TCH_F,      "TCH/F" },</span><br><span style="color: hsl(0, 100%, 40%);">-    { GSM_PCHAN_TCH_H,      "TCH/H" },</span><br><span style="color: hsl(0, 100%, 40%);">-    { GSM_PCHAN_SDCCH8_SACCH8C, "SDCCH8" },</span><br><span style="color: hsl(0, 100%, 40%);">-       { GSM_PCHAN_PDCH,       "PDCH" },</span><br><span style="color: hsl(0, 100%, 40%);">-     { GSM_PCHAN_TCH_F_PDCH, "TCH/F_PDCH" },</span><br><span style="color: hsl(0, 100%, 40%);">-       { GSM_PCHAN_UNKNOWN,    "UNKNOWN" },</span><br><span style="color: hsl(0, 100%, 40%);">-  { GSM_PCHAN_CCCH_SDCCH4_CBCH, "CCCH+SDCCH4+CBCH" },</span><br><span style="color: hsl(0, 100%, 40%);">-   { GSM_PCHAN_SDCCH8_SACCH8C_CBCH, "SDCCH8+CBCH" },</span><br><span style="color: hsl(0, 100%, 40%);">-     { GSM_PCHAN_TCH_F_TCH_H_PDCH, "TCH/F_TCH/H_PDCH" },</span><br><span style="color: hsl(0, 100%, 40%);">-   { 0,                    NULL }</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%);">-const struct value_string gsm_pchant_descs[13] = {</span><br><span style="color: hsl(0, 100%, 40%);">-      { GSM_PCHAN_NONE,       "Physical Channel not configured" },</span><br><span style="color: hsl(0, 100%, 40%);">-  { GSM_PCHAN_CCCH,       "FCCH + SCH + BCCH + CCCH (Comb. IV)" },</span><br><span style="color: hsl(0, 100%, 40%);">-      { GSM_PCHAN_CCCH_SDCCH4,</span><br><span style="color: hsl(0, 100%, 40%);">-                "FCCH + SCH + BCCH + CCCH + 4 SDCCH + 2 SACCH (Comb. V)" },</span><br><span style="color: hsl(0, 100%, 40%);">-   { GSM_PCHAN_TCH_F,      "TCH/F + FACCH/F + SACCH (Comb. I)" },</span><br><span style="color: hsl(0, 100%, 40%);">-        { GSM_PCHAN_TCH_H,      "2 TCH/H + 2 FACCH/H + 2 SACCH (Comb. II)" },</span><br><span style="color: hsl(0, 100%, 40%);">- { GSM_PCHAN_SDCCH8_SACCH8C, "8 SDCCH + 4 SACCH (Comb. VII)" },</span><br><span style="color: hsl(0, 100%, 40%);">-        { GSM_PCHAN_PDCH,       "Packet Data Channel for GPRS/EDGE" },</span><br><span style="color: hsl(0, 100%, 40%);">-        { GSM_PCHAN_TCH_F_PDCH, "Dynamic TCH/F or GPRS PDCH" },</span><br><span style="color: hsl(0, 100%, 40%);">-       { GSM_PCHAN_UNKNOWN,    "Unknown / Unsupported channel combination" },</span><br><span style="color: hsl(0, 100%, 40%);">-        { GSM_PCHAN_CCCH_SDCCH4_CBCH, "FCCH + SCH + BCCH + CCCH + CBCH + 3 SDCCH + 2 SACCH (Comb. V)" },</span><br><span style="color: hsl(0, 100%, 40%);">-      { GSM_PCHAN_SDCCH8_SACCH8C_CBCH, "7 SDCCH + 4 SACCH + CBCH (Comb. VII)" },</span><br><span style="color: hsl(0, 100%, 40%);">-    { GSM_PCHAN_TCH_F_TCH_H_PDCH, "Dynamic TCH/F or TCH/H or GPRS PDCH" },</span><br><span style="color: hsl(0, 100%, 40%);">-        { 0,                    NULL }</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%);">-const char *gsm_pchan_name(enum gsm_phys_chan_config c)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        return get_value_string(gsm_pchant_names, c);</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%);">-enum gsm_phys_chan_config gsm_pchan_parse(const char *name)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      return get_string_value(gsm_pchant_names, name);</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%);">-/* TODO: move to libosmocore, next to gsm_chan_t_names? */</span><br><span style="color: hsl(0, 100%, 40%);">-const char *gsm_lchant_name(enum gsm_chan_t c)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      return get_value_string(gsm_chan_t_names, c);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static const struct value_string lchan_s_names[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-      { LCHAN_S_NONE,         "NONE" },</span><br><span style="color: hsl(0, 100%, 40%);">-     { LCHAN_S_ACT_REQ,      "ACTIVATION REQUESTED" },</span><br><span style="color: hsl(0, 100%, 40%);">-     { LCHAN_S_ACTIVE,       "ACTIVE" },</span><br><span style="color: hsl(0, 100%, 40%);">-   { LCHAN_S_INACTIVE,     "INACTIVE" },</span><br><span style="color: hsl(0, 100%, 40%);">- { LCHAN_S_REL_REQ,      "RELEASE REQUESTED" },</span><br><span style="color: hsl(0, 100%, 40%);">-        { LCHAN_S_REL_ERR,      "RELEASE DUE ERROR" },</span><br><span style="color: hsl(0, 100%, 40%);">-        { LCHAN_S_BROKEN,       "BROKEN UNUSABLE" },</span><br><span style="color: hsl(0, 100%, 40%);">-  { 0,                    NULL }</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%);">-const char *gsm_lchans_name(enum gsm_lchan_state s)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    return get_value_string(lchan_s_names, s);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static const struct value_string chreq_names[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-   { GSM_CHREQ_REASON_EMERG,       "EMERGENCY" },</span><br><span style="color: hsl(0, 100%, 40%);">-        { GSM_CHREQ_REASON_PAG,         "PAGING" },</span><br><span style="color: hsl(0, 100%, 40%);">-   { GSM_CHREQ_REASON_CALL,        "CALL" },</span><br><span style="color: hsl(0, 100%, 40%);">-     { GSM_CHREQ_REASON_LOCATION_UPD,"LOCATION_UPDATE" },</span><br><span style="color: hsl(0, 100%, 40%);">-  { GSM_CHREQ_REASON_OTHER,       "OTHER" },</span><br><span style="color: hsl(0, 100%, 40%);">-    { 0,                            NULL }</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%);">-const char *gsm_chreq_name(enum gsm_chreq_reason_t c)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  return get_value_string(chreq_names, c);</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%);">-struct gsm_bts *gsm_bts_num(struct gsm_network *net, int num)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_bts *bts;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if (num >= net->num_bts)</span><br><span style="color: hsl(0, 100%, 40%);">-          return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    llist_for_each_entry(bts, &net->bts_list, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                if (bts->nr == num)</span><br><span style="color: hsl(0, 100%, 40%);">-                  return bts;</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%);">-       return NULL;</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%);">-struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gsm_bts_trx *trx = talloc_zero(bts, struct gsm_bts_trx);</span><br><span style="color: hsl(0, 100%, 40%);">- int k;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  if (!trx)</span><br><span style="color: hsl(0, 100%, 40%);">-               return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    trx->bts = bts;</span><br><span style="color: hsl(0, 100%, 40%);">-      trx->nr = bts->num_trx++;</span><br><span style="color: hsl(0, 100%, 40%);">- trx->mo.nm_state.administrative = NM_STATE_UNLOCKED;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_mo_init(&trx->mo, bts, NM_OC_RADIO_CARRIER,</span><br><span style="color: hsl(0, 100%, 40%);">-              bts->nr, trx->nr, 0xff);</span><br><span style="color: hsl(0, 100%, 40%);">-      gsm_mo_init(&trx->bb_transc.mo, bts, NM_OC_BASEB_TRANSC,</span><br><span style="color: hsl(0, 100%, 40%);">-             bts->nr, trx->nr, 0xff);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      for (k = 0; k < TRX_NR_TS; k++) {</span><br><span style="color: hsl(0, 100%, 40%);">-            struct gsm_bts_trx_ts *ts = &trx->ts[k];</span><br><span style="color: hsl(0, 100%, 40%);">-         int l;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          ts->trx = trx;</span><br><span style="color: hsl(0, 100%, 40%);">-               ts->nr = k;</span><br><span style="color: hsl(0, 100%, 40%);">-          ts->pchan = GSM_PCHAN_NONE;</span><br><span style="color: hsl(0, 100%, 40%);">-          ts->dyn.pchan_is = GSM_PCHAN_NONE;</span><br><span style="color: hsl(0, 100%, 40%);">-           ts->dyn.pchan_want = GSM_PCHAN_NONE;</span><br><span style="color: hsl(0, 100%, 40%);">-         ts->tsc = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                gsm_mo_init(&ts->mo, bts, NM_OC_CHANNEL,</span><br><span style="color: hsl(0, 100%, 40%);">-                     bts->nr, trx->nr, ts->nr);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         ts->hopping.arfcns.data_len = sizeof(ts->hopping.arfcns_data);</span><br><span style="color: hsl(0, 100%, 40%);">-            ts->hopping.arfcns.data = ts->hopping.arfcns_data;</span><br><span style="color: hsl(0, 100%, 40%);">-                ts->hopping.ma.data_len = sizeof(ts->hopping.ma_data);</span><br><span style="color: hsl(0, 100%, 40%);">-            ts->hopping.ma.data = ts->hopping.ma_data;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                for (l = 0; l < TS_MAX_LCHAN; l++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 struct gsm_lchan *lchan;</span><br><span style="color: hsl(0, 100%, 40%);">-                        char *name;</span><br><span style="color: hsl(0, 100%, 40%);">-                     lchan = &ts->lchan[l];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                   lchan->ts = ts;</span><br><span style="color: hsl(0, 100%, 40%);">-                      lchan->nr = l;</span><br><span style="color: hsl(0, 100%, 40%);">-                       lchan->type = GSM_LCHAN_NONE;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                        name = gsm_lchan_name_compute(lchan);</span><br><span style="color: hsl(0, 100%, 40%);">-                   lchan->name = talloc_strdup(trx, name);</span><br><span style="color: hsl(0, 100%, 40%);">-#ifndef ROLE_BSC</span><br><span style="color: hsl(0, 100%, 40%);">-                      INIT_LLIST_HEAD(&lchan->sapi_cmds);</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</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 (trx->nr != 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            trx->nominal_power = bts->c0->nominal_power;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   llist_add_tail(&trx->list, &bts->trx_list);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return trx;</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%);">-static const uint8_t bts_nse_timer_default[] = { 3, 3, 3, 3, 30, 3, 10 };</span><br><span style="color: hsl(0, 100%, 40%);">-static const uint8_t bts_cell_timer_default[] =</span><br><span style="color: hsl(0, 100%, 40%);">-                            { 3, 3, 3, 3, 3, 10, 3, 10, 3, 10, 3 };</span><br><span style="color: hsl(0, 100%, 40%);">-static const struct gprs_rlc_cfg rlc_cfg_default = {</span><br><span style="color: hsl(0, 100%, 40%);">-     .parameter = {</span><br><span style="color: hsl(0, 100%, 40%);">-          [RLC_T3142] = 20,</span><br><span style="color: hsl(0, 100%, 40%);">-               [RLC_T3169] = 5,</span><br><span style="color: hsl(0, 100%, 40%);">-                [RLC_T3191] = 5,</span><br><span style="color: hsl(0, 100%, 40%);">-                [RLC_T3193] = 160, /* 10ms */</span><br><span style="color: hsl(0, 100%, 40%);">-           [RLC_T3195] = 5,</span><br><span style="color: hsl(0, 100%, 40%);">-                [RLC_N3101] = 10,</span><br><span style="color: hsl(0, 100%, 40%);">-               [RLC_N3103] = 4,</span><br><span style="color: hsl(0, 100%, 40%);">-                [RLC_N3105] = 8,</span><br><span style="color: hsl(0, 100%, 40%);">-                [CV_COUNTDOWN] = 15,</span><br><span style="color: hsl(0, 100%, 40%);">-            [T_DL_TBF_EXT] = 250 * 10, /* ms */</span><br><span style="color: hsl(0, 100%, 40%);">-             [T_UL_TBF_EXT] = 250 * 10, /* ms */</span><br><span style="color: hsl(0, 100%, 40%);">-     },</span><br><span style="color: hsl(0, 100%, 40%);">-      .paging = {</span><br><span style="color: hsl(0, 100%, 40%);">-             .repeat_time = 5 * 50, /* ms */</span><br><span style="color: hsl(0, 100%, 40%);">-         .repeat_count = 3,</span><br><span style="color: hsl(0, 100%, 40%);">-      },</span><br><span style="color: hsl(0, 100%, 40%);">-      .cs_mask = 0x1fff,</span><br><span style="color: hsl(0, 100%, 40%);">-      .initial_cs = 2,</span><br><span style="color: hsl(0, 100%, 40%);">-        .initial_mcs = 6,</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%);">-struct gsm_bts *gsm_bts_alloc(void *ctx, uint8_t bts_num)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gsm_bts *bts = talloc_zero(ctx, struct gsm_bts);</span><br><span style="color: hsl(0, 100%, 40%);">- int i;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  if (!bts)</span><br><span style="color: hsl(0, 100%, 40%);">-               return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    bts->nr = bts_num;</span><br><span style="color: hsl(0, 100%, 40%);">-   bts->num_trx = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-    INIT_LLIST_HEAD(&bts->trx_list);</span><br><span style="color: hsl(0, 100%, 40%);">- bts->ms_max_power = 15;      /* dBm */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       gsm_mo_init(&bts->mo, bts, NM_OC_BTS,</span><br><span style="color: hsl(0, 100%, 40%);">-                    bts->nr, 0xff, 0xff);</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_mo_init(&bts->site_mgr.mo, bts, NM_OC_SITE_MANAGER,</span><br><span style="color: hsl(0, 100%, 40%);">-                  0xff, 0xff, 0xff);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      for (i = 0; i < ARRAY_SIZE(bts->gprs.nsvc); i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                bts->gprs.nsvc[i].bts = bts;</span><br><span style="color: hsl(0, 100%, 40%);">-         bts->gprs.nsvc[i].id = i;</span><br><span style="color: hsl(0, 100%, 40%);">-            gsm_mo_init(&bts->gprs.nsvc[i].mo, bts, NM_OC_GPRS_NSVC,</span><br><span style="color: hsl(0, 100%, 40%);">-                         bts->nr, i, 0xff);</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-       memcpy(&bts->gprs.nse.timer, bts_nse_timer_default,</span><br><span style="color: hsl(0, 100%, 40%);">-              sizeof(bts->gprs.nse.timer));</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_mo_init(&bts->gprs.nse.mo, bts, NM_OC_GPRS_NSE,</span><br><span style="color: hsl(0, 100%, 40%);">-                      bts->nr, 0xff, 0xff);</span><br><span style="color: hsl(0, 100%, 40%);">-        memcpy(&bts->gprs.cell.timer, bts_cell_timer_default,</span><br><span style="color: hsl(0, 100%, 40%);">-            sizeof(bts->gprs.cell.timer));</span><br><span style="color: hsl(0, 100%, 40%);">-       gsm_mo_init(&bts->gprs.cell.mo, bts, NM_OC_GPRS_CELL,</span><br><span style="color: hsl(0, 100%, 40%);">-                    bts->nr, 0xff, 0xff);</span><br><span style="color: hsl(0, 100%, 40%);">-        memcpy(&bts->gprs.cell.rlc_cfg, &rlc_cfg_default,</span><br><span style="color: hsl(0, 100%, 40%);">-            sizeof(bts->gprs.cell.rlc_cfg));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* create our primary TRX */</span><br><span style="color: hsl(0, 100%, 40%);">-    bts->c0 = gsm_bts_trx_alloc(bts);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!bts->c0) {</span><br><span style="color: hsl(0, 100%, 40%);">-              talloc_free(bts);</span><br><span style="color: hsl(0, 100%, 40%);">-               return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       bts->c0->ts[0].pchan = GSM_PCHAN_CCCH_SDCCH4;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     bts->rach_b_thresh = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-     bts->rach_ldavg_slots = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-  bts->paging.free_chans_need = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-    bts->features.data = &bts->_features_data[0];</span><br><span style="color: hsl(0, 100%, 40%);">- bts->features.data_len = sizeof(bts->_features_data);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* si handling */</span><br><span style="color: hsl(0, 100%, 40%);">-       bts->bcch_change_mark = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   return bts;</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%);">-/* reset the state of all MO in the BTS */</span><br><span style="color: hsl(0, 100%, 40%);">-void gsm_bts_mo_reset(struct gsm_bts *bts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       struct gsm_bts_trx *trx;</span><br><span style="color: hsl(0, 100%, 40%);">-        unsigned int i;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_abis_mo_reset(&bts->mo);</span><br><span style="color: hsl(0, 100%, 40%);">-     gsm_abis_mo_reset(&bts->site_mgr.mo);</span><br><span style="color: hsl(0, 100%, 40%);">-    for (i = 0; i < ARRAY_SIZE(bts->gprs.nsvc); i++)</span><br><span style="color: hsl(0, 100%, 40%);">-          gsm_abis_mo_reset(&bts->gprs.nsvc[i].mo);</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_abis_mo_reset(&bts->gprs.nse.mo);</span><br><span style="color: hsl(0, 100%, 40%);">-    gsm_abis_mo_reset(&bts->gprs.cell.mo);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   llist_for_each_entry(trx, &bts->trx_list, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                gsm_abis_mo_reset(&trx->mo);</span><br><span style="color: hsl(0, 100%, 40%);">-             gsm_abis_mo_reset(&trx->bb_transc.mo);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-           for (i = 0; i < ARRAY_SIZE(trx->ts); i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       struct gsm_bts_trx_ts *ts = &trx->ts[i];</span><br><span style="color: hsl(0, 100%, 40%);">-                 gsm_abis_mo_reset(&ts->mo);</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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_bts_trx *gsm_bts_trx_num(const struct gsm_bts *bts, int num)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gsm_bts_trx *trx;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (num >= bts->num_trx)</span><br><span style="color: hsl(0, 100%, 40%);">-          return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    llist_for_each_entry(trx, &bts->trx_list, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                if (trx->nr == num)</span><br><span style="color: hsl(0, 100%, 40%);">-                  return trx;</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%);">-       return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char ts2str[255];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-char *gsm_trx_name(const struct gsm_bts_trx *trx)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- if (!trx)</span><br><span style="color: hsl(0, 100%, 40%);">-               snprintf(ts2str, sizeof(ts2str), "(trx=NULL)");</span><br><span style="color: hsl(0, 100%, 40%);">-       else</span><br><span style="color: hsl(0, 100%, 40%);">-            snprintf(ts2str, sizeof(ts2str), "(bts=%d,trx=%d)",</span><br><span style="color: hsl(0, 100%, 40%);">-                    trx->bts->nr, trx->nr);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return ts2str;</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%);">-char *gsm_ts_name(const struct gsm_bts_trx_ts *ts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      snprintf(ts2str, sizeof(ts2str), "(bts=%d,trx=%d,ts=%d)",</span><br><span style="color: hsl(0, 100%, 40%);">-              ts->trx->bts->nr, ts->trx->nr, ts->nr);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      return ts2str;</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%);">-/*! Log timeslot number with full pchan information */</span><br><span style="color: hsl(0, 100%, 40%);">-char *gsm_ts_and_pchan_name(const struct gsm_bts_trx_ts *ts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      switch (ts->pchan) {</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM_PCHAN_TCH_F_TCH_H_PDCH:</span><br><span style="color: hsl(0, 100%, 40%);">-                if (ts->dyn.pchan_is == ts->dyn.pchan_want)</span><br><span style="color: hsl(0, 100%, 40%);">-                       snprintf(ts2str, sizeof(ts2str),</span><br><span style="color: hsl(0, 100%, 40%);">-                                 "(bts=%d,trx=%d,ts=%d,pchan=%s as %s)",</span><br><span style="color: hsl(0, 100%, 40%);">-                               ts->trx->bts->nr, ts->trx->nr, ts->nr,</span><br><span style="color: hsl(0, 100%, 40%);">-                                gsm_pchan_name(ts->pchan),</span><br><span style="color: hsl(0, 100%, 40%);">-                           gsm_pchan_name(ts->dyn.pchan_is));</span><br><span style="color: hsl(0, 100%, 40%);">-          else</span><br><span style="color: hsl(0, 100%, 40%);">-                    snprintf(ts2str, sizeof(ts2str),</span><br><span style="color: hsl(0, 100%, 40%);">-                                 "(bts=%d,trx=%d,ts=%d,pchan=%s"</span><br><span style="color: hsl(0, 100%, 40%);">-                               " switching %s -> %s)",</span><br><span style="color: hsl(0, 100%, 40%);">-                            ts->trx->bts->nr, ts->trx->nr, ts->nr,</span><br><span style="color: hsl(0, 100%, 40%);">-                                gsm_pchan_name(ts->pchan),</span><br><span style="color: hsl(0, 100%, 40%);">-                           gsm_pchan_name(ts->dyn.pchan_is),</span><br><span style="color: hsl(0, 100%, 40%);">-                            gsm_pchan_name(ts->dyn.pchan_want));</span><br><span style="color: hsl(0, 100%, 40%);">-                break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM_PCHAN_TCH_F_PDCH:</span><br><span style="color: hsl(0, 100%, 40%);">-              if ((ts->flags & TS_F_PDCH_PENDING_MASK) == 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                   snprintf(ts2str, sizeof(ts2str),</span><br><span style="color: hsl(0, 100%, 40%);">-                                 "(bts=%d,trx=%d,ts=%d,pchan=%s as %s)",</span><br><span style="color: hsl(0, 100%, 40%);">-                               ts->trx->bts->nr, ts->trx->nr, ts->nr,</span><br><span style="color: hsl(0, 100%, 40%);">-                                gsm_pchan_name(ts->pchan),</span><br><span style="color: hsl(0, 100%, 40%);">-                           (ts->flags & TS_F_PDCH_ACTIVE)? "PDCH"</span><br><span style="color: hsl(0, 100%, 40%);">-                                                               : "TCH/F");</span><br><span style="color: hsl(0, 100%, 40%);">-            else</span><br><span style="color: hsl(0, 100%, 40%);">-                    snprintf(ts2str, sizeof(ts2str),</span><br><span style="color: hsl(0, 100%, 40%);">-                                 "(bts=%d,trx=%d,ts=%d,pchan=%s"</span><br><span style="color: hsl(0, 100%, 40%);">-                               " switching %s -> %s)",</span><br><span style="color: hsl(0, 100%, 40%);">-                            ts->trx->bts->nr, ts->trx->nr, ts->nr,</span><br><span style="color: hsl(0, 100%, 40%);">-                                gsm_pchan_name(ts->pchan),</span><br><span style="color: hsl(0, 100%, 40%);">-                           (ts->flags & TS_F_PDCH_ACTIVE)? "PDCH"</span><br><span style="color: hsl(0, 100%, 40%);">-                                                               : "TCH/F",</span><br><span style="color: hsl(0, 100%, 40%);">-                              (ts->flags & TS_F_PDCH_ACT_PENDING)? "PDCH"</span><br><span style="color: hsl(0, 100%, 40%);">-                                                               : "TCH/F");</span><br><span style="color: hsl(0, 100%, 40%);">-               break;</span><br><span style="color: hsl(0, 100%, 40%);">-  default:</span><br><span style="color: hsl(0, 100%, 40%);">-                snprintf(ts2str, sizeof(ts2str), "(bts=%d,trx=%d,ts=%d,pchan=%s)",</span><br><span style="color: hsl(0, 100%, 40%);">-                     ts->trx->bts->nr, ts->trx->nr, ts->nr,</span><br><span style="color: hsl(0, 100%, 40%);">-                        gsm_pchan_name(ts->pchan));</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%);">-       return ts2str;</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%);">-char *gsm_lchan_name_compute(const struct gsm_lchan *lchan)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gsm_bts_trx_ts *ts = lchan->ts;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       snprintf(ts2str, sizeof(ts2str), "(bts=%d,trx=%d,ts=%d,ss=%d)",</span><br><span style="color: hsl(0, 100%, 40%);">-                ts->trx->bts->nr, ts->trx->nr, ts->nr, lchan->nr);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        return ts2str;</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%);">-/* obtain the MO structure for a given object instance */</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_abis_mo *</span><br><span style="color: hsl(0, 100%, 40%);">-gsm_objclass2mo(struct gsm_bts *bts, uint8_t obj_class,</span><br><span style="color: hsl(0, 100%, 40%);">-         const struct abis_om_obj_inst *obj_inst)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gsm_bts_trx *trx;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gsm_abis_mo *mo = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  switch (obj_class) {</span><br><span style="color: hsl(0, 100%, 40%);">-    case NM_OC_BTS:</span><br><span style="color: hsl(0, 100%, 40%);">-         mo = &bts->mo;</span><br><span style="color: hsl(0, 100%, 40%);">-           break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case NM_OC_RADIO_CARRIER:</span><br><span style="color: hsl(0, 100%, 40%);">-               if (obj_inst->trx_nr >= bts->num_trx) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-               trx = gsm_bts_trx_num(bts, obj_inst->trx_nr);</span><br><span style="color: hsl(0, 100%, 40%);">-                mo = &trx->mo;</span><br><span style="color: hsl(0, 100%, 40%);">-           break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case NM_OC_BASEB_TRANSC:</span><br><span style="color: hsl(0, 100%, 40%);">-                if (obj_inst->trx_nr >= bts->num_trx) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-               trx = gsm_bts_trx_num(bts, obj_inst->trx_nr);</span><br><span style="color: hsl(0, 100%, 40%);">-                mo = &trx->bb_transc.mo;</span><br><span style="color: hsl(0, 100%, 40%);">-         break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case NM_OC_CHANNEL:</span><br><span style="color: hsl(0, 100%, 40%);">-             if (obj_inst->trx_nr >= bts->num_trx) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-               trx = gsm_bts_trx_num(bts, obj_inst->trx_nr);</span><br><span style="color: hsl(0, 100%, 40%);">-                if (obj_inst->ts_nr >= TRX_NR_TS)</span><br><span style="color: hsl(0, 100%, 40%);">-                 return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-            mo = &trx->ts[obj_inst->ts_nr].mo;</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case NM_OC_SITE_MANAGER:</span><br><span style="color: hsl(0, 100%, 40%);">-                mo = &bts->site_mgr.mo;</span><br><span style="color: hsl(0, 100%, 40%);">-          break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case NM_OC_BS11:</span><br><span style="color: hsl(0, 100%, 40%);">-                switch (obj_inst->bts_nr) {</span><br><span style="color: hsl(0, 100%, 40%);">-          case BS11_OBJ_CCLK:</span><br><span style="color: hsl(0, 100%, 40%);">-                     mo = &bts->bs11.cclk.mo;</span><br><span style="color: hsl(0, 100%, 40%);">-                 break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case BS11_OBJ_BBSIG:</span><br><span style="color: hsl(0, 100%, 40%);">-                    if (obj_inst->ts_nr > bts->num_trx)</span><br><span style="color: hsl(0, 100%, 40%);">-                            return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-                    trx = gsm_bts_trx_num(bts, obj_inst->trx_nr);</span><br><span style="color: hsl(0, 100%, 40%);">-                        mo = &trx->bs11.bbsig.mo;</span><br><span style="color: hsl(0, 100%, 40%);">-                        break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case BS11_OBJ_PA:</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (obj_inst->ts_nr > bts->num_trx)</span><br><span style="color: hsl(0, 100%, 40%);">-                            return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-                    trx = gsm_bts_trx_num(bts, obj_inst->trx_nr);</span><br><span style="color: hsl(0, 100%, 40%);">-                        mo = &trx->bs11.pa.mo;</span><br><span style="color: hsl(0, 100%, 40%);">-                   break;</span><br><span style="color: hsl(0, 100%, 40%);">-          default:</span><br><span style="color: hsl(0, 100%, 40%);">-                        return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-               break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case NM_OC_BS11_RACK:</span><br><span style="color: hsl(0, 100%, 40%);">-           mo = &bts->bs11.rack.mo;</span><br><span style="color: hsl(0, 100%, 40%);">-         break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case NM_OC_BS11_ENVABTSE:</span><br><span style="color: hsl(0, 100%, 40%);">-               if (obj_inst->trx_nr >= ARRAY_SIZE(bts->bs11.envabtse))</span><br><span style="color: hsl(0, 100%, 40%);">-                        return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-            mo = &bts->bs11.envabtse[obj_inst->trx_nr].mo;</span><br><span style="color: hsl(0, 100%, 40%);">-                break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case NM_OC_GPRS_NSE:</span><br><span style="color: hsl(0, 100%, 40%);">-            mo = &bts->gprs.nse.mo;</span><br><span style="color: hsl(0, 100%, 40%);">-          break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case NM_OC_GPRS_CELL:</span><br><span style="color: hsl(0, 100%, 40%);">-           mo = &bts->gprs.cell.mo;</span><br><span style="color: hsl(0, 100%, 40%);">-         break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case NM_OC_GPRS_NSVC:</span><br><span style="color: hsl(0, 100%, 40%);">-           if (obj_inst->trx_nr >= ARRAY_SIZE(bts->gprs.nsvc))</span><br><span style="color: hsl(0, 100%, 40%);">-                    return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-            mo = &bts->gprs.nsvc[obj_inst->trx_nr].mo;</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%);">-       return mo;</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%);">-/* obtain the gsm_nm_state data structure for a given object instance */</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_nm_state *</span><br><span style="color: hsl(0, 100%, 40%);">-gsm_objclass2nmstate(struct gsm_bts *bts, uint8_t obj_class,</span><br><span style="color: hsl(0, 100%, 40%);">-             const struct abis_om_obj_inst *obj_inst)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gsm_abis_mo *mo;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- mo = gsm_objclass2mo(bts, obj_class, obj_inst);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!mo)</span><br><span style="color: hsl(0, 100%, 40%);">-                return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    return &mo->nm_state;</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%);">-/* obtain the in-memory data structure of a given object instance */</span><br><span style="color: hsl(0, 100%, 40%);">-void *</span><br><span style="color: hsl(0, 100%, 40%);">-gsm_objclass2obj(struct gsm_bts *bts, uint8_t obj_class,</span><br><span style="color: hsl(0, 100%, 40%);">-      const struct abis_om_obj_inst *obj_inst)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  struct gsm_bts_trx *trx;</span><br><span style="color: hsl(0, 100%, 40%);">-        void *obj = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       switch (obj_class) {</span><br><span style="color: hsl(0, 100%, 40%);">-    case NM_OC_BTS:</span><br><span style="color: hsl(0, 100%, 40%);">-         obj = bts;</span><br><span style="color: hsl(0, 100%, 40%);">-              break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case NM_OC_RADIO_CARRIER:</span><br><span style="color: hsl(0, 100%, 40%);">-               if (obj_inst->trx_nr >= bts->num_trx) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-               trx = gsm_bts_trx_num(bts, obj_inst->trx_nr);</span><br><span style="color: hsl(0, 100%, 40%);">-                obj = trx;</span><br><span style="color: hsl(0, 100%, 40%);">-              break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case NM_OC_BASEB_TRANSC:</span><br><span style="color: hsl(0, 100%, 40%);">-                if (obj_inst->trx_nr >= bts->num_trx) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-               trx = gsm_bts_trx_num(bts, obj_inst->trx_nr);</span><br><span style="color: hsl(0, 100%, 40%);">-                obj = &trx->bb_transc;</span><br><span style="color: hsl(0, 100%, 40%);">-           break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case NM_OC_CHANNEL:</span><br><span style="color: hsl(0, 100%, 40%);">-             if (obj_inst->trx_nr >= bts->num_trx) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-               trx = gsm_bts_trx_num(bts, obj_inst->trx_nr);</span><br><span style="color: hsl(0, 100%, 40%);">-                if (obj_inst->ts_nr >= TRX_NR_TS)</span><br><span style="color: hsl(0, 100%, 40%);">-                 return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-            obj = &trx->ts[obj_inst->ts_nr];</span><br><span style="color: hsl(0, 100%, 40%);">-              break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case NM_OC_SITE_MANAGER:</span><br><span style="color: hsl(0, 100%, 40%);">-                obj = &bts->site_mgr;</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case NM_OC_GPRS_NSE:</span><br><span style="color: hsl(0, 100%, 40%);">-            obj = &bts->gprs.nse;</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case NM_OC_GPRS_CELL:</span><br><span style="color: hsl(0, 100%, 40%);">-           obj = &bts->gprs.cell;</span><br><span style="color: hsl(0, 100%, 40%);">-           break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case NM_OC_GPRS_NSVC:</span><br><span style="color: hsl(0, 100%, 40%);">-           if (obj_inst->trx_nr >= ARRAY_SIZE(bts->gprs.nsvc))</span><br><span style="color: hsl(0, 100%, 40%);">-                    return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-            obj = &bts->gprs.nsvc[obj_inst->trx_nr];</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%);">-       return obj;</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%);">-/* See Table 10.5.25 of GSM04.08 */</span><br><span style="color: hsl(0, 100%, 40%);">-uint8_t gsm_pchan2chan_nr(enum gsm_phys_chan_config pchan,</span><br><span style="color: hsl(0, 100%, 40%);">-                         uint8_t ts_nr, uint8_t lchan_nr)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     uint8_t cbits, chan_nr;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- switch (pchan) {</span><br><span style="color: hsl(0, 100%, 40%);">-        case GSM_PCHAN_TCH_F:</span><br><span style="color: hsl(0, 100%, 40%);">-   case GSM_PCHAN_TCH_F_PDCH:</span><br><span style="color: hsl(0, 100%, 40%);">-              OSMO_ASSERT(lchan_nr == 0);</span><br><span style="color: hsl(0, 100%, 40%);">-             cbits = 0x01;</span><br><span style="color: hsl(0, 100%, 40%);">-           break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM_PCHAN_PDCH:</span><br><span style="color: hsl(0, 100%, 40%);">-            OSMO_ASSERT(lchan_nr == 0);</span><br><span style="color: hsl(0, 100%, 40%);">-             cbits = RSL_CHAN_OSMO_PDCH >> 3;</span><br><span style="color: hsl(0, 100%, 40%);">-          break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM_PCHAN_TCH_H:</span><br><span style="color: hsl(0, 100%, 40%);">-           OSMO_ASSERT(lchan_nr < 2);</span><br><span style="color: hsl(0, 100%, 40%);">-           cbits = 0x02;</span><br><span style="color: hsl(0, 100%, 40%);">-           cbits += lchan_nr;</span><br><span style="color: hsl(0, 100%, 40%);">-              break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM_PCHAN_CCCH_SDCCH4:</span><br><span style="color: hsl(0, 100%, 40%);">-     case GSM_PCHAN_CCCH_SDCCH4_CBCH:</span><br><span style="color: hsl(0, 100%, 40%);">-                /*</span><br><span style="color: hsl(0, 100%, 40%);">-               * As a special hack for BCCH, lchan_nr == 4 may be passed</span><br><span style="color: hsl(0, 100%, 40%);">-               * here. This should never be sent in an RSL message.</span><br><span style="color: hsl(0, 100%, 40%);">-            * See osmo-bts-xxx/oml.c:opstart_compl().</span><br><span style="color: hsl(0, 100%, 40%);">-               */</span><br><span style="color: hsl(0, 100%, 40%);">-             if (lchan_nr == CCCH_LCHAN)</span><br><span style="color: hsl(0, 100%, 40%);">-                     chan_nr = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-            else</span><br><span style="color: hsl(0, 100%, 40%);">-                    OSMO_ASSERT(lchan_nr < 4);</span><br><span style="color: hsl(0, 100%, 40%);">-           cbits = 0x04;</span><br><span style="color: hsl(0, 100%, 40%);">-           cbits += lchan_nr;</span><br><span style="color: hsl(0, 100%, 40%);">-              break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM_PCHAN_SDCCH8_SACCH8C:</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM_PCHAN_SDCCH8_SACCH8C_CBCH:</span><br><span style="color: hsl(0, 100%, 40%);">-             OSMO_ASSERT(lchan_nr < 8);</span><br><span style="color: hsl(0, 100%, 40%);">-           cbits = 0x08;</span><br><span style="color: hsl(0, 100%, 40%);">-           cbits += lchan_nr;</span><br><span style="color: hsl(0, 100%, 40%);">-              break;</span><br><span style="color: hsl(0, 100%, 40%);">-  default:</span><br><span style="color: hsl(0, 100%, 40%);">-        case GSM_PCHAN_CCCH:</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef ROLE_BSC</span><br><span style="color: hsl(0, 100%, 40%);">-             OSMO_ASSERT(lchan_nr == 0);</span><br><span style="color: hsl(0, 100%, 40%);">-#else</span><br><span style="color: hsl(0, 100%, 40%);">-                /*</span><br><span style="color: hsl(0, 100%, 40%);">-               * FIXME: On octphy and litecell, we hit above assertion (see</span><br><span style="color: hsl(0, 100%, 40%);">-            * Max's comment at https://gerrit.osmocom.org/589 ); disabled</span><br><span style="color: hsl(0, 100%, 40%);">-               * for BTS until this is clarified; remove the #ifdef when it</span><br><span style="color: hsl(0, 100%, 40%);">-            * is fixed.</span><br><span style="color: hsl(0, 100%, 40%);">-             */</span><br><span style="color: hsl(0, 100%, 40%);">-#warning "fix caller that passes lchan_nr != 0"</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-              cbits = 0x10;</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%);">-       chan_nr = (cbits << 3) | (ts_nr & 0x7);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return chan_nr;</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%);">-uint8_t gsm_lchan2chan_nr(const struct gsm_lchan *lchan)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       enum gsm_phys_chan_config pchan = lchan->ts->pchan;</span><br><span style="color: hsl(0, 100%, 40%);">-       if (pchan == GSM_PCHAN_TCH_F_TCH_H_PDCH)</span><br><span style="color: hsl(0, 100%, 40%);">-                return gsm_lchan_as_pchan2chan_nr(lchan,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                  lchan->ts->dyn.pchan_is);</span><br><span style="color: hsl(0, 100%, 40%);">-       return gsm_pchan2chan_nr(lchan->ts->pchan, lchan->ts->nr, lchan->nr);</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%);">-uint8_t gsm_lchan_as_pchan2chan_nr(const struct gsm_lchan *lchan,</span><br><span style="color: hsl(0, 100%, 40%);">-                             enum gsm_phys_chan_config as_pchan)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- if (lchan->ts->pchan == GSM_PCHAN_TCH_F_TCH_H_PDCH</span><br><span style="color: hsl(0, 100%, 40%);">-            && as_pchan == GSM_PCHAN_PDCH)</span><br><span style="color: hsl(0, 100%, 40%);">-              return RSL_CHAN_OSMO_PDCH | (lchan->ts->nr & ~RSL_CHAN_NR_MASK);</span><br><span style="color: hsl(0, 100%, 40%);">-      return gsm_pchan2chan_nr(as_pchan, lchan->ts->nr, lchan->nr);</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%);">-/* return the gsm_lchan for the CBCH (if it exists at all) */</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_lchan *gsm_bts_get_cbch(struct gsm_bts *bts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gsm_lchan *lchan = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_bts_trx *trx = bts->c0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   if (trx->ts[0].pchan == GSM_PCHAN_CCCH_SDCCH4_CBCH)</span><br><span style="color: hsl(0, 100%, 40%);">-          lchan = &trx->ts[0].lchan[2];</span><br><span style="color: hsl(0, 100%, 40%);">-    else {</span><br><span style="color: hsl(0, 100%, 40%);">-          int i;</span><br><span style="color: hsl(0, 100%, 40%);">-          for (i = 0; i < 8; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    if (trx->ts[i].pchan == GSM_PCHAN_SDCCH8_SACCH8C_CBCH) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             lchan = &trx->ts[i].lchan[2];</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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return lchan;</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%);">-/* determine logical channel based on TRX and channel number IE */</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_lchan *rsl_lchan_lookup(struct gsm_bts_trx *trx, uint8_t chan_nr,</span><br><span style="color: hsl(0, 100%, 40%);">-                               int *rc)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    uint8_t ts_nr = chan_nr & 0x07;</span><br><span style="color: hsl(0, 100%, 40%);">-     uint8_t cbits = chan_nr >> 3;</span><br><span style="color: hsl(0, 100%, 40%);">-     uint8_t lch_idx;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gsm_bts_trx_ts *ts = &trx->ts[ts_nr];</span><br><span style="color: hsl(0, 100%, 40%);">-     bool ok = true;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc)</span><br><span style="color: hsl(0, 100%, 40%);">-         *rc = -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  if (cbits == 0x01) {</span><br><span style="color: hsl(0, 100%, 40%);">-            lch_idx = 0;    /* TCH/F */     </span><br><span style="color: hsl(0, 100%, 40%);">-                if (ts->pchan != GSM_PCHAN_TCH_F &&</span><br><span style="color: hsl(0, 100%, 40%);">-              ts->pchan != GSM_PCHAN_PDCH &&</span><br><span style="color: hsl(0, 100%, 40%);">-               ts->pchan != GSM_PCHAN_TCH_F_PDCH</span><br><span style="color: hsl(0, 100%, 40%);">-                    && !(ts->pchan == GSM_PCHAN_TCH_F_TCH_H_PDCH</span><br><span style="color: hsl(0, 100%, 40%);">-                      && (ts->dyn.pchan_is == GSM_PCHAN_TCH_F</span><br><span style="color: hsl(0, 100%, 40%);">-                          || ts->dyn.pchan_want == GSM_PCHAN_TCH_F)))</span><br><span style="color: hsl(0, 100%, 40%);">-                     ok = false;</span><br><span style="color: hsl(0, 100%, 40%);">-     } else if ((cbits & 0x1e) == 0x02) {</span><br><span style="color: hsl(0, 100%, 40%);">-                lch_idx = cbits & 0x1;      /* TCH/H */</span><br><span style="color: hsl(0, 100%, 40%);">-             if (ts->pchan != GSM_PCHAN_TCH_H</span><br><span style="color: hsl(0, 100%, 40%);">-                 && !(ts->pchan == GSM_PCHAN_TCH_F_TCH_H_PDCH</span><br><span style="color: hsl(0, 100%, 40%);">-                      && (ts->dyn.pchan_is == GSM_PCHAN_TCH_H</span><br><span style="color: hsl(0, 100%, 40%);">-                          || ts->dyn.pchan_want == GSM_PCHAN_TCH_H)))</span><br><span style="color: hsl(0, 100%, 40%);">-                     ok = false;</span><br><span style="color: hsl(0, 100%, 40%);">-     } else if ((cbits & 0x1c) == 0x04) {</span><br><span style="color: hsl(0, 100%, 40%);">-                lch_idx = cbits & 0x3;      /* SDCCH/4 */</span><br><span style="color: hsl(0, 100%, 40%);">-           if (ts->pchan != GSM_PCHAN_CCCH_SDCCH4 &&</span><br><span style="color: hsl(0, 100%, 40%);">-                ts->pchan != GSM_PCHAN_CCCH_SDCCH4_CBCH)</span><br><span style="color: hsl(0, 100%, 40%);">-                 ok = false;</span><br><span style="color: hsl(0, 100%, 40%);">-     } else if ((cbits & 0x18) == 0x08) {</span><br><span style="color: hsl(0, 100%, 40%);">-                lch_idx = cbits & 0x7;      /* SDCCH/8 */</span><br><span style="color: hsl(0, 100%, 40%);">-           if (ts->pchan != GSM_PCHAN_SDCCH8_SACCH8C &&</span><br><span style="color: hsl(0, 100%, 40%);">-             ts->pchan != GSM_PCHAN_SDCCH8_SACCH8C_CBCH)</span><br><span style="color: hsl(0, 100%, 40%);">-                      ok = false;</span><br><span style="color: hsl(0, 100%, 40%);">-     } else if (cbits == 0x10 || cbits == 0x11 || cbits == 0x12) {</span><br><span style="color: hsl(0, 100%, 40%);">-           lch_idx = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-            if (ts->pchan != GSM_PCHAN_CCCH &&</span><br><span style="color: hsl(0, 100%, 40%);">-               ts->pchan != GSM_PCHAN_CCCH_SDCCH4 &&</span><br><span style="color: hsl(0, 100%, 40%);">-                ts->pchan != GSM_PCHAN_CCCH_SDCCH4_CBCH)</span><br><span style="color: hsl(0, 100%, 40%);">-                 ok = false;</span><br><span style="color: hsl(0, 100%, 40%);">-             /* FIXME: we should not return first sdcch4 !!! */</span><br><span style="color: hsl(0, 100%, 40%);">-      } else if ((chan_nr & RSL_CHAN_NR_MASK) == RSL_CHAN_OSMO_PDCH) {</span><br><span style="color: hsl(0, 100%, 40%);">-            lch_idx = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-            if (ts->pchan != GSM_PCHAN_TCH_F_TCH_H_PDCH)</span><br><span style="color: hsl(0, 100%, 40%);">-                 ok = false;</span><br><span style="color: hsl(0, 100%, 40%);">-     } else</span><br><span style="color: hsl(0, 100%, 40%);">-          return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if (rc && ok)</span><br><span style="color: hsl(0, 100%, 40%);">-           *rc = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        return &ts->lchan[lch_idx];</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static const uint8_t subslots_per_pchan[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-        [GSM_PCHAN_NONE] = 0,</span><br><span style="color: hsl(0, 100%, 40%);">-   [GSM_PCHAN_CCCH] = 0,</span><br><span style="color: hsl(0, 100%, 40%);">-   [GSM_PCHAN_PDCH] = 0,</span><br><span style="color: hsl(0, 100%, 40%);">-   [GSM_PCHAN_CCCH_SDCCH4] = 4,</span><br><span style="color: hsl(0, 100%, 40%);">-    [GSM_PCHAN_TCH_F] = 1,</span><br><span style="color: hsl(0, 100%, 40%);">-  [GSM_PCHAN_TCH_H] = 2,</span><br><span style="color: hsl(0, 100%, 40%);">-  [GSM_PCHAN_SDCCH8_SACCH8C] = 8,</span><br><span style="color: hsl(0, 100%, 40%);">- [GSM_PCHAN_CCCH_SDCCH4_CBCH] = 4,</span><br><span style="color: hsl(0, 100%, 40%);">-       [GSM_PCHAN_SDCCH8_SACCH8C_CBCH] = 8,</span><br><span style="color: hsl(0, 100%, 40%);">-    /*</span><br><span style="color: hsl(0, 100%, 40%);">-       * GSM_PCHAN_TCH_F_PDCH and GSM_PCHAN_TCH_F_TCH_H_PDCH should not be</span><br><span style="color: hsl(0, 100%, 40%);">-     * part of this, those TS are handled according to their dynamic state.</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%);">-/*! Return the actual pchan type, also heeding dynamic TS. */</span><br><span style="color: hsl(0, 100%, 40%);">-enum gsm_phys_chan_config ts_pchan(struct gsm_bts_trx_ts *ts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        switch (ts->pchan) {</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM_PCHAN_TCH_F_TCH_H_PDCH:</span><br><span style="color: hsl(0, 100%, 40%);">-                return ts->dyn.pchan_is;</span><br><span style="color: hsl(0, 100%, 40%);">-     case GSM_PCHAN_TCH_F_PDCH:</span><br><span style="color: hsl(0, 100%, 40%);">-              if (ts->flags & TS_F_PDCH_ACTIVE)</span><br><span style="color: hsl(0, 100%, 40%);">-                        return GSM_PCHAN_PDCH;</span><br><span style="color: hsl(0, 100%, 40%);">-          else</span><br><span style="color: hsl(0, 100%, 40%);">-                    return GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">-                return ts->pchan;</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%);">-/*! According to ts->pchan and possibly ts->dyn_pchan, return the number of</span><br><span style="color: hsl(0, 100%, 40%);">- * logical channels available in the timeslot. */</span><br><span style="color: hsl(0, 100%, 40%);">-uint8_t ts_subslots(struct gsm_bts_trx_ts *ts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     return subslots_per_pchan[ts_pchan(ts)];</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static bool pchan_is_tch(enum gsm_phys_chan_config pchan)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     switch (pchan) {</span><br><span style="color: hsl(0, 100%, 40%);">-        case GSM_PCHAN_TCH_F:</span><br><span style="color: hsl(0, 100%, 40%);">-   case GSM_PCHAN_TCH_H:</span><br><span style="color: hsl(0, 100%, 40%);">-           return true;</span><br><span style="color: hsl(0, 100%, 40%);">-    default:</span><br><span style="color: hsl(0, 100%, 40%);">-                return false;</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-bool ts_is_tch(struct gsm_bts_trx_ts *ts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    return pchan_is_tch(ts_pchan(ts));</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span>diff --git a/src/libcommon/gsm_subscriber_base.c b/src/libcommon/gsm_subscriber_base.c</span><br><span>deleted file mode 100644</span><br><span>index 2a8a59f..0000000</span><br><span>--- a/src/libcommon/gsm_subscriber_base.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,64 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* The concept of a subscriber as seen by the BSC */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* (C) 2008 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2009-2010 by Holger Hans Peter Freyther <zecke@selfish.org></span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2010 by On-Waves</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * All Rights Reserved</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(0, 100%, 40%);">- * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(0, 100%, 40%);">- * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(0, 100%, 40%);">- * (at your option) any later version.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(0, 100%, 40%);">- * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(0, 100%, 40%);">- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(0, 100%, 40%);">- * GNU Affero General Public License for more details.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(0, 100%, 40%);">- * along with this program.  If not, see <http://www.gnu.org/licenses/>.</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%);">-#include <unistd.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdlib.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdio.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <string.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <assert.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/talloc.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/utils.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/sgsn/gsm_subscriber.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/sgsn/debug.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/sgsn/vlr.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-LLIST_HEAD(active_subscribers);</span><br><span style="color: hsl(0, 100%, 40%);">-void *tall_subscr_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* return static buffer with printable name of VLR subscriber */</span><br><span style="color: hsl(0, 100%, 40%);">-const char *vlr_subscr_name(struct vlr_subscr *vsub)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   static char buf[32];</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!vsub)</span><br><span style="color: hsl(0, 100%, 40%);">-              return "unknown";</span><br><span style="color: hsl(0, 100%, 40%);">-     if (vsub->msisdn[0])</span><br><span style="color: hsl(0, 100%, 40%);">-         snprintf(buf, sizeof(buf), "MSISDN:%s", vsub->msisdn);</span><br><span style="color: hsl(0, 100%, 40%);">-     else if (vsub->imsi[0])</span><br><span style="color: hsl(0, 100%, 40%);">-              snprintf(buf, sizeof(buf), "IMSI:%s", vsub->imsi);</span><br><span style="color: hsl(0, 100%, 40%);">- else if (vsub->tmsi != GSM_RESERVED_TMSI)</span><br><span style="color: hsl(0, 100%, 40%);">-            snprintf(buf, sizeof(buf), "TMSI:0x%08x", vsub->tmsi);</span><br><span style="color: hsl(0, 100%, 40%);">-     else if (vsub->tmsi_new != GSM_RESERVED_TMSI)</span><br><span style="color: hsl(0, 100%, 40%);">-                snprintf(buf, sizeof(buf), "TMSI(new):0x%08x", vsub->tmsi_new);</span><br><span style="color: hsl(0, 100%, 40%);">-    else</span><br><span style="color: hsl(0, 100%, 40%);">-            return "unknown";</span><br><span style="color: hsl(0, 100%, 40%);">-     buf[sizeof(buf)-1] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-      return buf;</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%);">-const char *vlr_subscr_msisdn_or_name(struct vlr_subscr *vsub)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     if (!vsub || !vsub->msisdn[0])</span><br><span style="color: hsl(0, 100%, 40%);">-               return vlr_subscr_name(vsub);</span><br><span style="color: hsl(0, 100%, 40%);">-   return vsub->msisdn;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span>diff --git a/src/libcommon/gsup_client.c b/src/libcommon/gsup_client.c</span><br><span>deleted file mode 100644</span><br><span>index 0520045..0000000</span><br><span>--- a/src/libcommon/gsup_client.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,347 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* Generic Subscriber Update Protocol client */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* (C) 2014-2016 by Sysmocom s.f.m.c. GmbH</span><br><span style="color: hsl(0, 100%, 40%);">- * All Rights Reserved</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * Author: Jacob Erlbeck</span><br><span style="color: hsl(0, 100%, 40%);">- * Author: Neels Hofmeyr</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(0, 100%, 40%);">- * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(0, 100%, 40%);">- * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(0, 100%, 40%);">- * (at your option) any later version.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(0, 100%, 40%);">- * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(0, 100%, 40%);">- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(0, 100%, 40%);">- * GNU Affero General Public License for more details.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(0, 100%, 40%);">- * along with this program.  If not, see <http://www.gnu.org/licenses/>.</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%);">-#include <osmocom/sgsn/gsup_client.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/abis/ipa.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/protocol/ipaccess.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/msgb.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/logging.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/sgsn/debug.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <errno.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <string.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-extern void *tall_bsc_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void start_test_procedure(struct gsup_client *gsupc);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void gsup_client_send_ping(struct gsup_client *gsupc)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    struct msgb *msg = gsup_client_msgb_alloc();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    msg->l2h = msgb_put(msg, 1);</span><br><span style="color: hsl(0, 100%, 40%);">- msg->l2h[0] = IPAC_MSGT_PING;</span><br><span style="color: hsl(0, 100%, 40%);">-        ipa_msg_push_header(msg, IPAC_PROTO_IPACCESS);</span><br><span style="color: hsl(0, 100%, 40%);">-  ipa_client_conn_send(gsupc->link, msg);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int gsup_client_connect(struct gsup_client *gsupc)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (gsupc->is_connected)</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%);">-       if (osmo_timer_pending(&gsupc->connect_timer)) {</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGP(DLGSUP, LOGL_DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">-                     "GSUP connect: connect timer already running\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_timer_del(&gsupc->connect_timer);</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 (osmo_timer_pending(&gsupc->ping_timer)) {</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGP(DLGSUP, LOGL_DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">-                     "GSUP connect: ping timer already running\n");</span><br><span style="color: hsl(0, 100%, 40%);">-           osmo_timer_del(&gsupc->ping_timer);</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 (ipa_client_conn_clear_queue(gsupc->link) > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGP(DLGSUP, LOGL_DEBUG, "GSUP connect: discarded stored messages\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        rc = ipa_client_conn_open(gsupc->link);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (rc >= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGP(DLGSUP, LOGL_NOTICE, "GSUP connecting to %s:%d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                    gsupc->link->addr, gsupc->link->port);</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 style="color: hsl(0, 100%, 40%);">-       LOGP(DLGSUP, LOGL_ERROR, "GSUP failed to connect to %s:%d: %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-          gsupc->link->addr, gsupc->link->port, strerror(-rc));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  if (rc == -EBADF || rc == -ENOTSOCK || rc == -EAFNOSUPPORT ||</span><br><span style="color: hsl(0, 100%, 40%);">-       rc == -EINVAL)</span><br><span style="color: hsl(0, 100%, 40%);">-              return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      osmo_timer_schedule(&gsupc->connect_timer,</span><br><span style="color: hsl(0, 100%, 40%);">-                           GSUP_CLIENT_RECONNECT_INTERVAL, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DLGSUP, LOGL_INFO, "Scheduled timer to retry GSUP connect to %s:%d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-        gsupc->link->addr, gsupc->link->port);</span><br><span style="color: hsl(0, 100%, 40%);">-</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 style="color: hsl(0, 100%, 40%);">-static void connect_timer_cb(void *gsupc_)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gsup_client *gsupc = gsupc_;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     if (gsupc->is_connected)</span><br><span style="color: hsl(0, 100%, 40%);">-             return;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- gsup_client_connect(gsupc);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void client_send(struct gsup_client *gsupc, int proto_ext,</span><br><span style="color: hsl(0, 100%, 40%);">-                   struct msgb *msg_tx)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   ipa_prepend_header_ext(msg_tx, proto_ext);</span><br><span style="color: hsl(0, 100%, 40%);">-      ipa_msg_push_header(msg_tx, IPAC_PROTO_OSMO);</span><br><span style="color: hsl(0, 100%, 40%);">-   ipa_client_conn_send(gsupc->link, msg_tx);</span><br><span style="color: hsl(0, 100%, 40%);">-   /* msg_tx is now queued and will be freed. */</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void gsup_client_oap_register(struct gsup_client *gsupc)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  struct msgb *msg_tx;</span><br><span style="color: hsl(0, 100%, 40%);">-    int rc;</span><br><span style="color: hsl(0, 100%, 40%);">- rc = osmo_oap_client_register(&gsupc->oap_state, &msg_tx);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   if ((rc < 0) || (!msg_tx)) {</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGP(DLGSUP, LOGL_ERROR, "GSUP OAP set up, but cannot register.\n");</span><br><span style="color: hsl(0, 100%, 40%);">-          return;</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%);">-       client_send(gsupc, IPAC_PROTO_EXT_OAP, msg_tx);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void gsup_client_updown_cb(struct ipa_client_conn *link, int up)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gsup_client *gsupc = link->data;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      LOGP(DLGSUP, LOGL_INFO, "GSUP link to %s:%d %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                 link->addr, link->port, up ? "UP" : "DOWN");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     gsupc->is_connected = up;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if (up) {</span><br><span style="color: hsl(0, 100%, 40%);">-               start_test_procedure(gsupc);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            if (gsupc->osmo_oap_state.state == OSMO_OAP_INITIALIZED)</span><br><span style="color: hsl(0, 100%, 40%);">-                     gsup_client_oap_register(gsupc);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_timer_del(&gsupc->connect_timer);</span><br><span style="color: hsl(0, 100%, 40%);">-   } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_timer_del(&gsupc->ping_timer);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              osmo_timer_schedule(&gsupc->connect_timer,</span><br><span style="color: hsl(0, 100%, 40%);">-                                   GSUP_CLIENT_RECONNECT_INTERVAL, 0);</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%);">-static int gsup_client_oap_handle(struct gsup_client *gsupc, struct msgb *msg_rx)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    int rc;</span><br><span style="color: hsl(0, 100%, 40%);">- struct msgb *msg_tx;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* If the oap_state is disabled, this will reject the messages. */</span><br><span style="color: hsl(0, 100%, 40%);">-      rc = osmo_oap_client_handle(&gsupc->oap_state, msg_rx, &msg_tx);</span><br><span style="color: hsl(0, 100%, 40%);">-     msgb_free(msg_rx);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (rc < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (msg_tx)</span><br><span style="color: hsl(0, 100%, 40%);">-             client_send(gsupc, IPAC_PROTO_EXT_OAP, msg_tx);</span><br><span style="color: hsl(0, 100%, 40%);">-</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 style="color: hsl(0, 100%, 40%);">-static int gsup_client_read_cb(struct ipa_client_conn *link, struct msgb *msg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       struct ipaccess_head *hh = (struct ipaccess_head *) msg->data;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct ipaccess_head_ext *he = (struct ipaccess_head_ext *) msgb_l2(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-       struct gsup_client *gsupc = (struct gsup_client *)link->data;</span><br><span style="color: hsl(0, 100%, 40%);">-        int rc;</span><br><span style="color: hsl(0, 100%, 40%);">- struct ipaccess_unit ipa_dev = {</span><br><span style="color: hsl(0, 100%, 40%);">-                /* see gsup_client_create() on const vs non-const */</span><br><span style="color: hsl(0, 100%, 40%);">-            .unit_name = (char*)gsupc->unit_name,</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%);">-      OSMO_ASSERT(ipa_dev.unit_name);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- msg->l2h = &hh->data[0];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      rc = ipaccess_bts_handle_ccm(link, &ipa_dev, msg);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGP(DLGSUP, LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">-                    "GSUP received an invalid IPA/CCM message from %s:%d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-              link->addr, link->port);</span><br><span style="color: hsl(0, 100%, 40%);">-             /* Link has been closed */</span><br><span style="color: hsl(0, 100%, 40%);">-              gsupc->is_connected = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-             msgb_free(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-         return -1;</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 (rc == 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-          uint8_t msg_type = *(msg->l2h);</span><br><span style="color: hsl(0, 100%, 40%);">-              /* CCM message */</span><br><span style="color: hsl(0, 100%, 40%);">-               if (msg_type == IPAC_MSGT_PONG) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       LOGP(DLGSUP, LOGL_DEBUG, "GSUP receiving PONG\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                    gsupc->got_ipa_pong = 1;</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%);">-               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 style="color: hsl(0, 100%, 40%);">-       if (hh->proto != IPAC_PROTO_OSMO)</span><br><span style="color: hsl(0, 100%, 40%);">-            goto invalid;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   if (!he || msgb_l2len(msg) < sizeof(*he))</span><br><span style="color: hsl(0, 100%, 40%);">-            goto invalid;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   msg->l2h = &he->data[0];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (he->proto == IPAC_PROTO_EXT_GSUP) {</span><br><span style="color: hsl(0, 100%, 40%);">-              OSMO_ASSERT(gsupc->read_cb != NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-         gsupc->read_cb(gsupc, msg);</span><br><span style="color: hsl(0, 100%, 40%);">-          /* expecting read_cb() to free msg */</span><br><span style="color: hsl(0, 100%, 40%);">-   } else if (he->proto == IPAC_PROTO_EXT_OAP) {</span><br><span style="color: hsl(0, 100%, 40%);">-                return gsup_client_oap_handle(gsupc, msg);</span><br><span style="color: hsl(0, 100%, 40%);">-              /* gsup_client_oap_handle frees msg */</span><br><span style="color: hsl(0, 100%, 40%);">-  } else</span><br><span style="color: hsl(0, 100%, 40%);">-          goto invalid;</span><br><span style="color: hsl(0, 100%, 40%);">-</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%);">-invalid:</span><br><span style="color: hsl(0, 100%, 40%);">-       LOGP(DLGSUP, LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">-            "GSUP received an invalid IPA message from %s:%d, size = %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-       link->addr, link->port, msgb_length(msg));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   msgb_free(msg);</span><br><span style="color: hsl(0, 100%, 40%);">- return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void ping_timer_cb(void *gsupc_)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gsup_client *gsupc = gsupc_;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     LOGP(DLGSUP, LOGL_INFO, "GSUP ping callback (%s, %s PONG)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-      gsupc->is_connected ? "connected" : "not connected",</span><br><span style="color: hsl(0, 100%, 40%);">-             gsupc->got_ipa_pong ? "got" : "didn't get");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if (gsupc->got_ipa_pong) {</span><br><span style="color: hsl(0, 100%, 40%);">-           start_test_procedure(gsupc);</span><br><span style="color: hsl(0, 100%, 40%);">-            return;</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%);">-       LOGP(DLGSUP, LOGL_NOTICE, "GSUP ping timed out, reconnecting\n");</span><br><span style="color: hsl(0, 100%, 40%);">-     ipa_client_conn_close(gsupc->link);</span><br><span style="color: hsl(0, 100%, 40%);">-  gsupc->is_connected = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     gsup_client_connect(gsupc);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void start_test_procedure(struct gsup_client *gsupc)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        osmo_timer_setup(&gsupc->ping_timer, ping_timer_cb, gsupc);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      gsupc->got_ipa_pong = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_timer_schedule(&gsupc->ping_timer, GSUP_CLIENT_PING_INTERVAL, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-   LOGP(DLGSUP, LOGL_DEBUG, "GSUP sending PING\n");</span><br><span style="color: hsl(0, 100%, 40%);">-      gsup_client_send_ping(gsupc);</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%);">-struct gsup_client *gsup_client_create(const char *unit_name,</span><br><span style="color: hsl(0, 100%, 40%);">-                                    const char *ip_addr,</span><br><span style="color: hsl(0, 100%, 40%);">-                                    unsigned int tcp_port,</span><br><span style="color: hsl(0, 100%, 40%);">-                                  gsup_client_read_cb_t read_cb,</span><br><span style="color: hsl(0, 100%, 40%);">-                                  struct osmo_oap_client_config *oapc_config)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gsup_client *gsupc;</span><br><span style="color: hsl(0, 100%, 40%);">-      int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- gsupc = talloc_zero(tall_bsc_ctx, struct gsup_client);</span><br><span style="color: hsl(0, 100%, 40%);">-  OSMO_ASSERT(gsupc);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* struct ipaccess_unit has a non-const unit_name, so let's copy to be</span><br><span style="color: hsl(0, 100%, 40%);">-       * able to have a non-const unit_name here as well. To not taint the</span><br><span style="color: hsl(0, 100%, 40%);">-     * public gsup_client API, let's store it in a const char* anyway. */</span><br><span style="color: hsl(0, 100%, 40%);">-       gsupc->unit_name = talloc_strdup(gsupc, unit_name);</span><br><span style="color: hsl(0, 100%, 40%);">-  OSMO_ASSERT(gsupc->unit_name);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* a NULL oapc_config will mark oap_state disabled. */</span><br><span style="color: hsl(0, 100%, 40%);">-  rc = osmo_oap_client_init(oapc_config, &gsupc->oap_state);</span><br><span style="color: hsl(0, 100%, 40%);">-       if (rc != 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            goto failed;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    gsupc->link = ipa_client_conn_create(gsupc,</span><br><span style="color: hsl(0, 100%, 40%);">-                                       /* no e1inp */ NULL,</span><br><span style="color: hsl(0, 100%, 40%);">-                                            0,</span><br><span style="color: hsl(0, 100%, 40%);">-                                      ip_addr, tcp_port,</span><br><span style="color: hsl(0, 100%, 40%);">-                                      gsup_client_updown_cb,</span><br><span style="color: hsl(0, 100%, 40%);">-                                          gsup_client_read_cb,</span><br><span style="color: hsl(0, 100%, 40%);">-                                            /* default write_cb */ NULL,</span><br><span style="color: hsl(0, 100%, 40%);">-                                            gsupc);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!gsupc->link)</span><br><span style="color: hsl(0, 100%, 40%);">-            goto failed;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    osmo_timer_setup(&gsupc->connect_timer, connect_timer_cb, gsupc);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        rc = gsup_client_connect(gsupc);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (rc < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          goto failed;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    gsupc->read_cb = read_cb;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    return gsupc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-failed:</span><br><span style="color: hsl(0, 100%, 40%);">-    gsup_client_destroy(gsupc);</span><br><span style="color: hsl(0, 100%, 40%);">-     return NULL;</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%);">-void gsup_client_destroy(struct gsup_client *gsupc)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       osmo_timer_del(&gsupc->connect_timer);</span><br><span style="color: hsl(0, 100%, 40%);">-   osmo_timer_del(&gsupc->ping_timer);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (gsupc->link) {</span><br><span style="color: hsl(0, 100%, 40%);">-           ipa_client_conn_close(gsupc->link);</span><br><span style="color: hsl(0, 100%, 40%);">-          ipa_client_conn_destroy(gsupc->link);</span><br><span style="color: hsl(0, 100%, 40%);">-                gsupc->link = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-       talloc_free(gsupc);</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%);">-int gsup_client_send(struct gsup_client *gsupc, struct msgb *msg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  if (!gsupc || !gsupc->is_connected) {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGP(DGPRS, LOGL_ERROR, "GSUP not connected, unable to send %s\n", msgb_hexdump(msg));</span><br><span style="color: hsl(0, 100%, 40%);">-                msgb_free(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-         return -ENOTCONN;</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%);">-       client_send(gsupc, IPAC_PROTO_EXT_GSUP, msg);</span><br><span style="color: hsl(0, 100%, 40%);">-</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 style="color: hsl(0, 100%, 40%);">-struct msgb *gsup_client_msgb_alloc(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    return msgb_alloc_headroom(4000, 64, __func__);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span>diff --git a/src/libcommon/gsup_test_client.c b/src/libcommon/gsup_test_client.c</span><br><span>deleted file mode 100644</span><br><span>index 2357ba5..0000000</span><br><span>--- a/src/libcommon/gsup_test_client.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,299 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-#include <string.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdio.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <errno.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <signal.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/linuxlist.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/msgb.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/select.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/application.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/utils.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/gsup.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/sgsn/gsup_client.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/sgsn/debug.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct gsup_client *g_gc;</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%);">- * IMSI Operation</span><br><span style="color: hsl(0, 100%, 40%);">- ***********************************************************************/</span><br><span style="color: hsl(0, 100%, 40%);">-static LLIST_HEAD(g_imsi_ops);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct imsi_op_stats {</span><br><span style="color: hsl(0, 100%, 40%);">-      uint32_t num_alloc;</span><br><span style="color: hsl(0, 100%, 40%);">-     uint32_t num_released;</span><br><span style="color: hsl(0, 100%, 40%);">-  uint32_t num_rx_success;</span><br><span style="color: hsl(0, 100%, 40%);">-        uint32_t num_rx_error;</span><br><span style="color: hsl(0, 100%, 40%);">-  uint32_t num_timeout;</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%);">-enum imsi_op_type {</span><br><span style="color: hsl(0, 100%, 40%);">-      IMSI_OP_SAI,</span><br><span style="color: hsl(0, 100%, 40%);">-    IMSI_OP_LU,</span><br><span style="color: hsl(0, 100%, 40%);">-     IMSI_OP_ISD,</span><br><span style="color: hsl(0, 100%, 40%);">-    _NUM_IMSI_OP</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static const struct value_string imsi_op_names[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-      { IMSI_OP_SAI, "SAI" },</span><br><span style="color: hsl(0, 100%, 40%);">-       { IMSI_OP_LU, "LU" },</span><br><span style="color: hsl(0, 100%, 40%);">- { IMSI_OP_ISD, "ISD" },</span><br><span style="color: hsl(0, 100%, 40%);">-       { 0, NULL }</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct imsi_op_stats imsi_op_stats[_NUM_IMSI_OP];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct imsi_op {</span><br><span style="color: hsl(0, 100%, 40%);">-   struct llist_head list;</span><br><span style="color: hsl(0, 100%, 40%);">- char imsi[17];</span><br><span style="color: hsl(0, 100%, 40%);">-  enum imsi_op_type type;</span><br><span style="color: hsl(0, 100%, 40%);">- struct osmo_timer_list timer;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct imsi_op *imsi_op_find(const char *imsi,</span><br><span style="color: hsl(0, 100%, 40%);">-                         enum imsi_op_type type)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   struct imsi_op *io;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     llist_for_each_entry(io, &g_imsi_ops, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-               if (!strcmp(io->imsi, imsi) && io->type == type)</span><br><span style="color: hsl(0, 100%, 40%);">-                  return io;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-       return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void imsi_op_timer_cb(void *data);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct imsi_op *imsi_op_alloc(void *ctx, const char *imsi,</span><br><span style="color: hsl(0, 100%, 40%);">-                         enum imsi_op_type type)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct imsi_op *io;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     if (imsi_op_find(imsi, type))</span><br><span style="color: hsl(0, 100%, 40%);">-           return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    io = talloc_zero(ctx, struct imsi_op);</span><br><span style="color: hsl(0, 100%, 40%);">-  osmo_strlcpy(io->imsi, imsi, sizeof(io->imsi));</span><br><span style="color: hsl(0, 100%, 40%);">-   io->type = type;</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_timer_setup(&io->timer, imsi_op_timer_cb, io);</span><br><span style="color: hsl(0, 100%, 40%);">-      llist_add(&io->list, &g_imsi_ops);</span><br><span style="color: hsl(0, 100%, 40%);">-   imsi_op_stats[type].num_alloc++;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        return io;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void imsi_op_release(struct imsi_op *io)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_timer_del(&io->timer);</span><br><span style="color: hsl(0, 100%, 40%);">-      llist_del(&io->list);</span><br><span style="color: hsl(0, 100%, 40%);">-    imsi_op_stats[io->type].num_released++;</span><br><span style="color: hsl(0, 100%, 40%);">-      talloc_free(io);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void imsi_op_timer_cb(void *data)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      struct imsi_op *io = data;</span><br><span style="color: hsl(0, 100%, 40%);">-      printf("%s: Timer expiration\n", io->imsi);</span><br><span style="color: hsl(0, 100%, 40%);">-        imsi_op_stats[io->type].num_timeout++;</span><br><span style="color: hsl(0, 100%, 40%);">-       imsi_op_release(io);</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%);">-/* allocate + generate + send Send-Auth-Info */</span><br><span style="color: hsl(0, 100%, 40%);">-int req_auth_info(const char *imsi)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct imsi_op *io = imsi_op_alloc(g_gc, imsi, IMSI_OP_SAI);</span><br><span style="color: hsl(0, 100%, 40%);">-    struct osmo_gsup_message gsup = {0};</span><br><span style="color: hsl(0, 100%, 40%);">-    struct msgb *msg = msgb_alloc_headroom(1200, 200, __func__);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    osmo_strlcpy(gsup.imsi, io->imsi, sizeof(gsup.imsi));</span><br><span style="color: hsl(0, 100%, 40%);">-        gsup.message_type = OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      osmo_gsup_encode(msg, &gsup);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return gsup_client_send(g_gc, msg);</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%);">-/* allocate + generate + send Send-Auth-Info */</span><br><span style="color: hsl(0, 100%, 40%);">-int req_loc_upd(const char *imsi)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   struct imsi_op *io = imsi_op_alloc(g_gc, imsi, IMSI_OP_LU);</span><br><span style="color: hsl(0, 100%, 40%);">-     struct osmo_gsup_message gsup = {0};</span><br><span style="color: hsl(0, 100%, 40%);">-    struct msgb *msg = msgb_alloc_headroom(1200, 200, __func__);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    osmo_strlcpy(gsup.imsi, io->imsi, sizeof(gsup.imsi));</span><br><span style="color: hsl(0, 100%, 40%);">-        gsup.message_type = OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_gsup_encode(msg, &gsup);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return gsup_client_send(g_gc, msg);</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%);">-int resp_isd(struct imsi_op *io)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   struct osmo_gsup_message gsup = {0};</span><br><span style="color: hsl(0, 100%, 40%);">-    struct msgb *msg = msgb_alloc_headroom(1200, 200, __func__);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    osmo_strlcpy(gsup.imsi, io->imsi, sizeof(gsup.imsi));</span><br><span style="color: hsl(0, 100%, 40%);">-        gsup.message_type = OSMO_GSUP_MSGT_INSERT_DATA_RESULT;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  osmo_gsup_encode(msg, &gsup);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       imsi_op_release(io);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    return gsup_client_send(g_gc, msg);</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%);">-/* receive an incoming GSUP message */</span><br><span style="color: hsl(0, 100%, 40%);">-static void imsi_op_rx_gsup(struct imsi_op *io, const struct osmo_gsup_message *gsup)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        int is_error = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (OSMO_GSUP_IS_MSGT_ERROR(gsup->message_type)) {</span><br><span style="color: hsl(0, 100%, 40%);">-           imsi_op_stats[io->type].num_rx_error++;</span><br><span style="color: hsl(0, 100%, 40%);">-              is_error = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-   } else</span><br><span style="color: hsl(0, 100%, 40%);">-          imsi_op_stats[io->type].num_rx_success++;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    switch (io->type) {</span><br><span style="color: hsl(0, 100%, 40%);">-  case IMSI_OP_SAI:</span><br><span style="color: hsl(0, 100%, 40%);">-               printf("%s; SAI Response%s\n", io->imsi, is_error ? ": ERROR" : "");</span><br><span style="color: hsl(0, 100%, 40%);">-           /* now that we have auth tuples, request LU */</span><br><span style="color: hsl(0, 100%, 40%);">-          req_loc_upd(io->imsi);</span><br><span style="color: hsl(0, 100%, 40%);">-               imsi_op_release(io);</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case IMSI_OP_LU:</span><br><span style="color: hsl(0, 100%, 40%);">-                printf("%s; LU Response%s\n", io->imsi, is_error ? ": ERROR" : "");</span><br><span style="color: hsl(0, 100%, 40%);">-            imsi_op_release(io);</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case IMSI_OP_ISD:</span><br><span style="color: hsl(0, 100%, 40%);">-               printf("%s; ISD Request%s\n", io->imsi, is_error ? ": ERROR" : "");</span><br><span style="color: hsl(0, 100%, 40%);">-            resp_isd(io);</span><br><span style="color: hsl(0, 100%, 40%);">-           break;</span><br><span style="color: hsl(0, 100%, 40%);">-  default:</span><br><span style="color: hsl(0, 100%, 40%);">-                printf("%s: Unknown\n", io->imsi);</span><br><span style="color: hsl(0, 100%, 40%);">-         imsi_op_release(io);</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%);">-static int op_type_by_gsup_msgt(enum osmo_gsup_message_type msg_type)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        switch (msg_type) {</span><br><span style="color: hsl(0, 100%, 40%);">-     case OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT:</span><br><span style="color: hsl(0, 100%, 40%);">-      case OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR:</span><br><span style="color: hsl(0, 100%, 40%);">-               return IMSI_OP_SAI;</span><br><span style="color: hsl(0, 100%, 40%);">-     case OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT:</span><br><span style="color: hsl(0, 100%, 40%);">-     case OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR:</span><br><span style="color: hsl(0, 100%, 40%);">-              return IMSI_OP_LU;</span><br><span style="color: hsl(0, 100%, 40%);">-      case OSMO_GSUP_MSGT_INSERT_DATA_REQUEST:</span><br><span style="color: hsl(0, 100%, 40%);">-                return IMSI_OP_ISD;</span><br><span style="color: hsl(0, 100%, 40%);">-     default:</span><br><span style="color: hsl(0, 100%, 40%);">-                printf("Unknown GSUP msg_type %u\n", msg_type);</span><br><span style="color: hsl(0, 100%, 40%);">-               return -1;</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%);">-static int gsupc_read_cb(struct gsup_client *gsupc, struct msgb *msg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct osmo_gsup_message gsup_msg = {0};</span><br><span style="color: hsl(0, 100%, 40%);">-        struct imsi_op *io;</span><br><span style="color: hsl(0, 100%, 40%);">-     int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- DEBUGP(DGPRS, "Rx GSUP %s\n", osmo_hexdump(msgb_l2(msg), msgb_l2len(msg)));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   rc = osmo_gsup_decode(msgb_l2(msg), msgb_l2len(msg), &gsup_msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (rc < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (!gsup_msg.imsi[0])</span><br><span style="color: hsl(0, 100%, 40%);">-          return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      rc = op_type_by_gsup_msgt(gsup_msg.message_type);</span><br><span style="color: hsl(0, 100%, 40%);">-       if (rc < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      switch (rc) {</span><br><span style="color: hsl(0, 100%, 40%);">-   case IMSI_OP_SAI:</span><br><span style="color: hsl(0, 100%, 40%);">-       case IMSI_OP_LU:</span><br><span style="color: hsl(0, 100%, 40%);">-                io = imsi_op_find(gsup_msg.imsi, rc);</span><br><span style="color: hsl(0, 100%, 40%);">-           if (!io)</span><br><span style="color: hsl(0, 100%, 40%);">-                        return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-              break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case IMSI_OP_ISD:</span><br><span style="color: hsl(0, 100%, 40%);">-               /* ISD is an inbound transaction */</span><br><span style="color: hsl(0, 100%, 40%);">-             io = imsi_op_alloc(g_gc, gsup_msg.imsi, IMSI_OP_ISD);</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%);">-       imsi_op_rx_gsup(io, &gsup_msg);</span><br><span style="color: hsl(0, 100%, 40%);">-     msgb_free(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-</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 style="color: hsl(0, 100%, 40%);">-static void print_report(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       unsigned int i;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < ARRAY_SIZE(imsi_op_stats); i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-            struct imsi_op_stats *st = &imsi_op_stats[i];</span><br><span style="color: hsl(0, 100%, 40%);">-               const char *name = get_value_string(imsi_op_names, i);</span><br><span style="color: hsl(0, 100%, 40%);">-          printf("%s: %u alloc, %u released, %u success, %u error , %u tout\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                 name, st->num_alloc, st->num_released, st->num_rx_success,</span><br><span style="color: hsl(0, 100%, 40%);">-                     st->num_rx_error, st->num_timeout);</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%);">-static void sig_cb(int sig)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  switch (sig) {</span><br><span style="color: hsl(0, 100%, 40%);">-  case SIGINT:</span><br><span style="color: hsl(0, 100%, 40%);">-            print_report();</span><br><span style="color: hsl(0, 100%, 40%);">-         exit(0);</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%);">-void *tall_bsc_ctx = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* default categories */</span><br><span style="color: hsl(0, 100%, 40%);">-static struct log_info_cat default_categories[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static const struct log_info gsup_test_client_log_info = {</span><br><span style="color: hsl(0, 100%, 40%);">-     .cat = default_categories,</span><br><span style="color: hsl(0, 100%, 40%);">-      .num_cat = ARRAY_SIZE(default_categories),</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%);">-int main(int argc, char **argv)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    unsigned long long i;</span><br><span style="color: hsl(0, 100%, 40%);">-   char *server_host = "127.0.0.1";</span><br><span style="color: hsl(0, 100%, 40%);">-      uint16_t server_port = OSMO_GSUP_PORT;</span><br><span style="color: hsl(0, 100%, 40%);">-  void *ctx = talloc_named_const(NULL, 0, "gsup_test_client");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  osmo_init_logging2(ctx, &gsup_test_client_log_info);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        g_gc = gsup_client_create(ctx, "GSUPTEST", server_host, server_port,</span><br><span style="color: hsl(0, 100%, 40%);">-                            gsupc_read_cb, NULL);</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%);">- signal(SIGINT, sig_cb);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < 10000; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                unsigned long long imsi = 901790000000000 + i;</span><br><span style="color: hsl(0, 100%, 40%);">-          char imsi_buf[17];</span><br><span style="color: hsl(0, 100%, 40%);">-              snprintf(imsi_buf, sizeof(imsi_buf), "%015llu", imsi);</span><br><span style="color: hsl(0, 100%, 40%);">-                req_auth_info(imsi_buf);</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_select_main(0);</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%);">-       while (1) {</span><br><span style="color: hsl(0, 100%, 40%);">-             osmo_select_main(0);</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%);">-       print_report();</span><br><span style="color: hsl(0, 100%, 40%);">- exit(0);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span>diff --git a/src/libcommon/socket.c b/src/libcommon/socket.c</span><br><span>deleted file mode 100644</span><br><span>index dfcb393..0000000</span><br><span>--- a/src/libcommon/socket.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,111 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* OpenBSC sokcet code, taken from Abis input driver for ip.access */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* (C) 2009 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2010 by Holger Hans Peter Freyther</span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2010 by On-Waves</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * All Rights Reserved</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(0, 100%, 40%);">- * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(0, 100%, 40%);">- * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(0, 100%, 40%);">- * (at your option) any later version.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(0, 100%, 40%);">- * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(0, 100%, 40%);">- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(0, 100%, 40%);">- * GNU Affero General Public License for more details.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(0, 100%, 40%);">- * along with this program.  If not, see <http://www.gnu.org/licenses/>.</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%);">-#include <stdio.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <unistd.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdlib.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <errno.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <string.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <time.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <sys/fcntl.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <sys/socket.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <sys/ioctl.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <arpa/inet.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/select.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/tlv.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/msgb.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/sgsn/debug.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/sgsn/gsm_data.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/talloc.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int make_sock(struct osmo_fd *bfd, int proto,</span><br><span style="color: hsl(0, 100%, 40%);">-       uint32_t ip, uint16_t port, int priv_nr,</span><br><span style="color: hsl(0, 100%, 40%);">-        int (*cb)(struct osmo_fd *fd, unsigned int what), void *data)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    struct sockaddr_in addr;</span><br><span style="color: hsl(0, 100%, 40%);">-        int ret, on = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-        int type = SOCK_STREAM;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- switch (proto) {</span><br><span style="color: hsl(0, 100%, 40%);">-        case IPPROTO_TCP:</span><br><span style="color: hsl(0, 100%, 40%);">-               type = SOCK_STREAM;</span><br><span style="color: hsl(0, 100%, 40%);">-             break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case IPPROTO_UDP:</span><br><span style="color: hsl(0, 100%, 40%);">-               type = SOCK_DGRAM;</span><br><span style="color: hsl(0, 100%, 40%);">-              break;</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef IPPROTO_GRE</span><br><span style="color: hsl(0, 100%, 40%);">-        case IPPROTO_GRE:</span><br><span style="color: hsl(0, 100%, 40%);">-               type = SOCK_RAW;</span><br><span style="color: hsl(0, 100%, 40%);">-                break;</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-    default:</span><br><span style="color: hsl(0, 100%, 40%);">-                return -EINVAL;</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%);">-       bfd->fd = socket(AF_INET, type, proto);</span><br><span style="color: hsl(0, 100%, 40%);">-      bfd->cb = cb;</span><br><span style="color: hsl(0, 100%, 40%);">-        bfd->when = BSC_FD_READ;</span><br><span style="color: hsl(0, 100%, 40%);">-     bfd->data = data;</span><br><span style="color: hsl(0, 100%, 40%);">-    bfd->priv_nr = priv_nr;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (bfd->fd < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGP(DLINP, LOGL_ERROR, "could not create socket.\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                return -EIO;</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%);">-       memset(&addr, 0, sizeof(addr));</span><br><span style="color: hsl(0, 100%, 40%);">-     addr.sin_family = AF_INET;</span><br><span style="color: hsl(0, 100%, 40%);">-      addr.sin_port = htons(port);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (ip != INADDR_ANY)</span><br><span style="color: hsl(0, 100%, 40%);">-           addr.sin_addr.s_addr = htonl(ip);</span><br><span style="color: hsl(0, 100%, 40%);">-       else</span><br><span style="color: hsl(0, 100%, 40%);">-            addr.sin_addr.s_addr = INADDR_ANY;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      setsockopt(bfd->fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  ret = bind(bfd->fd, (struct sockaddr *) &addr, sizeof(addr));</span><br><span style="color: hsl(0, 100%, 40%);">-    if (ret < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGP(DLINP, LOGL_ERROR, "could not bind socket %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                 strerror(errno));</span><br><span style="color: hsl(0, 100%, 40%);">-               close(bfd->fd);</span><br><span style="color: hsl(0, 100%, 40%);">-              return -EIO;</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 (proto == IPPROTO_TCP) {</span><br><span style="color: hsl(0, 100%, 40%);">-             ret = listen(bfd->fd, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-            if (ret < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       perror("listen");</span><br><span style="color: hsl(0, 100%, 40%);">-                     close(bfd->fd);</span><br><span style="color: hsl(0, 100%, 40%);">-                      return ret;</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%);">-       ret = osmo_fd_register(bfd);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (ret < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-               perror("register_listen_fd");</span><br><span style="color: hsl(0, 100%, 40%);">-         close(bfd->fd);</span><br><span style="color: hsl(0, 100%, 40%);">-              return ret;</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-       return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span>diff --git a/src/libcommon/talloc_ctx.c b/src/libcommon/talloc_ctx.c</span><br><span>deleted file mode 100644</span><br><span>index c8e9cd3..0000000</span><br><span>--- a/src/libcommon/talloc_ctx.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,55 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* OpenBSC allocation contexts initialization code */</span><br><span style="color: hsl(0, 100%, 40%);">-/* (C) 2011-2016 by sysmocom s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(0, 100%, 40%);">- * All Rights Reserved</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(0, 100%, 40%);">- * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(0, 100%, 40%);">- * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(0, 100%, 40%);">- * (at your option) any later version.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(0, 100%, 40%);">- * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(0, 100%, 40%);">- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(0, 100%, 40%);">- * GNU Affero General Public License for more details.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(0, 100%, 40%);">- * along with this program.  If not, see <http://www.gnu.org/licenses/>.</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%);">-#include <osmocom/core/talloc.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/msgb.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-extern void *tall_bsc_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-extern void *tall_fle_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-extern void *tall_locop_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-extern void *tall_authciphop_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-extern void *tall_gsms_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-extern void *tall_subscr_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-extern void *tall_sub_req_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-extern void *tall_call_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-extern void *tall_paging_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-extern void *tall_sigh_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-extern void *tall_tqe_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-extern void *tall_trans_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-extern void *tall_map_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-extern void *tall_upq_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-extern void *tall_ctr_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void talloc_ctx_init(void *ctx_root)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      msgb_talloc_ctx_init(ctx_root, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-      tall_fle_ctx = talloc_named_const(ctx_root, 0, "bs11_file_list_entry");</span><br><span style="color: hsl(0, 100%, 40%);">-       tall_locop_ctx = talloc_named_const(ctx_root, 0, "loc_updating_oper");</span><br><span style="color: hsl(0, 100%, 40%);">-        tall_authciphop_ctx = talloc_named_const(ctx_root, 0, "auth_ciph_oper");</span><br><span style="color: hsl(0, 100%, 40%);">-      tall_gsms_ctx = talloc_named_const(ctx_root, 0, "sms");</span><br><span style="color: hsl(0, 100%, 40%);">-       tall_subscr_ctx = talloc_named_const(ctx_root, 0, "subscriber");</span><br><span style="color: hsl(0, 100%, 40%);">-      tall_call_ctx = talloc_named_const(ctx_root, 0, "gsm_call");</span><br><span style="color: hsl(0, 100%, 40%);">-  tall_paging_ctx = talloc_named_const(ctx_root, 0, "paging_request");</span><br><span style="color: hsl(0, 100%, 40%);">-  tall_sigh_ctx = talloc_named_const(ctx_root, 0, "signal_handler");</span><br><span style="color: hsl(0, 100%, 40%);">-    tall_tqe_ctx = talloc_named_const(ctx_root, 0, "subch_txq_entry");</span><br><span style="color: hsl(0, 100%, 40%);">-    tall_trans_ctx = talloc_named_const(ctx_root, 0, "transaction");</span><br><span style="color: hsl(0, 100%, 40%);">-      tall_map_ctx = talloc_named_const(ctx_root, 0, "trau_map_entry");</span><br><span style="color: hsl(0, 100%, 40%);">-     tall_upq_ctx = talloc_named_const(ctx_root, 0, "trau_upq_entry");</span><br><span style="color: hsl(0, 100%, 40%);">-     tall_ctr_ctx = talloc_named_const(ctx_root, 0, "counter");</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10260">change 10260</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/10260"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-sgsn </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I9307f9da7f48dd0a2e1cb213072068736e569722 </div>
<div style="display:none"> Gerrit-Change-Number: 10260 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>