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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Remove 'struct bsc_msc_connection' + fix IPA-encapsulated CTRL<br><br>The bsc_msc_connection dates back to the old pre-libosmo-sigtran<br>days, and 90% of the field members weren't used at all (even the<br>new sigtran specific ones!).  Let's merge what remains into struct<br>bsc_msc_data.<br><br>As a side effect, the already dysfunctional "dest A.B.C.D" VTY<br>command has been removed from the MSC node.<br><br>There's quite a bit of fall-out in the CTRL interface, which was<br>the code with strongest ties to bsc_msc_connection.  This was<br>resolved by properly porting CTRL handling over to libosmo-sigtran,<br>meaning that an IPA/SCCPlite connected MSC can now again send CTRL<br>GET/SET commands, and can also receive those selective few TRAPs<br>that old osmo-bsc-sccplite also sent to its MSC[s].<br><br>Change-Id: I6b7354f3b23a26bb4eab12213ca3d3b614c8154f<br>Related: OS#2012<br>---<br>M include/osmocom/bsc/Makefile.am<br>D include/osmocom/bsc/bsc_msc.h<br>M include/osmocom/bsc/bsc_msc_data.h<br>M include/osmocom/bsc/osmo_bsc_sigtran.h<br>M src/libbsc/Makefile.am<br>D src/libbsc/bsc_msc.c<br>M src/libbsc/bsc_subscr_conn_fsm.c<br>M src/libfilter/bsc_msg_filter.c<br>M src/osmo-bsc/osmo_bsc_api.c<br>M src/osmo-bsc/osmo_bsc_ctrl.c<br>M src/osmo-bsc/osmo_bsc_filter.c<br>M src/osmo-bsc/osmo_bsc_main.c<br>M src/osmo-bsc/osmo_bsc_msc.c<br>M src/osmo-bsc/osmo_bsc_sigtran.c<br>M src/osmo-bsc/osmo_bsc_vty.c<br>M tests/bssap/bssap_test.c<br>16 files changed, 182 insertions(+), 506 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/Makefile.am b/include/osmocom/bsc/Makefile.am</span><br><span>index 80f9b01..bae13f0 100644</span><br><span>--- a/include/osmocom/bsc/Makefile.am</span><br><span>+++ b/include/osmocom/bsc/Makefile.am</span><br><span>@@ -5,7 +5,6 @@</span><br><span>  abis_rsl.h \</span><br><span>         acc_ramp.h \</span><br><span>         arfcn_range_encode.h \</span><br><span style="color: hsl(0, 100%, 40%);">-  bsc_msc.h \</span><br><span>  bsc_msg_filter.h \</span><br><span>   bsc_rll.h \</span><br><span>  bsc_subscriber.h \</span><br><span>diff --git a/include/osmocom/bsc/bsc_msc.h b/include/osmocom/bsc/bsc_msc.h</span><br><span>deleted file mode 100644</span><br><span>index ceaea53..0000000</span><br><span>--- a/include/osmocom/bsc/bsc_msc.h</span><br><span>+++ /dev/null</span><br><span>@@ -1,77 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* Routines to talk to the MSC using the IPA Protocol */</span><br><span style="color: hsl(0, 100%, 40%);">-/*</span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2010 by Holger Hans Peter Freyther <zecke@selfish.org></span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2010 by On-Waves</span><br><span style="color: hsl(0, 100%, 40%);">- * 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%);">-#ifndef BSC_MSC_H</span><br><span style="color: hsl(0, 100%, 40%);">-#define BSC_MSC_H</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/write_queue.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/timer.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/bsc/a_reset.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <netinet/in.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct bsc_msc_dest {</span><br><span style="color: hsl(0, 100%, 40%);">- struct llist_head list;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- char *ip;</span><br><span style="color: hsl(0, 100%, 40%);">-       int port;</span><br><span style="color: hsl(0, 100%, 40%);">-       int dscp;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct bsc_msc_connection {</span><br><span style="color: hsl(0, 100%, 40%);">-  /* FIXME: Remove stuff that is no longer needed! */</span><br><span style="color: hsl(0, 100%, 40%);">-     struct osmo_wqueue write_queue;</span><br><span style="color: hsl(0, 100%, 40%);">- int is_connected;</span><br><span style="color: hsl(0, 100%, 40%);">-       int is_authenticated;</span><br><span style="color: hsl(0, 100%, 40%);">-   int first_contact;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      struct llist_head *dests;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       const char *name;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       void (*connection_loss) (struct bsc_msc_connection *);</span><br><span style="color: hsl(0, 100%, 40%);">-  void (*connected) (struct bsc_msc_connection *);</span><br><span style="color: hsl(0, 100%, 40%);">-        struct osmo_timer_list reconnect_timer;</span><br><span style="color: hsl(0, 100%, 40%);">- struct osmo_timer_list timeout_timer;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   struct msgb *pending_msg;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Sigtran connection data */</span><br><span style="color: hsl(0, 100%, 40%);">-   struct osmo_sccp_instance *sccp;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct osmo_sccp_user *sccp_user;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct osmo_sccp_addr g_calling_addr;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct osmo_sccp_addr g_called_addr;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct a_reset_ctx *reset;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      int conn_id_counter;</span><br><span 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 bsc_msc_connection *bsc_msc_create(void *ctx, struct llist_head *dest);</span><br><span style="color: hsl(0, 100%, 40%);">-int bsc_msc_connect(struct bsc_msc_connection *);</span><br><span style="color: hsl(0, 100%, 40%);">-void bsc_msc_schedule_connect(struct bsc_msc_connection *);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void bsc_msc_lost(struct bsc_msc_connection *);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct msgb *bsc_msc_id_get_resp(int fixed, const char *token, const uint8_t *res, int len);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span>diff --git a/include/osmocom/bsc/bsc_msc_data.h b/include/osmocom/bsc/bsc_msc_data.h</span><br><span>index 2ace178..baa58e7 100644</span><br><span>--- a/include/osmocom/bsc/bsc_msc_data.h</span><br><span>+++ b/include/osmocom/bsc/bsc_msc_data.h</span><br><span>@@ -3,6 +3,7 @@</span><br><span>  *</span><br><span>  * (C) 2010-2015 by Holger Hans Peter Freyther <zecke@selfish.org></span><br><span>  * (C) 2010-2015 by On-Waves</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2018 by Harald Welte <laforge@gnumonks.org></span><br><span>  * All Rights Reserved</span><br><span>  *</span><br><span>  * This program is free software; you can redistribute it and/or modify</span><br><span>@@ -27,7 +28,6 @@</span><br><span> #ifndef _OSMO_MSC_DATA_H</span><br><span> #define _OSMO_MSC_DATA_H</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#include "bsc_msc.h"</span><br><span> #include "debug.h"</span><br><span> </span><br><span> #include <osmocom/core/timer.h></span><br><span>@@ -75,26 +75,20 @@</span><br><span> </span><br><span> </span><br><span>     /* Connection data */</span><br><span style="color: hsl(0, 100%, 40%);">-   struct bsc_msc_connection *msc_con;</span><br><span>  struct osmo_plmn_id core_plmn;</span><br><span>       int core_lac;</span><br><span>        int core_ci;</span><br><span>         int rtp_base;</span><br><span style="color: hsl(120, 100%, 40%);">+ bool is_authenticated;</span><br><span> </span><br><span>   /* audio codecs */</span><br><span>   struct gsm48_multi_rate_conf amr_conf;</span><br><span>       struct gsm_audio_support **audio_support;</span><br><span>    int audio_length;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* destinations */</span><br><span style="color: hsl(0, 100%, 40%);">-      struct llist_head dests;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>     /* ussd welcome text */</span><br><span>      char *ussd_welcome_txt;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     /* mgcp agent */</span><br><span style="color: hsl(0, 100%, 40%);">-        struct osmo_wqueue mgcp_agent;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>       int nr;</span><br><span> </span><br><span>  /* ussd msc connection lost text */</span><br><span>diff --git a/include/osmocom/bsc/osmo_bsc_sigtran.h b/include/osmocom/bsc/osmo_bsc_sigtran.h</span><br><span>index 80d4f5b..bd8b063 100644</span><br><span>--- a/include/osmocom/bsc/osmo_bsc_sigtran.h</span><br><span>+++ b/include/osmocom/bsc/osmo_bsc_sigtran.h</span><br><span>@@ -41,3 +41,6 @@</span><br><span> </span><br><span> /* Send reset-ack to MSC */</span><br><span> void osmo_bsc_sigtran_tx_reset_ack(const struct bsc_msc_data *msc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* receive + process a CTRL command from the piggy-back on the IPA/SCCPlite link */</span><br><span style="color: hsl(120, 100%, 40%);">+int bsc_sccplite_rx_ctrl(struct osmo_ss7_asp *asp, struct msgb *msg);</span><br><span>diff --git a/src/libbsc/Makefile.am b/src/libbsc/Makefile.am</span><br><span>index 744278b..d215e14 100644</span><br><span>--- a/src/libbsc/Makefile.am</span><br><span>+++ b/src/libbsc/Makefile.am</span><br><span>@@ -47,7 +47,7 @@</span><br><span>        system_information.c \</span><br><span>       e1_config.c \</span><br><span>        bsc_api.c \</span><br><span style="color: hsl(0, 100%, 40%);">-     bsc_msc.c bsc_vty.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_vty.c \</span><br><span>  gsm_04_08_utils.c \</span><br><span>  gsm_04_80_utils.c \</span><br><span>  bsc_init.c \</span><br><span>diff --git a/src/libbsc/bsc_msc.c b/src/libbsc/bsc_msc.c</span><br><span>deleted file mode 100644</span><br><span>index 648b3e6..0000000</span><br><span>--- a/src/libbsc/bsc_msc.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,320 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* Routines to talk to the MSC using the IPA Protocol */</span><br><span style="color: hsl(0, 100%, 40%);">-/*</span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2010 by Holger Hans Peter Freyther <zecke@selfish.org></span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2010 by On-Waves</span><br><span style="color: hsl(0, 100%, 40%);">- * All Rights Reserved</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(0, 100%, 40%);">- * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(0, 100%, 40%);">- * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(0, 100%, 40%);">- * (at your option) any later version.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(0, 100%, 40%);">- * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(0, 100%, 40%);">- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(0, 100%, 40%);">- * GNU Affero General Public License for more details.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(0, 100%, 40%);">- * along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/bsc_msc.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/debug.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/abis/ipaccess.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/write_queue.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/talloc.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/tlv.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <arpa/inet.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <sys/socket.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <errno.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <fcntl.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 <unistd.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void connection_loss(struct bsc_msc_connection *con)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  struct osmo_fd *fd;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     fd = &con->write_queue.bfd;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (con->pending_msg) {</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGP(DMSC, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-               "MSC(%s) dropping incomplete message.\n", con->name);</span><br><span style="color: hsl(0, 100%, 40%);">-         msgb_free(con->pending_msg);</span><br><span style="color: hsl(0, 100%, 40%);">-         con->pending_msg = 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%);">-       close(fd->fd);</span><br><span style="color: hsl(0, 100%, 40%);">-       fd->fd = -1;</span><br><span style="color: hsl(0, 100%, 40%);">- fd->cb = osmo_wqueue_bfd_cb;</span><br><span style="color: hsl(0, 100%, 40%);">- fd->when = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        con->is_connected = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       con->first_contact = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-      con->connection_loss(con);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void msc_con_timeout(void *_con)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  struct bsc_msc_connection *con = _con;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  LOGP(DMSC, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-          "MSC(%s) Connection timeout.\n", con->name);</span><br><span style="color: hsl(0, 100%, 40%);">-       bsc_msc_lost(con);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* called in the case of a non blocking connect */</span><br><span style="color: hsl(0, 100%, 40%);">-static int msc_connection_connect(struct osmo_fd *fd, unsigned int what)</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%);">- int val;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct bsc_msc_connection *con;</span><br><span style="color: hsl(0, 100%, 40%);">- struct osmo_wqueue *queue;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      socklen_t len = sizeof(val);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    queue = container_of(fd, struct osmo_wqueue, bfd);</span><br><span style="color: hsl(0, 100%, 40%);">-      con = container_of(queue, struct bsc_msc_connection, write_queue);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if ((what & BSC_FD_WRITE) == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGP(DMSC, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-                  "MSC(%s) Callback but not writable.\n", con->name);</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%);">-       /* From here on we will either be connected or reconnect */</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_timer_del(&con->timeout_timer);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* check the socket state */</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = getsockopt(fd->fd, SOL_SOCKET, SO_ERROR, &val, &len);</span><br><span style="color: hsl(0, 100%, 40%);">-   if (rc != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGP(DMSC, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-                  "getsockopt for the MSC(%s) socket failed.\n", con->name);</span><br><span style="color: hsl(0, 100%, 40%);">-         goto error;</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-       if (val != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGP(DMSC, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-                  "Not connected to the MSC(%s): %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                 con->name, val);</span><br><span style="color: hsl(0, 100%, 40%);">-             goto 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%);">-       /* go to full operation */</span><br><span style="color: hsl(0, 100%, 40%);">-      fd->cb = osmo_wqueue_bfd_cb;</span><br><span style="color: hsl(0, 100%, 40%);">- fd->when = BSC_FD_READ | BSC_FD_EXCEPT;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      con->is_connected = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-       LOGP(DMSC, LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">-         "(Re)Connected to the MSC(%s).\n", con->name);</span><br><span style="color: hsl(0, 100%, 40%);">-     if (con->connected)</span><br><span style="color: hsl(0, 100%, 40%);">-          con->connected(con);</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%);">-error:</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_fd_unregister(fd);</span><br><span style="color: hsl(0, 100%, 40%);">- connection_loss(con);</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%);">-static void setnonblocking(struct osmo_fd *fd)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      int flags;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      flags = fcntl(fd->fd, F_GETFL);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (flags < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-             perror("fcntl get failed");</span><br><span style="color: hsl(0, 100%, 40%);">-           close(fd->fd);</span><br><span style="color: hsl(0, 100%, 40%);">-               fd->fd = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-         return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       flags |= O_NONBLOCK;</span><br><span style="color: hsl(0, 100%, 40%);">-    flags = fcntl(fd->fd, F_SETFL, flags);</span><br><span style="color: hsl(0, 100%, 40%);">-       if (flags < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-             perror("fcntl get failed");</span><br><span style="color: hsl(0, 100%, 40%);">-           close(fd->fd);</span><br><span style="color: hsl(0, 100%, 40%);">-               fd->fd = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-         return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int bsc_msc_connect(struct bsc_msc_connection *con)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  struct bsc_msc_dest *dest;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct osmo_fd *fd;</span><br><span style="color: hsl(0, 100%, 40%);">-     struct sockaddr_in sin;</span><br><span style="color: hsl(0, 100%, 40%);">- int on = 1, ret;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (llist_empty(con->dests)) {</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGP(DMSC, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-                  "No MSC(%s) connections configured.\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                       con->name);</span><br><span style="color: hsl(0, 100%, 40%);">-          connection_loss(con);</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%);">-       /* TODO: Why are we not using the libosmocore soecket</span><br><span style="color: hsl(0, 100%, 40%);">-    * abstraction, or libosmo-netif? */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* move to the next connection */</span><br><span style="color: hsl(0, 100%, 40%);">-       dest = (struct bsc_msc_dest *) con->dests->next;</span><br><span style="color: hsl(0, 100%, 40%);">-  llist_del(&dest->list);</span><br><span style="color: hsl(0, 100%, 40%);">-  llist_add_tail(&dest->list, con->dests);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      LOGP(DMSC, LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">-         "Attempting to connect MSC(%s) at %s:%d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-           con->name, dest->ip, dest->port);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      con->is_connected = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       msgb_free(con->pending_msg);</span><br><span style="color: hsl(0, 100%, 40%);">- con->pending_msg = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     fd = &con->write_queue.bfd;</span><br><span style="color: hsl(0, 100%, 40%);">-      fd->fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);</span><br><span style="color: hsl(0, 100%, 40%);">-  fd->priv_nr = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     if (fd->fd < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-         perror("Creating TCP socket failed");</span><br><span style="color: hsl(0, 100%, 40%);">-         return fd->fd;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* make it non blocking */</span><br><span style="color: hsl(0, 100%, 40%);">-      setnonblocking(fd);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* set the socket priority */</span><br><span style="color: hsl(0, 100%, 40%);">-   ret = setsockopt(fd->fd, IPPROTO_IP, IP_TOS,</span><br><span style="color: hsl(0, 100%, 40%);">-                  &dest->dscp, sizeof(dest->dscp));</span><br><span style="color: hsl(0, 100%, 40%);">-    if (ret != 0)</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGP(DMSC, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-                  "Failed to set DSCP to %d on MSC(%s). %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                  dest->dscp, con->name, strerror(errno));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  memset(&sin, 0, sizeof(sin));</span><br><span style="color: hsl(0, 100%, 40%);">-       sin.sin_family = AF_INET;</span><br><span style="color: hsl(0, 100%, 40%);">-       sin.sin_port = htons(dest->port);</span><br><span style="color: hsl(0, 100%, 40%);">-    inet_aton(dest->ip, &sin.sin_addr);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      ret = setsockopt(fd->fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));</span><br><span style="color: hsl(0, 100%, 40%);">-     if (ret != 0)</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGP(DMSC, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-               "Failed to set SO_REUSEADDR socket option\n");</span><br><span style="color: hsl(0, 100%, 40%);">-   ret = connect(fd->fd, (struct sockaddr *) &sin, sizeof(sin));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if (ret == -1 && errno == EINPROGRESS) {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGP(DMSC, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-                  "MSC(%s) Connection in progress\n", con->name);</span><br><span style="color: hsl(0, 100%, 40%);">-            fd->when = BSC_FD_WRITE;</span><br><span style="color: hsl(0, 100%, 40%);">-             fd->cb = msc_connection_connect;</span><br><span style="color: hsl(0, 100%, 40%);">-             osmo_timer_setup(&con->timeout_timer, msc_con_timeout, con);</span><br><span style="color: hsl(0, 100%, 40%);">-             osmo_timer_schedule(&con->timeout_timer, 20, 0);</span><br><span style="color: hsl(0, 100%, 40%);">- } else if (ret < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                perror("Connection failed");</span><br><span style="color: hsl(0, 100%, 40%);">-          connection_loss(con);</span><br><span style="color: hsl(0, 100%, 40%);">-           return ret;</span><br><span style="color: hsl(0, 100%, 40%);">-     } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                fd->when = BSC_FD_READ | BSC_FD_EXCEPT;</span><br><span style="color: hsl(0, 100%, 40%);">-              fd->cb = osmo_wqueue_bfd_cb;</span><br><span style="color: hsl(0, 100%, 40%);">-         con->is_connected = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-               if (con->connected)</span><br><span style="color: hsl(0, 100%, 40%);">-                  con->connected(con);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ret = osmo_fd_register(fd);</span><br><span style="color: hsl(0, 100%, 40%);">-     if (ret < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-               perror("Registering the fd failed");</span><br><span style="color: hsl(0, 100%, 40%);">-          close(fd->fd);</span><br><span style="color: hsl(0, 100%, 40%);">-               return ret;</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return ret;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct bsc_msc_connection *bsc_msc_create(void *ctx, struct llist_head *dests)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     struct bsc_msc_connection *con;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- con = talloc_zero(NULL, struct bsc_msc_connection);</span><br><span style="color: hsl(0, 100%, 40%);">-     if (!con) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGP(DMSC, LOGL_FATAL, "Failed to create the MSC connection.\n");</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%);">-       con->dests = dests;</span><br><span style="color: hsl(0, 100%, 40%);">-  con->write_queue.bfd.fd = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-        con->name = "";</span><br><span style="color: hsl(0, 100%, 40%);">-    osmo_wqueue_init(&con->write_queue, 100);</span><br><span style="color: hsl(0, 100%, 40%);">-        return con;</span><br><span 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 bsc_msc_lost(struct bsc_msc_connection *con)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  osmo_wqueue_clear(&con->write_queue);</span><br><span style="color: hsl(0, 100%, 40%);">-    osmo_timer_del(&con->timeout_timer);</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_timer_del(&con->reconnect_timer);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   if (con->write_queue.bfd.fd >= 0)</span><br><span style="color: hsl(0, 100%, 40%);">-         osmo_fd_unregister(&con->write_queue.bfd);</span><br><span style="color: hsl(0, 100%, 40%);">-       connection_loss(con);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void reconnect_msc(void *_msc)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    struct bsc_msc_connection *con = _msc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  LOGP(DMSC, LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">-         "Attempting to reconnect to the MSC(%s).\n", con->name);</span><br><span style="color: hsl(0, 100%, 40%);">-   bsc_msc_connect(con);</span><br><span 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 bsc_msc_schedule_connect(struct bsc_msc_connection *con)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    LOGP(DMSC, LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">-         "Attempting to reconnect to the MSC(%s)\n", con->name);</span><br><span style="color: hsl(0, 100%, 40%);">-    osmo_timer_setup(&con->reconnect_timer, reconnect_msc, con);</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_timer_schedule(&con->reconnect_timer, 5, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct msgb *bsc_msc_id_get_resp(int fixed, const char *token, const uint8_t *res, int len)</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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!token) {</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGP(DMSC, LOGL_ERROR, "No token specified.\n");</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%);">-       msg = msgb_alloc_headroom(4096, 128, "id resp");</span><br><span style="color: hsl(0, 100%, 40%);">-      if (!msg) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGP(DMSC, LOGL_ERROR, "Failed to create the message.\n");</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%);">-       /*</span><br><span style="color: hsl(0, 100%, 40%);">-       * The situation is bizarre. The encoding doesn't follow the</span><br><span style="color: hsl(0, 100%, 40%);">-         * TLV structure. It is more like a LV and old versions had</span><br><span style="color: hsl(0, 100%, 40%);">-      * it wrong but we want new versions to old servers so we</span><br><span style="color: hsl(0, 100%, 40%);">-        * introduce the quirk here.</span><br><span style="color: hsl(0, 100%, 40%);">-     */</span><br><span style="color: hsl(0, 100%, 40%);">-     msg->l2h = msgb_v_put(msg, IPAC_MSGT_ID_RESP);</span><br><span style="color: hsl(0, 100%, 40%);">-       if (fixed) {</span><br><span style="color: hsl(0, 100%, 40%);">-            msgb_put_u8(msg, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-            msgb_put_u8(msg, strlen(token) + 2);</span><br><span style="color: hsl(0, 100%, 40%);">-            msgb_tv_fixed_put(msg, IPAC_IDTAG_UNITNAME, strlen(token) + 1, (uint8_t *) token);</span><br><span style="color: hsl(0, 100%, 40%);">-              if (len > 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       msgb_put_u8(msg, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-                    msgb_put_u8(msg, len + 1);</span><br><span style="color: hsl(0, 100%, 40%);">-                      msgb_tv_fixed_put(msg, 0x24, len, res);</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%);">-                msgb_l16tv_put(msg, strlen(token) + 1,</span><br><span style="color: hsl(0, 100%, 40%);">-                  IPAC_IDTAG_UNITNAME, (uint8_t *) token);</span><br><span 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 msg;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span>diff --git a/src/libbsc/bsc_subscr_conn_fsm.c b/src/libbsc/bsc_subscr_conn_fsm.c</span><br><span>index 54224f7..89ac482 100644</span><br><span>--- a/src/libbsc/bsc_subscr_conn_fsm.c</span><br><span>+++ b/src/libbsc/bsc_subscr_conn_fsm.c</span><br><span>@@ -23,6 +23,7 @@</span><br><span> #include <osmocom/gsm/gsm0808_utils.h></span><br><span> </span><br><span> #include <osmocom/bsc/debug.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/a_reset.h></span><br><span> #include <osmocom/bsc/bsc_api.h></span><br><span> #include <osmocom/bsc/gsm_data.h></span><br><span> #include <osmocom/bsc/handover.h></span><br><span>diff --git a/src/libfilter/bsc_msg_filter.c b/src/libfilter/bsc_msg_filter.c</span><br><span>index 120169b..852067e 100644</span><br><span>--- a/src/libfilter/bsc_msg_filter.c</span><br><span>+++ b/src/libfilter/bsc_msg_filter.c</span><br><span>@@ -23,7 +23,6 @@</span><br><span> </span><br><span> #include <osmocom/bsc/bsc_msg_filter.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/bsc_msc.h></span><br><span> #include <osmocom/bsc/gsm_data.h></span><br><span> #include <osmocom/bsc/debug.h></span><br><span> #include <osmocom/bsc/ipaccess.h></span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_api.c b/src/osmo-bsc/osmo_bsc_api.c</span><br><span>index 8c16bde..8081ea4 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_api.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_api.c</span><br><span>@@ -24,6 +24,7 @@</span><br><span> </span><br><span> #include <osmocom/bsc/gsm_04_80.h></span><br><span> #include <osmocom/bsc/gsm_04_08_utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/a_reset.h></span><br><span> </span><br><span> #include <osmocom/gsm/protocol/gsm_08_08.h></span><br><span> #include <osmocom/gsm/gsm0808.h></span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_ctrl.c b/src/osmo-bsc/osmo_bsc_ctrl.c</span><br><span>index 5f88b85..7891cf4 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_ctrl.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_ctrl.c</span><br><span>@@ -30,30 +30,126 @@</span><br><span> </span><br><span> #include <osmocom/core/linuxlist.h></span><br><span> #include <osmocom/core/signal.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/talloc.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/ctrl/control_if.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/protocol/ipaccess.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/ipa.h></span><br><span> </span><br><span> #include <stdio.h></span><br><span> #include <stdlib.h></span><br><span> #include <time.h></span><br><span> #include <unistd.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_bsc_send_trap(struct ctrl_cmd *cmd, struct bsc_msc_connection *msc_con)</span><br><span style="color: hsl(120, 100%, 40%);">+extern struct gsm_network *bsc_gsmnet;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Obtain SS7 application server currently handling given MSC (DPC) */</span><br><span style="color: hsl(120, 100%, 40%);">+static struct osmo_ss7_as *msc_get_ss7_as(struct bsc_msc_data *msc)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct osmo_ss7_route *rt;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct osmo_ss7_instance *ss7 = osmo_sccp_get_ss7(msc->a.sccp);</span><br><span style="color: hsl(120, 100%, 40%);">+    rt = osmo_ss7_route_lookup(ss7, msc->a.msc_addr.pc);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!rt)</span><br><span style="color: hsl(120, 100%, 40%);">+              return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  return rt->dest.as;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Encode a CTRL command and send it to the given ASP</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] asp ASP through which we shall send the encoded message</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] cmd decoded CTRL command to be encoded and sent. Ownership is *NOT*</span><br><span style="color: hsl(120, 100%, 40%);">+ *                transferred, to permit caller to send the same CMD to several ASPs.</span><br><span style="color: hsl(120, 100%, 40%);">+ *                 Caller must hence free 'cmd' itself.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \returns 0 on success; negative on error */</span><br><span style="color: hsl(120, 100%, 40%);">+static int sccplite_asp_ctrl_cmd_send(struct osmo_ss7_asp *asp, struct ctrl_cmd *cmd)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      /* this is basically like libosmoctrl:ctrl_cmd_send(), not for a dedicated</span><br><span style="color: hsl(120, 100%, 40%);">+     * CTRL connection but for the CTRL piggy-back on the IPA/SCCPlite link */</span><br><span style="color: hsl(120, 100%, 40%);">+    struct msgb *msg;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* don't attempt to send CTRL on a non-SCCPlite ASP */</span><br><span style="color: hsl(120, 100%, 40%);">+    if (asp->cfg.proto != OSMO_SS7_ASP_PROT_IPA)</span><br><span style="color: hsl(120, 100%, 40%);">+               return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   msg = ctrl_cmd_make(cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!msg)</span><br><span style="color: hsl(120, 100%, 40%);">+             return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  ipa_prepend_header_ext(msg, IPAC_PROTO_EXT_CTRL);</span><br><span style="color: hsl(120, 100%, 40%);">+     ipa_prepend_header(msg, IPAC_PROTO_OSMO);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return osmo_ss7_asp_send(asp, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Ownership of 'cmd' is *NOT* transferred, to permit caller to send the same CMD to several ASPs.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Caller must hence free 'cmd' itself. */</span><br><span style="color: hsl(120, 100%, 40%);">+static int sccplite_msc_ctrl_cmd_send(struct bsc_msc_data *msc, struct ctrl_cmd *cmd)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct osmo_ss7_as *as;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct osmo_ss7_asp *asp;</span><br><span style="color: hsl(120, 100%, 40%);">+     unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     as = msc_get_ss7_as(msc);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!as)</span><br><span style="color: hsl(120, 100%, 40%);">+              return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* don't attempt to send CTRL on a non-SCCPlite AS */</span><br><span style="color: hsl(120, 100%, 40%);">+     if (as->cfg.proto != OSMO_SS7_ASP_PROT_IPA)</span><br><span style="color: hsl(120, 100%, 40%);">+                return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* FIXME: unify with xua_as_transmit_msg() and perform proper ASP lookup */</span><br><span style="color: hsl(120, 100%, 40%);">+   for (i = 0; i < ARRAY_SIZE(as->cfg.asps); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                asp = as->cfg.asps[i];</span><br><span style="color: hsl(120, 100%, 40%);">+             if (!asp)</span><br><span style="color: hsl(120, 100%, 40%);">+                     continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             /* FIXME: deal with multiple ASPs per AS */</span><br><span style="color: hsl(120, 100%, 40%);">+           return sccplite_asp_ctrl_cmd_send(asp, cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+     return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* receive + process a CTRL command from the piggy-back on the IPA/SCCPlite link */</span><br><span style="color: hsl(120, 100%, 40%);">+int bsc_sccplite_rx_ctrl(struct osmo_ss7_asp *asp, struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ctrl_cmd *cmd;</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* caller has already ensured ipaccess_head + ipaccess_head_ext */</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(msg->l2h);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* prase raw (ASCII) CTRL command into ctrl_cmd */</span><br><span style="color: hsl(120, 100%, 40%);">+    cmd = ctrl_cmd_parse2(asp, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+     msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (cmd->type == CTRL_TYPE_ERROR)</span><br><span style="color: hsl(120, 100%, 40%);">+          goto send_reply;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* handle the CTRL command */</span><br><span style="color: hsl(120, 100%, 40%);">+ ctrl_cmd_handle(bsc_gsmnet->ctrl, cmd, bsc_gsmnet);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+send_reply:</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = sccplite_asp_ctrl_cmd_send(asp, cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+    talloc_free(cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+     return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void osmo_bsc_send_trap(struct ctrl_cmd *cmd, struct bsc_msc_data *msc_data)</span><br><span> {</span><br><span>         struct ctrl_cmd *trap;</span><br><span>       struct ctrl_handle *ctrl;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct bsc_msc_data *msc_data;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      msc_data = (struct bsc_msc_data *) msc_con->write_queue.bfd.data;</span><br><span>         ctrl = msc_data->network->ctrl;</span><br><span> </span><br><span>    trap = ctrl_cmd_trap(cmd);</span><br><span>   if (!trap) {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>               LOGP(DCTRL, LOGL_ERROR, "Failed to create trap.\n");</span><br><span>               return;</span><br><span>      }</span><br><span> </span><br><span>        ctrl_cmd_send_to_all(ctrl, trap);</span><br><span style="color: hsl(0, 100%, 40%);">-       ctrl_cmd_send(&msc_con->write_queue, trap);</span><br><span style="color: hsl(120, 100%, 40%);">+    sccplite_msc_ctrl_cmd_send(msc_data, trap);</span><br><span> </span><br><span>      talloc_free(trap);</span><br><span> }</span><br><span>@@ -62,12 +158,21 @@</span><br><span> static int get_msc_connection_status(struct ctrl_cmd *cmd, void *data)</span><br><span> {</span><br><span>        struct bsc_msc_data *msc = (struct bsc_msc_data *)cmd->node;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct osmo_ss7_as *as;</span><br><span style="color: hsl(120, 100%, 40%);">+       const char *as_state_name;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         if (msc == NULL) {</span><br><span>           cmd->reply = "msc not found";</span><br><span>           return CTRL_CMD_ERROR;</span><br><span>       }</span><br><span style="color: hsl(120, 100%, 40%);">+     as = msc_get_ss7_as(msc);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!as) {</span><br><span style="color: hsl(120, 100%, 40%);">+            cmd->reply = "AS not found for MSC";</span><br><span style="color: hsl(120, 100%, 40%);">+             return CTRL_CMD_ERROR;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (msc->msc_con->is_connected)</span><br><span style="color: hsl(120, 100%, 40%);">+ as_state_name = osmo_fsm_inst_state_name(as->fi);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!strcmp(as_state_name, "AS_ACTIVE"))</span><br><span>           cmd->reply = "connected";</span><br><span>       else</span><br><span>                 cmd->reply = "disconnected";</span><br><span>@@ -80,14 +185,15 @@</span><br><span> </span><br><span> static int get_msc0_connection_status(struct ctrl_cmd *cmd, void *data)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gsm_network *gsmnet = data;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct bsc_msc_data *msc = osmo_msc_data_find(gsmnet, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct bsc_msc_data *msc = osmo_msc_data_find(bsc_gsmnet, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ void *old_node = cmd->node;</span><br><span style="color: hsl(120, 100%, 40%);">+        int rc;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     if (msc->msc_con->is_connected)</span><br><span style="color: hsl(0, 100%, 40%);">-           cmd->reply = "connected";</span><br><span style="color: hsl(0, 100%, 40%);">-  else</span><br><span style="color: hsl(0, 100%, 40%);">-            cmd->reply = "disconnected";</span><br><span style="color: hsl(0, 100%, 40%);">-       return CTRL_CMD_REPLY;</span><br><span style="color: hsl(120, 100%, 40%);">+        cmd->node = msc;</span><br><span style="color: hsl(120, 100%, 40%);">+   rc = get_msc_connection_status(cmd, data);</span><br><span style="color: hsl(120, 100%, 40%);">+    cmd->node = old_node;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    return rc;</span><br><span> }</span><br><span> </span><br><span> static int msc_connection_status_trap_cb(unsigned int subsys, unsigned int signal, void *handler_data, void *signal_data)</span><br><span>@@ -184,12 +290,12 @@</span><br><span> </span><br><span> static int get_bts_loc(struct ctrl_cmd *cmd, void *data);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void generate_location_state_trap(struct gsm_bts *bts, struct bsc_msc_connection *msc_con)</span><br><span style="color: hsl(120, 100%, 40%);">+static void generate_location_state_trap(struct gsm_bts *bts, struct bsc_msc_data *msc)</span><br><span> {</span><br><span>         struct ctrl_cmd *cmd;</span><br><span>        const char *oper, *admin, *policy;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  cmd = ctrl_cmd_create(msc_con, CTRL_TYPE_TRAP);</span><br><span style="color: hsl(120, 100%, 40%);">+       cmd = ctrl_cmd_create(msc, CTRL_TYPE_TRAP);</span><br><span>  if (!cmd) {</span><br><span>          LOGP(DCTRL, LOGL_ERROR, "Failed to create TRAP command.\n");</span><br><span>               return;</span><br><span>@@ -213,7 +319,7 @@</span><br><span>                                osmo_mnc_name(bts->network->plmn.mnc,</span><br><span>                                        bts->network->plmn.mnc_3_digits));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      osmo_bsc_send_trap(cmd, msc_con);</span><br><span style="color: hsl(120, 100%, 40%);">+     osmo_bsc_send_trap(cmd, msc);</span><br><span>        talloc_free(cmd);</span><br><span> }</span><br><span> </span><br><span>@@ -222,7 +328,7 @@</span><br><span>     struct bsc_msc_data *msc;</span><br><span> </span><br><span>        llist_for_each_entry(msc, &bts->network->bsc_data->mscs, entry)</span><br><span style="color: hsl(0, 100%, 40%);">-            generate_location_state_trap(bts, msc->msc_con);</span><br><span style="color: hsl(120, 100%, 40%);">+           generate_location_state_trap(bts, msc);</span><br><span> }</span><br><span> </span><br><span> static int location_equal(struct bts_location *a, struct bts_location *b)</span><br><span>@@ -537,7 +643,7 @@</span><br><span>          trap->id = "0";</span><br><span>                 trap->variable = "inform-msc-v1";</span><br><span>               trap->reply = talloc_strdup(trap, cmd->value);</span><br><span style="color: hsl(0, 100%, 40%);">-            ctrl_cmd_send(&msc->msc_con->write_queue, trap);</span><br><span style="color: hsl(120, 100%, 40%);">+            sccplite_msc_ctrl_cmd_send(msc, trap);</span><br><span>               talloc_free(trap);</span><br><span>   }</span><br><span> </span><br><span>@@ -625,7 +731,7 @@</span><br><span> </span><br><span>      net = msc->data->network;</span><br><span>      llist_for_each_entry(bts, &net->bts_list, list)</span><br><span style="color: hsl(0, 100%, 40%);">-          generate_location_state_trap(bts, msc->data->msc_con);    </span><br><span style="color: hsl(120, 100%, 40%);">+              generate_location_state_trap(bts, msc->data);</span><br><span> </span><br><span>         return 0;</span><br><span> }</span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_filter.c b/src/osmo-bsc/osmo_bsc_filter.c</span><br><span>index 5f60989..0d0fc29 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_filter.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_filter.c</span><br><span>@@ -161,7 +161,7 @@</span><br><span> </span><br><span> round_robin:</span><br><span>        llist_for_each_entry(msc, &bsc->mscs, entry) {</span><br><span style="color: hsl(0, 100%, 40%);">-           if (!msc->msc_con->is_authenticated)</span><br><span style="color: hsl(120, 100%, 40%);">+            if (!msc->is_authenticated)</span><br><span>                       continue;</span><br><span>            if (!is_emerg && msc->type != MSC_CON_TYPE_NORMAL)</span><br><span>                        continue;</span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_main.c b/src/osmo-bsc/osmo_bsc_main.c</span><br><span>index db6bcdb..095a07a 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_main.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_main.c</span><br><span>@@ -248,8 +248,6 @@</span><br><span> extern int bsc_shutdown_net(struct gsm_network *net);</span><br><span> static void signal_handler(int signal)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    struct bsc_msc_data *msc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>    fprintf(stdout, "signal %u received\n", signal);</span><br><span> </span><br><span>       switch (signal) {</span><br><span>@@ -270,8 +268,6 @@</span><br><span>      case SIGUSR2:</span><br><span>                if (!bsc_gsmnet->bsc_data)</span><br><span>                        return;</span><br><span style="color: hsl(0, 100%, 40%);">-         llist_for_each_entry(msc, &bsc_gsmnet->bsc_data->mscs, entry)</span><br><span style="color: hsl(0, 100%, 40%);">-                 bsc_msc_lost(msc->msc_con);</span><br><span>               break;</span><br><span>       default:</span><br><span>             break;</span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_msc.c b/src/osmo-bsc/osmo_bsc_msc.c</span><br><span>index 10f602a..e00c9ef 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_msc.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_msc.c</span><br><span>@@ -1,6 +1,6 @@</span><br><span> /*</span><br><span>  * Handle the connection to the MSC. This include ping/timeout/reconnect</span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2008-2009 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2008-2018 by Harald Welte <laforge@gnumonks.org></span><br><span>  * (C) 2009-2015 by Holger Hans Peter Freyther <zecke@selfish.org></span><br><span>  * (C) 2009-2015 by On-Waves</span><br><span>  * All Rights Reserved</span><br><span>@@ -41,19 +41,12 @@</span><br><span> </span><br><span> int osmo_bsc_msc_init(struct bsc_msc_data *data)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        data->msc_con = bsc_msc_create(data, &data->dests);</span><br><span style="color: hsl(0, 100%, 40%);">-   if (!data->msc_con) {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGP(DMSC, LOGL_ERROR, "Creating the MSC network connection failed.\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>    /* FIXME: This is a leftover from the old architecture that used</span><br><span>      * sccp-lite with osmocom specific authentication. Since we now</span><br><span>       * changed to AoIP the connected status and the authentication</span><br><span>        * status is managed differently. However osmo_bsc_filter.c still</span><br><span>     * needs the flags to be set to one. See also: OS#3112 */</span><br><span style="color: hsl(0, 100%, 40%);">-       data->msc_con->is_connected = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-  data->msc_con->is_authenticated = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+    data->is_authenticated = 1;</span><br><span> </span><br><span>   return 0;</span><br><span> }</span><br><span>@@ -86,7 +79,6 @@</span><br><span>   /* Init back pointer */</span><br><span>      msc_data->network = net;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- INIT_LLIST_HEAD(&msc_data->dests);</span><br><span>    msc_data->core_plmn = (struct osmo_plmn_id){</span><br><span>              .mcc = GSM_MCC_MNC_INVALID,</span><br><span>          .mnc = GSM_MCC_MNC_INVALID,</span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_sigtran.c b/src/osmo-bsc/osmo_bsc_sigtran.c</span><br><span>index 2c3507d..c33124f 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_sigtran.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_sigtran.c</span><br><span>@@ -24,6 +24,7 @@</span><br><span> #include <osmocom/sigtran/sccp_sap.h></span><br><span> #include <osmocom/core/linuxlist.h></span><br><span> #include <osmocom/gsm/gsm0808.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/protocol/ipaccess.h></span><br><span> #include <osmocom/core/msgb.h></span><br><span> #include <osmocom/bsc/bsc_msc_data.h></span><br><span> #include <osmocom/bsc/debug.h></span><br><span>@@ -512,3 +513,37 @@</span><br><span>            "A-interface: More than one invalid/inclomplete configuration detected, unable to revover - check config file!\n");</span><br><span>   return -EINVAL;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* this function receives all messages received on an ASP for a PPID / StreamID that</span><br><span style="color: hsl(120, 100%, 40%);">+ * libosmo-sigtran doesn't know about, such as piggy-backed CTRL and/or MGCP */</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_ss7_asp_rx_unknown(struct osmo_ss7_asp *asp, int ppid_mux, struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct ipaccess_head *iph;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct ipaccess_head_ext *iph_ext;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (asp->cfg.proto != OSMO_SS7_ASP_PROT_IPA) {</span><br><span style="color: hsl(120, 100%, 40%);">+             msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+               return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   switch (ppid_mux) {</span><br><span style="color: hsl(120, 100%, 40%);">+   case IPAC_PROTO_OSMO:</span><br><span style="color: hsl(120, 100%, 40%);">+         if (msg->len < sizeof(*iph) + sizeof(*iph_ext)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       LOGP(DMSC, LOGL_ERROR, "The message is too short.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                      msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+                       return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+             iph = (struct ipaccess_head *) msg->data;</span><br><span style="color: hsl(120, 100%, 40%);">+          iph_ext = (struct ipaccess_head_ext *) iph->data;</span><br><span style="color: hsl(120, 100%, 40%);">+          msg->l2h = iph_ext->data;</span><br><span style="color: hsl(120, 100%, 40%);">+               switch (iph_ext->proto) {</span><br><span style="color: hsl(120, 100%, 40%);">+          case IPAC_PROTO_EXT_CTRL:</span><br><span style="color: hsl(120, 100%, 40%);">+                     return bsc_sccplite_rx_ctrl(asp, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+       return 0; /* OSMO_SS7_UNKNOWN? */</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_vty.c b/src/osmo-bsc/osmo_bsc_vty.c</span><br><span>index bda89c1..d1a82ba 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_vty.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_vty.c</span><br><span>@@ -1,6 +1,7 @@</span><br><span> /* Osmo BSC VTY Configuration */</span><br><span> /* (C) 2009-2015 by Holger Hans Peter Freyther</span><br><span>  * (C) 2009-2014 by On-Waves</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2018 by Harald Welte <laforge@gnumonks.org></span><br><span>  * All Rights Reserved</span><br><span>  *</span><br><span>  * This program is free software; you can redistribute it and/or modify</span><br><span>@@ -105,8 +106,6 @@</span><br><span> </span><br><span> static void write_msc(struct vty *vty, struct bsc_msc_data *msc)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   struct bsc_msc_dest *dest;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>   vty_out(vty, "msc %d%s", msc->nr, VTY_NEWLINE);</span><br><span>         if (msc->core_plmn.mnc != GSM_MCC_MNC_INVALID)</span><br><span>            vty_out(vty, " core-mobile-network-code %s%s",</span><br><span>@@ -154,10 +153,6 @@</span><br><span> </span><br><span>  }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   llist_for_each_entry(dest, &msc->dests, list)</span><br><span style="color: hsl(0, 100%, 40%);">-            vty_out(vty, " dest %s %d %d%s", dest->ip, dest->port,</span><br><span style="color: hsl(0, 100%, 40%);">-                  dest->dscp, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>         vty_out(vty, " type %s%s", msc->type == MSC_CON_TYPE_NORMAL ?</span><br><span>                                   "normal" : "local", VTY_NEWLINE);</span><br><span>        vty_out(vty, " allow-emergency %s%s", msc->allow_emerg ?</span><br><span>@@ -337,58 +332,6 @@</span><br><span>         return CMD_ERR_INCOMPLETE;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN(cfg_net_msc_dest,</span><br><span style="color: hsl(0, 100%, 40%);">-      cfg_net_msc_dest_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-      "dest A.B.C.D <1-65000> <0-255>",</span><br><span style="color: hsl(0, 100%, 40%);">-      "Add a destination to a MUX/MSC\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "IP Address\n" "Port\n" "DSCP\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      struct bsc_msc_dest *dest;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct bsc_msc_data *data = bsc_msc_data(vty);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  dest = talloc_zero(osmo_bsc_data(vty), struct bsc_msc_dest);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!dest) {</span><br><span style="color: hsl(0, 100%, 40%);">-            vty_out(vty, "%%Failed to create structure.%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%);">-       dest->ip = talloc_strdup(dest, argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-     if (!dest->ip) {</span><br><span style="color: hsl(0, 100%, 40%);">-             vty_out(vty, "%%Failed to copy dest ip.%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-             talloc_free(dest);</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%);">-       dest->port = atoi(argv[1]);</span><br><span style="color: hsl(0, 100%, 40%);">-  dest->dscp = atoi(argv[2]);</span><br><span style="color: hsl(0, 100%, 40%);">-  llist_add_tail(&dest->list, &data->dests);</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%);">-DEFUN(cfg_net_msc_no_dest,</span><br><span style="color: hsl(0, 100%, 40%);">-      cfg_net_msc_no_dest_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-      "no dest A.B.C.D <1-65000> <0-255>",</span><br><span style="color: hsl(0, 100%, 40%);">-      NO_STR "Remove a destination to a MUX/MSC\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "IP Address\n" "Port\n" "DSCP\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  struct bsc_msc_dest *dest, *tmp;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct bsc_msc_data *data = bsc_msc_data(vty);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  int port = atoi(argv[1]);</span><br><span style="color: hsl(0, 100%, 40%);">-       int dscp = atoi(argv[2]);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       llist_for_each_entry_safe(dest, tmp, &data->dests, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-               if (port != dest->port || dscp != dest->dscp</span><br><span style="color: hsl(0, 100%, 40%);">-                  || strcmp(dest->ip, argv[0]) != 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                       continue;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               llist_del(&dest->list);</span><br><span style="color: hsl(0, 100%, 40%);">-          talloc_free(dest);</span><br><span 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 CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> DEFUN(cfg_net_msc_welcome_ussd,</span><br><span>       cfg_net_msc_welcome_ussd_cmd,</span><br><span>       "bsc-welcome-text .TEXT",</span><br><span>@@ -787,10 +730,12 @@</span><br><span> {</span><br><span>     struct bsc_msc_data *msc;</span><br><span>    llist_for_each_entry(msc, &bsc_gsmnet->bsc_data->mscs, entry) {</span><br><span style="color: hsl(0, 100%, 40%);">-               vty_out(vty, "MSC Nr: %d is connected: %d auth: %d.%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                       msc->nr,</span><br><span style="color: hsl(0, 100%, 40%);">-                     msc->msc_con ? msc->msc_con->is_connected : -1,</span><br><span style="color: hsl(0, 100%, 40%);">-                        msc->msc_con ? msc->msc_con->is_authenticated : -1,</span><br><span style="color: hsl(120, 100%, 40%);">+          vty_out(vty, "%d %s %s ",</span><br><span style="color: hsl(120, 100%, 40%);">+                   msc->a.cs7_instance,</span><br><span style="color: hsl(120, 100%, 40%);">+                       osmo_ss7_asp_protocol_name(msc->a.asp_proto),</span><br><span style="color: hsl(120, 100%, 40%);">+                      osmo_sccp_inst_addr_name(msc->a.sccp, &msc->a.bsc_addr));</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "%s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                        osmo_sccp_inst_addr_name(msc->a.sccp, &msc->a.msc_addr),</span><br><span>                   VTY_NEWLINE);</span><br><span>        }</span><br><span> </span><br><span>@@ -943,8 +888,6 @@</span><br><span>  install_element(MSC_NODE, &cfg_net_bsc_ci_cmd);</span><br><span>  install_element(MSC_NODE, &cfg_net_bsc_rtp_base_cmd);</span><br><span>    install_element(MSC_NODE, &cfg_net_bsc_codec_list_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-     install_element(MSC_NODE, &cfg_net_msc_dest_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-   install_element(MSC_NODE, &cfg_net_msc_no_dest_cmd);</span><br><span>     install_element(MSC_NODE, &cfg_net_msc_welcome_ussd_cmd);</span><br><span>        install_element(MSC_NODE, &cfg_net_msc_no_welcome_ussd_cmd);</span><br><span>     install_element(MSC_NODE, &cfg_net_msc_lost_ussd_cmd);</span><br><span>diff --git a/tests/bssap/bssap_test.c b/tests/bssap/bssap_test.c</span><br><span>index 00bc64c..c9e7075 100644</span><br><span>--- a/tests/bssap/bssap_test.c</span><br><span>+++ b/tests/bssap/bssap_test.c</span><br><span>@@ -156,3 +156,7 @@</span><br><span> struct gsm_subscriber_connection *bsc_subscr_con_allocate(struct gsm_network *net) {</span><br><span>        OSMO_ASSERT(0);</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int bsc_sccplite_rx_ctrl(struct osmo_ss7_asp *asp, struct msgb *msg) {</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/9340">change 9340</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/9340"/><meta itemprop="name" content="View Change"/></div></div>

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