filter: Remove nat from bsc_nat_acc_lst and replace with msg
This commit is contained in:
parent
d7e04b9956
commit
a1e6bd6768
|
@ -32,7 +32,7 @@ enum bsc_nat_acc_ctr {
|
|||
ACC_LIST_NAT_FILTER,
|
||||
};
|
||||
|
||||
struct bsc_nat_acc_lst {
|
||||
struct bsc_msg_acc_lst {
|
||||
struct llist_head list;
|
||||
|
||||
/* counter */
|
||||
|
@ -43,7 +43,7 @@ struct bsc_nat_acc_lst {
|
|||
struct llist_head fltr_list;
|
||||
};
|
||||
|
||||
struct bsc_nat_acc_lst_entry {
|
||||
struct bsc_msg_acc_lst_entry {
|
||||
struct llist_head list;
|
||||
|
||||
/* the filter */
|
||||
|
@ -72,12 +72,12 @@ int bsc_nat_filter_dt(struct bsc_connection *bsc, struct msgb *msg,
|
|||
struct bsc_nat_reject_cause *cause);
|
||||
|
||||
/* IMSI allow/deny handling */
|
||||
struct bsc_nat_acc_lst *bsc_nat_acc_lst_find(struct llist_head *lst, const char *name);
|
||||
struct bsc_nat_acc_lst *bsc_nat_acc_lst_get(void *ctx, struct llist_head *lst, const char *name);
|
||||
void bsc_nat_acc_lst_delete(struct bsc_nat_acc_lst *lst);
|
||||
struct bsc_msg_acc_lst *bsc_msg_acc_lst_find(struct llist_head *lst, const char *name);
|
||||
struct bsc_msg_acc_lst *bsc_msg_acc_lst_get(void *ctx, struct llist_head *lst, const char *name);
|
||||
void bsc_msg_acc_lst_delete(struct bsc_msg_acc_lst *lst);
|
||||
|
||||
struct bsc_nat_acc_lst_entry *bsc_nat_acc_lst_entry_create(struct bsc_nat_acc_lst *);
|
||||
int bsc_nat_lst_check_allow(struct bsc_nat_acc_lst *lst, const char *imsi);
|
||||
struct bsc_msg_acc_lst_entry *bsc_msg_acc_lst_entry_create(struct bsc_msg_acc_lst *);
|
||||
int bsc_msg_acc_lst_check_allow(struct bsc_msg_acc_lst *lst, const char *imsi);
|
||||
|
||||
void bsc_nat_lst_vty_init(void *ctx, struct llist_head *lst, int node);
|
||||
void bsc_nat_acc_lst_write(struct vty *vty, struct bsc_nat_acc_lst *lst);
|
||||
void bsc_msg_lst_vty_init(void *ctx, struct llist_head *lst, int node);
|
||||
void bsc_msg_acc_lst_write(struct vty *vty, struct bsc_msg_acc_lst *lst);
|
||||
|
|
|
@ -38,9 +38,9 @@ static const struct rate_ctr_group_desc bsc_cfg_acc_list_desc = {
|
|||
};
|
||||
|
||||
|
||||
int bsc_nat_lst_check_allow(struct bsc_nat_acc_lst *lst, const char *mi_string)
|
||||
int bsc_msg_acc_lst_check_allow(struct bsc_msg_acc_lst *lst, const char *mi_string)
|
||||
{
|
||||
struct bsc_nat_acc_lst_entry *entry;
|
||||
struct bsc_msg_acc_lst_entry *entry;
|
||||
|
||||
llist_for_each_entry(entry, &lst->fltr_list, list) {
|
||||
if (!entry->imsi_allow)
|
||||
|
@ -52,9 +52,9 @@ int bsc_nat_lst_check_allow(struct bsc_nat_acc_lst *lst, const char *mi_string)
|
|||
return 1;
|
||||
}
|
||||
|
||||
struct bsc_nat_acc_lst *bsc_nat_acc_lst_find(struct llist_head *head, const char *name)
|
||||
struct bsc_msg_acc_lst *bsc_msg_acc_lst_find(struct llist_head *head, const char *name)
|
||||
{
|
||||
struct bsc_nat_acc_lst *lst;
|
||||
struct bsc_msg_acc_lst *lst;
|
||||
|
||||
if (!name)
|
||||
return NULL;
|
||||
|
@ -66,15 +66,15 @@ struct bsc_nat_acc_lst *bsc_nat_acc_lst_find(struct llist_head *head, const char
|
|||
return NULL;
|
||||
}
|
||||
|
||||
struct bsc_nat_acc_lst *bsc_nat_acc_lst_get(void *ctx, struct llist_head *head, const char *name)
|
||||
struct bsc_msg_acc_lst *bsc_msg_acc_lst_get(void *ctx, struct llist_head *head, const char *name)
|
||||
{
|
||||
struct bsc_nat_acc_lst *lst;
|
||||
struct bsc_msg_acc_lst *lst;
|
||||
|
||||
lst = bsc_nat_acc_lst_find(head, name);
|
||||
lst = bsc_msg_acc_lst_find(head, name);
|
||||
if (lst)
|
||||
return lst;
|
||||
|
||||
lst = talloc_zero(ctx, struct bsc_nat_acc_lst);
|
||||
lst = talloc_zero(ctx, struct bsc_msg_acc_lst);
|
||||
if (!lst) {
|
||||
LOGP(DNAT, LOGL_ERROR, "Failed to allocate access list");
|
||||
return NULL;
|
||||
|
@ -93,18 +93,18 @@ struct bsc_nat_acc_lst *bsc_nat_acc_lst_get(void *ctx, struct llist_head *head,
|
|||
return lst;
|
||||
}
|
||||
|
||||
void bsc_nat_acc_lst_delete(struct bsc_nat_acc_lst *lst)
|
||||
void bsc_msg_acc_lst_delete(struct bsc_msg_acc_lst *lst)
|
||||
{
|
||||
llist_del(&lst->list);
|
||||
rate_ctr_group_free(lst->stats);
|
||||
talloc_free(lst);
|
||||
}
|
||||
|
||||
struct bsc_nat_acc_lst_entry *bsc_nat_acc_lst_entry_create(struct bsc_nat_acc_lst *lst)
|
||||
struct bsc_msg_acc_lst_entry *bsc_msg_acc_lst_entry_create(struct bsc_msg_acc_lst *lst)
|
||||
{
|
||||
struct bsc_nat_acc_lst_entry *entry;
|
||||
struct bsc_msg_acc_lst_entry *entry;
|
||||
|
||||
entry = talloc_zero(lst, struct bsc_nat_acc_lst_entry);
|
||||
entry = talloc_zero(lst, struct bsc_msg_acc_lst_entry);
|
||||
if (!entry)
|
||||
return NULL;
|
||||
|
||||
|
|
|
@ -123,10 +123,10 @@ int bsc_nat_barr_adapt(void *ctx, struct rb_root *root,
|
|||
}
|
||||
|
||||
|
||||
static int lst_check_deny(struct bsc_nat_acc_lst *lst, const char *mi_string,
|
||||
static int lst_check_deny(struct bsc_msg_acc_lst *lst, const char *mi_string,
|
||||
int *cm_cause, int *lu_cause)
|
||||
{
|
||||
struct bsc_nat_acc_lst_entry *entry;
|
||||
struct bsc_msg_acc_lst_entry *entry;
|
||||
|
||||
llist_for_each_entry(entry, &lst->fltr_list, list) {
|
||||
if (!entry->imsi_deny)
|
||||
|
@ -154,8 +154,8 @@ static int auth_imsi(struct bsc_connection *bsc, const char *imsi,
|
|||
* 5.) Allow directly if the IMSI is allowed at the global level
|
||||
*/
|
||||
int cm, lu;
|
||||
struct bsc_nat_acc_lst *nat_lst = NULL;
|
||||
struct bsc_nat_acc_lst *bsc_lst = NULL;
|
||||
struct bsc_msg_acc_lst *nat_lst = NULL;
|
||||
struct bsc_msg_acc_lst *bsc_lst = NULL;
|
||||
|
||||
/* 1. global check for barred imsis */
|
||||
if (bsc_nat_barr_find(&bsc->nat->imsi_black_list, imsi, &cm, &lu)) {
|
||||
|
@ -168,13 +168,13 @@ static int auth_imsi(struct bsc_connection *bsc, const char *imsi,
|
|||
}
|
||||
|
||||
|
||||
bsc_lst = bsc_nat_acc_lst_find(&bsc->nat->access_lists, bsc->cfg->acc_lst_name);
|
||||
nat_lst = bsc_nat_acc_lst_find(&bsc->nat->access_lists, bsc->nat->acc_lst_name);
|
||||
bsc_lst = bsc_msg_acc_lst_find(&bsc->nat->access_lists, bsc->cfg->acc_lst_name);
|
||||
nat_lst = bsc_msg_acc_lst_find(&bsc->nat->access_lists, bsc->nat->acc_lst_name);
|
||||
|
||||
|
||||
if (bsc_lst) {
|
||||
/* 2. BSC allow */
|
||||
if (bsc_nat_lst_check_allow(bsc_lst, imsi) == 0)
|
||||
if (bsc_msg_acc_lst_check_allow(bsc_lst, imsi) == 0)
|
||||
return 1;
|
||||
|
||||
/* 3. BSC deny */
|
||||
|
|
|
@ -32,12 +32,12 @@ DEFUN(cfg_lst_no,
|
|||
NO_STR "Remove an access-list by name\n"
|
||||
"The access-list to remove\n")
|
||||
{
|
||||
struct bsc_nat_acc_lst *acc;
|
||||
acc = bsc_nat_acc_lst_find(_acc_lst, argv[0]);
|
||||
struct bsc_msg_acc_lst *acc;
|
||||
acc = bsc_msg_acc_lst_find(_acc_lst, argv[0]);
|
||||
if (!acc)
|
||||
return CMD_WARNING;
|
||||
|
||||
bsc_nat_acc_lst_delete(acc);
|
||||
bsc_msg_acc_lst_delete(acc);
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -46,8 +46,8 @@ DEFUN(show_acc_lst,
|
|||
"show access-list NAME",
|
||||
SHOW_STR "IMSI access list\n" "Name of the access list\n")
|
||||
{
|
||||
struct bsc_nat_acc_lst *acc;
|
||||
acc = bsc_nat_acc_lst_find(_acc_lst, argv[0]);
|
||||
struct bsc_msg_acc_lst *acc;
|
||||
acc = bsc_msg_acc_lst_find(_acc_lst, argv[0]);
|
||||
if (!acc)
|
||||
return CMD_WARNING;
|
||||
|
||||
|
@ -65,14 +65,14 @@ DEFUN(cfg_lst_imsi_allow,
|
|||
"Add allowed IMSI to the list\n"
|
||||
"Regexp for IMSIs\n")
|
||||
{
|
||||
struct bsc_nat_acc_lst *acc;
|
||||
struct bsc_nat_acc_lst_entry *entry;
|
||||
struct bsc_msg_acc_lst *acc;
|
||||
struct bsc_msg_acc_lst_entry *entry;
|
||||
|
||||
acc = bsc_nat_acc_lst_get(_ctx, _acc_lst, argv[0]);
|
||||
acc = bsc_msg_acc_lst_get(_ctx, _acc_lst, argv[0]);
|
||||
if (!acc)
|
||||
return CMD_WARNING;
|
||||
|
||||
entry = bsc_nat_acc_lst_entry_create(acc);
|
||||
entry = bsc_msg_acc_lst_entry_create(acc);
|
||||
if (!entry)
|
||||
return CMD_WARNING;
|
||||
|
||||
|
@ -91,14 +91,14 @@ DEFUN(cfg_lst_imsi_deny,
|
|||
"CM Service Reject reason\n"
|
||||
"LU Reject reason\n")
|
||||
{
|
||||
struct bsc_nat_acc_lst *acc;
|
||||
struct bsc_nat_acc_lst_entry *entry;
|
||||
struct bsc_msg_acc_lst *acc;
|
||||
struct bsc_msg_acc_lst_entry *entry;
|
||||
|
||||
acc = bsc_nat_acc_lst_get(_ctx, _acc_lst, argv[0]);
|
||||
acc = bsc_msg_acc_lst_get(_ctx, _acc_lst, argv[0]);
|
||||
if (!acc)
|
||||
return CMD_WARNING;
|
||||
|
||||
entry = bsc_nat_acc_lst_entry_create(acc);
|
||||
entry = bsc_msg_acc_lst_entry_create(acc);
|
||||
if (!entry)
|
||||
return CMD_WARNING;
|
||||
|
||||
|
@ -111,9 +111,9 @@ DEFUN(cfg_lst_imsi_deny,
|
|||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
void bsc_nat_acc_lst_write(struct vty *vty, struct bsc_nat_acc_lst *lst)
|
||||
void bsc_msg_acc_lst_write(struct vty *vty, struct bsc_msg_acc_lst *lst)
|
||||
{
|
||||
struct bsc_nat_acc_lst_entry *entry;
|
||||
struct bsc_msg_acc_lst_entry *entry;
|
||||
|
||||
llist_for_each_entry(entry, &lst->fltr_list, list) {
|
||||
if (entry->imsi_allow)
|
||||
|
@ -127,7 +127,7 @@ void bsc_nat_acc_lst_write(struct vty *vty, struct bsc_nat_acc_lst *lst)
|
|||
}
|
||||
}
|
||||
|
||||
void bsc_nat_lst_vty_init(void *ctx, struct llist_head *lst, int node)
|
||||
void bsc_msg_lst_vty_init(void *ctx, struct llist_head *lst, int node)
|
||||
{
|
||||
_ctx = ctx;
|
||||
_acc_lst = lst;
|
||||
|
|
|
@ -405,19 +405,19 @@ static int get_net_cfg_acc_cmd(struct ctrl_cmd *cmd, void *data)
|
|||
static int set_net_cfg_acc_cmd(struct ctrl_cmd *cmd, void *data)
|
||||
{
|
||||
const char *access_name = extract_acc_name(cmd->variable);
|
||||
struct bsc_nat_acc_lst *acc;
|
||||
struct bsc_nat_acc_lst_entry *entry;
|
||||
struct bsc_msg_acc_lst *acc;
|
||||
struct bsc_msg_acc_lst_entry *entry;
|
||||
const char *value = cmd->value;
|
||||
int rc;
|
||||
|
||||
/* Should have been caught by verify_net_cfg_acc_cmd */
|
||||
acc = bsc_nat_acc_lst_find(g_nat, access_name);
|
||||
acc = bsc_msg_acc_lst_find(&g_nat->access_lists, access_name);
|
||||
if (!acc) {
|
||||
cmd->reply = "Access list not found";
|
||||
return CTRL_CMD_ERROR;
|
||||
}
|
||||
|
||||
entry = bsc_nat_acc_lst_entry_create(acc);
|
||||
entry = bsc_msg_acc_lst_entry_create(acc);
|
||||
if (!entry) {
|
||||
cmd->reply = "OOM";
|
||||
return CTRL_CMD_ERROR;
|
||||
|
@ -436,7 +436,7 @@ static int set_net_cfg_acc_cmd(struct ctrl_cmd *cmd, void *data)
|
|||
static int verify_net_cfg_acc_cmd(struct ctrl_cmd *cmd, const char *value, void *data)
|
||||
{
|
||||
const char *access_name = extract_acc_name(cmd->variable);
|
||||
struct bsc_nat_acc_lst *acc = bsc_nat_acc_lst_find(g_nat, access_name);
|
||||
struct bsc_msg_acc_lst *acc = bsc_msg_acc_lst_find(&g_nat->access_lists, access_name);
|
||||
|
||||
if (!acc) {
|
||||
cmd->reply = "Access list not known";
|
||||
|
|
|
@ -112,12 +112,12 @@ struct bsc_nat *bsc_nat_alloc(void)
|
|||
void bsc_nat_free(struct bsc_nat *nat)
|
||||
{
|
||||
struct bsc_config *cfg, *tmp;
|
||||
struct bsc_nat_acc_lst *lst, *tmp_lst;
|
||||
struct bsc_msg_acc_lst *lst, *tmp_lst;
|
||||
|
||||
llist_for_each_entry_safe(cfg, tmp, &nat->bsc_configs, entry)
|
||||
bsc_config_free(cfg);
|
||||
llist_for_each_entry_safe(lst, tmp_lst, &nat->access_lists, list)
|
||||
bsc_nat_acc_lst_delete(lst);
|
||||
bsc_msg_acc_lst_delete(lst);
|
||||
|
||||
bsc_nat_num_rewr_entry_adapt(nat, &nat->num_rewr, NULL);
|
||||
bsc_nat_num_rewr_entry_adapt(nat, &nat->num_rewr_post, NULL);
|
||||
|
|
|
@ -87,7 +87,7 @@ static void write_pgroup_lst(struct vty *vty, struct bsc_nat_paging_group *pgrou
|
|||
|
||||
static int config_write_nat(struct vty *vty)
|
||||
{
|
||||
struct bsc_nat_acc_lst *lst;
|
||||
struct bsc_msg_acc_lst *lst;
|
||||
struct bsc_nat_paging_group *pgroup;
|
||||
|
||||
vty_out(vty, "nat%s", VTY_NEWLINE);
|
||||
|
@ -136,7 +136,7 @@ static int config_write_nat(struct vty *vty)
|
|||
_nat->num_rewr_trie_name, VTY_NEWLINE);
|
||||
|
||||
llist_for_each_entry(lst, &_nat->access_lists, list)
|
||||
bsc_nat_acc_lst_write(vty, lst);
|
||||
bsc_msg_acc_lst_write(vty, lst);
|
||||
llist_for_each_entry(pgroup, &_nat->paging_groups, entry)
|
||||
write_pgroup_lst(vty, pgroup);
|
||||
if (_nat->mgcp_ipa)
|
||||
|
@ -1171,7 +1171,7 @@ int bsc_nat_vty_init(struct bsc_nat *nat)
|
|||
install_element(NAT_NODE, &cfg_nat_ussd_local_cmd);
|
||||
install_element(NAT_NODE, &cfg_nat_use_ipa_for_mgcp_cmd);
|
||||
|
||||
bsc_nat_lst_vty_init(nat, &nat->access_lists, NAT_NODE);
|
||||
bsc_msg_lst_vty_init(nat, &nat->access_lists, NAT_NODE);
|
||||
|
||||
/* number rewriting */
|
||||
install_element(NAT_NODE, &cfg_nat_number_rewrite_cmd);
|
||||
|
|
|
@ -374,7 +374,7 @@ int bsc_ussd_check(struct nat_sccp_connection *con, struct bsc_nat_parsed *parse
|
|||
uint8_t proto;
|
||||
uint8_t ti;
|
||||
struct gsm48_hdr *hdr48;
|
||||
struct bsc_nat_acc_lst *lst;
|
||||
struct bsc_msg_acc_lst *lst;
|
||||
struct ussd_request req;
|
||||
|
||||
/*
|
||||
|
@ -416,12 +416,12 @@ int bsc_ussd_check(struct nat_sccp_connection *con, struct bsc_nat_parsed *parse
|
|||
if (msg_type == GSM0480_MTYPE_REGISTER) {
|
||||
|
||||
/* now check if it is a IMSI we care about */
|
||||
lst = bsc_nat_acc_lst_find(&con->bsc->nat->access_lists,
|
||||
lst = bsc_msg_acc_lst_find(&con->bsc->nat->access_lists,
|
||||
con->bsc->nat->ussd_lst_name);
|
||||
if (!lst)
|
||||
return 0;
|
||||
|
||||
if (bsc_nat_lst_check_allow(lst, con->imsi) != 0)
|
||||
if (bsc_msg_acc_lst_check_allow(lst, con->imsi) != 0)
|
||||
return 0;
|
||||
|
||||
/* now decode the message and see if we really want to handle it */
|
||||
|
|
|
@ -868,8 +868,8 @@ static void test_cr_filter()
|
|||
int i, res, contype;
|
||||
struct msgb *msg = msgb_alloc(4096, "test_cr_filter");
|
||||
struct bsc_nat_parsed *parsed;
|
||||
struct bsc_nat_acc_lst *nat_lst, *bsc_lst;
|
||||
struct bsc_nat_acc_lst_entry *nat_entry, *bsc_entry;
|
||||
struct bsc_msg_acc_lst *nat_lst, *bsc_lst;
|
||||
struct bsc_msg_acc_lst_entry *nat_entry, *bsc_entry;
|
||||
struct bsc_nat_reject_cause cause;
|
||||
|
||||
struct bsc_nat *nat = bsc_nat_alloc();
|
||||
|
@ -879,11 +879,11 @@ static void test_cr_filter()
|
|||
bsc->cfg->acc_lst_name = "bsc";
|
||||
nat->acc_lst_name = "nat";
|
||||
|
||||
nat_lst = bsc_nat_acc_lst_get(nat, &nat->access_lists, "nat");
|
||||
bsc_lst = bsc_nat_acc_lst_get(nat, &nat->access_lists, "bsc");
|
||||
nat_lst = bsc_msg_acc_lst_get(nat, &nat->access_lists, "nat");
|
||||
bsc_lst = bsc_msg_acc_lst_get(nat, &nat->access_lists, "bsc");
|
||||
|
||||
bsc_entry = bsc_nat_acc_lst_entry_create(bsc_lst);
|
||||
nat_entry = bsc_nat_acc_lst_entry_create(nat_lst);
|
||||
bsc_entry = bsc_msg_acc_lst_entry_create(bsc_lst);
|
||||
nat_entry = bsc_msg_acc_lst_entry_create(nat_lst);
|
||||
|
||||
/* test the default value as we are going to overwrite it */
|
||||
OSMO_ASSERT(bsc_entry->cm_reject_cause == GSM48_REJECT_PLMN_NOT_ALLOWED);
|
||||
|
|
Loading…
Reference in New Issue