From 11c17233fea7bc9e59d3718f55620f4044910d41 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Sun, 16 May 2010 02:00:40 +0800 Subject: [nat] Set the connection type/reason as out parameter We are analyzing each CR message and it is nice to know the reason these connections were created. Change the nat method. --- openbsc/include/openbsc/bsc_nat.h | 11 ++++++++++- openbsc/src/nat/bsc_nat.c | 3 ++- openbsc/src/nat/bsc_nat_utils.c | 8 +++++++- openbsc/tests/bsc-nat/bsc_nat_test.c | 17 +++++++++++++++-- 4 files changed, 34 insertions(+), 5 deletions(-) (limited to 'openbsc') diff --git a/openbsc/include/openbsc/bsc_nat.h b/openbsc/include/openbsc/bsc_nat.h index 351a06d48..b9a8c60f0 100644 --- a/openbsc/include/openbsc/bsc_nat.h +++ b/openbsc/include/openbsc/bsc_nat.h @@ -42,6 +42,14 @@ struct bsc_nat; +enum { + NAT_CON_TYPE_NONE, + NAT_CON_TYPE_LU, + NAT_CON_TYPE_CM_SERV_REQ, + NAT_CON_TYPE_PAG_RESP, + NAT_CON_TYPE_OTHER, +}; + /* * For the NAT we will need to analyze and later patch * the received message. This would require us to parse @@ -261,7 +269,8 @@ struct bsc_connection *bsc_nat_find_bsc(struct bsc_nat *nat, struct msgb *msg, i /** * Content filtering. */ -int bsc_nat_filter_sccp_cr(struct bsc_connection *, struct msgb *msg, struct bsc_nat_parsed *); +int bsc_nat_filter_sccp_cr(struct bsc_connection *bsc, struct msgb *msg, + struct bsc_nat_parsed *, int *con_type); /** * SCCP patching and handling diff --git a/openbsc/src/nat/bsc_nat.c b/openbsc/src/nat/bsc_nat.c index f1849ec29..59257f4a7 100644 --- a/openbsc/src/nat/bsc_nat.c +++ b/openbsc/src/nat/bsc_nat.c @@ -574,6 +574,7 @@ static void ipaccess_auth_bsc(struct tlv_parsed *tvp, struct bsc_connection *bsc static int forward_sccp_to_msc(struct bsc_connection *bsc, struct msgb *msg) { + int con_type; struct msgb *refuse; struct sccp_connections *con; struct bsc_nat_parsed *parsed; @@ -605,7 +606,7 @@ static int forward_sccp_to_msc(struct bsc_connection *bsc, struct msgb *msg) if (parsed->ipa_proto == IPAC_PROTO_SCCP) { switch (parsed->sccp_type) { case SCCP_MSG_TYPE_CR: - if (bsc_nat_filter_sccp_cr(bsc, msg, parsed) != 0) + if (bsc_nat_filter_sccp_cr(bsc, msg, parsed, &con_type) != 0) goto exit3; if (create_sccp_src_ref(bsc, msg, parsed) != 0) goto exit2; diff --git a/openbsc/src/nat/bsc_nat_utils.c b/openbsc/src/nat/bsc_nat_utils.c index 1e1a9ce74..8083c6ad1 100644 --- a/openbsc/src/nat/bsc_nat_utils.c +++ b/openbsc/src/nat/bsc_nat_utils.c @@ -315,13 +315,15 @@ static int _cr_check_pag_resp(struct bsc_connection *bsc, uint8_t *data, unsigne } /* Filter out CR data... */ -int bsc_nat_filter_sccp_cr(struct bsc_connection *bsc, struct msgb *msg, struct bsc_nat_parsed *parsed) +int bsc_nat_filter_sccp_cr(struct bsc_connection *bsc, struct msgb *msg, struct bsc_nat_parsed *parsed, int *con_type) { struct tlv_parsed tp; struct gsm48_hdr *hdr48; int hdr48_len; int len; + *con_type = NAT_CON_TYPE_NONE; + if (parsed->gsm_type != BSS_MAP_MSG_COMPLETE_LAYER_3) { LOGP(DNAT, LOGL_ERROR, "Rejecting CR message due wrong GSM Type %d\n", parsed->gsm_type); @@ -357,15 +359,19 @@ int bsc_nat_filter_sccp_cr(struct bsc_connection *bsc, struct msgb *msg, struct if (hdr48->proto_discr == GSM48_PDISC_MM && hdr48->msg_type == GSM48_MT_MM_LOC_UPD_REQUEST) { + *con_type = NAT_CON_TYPE_LU; return _cr_check_loc_upd(bsc, &hdr48->data[0], hdr48_len - sizeof(*hdr48)); } else if (hdr48->proto_discr == GSM48_PDISC_MM && hdr48->msg_type == GSM48_MT_MM_CM_SERV_REQ) { + *con_type = NAT_CON_TYPE_CM_SERV_REQ; return _cr_check_cm_serv_req(bsc, &hdr48->data[0], hdr48_len - sizeof(*hdr48)); } else if (hdr48->proto_discr == GSM48_PDISC_RR && hdr48->msg_type == GSM48_MT_RR_PAG_RESP) { + *con_type = NAT_CON_TYPE_PAG_RESP; return _cr_check_pag_resp(bsc, &hdr48->data[0], hdr48_len - sizeof(*hdr48)); } else { /* We only want to filter the above, let other things pass */ + *con_type = NAT_CON_TYPE_OTHER; return 0; } } diff --git a/openbsc/tests/bsc-nat/bsc_nat_test.c b/openbsc/tests/bsc-nat/bsc_nat_test.c index 29f19122e..aea920e8f 100644 --- a/openbsc/tests/bsc-nat/bsc_nat_test.c +++ b/openbsc/tests/bsc-nat/bsc_nat_test.c @@ -566,6 +566,7 @@ struct cr_filter { const u_int8_t *data; int length; int result; + int contype; const char *bsc_imsi_allow; const char *bsc_imsi_deny; @@ -577,16 +578,19 @@ static struct cr_filter cr_filter[] = { .data = bssmap_cr, .length = sizeof(bssmap_cr), .result = 0, + .contype = NAT_CON_TYPE_CM_SERV_REQ, }, { .data = bss_lu, .length = sizeof(bss_lu), .result = 0, + .contype = NAT_CON_TYPE_LU, }, { .data = pag_resp, .length = sizeof(pag_resp), .result = 0, + .contype = NAT_CON_TYPE_PAG_RESP, }, { /* nat deny is before blank/null BSC */ @@ -594,6 +598,7 @@ static struct cr_filter cr_filter[] = { .length = sizeof(bss_lu), .result = -3, .nat_imsi_deny = "[0-9]*", + .contype = NAT_CON_TYPE_LU, }, { /* BSC allow is before NAT deny */ @@ -602,6 +607,7 @@ static struct cr_filter cr_filter[] = { .result = 0, .nat_imsi_deny = "[0-9]*", .bsc_imsi_allow = "2440[0-9]*", + .contype = NAT_CON_TYPE_LU, }, { /* BSC allow is before NAT deny */ @@ -610,6 +616,7 @@ static struct cr_filter cr_filter[] = { .result = 0, .bsc_imsi_allow = "[0-9]*", .nat_imsi_deny = "[0-9]*", + .contype = NAT_CON_TYPE_LU, }, { /* filter as deny is first */ @@ -619,13 +626,14 @@ static struct cr_filter cr_filter[] = { .bsc_imsi_deny = "[0-9]*", .bsc_imsi_allow = "[0-9]*", .nat_imsi_deny = "[0-9]*", + .contype = NAT_CON_TYPE_LU, }, }; static void test_cr_filter() { - int i, res; + int i, res, contype; struct msgb *msg = msgb_alloc(4096, "test_cr_filter"); struct bsc_nat_parsed *parsed; @@ -653,12 +661,17 @@ static void test_cr_filter() abort(); } - res = bsc_nat_filter_sccp_cr(bsc, msg, parsed); + res = bsc_nat_filter_sccp_cr(bsc, msg, parsed, &contype); if (res != cr_filter[i].result) { fprintf(stderr, "FAIL: Wrong result %d for test %d.\n", res, i); abort(); } + if (contype != cr_filter[i].contype) { + fprintf(stderr, "FAIL: Wrong contype %d for test %d.\n", res, contype); + abort(); + } + talloc_free(parsed); } -- cgit v1.2.3