nat: Make queue_for_msc use the msc_con parameter, pass in the right msc_con

* Return msg'es to the right MSC Con. Right now it is nat->msc_con.
* When forwarding from BSC to MSC, use the msc_con inside the
  sccp_connections. This means we will only forward data with a
  connection to the BSC.
diff --git a/openbsc/src/nat/bsc_nat.c b/openbsc/src/nat/bsc_nat.c
index ad5fcd1..dc7798b 100644
--- a/openbsc/src/nat/bsc_nat.c
+++ b/openbsc/src/nat/bsc_nat.c
@@ -101,7 +101,7 @@
 
 static void queue_for_msc(struct bsc_msc_connection *con, struct msgb *msg)
 {
-	if (write_queue_enqueue(&nat->msc_con->write_queue, msg) != 0) {
+	if (write_queue_enqueue(&con->write_queue, msg) != 0) {
 		LOGP(DINP, LOGL_ERROR, "Failed to enqueue the write.\n");
 		msgb_free(msg);
 	}
@@ -216,10 +216,11 @@
 
 	ipaccess_prepend_header(msg, IPAC_PROTO_SCCP);
 
-	queue_for_msc(nat->msc_con, msg);
+	queue_for_msc(conn->msc_con, msg);
 }
 
-static void nat_send_rlc(struct sccp_source_reference *src,
+static void nat_send_rlc(struct bsc_msc_connection *msc_con,
+			 struct sccp_source_reference *src,
 			 struct sccp_source_reference *dst)
 {
 	struct sccp_connection_release_complete *rlc;
@@ -239,7 +240,7 @@
 
 	ipaccess_prepend_header(msg, IPAC_PROTO_SCCP);
 
-	queue_for_msc(nat->msc_con, msg);
+	queue_for_msc(msc_con, msg);
 }
 
 static void send_mgcp_reset(struct bsc_connection *bsc)
@@ -265,14 +266,14 @@
 	msc_send_reset(nat->msc_con);
 }
 
-static void send_id_get_response()
+static void send_id_get_response(struct bsc_msc_connection *msc_con)
 {
 	struct msgb *msg = bsc_msc_id_get_resp(nat->token);
 	if (!msg)
 		return;
 
 	ipaccess_prepend_header(msg, IPAC_PROTO_IPACCESS);
-	queue_for_msc(nat->msc_con, msg);
+	queue_for_msc(msc_con, msg);
 }
 
 /*
@@ -376,7 +377,7 @@
 }
 
 
-static int forward_sccp_to_bts(struct msgb *msg)
+static int forward_sccp_to_bts(struct bsc_msc_connection *msc_con, struct msgb *msg)
 {
 	struct sccp_connections *con;
 	struct bsc_connection *bsc;
@@ -438,7 +439,7 @@
 		if (!con && parsed->sccp_type == SCCP_MSG_TYPE_RLSD) {
 			LOGP(DNAT, LOGL_NOTICE, "Sending fake RLC on RLSD message to network.\n");
 			/* Exchange src/dest for the reply */
-			nat_send_rlc(parsed->dest_local_ref, parsed->src_local_ref);
+			nat_send_rlc(msc_con, parsed->dest_local_ref, parsed->src_local_ref);
 		} else if (!con)
 			LOGP(DNAT, LOGL_ERROR, "Unknown connection for msg type: 0x%x from the MSC.\n", parsed->sccp_type);
 	}
@@ -521,7 +522,7 @@
 	msg->l2h = msgb_put(msg, sizeof(reset));
 	memcpy(msg->l2h, reset, msgb_l2len(msg));
 
-	queue_for_msc(nat->msc_con, msg);
+	queue_for_msc(msc_con, msg);
 
 	LOGP(DMSC, LOGL_NOTICE, "Scheduled GSM0808 reset msg for the MSC.\n");
 }
@@ -553,9 +554,9 @@
 		if (msg->l2h[0] == IPAC_MSGT_ID_ACK)
 			initialize_msc_if_needed();
 		else if (msg->l2h[0] == IPAC_MSGT_ID_GET)
-			send_id_get_response();
+			send_id_get_response(nat->msc_con);
 	} else if (hh->proto == IPAC_PROTO_SCCP)
-		forward_sccp_to_bts(msg);
+		forward_sccp_to_bts(nat->msc_con, msg);
 
 	msgb_free(msg);
 	return 0;
@@ -664,8 +665,8 @@
 
 static int forward_sccp_to_msc(struct bsc_connection *bsc, struct msgb *msg)
 {
-	int con_found = 0;
 	int con_filter = 0;
+	struct bsc_msc_connection *con_msc = NULL;
 	struct bsc_connection *con_bsc = NULL;
 	int con_type;
 	struct bsc_nat_parsed *parsed;
@@ -704,8 +705,8 @@
 				goto exit2;
 			con = patch_sccp_src_ref_to_msc(msg, parsed, bsc);
 			con->msc_con = bsc->nat->msc_con;
+			con_msc = con->msc_con;
 			con->con_type = con_type;
-			con_found = 1;
 			con_bsc = con->bsc;
 			break;
 		case SCCP_MSG_TYPE_RLSD:
@@ -715,16 +716,16 @@
 		case SCCP_MSG_TYPE_IT:
 			con = patch_sccp_src_ref_to_msc(msg, parsed, bsc);
 			if (con) {
-				con_found = 1;
 				con_bsc = con->bsc;
+				con_msc = con->msc_con;
 				con_filter = con->con_local;
 			}
 			break;
 		case SCCP_MSG_TYPE_RLC:
 			con = patch_sccp_src_ref_to_msc(msg, parsed, bsc);
 			if (con) {
-				con_found = 1;
 				con_bsc = con->bsc;
+				con_msc = con->msc_con;
 				con_filter = con->con_local;
 			}
 			remove_sccp_src_ref(bsc, msg, parsed);
@@ -747,18 +748,23 @@
 		goto exit2;
 	}
 
-	if (con_found && con_bsc != bsc) {
+	if (con_msc && con_bsc != bsc) {
 		LOGP(DNAT, LOGL_ERROR, "The connection belongs to a different BTS: input: %d con: %d\n",
 		     bsc->cfg->nr, con_bsc->cfg->nr);
 		goto exit2;
 	}
 
+	if (!con_msc) {
+		LOGP(DNAT, LOGL_ERROR, "No connection found, dropping data.\n");
+		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);
+	queue_for_msc(con_msc, msg);
 	talloc_free(parsed);
 	return 0;