[nat] Add a bsc_filter.c which will carry out the analysis and filtering

The first part is to analyze the IP Access Header and only forward
SCCP messages for now. In the future we might want to do MGCP
signalling through this protocol and connection as well and need to
update this then.
diff --git a/openbsc/src/nat/bsc_nat.c b/openbsc/src/nat/bsc_nat.c
index 6aed7c9..98eaa97 100644
--- a/openbsc/src/nat/bsc_nat.c
+++ b/openbsc/src/nat/bsc_nat.c
@@ -38,11 +38,14 @@
 #include <openbsc/debug.h>
 #include <openbsc/msgb.h>
 #include <openbsc/bsc_msc.h>
+#include <openbsc/bsc_nat.h>
 #include <openbsc/ipaccess.h>
 #include <openbsc/abis_nm.h>
 #include <openbsc/talloc.h>
 #include <openbsc/linuxlist.h>
 
+#include <sccp/sccp.h>
+
 static const char *config_file = "openbsc.cfg";
 static char *msc_address = "127.0.0.1";
 static struct in_addr local_addr;
@@ -65,6 +68,7 @@
 
 static LLIST_HEAD(bsc_connections);
 
+
 /*
  * below are stubs we need to link
  */
@@ -101,6 +105,10 @@
 
 	/* filter, drop, patch the message? */
 
+	/* drop packets with the wrong IPA header */
+	if (bsc_nat_filter_ipa(msg))
+		return;
+
 	/* currently send this to every BSC connected */
 	llist_for_each_entry(bsc, &bsc_connections, list_entry) {
 		write(bsc->bsc_fd.fd, msg->data, msg->len);
@@ -160,6 +168,10 @@
 {
 	/* FIXME: We need to filter out certain messages */
 
+	/* drop packets with the wrong IPA header */
+	if (bsc_nat_filter_ipa(msg))
+		return 0;
+
 	/* send the non-filtered but maybe modified msg */
 	return write(msc_connection.fd, msg->data, msg->len);
 }
@@ -168,7 +180,6 @@
 {
 	int error;
 	struct msgb *msg = ipaccess_read_msg(bfd, &error);
-	struct ipaccess_head *hh;
 
 	if (!msg) {
 		if (error == 0) {
@@ -180,16 +191,13 @@
 		return -1;
 	}
 
-	DEBUGP(DMSC, "MSG from BSC: %s proto: %d\n", hexdump(msg->data, msg->len), msg->l2h[0]);
 
-	/* handle base message handling */
-	hh = (struct ipaccess_head *) msg->data;
+	DEBUGP(DMSC, "MSG from BSC: %s proto: %d\n", hexdump(msg->data, msg->len), msg->l2h[0]);
 
 	/* Handle messages from the BSC */
 	/* FIXME: Currently no PONG is sent to the BSC */
 	/* FIXME: Currently no ID ACK is sent to the BSC */
-	if (hh->proto == IPAC_PROTO_SCCP)
-		forward_sccp_to_msc(msg);
+	forward_sccp_to_msc(msg);
 
 	return 0;
 }