aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2010-09-15 01:11:08 +0800
committerHolger Hans Peter Freyther <zecke@selfish.org>2010-09-15 18:58:36 +0800
commit74e0a1b91c87804d25eb16eed47f3f83f962de6c (patch)
tree4138d5fdf52745398cf4f07006623b780b3a8a88
parent909e61fddcdd97ed1bb8c44951f12dc3590f6521 (diff)
nat: Start inspecting every message coming from the BSC for the IMSI
Return early in case the IMSI was already checked, if not we need to look at the connection and check if the message could contain a imsi we want/need to filter.
-rw-r--r--openbsc/include/openbsc/bsc_nat.h2
-rw-r--r--openbsc/src/nat/bsc_nat.c14
-rw-r--r--openbsc/src/nat/bsc_nat_utils.c9
3 files changed, 22 insertions, 3 deletions
diff --git a/openbsc/include/openbsc/bsc_nat.h b/openbsc/include/openbsc/bsc_nat.h
index 0c9af9184..6b2a09940 100644
--- a/openbsc/include/openbsc/bsc_nat.h
+++ b/openbsc/include/openbsc/bsc_nat.h
@@ -243,6 +243,8 @@ struct bsc_connection *bsc_nat_find_bsc(struct bsc_nat *nat, struct msgb *msg, i
*/
int bsc_nat_filter_sccp_cr(struct bsc_connection *bsc, struct msgb *msg,
struct bsc_nat_parsed *, int *con_type);
+int bsc_nat_filter_dt(struct bsc_connection *bsc, struct msgb *msg,
+ struct sccp_connections *con, struct bsc_nat_parsed *parsed);
/**
* SCCP patching and handling
diff --git a/openbsc/src/nat/bsc_nat.c b/openbsc/src/nat/bsc_nat.c
index 31009bb30..c7d97aa45 100644
--- a/openbsc/src/nat/bsc_nat.c
+++ b/openbsc/src/nat/bsc_nat.c
@@ -731,9 +731,17 @@ static int forward_sccp_to_msc(struct bsc_connection *bsc, struct msgb *msg)
case SCCP_MSG_TYPE_IT:
con = patch_sccp_src_ref_to_msc(msg, parsed, bsc);
if (con) {
- con_bsc = con->bsc;
- con_msc = con->msc_con;
- con_filter = con->con_local;
+ filter = bsc_nat_filter_dt(bsc, msg, con, parsed);
+ if (filter == 0) {
+ con_bsc = con->bsc;
+ con_msc = con->msc_con;
+ con_filter = con->con_local;
+ } else {
+ LOGP(DNAT, LOGL_ERROR, "Should drop the connection.\n");
+ con_bsc = con->bsc;
+ con_msc = con->msc_con;
+ con_filter = con->con_local;
+ }
}
break;
case SCCP_MSG_TYPE_RLC:
diff --git a/openbsc/src/nat/bsc_nat_utils.c b/openbsc/src/nat/bsc_nat_utils.c
index e81a1e85b..7387b517a 100644
--- a/openbsc/src/nat/bsc_nat_utils.c
+++ b/openbsc/src/nat/bsc_nat_utils.c
@@ -431,6 +431,15 @@ int bsc_nat_filter_sccp_cr(struct bsc_connection *bsc, struct msgb *msg, struct
}
}
+int bsc_nat_filter_dt(struct bsc_connection *bsc, struct msgb *msg,
+ struct sccp_connections *con, struct bsc_nat_parsed *parsed)
+{
+ if (con->imsi_checked)
+ return 0;
+
+ return 0;
+}
+
void bsc_parse_reg(void *ctx, regex_t *reg, char **imsi, int argc, const char **argv)
{
if (*imsi) {