aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2010-06-03 01:44:05 +0800
committerHolger Hans Peter Freyther <zecke@selfish.org>2010-06-15 20:24:21 +0800
commite4900a074ab86f13d36eab8468272e7bcf390ad3 (patch)
tree8375ea4b44506411f819c556000c882048cb8fc3
parentf0c3e912e319fd2ead9e07216c96e07a6edf45cd (diff)
[nat] Implement the removal of an access-list.
-rw-r--r--openbsc/include/openbsc/bsc_nat.h1
-rw-r--r--openbsc/src/nat/bsc_nat_utils.c6
-rw-r--r--openbsc/src/nat/bsc_nat_vty.c17
3 files changed, 24 insertions, 0 deletions
diff --git a/openbsc/include/openbsc/bsc_nat.h b/openbsc/include/openbsc/bsc_nat.h
index 5d28e4c9d..3b950e1d2 100644
--- a/openbsc/include/openbsc/bsc_nat.h
+++ b/openbsc/include/openbsc/bsc_nat.h
@@ -326,5 +326,6 @@ int bsc_write(struct bsc_connection *bsc, struct msgb *msg, int id);
void bsc_parse_reg(void *ctx, regex_t *reg, char **imsi, int argc, const char **argv);
struct bsc_nat_access_list *bsc_nat_accs_list_find(struct bsc_nat *nat, const char *name);
struct bsc_nat_access_list *bsc_nat_accs_list_get(struct bsc_nat *nat, const char *name);
+void bsc_nat_accs_list_delete(struct bsc_nat_access_list *lst);
#endif
diff --git a/openbsc/src/nat/bsc_nat_utils.c b/openbsc/src/nat/bsc_nat_utils.c
index ffb37e8bc..71d572279 100644
--- a/openbsc/src/nat/bsc_nat_utils.c
+++ b/openbsc/src/nat/bsc_nat_utils.c
@@ -443,4 +443,10 @@ struct bsc_nat_access_list *bsc_nat_accs_list_get(struct bsc_nat *nat, const cha
lst->name = talloc_strdup(lst, name);
llist_add(&lst->list, &nat->access_lists);
return lst;
+}
+
+void bsc_nat_accs_list_delete(struct bsc_nat_access_list *lst)
+{
+ llist_del(&lst->list);
+ talloc_free(lst);
} \ No newline at end of file
diff --git a/openbsc/src/nat/bsc_nat_vty.c b/openbsc/src/nat/bsc_nat_vty.c
index e888dcc6f..3f2d7ac5c 100644
--- a/openbsc/src/nat/bsc_nat_vty.c
+++ b/openbsc/src/nat/bsc_nat_vty.c
@@ -413,6 +413,22 @@ DEFUN(cfg_lst_imsi_deny,
return CMD_SUCCESS;
}
+/* naming to follow Zebra... */
+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_nat_access_list *acc;
+ acc = bsc_nat_accs_list_find(_nat, argv[0]);
+ if (!acc)
+ return CMD_WARNING;
+
+ bsc_nat_accs_list_delete(acc);
+ return CMD_SUCCESS;
+}
+
DEFUN(cfg_bsc_acc_lst_name,
cfg_bsc_acc_lst_name_cmd,
"access-list-name NAME",
@@ -507,6 +523,7 @@ int bsc_nat_vty_init(struct bsc_nat *nat)
/* access-list */
install_element(NAT_NODE, &cfg_lst_imsi_allow_cmd);
install_element(NAT_NODE, &cfg_lst_imsi_deny_cmd);
+ install_element(NAT_NODE, &cfg_lst_no_cmd);
/* BSC subgroups */
install_element(NAT_NODE, &cfg_bsc_cmd);