libmsc/gsm_04_11.c: forward MO SMS messages over GSUP

Change-Id: I7d651fde3d608d02f275a74043dc42262aabb1b8
Depends-on: (core) Ic37f3b2114b8095cfce22977e67133b9103942e3
Depends-on: (core) Ibe325c64ae2d6c626b232533bb4cbc65fc2b5d71
Depends-on: (OsmoHLR) I0589ff27933e9bca2bcf93b8259004935778db8f
Related Change-Id: (TTCN) I7abc95b8e416f7308d54e11be11c08586d18e6c5
Related Change-Id: (TTCN) Id14bbd8bd51558cdacefea0fe042769cd69ed5c8
Related: OS#3587
diff --git a/src/libmsc/gsm_04_11.c b/src/libmsc/gsm_04_11.c
index 62f3bba..788a0a9 100644
--- a/src/libmsc/gsm_04_11.c
+++ b/src/libmsc/gsm_04_11.c
@@ -664,10 +664,20 @@
 
 /* Receive a 04.11 TPDU inside RP-DATA / user data */
 static int gsm411_rx_rp_ud(struct msgb *msg, struct gsm_trans *trans,
-			  struct gsm411_rp_hdr *rph)
+			  struct gsm411_rp_hdr *rph,
+			  uint8_t *dst, uint8_t dst_len)
 {
 	int rc = 0;
 
+	if (trans->net->sms_over_gsup) {
+		/* RP-ACK or RP-ERROR is triggered as soon as we get the response */
+		rc = gsm411_gsup_mo_fwd_sm_req(trans, msg, rph->msg_ref, dst, dst_len);
+		if (rc) /* GSUP message sending error */
+			return gsm411_send_rp_error(trans, rph->msg_ref, rc);
+
+		return 0;
+	}
+
 	rc = gsm340_rx_tpdu(trans, msg, rph->msg_ref);
 	if (rc == 0)
 		return gsm411_send_rp_ack(trans, rph->msg_ref);
@@ -715,7 +725,7 @@
 
 	DEBUGP(DLSMS, "DST(%u,%s)\n", dst_len, osmo_hexdump(dst, dst_len));
 
-	return gsm411_rx_rp_ud(msg, trans, rph);
+	return gsm411_rx_rp_ud(msg, trans, rph, dst, dst_len);
 }
 
 static struct gsm_sms *sms_report_alloc(struct gsm_sms *sms)
@@ -852,6 +862,15 @@
 {
 	int rc;
 
+	if (trans->net->sms_over_gsup) {
+		/* RP-ACK or RP-ERROR is triggered as soon as we get the response */
+		rc = gsm411_gsup_mo_ready_for_sm_req(trans, rph->msg_ref);
+		if (rc) /* GSUP message sending error */
+			return gsm411_send_rp_error(trans, rph->msg_ref, rc);
+
+		return 0;
+	}
+
 	rc = gsm411_send_rp_ack(trans, rph->msg_ref);
 
 	/* MS tells us that it has memory for more SMS, we need