SMS over GSUP: correctly route GSUP responses to MT SMS
When OsmoMSC is used with OsmoHLR rather than a GSUP-to-MAP gateway,
MT-forwardSM.req GSUP messages delivering MT SMS will be coming from
a separate SMSC relayed via OsmoHLR, rather than from OsmoHLR itself.
When we reply to these messages, in order for these replies to reach
the MT-sending SMSC via OsmoHLR, we need to save source_name from
the request and regurgitate it into destination_name in our response
messages. Implement this logic.
Related: OS#6135
Change-Id: I436e333035b8f6e27f86a49fe293ea48ea07a013
diff --git a/src/libmsc/gsm_04_11.c b/src/libmsc/gsm_04_11.c
index adc9d88..aa87a19 100644
--- a/src/libmsc/gsm_04_11.c
+++ b/src/libmsc/gsm_04_11.c
@@ -1230,7 +1230,8 @@
int gsm411_send_rp_data(struct gsm_network *net, struct vlr_subscr *vsub,
size_t sm_rp_oa_len, const uint8_t *sm_rp_oa,
size_t sm_rp_ud_len, const uint8_t *sm_rp_ud,
- bool sm_rp_mmts_ind)
+ bool sm_rp_mmts_ind, const uint8_t *gsup_source_name,
+ size_t gsup_source_name_len)
{
struct gsm_trans *trans;
struct msgb *msg;
@@ -1245,6 +1246,17 @@
if (trans->msc_a != NULL)
gsm411_handle_mmts_ind(trans);
+ /* Save GSUP source_name for subsequent response messages */
+ if (gsup_source_name && gsup_source_name_len) {
+ trans->sms.gsup_source_name = talloc_memdup(trans, gsup_source_name,
+ gsup_source_name_len);
+ if (!trans->sms.gsup_source_name) {
+ trans_free(trans);
+ return -ENOMEM;
+ }
+ trans->sms.gsup_source_name_len = gsup_source_name_len;
+ }
+
/* Allocate a message buffer for to be encoded SMS */
msg = gsm411_msgb_alloc();
if (!msg) {