<p>neels <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/18495">View Change</a></p><div style="white-space:pre-wrap">Approvals:
Jenkins Builder: Verified
fixeria: Looks good to me, but someone else must approve
pespin: Looks good to me, approved
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">drop IMSI filter and libfilter completely<br><br>Filtering by IMSI in osmo-bsc is a legacy use case with questionable<br>usefulness. Remove.<br><br>Do not keep deprecated VTY commands: those could be dangerous, since<br>(presumably non-existing) users might assume that the filtering would still be<br>in place. Rather fail to start osmo-bsc for config with an IMSI ACL.<br><br>The IMSI filtering did, if present, provide the logging with an IMSI to print<br>for the bsc_subscriber. TMSIs should have ended up in logging likewise, which<br>has never been implemented. The proper way to learn the IMSI would be by the<br>Common Id message from the MSC. Furthermore, the upcoming MSC pooling feature<br>will extract the mobile identity again, and will hence make sure that both IMSI<br>and TMSI identities, as available, end up in the bsc_subscriber and will be<br>logged again.<br><br>So long, IMSI ACL, and thanks for all the fish.<br><br>Change-Id: I89727af5387e8360362e995fdee959883c37d89a<br>---<br>M configure.ac<br>M include/osmocom/bsc/Makefile.am<br>M include/osmocom/bsc/bsc_msc_data.h<br>D include/osmocom/bsc/bsc_msg_filter.h<br>M include/osmocom/bsc/gsm_04_08_rr.h<br>M include/osmocom/bsc/gsm_data.h<br>M include/osmocom/bsc/osmo_bsc.h<br>M src/Makefile.am<br>D src/libfilter/Makefile.am<br>D src/libfilter/bsc_msg_acc.c<br>D src/libfilter/bsc_msg_filter.c<br>D src/libfilter/bsc_msg_vty.c<br>M src/osmo-bsc/Makefile.am<br>M src/osmo-bsc/gsm_08_08.c<br>M src/osmo-bsc/osmo_bsc_main.c<br>M src/osmo-bsc/osmo_bsc_vty.c<br>M tests/handover/Makefile.am<br>17 files changed, 2 insertions(+), 951 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/configure.ac b/configure.ac</span><br><span>index d96dfb2..6555f87 100644</span><br><span>--- a/configure.ac</span><br><span>+++ b/configure.ac</span><br><span>@@ -236,7 +236,6 @@</span><br><span> include/osmocom/Makefile</span><br><span> include/osmocom/bsc/Makefile</span><br><span> src/Makefile</span><br><span style="color: hsl(0, 100%, 40%);">- src/libfilter/Makefile</span><br><span> src/osmo-bsc/Makefile</span><br><span> src/ipaccess/Makefile</span><br><span> src/utils/Makefile</span><br><span>diff --git a/include/osmocom/bsc/Makefile.am b/include/osmocom/bsc/Makefile.am</span><br><span>index 396604e..509df9a 100644</span><br><span>--- a/include/osmocom/bsc/Makefile.am</span><br><span>+++ b/include/osmocom/bsc/Makefile.am</span><br><span>@@ -6,7 +6,6 @@</span><br><span> acc_ramp.h \</span><br><span> arfcn_range_encode.h \</span><br><span> assignment_fsm.h \</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_msg_filter.h \</span><br><span> bsc_rll.h \</span><br><span> bsc_subscriber.h \</span><br><span> bsc_subscr_conn_fsm.h \</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 a97616f..c77c562 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>@@ -150,8 +150,6 @@</span><br><span> /* ussd text when MSC has entered the grace period */</span><br><span> char *ussd_grace_txt;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- char *acc_lst_name;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* structures for keeping rate counters and gauge stats */</span><br><span> struct rate_ctr_group *msc_ctrs;</span><br><span> struct osmo_stat_item_group *msc_statg;</span><br><span>@@ -224,8 +222,6 @@</span><br><span> /* ussd text when there is no MSC available */</span><br><span> char *ussd_no_msc_txt;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- char *acc_lst_name;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> struct bsc_cbc_link *cbc;</span><br><span> };</span><br><span> </span><br><span>diff --git a/include/osmocom/bsc/bsc_msg_filter.h b/include/osmocom/bsc/bsc_msg_filter.h</span><br><span>deleted file mode 100644</span><br><span>index fe87485..0000000</span><br><span>--- a/include/osmocom/bsc/bsc_msg_filter.h</span><br><span>+++ /dev/null</span><br><span>@@ -1,103 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-#pragma once</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/msgb.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/msgfile.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/linuxrbtree.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/linuxlist.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <regex.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct vty;</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm48_hdr;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct bsc_filter_reject_cause {</span><br><span style="color: hsl(0, 100%, 40%);">- int lu_reject_cause;</span><br><span style="color: hsl(0, 100%, 40%);">- int cm_reject_cause;</span><br><span 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_filter_barr_entry {</span><br><span style="color: hsl(0, 100%, 40%);">- struct rb_node node;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- char *imsi;</span><br><span style="color: hsl(0, 100%, 40%);">- int cm_reject_cause;</span><br><span style="color: hsl(0, 100%, 40%);">- int lu_reject_cause;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-enum bsc_filter_acc_ctr {</span><br><span style="color: hsl(0, 100%, 40%);">- ACC_LIST_LOCAL_FILTER,</span><br><span style="color: hsl(0, 100%, 40%);">- ACC_LIST_GLOBAL_FILTER,</span><br><span 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_msg_acc_lst {</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%);">- /* counter */</span><br><span style="color: hsl(0, 100%, 40%);">- struct rate_ctr_group *stats;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* the name of the list */</span><br><span style="color: hsl(0, 100%, 40%);">- const char *name;</span><br><span style="color: hsl(0, 100%, 40%);">- struct llist_head fltr_list;</span><br><span 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_msg_acc_lst_entry {</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%);">- /* the filter */</span><br><span style="color: hsl(0, 100%, 40%);">- char *imsi_allow;</span><br><span style="color: hsl(0, 100%, 40%);">- regex_t imsi_allow_re;</span><br><span style="color: hsl(0, 100%, 40%);">- char *imsi_deny;</span><br><span style="color: hsl(0, 100%, 40%);">- regex_t imsi_deny_re;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* reject reasons for the access lists */</span><br><span style="color: hsl(0, 100%, 40%);">- int cm_reject_cause;</span><br><span style="color: hsl(0, 100%, 40%);">- int lu_reject_cause;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-enum {</span><br><span style="color: hsl(0, 100%, 40%);">- FLT_CON_TYPE_NONE,</span><br><span style="color: hsl(0, 100%, 40%);">- FLT_CON_TYPE_LU,</span><br><span style="color: hsl(0, 100%, 40%);">- FLT_CON_TYPE_CM_SERV_REQ,</span><br><span style="color: hsl(0, 100%, 40%);">- FLT_CON_TYPE_PAG_RESP,</span><br><span style="color: hsl(0, 100%, 40%);">- FLT_CON_TYPE_SSA,</span><br><span style="color: hsl(0, 100%, 40%);">- FLT_CON_TYPE_LOCAL_REJECT,</span><br><span style="color: hsl(0, 100%, 40%);">- FLT_CON_TYPE_OTHER,</span><br><span 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_filter_state {</span><br><span style="color: hsl(0, 100%, 40%);">- char *imsi;</span><br><span style="color: hsl(0, 100%, 40%);">- int imsi_checked;</span><br><span style="color: hsl(0, 100%, 40%);">- int con_type;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct bsc_filter_request {</span><br><span style="color: hsl(0, 100%, 40%);">- void *ctx;</span><br><span style="color: hsl(0, 100%, 40%);">- struct rb_root *black_list;</span><br><span style="color: hsl(0, 100%, 40%);">- struct llist_head *access_lists;</span><br><span style="color: hsl(0, 100%, 40%);">- const char *local_lst_name;</span><br><span style="color: hsl(0, 100%, 40%);">- const char *global_lst_name;</span><br><span style="color: hsl(0, 100%, 40%);">- int bsc_nr;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/**</span><br><span style="color: hsl(0, 100%, 40%);">- * Content filtering.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-int bsc_msg_filter_initial(struct gsm48_hdr *hdr, size_t size,</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_filter_request *req,</span><br><span style="color: hsl(0, 100%, 40%);">- int *con_type, char **imsi,</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_filter_reject_cause *cause);</span><br><span style="color: hsl(0, 100%, 40%);">-int bsc_msg_filter_data(struct gsm48_hdr *hdr, size_t size,</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_filter_request *req,</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_filter_state *state,</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_filter_reject_cause *cause);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* IMSI allow/deny handling */</span><br><span style="color: hsl(0, 100%, 40%);">-struct bsc_msg_acc_lst *bsc_msg_acc_lst_find(struct llist_head *lst, const char *name);</span><br><span style="color: hsl(0, 100%, 40%);">-struct bsc_msg_acc_lst *bsc_msg_acc_lst_get(void *ctx, struct llist_head *lst, const char *name);</span><br><span style="color: hsl(0, 100%, 40%);">-void bsc_msg_acc_lst_delete(struct bsc_msg_acc_lst *lst);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct bsc_msg_acc_lst_entry *bsc_msg_acc_lst_entry_create(struct bsc_msg_acc_lst *);</span><br><span style="color: hsl(0, 100%, 40%);">-int bsc_msg_acc_lst_check_allow(struct bsc_msg_acc_lst *lst, const char *imsi);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void bsc_msg_acc_lst_vty_init(void *ctx, struct llist_head *lst, int node);</span><br><span style="color: hsl(0, 100%, 40%);">-void bsc_msg_acc_lst_write(struct vty *vty);</span><br><span>diff --git a/include/osmocom/bsc/gsm_04_08_rr.h b/include/osmocom/bsc/gsm_04_08_rr.h</span><br><span>index f0c0f42..06cefa9 100644</span><br><span>--- a/include/osmocom/bsc/gsm_04_08_rr.h</span><br><span>+++ b/include/osmocom/bsc/gsm_04_08_rr.h</span><br><span>@@ -1,6 +1,7 @@</span><br><span> #pragma once</span><br><span> </span><br><span> #include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/msgb.h></span><br><span> </span><br><span> struct amr_mode;</span><br><span> struct amr_multirate_conf;</span><br><span>@@ -11,7 +12,6 @@</span><br><span> struct gsm_meas_rep;</span><br><span> struct gsm_network;</span><br><span> struct gsm_subscriber_connection;</span><br><span style="color: hsl(0, 100%, 40%);">-struct msgb;</span><br><span> </span><br><span> void gsm_net_update_ctype(struct gsm_network *network);</span><br><span> enum gsm_chan_t get_ctype_by_chreq(struct gsm_network *network, uint8_t ra);</span><br><span>diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h</span><br><span>index a2e103d..e6a7708 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -31,7 +31,6 @@</span><br><span> #include <osmocom/gsm/protocol/gsm_12_21.h></span><br><span> #include <osmocom/abis/e1_input.h></span><br><span> #include <osmocom/bsc/meas_rep.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/bsc_msg_filter.h></span><br><span> #include <osmocom/bsc/acc_ramp.h></span><br><span> #include <osmocom/bsc/neighbor_ident.h></span><br><span> #include <osmocom/bsc/osmux.h></span><br><span>@@ -265,9 +264,6 @@</span><br><span> /* state related to welcome USSD */</span><br><span> uint8_t new_subscriber;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* state related to osmo_bsc_filter.c */</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_filter_state filter_state;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* SCCP connection associatd with this subscriber_connection */</span><br><span> struct {</span><br><span> /* for advanced ping/pong */</span><br><span>diff --git a/include/osmocom/bsc/osmo_bsc.h b/include/osmocom/bsc/osmo_bsc.h</span><br><span>index 163e494..8999a2e 100644</span><br><span>--- a/include/osmocom/bsc/osmo_bsc.h</span><br><span>+++ b/include/osmocom/bsc/osmo_bsc.h</span><br><span>@@ -2,8 +2,6 @@</span><br><span> </span><br><span> #include <osmocom/gsm/protocol/gsm_04_08.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/bsc_msg_filter.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> #define BSS_SEND_USSD 1</span><br><span> </span><br><span> enum bsc_con {</span><br><span>@@ -13,6 +11,7 @@</span><br><span> BSC_CON_NO_MEM,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct msgb;</span><br><span> struct bsc_msc_data;</span><br><span> struct gsm0808_channel_type;</span><br><span> struct gsm0808_speech_codec_list;</span><br><span>diff --git a/src/Makefile.am b/src/Makefile.am</span><br><span>index 62ae4dd..43b00b2 100644</span><br><span>--- a/src/Makefile.am</span><br><span>+++ b/src/Makefile.am</span><br><span>@@ -20,7 +20,6 @@</span><br><span> $(NULL)</span><br><span> </span><br><span> SUBDIRS = \</span><br><span style="color: hsl(0, 100%, 40%);">- libfilter \</span><br><span> osmo-bsc \</span><br><span> utils \</span><br><span> $(NULL)</span><br><span>diff --git a/src/libfilter/Makefile.am b/src/libfilter/Makefile.am</span><br><span>deleted file mode 100644</span><br><span>index 8b0597b..0000000</span><br><span>--- a/src/libfilter/Makefile.am</span><br><span>+++ /dev/null</span><br><span>@@ -1,27 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-AM_CPPFLAGS = \</span><br><span style="color: hsl(0, 100%, 40%);">- $(all_includes) \</span><br><span style="color: hsl(0, 100%, 40%);">- -I$(top_srcdir)/include \</span><br><span style="color: hsl(0, 100%, 40%);">- -I$(top_builddir) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AM_CFLAGS = \</span><br><span style="color: hsl(0, 100%, 40%);">- -Wall \</span><br><span style="color: hsl(0, 100%, 40%);">- $(LIBOSMOCORE_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(LIBOSMOGSM_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(LIBOSMOVTY_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(LIBOSMOABIS_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(LIBOSMOSIGTRAN_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(LIBOSMOLEGACYMGCP_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(COVERAGE_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-noinst_LIBRARIES = \</span><br><span style="color: hsl(0, 100%, 40%);">- libfilter.a \</span><br><span style="color: hsl(0, 100%, 40%);">- $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-libfilter_a_SOURCES = \</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_msg_filter.c \</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_msg_acc.c \</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_msg_vty.c \</span><br><span style="color: hsl(0, 100%, 40%);">- $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>diff --git a/src/libfilter/bsc_msg_acc.c b/src/libfilter/bsc_msg_acc.c</span><br><span>deleted file mode 100644</span><br><span>index 8853dbb..0000000</span><br><span>--- a/src/libfilter/bsc_msg_acc.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,136 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/*</span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2010-2015 by Holger Hans Peter Freyther <zecke@selfish.org></span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2010-2011 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_msg_filter.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/debug.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/protocol/gsm_04_08.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/rate_ctr.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/stats.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <string.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static const struct rate_ctr_desc acc_list_ctr_description[] = {</span><br><span style="color: hsl(0, 100%, 40%);">- [ACC_LIST_LOCAL_FILTER] = { "access-list:local-filter", "Rejected by rule for local"},</span><br><span style="color: hsl(0, 100%, 40%);">- [ACC_LIST_GLOBAL_FILTER]= { "access-list:global-filter", "Rejected by rule for global"},</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static const struct rate_ctr_group_desc bsc_cfg_acc_list_desc = {</span><br><span style="color: hsl(0, 100%, 40%);">- .group_name_prefix = "nat:filter",</span><br><span style="color: hsl(0, 100%, 40%);">- .group_description = "NAT Access-List Statistics",</span><br><span style="color: hsl(0, 100%, 40%);">- .num_ctr = ARRAY_SIZE(acc_list_ctr_description),</span><br><span style="color: hsl(0, 100%, 40%);">- .ctr_desc = acc_list_ctr_description,</span><br><span style="color: hsl(0, 100%, 40%);">- .class_id = OSMO_STATS_CLASS_GLOBAL,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! Find an unused index for this rate counter group.</span><br><span style="color: hsl(0, 100%, 40%);">- * \param[in] head List of allocated ctr groups of the same type</span><br><span style="color: hsl(0, 100%, 40%);">- * \returns the largest used index number + 1, or 0 if none exist yet. */</span><br><span style="color: hsl(0, 100%, 40%);">-static unsigned int rate_ctr_get_unused_idx(struct llist_head *head)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int idx = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_msg_acc_lst *lst;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- llist_for_each_entry(lst, head, list) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (idx <= lst->stats->idx)</span><br><span style="color: hsl(0, 100%, 40%);">- idx = lst->stats->idx + 1;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- return idx;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int bsc_msg_acc_lst_check_allow(struct bsc_msg_acc_lst *lst, const char *mi_string)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_msg_acc_lst_entry *entry;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- llist_for_each_entry(entry, &lst->fltr_list, list) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (!entry->imsi_allow)</span><br><span style="color: hsl(0, 100%, 40%);">- continue;</span><br><span style="color: hsl(0, 100%, 40%);">- if (regexec(&entry->imsi_allow_re, mi_string, 0, NULL, 0) == 0)</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return 1;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct bsc_msg_acc_lst *bsc_msg_acc_lst_find(struct llist_head *head, const char *name)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_msg_acc_lst *lst;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!name)</span><br><span style="color: hsl(0, 100%, 40%);">- return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- llist_for_each_entry(lst, head, list)</span><br><span style="color: hsl(0, 100%, 40%);">- if (strcmp(lst->name, name) == 0)</span><br><span style="color: hsl(0, 100%, 40%);">- return lst;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct bsc_msg_acc_lst *bsc_msg_acc_lst_get(void *ctx, struct llist_head *head, const char *name)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_msg_acc_lst *lst;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int new_idx;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- lst = bsc_msg_acc_lst_find(head, name);</span><br><span style="color: hsl(0, 100%, 40%);">- if (lst)</span><br><span style="color: hsl(0, 100%, 40%);">- return lst;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- lst = talloc_zero(ctx, struct bsc_msg_acc_lst);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!lst) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DFILTER, LOGL_ERROR, "Failed to allocate access list\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%);">- new_idx = rate_ctr_get_unused_idx(head);</span><br><span style="color: hsl(0, 100%, 40%);">- lst->stats = rate_ctr_group_alloc(lst, &bsc_cfg_acc_list_desc, new_idx);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!lst->stats) {</span><br><span style="color: hsl(0, 100%, 40%);">- talloc_free(lst);</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%);">- INIT_LLIST_HEAD(&lst->fltr_list);</span><br><span style="color: hsl(0, 100%, 40%);">- lst->name = talloc_strdup(lst, name);</span><br><span style="color: hsl(0, 100%, 40%);">- llist_add_tail(&lst->list, head);</span><br><span style="color: hsl(0, 100%, 40%);">- return lst;</span><br><span 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_msg_acc_lst_delete(struct bsc_msg_acc_lst *lst)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- llist_del(&lst->list);</span><br><span style="color: hsl(0, 100%, 40%);">- rate_ctr_group_free(lst->stats);</span><br><span style="color: hsl(0, 100%, 40%);">- talloc_free(lst);</span><br><span 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_msg_acc_lst_entry *bsc_msg_acc_lst_entry_create(struct bsc_msg_acc_lst *lst)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_msg_acc_lst_entry *entry;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- entry = talloc_zero(lst, struct bsc_msg_acc_lst_entry);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!entry)</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%);">- entry->cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED;</span><br><span style="color: hsl(0, 100%, 40%);">- entry->lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED;</span><br><span style="color: hsl(0, 100%, 40%);">- llist_add_tail(&entry->list, &lst->fltr_list);</span><br><span style="color: hsl(0, 100%, 40%);">- return entry;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>diff --git a/src/libfilter/bsc_msg_filter.c b/src/libfilter/bsc_msg_filter.c</span><br><span>deleted file mode 100644</span><br><span>index 1318689..0000000</span><br><span>--- a/src/libfilter/bsc_msg_filter.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,339 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/*</span><br><span style="color: hsl(0, 100%, 40%);">- * Access filtering</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-/*</span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2010-2015 by Holger Hans Peter Freyther <zecke@selfish.org></span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2010-2012 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_msg_filter.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/gsm_data.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/bsc/ipaccess.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/gsm_04_08_rr.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/talloc.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/gsm0808.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/protocol/gsm_08_08.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/protocol/gsm_04_11.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/gsm48.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int bsc_filter_barr_find(struct rb_root *root, const char *imsi, int *cm, int *lu)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_filter_barr_entry *n;</span><br><span style="color: hsl(0, 100%, 40%);">- n = rb_entry(root->rb_node, struct bsc_filter_barr_entry, node);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- while (n) {</span><br><span style="color: hsl(0, 100%, 40%);">- int rc = strcmp(imsi, n->imsi);</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- *cm = n->cm_reject_cause;</span><br><span style="color: hsl(0, 100%, 40%);">- *lu = n->lu_reject_cause;</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%);">- n = rb_entry(</span><br><span style="color: hsl(0, 100%, 40%);">- (rc < 0) ? n->node.rb_left : n->node.rb_right,</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_filter_barr_entry, node);</span><br><span style="color: hsl(0, 100%, 40%);">- };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int lst_check_deny(struct bsc_msg_acc_lst *lst, const char *mi_string,</span><br><span style="color: hsl(0, 100%, 40%);">- int *cm_cause, int *lu_cause)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_msg_acc_lst_entry *entry;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- llist_for_each_entry(entry, &lst->fltr_list, list) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (!entry->imsi_deny)</span><br><span style="color: hsl(0, 100%, 40%);">- continue;</span><br><span style="color: hsl(0, 100%, 40%);">- if (regexec(&entry->imsi_deny_re, mi_string, 0, NULL, 0) == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- *cm_cause = entry->cm_reject_cause;</span><br><span style="color: hsl(0, 100%, 40%);">- *lu_cause = entry->lu_reject_cause;</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</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%);">-/* apply white/black list */</span><br><span style="color: hsl(0, 100%, 40%);">-static int auth_imsi(struct bsc_filter_request *req,</span><br><span style="color: hsl(0, 100%, 40%);">- const char *imsi,</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_filter_reject_cause *cause)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- /*</span><br><span style="color: hsl(0, 100%, 40%);">- * Now apply blacklist/whitelist of the BSC and the NAT.</span><br><span style="color: hsl(0, 100%, 40%);">- * 1.) Check the global IMSI barr list</span><br><span style="color: hsl(0, 100%, 40%);">- * 2.) Allow directly if the IMSI is allowed at the BSC</span><br><span style="color: hsl(0, 100%, 40%);">- * 3.) Reject if the IMSI is not allowed at the BSC</span><br><span style="color: hsl(0, 100%, 40%);">- * 4.) Allow directly if the IMSI is allowed at the global level</span><br><span style="color: hsl(0, 100%, 40%);">- * 5.) Reject if the IMSI not allowed at the global level.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">- int cm, lu;</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_msg_acc_lst *nat_lst = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_msg_acc_lst *bsc_lst = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* 1. global check for barred imsis */</span><br><span style="color: hsl(0, 100%, 40%);">- if (req->black_list && bsc_filter_barr_find(req->black_list, imsi, &cm, &lu)) {</span><br><span style="color: hsl(0, 100%, 40%);">- cause->cm_reject_cause = cm;</span><br><span style="color: hsl(0, 100%, 40%);">- cause->lu_reject_cause = lu;</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DFILTER, LOGL_DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">- "Blocking subscriber IMSI %s with CM: %d LU: %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">- imsi, cm, lu);</span><br><span style="color: hsl(0, 100%, 40%);">- return -4;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_lst = bsc_msg_acc_lst_find(req->access_lists, req->local_lst_name);</span><br><span style="color: hsl(0, 100%, 40%);">- nat_lst = bsc_msg_acc_lst_find(req->access_lists, req->global_lst_name);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (bsc_lst) {</span><br><span style="color: hsl(0, 100%, 40%);">- /* 2. BSC allow */</span><br><span style="color: hsl(0, 100%, 40%);">- if (bsc_msg_acc_lst_check_allow(bsc_lst, imsi) == 0)</span><br><span style="color: hsl(0, 100%, 40%);">- return 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* 3. BSC deny */</span><br><span style="color: hsl(0, 100%, 40%);">- if (lst_check_deny(bsc_lst, imsi, &cm, &lu) == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DFILTER, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">- "Filtering %s by imsi_deny on config nr: %d.\n", imsi, req->bsc_nr);</span><br><span style="color: hsl(0, 100%, 40%);">- rate_ctr_inc(&bsc_lst->stats->ctr[ACC_LIST_LOCAL_FILTER]);</span><br><span style="color: hsl(0, 100%, 40%);">- cause->cm_reject_cause = cm;</span><br><span style="color: hsl(0, 100%, 40%);">- cause->lu_reject_cause = lu;</span><br><span style="color: hsl(0, 100%, 40%);">- return -2;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (nat_lst) {</span><br><span style="color: hsl(0, 100%, 40%);">- /* 4. global allow */</span><br><span style="color: hsl(0, 100%, 40%);">- if (bsc_msg_acc_lst_check_allow(nat_lst, imsi) == 0)</span><br><span style="color: hsl(0, 100%, 40%);">- return 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* 5. global deny */</span><br><span style="color: hsl(0, 100%, 40%);">- if (lst_check_deny(nat_lst, imsi, &cm, &lu) == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DFILTER, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">- "Filtering %s global imsi_deny on bsc nr: %d.\n", imsi, req->bsc_nr);</span><br><span style="color: hsl(0, 100%, 40%);">- rate_ctr_inc(&nat_lst->stats->ctr[ACC_LIST_GLOBAL_FILTER]);</span><br><span style="color: hsl(0, 100%, 40%);">- cause->cm_reject_cause = cm;</span><br><span style="color: hsl(0, 100%, 40%);">- cause->lu_reject_cause = lu;</span><br><span style="color: hsl(0, 100%, 40%);">- return -3;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return 1;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int _cr_check_loc_upd(void *ctx,</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t *data, unsigned int length,</span><br><span style="color: hsl(0, 100%, 40%);">- char **imsi)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t mi_type;</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm48_loc_upd_req *lu;</span><br><span style="color: hsl(0, 100%, 40%);">- char mi_string[GSM48_MI_SIZE];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (length < sizeof(*lu)) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DFILTER, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">- "LU does not fit. Length is %d \n", length);</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%);">- lu = (struct gsm48_loc_upd_req *) data;</span><br><span style="color: hsl(0, 100%, 40%);">- mi_type = lu->mi[0] & GSM_MI_TYPE_MASK;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /*</span><br><span style="color: hsl(0, 100%, 40%);">- * We can only deal with the IMSI. This will fail for a phone that</span><br><span style="color: hsl(0, 100%, 40%);">- * will send the TMSI of a previous network to us.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">- if (mi_type != GSM_MI_TYPE_IMSI)</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%);">- gsm48_mi_to_string(mi_string, sizeof(mi_string), lu->mi, lu->mi_len);</span><br><span style="color: hsl(0, 100%, 40%);">- *imsi = talloc_strdup(ctx, mi_string);</span><br><span style="color: hsl(0, 100%, 40%);">- return 1;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int _cr_check_cm_serv_req(void *ctx,</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t *data, unsigned int length,</span><br><span style="color: hsl(0, 100%, 40%);">- int *con_type, char **imsi)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- static const uint32_t classmark_offset =</span><br><span style="color: hsl(0, 100%, 40%);">- offsetof(struct gsm48_service_request, classmark);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- char mi_string[GSM48_MI_SIZE];</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t mi_type;</span><br><span style="color: hsl(0, 100%, 40%);">- int rc;</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm48_service_request *req;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* unfortunately in Phase1 the classmark2 length is variable */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (length < sizeof(*req)) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DFILTER, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">- "CM Serv Req does not fit. Length is %d\n", length);</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%);">- req = (struct gsm48_service_request *) data;</span><br><span style="color: hsl(0, 100%, 40%);">- if (req->cm_service_type == 0x8)</span><br><span style="color: hsl(0, 100%, 40%);">- *con_type = FLT_CON_TYPE_SSA;</span><br><span style="color: hsl(0, 100%, 40%);">- rc = gsm48_extract_mi((uint8_t *) &req->classmark,</span><br><span style="color: hsl(0, 100%, 40%);">- length - classmark_offset, mi_string, &mi_type);</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DFILTER, LOGL_ERROR, "Failed to parse the classmark2/mi. error: %d\n", rc);</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%);">- /* we have to let the TMSI or such pass */</span><br><span style="color: hsl(0, 100%, 40%);">- if (mi_type != GSM_MI_TYPE_IMSI)</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%);">- *imsi = talloc_strdup(ctx, mi_string);</span><br><span style="color: hsl(0, 100%, 40%);">- return 1;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int _cr_check_pag_resp(void *ctx,</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t *data, unsigned int length, char **imsi)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm48_pag_resp *resp;</span><br><span style="color: hsl(0, 100%, 40%);">- char mi_string[GSM48_MI_SIZE];</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t mi_type;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (length < sizeof(*resp)) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DFILTER, LOGL_ERROR, "PAG RESP does not fit. Length was %d.\n", length);</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%);">- resp = (struct gsm48_pag_resp *) data;</span><br><span style="color: hsl(0, 100%, 40%);">- if (gsm48_paging_extract_mi(resp, length, mi_string, &mi_type) < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DFILTER, LOGL_ERROR, "Failed to extract the MI.\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return -1;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* we need to let it pass for now */</span><br><span style="color: hsl(0, 100%, 40%);">- if (mi_type != GSM_MI_TYPE_IMSI)</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%);">- *imsi = talloc_strdup(ctx, mi_string);</span><br><span style="color: hsl(0, 100%, 40%);">- return 1;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int _dt_check_id_resp(struct bsc_filter_request *req,</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t *data, unsigned int length,</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_filter_state *state,</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_filter_reject_cause *cause)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- char mi_string[GSM48_MI_SIZE];</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t mi_type;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (length < 2) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DFILTER, LOGL_ERROR, "mi does not fit.\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return -1;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (data[0] < length - 1) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DFILTER, LOGL_ERROR, "mi length too big.\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return -2;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- mi_type = data[1] & GSM_MI_TYPE_MASK;</span><br><span style="color: hsl(0, 100%, 40%);">- gsm48_mi_to_string(mi_string, sizeof(mi_string), &data[1], data[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (mi_type != GSM_MI_TYPE_IMSI)</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%);">- state->imsi_checked = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- state->imsi = talloc_strdup(req->ctx, mi_string);</span><br><span style="color: hsl(0, 100%, 40%);">- return auth_imsi(req, mi_string, cause);</span><br><span 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%);">-/* Filter out CR data... */</span><br><span style="color: hsl(0, 100%, 40%);">-int bsc_msg_filter_initial(struct gsm48_hdr *hdr48, size_t hdr48_len,</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_filter_request *req,</span><br><span style="color: hsl(0, 100%, 40%);">- int *con_type,</span><br><span style="color: hsl(0, 100%, 40%);">- char **imsi, struct bsc_filter_reject_cause *cause)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- int ret = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t msg_type, proto;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- *con_type = FLT_CON_TYPE_NONE;</span><br><span style="color: hsl(0, 100%, 40%);">- cause->cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED;</span><br><span style="color: hsl(0, 100%, 40%);">- cause->lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED;</span><br><span style="color: hsl(0, 100%, 40%);">- *imsi = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- proto = gsm48_hdr_pdisc(hdr48);</span><br><span style="color: hsl(0, 100%, 40%);">- msg_type = gsm48_hdr_msg_type(hdr48);</span><br><span style="color: hsl(0, 100%, 40%);">- if (proto == GSM48_PDISC_MM &&</span><br><span style="color: hsl(0, 100%, 40%);">- msg_type == GSM48_MT_MM_LOC_UPD_REQUEST) {</span><br><span style="color: hsl(0, 100%, 40%);">- *con_type = FLT_CON_TYPE_LU;</span><br><span style="color: hsl(0, 100%, 40%);">- ret = _cr_check_loc_upd(req->ctx, &hdr48->data[0],</span><br><span style="color: hsl(0, 100%, 40%);">- hdr48_len - sizeof(*hdr48), imsi);</span><br><span style="color: hsl(0, 100%, 40%);">- } else if (proto == GSM48_PDISC_MM &&</span><br><span style="color: hsl(0, 100%, 40%);">- msg_type == GSM48_MT_MM_CM_SERV_REQ) {</span><br><span style="color: hsl(0, 100%, 40%);">- *con_type = FLT_CON_TYPE_CM_SERV_REQ;</span><br><span style="color: hsl(0, 100%, 40%);">- ret = _cr_check_cm_serv_req(req->ctx, &hdr48->data[0],</span><br><span style="color: hsl(0, 100%, 40%);">- hdr48_len - sizeof(*hdr48),</span><br><span style="color: hsl(0, 100%, 40%);">- con_type, imsi);</span><br><span style="color: hsl(0, 100%, 40%);">- } else if (proto == GSM48_PDISC_RR &&</span><br><span style="color: hsl(0, 100%, 40%);">- msg_type == GSM48_MT_RR_PAG_RESP) {</span><br><span style="color: hsl(0, 100%, 40%);">- *con_type = FLT_CON_TYPE_PAG_RESP;</span><br><span style="color: hsl(0, 100%, 40%);">- ret = _cr_check_pag_resp(req->ctx, &hdr48->data[0],</span><br><span style="color: hsl(0, 100%, 40%);">- hdr48_len - sizeof(*hdr48), imsi);</span><br><span style="color: hsl(0, 100%, 40%);">- } else {</span><br><span style="color: hsl(0, 100%, 40%);">- /* We only want to filter the above, let other things pass */</span><br><span style="color: hsl(0, 100%, 40%);">- *con_type = FLT_CON_TYPE_OTHER;</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* check if we are done */</span><br><span style="color: hsl(0, 100%, 40%);">- if (ret != 1)</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%);">- /* the memory allocation failed */</span><br><span style="color: hsl(0, 100%, 40%);">- if (!*imsi)</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%);">- /* now check the imsi */</span><br><span style="color: hsl(0, 100%, 40%);">- return auth_imsi(req, *imsi, cause);</span><br><span 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_msg_filter_data(struct gsm48_hdr *hdr48, size_t len,</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_filter_request *req,</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_filter_state *state,</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_filter_reject_cause *cause)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t msg_type, proto;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- cause->cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED;</span><br><span style="color: hsl(0, 100%, 40%);">- cause->lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (state->imsi_checked)</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%);">- proto = gsm48_hdr_pdisc(hdr48);</span><br><span style="color: hsl(0, 100%, 40%);">- msg_type = gsm48_hdr_msg_type(hdr48);</span><br><span style="color: hsl(0, 100%, 40%);">- if (proto != GSM48_PDISC_MM || msg_type != GSM48_MT_MM_ID_RESP)</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return _dt_check_id_resp(req, &hdr48->data[0],</span><br><span style="color: hsl(0, 100%, 40%);">- len - sizeof(*hdr48), state, cause);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span>diff --git a/src/libfilter/bsc_msg_vty.c b/src/libfilter/bsc_msg_vty.c</span><br><span>deleted file mode 100644</span><br><span>index b26f4f1..0000000</span><br><span>--- a/src/libfilter/bsc_msg_vty.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,149 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* (C) 2010-2015 by Holger Hans Peter Freyther</span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2010-2013 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_msg_filter.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/gsm_data.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/vty.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/vty/misc.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct llist_head *_acc_lst;</span><br><span style="color: hsl(0, 100%, 40%);">-static void *_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void bsc_msg_acc_lst_write_one(struct vty *vty, struct bsc_msg_acc_lst *lst)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_msg_acc_lst_entry *entry;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- llist_for_each_entry(entry, &lst->fltr_list, list) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (entry->imsi_allow)</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " access-list %s imsi-allow %s%s",</span><br><span style="color: hsl(0, 100%, 40%);">- lst->name, entry->imsi_allow, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- if (entry->imsi_deny)</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " access-list %s imsi-deny %s %d %d%s",</span><br><span style="color: hsl(0, 100%, 40%);">- lst->name, entry->imsi_deny,</span><br><span style="color: hsl(0, 100%, 40%);">- entry->cm_reject_cause, entry->lu_reject_cause,</span><br><span style="color: hsl(0, 100%, 40%);">- VTY_NEWLINE);</span><br><span 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%);">-DEFUN(cfg_lst_no,</span><br><span style="color: hsl(0, 100%, 40%);">- cfg_lst_no_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">- "no access-list NAME",</span><br><span style="color: hsl(0, 100%, 40%);">- NO_STR "Remove an access-list by name\n"</span><br><span style="color: hsl(0, 100%, 40%);">- "The access-list to remove\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_msg_acc_lst *acc;</span><br><span style="color: hsl(0, 100%, 40%);">- acc = bsc_msg_acc_lst_find(_acc_lst, argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!acc)</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%);">- bsc_msg_acc_lst_delete(acc);</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(show_acc_lst,</span><br><span style="color: hsl(0, 100%, 40%);">- show_acc_lst_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">- "show access-list NAME",</span><br><span style="color: hsl(0, 100%, 40%);">- SHOW_STR "IMSI access list\n" "Name of the access list\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_msg_acc_lst *acc;</span><br><span style="color: hsl(0, 100%, 40%);">- acc = bsc_msg_acc_lst_find(_acc_lst, argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!acc)</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%);">- vty_out(vty, "access-list %s%s", acc->name, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_msg_acc_lst_write_one(vty, acc);</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out_rate_ctr_group(vty, " ", acc->stats);</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 style="color: hsl(0, 100%, 40%);">-DEFUN(cfg_lst_imsi_allow,</span><br><span style="color: hsl(0, 100%, 40%);">- cfg_lst_imsi_allow_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">- "access-list NAME imsi-allow [REGEXP]",</span><br><span style="color: hsl(0, 100%, 40%);">- "Access list commands\n"</span><br><span style="color: hsl(0, 100%, 40%);">- "Name of the access list\n"</span><br><span style="color: hsl(0, 100%, 40%);">- "Add allowed IMSI to the list\n"</span><br><span style="color: hsl(0, 100%, 40%);">- "Regexp for IMSIs\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_msg_acc_lst *acc;</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_msg_acc_lst_entry *entry;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- acc = bsc_msg_acc_lst_get(_ctx, _acc_lst, argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!acc)</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%);">- entry = bsc_msg_acc_lst_entry_create(acc);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!entry)</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%);">- if (gsm_parse_reg(acc, &entry->imsi_allow_re, &entry->imsi_allow, argc - 1, &argv[1]) != 0)</span><br><span style="color: hsl(0, 100%, 40%);">- return CMD_WARNING;</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_lst_imsi_deny,</span><br><span style="color: hsl(0, 100%, 40%);">- cfg_lst_imsi_deny_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">- "access-list NAME imsi-deny [REGEXP] (<0-256>) (<0-256>)",</span><br><span style="color: hsl(0, 100%, 40%);">- "Access list commands\n"</span><br><span style="color: hsl(0, 100%, 40%);">- "Name of the access list\n"</span><br><span style="color: hsl(0, 100%, 40%);">- "Add denied IMSI to the list\n"</span><br><span style="color: hsl(0, 100%, 40%);">- "Regexp for IMSIs\n"</span><br><span style="color: hsl(0, 100%, 40%);">- "CM Service Reject reason\n"</span><br><span style="color: hsl(0, 100%, 40%);">- "LU Reject reason\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_msg_acc_lst *acc;</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_msg_acc_lst_entry *entry;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- acc = bsc_msg_acc_lst_get(_ctx, _acc_lst, argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!acc)</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%);">- entry = bsc_msg_acc_lst_entry_create(acc);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!entry)</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%);">- if (gsm_parse_reg(acc, &entry->imsi_deny_re, &entry->imsi_deny, argc - 1, &argv[1]) != 0)</span><br><span style="color: hsl(0, 100%, 40%);">- return CMD_WARNING;</span><br><span style="color: hsl(0, 100%, 40%);">- if (argc >= 3)</span><br><span style="color: hsl(0, 100%, 40%);">- entry->cm_reject_cause = atoi(argv[2]);</span><br><span style="color: hsl(0, 100%, 40%);">- if (argc >= 4)</span><br><span style="color: hsl(0, 100%, 40%);">- entry->lu_reject_cause = atoi(argv[3]);</span><br><span style="color: hsl(0, 100%, 40%);">- return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void bsc_msg_acc_lst_write(struct vty *vty)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_msg_acc_lst *lst;</span><br><span style="color: hsl(0, 100%, 40%);">- llist_for_each_entry(lst, _acc_lst, list) {</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_msg_acc_lst_write_one(vty, lst);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void bsc_msg_acc_lst_vty_init(void *ctx, struct llist_head *lst, int node)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- _ctx = ctx;</span><br><span style="color: hsl(0, 100%, 40%);">- _acc_lst = lst;</span><br><span style="color: hsl(0, 100%, 40%);">- install_element_ve(&show_acc_lst_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* access-list */</span><br><span style="color: hsl(0, 100%, 40%);">- install_element(node, &cfg_lst_imsi_allow_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">- install_element(node, &cfg_lst_imsi_deny_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">- install_element(node, &cfg_lst_no_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span>diff --git a/src/osmo-bsc/Makefile.am b/src/osmo-bsc/Makefile.am</span><br><span>index 51d8875..6009e1d 100644</span><br><span>--- a/src/osmo-bsc/Makefile.am</span><br><span>+++ b/src/osmo-bsc/Makefile.am</span><br><span>@@ -94,7 +94,6 @@</span><br><span> $(NULL)</span><br><span> </span><br><span> osmo_bsc_LDADD = \</span><br><span style="color: hsl(0, 100%, 40%);">- $(top_builddir)/src/libfilter/libfilter.a \</span><br><span> $(LIBOSMOCORE_LIBS) \</span><br><span> $(LIBOSMOGSM_LIBS) \</span><br><span> $(LIBOSMOVTY_LIBS) \</span><br><span>diff --git a/src/osmo-bsc/gsm_08_08.c b/src/osmo-bsc/gsm_08_08.c</span><br><span>index 8a4b1c5..030808b 100644</span><br><span>--- a/src/osmo-bsc/gsm_08_08.c</span><br><span>+++ b/src/osmo-bsc/gsm_08_08.c</span><br><span>@@ -58,70 +58,6 @@</span><br><span> static bool complete_layer3(struct gsm_subscriber_connection *conn,</span><br><span> struct msgb *msg, struct bsc_msc_data *msc);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void bsc_maybe_lu_reject(struct gsm_subscriber_connection *conn, int con_type, int cause)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct msgb *msg;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* ignore cm service request or such */</span><br><span style="color: hsl(0, 100%, 40%);">- if (con_type != FLT_CON_TYPE_LU)</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%);">- msg = gsm48_create_loc_upd_rej(cause);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!msg) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DMM, LOGL_ERROR, "Failed to create msg for LOCATION UPDATING REJECT.\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- msg->lchan = conn->lchan;</span><br><span style="color: hsl(0, 100%, 40%);">- gscon_submit_rsl_dtap(conn, msg, 0, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int bsc_filter_initial(struct osmo_bsc_data *bsc,</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_msc_data *msc,</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_subscriber_connection *conn,</span><br><span style="color: hsl(0, 100%, 40%);">- struct msgb *msg, char **imsi, int *con_type,</span><br><span style="color: hsl(0, 100%, 40%);">- int *lu_cause)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_filter_request req;</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_filter_reject_cause cause;</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm48_hdr *gh = msgb_l3(msg);</span><br><span style="color: hsl(0, 100%, 40%);">- int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- req.ctx = conn;</span><br><span style="color: hsl(0, 100%, 40%);">- req.black_list = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">- req.access_lists = bsc_access_lists();</span><br><span style="color: hsl(0, 100%, 40%);">- req.local_lst_name = msc->acc_lst_name;</span><br><span style="color: hsl(0, 100%, 40%);">- req.global_lst_name = conn_get_bts(conn)->network->bsc_data->acc_lst_name;</span><br><span style="color: hsl(0, 100%, 40%);">- req.bsc_nr = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- rc = bsc_msg_filter_initial(gh, msgb_l3len(msg), &req,</span><br><span style="color: hsl(0, 100%, 40%);">- con_type, imsi, &cause);</span><br><span style="color: hsl(0, 100%, 40%);">- *lu_cause = cause.lu_reject_cause;</span><br><span style="color: hsl(0, 100%, 40%);">- return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int bsc_filter_data(struct gsm_subscriber_connection *conn,</span><br><span style="color: hsl(0, 100%, 40%);">- struct msgb *msg, int *lu_cause)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_filter_request req;</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm48_hdr *gh = msgb_l3(msg);</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_filter_reject_cause cause;</span><br><span style="color: hsl(0, 100%, 40%);">- int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- req.ctx = conn;</span><br><span style="color: hsl(0, 100%, 40%);">- req.black_list = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">- req.access_lists = bsc_access_lists();</span><br><span style="color: hsl(0, 100%, 40%);">- req.local_lst_name = conn->sccp.msc->acc_lst_name;</span><br><span style="color: hsl(0, 100%, 40%);">- req.global_lst_name = conn_get_bts(conn)->network->bsc_data->acc_lst_name;</span><br><span style="color: hsl(0, 100%, 40%);">- req.bsc_nr = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- rc = bsc_msg_filter_data(gh, msgb_l3len(msg), &req,</span><br><span style="color: hsl(0, 100%, 40%);">- &conn->filter_state,</span><br><span style="color: hsl(0, 100%, 40%);">- &cause);</span><br><span style="color: hsl(0, 100%, 40%);">- *lu_cause = cause.lu_reject_cause;</span><br><span style="color: hsl(0, 100%, 40%);">- return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /*! BTS->MSC: tell MSC a SAPI was not established. */</span><br><span> void bsc_sapi_n_reject(struct gsm_subscriber_connection *conn, int dlci)</span><br><span> {</span><br><span>@@ -489,22 +425,12 @@</span><br><span> static bool complete_layer3(struct gsm_subscriber_connection *conn,</span><br><span> struct msgb *msg, struct bsc_msc_data *msc)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- int con_type, rc, lu_cause;</span><br><span style="color: hsl(0, 100%, 40%);">- char *imsi = NULL;</span><br><span> struct msgb *resp;</span><br><span> enum bsc_con ret;</span><br><span> struct gsm0808_speech_codec_list scl;</span><br><span> </span><br><span> log_set_context(LOG_CTX_BSC_SUBSCR, conn->bsub);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Check the filter */</span><br><span style="color: hsl(0, 100%, 40%);">- rc = bsc_filter_initial(msc->network->bsc_data, msc, conn, msg,</span><br><span style="color: hsl(0, 100%, 40%);">- &imsi, &con_type, &lu_cause);</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_maybe_lu_reject(conn, con_type, lu_cause);</span><br><span style="color: hsl(0, 100%, 40%);">- goto early_fail;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* allocate resource for a new connection */</span><br><span> ret = osmo_bsc_sigtran_new_conn(conn, msc);</span><br><span> </span><br><span>@@ -517,28 +443,6 @@</span><br><span> goto early_fail;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* TODO: also extract TMSI. We get an IMSI only when an initial L3 Complete comes in that</span><br><span style="color: hsl(0, 100%, 40%);">- * contains an IMSI. We filter by IMSI. A TMSI identity is never returned here, see e.g.</span><br><span style="color: hsl(0, 100%, 40%);">- * _cr_check_loc_upd() and other similar functions called from bsc_msg_filter_initial(). */</span><br><span style="color: hsl(0, 100%, 40%);">- if (imsi) {</span><br><span style="color: hsl(0, 100%, 40%);">- conn->filter_state.imsi = talloc_steal(conn, imsi);</span><br><span style="color: hsl(0, 100%, 40%);">- if (conn->bsub) {</span><br><span style="color: hsl(0, 100%, 40%);">- log_set_context(LOG_CTX_BSC_SUBSCR, conn->bsub);</span><br><span style="color: hsl(0, 100%, 40%);">- /* Already a subscriber on L3 Complete? Should never happen... */</span><br><span style="color: hsl(0, 100%, 40%);">- if (conn->bsub->imsi[0]</span><br><span style="color: hsl(0, 100%, 40%);">- && strcmp(conn->bsub->imsi, imsi))</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DMSC, LOGL_ERROR, "Subscriber's IMSI changes from %s to %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">- conn->bsub->imsi, imsi);</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_subscr_set_imsi(conn->bsub, imsi);</span><br><span style="color: hsl(0, 100%, 40%);">- } else {</span><br><span style="color: hsl(0, 100%, 40%);">- conn->bsub = bsc_subscr_find_or_create_by_imsi(msc->network->bsc_subscribers,</span><br><span style="color: hsl(0, 100%, 40%);">- imsi);</span><br><span style="color: hsl(0, 100%, 40%);">- log_set_context(LOG_CTX_BSC_SUBSCR, conn->bsub);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- gscon_update_id(conn);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- conn->filter_state.con_type = con_type;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* check return value, if failed check msg for and send USSD */</span><br><span> </span><br><span> bsc_scan_bts_msg(conn, msg);</span><br><span>@@ -664,8 +568,6 @@</span><br><span> /*! MS->BSC/MSC: Um L3 message. */</span><br><span> void bsc_dtap(struct gsm_subscriber_connection *conn, uint8_t link_id, struct msgb *msg)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- int lu_cause;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> log_set_context(LOG_CTX_BSC_SUBSCR, conn->bsub);</span><br><span> </span><br><span> if (!msc_connected(conn))</span><br><span>@@ -680,15 +582,6 @@</span><br><span> if (handle_cc_setup(conn, msg) >= 1)</span><br><span> goto done;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Check the filter */</span><br><span style="color: hsl(0, 100%, 40%);">- if (bsc_filter_data(conn, msg, &lu_cause) < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_maybe_lu_reject(conn,</span><br><span style="color: hsl(0, 100%, 40%);">- conn->filter_state.con_type,</span><br><span style="color: hsl(0, 100%, 40%);">- lu_cause);</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_clear_request(conn, 0);</span><br><span style="color: hsl(0, 100%, 40%);">- goto done;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> bsc_scan_bts_msg(conn, msg);</span><br><span> </span><br><span> /* Store link_id in msg->cb */</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 ad5a3a9..42d05b1 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>@@ -84,12 +84,6 @@</span><br><span> static const char *config_file = "osmo-bsc.cfg";</span><br><span> static const char *rf_ctrl = NULL;</span><br><span> static int daemonize = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-static LLIST_HEAD(access_lists);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct llist_head *bsc_access_lists(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- return &access_lists;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span> </span><br><span> static void print_usage()</span><br><span> {</span><br><span>@@ -841,7 +835,6 @@</span><br><span> /* This needs to precede handle_options() */</span><br><span> vty_init(&vty_info);</span><br><span> bsc_vty_init(bsc_gsmnet);</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_msg_acc_lst_vty_init(tall_bsc_ctx, &access_lists, BSC_NODE);</span><br><span> ctrl_vty_init(tall_bsc_ctx);</span><br><span> logging_vty_add_deprecated_subsys(tall_bsc_ctx, "cc");</span><br><span> logging_vty_add_deprecated_subsys(tall_bsc_ctx, "mgcp");</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 7174de1..cf995cc 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>@@ -25,7 +25,6 @@</span><br><span> #include <osmocom/bsc/vty.h></span><br><span> #include <osmocom/bsc/bsc_subscriber.h></span><br><span> #include <osmocom/bsc/debug.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/bsc_msg_filter.h></span><br><span> #include <osmocom/bsc/osmux.h></span><br><span> </span><br><span> #include <osmocom/core/talloc.h></span><br><span>@@ -161,9 +160,6 @@</span><br><span> if (msc->local_pref)</span><br><span> vty_out(vty, " local-prefix %s%s", msc->local_pref, VTY_NEWLINE);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (msc->acc_lst_name)</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " access-list-name %s%s", msc->acc_lst_name, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* write amr options */</span><br><span> write_msc_amr_options(vty, msc);</span><br><span> </span><br><span>@@ -232,10 +228,6 @@</span><br><span> vty_out(vty, " missing-msc-text %s%s", bsc->ussd_no_msc_txt, VTY_NEWLINE);</span><br><span> else</span><br><span> vty_out(vty, " no missing-msc-text%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- if (bsc->acc_lst_name)</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " access-list-name %s%s", bsc->acc_lst_name, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_msg_acc_lst_write(vty);</span><br><span> </span><br><span> return CMD_SUCCESS;</span><br><span> }</span><br><span>@@ -528,33 +520,6 @@</span><br><span> AMR_COMMAND(5_15)</span><br><span> AMR_COMMAND(4_75)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN(cfg_msc_acc_lst_name,</span><br><span style="color: hsl(0, 100%, 40%);">- cfg_msc_acc_lst_name_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">- "access-list-name NAME",</span><br><span style="color: hsl(0, 100%, 40%);">- "Set the name of the access list to use.\n"</span><br><span style="color: hsl(0, 100%, 40%);">- "The name of the to be used access list.\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_msc_data *msc = bsc_msc_data(vty);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_talloc_replace_string(msc, &msc->acc_lst_name, argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">- return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN(cfg_msc_no_acc_lst_name,</span><br><span style="color: hsl(0, 100%, 40%);">- cfg_msc_no_acc_lst_name_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">- "no access-list-name",</span><br><span style="color: hsl(0, 100%, 40%);">- NO_STR "Remove the access list from the NAT.\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_msc_data *msc = bsc_msc_data(vty);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (msc->acc_lst_name) {</span><br><span style="color: hsl(0, 100%, 40%);">- talloc_free(msc->acc_lst_name);</span><br><span style="color: hsl(0, 100%, 40%);">- msc->acc_lst_name = 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%);">- return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* Make sure only standard SSN numbers are used. If no ssn number is</span><br><span> * configured, silently apply the default SSN */</span><br><span> static void enforce_standard_ssn(struct vty *vty, struct osmo_sccp_addr *addr)</span><br><span>@@ -781,33 +746,6 @@</span><br><span> return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN(cfg_bsc_acc_lst_name,</span><br><span style="color: hsl(0, 100%, 40%);">- cfg_bsc_acc_lst_name_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">- "access-list-name NAME",</span><br><span style="color: hsl(0, 100%, 40%);">- "Set the name of the access list to use.\n"</span><br><span style="color: hsl(0, 100%, 40%);">- "The name of the to be used access list.\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct osmo_bsc_data *bsc = osmo_bsc_data(vty);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_talloc_replace_string(bsc, &bsc->acc_lst_name, argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">- return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN(cfg_bsc_no_acc_lst_name,</span><br><span style="color: hsl(0, 100%, 40%);">- cfg_bsc_no_acc_lst_name_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">- "no access-list-name",</span><br><span style="color: hsl(0, 100%, 40%);">- NO_STR "Remove the access list from the BSC\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct osmo_bsc_data *bsc = osmo_bsc_data(vty);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (bsc->acc_lst_name) {</span><br><span style="color: hsl(0, 100%, 40%);">- talloc_free(bsc->acc_lst_name);</span><br><span style="color: hsl(0, 100%, 40%);">- bsc->acc_lst_name = 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%);">- 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(show_statistics,</span><br><span> show_statistics_cmd,</span><br><span> "show statistics",</span><br><span>@@ -1005,8 +943,6 @@</span><br><span> install_element(BSC_NODE, &cfg_net_no_rf_off_time_cmd);</span><br><span> install_element(BSC_NODE, &cfg_net_bsc_missing_msc_ussd_cmd);</span><br><span> install_element(BSC_NODE, &cfg_net_bsc_no_missing_msc_text_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">- install_element(BSC_NODE, &cfg_bsc_acc_lst_name_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">- install_element(BSC_NODE, &cfg_bsc_no_acc_lst_name_cmd);</span><br><span> </span><br><span> install_node(&msc_node, config_write_msc);</span><br><span> install_element(MSC_NODE, &cfg_net_bsc_ncc_cmd);</span><br><span>@@ -1037,8 +973,6 @@</span><br><span> install_element(MSC_NODE, &cfg_net_msc_amr_octet_align_cmd);</span><br><span> install_element(MSC_NODE, &cfg_net_msc_lcls_mode_cmd);</span><br><span> install_element(MSC_NODE, &cfg_net_msc_lcls_mismtch_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">- install_element(MSC_NODE, &cfg_msc_acc_lst_name_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">- install_element(MSC_NODE, &cfg_msc_no_acc_lst_name_cmd);</span><br><span> install_element(MSC_NODE, &cfg_msc_cs7_bsc_addr_cmd);</span><br><span> install_element(MSC_NODE, &cfg_msc_cs7_msc_addr_cmd);</span><br><span> install_element(MSC_NODE, &cfg_msc_cs7_asp_proto_cmd);</span><br><span>diff --git a/tests/handover/Makefile.am b/tests/handover/Makefile.am</span><br><span>index 8bd0012..901d523 100644</span><br><span>--- a/tests/handover/Makefile.am</span><br><span>+++ b/tests/handover/Makefile.am</span><br><span>@@ -41,8 +41,6 @@</span><br><span> $(NULL)</span><br><span> </span><br><span> handover_test_LDADD = \</span><br><span style="color: hsl(0, 100%, 40%);">- $(top_builddir)/src/libfilter/bsc_msg_acc.o \</span><br><span style="color: hsl(0, 100%, 40%);">- $(top_builddir)/src/libfilter/bsc_msg_vty.o \</span><br><span> $(top_builddir)/src/osmo-bsc/a_reset.o \</span><br><span> $(top_builddir)/src/osmo-bsc/abis_nm.o \</span><br><span> $(top_builddir)/src/osmo-bsc/abis_nm_vty.o \</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/18495">change 18495</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/c/osmo-bsc/+/18495"/><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-Change-Id: I89727af5387e8360362e995fdee959883c37d89a </div>
<div style="display:none"> Gerrit-Change-Number: 18495 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>