From f8c42191dea8a5ef938ccb6be0038275e736c3cb Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Wed, 9 Jan 2013 17:03:27 +0100 Subject: libbsc: Add ctrl command for MNC, MCC, short-name and long-name Add the framework for adding more setting commands. --- openbsc/include/openbsc/gsm_data.h | 3 ++ openbsc/src/libbsc/Makefile.am | 2 +- openbsc/src/libbsc/bsc_ctrl_commands.c | 75 ++++++++++++++++++++++++++++++++++ openbsc/src/osmo-bsc/osmo_bsc_ctrl.c | 3 ++ openbsc/src/osmo-nitb/bsc_hack.c | 5 +++ 5 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 openbsc/src/libbsc/bsc_ctrl_commands.c diff --git a/openbsc/include/openbsc/gsm_data.h b/openbsc/include/openbsc/gsm_data.h index 404dfe444..1b4720fe0 100644 --- a/openbsc/include/openbsc/gsm_data.h +++ b/openbsc/include/openbsc/gsm_data.h @@ -433,4 +433,7 @@ extern struct e1inp_line_ops bts_isdn_e1inp_line_ops; extern const struct value_string bts_type_names[_NUM_GSM_BTS_TYPE+1]; extern const struct value_string bts_type_descs[_NUM_GSM_BTS_TYPE+1]; +/* control interface handling */ +int bsc_base_ctrl_cmds_install(void); + #endif /* _GSM_DATA_H */ diff --git a/openbsc/src/libbsc/Makefile.am b/openbsc/src/libbsc/Makefile.am index 42fabab6d..53300912c 100644 --- a/openbsc/src/libbsc/Makefile.am +++ b/openbsc/src/libbsc/Makefile.am @@ -22,5 +22,5 @@ libbsc_a_SOURCES = abis_nm.c abis_nm_vty.c \ bsc_api.c bsc_msc.c bsc_vty.c \ gsm_04_08_utils.c \ bsc_init.c bts_init.c bsc_rf_ctrl.c \ - arfcn_range_encode.c + arfcn_range_encode.c bsc_ctrl_commands.c diff --git a/openbsc/src/libbsc/bsc_ctrl_commands.c b/openbsc/src/libbsc/bsc_ctrl_commands.c new file mode 100644 index 000000000..db6e632c3 --- /dev/null +++ b/openbsc/src/libbsc/bsc_ctrl_commands.c @@ -0,0 +1,75 @@ +/* + * (C) 2013 by Holger Hans Peter Freyther + * (C) 2013 by sysmocom s.f.m.c. GmbH + * + * 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 . + * + */ + +#include +#include + +#define CTRL_CMD_VTY_STRING(cmdname, cmdstr, dtype, element) \ + CTRL_HELPER_GET_STRING(cmdname, dtype, element) \ + CTRL_HELPER_SET_STRING(cmdname, dtype, element) \ +static struct ctrl_cmd_element cmd_##cmdname = { \ + .name = cmdstr, \ + .param = NULL, \ + .get = get_##cmdname, \ + .set = set_##cmdname, \ + .verify = verify_vty_description_string, \ +} + +/** + * Check that there are no newlines or comments or other things + * that could make the VTY configuration unparsable. + */ +static int verify_vty_description_string(struct ctrl_cmd *cmd, + const char *value, void *data) +{ + int i; + const size_t len = strlen(value); + + for (i = 0; i < len; ++i) { + switch(value[i]) { + case '#': + case '\n': + case '\r': + cmd->reply = "String includes illegal character"; + return -1; + default: + break; + } + } + + return 0; +} + +CTRL_CMD_DEFINE_RANGE(net_mnc, "mnc", struct gsm_network, network_code, 0, 999); +CTRL_CMD_DEFINE_RANGE(net_mcc, "mcc", struct gsm_network, country_code, 1, 999); +CTRL_CMD_VTY_STRING(net_short_name, "short-name", struct gsm_network, name_short); +CTRL_CMD_VTY_STRING(net_long_name, "long-name", struct gsm_network, name_long); + +int bsc_base_ctrl_cmds_install(void) +{ + int rc = 0; + rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_mnc); + rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_mcc); + rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_short_name); + rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_long_name); + + return rc; +} diff --git a/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c b/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c index 1d0e2aa01..1442cbcd7 100644 --- a/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c +++ b/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c @@ -605,6 +605,9 @@ int bsc_ctrl_cmds_install(struct gsm_network *net) { int rc; + rc = bsc_base_ctrl_cmds_install(); + if (rc) + goto end; rc = ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_rf_state); if (rc) goto end; diff --git a/openbsc/src/osmo-nitb/bsc_hack.c b/openbsc/src/osmo-nitb/bsc_hack.c index 96ae0b833..d746bf14e 100644 --- a/openbsc/src/osmo-nitb/bsc_hack.c +++ b/openbsc/src/osmo-nitb/bsc_hack.c @@ -290,6 +290,11 @@ int main(int argc, char **argv) return -1; } + if (bsc_base_ctrl_cmds_install() != 0) { + printf("Failed to initialize the control commands. Exiting.\n"); + return -1; + } + /* seed the PRNG */ srand(time(NULL)); -- cgit v1.2.3 From 6ca9f4f5c33e114940f2f0e66df2b61cd37e0357 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Wed, 9 Jan 2013 17:30:11 +0100 Subject: libbsc: Add ctrl command to apply the configuration Right now this only works for IP based BTS like the sysmoBTS and by dropping the OML link. --- openbsc/src/libbsc/bsc_ctrl_commands.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/openbsc/src/libbsc/bsc_ctrl_commands.c b/openbsc/src/libbsc/bsc_ctrl_commands.c index db6e632c3..fa8e63580 100644 --- a/openbsc/src/libbsc/bsc_ctrl_commands.c +++ b/openbsc/src/libbsc/bsc_ctrl_commands.c @@ -20,6 +20,7 @@ */ #include +#include #include #define CTRL_CMD_VTY_STRING(cmdname, cmdstr, dtype, element) \ @@ -63,6 +64,35 @@ CTRL_CMD_DEFINE_RANGE(net_mcc, "mcc", struct gsm_network, country_code, 1, 999); CTRL_CMD_VTY_STRING(net_short_name, "short-name", struct gsm_network, name_short); CTRL_CMD_VTY_STRING(net_long_name, "long-name", struct gsm_network, name_long); +static int verify_net_apply_config(struct ctrl_cmd *cmd, const char *v, void *d) +{ + return 0; +} + +static int get_net_apply_config(struct ctrl_cmd *cmd, void *data) +{ + cmd->reply = "Write only attribute"; + return CTRL_CMD_ERROR; +} + +static int set_net_apply_config(struct ctrl_cmd *cmd, void *data) +{ + struct gsm_network *net = cmd->node; + struct gsm_bts *bts; + + llist_for_each_entry(bts, &net->bts_list, list) { + if (!is_ipaccess_bts(bts)) + continue; + + ipaccess_drop_oml(bts); + } + + cmd->reply = "Tried to drop the BTS"; + return CTRL_CMD_REPLY; +} + +CTRL_CMD_DEFINE(net_apply_config, "apply-configuration"); + int bsc_base_ctrl_cmds_install(void) { int rc = 0; @@ -70,6 +100,7 @@ int bsc_base_ctrl_cmds_install(void) rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_mcc); rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_short_name); rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_long_name); + rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_apply_config); return rc; } -- cgit v1.2.3 From 3adb772853337666f4d926f2e297e154c25a3881 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Tue, 4 Mar 2014 17:16:58 +0100 Subject: libbsc: Add command to set MNC/MCC and apply it if something changed Change the splitting of the ctrl_test_runner.py. Make sure that we get one element and all the rest. --- openbsc/src/libbsc/bsc_ctrl_commands.c | 59 ++++++++++++++++++++++++++++++++++ openbsc/tests/ctrl_test_runner.py | 46 +++++++++++++++++++++++++- 2 files changed, 104 insertions(+), 1 deletion(-) diff --git a/openbsc/src/libbsc/bsc_ctrl_commands.c b/openbsc/src/libbsc/bsc_ctrl_commands.c index fa8e63580..a137efac6 100644 --- a/openbsc/src/libbsc/bsc_ctrl_commands.c +++ b/openbsc/src/libbsc/bsc_ctrl_commands.c @@ -93,6 +93,64 @@ static int set_net_apply_config(struct ctrl_cmd *cmd, void *data) CTRL_CMD_DEFINE(net_apply_config, "apply-configuration"); +static int verify_net_mcc_mnc_apply(struct ctrl_cmd *cmd, const char *value, void *d) +{ + char *tmp, *saveptr, *mcc, *mnc; + + tmp = talloc_strdup(cmd, value); + if (!tmp) + return 1; + + mcc = strtok_r(tmp, ",", &saveptr); + mnc = strtok_r(NULL, ",", &saveptr); + talloc_free(tmp); + + if (!mcc || !mnc) + return 1; + return 0; +} + +static int get_net_mcc_mnc_apply(struct ctrl_cmd *cmd, void *data) +{ + cmd->reply = "Write only attribute"; + return CTRL_CMD_ERROR; +} + +static int set_net_mcc_mnc_apply(struct ctrl_cmd *cmd, void *data) +{ + struct gsm_network *net = cmd->node; + char *tmp, *saveptr, *mcc_str, *mnc_str; + int mcc, mnc; + + tmp = talloc_strdup(cmd, cmd->value); + if (!tmp) + goto oom; + + + mcc_str = strtok_r(tmp, ",", &saveptr); + mnc_str = strtok_r(NULL, ",", &saveptr); + + mcc = atoi(mcc_str); + mnc = atoi(mnc_str); + + talloc_free(tmp); + + if (net->network_code == mnc && net->country_code == mcc) { + cmd->reply = "Nothing changed"; + return CTRL_CMD_REPLY; + } + + net->network_code = mnc; + net->country_code = mcc; + + return set_net_apply_config(cmd, data); + +oom: + cmd->reply = "OOM"; + return CTRL_CMD_ERROR; +} +CTRL_CMD_DEFINE(net_mcc_mnc_apply, "mcc-mnc-apply"); + int bsc_base_ctrl_cmds_install(void) { int rc = 0; @@ -101,6 +159,7 @@ int bsc_base_ctrl_cmds_install(void) rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_short_name); rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_long_name); rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_apply_config); + rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_mcc_mnc_apply); return rc; } diff --git a/openbsc/tests/ctrl_test_runner.py b/openbsc/tests/ctrl_test_runner.py index 48d073440..5691d76aa 100644 --- a/openbsc/tests/ctrl_test_runner.py +++ b/openbsc/tests/ctrl_test_runner.py @@ -1,6 +1,7 @@ #!/usr/bin/env python # (C) 2013 by Jacob Erlbeck +# (C) 2014 by Holger Hans Peter Freyther # based on vty_test_runner.py: # (C) 2013 by Katerina Barone-Adesi # (C) 2013 by Holger Hans Peter Freyther @@ -131,7 +132,7 @@ class TestCtrlBase(unittest.TestCase): if mtype == "ERROR": rsp['error'] = msg else: - [rsp['var'], rsp['value']] = msg.split(None, 2) + [rsp['var'], rsp['value']] = msg.split(None, 1) responses[id] = rsp @@ -239,6 +240,49 @@ class TestCtrlBSC(TestCtrlBase): self.assertEquals(r['var'], 'bts.0.timezone') self.assertEquals(r['value'], 'off') + def testMccMncApply(self): + # Test some invalid input + r = self.do_set('mcc-mnc-apply', 'WRONG') + self.assertEquals(r['mtype'], 'ERROR') + + r = self.do_set('mcc-mnc-apply', '1,') + self.assertEquals(r['mtype'], 'ERROR') + + r = self.do_set('mcc-mnc-apply', '200,3') + self.assertEquals(r['mtype'], 'SET_REPLY') + self.assertEquals(r['var'], 'mcc-mnc-apply') + self.assertEquals(r['value'], 'Tried to drop the BTS') + + # Set it again + r = self.do_set('mcc-mnc-apply', '200,3') + self.assertEquals(r['mtype'], 'SET_REPLY') + self.assertEquals(r['var'], 'mcc-mnc-apply') + self.assertEquals(r['value'], 'Nothing changed') + + # Change it + r = self.do_set('mcc-mnc-apply', '200,4') + self.assertEquals(r['mtype'], 'SET_REPLY') + self.assertEquals(r['var'], 'mcc-mnc-apply') + self.assertEquals(r['value'], 'Tried to drop the BTS') + + # Change it + r = self.do_set('mcc-mnc-apply', '201,4') + self.assertEquals(r['mtype'], 'SET_REPLY') + self.assertEquals(r['var'], 'mcc-mnc-apply') + self.assertEquals(r['value'], 'Tried to drop the BTS') + + # Verify + r = self.do_get('mnc') + self.assertEquals(r['mtype'], 'GET_REPLY') + self.assertEquals(r['var'], 'mnc') + self.assertEquals(r['value'], '4') + + r = self.do_get('mcc') + self.assertEquals(r['mtype'], 'GET_REPLY') + self.assertEquals(r['var'], 'mcc') + self.assertEquals(r['value'], '201') + + def add_bsc_test(suite, workdir): if not os.path.isfile(os.path.join(workdir, "src/osmo-bsc/osmo-bsc")): print("Skipping the BSC test") -- cgit v1.2.3 From ecdf912ffb77c3971fb5c56e5a271c2583e6a593 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Tue, 4 Feb 2014 17:09:55 +0100 Subject: bsc: Include the MCC/MNC in the location trap It is of interest to know the MCC/MNC that is broadcasted at the specific position. Sponsored-by: On-Waves ehf --- openbsc/src/osmo-bsc/osmo_bsc_ctrl.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c b/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c index 1442cbcd7..e32218d0c 100644 --- a/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c +++ b/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c @@ -208,7 +208,11 @@ static void generate_location_state_trap(struct gsm_bts *bts, struct bsc_msc_con admin = osmo_bsc_rf_get_adminstate_name(osmo_bsc_rf_get_adminstate_by_bts(bts)); policy = osmo_bsc_rf_get_policy_name(osmo_bsc_rf_get_policy_by_bts(bts)); - cmd->reply = talloc_asprintf_append(cmd->reply, ",%s,%s,%s", oper, admin, policy); + cmd->reply = talloc_asprintf_append(cmd->reply, + ",%s,%s,%s,%d,%d", + oper, admin, policy, + bts->network->country_code, + bts->network->network_code); osmo_bsc_send_trap(cmd, msc_con); talloc_free(cmd); -- cgit v1.2.3 From bc3780a73fbe00bb7a9e42cc94511a369ba4a698 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Tue, 4 Feb 2014 19:12:04 +0100 Subject: nat: Implement setting the access-control-name through CTRL interface For operation we want to switch the access-list of a BSC at runtime in a programatic way. Sponsored-by: On-Waves ehf --- openbsc/src/osmo-bsc_nat/bsc_nat_ctrl.c | 118 +++++++++++++++++++++++++++----- 1 file changed, 99 insertions(+), 19 deletions(-) diff --git a/openbsc/src/osmo-bsc_nat/bsc_nat_ctrl.c b/openbsc/src/osmo-bsc_nat/bsc_nat_ctrl.c index 6ff4541a0..8b675d44d 100644 --- a/openbsc/src/osmo-bsc_nat/bsc_nat_ctrl.c +++ b/openbsc/src/osmo-bsc_nat/bsc_nat_ctrl.c @@ -186,6 +186,26 @@ static void ctrl_conn_closed_cb(struct ctrl_connection *connection) } } +static int extract_bsc_nr_variable(char *variable, unsigned int *nr, char **bsc_variable) +{ + char *nr_str, *tmp, *saveptr = NULL; + + tmp = strtok_r(variable, ".", &saveptr); + tmp = strtok_r(NULL, ".", &saveptr); + tmp = strtok_r(NULL, ".", &saveptr); + nr_str = strtok_r(NULL, ".", &saveptr); + if (!nr_str) + return 0; + *nr = atoi(nr_str); + + tmp = strtok_r(NULL, "\0", &saveptr); + if (!tmp) + return 0; + + *bsc_variable = tmp; + return 1; +} + static int forward_to_bsc(struct ctrl_cmd *cmd) { int ret = CTRL_CMD_HANDLED; @@ -193,24 +213,14 @@ static int forward_to_bsc(struct ctrl_cmd *cmd) struct bsc_connection *bsc; struct bsc_cmd_list *pending; unsigned int nr; - char *nr_str, *tmp, *saveptr = NULL; + char *bsc_variable; /* Skip over the beginning (bsc.) */ - tmp = strtok_r(cmd->variable, ".", &saveptr); - tmp = strtok_r(NULL, ".", &saveptr); - tmp = strtok_r(NULL, ".", &saveptr); - nr_str = strtok_r(NULL, ".", &saveptr); - if (!nr_str) { + if (!extract_bsc_nr_variable(cmd->variable, &nr, &bsc_variable)) { cmd->reply = "command incomplete"; goto err; } - nr = atoi(nr_str); - tmp = strtok_r(NULL, "\0", &saveptr); - if (!tmp) { - cmd->reply = "command incomplete"; - goto err; - } llist_for_each_entry(bsc, &g_nat->bsc_connections, list_entry) { if (!bsc->cfg) @@ -245,7 +255,7 @@ static int forward_to_bsc(struct ctrl_cmd *cmd) } talloc_free(bsc_cmd->variable); - bsc_cmd->variable = talloc_strdup(bsc_cmd, tmp); + bsc_cmd->variable = talloc_strdup(bsc_cmd, bsc_variable); if (!bsc_cmd->variable) { cmd->reply = "OOM"; goto err; @@ -274,8 +284,7 @@ static int forward_to_bsc(struct ctrl_cmd *cmd) err: ret = CTRL_CMD_ERROR; done: - if (bsc_cmd) - talloc_free(bsc_cmd); + talloc_free(bsc_cmd); return ret; } @@ -297,6 +306,69 @@ static int verify_fwd_cmd(struct ctrl_cmd *cmd, const char *value, void *data) return 0; } +static int extract_bsc_cfg_variable(struct ctrl_cmd *cmd, struct bsc_config **cfg, + char **bsc_variable) +{ + unsigned int nr; + + if (!extract_bsc_nr_variable(cmd->variable, &nr, bsc_variable)) { + cmd->reply = "command incomplete"; + return 0; + } + + *cfg = bsc_config_num(g_nat, nr); + if (!*cfg) { + cmd->reply = "Unknown BSC"; + return 0; + } + + return 1; +} + +CTRL_CMD_DEFINE(net_cfg_cmd, "net 0 bsc_cfg *"); +static int get_net_cfg_cmd(struct ctrl_cmd *cmd, void *data) +{ + char *bsc_variable; + struct bsc_config *bsc_cfg; + + if (!extract_bsc_cfg_variable(cmd, &bsc_cfg, &bsc_variable)) + return CTRL_CMD_ERROR; + + if (strcmp(bsc_variable, "access-list-name") == 0) { + cmd->reply = talloc_asprintf(cmd, "%s", + bsc_cfg->acc_lst_name ? bsc_cfg->acc_lst_name : ""); + return CTRL_CMD_REPLY; + } + + cmd->reply = "unknown command"; + return CTRL_CMD_ERROR; +} + +static int set_net_cfg_cmd(struct ctrl_cmd *cmd, void *data) +{ + char *bsc_variable; + struct bsc_config *bsc_cfg; + + if (!extract_bsc_cfg_variable(cmd, &bsc_cfg, &bsc_variable)) + return CTRL_CMD_ERROR; + + if (strcmp(bsc_variable, "access-list-name") == 0) { + bsc_replace_string(bsc_cfg, &bsc_cfg->acc_lst_name, cmd->value); + cmd->reply = talloc_asprintf(cmd, "%s", + bsc_cfg->acc_lst_name ? bsc_cfg->acc_lst_name : ""); + return CTRL_CMD_REPLY; + } + + cmd->reply = "unknown command"; + return CTRL_CMD_ERROR; +} + +static int verify_net_cfg_cmd(struct ctrl_cmd *cmd, const char *value, void *data) +{ + return 0; +} + + struct ctrl_handle *bsc_nat_controlif_setup(struct bsc_nat *nat, int port) { struct ctrl_handle *ctrl; @@ -312,13 +384,21 @@ struct ctrl_handle *bsc_nat_controlif_setup(struct bsc_nat *nat, int port) rc = ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_fwd_cmd); if (rc) { fprintf(stderr, "Failed to install the control command. Exiting.\n"); - osmo_fd_unregister(&ctrl->listen_fd); - close(ctrl->listen_fd.fd); - talloc_free(ctrl); - return NULL; + goto error; + } + rc = ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_cfg_cmd); + if (rc) { + fprintf(stderr, "Failed to install the net cfg command. Exiting.\n"); + goto error; } g_nat = nat; return ctrl; + +error: + osmo_fd_unregister(&ctrl->listen_fd); + close(ctrl->listen_fd.fd); + talloc_free(ctrl); + return NULL; } -- cgit v1.2.3 From 472f3bd1983431ace2353c96a23bb69860938104 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Tue, 4 Mar 2014 15:20:27 +0100 Subject: nat: Introduce command to remove an access-list-name --- openbsc/src/osmo-bsc_nat/bsc_nat_ctrl.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/openbsc/src/osmo-bsc_nat/bsc_nat_ctrl.c b/openbsc/src/osmo-bsc_nat/bsc_nat_ctrl.c index 8b675d44d..2836a1956 100644 --- a/openbsc/src/osmo-bsc_nat/bsc_nat_ctrl.c +++ b/openbsc/src/osmo-bsc_nat/bsc_nat_ctrl.c @@ -357,6 +357,11 @@ static int set_net_cfg_cmd(struct ctrl_cmd *cmd, void *data) cmd->reply = talloc_asprintf(cmd, "%s", bsc_cfg->acc_lst_name ? bsc_cfg->acc_lst_name : ""); return CTRL_CMD_REPLY; + } else if (strcmp(bsc_variable, "no-access-list-name") == 0) { + talloc_free(bsc_cfg->acc_lst_name); + bsc_cfg->acc_lst_name = NULL; + cmd->reply = ""; + return CTRL_CMD_REPLY; } cmd->reply = "unknown command"; -- cgit v1.2.3 From 4ecc6877a2a2fd3244979ec4a8d13a2862f5e6a4 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Tue, 4 Mar 2014 15:38:00 +0100 Subject: nat: Add CTRL command test case for the new control commands --- openbsc/doc/examples/osmo-bsc_nat/osmo-bsc_nat.cfg | 1 + openbsc/tests/ctrl_test_runner.py | 50 +++++++++++++++++++++- openbsc/tests/vty_test_runner.py | 2 +- 3 files changed, 50 insertions(+), 3 deletions(-) diff --git a/openbsc/doc/examples/osmo-bsc_nat/osmo-bsc_nat.cfg b/openbsc/doc/examples/osmo-bsc_nat/osmo-bsc_nat.cfg index 78eb4ba10..737d10474 100644 --- a/openbsc/doc/examples/osmo-bsc_nat/osmo-bsc_nat.cfg +++ b/openbsc/doc/examples/osmo-bsc_nat/osmo-bsc_nat.cfg @@ -62,6 +62,7 @@ nat timeout ping 20 timeout pong 5 ip-dscp 0 + access-list bla imsi-allow ^11$ bsc 0 token bla diff --git a/openbsc/tests/ctrl_test_runner.py b/openbsc/tests/ctrl_test_runner.py index 5691d76aa..22f378dd5 100644 --- a/openbsc/tests/ctrl_test_runner.py +++ b/openbsc/tests/ctrl_test_runner.py @@ -132,8 +132,12 @@ class TestCtrlBase(unittest.TestCase): if mtype == "ERROR": rsp['error'] = msg else: - [rsp['var'], rsp['value']] = msg.split(None, 1) - + split = msg.split(None, 1) + rsp['var'] = split[0] + if len(split) > 1: + rsp['value'] = split[1] + else: + rsp['value'] = None responses[id] = rsp if verbose: @@ -282,6 +286,40 @@ class TestCtrlBSC(TestCtrlBase): self.assertEquals(r['var'], 'mcc') self.assertEquals(r['value'], '201') +class TestCtrlNAT(TestCtrlBase): + + def ctrl_command(self): + return ["./src/osmo-bsc_nat/osmo-bsc_nat", "-c", + "doc/examples/osmo-bsc_nat/osmo-bsc_nat.cfg"] + + def ctrl_app(self): + return (4250, "./src/osmo-bsc_nat/osmo-bsc_nat", "OsmoNAT", "nat") + + def testAccessList(self): + r = self.do_get('net.0.bsc_cfg.0.access-list-name') + self.assertEquals(r['mtype'], 'GET_REPLY') + self.assertEquals(r['var'], 'net') + self.assertEquals(r['value'], None) + + r = self.do_set('net.0.bsc_cfg.0.access-list-name', 'bla') + self.assertEquals(r['mtype'], 'SET_REPLY') + self.assertEquals(r['var'], 'net') + self.assertEquals(r['value'], 'bla') + + r = self.do_get('net.0.bsc_cfg.0.access-list-name') + self.assertEquals(r['mtype'], 'GET_REPLY') + self.assertEquals(r['var'], 'net') + self.assertEquals(r['value'], 'bla') + + r = self.do_set('net.0.bsc_cfg.0.no-access-list-name', '1') + self.assertEquals(r['mtype'], 'SET_REPLY') + self.assertEquals(r['var'], 'net') + self.assertEquals(r['value'], None) + + r = self.do_set('net.0.bsc_cfg.0.no-access-list-name', '1') + self.assertEquals(r['mtype'], 'SET_REPLY') + self.assertEquals(r['var'], 'net') + self.assertEquals(r['value'], None) def add_bsc_test(suite, workdir): if not os.path.isfile(os.path.join(workdir, "src/osmo-bsc/osmo-bsc")): @@ -290,6 +328,13 @@ def add_bsc_test(suite, workdir): test = unittest.TestLoader().loadTestsFromTestCase(TestCtrlBSC) suite.addTest(test) +def add_nat_test(suite, workdir): + if not os.path.isfile(os.path.join(workdir, "src/osmo-bsc_nat/osmo-bsc_nat")): + print("Skipping the NAT test") + return + test = unittest.TestLoader().loadTestsFromTestCase(TestCtrlNAT) + suite.addTest(test) + if __name__ == '__main__': import argparse import sys @@ -321,5 +366,6 @@ if __name__ == '__main__': print "Running tests for specific control commands" suite = unittest.TestSuite() add_bsc_test(suite, workdir) + add_nat_test(suite, workdir) res = unittest.TextTestRunner(verbosity=verbose_level).run(suite) sys.exit(len(res.errors) + len(res.failures)) diff --git a/openbsc/tests/vty_test_runner.py b/openbsc/tests/vty_test_runner.py index 092f5ae6f..7c8fe8c30 100644 --- a/openbsc/tests/vty_test_runner.py +++ b/openbsc/tests/vty_test_runner.py @@ -525,7 +525,7 @@ class TestVTYNAT(TestVTYGenericBSC): res = self.vty.command("show running-config").split("\r\n") asserted = False for line in res: - if line.startswith(" access-list"): + if line.startswith(" access-list test-default"): self.assertEqual(line, " access-list test-default imsi-deny ^123[0-9]*$ 11 11") asserted = True self.assert_(asserted) -- cgit v1.2.3