diff options
author | Holger Hans Peter Freyther <zecke@selfish.org> | 2013-04-02 12:34:11 +0200 |
---|---|---|
committer | Holger Hans Peter Freyther <zecke@selfish.org> | 2013-04-16 09:20:06 +0200 |
commit | dbd9449a1659f46ef8be68c6c643045e841835a6 (patch) | |
tree | 4017893b4348c4d29f62187d5780b15984069433 /openbsc/src/osmo-bsc_nat/bsc_nat_rewrite.c | |
parent | 27b618422541af332b3a5876b5e6a5919236b4d3 (diff) |
nat: Allow to re-write international numbers in the CC Setup messages
Prepend the international number with a '+' and then do the normal
re-writing on it. There are a couple of ways to handle this:
\+([0-9]), \+[0-9][0-9]([0-9]), \+49([0-9])
Add a test case for the international re-write based on an already
internationalized number.
Diffstat (limited to 'openbsc/src/osmo-bsc_nat/bsc_nat_rewrite.c')
-rw-r--r-- | openbsc/src/osmo-bsc_nat/bsc_nat_rewrite.c | 26 |
1 files changed, 19 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 1eed149a5..c9b6f4a91 100644 --- a/openbsc/src/osmo-bsc_nat/bsc_nat_rewrite.c +++ b/openbsc/src/osmo-bsc_nat/bsc_nat_rewrite.c @@ -2,8 +2,8 @@ * Message rewriting functionality */ /* - * (C) 2010-2011 by Holger Hans Peter Freyther <zecke@selfish.org> - * (C) 2010-2011 by On-Waves + * (C) 2010-2013 by Holger Hans Peter Freyther <zecke@selfish.org> + * (C) 2010-2013 by On-Waves * All Rights Reserved * * This program is free software; you can redistribute it and/or modify @@ -65,18 +65,27 @@ static char *match_and_rewrite_number(void *ctx, const char *number, return new_number; } -static char *rewrite_non_international(struct bsc_nat *nat, void *ctx, const char *imsi, +static char *rewrite_isdn_number(struct bsc_nat *nat, void *ctx, const char *imsi, struct gsm_mncc_number *called) { + char *number = called->number; + if (llist_empty(&nat->num_rewr)) return NULL; + /* only ISDN plan */ if (called->plan != 1) return NULL; - if (called->type == 1) - return NULL; - return match_and_rewrite_number(ctx, called->number, + /* international, prepend */ + if (called->type == 1) { + char int_number[sizeof(called->number) + 2]; + int_number[0] = '+'; + memcpy(&int_number[1], number, strlen(number) + 1); + number = int_number; + } + + return match_and_rewrite_number(ctx, number, imsi, &nat->num_rewr); } @@ -110,7 +119,7 @@ static struct msgb *rewrite_setup(struct bsc_nat *nat, struct msgb *msg, TLVP_VAL(&tp, GSM48_IE_CALLED_BCD) - 1); /* check if it looks international and stop */ - new_number = rewrite_non_international(nat, msg, imsi, &called); + new_number = rewrite_isdn_number(nat, msg, imsi, &called); if (!new_number) { LOGP(DNAT, LOGL_DEBUG, "No IMSI match found, returning message.\n"); @@ -150,6 +159,9 @@ static struct msgb *rewrite_setup(struct bsc_nat *nat, struct msgb *msg, called.type = 1; strncpy(called.number, new_number + 2, sizeof(called.number)); } else { + /* rewrite international to unknown */ + if (called.type == 1) + called.type = 0; strncpy(called.number, new_number, sizeof(called.number)); } gsm48_encode_called(out, &called); |