nat: Prepare to patch more than the CC Setup message

Refactor the code to allow having different handlers. The goal
is to be able to patch some SMS messages too.
This commit is contained in:
Holger Hans Peter Freyther 2011-05-27 14:09:55 +02:00
parent ad75eababc
commit df8e6e9e4a
4 changed files with 37 additions and 30 deletions

View File

@ -385,7 +385,7 @@ int bsc_ussd_init(struct bsc_nat *nat);
int bsc_check_ussd(struct sccp_connections *con, struct bsc_nat_parsed *parsed, struct msgb *msg);
int bsc_close_ussd_connections(struct bsc_nat *nat);
struct msgb *bsc_nat_rewrite_setup(struct bsc_nat *nat, struct msgb *msg, struct bsc_nat_parsed *, const char *imsi);
struct msgb *bsc_nat_rewrite_msg(struct bsc_nat *nat, struct msgb *msg, struct bsc_nat_parsed *, const char *imsi);
/** paging group handling */
struct bsc_nat_paging_group *bsc_nat_paging_group_num(struct bsc_nat *nat, int group);

View File

@ -1040,7 +1040,7 @@ static int forward_sccp_to_msc(struct bsc_connection *bsc, struct msgb *msg)
* replace the msg and the parsed structure becomes
* invalid.
*/
msg = bsc_nat_rewrite_setup(bsc->nat, msg, parsed, con->imsi);
msg = bsc_nat_rewrite_msg(bsc->nat, msg, parsed, con->imsi);
talloc_free(parsed);
parsed = NULL;
} else if (con->con_local == NAT_CON_END_USSD) {

View File

@ -838,39 +838,19 @@ static char *rewrite_non_international(struct bsc_nat *nat, void *ctx, const cha
/**
* Rewrite non global numbers... according to rules based on the IMSI
*/
struct msgb *bsc_nat_rewrite_setup(struct bsc_nat *nat, struct msgb *msg, struct bsc_nat_parsed *parsed, const char *imsi)
static struct msgb *rewrite_setup(struct bsc_nat *nat, struct msgb *msg,
struct bsc_nat_parsed *parsed, const char *imsi,
struct gsm48_hdr *hdr48, const uint32_t len)
{
struct tlv_parsed tp;
struct gsm48_hdr *hdr48;
uint32_t len;
uint8_t msg_type, proto;
unsigned int payload_len;
struct gsm_mncc_number called;
char *new_number = NULL;
struct msgb *out, *sccp;
char *new_number = NULL;
uint8_t *outptr;
const uint8_t *msgptr;
int sec_len;
if (!imsi || strlen(imsi) < 5)
return msg;
/* only care about DTAP messages */
if (parsed->bssap != BSSAP_MSG_DTAP)
return msg;
if (!parsed->dest_local_ref)
return msg;
hdr48 = bsc_unpack_dtap(parsed, msg, &len);
if (!hdr48)
return msg;
proto = hdr48->proto_discr & 0x0f;
msg_type = hdr48->msg_type & 0xbf;
if (proto != GSM48_PDISC_CC ||
msg_type != GSM48_MT_CC_SETUP)
return msg;
/* decode and rewrite the message */
payload_len = len - sizeof(*hdr48);
tlv_parse(&tp, &gsm48_att_tlvdef, hdr48->data, payload_len, 0, 0);
@ -957,6 +937,33 @@ struct msgb *bsc_nat_rewrite_setup(struct bsc_nat *nat, struct msgb *msg, struct
return sccp;
}
struct msgb *bsc_nat_rewrite_msg(struct bsc_nat *nat, struct msgb *msg, struct bsc_nat_parsed *parsed, const char *imsi)
{
struct gsm48_hdr *hdr48;
uint32_t len;
uint8_t msg_type, proto;
if (!imsi || strlen(imsi) < 5)
return msg;
/* only care about DTAP messages */
if (parsed->bssap != BSSAP_MSG_DTAP)
return msg;
if (!parsed->dest_local_ref)
return msg;
hdr48 = bsc_unpack_dtap(parsed, msg, &len);
if (!hdr48)
return msg;
proto = hdr48->proto_discr & 0x0f;
msg_type = hdr48->msg_type & 0xbf;
if (proto == GSM48_PDISC_CC && msg_type == GSM48_MT_CC_SETUP)
return rewrite_setup(nat, msg, parsed, imsi, hdr48, len);
return msg;
}
static void num_rewr_free_data(struct bsc_nat_num_rewr_entry *entry)
{
regfree(&entry->msisdn_reg);

View File

@ -865,7 +865,7 @@ static void test_setup_rewrite()
abort();
}
out = bsc_nat_rewrite_setup(nat, msg, parsed, imsi);
out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);
if (msg != out) {
fprintf(stderr, "FAIL: The message should not have been changed\n");
abort();
@ -891,7 +891,7 @@ static void test_setup_rewrite()
abort();
}
out = bsc_nat_rewrite_setup(nat, msg, parsed, imsi);
out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);
if (!out) {
fprintf(stderr, "FAIL: A new message should be created.\n");
abort();
@ -926,7 +926,7 @@ static void test_setup_rewrite()
abort();
}
out = bsc_nat_rewrite_setup(nat, msg, parsed, imsi);
out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);
if (!out) {
fprintf(stderr, "FAIL: A new message should be created.\n");
abort();
@ -961,7 +961,7 @@ static void test_setup_rewrite()
abort();
}
out = bsc_nat_rewrite_setup(nat, msg, parsed, imsi);
out = bsc_nat_rewrite_msg(nat, msg, parsed, imsi);
if (out != msg) {
fprintf(stderr, "FAIL: The message should be unchanged.\n");
abort();