SMS over GSUP: set source_name in GSUP reply messages

For MO-forwardSM and MT-forwardSM request messages, OsmoHLR applies
routing based on the SMSC address for MO or based on the IMSI for MT.
However, reply messages following these requests are routed passively
based on the destination_name IE.  This passive message routing path
requires the source_name IE to be set as well - implement this
source_name setting.

Related: OS#6135
Change-Id: I0b7f4760bdce8a38d43d3860086c6dfb7b390701
diff --git a/include/osmocom/msc/gsup_client_mux.h b/include/osmocom/msc/gsup_client_mux.h
index 07f17c2..501b81d 100644
--- a/include/osmocom/msc/gsup_client_mux.h
+++ b/include/osmocom/msc/gsup_client_mux.h
@@ -28,6 +28,7 @@
 			  struct ipaccess_unit *ipa_dev);
 
 int gsup_client_mux_tx(struct gsup_client_mux *gcm, const struct osmo_gsup_message *gsup_msg);
+void gsup_client_mux_tx_set_source(const struct gsup_client_mux *gcm, struct osmo_gsup_message *gsup_msg);
 void gsup_client_mux_tx_error_reply(struct gsup_client_mux *gcm, const struct osmo_gsup_message *gsup_orig,
 				    enum gsm48_gmm_cause cause);
 
diff --git a/src/libmsc/gsm_04_11_gsup.c b/src/libmsc/gsm_04_11_gsup.c
index 6225c6c..d1c2f27 100644
--- a/src/libmsc/gsm_04_11_gsup.c
+++ b/src/libmsc/gsm_04_11_gsup.c
@@ -201,6 +201,7 @@
 	/* Ensure routing through OsmoHLR to the MT-sending SMSC */
 	gsup_msg.destination_name = trans->sms.gsup_source_name;
 	gsup_msg.destination_name_len = trans->sms.gsup_source_name_len;
+	gsup_client_mux_tx_set_source(trans->net->gcm, &gsup_msg);
 
 	return gsup_client_mux_tx(trans->net->gcm, &gsup_msg);
 }
@@ -222,6 +223,7 @@
 	/* Ensure routing through OsmoHLR to the MT-sending SMSC */
 	gsup_msg.destination_name = trans->sms.gsup_source_name;
 	gsup_msg.destination_name_len = trans->sms.gsup_source_name_len;
+	gsup_client_mux_tx_set_source(trans->net->gcm, &gsup_msg);
 
 	/* SM-RP-Cause value */
 	gsup_msg.sm_rp_cause = &cause;
diff --git a/src/libmsc/gsup_client_mux.c b/src/libmsc/gsup_client_mux.c
index 9a0dc16..1a3611f 100644
--- a/src/libmsc/gsup_client_mux.c
+++ b/src/libmsc/gsup_client_mux.c
@@ -136,6 +136,25 @@
 	return osmo_gsup_client_send(gcm->gsup_client, msg);
 }
 
+/* Set GSUP source_name to our local IPA name */
+void gsup_client_mux_tx_set_source(const struct gsup_client_mux *gcm,
+				   struct osmo_gsup_message *gsup_msg)
+{
+	const char *local_msc_name;
+
+	if (!gcm)
+		return;
+	if (!gcm->gsup_client)
+		return;
+	if (!gcm->gsup_client->ipa_dev)
+		return;
+	local_msc_name = gcm->gsup_client->ipa_dev->serno;
+	if (!local_msc_name)
+		return;
+	gsup_msg->source_name = (const uint8_t *) local_msc_name;
+	gsup_msg->source_name_len = strlen(local_msc_name) + 1;
+}
+
 /* Transmit GSUP error in response to original message */
 void gsup_client_mux_tx_error_reply(struct gsup_client_mux *gcm, const struct osmo_gsup_message *gsup_orig,
 				    enum gsm48_gmm_cause cause)
@@ -158,6 +177,7 @@
 	};
 
 	OSMO_STRLCPY_ARRAY(gsup_reply.imsi, gsup_orig->imsi);
+	gsup_client_mux_tx_set_source(gcm, &gsup_reply);
 
 	/* For SS/USSD, it's important to keep both session state and ID IEs */
 	if (gsup_orig->session_state != OSMO_GSUP_SESSION_STATE_NONE) {