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