pespin has submitted this change. ( 
https://gerrit.osmocom.org/c/osmo-msc/+/39428?usp=email )

Change subject: Include SM-RP-UI in outgoing GSUP message when presesnt
......................................................................

Include SM-RP-UI in outgoing GSUP message when presesnt

An SMS deliver report may be returned from the UE for any MT SMS.  A
common use is for remote communication with the SIM (UICC) whereby a
command requires Proof of Receipt in an SMS deliver report (see 3GPP
31.115)

SMS-DELIVER-REPORT TPDU is defined in 3GPP 23.040 s9.2.2.1a and
carried as a RP-User-Data element within an RP-ERROR or RP-ACK PDU

In 3GPP 24.011, the definition of RP-ACK (s7.3.3) and RP-ERROR
(s7.3.4) shows RP-User-Data encoded as an optional TLV.

In MAP (3GPP 29.002) the MSC transfers the user data in either
SM-RP-UI parameter (s7.6.8.4) or SM-DeliveryFailureCause
diagnosticInfo (s7.6.1h)

With GSUP the osmo_gsup_message struct member sm_rp_ui is used to
carry the user data in both cases.

Change-Id: I90a607900ac7c86b200c79b7e8c460d4cbb3c3ce
---
M include/osmocom/msc/gsm_04_11_gsup.h
M src/libmsc/gsm_04_11.c
M src/libmsc/gsm_04_11_gsup.c
3 files changed, 46 insertions(+), 7 deletions(-)

Approvals:
  pespin: Looks good to me, approved
  fixeria: Looks good to me, but someone else must approve
  Jenkins Builder: Verified




diff --git a/include/osmocom/msc/gsm_04_11_gsup.h 
b/include/osmocom/msc/gsm_04_11_gsup.h
index 4034f5e..9c8c7cf 100644
--- a/include/osmocom/msc/gsm_04_11_gsup.h
+++ b/include/osmocom/msc/gsm_04_11_gsup.h
@@ -12,8 +12,8 @@
 int gsm411_gsup_mo_fwd_sm_req(struct gsm_trans *trans, struct msgb *msg,
        uint8_t sm_rp_mr, uint8_t *sm_rp_da, uint8_t sm_rp_da_len);

-int gsm411_gsup_mt_fwd_sm_res(struct gsm_trans *trans, uint8_t sm_rp_mr);
+int gsm411_gsup_mt_fwd_sm_res(struct gsm_trans *trans, uint8_t sm_rp_mr, const 
uint8_t *ui_buf, uint8_t ui_len);
 int gsm411_gsup_mt_fwd_sm_err(struct gsm_trans *trans,
-       uint8_t sm_rp_mr, uint8_t cause);
+       uint8_t sm_rp_mr, uint8_t cause, const uint8_t *ui_buf, uint8_t ui_len);

 int gsm411_gsup_rx(struct gsup_client_mux *gcm, void *data, const struct 
osmo_gsup_message *gsup_msg);
diff --git a/src/libmsc/gsm_04_11.c b/src/libmsc/gsm_04_11.c
index 6536d0b..b6d5f4a 100644
--- a/src/libmsc/gsm_04_11.c
+++ b/src/libmsc/gsm_04_11.c
@@ -852,7 +852,19 @@

        if (trans->net->sms_over_gsup) {
                /* Forward towards SMSC via GSUP */
-               return gsm411_gsup_mt_fwd_sm_res(trans, rph->msg_ref);
+               uint8_t ui_len = 0;
+               uint8_t *ui_buf = NULL;
+               /* check for:
+                * - sufficient size for tag, length and data
+                * - RP-User-Data tag
+                * - user data length is valid */
+               if (rph->len > 2 &&
+                   rph->data[0] == GSM411_IE_RP_USER_DATA &&
+                   rph->data[1] <= (rph->len - 2)) {
+                       ui_len = rph->data[1];
+                       ui_buf = &(rph->data[2]);
+               }
+               return gsm411_gsup_mt_fwd_sm_res(trans, rph->msg_ref, ui_buf, 
ui_len);
        }

        if (!sms) {
@@ -893,7 +905,23 @@

        if (trans->net->sms_over_gsup) {
                /* Forward towards SMSC via GSUP */
-               return gsm411_gsup_mt_fwd_sm_err(trans, rph->msg_ref, cause);
+               uint8_t ui_len = 0;
+               uint8_t *ui_buf = NULL;
+               uint8_t ui_tag_idx = cause_len + 1;
+               uint8_t ui_len_idx = ui_tag_idx + 1;
+               uint8_t ui_buf_idx = ui_len_idx + 1;
+               /* check for:
+                * - sufficient size for tag, length and data
+                * - RP-User-Data tag
+                * - user data length is valid */
+               if (rph->len > ui_buf_idx &&
+                   rph->data[ui_tag_idx] == GSM411_IE_RP_USER_DATA &&
+                   rph->data[ui_len_idx] <= (rph->len - ui_buf_idx)) {
+                       ui_len = rph->data[ui_len_idx];
+                       ui_buf = &(rph->data[ui_buf_idx]);
+               }
+
+               return gsm411_gsup_mt_fwd_sm_err(trans, rph->msg_ref, cause, 
ui_buf, ui_len);
        }

        if (!sms) {
diff --git a/src/libmsc/gsm_04_11_gsup.c b/src/libmsc/gsm_04_11_gsup.c
index 96fdbc6..4dcc302 100644
--- a/src/libmsc/gsm_04_11_gsup.c
+++ b/src/libmsc/gsm_04_11_gsup.c
@@ -184,7 +184,7 @@
        return -EINVAL;
 }

-int gsm411_gsup_mt_fwd_sm_res(struct gsm_trans *trans, uint8_t sm_rp_mr)
+int gsm411_gsup_mt_fwd_sm_res(struct gsm_trans *trans, uint8_t sm_rp_mr, const 
uint8_t *ui_buf, uint8_t ui_len)
 {
        struct osmo_gsup_message gsup_msg;

@@ -202,11 +202,17 @@
        gsup_msg.destination_name_len = trans->sms.gsup_source_name_len;
        gsup_client_mux_tx_set_source(trans->net->gcm, &gsup_msg);

+       /* include optional SM-RP-UI field if present */
+       if (ui_len) {
+               gsup_msg.sm_rp_ui_len = ui_len;
+               gsup_msg.sm_rp_ui = ui_buf;
+       }
+
        return gsup_client_mux_tx(trans->net->gcm, &gsup_msg);
 }

 int gsm411_gsup_mt_fwd_sm_err(struct gsm_trans *trans,
-       uint8_t sm_rp_mr, uint8_t cause)
+       uint8_t sm_rp_mr, uint8_t cause, const uint8_t *ui_buf, uint8_t ui_len)
 {
        struct osmo_gsup_message gsup_msg;

@@ -227,7 +233,12 @@
        /* SM-RP-Cause value */
        gsup_msg.sm_rp_cause = &cause;

-       /* TODO: include optional SM-RP-UI field if present */
+       /* include optional SM-RP-UI field if present */
+       if (ui_len) {
+               gsup_msg.sm_rp_ui_len = ui_len;
+               gsup_msg.sm_rp_ui = ui_buf;
+       }
+
        return gsup_client_mux_tx(trans->net->gcm, &gsup_msg);
 }


--
To view, visit https://gerrit.osmocom.org/c/osmo-msc/+/39428?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings?usp=email

Gerrit-MessageType: merged
Gerrit-Project: osmo-msc
Gerrit-Branch: master
Gerrit-Change-Id: I90a607900ac7c86b200c79b7e8c460d4cbb3c3ce
Gerrit-Change-Number: 39428
Gerrit-PatchSet: 5
Gerrit-Owner: dotsimon <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <[email protected]>
Gerrit-Reviewer: lynxis lazus <[email protected]>
Gerrit-Reviewer: pespin <[email protected]>

Reply via email to