blob: a9dedf43c677d2c78b19c7919f13cb844d19f5ab [file] [log] [blame]
Holger Hans Peter Freyther973dbae2015-04-04 20:47:03 +02001#pragma once
2
3#include <osmocom/core/msgb.h>
4#include <osmocom/core/msgfile.h>
5#include <osmocom/core/linuxrbtree.h>
6#include <osmocom/core/linuxlist.h>
7
8#include <regex.h>
9
Holger Hans Peter Freytherd04d0092015-04-04 22:14:34 +020010struct vty;
Holger Hans Peter Freyther4ba947b2015-04-05 18:07:45 +020011struct gsm48_hdr;
Holger Hans Peter Freytherd04d0092015-04-04 22:14:34 +020012
Holger Hans Peter Freytherc36a6d52015-04-05 16:55:28 +020013struct bsc_filter_reject_cause {
Holger Hans Peter Freyther973dbae2015-04-04 20:47:03 +020014 int lu_reject_cause;
15 int cm_reject_cause;
16};
17
Holger Hans Peter Freytherc36a6d52015-04-05 16:55:28 +020018struct bsc_filter_barr_entry {
Holger Hans Peter Freyther973dbae2015-04-04 20:47:03 +020019 struct rb_node node;
20
21 char *imsi;
22 int cm_reject_cause;
23 int lu_reject_cause;
24};
25
Holger Hans Peter Freytherc36a6d52015-04-05 16:55:28 +020026enum bsc_filter_acc_ctr {
Holger Hans Peter Freyther14b2cd92015-04-05 16:50:34 +020027 ACC_LIST_LOCAL_FILTER,
28 ACC_LIST_GLOBAL_FILTER,
Holger Hans Peter Freyther973dbae2015-04-04 20:47:03 +020029};
30
Holger Hans Peter Freythera1e6bd62015-04-04 22:40:12 +020031struct bsc_msg_acc_lst {
Holger Hans Peter Freyther973dbae2015-04-04 20:47:03 +020032 struct llist_head list;
33
34 /* counter */
35 struct rate_ctr_group *stats;
36
37 /* the name of the list */
38 const char *name;
39 struct llist_head fltr_list;
40};
41
Holger Hans Peter Freythera1e6bd62015-04-04 22:40:12 +020042struct bsc_msg_acc_lst_entry {
Holger Hans Peter Freyther973dbae2015-04-04 20:47:03 +020043 struct llist_head list;
44
45 /* the filter */
46 char *imsi_allow;
47 regex_t imsi_allow_re;
48 char *imsi_deny;
49 regex_t imsi_deny_re;
50
51 /* reject reasons for the access lists */
52 int cm_reject_cause;
53 int lu_reject_cause;
54};
55
Holger Hans Peter Freytherc6529132015-04-05 21:03:49 +020056enum {
57 FLT_CON_TYPE_NONE,
58 FLT_CON_TYPE_LU,
59 FLT_CON_TYPE_CM_SERV_REQ,
60 FLT_CON_TYPE_PAG_RESP,
61 FLT_CON_TYPE_SSA,
62 FLT_CON_TYPE_LOCAL_REJECT,
63 FLT_CON_TYPE_OTHER,
64};
65
66
Holger Hans Peter Freytherc09f8a32015-04-05 19:13:27 +020067struct bsc_filter_state {
68 char *imsi;
69 int imsi_checked;
Holger Hans Peter Freytherc6529132015-04-05 21:03:49 +020070 int con_type;
Holger Hans Peter Freytherc09f8a32015-04-05 19:13:27 +020071};
72
Holger Hans Peter Freyther4e8176d2015-04-05 19:20:09 +020073struct bsc_filter_request {
74 void *ctx;
75 struct rb_root *black_list;
76 struct llist_head *access_lists;
77 const char *local_lst_name;
78 const char *global_lst_name;
79 int bsc_nr;
80};
81
Holger Hans Peter Freyther973dbae2015-04-04 20:47:03 +020082
Holger Hans Peter Freytherc36a6d52015-04-05 16:55:28 +020083int bsc_filter_barr_adapt(void *ctx, struct rb_root *rbtree, const struct osmo_config_list *);
84int bsc_filter_barr_find(struct rb_root *root, const char *imsi, int *cm, int *lu);
Holger Hans Peter Freyther973dbae2015-04-04 20:47:03 +020085
86/**
87 * Content filtering.
88 */
Holger Hans Peter Freyther4ba947b2015-04-05 18:07:45 +020089int bsc_msg_filter_initial(struct gsm48_hdr *hdr, size_t size,
Holger Hans Peter Freyther4e8176d2015-04-05 19:20:09 +020090 struct bsc_filter_request *req,
Holger Hans Peter Freyther4ba947b2015-04-05 18:07:45 +020091 int *con_type, char **imsi,
Holger Hans Peter Freytherc36a6d52015-04-05 16:55:28 +020092 struct bsc_filter_reject_cause *cause);
Holger Hans Peter Freyther4ba947b2015-04-05 18:07:45 +020093int bsc_msg_filter_data(struct gsm48_hdr *hdr, size_t size,
Holger Hans Peter Freyther4e8176d2015-04-05 19:20:09 +020094 struct bsc_filter_request *req,
Holger Hans Peter Freytherc09f8a32015-04-05 19:13:27 +020095 struct bsc_filter_state *state,
Holger Hans Peter Freytherc36a6d52015-04-05 16:55:28 +020096 struct bsc_filter_reject_cause *cause);
Holger Hans Peter Freyther973dbae2015-04-04 20:47:03 +020097
Holger Hans Peter Freyther4579bb12015-04-04 21:55:08 +020098/* IMSI allow/deny handling */
Holger Hans Peter Freythera1e6bd62015-04-04 22:40:12 +020099struct bsc_msg_acc_lst *bsc_msg_acc_lst_find(struct llist_head *lst, const char *name);
100struct bsc_msg_acc_lst *bsc_msg_acc_lst_get(void *ctx, struct llist_head *lst, const char *name);
101void bsc_msg_acc_lst_delete(struct bsc_msg_acc_lst *lst);
Holger Hans Peter Freyther4579bb12015-04-04 21:55:08 +0200102
Holger Hans Peter Freythera1e6bd62015-04-04 22:40:12 +0200103struct bsc_msg_acc_lst_entry *bsc_msg_acc_lst_entry_create(struct bsc_msg_acc_lst *);
104int bsc_msg_acc_lst_check_allow(struct bsc_msg_acc_lst *lst, const char *imsi);
Holger Hans Peter Freyther4579bb12015-04-04 21:55:08 +0200105
Holger Hans Peter Freythera1e6bd62015-04-04 22:40:12 +0200106void bsc_msg_lst_vty_init(void *ctx, struct llist_head *lst, int node);
107void bsc_msg_acc_lst_write(struct vty *vty, struct bsc_msg_acc_lst *lst);