[nat] Add the notion of a "local" connection.
A local connection is only between the MUX and the real BSC. We will
not forward anything to the MSC. This will be needed for the IMSI
filtering as sending a CREF is not liked by every BSC...
diff --git a/openbsc/include/openbsc/bsc_nat.h b/openbsc/include/openbsc/bsc_nat.h
index 99a3aa6..80d69d1 100644
--- a/openbsc/include/openbsc/bsc_nat.h
+++ b/openbsc/include/openbsc/bsc_nat.h
@@ -126,6 +126,7 @@
/* status */
int con_type;
+ int con_local;
/* GSM audio handling. That is 32 * multiplex + ts */
int crcx;
diff --git a/openbsc/src/nat/bsc_nat.c b/openbsc/src/nat/bsc_nat.c
index 3ee5374..65f6eec 100644
--- a/openbsc/src/nat/bsc_nat.c
+++ b/openbsc/src/nat/bsc_nat.c
@@ -609,6 +609,7 @@
static int forward_sccp_to_msc(struct bsc_connection *bsc, struct msgb *msg)
{
int con_found = 0;
+ int con_filter = 0;
struct bsc_connection *con_bsc = NULL;
int con_type;
struct bsc_nat_parsed *parsed;
@@ -659,6 +660,7 @@
if (con) {
con_found = 1;
con_bsc = con->bsc;
+ con_filter = con->con_local;
}
break;
case SCCP_MSG_TYPE_RLC:
@@ -666,6 +668,7 @@
if (con) {
con_found = 1;
con_bsc = con->bsc;
+ con_filter = con->con_local;
}
remove_sccp_src_ref(bsc, msg, parsed);
break;
@@ -693,6 +696,10 @@
goto exit2;
}
+ /* do not forward messages to the MSC */
+ if (con_filter)
+ goto exit2;
+
/* send the non-filtered but maybe modified msg */
queue_for_msc(nat->msc_con, msg);
talloc_free(parsed);