aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/libfilter
diff options
context:
space:
mode:
Diffstat (limited to 'openbsc/src/libfilter')
-rw-r--r--openbsc/src/libfilter/bsc_msg_filter.c58
1 files changed, 7 insertions, 51 deletions
diff --git a/openbsc/src/libfilter/bsc_msg_filter.c b/openbsc/src/libfilter/bsc_msg_filter.c
index 5f8bff004..a1271a095 100644
--- a/openbsc/src/libfilter/bsc_msg_filter.c
+++ b/openbsc/src/libfilter/bsc_msg_filter.c
@@ -328,14 +328,12 @@ static int _dt_check_id_resp(struct bsc_connection *bsc,
/* Filter out CR data... */
-int bsc_nat_filter_sccp_cr(struct bsc_connection *bsc, struct msgb *msg,
- struct bsc_nat_parsed *parsed, int *con_type,
+int bsc_msg_filter_initial(struct gsm48_hdr *hdr48, size_t hdr48_len,
+ struct bsc_connection *bsc,
+ int *con_type,
char **imsi, struct bsc_filter_reject_cause *cause)
{
- struct tlv_parsed tp;
- struct gsm48_hdr *hdr48;
- int hdr48_len;
- int len, ret = 0;
+ int ret = 0;
uint8_t msg_type, proto;
*con_type = NAT_CON_TYPE_NONE;
@@ -343,39 +341,6 @@ int bsc_nat_filter_sccp_cr(struct bsc_connection *bsc, struct msgb *msg,
cause->lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED;
*imsi = NULL;
- 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);
- return -1;
- }
-
- /* the parsed has had some basic l3 length check */
- len = msg->l3h[1];
- if (msgb_l3len(msg) - 3 < len) {
- LOGP(DNAT, LOGL_ERROR,
- "The CR Data has not enough space...\n");
- return -1;
- }
-
- msg->l4h = &msg->l3h[3];
- len -= 1;
-
- tlv_parse(&tp, gsm0808_att_tlvdef(), msg->l4h, len, 0, 0);
-
- if (!TLVP_PRESENT(&tp, GSM0808_IE_LAYER_3_INFORMATION)) {
- LOGP(DNAT, LOGL_ERROR, "CR Data does not contain layer3 information.\n");
- return -1;
- }
-
- hdr48_len = TLVP_LEN(&tp, GSM0808_IE_LAYER_3_INFORMATION);
-
- if (hdr48_len < sizeof(*hdr48)) {
- LOGP(DNAT, LOGL_ERROR, "GSM48 header does not fit.\n");
- return -1;
- }
-
- hdr48 = (struct gsm48_hdr *) TLVP_VAL(&tp, GSM0808_IE_LAYER_3_INFORMATION);
-
proto = hdr48->proto_discr & 0x0f;
msg_type = hdr48->msg_type & 0xbf;
if (proto == GSM48_PDISC_MM &&
@@ -412,13 +377,12 @@ int bsc_nat_filter_sccp_cr(struct bsc_connection *bsc, struct msgb *msg,
return auth_imsi(bsc, *imsi, cause);
}
-int bsc_nat_filter_dt(struct bsc_connection *bsc, struct msgb *msg,
- struct nat_sccp_connection *con, struct bsc_nat_parsed *parsed,
+int bsc_msg_filter_data(struct gsm48_hdr *hdr48, size_t len,
+ struct bsc_connection *bsc,
+ struct nat_sccp_connection *con,
struct bsc_filter_reject_cause *cause)
{
- uint32_t len;
uint8_t msg_type, proto;
- struct gsm48_hdr *hdr48;
cause->cm_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED;
cause->lu_reject_cause = GSM48_REJECT_PLMN_NOT_ALLOWED;
@@ -426,14 +390,6 @@ int bsc_nat_filter_dt(struct bsc_connection *bsc, struct msgb *msg,
if (con->imsi_checked)
return 0;
- /* only care about DTAP messages */
- if (parsed->bssap != BSSAP_MSG_DTAP)
- return 0;
-
- hdr48 = bsc_unpack_dtap(parsed, msg, &len);
- if (!hdr48)
- return -1;
-
proto = hdr48->proto_discr & 0x0f;
msg_type = hdr48->msg_type & 0xbf;
if (proto != GSM48_PDISC_MM || msg_type != GSM48_MT_MM_ID_RESP)