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