<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/13417">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  osmith: Looks good to me, but someone else must approve
  Pau Espin Pedrol: Looks good to me, but someone else must approve
  Harald Welte: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Drop Iu*S support and related dependencies<br><br>There's optional libiu for Iu*S support but it's just a leftover from<br>pre repo-split times:<br>* it's not used by any code<br>* it's not checked by gerrit verification in osmo-ci<br>* it's disabled by default<br>* it's not supported in .deb packages<br><br>Instead of dragging old code in unknown stage of bit-rotting, let's just<br>drop it completely.<br><br>Change-Id: Id5678a74504b4456aba0438ccc34731770801128<br>---<br>M contrib/jenkins.sh<br>M openbsc/configure.ac<br>M openbsc/include/openbsc/Makefile.am<br>D openbsc/include/openbsc/iu.h<br>M openbsc/src/Makefile.am<br>D openbsc/src/libiu/Makefile.am<br>D openbsc/src/libiu/iu.c<br>D openbsc/src/libiu/iu_vty.c<br>8 files changed, 1 insertion(+), 935 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/contrib/jenkins.sh b/contrib/jenkins.sh</span><br><span>index f8ae49c..277fece 100755</span><br><span>--- a/contrib/jenkins.sh</span><br><span>+++ b/contrib/jenkins.sh</span><br><span>@@ -2,7 +2,6 @@</span><br><span> # jenkins build helper script for openbsc.  This is how we build on jenkins.osmocom.org</span><br><span> #</span><br><span> # environment variables:</span><br><span style="color: hsl(0, 100%, 40%);">-# * IU: configure 3G support (values: "--enable-iu", "--disable-iu")</span><br><span> # * MGCP: configure transcoding for MGCP (values: "--enable-mgcp-transcoding", "--disable-mgcp-transcoding")</span><br><span> # * SMPP: configure the SMPP interface (values: "--enable-smpp", "--disable-smpp")</span><br><span> # * WITH_MANUALS: build manual PDFs if set to "1"</span><br><span>@@ -19,11 +18,6 @@</span><br><span>         x="${x}_$($1 libosmo-sccp "$sccp_branch")"</span><br><span>       x="${x}_$($1 libsmpp34)"</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  if [ "x$IU" = "x--enable-iu" ]; then</span><br><span style="color: hsl(0, 100%, 40%);">-                x="${x}_$($1 libasn1c)"</span><br><span style="color: hsl(0, 100%, 40%);">-               x="${x}_$($1 osmo-iuh "$osmo_iuh_branch")"</span><br><span style="color: hsl(0, 100%, 40%);">-  fi</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>   echo "${x}.tar.gz"</span><br><span> }</span><br><span> </span><br><span>@@ -35,11 +29,6 @@</span><br><span>   osmo-build-dep.sh libosmo-netif</span><br><span>      osmo-build-dep.sh libosmo-sccp "$sccp_branch"</span><br><span>      PARALLEL_MAKE=-j1 osmo-build-dep.sh libsmpp34</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   if [ "x$IU" = "x--enable-iu" ]; then</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo-build-dep.sh libasn1c</span><br><span style="color: hsl(0, 100%, 40%);">-              osmo-build-dep.sh osmo-iuh "$osmo_iuh_branch"</span><br><span style="color: hsl(0, 100%, 40%);">- fi</span><br><span> }</span><br><span> </span><br><span> build_project() {</span><br><span>@@ -48,7 +37,7 @@</span><br><span> </span><br><span>     autoreconf --install --force</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        ./configure "$SMPP" "$MGCP" "$IU" \</span><br><span style="color: hsl(120, 100%, 40%);">+     ./configure "$SMPP" "$MGCP" \</span><br><span>            --enable-osmo-bsc \</span><br><span>          --enable-nat  \</span><br><span>              --enable-vty-tests \</span><br><span>@@ -59,11 +48,6 @@</span><br><span>    "$MAKE" distcheck || cat-testlogs.sh</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-if [ "x$IU" = "x--enable-iu" ]; then</span><br><span style="color: hsl(0, 100%, 40%);">-        sccp_branch="old_sua"</span><br><span style="color: hsl(0, 100%, 40%);">-        osmo_iuh_branch="old_sua"</span><br><span style="color: hsl(0, 100%, 40%);">-fi</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> . osmo-build.sh</span><br><span> </span><br><span> # Build and publish manuals</span><br><span>diff --git a/openbsc/configure.ac b/openbsc/configure.ac</span><br><span>index 4b432b1..704c7d7 100644</span><br><span>--- a/openbsc/configure.ac</span><br><span>+++ b/openbsc/configure.ac</span><br><span>@@ -98,18 +98,6 @@</span><br><span> AM_CONDITIONAL(BUILD_MGCP_TRANSCODING, test "x$osmo_ac_mgcp_transcoding" = "xyes")</span><br><span> AC_SUBST(osmo_ac_mgcp_transcoding)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-# Enable/disable 3G aka IuPS + IuCS support?</span><br><span style="color: hsl(0, 100%, 40%);">-AC_ARG_ENABLE([iu], [AS_HELP_STRING([--enable-iu], [Build 3G support, aka IuPS and IuCS interfaces])],</span><br><span style="color: hsl(0, 100%, 40%);">-    [osmo_ac_iu="$enableval"],[osmo_ac_iu="no"])</span><br><span style="color: hsl(0, 100%, 40%);">-if test "x$osmo_ac_iu" = "xyes" ; then</span><br><span style="color: hsl(0, 100%, 40%);">-    PKG_CHECK_MODULES(LIBASN1C, libasn1c >= 0.9.31)</span><br><span style="color: hsl(0, 100%, 40%);">-    PKG_CHECK_MODULES(LIBOSMORANAP, libosmo-ranap >= 0.3.0)</span><br><span style="color: hsl(0, 100%, 40%);">-    PKG_CHECK_MODULES(LIBOSMOSIGTRAN, libosmo-sigtran >= 0.9.0)</span><br><span style="color: hsl(0, 100%, 40%);">-    AC_DEFINE(BUILD_IU, 1, [Define if we want to build IuPS and IuCS interfaces support])</span><br><span style="color: hsl(0, 100%, 40%);">-fi</span><br><span style="color: hsl(0, 100%, 40%);">-AM_CONDITIONAL(BUILD_IU, test "x$osmo_ac_iu" = "xyes")</span><br><span style="color: hsl(0, 100%, 40%);">-AC_SUBST(osmo_ac_iu)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> </span><br><span> dnl checks for header files</span><br><span> AC_HEADER_STDC</span><br><span>@@ -252,7 +240,6 @@</span><br><span>     src/libmgcp/Makefile</span><br><span>     src/libcommon/Makefile</span><br><span>     src/libfilter/Makefile</span><br><span style="color: hsl(0, 100%, 40%);">-    src/libiu/Makefile</span><br><span>     src/libcommon-cs/Makefile</span><br><span>     src/osmo-nitb/Makefile</span><br><span>     src/osmo-bsc/Makefile</span><br><span>diff --git a/openbsc/include/openbsc/Makefile.am b/openbsc/include/openbsc/Makefile.am</span><br><span>index 1fa30d5..59b2231 100644</span><br><span>--- a/openbsc/include/openbsc/Makefile.am</span><br><span>+++ b/openbsc/include/openbsc/Makefile.am</span><br><span>@@ -32,7 +32,6 @@</span><br><span>     handover.h \</span><br><span>         handover_decision.h \</span><br><span>        ipaccess.h \</span><br><span style="color: hsl(0, 100%, 40%);">-    iu.h \</span><br><span>       meas_feed.h \</span><br><span>        meas_rep.h \</span><br><span>         mgcp.h \</span><br><span>diff --git a/openbsc/include/openbsc/iu.h b/openbsc/include/openbsc/iu.h</span><br><span>deleted file mode 100644</span><br><span>index f973ac1..0000000</span><br><span>--- a/openbsc/include/openbsc/iu.h</span><br><span>+++ /dev/null</span><br><span>@@ -1,62 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-#pragma once</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdbool.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct sgsn_pdp_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-struct msgb;</span><br><span style="color: hsl(0, 100%, 40%);">-struct gprs_ra_id;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct RANAP_RAB_SetupOrModifiedItemIEs_s;</span><br><span style="color: hsl(0, 100%, 40%);">-struct RANAP_GlobalRNC_ID;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct ue_conn_ctx {</span><br><span style="color: hsl(0, 100%, 40%);">- struct llist_head list;</span><br><span style="color: hsl(0, 100%, 40%);">- struct osmo_sccp_link *link;</span><br><span style="color: hsl(0, 100%, 40%);">-    uint32_t conn_id;</span><br><span style="color: hsl(0, 100%, 40%);">-       int integrity_active;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_ra_id ra_id;</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 iu_event_type {</span><br><span style="color: hsl(0, 100%, 40%);">-  IU_EVENT_RAB_ASSIGN,</span><br><span style="color: hsl(0, 100%, 40%);">-    IU_EVENT_SECURITY_MODE_COMPLETE,</span><br><span style="color: hsl(0, 100%, 40%);">-        IU_EVENT_IU_RELEASE, /* An actual Iu Release message was received */</span><br><span style="color: hsl(0, 100%, 40%);">-    IU_EVENT_LINK_INVALIDATED, /* A SUA link was lost or closed down */</span><br><span style="color: hsl(0, 100%, 40%);">-     /* FIXME: maybe IU_EVENT_IU_RELEASE and IU_EVENT_LINK_INVALIDATED</span><br><span style="color: hsl(0, 100%, 40%);">-        * should be combined to one generic event that simply means the</span><br><span style="color: hsl(0, 100%, 40%);">-         * ue_conn_ctx should no longer be used, for whatever reason. */</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%);">-extern const struct value_string iu_event_type_names[];</span><br><span style="color: hsl(0, 100%, 40%);">-static inline const char *iu_event_type_str(enum iu_event_type e)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     return get_value_string(iu_event_type_names, e);</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%);">-/* Implementations of iu_recv_cb_t shall find the ue_conn_ctx in msg->dst. */</span><br><span style="color: hsl(0, 100%, 40%);">-typedef int (* iu_recv_cb_t )(struct msgb *msg, struct gprs_ra_id *ra_id,</span><br><span style="color: hsl(0, 100%, 40%);">-                            /* TODO "gprs_" in generic CS+PS domain ^ */</span><br><span style="color: hsl(0, 100%, 40%);">-                          uint16_t *sai);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-typedef int (* iu_event_cb_t )(struct ue_conn_ctx *ue_ctx,</span><br><span style="color: hsl(0, 100%, 40%);">-                        enum iu_event_type type, void *data);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-typedef int (* iu_rab_ass_resp_cb_t )(struct ue_conn_ctx *ue_ctx, uint8_t rab_id,</span><br><span style="color: hsl(0, 100%, 40%);">-           struct RANAP_RAB_SetupOrModifiedItemIEs_s *setup_ies);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int iu_init(void *ctx, const char *listen_addr, uint16_t listen_port,</span><br><span style="color: hsl(0, 100%, 40%);">-         iu_recv_cb_t iu_recv_cb, iu_event_cb_t iu_event_cb);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void iu_link_del(struct osmo_sccp_link *link);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int iu_tx(struct msgb *msg, uint8_t sapi);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int iu_page_cs(const char *imsi, const uint32_t *tmsi, uint16_t lac);</span><br><span style="color: hsl(0, 100%, 40%);">-int iu_page_ps(const char *imsi, const uint32_t *ptmsi, uint16_t lac, uint8_t rac);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int iu_rab_act(struct ue_conn_ctx *ue_ctx, struct msgb *msg);</span><br><span style="color: hsl(0, 100%, 40%);">-int iu_rab_deact(struct ue_conn_ctx *ue_ctx, uint8_t rab_id);</span><br><span style="color: hsl(0, 100%, 40%);">-int iu_tx_sec_mode_cmd(struct ue_conn_ctx *uectx, struct gsm_auth_tuple *tp,</span><br><span style="color: hsl(0, 100%, 40%);">-                 int send_ck, int new_key);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void iu_vty_init(int *asn_debug_p);</span><br><span>diff --git a/openbsc/src/Makefile.am b/openbsc/src/Makefile.am</span><br><span>index 86d6f8f..46f30d7 100644</span><br><span>--- a/openbsc/src/Makefile.am</span><br><span>+++ b/openbsc/src/Makefile.am</span><br><span>@@ -30,13 +30,6 @@</span><br><span>   libcommon-cs \</span><br><span>       $(NULL)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-# Conditional Libraries</span><br><span style="color: hsl(0, 100%, 40%);">-if BUILD_IU</span><br><span style="color: hsl(0, 100%, 40%);">-SUBDIRS += \</span><br><span style="color: hsl(0, 100%, 40%);">-       libiu \</span><br><span style="color: hsl(0, 100%, 40%);">- $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-endif</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> # Programs</span><br><span> SUBDIRS += \</span><br><span>   osmo-nitb \</span><br><span>diff --git a/openbsc/src/libiu/Makefile.am b/openbsc/src/libiu/Makefile.am</span><br><span>deleted file mode 100644</span><br><span>index e5f9e27..0000000</span><br><span>--- a/openbsc/src/libiu/Makefile.am</span><br><span>+++ /dev/null</span><br><span>@@ -1,28 +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%);">- $(COVERAGE_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">-    $(LIBCRYPTO_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">-   $(LIBASN1C_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">-    $(LIBOSMOCORE_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(LIBOSMOVTY_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">-  $(LIBOSMOGSM_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">-  $(LIBOSMOABIS_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(LIBOSMOSIGTRAN_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">-      $(LIBOSMORANAP_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%);">-     libiu.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%);">-libiu_a_SOURCES = \</span><br><span style="color: hsl(0, 100%, 40%);">-      iu.c \</span><br><span style="color: hsl(0, 100%, 40%);">-  iu_vty.c \</span><br><span style="color: hsl(0, 100%, 40%);">-      $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>diff --git a/openbsc/src/libiu/iu.c b/openbsc/src/libiu/iu.c</span><br><span>deleted file mode 100644</span><br><span>index b4e7ac8..0000000</span><br><span>--- a/openbsc/src/libiu/iu.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,757 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* Common parts of IuCS and IuPS interfaces implementation */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* (C) 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 <stdint.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 <stdio.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <string.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdbool.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/core/prim.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/core/logging.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/vty/logging.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/gsm48.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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/sigtran/sua.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/sigtran/sccp_sap.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/sigtran/sccp_helpers.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <openbsc/gprs_sgsn.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <openbsc/iu.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <openbsc/debug.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <pdp.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/ranap/ranap_ies_defs.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/ranap/ranap_common.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/ranap/ranap_common_cn.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/ranap/ranap_msg_factory.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <asn1c/asn1helpers.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Parsed global RNC id. See also struct RANAP_GlobalRNC_ID, and note that the</span><br><span style="color: hsl(0, 100%, 40%);">- * PLMN identity is a BCD representation of the MCC and MNC.</span><br><span style="color: hsl(0, 100%, 40%);">- * See iu_grnc_id_parse(). */</span><br><span style="color: hsl(0, 100%, 40%);">-struct iu_grnc_id {</span><br><span style="color: hsl(0, 100%, 40%);">-   struct osmo_plmn_id plmn;</span><br><span style="color: hsl(0, 100%, 40%);">-       uint16_t rnc_id;</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%);">-/* A remote RNC (Radio Network Controller, like BSC but for UMTS) that has</span><br><span style="color: hsl(0, 100%, 40%);">- * called us and is currently reachable at the given osmo_sccp_link. So, when we</span><br><span style="color: hsl(0, 100%, 40%);">- * know a LAC for a subscriber, we can page it at the RNC matching that LAC or</span><br><span style="color: hsl(0, 100%, 40%);">- * RAC. An HNB-GW typically presents itself as if it were a single RNC, even</span><br><span style="color: hsl(0, 100%, 40%);">- * though it may have several RNCs in hNodeBs connected to it. Those will then</span><br><span style="color: hsl(0, 100%, 40%);">- * share the same RNC id, which they actually receive and adopt from the HNB-GW</span><br><span style="color: hsl(0, 100%, 40%);">- * in the HNBAP HNB REGISTER ACCEPT message. */</span><br><span style="color: hsl(0, 100%, 40%);">-struct iu_rnc {</span><br><span style="color: hsl(0, 100%, 40%);">-       struct llist_head entry;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        uint16_t rnc_id;</span><br><span style="color: hsl(0, 100%, 40%);">-        uint16_t lac; /* Location Area Code (used for CS and PS) */</span><br><span style="color: hsl(0, 100%, 40%);">-     uint8_t rac; /* Routing Area Code (used for PS only) */</span><br><span style="color: hsl(0, 100%, 40%);">- struct osmo_sccp_link *link;</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 *talloc_iu_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int asn1_xer_print = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-void *talloc_asn1_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-iu_recv_cb_t global_iu_recv_cb = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-iu_event_cb_t global_iu_event_cb = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static LLIST_HEAD(ue_conn_ctx_list);</span><br><span style="color: hsl(0, 100%, 40%);">-static LLIST_HEAD(rnc_list);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-const struct value_string iu_event_type_names[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_VALUE_STRING(IU_EVENT_RAB_ASSIGN),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(IU_EVENT_SECURITY_MODE_COMPLETE),</span><br><span style="color: hsl(0, 100%, 40%);">-     OSMO_VALUE_STRING(IU_EVENT_IU_RELEASE),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(IU_EVENT_LINK_INVALIDATED),</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 ue_conn_ctx *ue_conn_ctx_alloc(struct osmo_sccp_link *link, uint32_t conn_id)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      struct ue_conn_ctx *ctx = talloc_zero(talloc_iu_ctx, struct ue_conn_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ctx->link = link;</span><br><span style="color: hsl(0, 100%, 40%);">-    ctx->conn_id = conn_id;</span><br><span style="color: hsl(0, 100%, 40%);">-      llist_add(&ctx->list, &ue_conn_ctx_list);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    return ctx;</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 ue_conn_ctx *ue_conn_ctx_find(struct osmo_sccp_link *link,</span><br><span style="color: hsl(0, 100%, 40%);">-                                uint32_t conn_id)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct ue_conn_ctx *ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        llist_for_each_entry(ctx, &ue_conn_ctx_list, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                if (ctx->link == link && ctx->conn_id == conn_id)</span><br><span style="color: hsl(0, 100%, 40%);">-                 return ctx;</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 struct iu_rnc *iu_rnc_alloc(uint16_t rnc_id, uint16_t lac, uint8_t rac,</span><br><span style="color: hsl(0, 100%, 40%);">-                                struct osmo_sccp_link *link)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct iu_rnc *rnc = talloc_zero(talloc_iu_ctx, struct iu_rnc);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- rnc->rnc_id = rnc_id;</span><br><span style="color: hsl(0, 100%, 40%);">-        rnc->lac = lac;</span><br><span style="color: hsl(0, 100%, 40%);">-      rnc->rac = rac;</span><br><span style="color: hsl(0, 100%, 40%);">-      rnc->link = link;</span><br><span style="color: hsl(0, 100%, 40%);">-    llist_add(&rnc->entry, &rnc_list);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   LOGP(DRANAP, LOGL_NOTICE, "New RNC %d (LAC=%d RAC=%d)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-          rnc->rnc_id, rnc->lac, rnc->rac);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return rnc;</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 iu_rnc *iu_rnc_register(uint16_t rnc_id, uint16_t lac,</span><br><span style="color: hsl(0, 100%, 40%);">-                                      uint8_t rac, struct osmo_sccp_link *link)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct iu_rnc *rnc;</span><br><span style="color: hsl(0, 100%, 40%);">-     llist_for_each_entry(rnc, &rnc_list, entry) {</span><br><span style="color: hsl(0, 100%, 40%);">-               if (rnc->rnc_id != rnc_id)</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%);">-               /* We have this RNC Id registered already. Make sure that the</span><br><span style="color: hsl(0, 100%, 40%);">-            * details match. */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            /* TODO should a mismatch be an error? */</span><br><span style="color: hsl(0, 100%, 40%);">-               if (rnc->lac != lac || rnc->rac != rac)</span><br><span style="color: hsl(0, 100%, 40%);">-                   LOGP(DRANAP, LOGL_NOTICE, "RNC %d changes its details:"</span><br><span style="color: hsl(0, 100%, 40%);">-                            " LAC=%d RAC=%d --> LAC=%d RAC=%d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                      rnc->rnc_id, rnc->lac, rnc->rac,</span><br><span style="color: hsl(0, 100%, 40%);">-                       lac, rac);</span><br><span style="color: hsl(0, 100%, 40%);">-         rnc->lac = lac;</span><br><span style="color: hsl(0, 100%, 40%);">-              rnc->rac = rac;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              if (link && rnc->link != link)</span><br><span style="color: hsl(0, 100%, 40%);">-                       LOGP(DRANAP, LOGL_NOTICE, "RNC %d on new link"</span><br><span style="color: hsl(0, 100%, 40%);">-                             " (LAC=%d RAC=%d)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                         rnc->rnc_id, rnc->lac, rnc->rac);</span><br><span style="color: hsl(0, 100%, 40%);">-         rnc->link = link;</span><br><span style="color: hsl(0, 100%, 40%);">-            return rnc;</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%);">-       /* Not found, make a new one. */</span><br><span style="color: hsl(0, 100%, 40%);">-        return iu_rnc_alloc(rnc_id, lac, rac, link);</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%);">-/* Discard/invalidate all ue_conn_ctx and iu_rnc entries that reference the</span><br><span style="color: hsl(0, 100%, 40%);">- * given link, since this link is invalid and about to be deallocated. For</span><br><span style="color: hsl(0, 100%, 40%);">- * each ue_conn_ctx, invoke the iu_event_cb_t with IU_EVENT_LINK_INVALIDATED.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-void iu_link_del(struct osmo_sccp_link *link)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct iu_rnc *rnc, *rnc_next;</span><br><span style="color: hsl(0, 100%, 40%);">-  llist_for_each_entry_safe(rnc, rnc_next, &rnc_list, entry) {</span><br><span style="color: hsl(0, 100%, 40%);">-                if (!rnc->link)</span><br><span style="color: hsl(0, 100%, 40%);">-                      continue;</span><br><span style="color: hsl(0, 100%, 40%);">-               if (rnc->link != link)</span><br><span style="color: hsl(0, 100%, 40%);">-                       continue;</span><br><span style="color: hsl(0, 100%, 40%);">-               rnc->link = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-            llist_del(&rnc->entry);</span><br><span style="color: hsl(0, 100%, 40%);">-          talloc_free(rnc);</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 ue_conn_ctx *uec, *uec_next;</span><br><span style="color: hsl(0, 100%, 40%);">-     llist_for_each_entry_safe(uec, uec_next, &ue_conn_ctx_list, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-         if (uec->link != link)</span><br><span style="color: hsl(0, 100%, 40%);">-                       continue;</span><br><span style="color: hsl(0, 100%, 40%);">-               uec->link = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-            global_iu_event_cb(uec, IU_EVENT_LINK_INVALIDATED, 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%);">-/***********************************************************************</span><br><span style="color: hsl(0, 100%, 40%);">- * RANAP handling</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 iu_rab_act(struct ue_conn_ctx *ue_ctx, struct msgb *msg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       struct osmo_scu_prim *prim;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* wrap RANAP message in SCCP N-DATA.req */</span><br><span style="color: hsl(0, 100%, 40%);">-     prim = (struct osmo_scu_prim *) msgb_push(msg, sizeof(*prim));</span><br><span style="color: hsl(0, 100%, 40%);">-  prim->u.data.conn_id = ue_ctx->conn_id;</span><br><span style="color: hsl(0, 100%, 40%);">-   osmo_prim_init(&prim->oph,</span><br><span style="color: hsl(0, 100%, 40%);">-                      SCCP_SAP_USER,</span><br><span style="color: hsl(0, 100%, 40%);">-                  OSMO_SCU_PRIM_N_DATA,</span><br><span style="color: hsl(0, 100%, 40%);">-                   PRIM_OP_REQUEST,</span><br><span style="color: hsl(0, 100%, 40%);">-                msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    return osmo_sua_user_link_down(ue_ctx->link, &prim->oph);</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 iu_rab_deact(struct ue_conn_ctx *ue_ctx, uint8_t rab_id)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       /* FIXME */</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 iu_tx_sec_mode_cmd(struct ue_conn_ctx *uectx, struct gsm_auth_tuple *tp,</span><br><span style="color: hsl(0, 100%, 40%);">-                int send_ck, int new_key)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       struct osmo_scu_prim *prim;</span><br><span style="color: hsl(0, 100%, 40%);">-     struct msgb *msg;</span><br><span style="color: hsl(0, 100%, 40%);">-       uint8_t ik[16];</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t ck[16];</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%);">- /* C5 function to derive IK from Kc */</span><br><span style="color: hsl(0, 100%, 40%);">-  for (i = 0; i < 4; i++)</span><br><span style="color: hsl(0, 100%, 40%);">-              ik[i] = tp->vec.kc[i] ^ tp->vec.kc[i+4];</span><br><span style="color: hsl(0, 100%, 40%);">-  memcpy(ik+4, tp->vec.kc, 8);</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 12; i < 16; i++)</span><br><span style="color: hsl(0, 100%, 40%);">-            ik[i] = ik[i-12];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (send_ck) {</span><br><span style="color: hsl(0, 100%, 40%);">-          /* C4 function to derive CK from Kc */</span><br><span style="color: hsl(0, 100%, 40%);">-          memcpy(ck, tp->vec.kc, 8);</span><br><span style="color: hsl(0, 100%, 40%);">-           memcpy(ck+8, tp->vec.kc, 8);</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%);">-       /* create RANAP message */</span><br><span style="color: hsl(0, 100%, 40%);">-      msg = ranap_new_msg_sec_mod_cmd(ik, send_ck? ck : NULL, new_key ? RANAP_KeyStatus_new : RANAP_KeyStatus_old);</span><br><span style="color: hsl(0, 100%, 40%);">-   msg->l2h = msg->data;</span><br><span style="color: hsl(0, 100%, 40%);">-     /* wrap RANAP message in SCCP N-DATA.req */</span><br><span style="color: hsl(0, 100%, 40%);">-     prim = (struct osmo_scu_prim *) msgb_push(msg, sizeof(*prim));</span><br><span style="color: hsl(0, 100%, 40%);">-  prim->u.data.conn_id = uectx->conn_id;</span><br><span style="color: hsl(0, 100%, 40%);">-    osmo_prim_init(&prim->oph, SCCP_SAP_USER,</span><br><span style="color: hsl(0, 100%, 40%);">-                        OSMO_SCU_PRIM_N_DATA,</span><br><span style="color: hsl(0, 100%, 40%);">-                   PRIM_OP_REQUEST, msg);</span><br><span style="color: hsl(0, 100%, 40%);">-  osmo_sua_user_link_down(uectx->link, &prim->oph);</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 iu_grnc_id_parse(struct iu_grnc_id *dst,</span><br><span style="color: hsl(0, 100%, 40%);">-                       struct RANAP_GlobalRNC_ID *src)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    /* The size is coming from arbitrary sender, check it gracefully */</span><br><span style="color: hsl(0, 100%, 40%);">-     if (src->pLMNidentity.size != 3) {</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGP(DRANAP, LOGL_ERROR, "Invalid PLMN Identity size:"</span><br><span style="color: hsl(0, 100%, 40%);">-                     " should be 3, is %d\n", src->pLMNidentity.size);</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%);">-       osmo_plmn_from_bcd(&src->pLMNidentity.buf[0], &dst->plmn);</span><br><span style="color: hsl(0, 100%, 40%);">-        dst->rnc_id = (uint16_t)src->rNC_ID;</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 0</span><br><span style="color: hsl(0, 100%, 40%);">- -- not used at present --</span><br><span style="color: hsl(0, 100%, 40%);">-static int iu_grnc_id_compose(struct iu_grnc_id *src,</span><br><span style="color: hsl(0, 100%, 40%);">-                        struct RANAP_GlobalRNC_ID *dst)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  /* The caller must ensure proper size */</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(dst->pLMNidentity.size == 3);</span><br><span style="color: hsl(0, 100%, 40%);">-    gsm48_mcc_mnc_to_bcd(&dst->pLMNidentity.buf[0],</span><br><span style="color: hsl(0, 100%, 40%);">-                       src->mcc, src->mnc);</span><br><span style="color: hsl(0, 100%, 40%);">- dst->rNC_ID = src->rnc_id;</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%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int ranap_handle_co_initial_ue(void *ctx, RANAP_InitialUE_MessageIEs_t *ies)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    struct ue_conn_ctx *ue_conn = ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gprs_ra_id ra_id;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct iu_grnc_id grnc_id;</span><br><span style="color: hsl(0, 100%, 40%);">-      uint16_t sai;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct msgb *msg = msgb_alloc(256, "RANAP->NAS");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  if (ranap_parse_lai(&ra_id, &ies->lai) != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGP(DRANAP, LOGL_ERROR, "Failed to parse RANAP LAI IE\n");</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 (ies->presenceMask & INITIALUE_MESSAGEIES_RANAP_RAC_PRESENT) {</span><br><span style="color: hsl(0, 100%, 40%);">-                ra_id.rac = asn1str_to_u8(&ies->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%);">-       if (iu_grnc_id_parse(&grnc_id, &ies->globalRNC_ID) != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGP(DRANAP, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-                     "Failed to parse RANAP Global-RNC-ID IE\n");</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%);">-       sai = asn1str_to_u16(&ies->sai.sAC);</span><br><span style="color: hsl(0, 100%, 40%);">-     msgb_gmmh(msg) = msgb_put(msg, ies->nas_pdu.size);</span><br><span style="color: hsl(0, 100%, 40%);">-   memcpy(msgb_gmmh(msg), ies->nas_pdu.buf, ies->nas_pdu.size);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* Make sure we know the RNC Id and LAC+RAC coming in on this connection. */</span><br><span style="color: hsl(0, 100%, 40%);">-    iu_rnc_register(grnc_id.rnc_id, ra_id.lac, ra_id.rac, ue_conn->link);</span><br><span style="color: hsl(0, 100%, 40%);">-        ue_conn->ra_id = ra_id;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* Feed into the MM layer */</span><br><span style="color: hsl(0, 100%, 40%);">-    msg->dst = ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-      global_iu_recv_cb(msg, &ra_id, &sai);</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%);">-</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 ranap_handle_co_dt(void *ctx, RANAP_DirectTransferIEs_t *ies)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gprs_ra_id _ra_id, *ra_id = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-        uint16_t _sai, *sai = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-     struct msgb *msg = msgb_alloc(256, "RANAP->NAS");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  if (ies->presenceMask & DIRECTTRANSFERIES_RANAP_LAI_PRESENT) {</span><br><span style="color: hsl(0, 100%, 40%);">-           if (ranap_parse_lai(&_ra_id, &ies->lai) != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      LOGP(DRANAP, LOGL_ERROR, "Failed to parse RANAP LAI IE\n");</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%);">-               ra_id = &_ra_id;</span><br><span style="color: hsl(0, 100%, 40%);">-            if (ies->presenceMask & DIRECTTRANSFERIES_RANAP_RAC_PRESENT) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   _ra_id.rac = asn1str_to_u8(&ies->rac);</span><br><span style="color: hsl(0, 100%, 40%);">-           }</span><br><span style="color: hsl(0, 100%, 40%);">-               if (ies->presenceMask & DIRECTTRANSFERIES_RANAP_SAI_PRESENT) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   _sai = asn1str_to_u16(&ies->sai.sAC);</span><br><span style="color: hsl(0, 100%, 40%);">-                    sai = &_sai;</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%);">-       msgb_gmmh(msg) = msgb_put(msg, ies->nas_pdu.size);</span><br><span style="color: hsl(0, 100%, 40%);">-   memcpy(msgb_gmmh(msg), ies->nas_pdu.buf, ies->nas_pdu.size);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* Feed into the MM/CC/SMS-CP layer */</span><br><span style="color: hsl(0, 100%, 40%);">-  msg->dst = ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-      global_iu_recv_cb(msg, ra_id, sai);</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%);">-</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 ranap_handle_co_err_ind(void *ctx, RANAP_ErrorIndicationIEs_t *ies)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       if (ies->presenceMask & ERRORINDICATIONIES_RANAP_CAUSE_PRESENT)</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGP(DRANAP, LOGL_ERROR, "Rx Error Indication (%s)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                        ranap_cause_str(&ies->cause));</span><br><span style="color: hsl(0, 100%, 40%);">-   else</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGP(DRANAP, LOGL_ERROR, "Rx Error Indication\n");</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%);">-int iu_tx(struct msgb *msg_nas, uint8_t sapi)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct ue_conn_ctx *uectx = msg_nas->dst;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct msgb *msg;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct osmo_scu_prim *prim;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     LOGP(DRANAP, LOGL_INFO, "Transmitting L3 Message as RANAP DT (SUA link %p conn_id %u)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-          uectx->link, uectx->conn_id);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        msg = ranap_new_msg_dt(sapi, msg_nas->data, msgb_length(msg_nas));</span><br><span style="color: hsl(0, 100%, 40%);">-   msgb_free(msg_nas);</span><br><span style="color: hsl(0, 100%, 40%);">-     msg->l2h = msg->data;</span><br><span style="color: hsl(0, 100%, 40%);">-     prim = (struct osmo_scu_prim *) msgb_push(msg, sizeof(*prim));</span><br><span style="color: hsl(0, 100%, 40%);">-  prim->u.data.conn_id = uectx->conn_id;</span><br><span style="color: hsl(0, 100%, 40%);">-    osmo_prim_init(&prim->oph, SCCP_SAP_USER,</span><br><span style="color: hsl(0, 100%, 40%);">-                        OSMO_SCU_PRIM_N_DATA,</span><br><span style="color: hsl(0, 100%, 40%);">-                   PRIM_OP_REQUEST, msg);</span><br><span style="color: hsl(0, 100%, 40%);">-  osmo_sua_user_link_down(uectx->link, &prim->oph);</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 ranap_handle_co_iu_rel_req(struct ue_conn_ctx *ctx, RANAP_Iu_ReleaseRequestIEs_t *ies)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    struct msgb *msg;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct osmo_scu_prim *prim;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     LOGP(DRANAP, LOGL_INFO, "Received Iu Release Request, Sending Release Command\n");</span><br><span style="color: hsl(0, 100%, 40%);">-    msg = ranap_new_msg_iu_rel_cmd(&ies->cause);</span><br><span style="color: hsl(0, 100%, 40%);">-     msg->l2h = msg->data;</span><br><span style="color: hsl(0, 100%, 40%);">-     prim = (struct osmo_scu_prim *) msgb_push(msg, sizeof(*prim));</span><br><span style="color: hsl(0, 100%, 40%);">-  prim->u.data.conn_id = ctx->conn_id;</span><br><span style="color: hsl(0, 100%, 40%);">-      osmo_prim_init(&prim->oph, SCCP_SAP_USER,</span><br><span style="color: hsl(0, 100%, 40%);">-                        OSMO_SCU_PRIM_N_DATA,</span><br><span style="color: hsl(0, 100%, 40%);">-                   PRIM_OP_REQUEST, msg);</span><br><span style="color: hsl(0, 100%, 40%);">-  osmo_sua_user_link_down(ctx->link, &prim->oph);</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 ranap_handle_co_rab_ass_resp(struct ue_conn_ctx *ctx, RANAP_RAB_AssignmentResponseIEs_t *ies)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     int rc = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    LOGP(DRANAP, LOGL_INFO,</span><br><span style="color: hsl(0, 100%, 40%);">-      "Rx RAB Assignment Response for UE conn_id %u\n", ctx->conn_id);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (ies->presenceMask & RAB_ASSIGNMENTRESPONSEIES_RANAP_RAB_SETUPORMODIFIEDLIST_PRESENT) {</span><br><span style="color: hsl(0, 100%, 40%);">-               /* TODO: Iterate over list of SetupOrModifiedList IEs and handle each one */</span><br><span style="color: hsl(0, 100%, 40%);">-            RANAP_IE_t *ranap_ie = ies->raB_SetupOrModifiedList.raB_SetupOrModifiedList_ies.list.array[0];</span><br><span style="color: hsl(0, 100%, 40%);">-               RANAP_RAB_SetupOrModifiedItemIEs_t setup_ies;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-           rc = ranap_decode_rab_setupormodifieditemies_fromlist(&setup_ies, &ranap_ie->value);</span><br><span style="color: hsl(0, 100%, 40%);">-         if (rc) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       LOGP(DRANAP, LOGL_ERROR, "Error in ranap_decode_rab_setupormodifieditemies()\n");</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%);">-               rc = global_iu_event_cb(ctx, IU_EVENT_RAB_ASSIGN, &setup_ies);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              ranap_free_rab_setupormodifieditemies(&setup_ies);</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 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%);">-/* Entry point for connection-oriented RANAP message */</span><br><span style="color: hsl(0, 100%, 40%);">-static void cn_ranap_handle_co(void *ctx, ranap_message *message)</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%);">- LOGP(DRANAP, LOGL_NOTICE, "handle_co(dir=%u, proc=%u)\n", message->direction, message->procedureCode);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  switch (message->direction) {</span><br><span style="color: hsl(0, 100%, 40%);">-        case RANAP_RANAP_PDU_PR_initiatingMessage:</span><br><span style="color: hsl(0, 100%, 40%);">-              switch (message->procedureCode) {</span><br><span style="color: hsl(0, 100%, 40%);">-            case RANAP_ProcedureCode_id_InitialUE_Message:</span><br><span style="color: hsl(0, 100%, 40%);">-                  rc = ranap_handle_co_initial_ue(ctx, &message->msg.initialUE_MessageIEs);</span><br><span style="color: hsl(0, 100%, 40%);">-                        break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case RANAP_ProcedureCode_id_DirectTransfer:</span><br><span style="color: hsl(0, 100%, 40%);">-                     rc = ranap_handle_co_dt(ctx, &message->msg.directTransferIEs);</span><br><span style="color: hsl(0, 100%, 40%);">-                   break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case RANAP_ProcedureCode_id_ErrorIndication:</span><br><span style="color: hsl(0, 100%, 40%);">-                    rc = ranap_handle_co_err_ind(ctx, &message->msg.errorIndicationIEs);</span><br><span style="color: hsl(0, 100%, 40%);">-                     break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case RANAP_ProcedureCode_id_Iu_ReleaseRequest:</span><br><span style="color: hsl(0, 100%, 40%);">-                  /* Iu Release Request */</span><br><span style="color: hsl(0, 100%, 40%);">-                        rc = ranap_handle_co_iu_rel_req(ctx, &message->msg.iu_ReleaseRequestIEs);</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%);">-                        LOGP(DRANAP, LOGL_ERROR, "Received Initiating Message: unknown Procedure Code %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                       message->procedureCode);</span><br><span style="color: hsl(0, 100%, 40%);">-                        rc = -1;</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%);">-               break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case RANAP_RANAP_PDU_PR_successfulOutcome:</span><br><span style="color: hsl(0, 100%, 40%);">-              switch (message->procedureCode) {</span><br><span style="color: hsl(0, 100%, 40%);">-            case RANAP_ProcedureCode_id_SecurityModeControl:</span><br><span style="color: hsl(0, 100%, 40%);">-                        /* Security Mode Complete */</span><br><span style="color: hsl(0, 100%, 40%);">-                    rc = global_iu_event_cb(ctx, IU_EVENT_SECURITY_MODE_COMPLETE, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-                    break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case RANAP_ProcedureCode_id_Iu_Release:</span><br><span style="color: hsl(0, 100%, 40%);">-                 /* Iu Release Complete */</span><br><span style="color: hsl(0, 100%, 40%);">-                       rc = global_iu_event_cb(ctx, IU_EVENT_IU_RELEASE, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-                        if (rc) {</span><br><span style="color: hsl(0, 100%, 40%);">-                               LOGP(DRANAP, LOGL_ERROR, "Iu Release event: Iu Event callback returned %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                              rc);</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%);">-          default:</span><br><span style="color: hsl(0, 100%, 40%);">-                        LOGP(DRANAP, LOGL_ERROR, "Received Successful Outcome: unknown Procedure Code %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                       message->procedureCode);</span><br><span style="color: hsl(0, 100%, 40%);">-                        rc = -1;</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%);">-               break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case RANAP_RANAP_PDU_PR_outcome:</span><br><span style="color: hsl(0, 100%, 40%);">-                switch (message->procedureCode) {</span><br><span style="color: hsl(0, 100%, 40%);">-            case RANAP_ProcedureCode_id_RAB_Assignment:</span><br><span style="color: hsl(0, 100%, 40%);">-                     /* RAB Assignment Response */</span><br><span style="color: hsl(0, 100%, 40%);">-                   rc = ranap_handle_co_rab_ass_resp(ctx, &message->msg.raB_AssignmentResponseIEs);</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%);">-                        LOGP(DRANAP, LOGL_ERROR, "Received Outcome: unknown Procedure Code %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                          message->procedureCode);</span><br><span style="color: hsl(0, 100%, 40%);">-                        rc = -1;</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%);">-               break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case RANAP_RANAP_PDU_PR_unsuccessfulOutcome:</span><br><span style="color: hsl(0, 100%, 40%);">-    default:</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGP(DRANAP, LOGL_ERROR, "Received Unsuccessful Outcome: Procedure Code %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                     message->procedureCode);</span><br><span style="color: hsl(0, 100%, 40%);">-                rc = -1;</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%);">-       if (rc) {</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGP(DRANAP, LOGL_ERROR, "Error in cn_ranap_handle_co (%d)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                     rc);</span><br><span style="color: hsl(0, 100%, 40%);">-               /* TODO handling of the error? */</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 ranap_handle_cl_reset_req(void *ctx, RANAP_ResetIEs_t *ies)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       /* FIXME: send reset response */</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 int ranap_handle_cl_err_ind(void *ctx, RANAP_ErrorIndicationIEs_t *ies)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      if (ies->presenceMask & ERRORINDICATIONIES_RANAP_CAUSE_PRESENT)</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGP(DRANAP, LOGL_ERROR, "Rx Error Indication (%s)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                        ranap_cause_str(&ies->cause));</span><br><span style="color: hsl(0, 100%, 40%);">-   else</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGP(DRANAP, LOGL_ERROR, "Rx Error Indication\n");</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%);">-/* Entry point for connection-less RANAP message */</span><br><span style="color: hsl(0, 100%, 40%);">-static void cn_ranap_handle_cl(void *ctx, ranap_message *message)</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%);">- switch (message->direction) {</span><br><span style="color: hsl(0, 100%, 40%);">-        case RANAP_RANAP_PDU_PR_initiatingMessage:</span><br><span style="color: hsl(0, 100%, 40%);">-              switch (message->procedureCode) {</span><br><span style="color: hsl(0, 100%, 40%);">-            case RANAP_ProcedureCode_id_Reset:</span><br><span style="color: hsl(0, 100%, 40%);">-                      /* received reset.req, send reset.resp */</span><br><span style="color: hsl(0, 100%, 40%);">-                       rc = ranap_handle_cl_reset_req(ctx, &message->msg.resetIEs);</span><br><span style="color: hsl(0, 100%, 40%);">-                     break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case RANAP_ProcedureCode_id_ErrorIndication:</span><br><span style="color: hsl(0, 100%, 40%);">-                    rc = ranap_handle_cl_err_ind(ctx, &message->msg.errorIndicationIEs);</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%);">-                        rc = -1;</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%);">-               break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case RANAP_RANAP_PDU_PR_successfulOutcome:</span><br><span style="color: hsl(0, 100%, 40%);">-      case RANAP_RANAP_PDU_PR_unsuccessfulOutcome:</span><br><span style="color: hsl(0, 100%, 40%);">-    case RANAP_RANAP_PDU_PR_outcome:</span><br><span style="color: hsl(0, 100%, 40%);">-        default:</span><br><span style="color: hsl(0, 100%, 40%);">-                rc = -1;</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%);">-       if (rc) {</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGP(DRANAP, LOGL_ERROR, "Error in cn_ranap_handle_cl (%d)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                     rc);</span><br><span style="color: hsl(0, 100%, 40%);">-               /* TODO handling of the error? */</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%);">- * Paging</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%);">-/* Send a paging command down a given SUA link. tmsi and paging_cause are</span><br><span style="color: hsl(0, 100%, 40%);">- * optional and may be passed NULL and 0, respectively, to disable their use.</span><br><span style="color: hsl(0, 100%, 40%);">- * See enum RANAP_PagingCause.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * If TMSI is given, the IMSI is not sent over the air interface. Nevertheless,</span><br><span style="color: hsl(0, 100%, 40%);">- * the IMSI is still required for resolution in the HNB-GW and/or(?) RNC. */</span><br><span style="color: hsl(0, 100%, 40%);">-static int iu_tx_paging_cmd(struct osmo_sccp_link *link,</span><br><span style="color: hsl(0, 100%, 40%);">-                       const char *imsi, const uint32_t *tmsi,</span><br><span style="color: hsl(0, 100%, 40%);">-                         bool is_ps, uint32_t paging_cause)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct msgb *msg;</span><br><span style="color: hsl(0, 100%, 40%);">-       msg = ranap_new_msg_paging_cmd(imsi, tmsi, is_ps? 1 : 0, paging_cause);</span><br><span style="color: hsl(0, 100%, 40%);">- msg->l2h = msg->data;</span><br><span style="color: hsl(0, 100%, 40%);">-     return osmo_sccp_tx_unitdata_ranap(link, 1, 2, msg->data,</span><br><span style="color: hsl(0, 100%, 40%);">-                                       msgb_length(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 iu_page(const char *imsi, const uint32_t *tmsi_or_ptimsi,</span><br><span style="color: hsl(0, 100%, 40%);">-                 uint16_t lac, uint8_t rac, bool is_ps)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      struct iu_rnc *rnc;</span><br><span style="color: hsl(0, 100%, 40%);">-     int pagings_sent = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   if (tmsi_or_ptimsi) {</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGP(DRANAP, LOGL_DEBUG, "%s: Looking for RNCs to page for IMSI %s"</span><br><span style="color: hsl(0, 100%, 40%);">-                " (paging will use %s %x)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                 is_ps? "IuPS" : "IuCS",</span><br><span style="color: hsl(0, 100%, 40%);">-                     imsi,</span><br><span style="color: hsl(0, 100%, 40%);">-                   is_ps? "PTMSI" : "TMSI",</span><br><span style="color: hsl(0, 100%, 40%);">-                    *tmsi_or_ptimsi);</span><br><span style="color: hsl(0, 100%, 40%);">-  } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGP(DRANAP, LOGL_DEBUG, "%s: Looking for RNCs to page for IMSI %s"</span><br><span style="color: hsl(0, 100%, 40%);">-                " (paging will use IMSI)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                  is_ps? "IuPS" : "IuCS",</span><br><span style="color: hsl(0, 100%, 40%);">-                     imsi</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%);">-       llist_for_each_entry(rnc, &rnc_list, entry) {</span><br><span style="color: hsl(0, 100%, 40%);">-               if (!rnc->link) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    /* Not actually connected, don't count it. */</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%);">-               if (rnc->lac != lac)</span><br><span style="color: hsl(0, 100%, 40%);">-                 continue;</span><br><span style="color: hsl(0, 100%, 40%);">-               if (is_ps && rnc->rac != rac)</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%);">-               /* Found a match! */</span><br><span style="color: hsl(0, 100%, 40%);">-            if (iu_tx_paging_cmd(rnc->link, imsi, tmsi_or_ptimsi, is_ps, 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                  == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     LOGP(DRANAP, LOGL_DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">-                             "%s: Paged for IMSI %s on RNC %d, on SUA link %p\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                          is_ps? "IuPS" : "IuCS",</span><br><span style="color: hsl(0, 100%, 40%);">-                             imsi, rnc->rnc_id, rnc->link);</span><br><span style="color: hsl(0, 100%, 40%);">-                       pagings_sent ++;</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%);">-       /* Some logging... */</span><br><span style="color: hsl(0, 100%, 40%);">-   if (pagings_sent > 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGP(DRANAP, LOGL_DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">-                     "%s: %d RNCs were paged for IMSI %s.\n",</span><br><span style="color: hsl(0, 100%, 40%);">-              is_ps? "IuPS" : "IuCS",</span><br><span style="color: hsl(0, 100%, 40%);">-                     pagings_sent, imsi);</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       else {</span><br><span style="color: hsl(0, 100%, 40%);">-          if (is_ps) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    LOGP(DRANAP, LOGL_ERROR, "IuPS: Found no RNC to page for"</span><br><span style="color: hsl(0, 100%, 40%);">-                          " LAC %d RAC %d (would have paged IMSI %s)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                        lac, rac, imsi);</span><br><span style="color: hsl(0, 100%, 40%);">-           }</span><br><span style="color: hsl(0, 100%, 40%);">-               else {</span><br><span style="color: hsl(0, 100%, 40%);">-                  LOGP(DRANAP, LOGL_ERROR, "IuCS: Found no RNC to page for"</span><br><span style="color: hsl(0, 100%, 40%);">-                          " LAC %d (would have paged IMSI %s)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                       lac, imsi);</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 pagings_sent;</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 iu_page_cs(const char *imsi, const uint32_t *tmsi, uint16_t lac)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      return iu_page(imsi, tmsi, lac, 0, 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%);">-int iu_page_ps(const char *imsi, const uint32_t *ptmsi, uint16_t lac, uint8_t rac)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  return iu_page(imsi, ptmsi, lac, rac, 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%);">-</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%);">-int tx_unitdata(struct osmo_sccp_link *link);</span><br><span style="color: hsl(0, 100%, 40%);">-int tx_conn_req(struct osmo_sccp_link *link, uint32_t conn_id);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct osmo_prim_hdr *make_conn_req(uint32_t conn_id);</span><br><span style="color: hsl(0, 100%, 40%);">-struct osmo_prim_hdr *make_dt1_req(uint32_t conn_id, const uint8_t *data, unsigned int len);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct osmo_prim_hdr *make_conn_resp(struct osmo_scu_connect_param *param)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       struct msgb *msg = msgb_alloc(1024, "conn_resp");</span><br><span style="color: hsl(0, 100%, 40%);">-     struct osmo_scu_prim *prim;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     prim = (struct osmo_scu_prim *) msgb_put(msg, sizeof(*prim));</span><br><span style="color: hsl(0, 100%, 40%);">-   osmo_prim_init(&prim->oph, SCCP_SAP_USER,</span><br><span style="color: hsl(0, 100%, 40%);">-                        OSMO_SCU_PRIM_N_CONNECT,</span><br><span style="color: hsl(0, 100%, 40%);">-                        PRIM_OP_RESPONSE, msg);</span><br><span style="color: hsl(0, 100%, 40%);">- memcpy(&prim->u.connect, param, sizeof(prim->u.connect));</span><br><span style="color: hsl(0, 100%, 40%);">-     return &prim->oph;</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 sccp_sap_up(struct osmo_prim_hdr *oph, void *link)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct osmo_scu_prim *prim = (struct osmo_scu_prim *) oph;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct osmo_prim_hdr *resp = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-      int rc;</span><br><span style="color: hsl(0, 100%, 40%);">- struct ue_conn_ctx *ue;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- DEBUGP(DRANAP, "sccp_sap_up(%s)\n", osmo_scu_prim_name(oph));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- switch (OSMO_PRIM_HDR(oph)) {</span><br><span style="color: hsl(0, 100%, 40%);">-   case OSMO_PRIM(OSMO_SCU_PRIM_N_CONNECT, PRIM_OP_CONFIRM):</span><br><span style="color: hsl(0, 100%, 40%);">-               /* confirmation of outbound connection */</span><br><span style="color: hsl(0, 100%, 40%);">-               rc = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-                break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case OSMO_PRIM(OSMO_SCU_PRIM_N_CONNECT, PRIM_OP_INDICATION):</span><br><span style="color: hsl(0, 100%, 40%);">-            /* indication of new inbound connection request*/</span><br><span style="color: hsl(0, 100%, 40%);">-               DEBUGP(DRANAP, "N-CONNECT.ind(X->%u)\n", prim->u.connect.conn_id);</span><br><span style="color: hsl(0, 100%, 40%);">-              if (/*  prim->u.connect.called_addr.ssn != OSMO_SCCP_SSN_RANAP || */</span><br><span style="color: hsl(0, 100%, 40%);">-             !msgb_l2(oph->msg) || msgb_l2len(oph->msg) == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    LOGP(DRANAP, LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">-                            "Received invalid N-CONNECT.ind\n");</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%);">-               ue = ue_conn_ctx_alloc(link, prim->u.connect.conn_id);</span><br><span style="color: hsl(0, 100%, 40%);">-               /* first ensure the local SUA/SCCP socket is ACTIVE */</span><br><span style="color: hsl(0, 100%, 40%);">-          resp = make_conn_resp(&prim->u.connect);</span><br><span style="color: hsl(0, 100%, 40%);">-         osmo_sua_user_link_down(link, resp);</span><br><span style="color: hsl(0, 100%, 40%);">-            /* then handle the RANAP payload */</span><br><span style="color: hsl(0, 100%, 40%);">-             rc = ranap_cn_rx_co(cn_ranap_handle_co, ue, msgb_l2(oph->msg), msgb_l2len(oph->msg));</span><br><span style="color: hsl(0, 100%, 40%);">-             break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case OSMO_PRIM(OSMO_SCU_PRIM_N_DISCONNECT, PRIM_OP_INDICATION):</span><br><span style="color: hsl(0, 100%, 40%);">-         /* indication of disconnect */</span><br><span style="color: hsl(0, 100%, 40%);">-          DEBUGP(DRANAP, "N-DISCONNECT.ind(%u)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                     prim->u.disconnect.conn_id);</span><br><span style="color: hsl(0, 100%, 40%);">-          ue = ue_conn_ctx_find(link, prim->u.disconnect.conn_id);</span><br><span style="color: hsl(0, 100%, 40%);">-             rc = ranap_cn_rx_co(cn_ranap_handle_co, ue, msgb_l2(oph->msg), msgb_l2len(oph->msg));</span><br><span style="color: hsl(0, 100%, 40%);">-             break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case OSMO_PRIM(OSMO_SCU_PRIM_N_DATA, PRIM_OP_INDICATION):</span><br><span style="color: hsl(0, 100%, 40%);">-               /* connection-oriented data received */</span><br><span style="color: hsl(0, 100%, 40%);">-         DEBUGP(DRANAP, "N-DATA.ind(%u, %s)\n", prim->u.data.conn_id,</span><br><span style="color: hsl(0, 100%, 40%);">-                      osmo_hexdump(msgb_l2(oph->msg), msgb_l2len(oph->msg)));</span><br><span style="color: hsl(0, 100%, 40%);">-            /* resolve UE context */</span><br><span style="color: hsl(0, 100%, 40%);">-                ue = ue_conn_ctx_find(link, prim->u.data.conn_id);</span><br><span style="color: hsl(0, 100%, 40%);">-           rc = ranap_cn_rx_co(cn_ranap_handle_co, ue, msgb_l2(oph->msg), msgb_l2len(oph->msg));</span><br><span style="color: hsl(0, 100%, 40%);">-             break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case OSMO_PRIM(OSMO_SCU_PRIM_N_UNITDATA, PRIM_OP_INDICATION):</span><br><span style="color: hsl(0, 100%, 40%);">-           /* connection-less data received */</span><br><span style="color: hsl(0, 100%, 40%);">-             DEBUGP(DRANAP, "N-UNITDATA.ind(%s)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                       osmo_hexdump(msgb_l2(oph->msg), msgb_l2len(oph->msg)));</span><br><span style="color: hsl(0, 100%, 40%);">-            rc = ranap_cn_rx_cl(cn_ranap_handle_cl, link, msgb_l2(oph->msg), msgb_l2len(oph->msg));</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%);">-                rc = -1;</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%);">-       msgb_free(oph->msg);</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%);">-int iu_init(void *ctx, const char *listen_addr, uint16_t listen_port,</span><br><span style="color: hsl(0, 100%, 40%);">-            iu_recv_cb_t iu_recv_cb, iu_event_cb_t iu_event_cb)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct osmo_sccp_user *user;</span><br><span style="color: hsl(0, 100%, 40%);">-    talloc_iu_ctx = talloc_named_const(ctx, 1, "iu");</span><br><span style="color: hsl(0, 100%, 40%);">-     talloc_asn1_ctx = talloc_named_const(talloc_iu_ctx, 1, "asn1");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       global_iu_recv_cb = iu_recv_cb;</span><br><span style="color: hsl(0, 100%, 40%);">- global_iu_event_cb = iu_event_cb;</span><br><span style="color: hsl(0, 100%, 40%);">-       osmo_sua_set_log_area(DSUA);</span><br><span style="color: hsl(0, 100%, 40%);">-    user = osmo_sua_user_create(talloc_iu_ctx, sccp_sap_up, talloc_iu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- return osmo_sua_server_listen(user, listen_addr, listen_port);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>diff --git a/openbsc/src/libiu/iu_vty.c b/openbsc/src/libiu/iu_vty.c</span><br><span>deleted file mode 100644</span><br><span>index 91eed96..0000000</span><br><span>--- a/openbsc/src/libiu/iu_vty.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,50 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* OpenBSC Iu related interface to quagga VTY */</span><br><span style="color: hsl(0, 100%, 40%);">-/* (C) 2016 by sysmocom s.m.f.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 <stdlib.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/vty/command.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/vty/logging.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Pointer to the actual asn_debug value as passed from main scopes. */</span><br><span style="color: hsl(0, 100%, 40%);">-static int *g_asn_debug_p = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN(logging_asn_debug,</span><br><span style="color: hsl(0, 100%, 40%);">-      logging_asn_debug_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-      "logging asn1-debug (1|0)",</span><br><span style="color: hsl(0, 100%, 40%);">-      LOGGING_STR</span><br><span style="color: hsl(0, 100%, 40%);">-      "Log human readable representations of all ASN.1 messages to stderr\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "Log decoded ASN.1 messages to stderr\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "Do not log decoded ASN.1 messages to stderr\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!g_asn_debug_p) {</span><br><span style="color: hsl(0, 100%, 40%);">-           vty_out(vty, "%%ASN.1 debugging not available%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-               return CMD_WARNING;</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%);">-       *g_asn_debug_p = atoi(argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">- return CMD_SUCCESS;</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 iu_vty_init(int *asn_debug_p)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- g_asn_debug_p = asn_debug_p;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    install_element(CFG_LOG_NODE, &logging_asn_debug_cmd);</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/13417">change 13417</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/13417"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: openbsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: Id5678a74504b4456aba0438ccc34731770801128 </div>
<div style="display:none"> Gerrit-Change-Number: 13417 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Max <msuraev@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Max <msuraev@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Pau Espin Pedrol <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>