diff options
author | Holger Hans Peter Freyther <zecke@selfish.org> | 2013-06-25 11:44:01 +0200 |
---|---|---|
committer | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2013-07-31 16:36:40 +0200 |
commit | ddf191eafc079cb26e2956a611d59e5235de1798 (patch) | |
tree | f1c012375d24c6f58e14c8606a11fb671d3b1da2 /openbsc/src/osmo-bsc_nat | |
parent | 85d3b34ed2c3b627fca50c82abe426b7239b62a3 (diff) |
nat: Allow to use the prefix lookup to rewrite numbers
* Increase the rewritten rule to five digits (this is the easiest
for the unit test). This will add another 40kb to the runtime size.
* Create a unit test that tests adding and removing the prefix rules.
* Use the regexp match to replace from one package
Diffstat (limited to 'openbsc/src/osmo-bsc_nat')
-rw-r--r-- | openbsc/src/osmo-bsc_nat/bsc_nat_rewrite.c | 45 | ||||
-rw-r--r-- | openbsc/src/osmo-bsc_nat/bsc_nat_rewrite_trie.c | 19 | ||||
-rw-r--r-- | openbsc/src/osmo-bsc_nat/bsc_nat_vty.c | 60 |
3 files changed, 117 insertions, 7 deletions
diff --git a/openbsc/src/osmo-bsc_nat/bsc_nat_rewrite.c b/openbsc/src/osmo-bsc_nat/bsc_nat_rewrite.c index 06071c475..5984d962d 100644 --- a/openbsc/src/osmo-bsc_nat/bsc_nat_rewrite.c +++ b/openbsc/src/osmo-bsc_nat/bsc_nat_rewrite.c @@ -27,6 +27,7 @@ #include <openbsc/gsm_data.h> #include <openbsc/debug.h> #include <openbsc/ipaccess.h> +#include <openbsc/nat_rewrite_trie.h> #include <osmocom/core/linuxlist.h> #include <osmocom/core/talloc.h> @@ -37,9 +38,30 @@ #include <osmocom/sccp/sccp.h> +static char *trie_lookup(struct nat_rewrite *trie, const char *number, + regoff_t off, void *ctx) +{ + struct nat_rewrite_rule *rule; + + if (!trie) { + LOGP(DNAT, LOGL_ERROR, + "Asked to do a table lookup but no table.\n"); + return NULL; + } + + rule = nat_rewrite_lookup(trie, number); + if (!rule) { + LOGP(DNAT, LOGL_DEBUG, + "Couldn't find a prefix rule for %s\n", number); + return NULL; + } + + return talloc_asprintf(ctx, "%s%s", rule->rewrite, &number[off]); +} + static char *match_and_rewrite_number(void *ctx, const char *number, - const char *imsi, - struct llist_head *list) + const char *imsi, struct llist_head *list, + struct nat_rewrite *trie) { struct bsc_nat_num_rewr_entry *entry; char *new_number = NULL; @@ -53,11 +75,17 @@ static char *match_and_rewrite_number(void *ctx, const char *number, continue; /* this regexp matches... */ - if (regexec(&entry->num_reg, number, 2, matches, 0) == 0 && - matches[1].rm_eo != -1) - new_number = talloc_asprintf(ctx, "%s%s", + if (regexec(&entry->num_reg, number, 2, matches, 0) == 0 + && matches[1].rm_eo != -1) { + if (entry->is_prefix_lookup) + new_number = trie_lookup(trie, number, + matches[1].rm_so, ctx); + else + new_number = talloc_asprintf(ctx, "%s%s", entry->replace, &number[matches[1].rm_so]); + } + if (new_number) break; } @@ -86,7 +114,7 @@ static char *rewrite_isdn_number(struct bsc_nat *nat, void *ctx, const char *ims } return match_and_rewrite_number(ctx, number, - imsi, &nat->num_rewr); + imsi, &nat->num_rewr, nat->num_rewr_trie); } @@ -261,7 +289,7 @@ static char *sms_new_dest_nr(struct bsc_nat *nat, void *ctx, const char *imsi, const char *dest_nr) { return match_and_rewrite_number(ctx, dest_nr, imsi, - &nat->sms_num_rewr); + &nat->sms_num_rewr, NULL); } /** @@ -600,6 +628,9 @@ void bsc_nat_num_rewr_entry_adapt(void *ctx, struct llist_head *head, continue; } + if (strcmp("prefix_lookup", entry->replace) == 0) + entry->is_prefix_lookup = 1; + /* we will now build a regexp string */ if (cfg_entry->mcc[0] == '^') { regexp = talloc_strdup(entry, cfg_entry->mcc); diff --git a/openbsc/src/osmo-bsc_nat/bsc_nat_rewrite_trie.c b/openbsc/src/osmo-bsc_nat/bsc_nat_rewrite_trie.c index 57043acc9..faceb59b5 100644 --- a/openbsc/src/osmo-bsc_nat/bsc_nat_rewrite_trie.c +++ b/openbsc/src/osmo-bsc_nat/bsc_nat_rewrite_trie.c @@ -21,6 +21,7 @@ #include <openbsc/nat_rewrite_trie.h> #include <openbsc/debug.h> +#include <openbsc/vty.h> #include <osmocom/core/talloc.h> #include <osmocom/core/utils.h> @@ -238,3 +239,21 @@ void nat_rewrite_dump(struct nat_rewrite *rewrite) { nat_rewrite_dump_rec(&rewrite->rule); } + +static void nat_rewrite_dump_rec_vty(struct vty *vty, struct nat_rewrite_rule *rule) +{ + int i; + if (!rule->empty) + vty_out(vty, "%s,%s%s", rule->prefix, rule->rewrite, VTY_NEWLINE); + + for (i = 0; i < ARRAY_SIZE(rule->rules); ++i) { + if (!rule->rules[i]) + continue; + nat_rewrite_dump_rec_vty(vty, rule->rules[i]); + } +} + +void nat_rewrite_dump_vty(struct vty *vty, struct nat_rewrite *rewrite) +{ + nat_rewrite_dump_rec_vty(vty, &rewrite->rule); +} diff --git a/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c b/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c index 6774a420f..5404bfbba 100644 --- a/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c +++ b/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c @@ -26,6 +26,7 @@ #include <openbsc/gsm_04_08.h> #include <openbsc/mgcp.h> #include <openbsc/vty.h> +#include <openbsc/nat_rewrite_trie.h> #include <osmocom/core/talloc.h> #include <osmocom/core/rate_ctr.h> @@ -138,6 +139,9 @@ static int config_write_nat(struct vty *vty) if (_nat->sms_num_rewr_name) vty_out(vty, " sms-number-rewrite %s%s", _nat->sms_num_rewr_name, VTY_NEWLINE); + if (_nat->num_rewr_trie_name) + vty_out(vty, " prefix-tree %s%s", + _nat->num_rewr_trie_name, VTY_NEWLINE); llist_for_each_entry(lst, &_nat->access_lists, list) write_acc_lst(vty, lst); @@ -633,6 +637,59 @@ DEFUN(cfg_nat_no_sms_number_rewrite, return CMD_SUCCESS; } +DEFUN(cfg_nat_prefix_trie, + cfg_nat_prefix_trie_cmd, + "prefix-tree FILENAME", + "Prefix tree for number rewriting\n" "File to load\n") +{ + /* give up the old data */ + talloc_free(_nat->num_rewr_trie); + _nat->num_rewr_trie = NULL; + + /* replace the file name */ + bsc_replace_string(_nat, &_nat->num_rewr_trie_name, argv[0]); + if (!_nat->num_rewr_trie_name) { + vty_out(vty, "%% prefix-tree no filename is present.%s", VTY_NEWLINE); + return CMD_WARNING; + } + + _nat->num_rewr_trie = nat_rewrite_parse(_nat, _nat->num_rewr_trie_name); + if (!_nat->num_rewr_trie) { + vty_out(vty, "%% prefix-tree parsing has failed.%s", VTY_NEWLINE); + return CMD_WARNING; + } + + vty_out(vty, "%% prefix-tree loaded %zu rules.%s", + _nat->num_rewr_trie->prefixes, VTY_NEWLINE); + return CMD_SUCCESS; +} + +DEFUN(cfg_nat_no_prefix_trie, cfg_nat_no_prefix_trie_cmd, + "no prefix-tree", + NO_STR "Prefix tree for number rewriting\n") +{ + talloc_free(_nat->num_rewr_trie); + _nat->num_rewr_trie = NULL; + talloc_free(_nat->num_rewr_trie_name); + _nat->num_rewr_trie_name = NULL; + + return CMD_SUCCESS; +} + +DEFUN(show_prefix_tree, show_prefix_tree_cmd, + "show prefix-tree", + SHOW_STR "Prefix tree for number rewriting\n") +{ + if (!_nat->num_rewr_trie) { + vty_out(vty, "%% there is now prefix tree loaded.%s", + VTY_NEWLINE); + return CMD_WARNING; + } + + nat_rewrite_dump_vty(vty, _nat->num_rewr_trie); + return CMD_SUCCESS; +} + DEFUN(cfg_nat_ussd_lst_name, cfg_nat_ussd_lst_name_cmd, "ussd-list-name NAME", @@ -1089,6 +1146,7 @@ int bsc_nat_vty_init(struct bsc_nat *nat) install_element_ve(&show_bsc_mgcp_cmd); install_element_ve(&show_acc_lst_cmd); install_element_ve(&show_bar_lst_cmd); + install_element_ve(&show_prefix_tree_cmd); install_element(ENABLE_NODE, &set_last_endp_cmd); install_element(ENABLE_NODE, &block_new_conn_cmd); @@ -1131,6 +1189,8 @@ int bsc_nat_vty_init(struct bsc_nat *nat) install_element(NAT_NODE, &cfg_nat_no_sms_clear_tpsrr_cmd); install_element(NAT_NODE, &cfg_nat_sms_number_rewrite_cmd); install_element(NAT_NODE, &cfg_nat_no_sms_number_rewrite_cmd); + install_element(NAT_NODE, &cfg_nat_prefix_trie_cmd); + install_element(NAT_NODE, &cfg_nat_no_prefix_trie_cmd); install_element(NAT_NODE, &cfg_nat_pgroup_cmd); install_element(NAT_NODE, &cfg_nat_no_pgroup_cmd); |