diff options
author | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2015-05-03 22:34:01 +0200 |
---|---|---|
committer | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2015-05-03 22:34:16 +0200 |
commit | 337343d159888886eaa68476b70dbe19db93845b (patch) | |
tree | 318a8135477e0dcc8f8e24d2380342c254ab9d60 /openbsc/src/libfilter/bsc_msg_vty.c | |
parent | 38159428d2b1e95a2c6fa91775f7b3678aef2f1f (diff) | |
parent | d26b8fcbe22eb4a56c87f0114a0e826551243511 (diff) |
Merge branch 'zecke/features/acc-list'
Integrate the change and see how it is going. The unit tests
for the NAT look good so we might not have regressions.
Diffstat (limited to 'openbsc/src/libfilter/bsc_msg_vty.c')
-rw-r--r-- | openbsc/src/libfilter/bsc_msg_vty.c | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/openbsc/src/libfilter/bsc_msg_vty.c b/openbsc/src/libfilter/bsc_msg_vty.c new file mode 100644 index 000000000..c342fdca0 --- /dev/null +++ b/openbsc/src/libfilter/bsc_msg_vty.c @@ -0,0 +1,140 @@ +/* (C) 2010-2015 by Holger Hans Peter Freyther + * (C) 2010-2013 by On-Waves + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +#include <openbsc/bsc_msg_filter.h> +#include <openbsc/gsm_data.h> +#include <openbsc/vty.h> + +#include <osmocom/vty/misc.h> + +static struct llist_head *_acc_lst; +static void *_ctx; + +DEFUN(cfg_lst_no, + cfg_lst_no_cmd, + "no access-list NAME", + NO_STR "Remove an access-list by name\n" + "The access-list to remove\n") +{ + struct bsc_msg_acc_lst *acc; + acc = bsc_msg_acc_lst_find(_acc_lst, argv[0]); + if (!acc) + return CMD_WARNING; + + bsc_msg_acc_lst_delete(acc); + return CMD_SUCCESS; +} + +DEFUN(show_acc_lst, + show_acc_lst_cmd, + "show access-list NAME", + SHOW_STR "IMSI access list\n" "Name of the access list\n") +{ + struct bsc_msg_acc_lst *acc; + acc = bsc_msg_acc_lst_find(_acc_lst, argv[0]); + if (!acc) + return CMD_WARNING; + + vty_out(vty, "access-list %s%s", acc->name, VTY_NEWLINE); + vty_out_rate_ctr_group(vty, " ", acc->stats); + + return CMD_SUCCESS; +} + +DEFUN(cfg_lst_imsi_allow, + cfg_lst_imsi_allow_cmd, + "access-list NAME imsi-allow [REGEXP]", + "Access list commands\n" + "Name of the access list\n" + "Add allowed IMSI to the list\n" + "Regexp for IMSIs\n") +{ + struct bsc_msg_acc_lst *acc; + struct bsc_msg_acc_lst_entry *entry; + + acc = bsc_msg_acc_lst_get(_ctx, _acc_lst, argv[0]); + if (!acc) + return CMD_WARNING; + + entry = bsc_msg_acc_lst_entry_create(acc); + if (!entry) + return CMD_WARNING; + + if (gsm_parse_reg(acc, &entry->imsi_allow_re, &entry->imsi_allow, argc - 1, &argv[1]) != 0) + return CMD_WARNING; + return CMD_SUCCESS; +} + +DEFUN(cfg_lst_imsi_deny, + cfg_lst_imsi_deny_cmd, + "access-list NAME imsi-deny [REGEXP] (<0-256>) (<0-256>)", + "Access list commands\n" + "Name of the access list\n" + "Add denied IMSI to the list\n" + "Regexp for IMSIs\n" + "CM Service Reject reason\n" + "LU Reject reason\n") +{ + struct bsc_msg_acc_lst *acc; + struct bsc_msg_acc_lst_entry *entry; + + acc = bsc_msg_acc_lst_get(_ctx, _acc_lst, argv[0]); + if (!acc) + return CMD_WARNING; + + entry = bsc_msg_acc_lst_entry_create(acc); + if (!entry) + return CMD_WARNING; + + if (gsm_parse_reg(acc, &entry->imsi_deny_re, &entry->imsi_deny, argc - 1, &argv[1]) != 0) + return CMD_WARNING; + if (argc >= 3) + entry->cm_reject_cause = atoi(argv[2]); + if (argc >= 4) + entry->lu_reject_cause = atoi(argv[3]); + return CMD_SUCCESS; +} + +void bsc_msg_acc_lst_write(struct vty *vty, struct bsc_msg_acc_lst *lst) +{ + struct bsc_msg_acc_lst_entry *entry; + + llist_for_each_entry(entry, &lst->fltr_list, list) { + if (entry->imsi_allow) + vty_out(vty, " access-list %s imsi-allow %s%s", + lst->name, entry->imsi_allow, VTY_NEWLINE); + if (entry->imsi_deny) + vty_out(vty, " access-list %s imsi-deny %s %d %d%s", + lst->name, entry->imsi_deny, + entry->cm_reject_cause, entry->lu_reject_cause, + VTY_NEWLINE); + } +} + +void bsc_msg_lst_vty_init(void *ctx, struct llist_head *lst, int node) +{ + _ctx = ctx; + _acc_lst = lst; + install_element_ve(&show_acc_lst_cmd); + + /* access-list */ + install_element(node, &cfg_lst_imsi_allow_cmd); + install_element(node, &cfg_lst_imsi_deny_cmd); + install_element(node, &cfg_lst_no_cmd); +} |