nat: Add hook for rewriting a setup message

Create a new function, hand the data to this function, take back
a possible modified msgb and invalidate parsed at this point.
diff --git a/openbsc/include/openbsc/bsc_nat.h b/openbsc/include/openbsc/bsc_nat.h
index 083746f..0494217 100644
--- a/openbsc/include/openbsc/bsc_nat.h
+++ b/openbsc/include/openbsc/bsc_nat.h
@@ -343,4 +343,6 @@
 int bsc_ussd_init(struct bsc_nat *nat);
 int bsc_check_ussd(struct sccp_connections *con, struct bsc_nat_parsed *parsed, struct msgb *msg);
 
+struct msgb *bsc_nat_rewrite_setup(struct bsc_nat *nat, struct msgb *msg, struct bsc_nat_parsed *);
+
 #endif
diff --git a/openbsc/src/nat/bsc_nat.c b/openbsc/src/nat/bsc_nat.c
index daabf09..dcacfb9 100644
--- a/openbsc/src/nat/bsc_nat.c
+++ b/openbsc/src/nat/bsc_nat.c
@@ -858,6 +858,15 @@
 					/* hand data to a side channel */
 					if (bsc_check_ussd(con, parsed, msg) == 1) 
 						con->con_local = 2;
+
+					/*
+					 * Optionally rewrite setup message. This can
+					 * replace the msg and the parsed structure becomes
+					 * invalid.
+					 */
+					msg = bsc_nat_rewrite_setup(bsc->nat, msg, parsed);
+					talloc_free(parsed);
+					parsed = NULL;
 				}
 
 				con_bsc = con->bsc;
@@ -913,7 +922,8 @@
 
 	/* send the non-filtered but maybe modified msg */
 	queue_for_msc(con_msc, msg);
-	talloc_free(parsed);
+	if (parsed)
+		talloc_free(parsed);
 	return 0;
 
 exit:
diff --git a/openbsc/src/nat/bsc_nat_utils.c b/openbsc/src/nat/bsc_nat_utils.c
index 0cef01b..a3fd97a 100644
--- a/openbsc/src/nat/bsc_nat_utils.c
+++ b/openbsc/src/nat/bsc_nat_utils.c
@@ -721,3 +721,10 @@
 	return rc;
 }
 
+/**
+ * Rewrite non global numbers... according to rules based on the IMSI
+ */
+struct msgb *bsc_nat_rewrite_setup(struct bsc_nat *nat, struct msgb *msg, struct bsc_nat_parsed *pa)
+{
+	return msg;
+}