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