From a3967579f8b290d19030f10aeb9c1c827bbf263c Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Wed, 29 Sep 2010 02:30:50 +0800 Subject: nat: Move the DTAP unpacking into a new method DTAP unpacking will be used by the USSD checking code --- openbsc/include/openbsc/bsc_nat.h | 3 +++ openbsc/src/nat/bsc_nat_utils.c | 34 +++++++++++++++++++++------------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/openbsc/include/openbsc/bsc_nat.h b/openbsc/include/openbsc/bsc_nat.h index 6fc0e6501..b6d040433 100644 --- a/openbsc/include/openbsc/bsc_nat.h +++ b/openbsc/include/openbsc/bsc_nat.h @@ -32,6 +32,7 @@ #include #include #include +#include #include @@ -315,4 +316,6 @@ int bsc_nat_msc_is_connected(struct bsc_nat *nat); int bsc_conn_type_to_ctr(struct sccp_connections *conn); +struct gsm48_hdr *bsc_unpack_dtap(struct bsc_nat_parsed *parsed, struct msgb *msg, uint32_t *len); + #endif diff --git a/openbsc/src/nat/bsc_nat_utils.c b/openbsc/src/nat/bsc_nat_utils.c index 674de4184..dc18cffec 100644 --- a/openbsc/src/nat/bsc_nat_utils.c +++ b/openbsc/src/nat/bsc_nat_utils.c @@ -549,6 +549,25 @@ int bsc_nat_filter_sccp_cr(struct bsc_connection *bsc, struct msgb *msg, } } +struct gsm48_hdr *bsc_unpack_dtap(struct bsc_nat_parsed *parsed, + struct msgb *msg, uint32_t *len) +{ + /* gsm_type is actually the size of the dtap */ + *len = parsed->gsm_type; + if (*len < msgb_l3len(msg) - 3) { + LOGP(DNAT, LOGL_ERROR, "Not enough space for DTAP.\n"); + return NULL; + } + + if (*len < sizeof(struct gsm48_hdr)) { + LOGP(DNAT, LOGL_ERROR, "GSM48 header does not fit.\n"); + return NULL; + } + + msg->l4h = &msg->l3h[3]; + return (struct gsm48_hdr *) msg->l4h; +} + int bsc_nat_filter_dt(struct bsc_connection *bsc, struct msgb *msg, struct sccp_connections *con, struct bsc_nat_parsed *parsed) { @@ -563,20 +582,9 @@ int bsc_nat_filter_dt(struct bsc_connection *bsc, struct msgb *msg, if (parsed->bssap != BSSAP_MSG_DTAP) return 0; - /* gsm_type is actually the size of the dtap */ - len = parsed->gsm_type; - if (len < msgb_l3len(msg) - 3) { - LOGP(DNAT, LOGL_ERROR, "Not enough space for DTAP.\n"); + hdr48 = bsc_unpack_dtap(parsed, msg, &len); + if (!hdr48) return -1; - } - - if (len < sizeof(*hdr48)) { - LOGP(DNAT, LOGL_ERROR, "GSM48 header does not fit.\n"); - return -1; - } - - msg->l4h = &msg->l3h[3]; - hdr48 = (struct gsm48_hdr *) msg->l4h; msg_type = hdr48->msg_type & 0xbf; if (hdr48->proto_discr == GSM48_PDISC_MM && -- cgit v1.2.3