dotsimon has uploaded this change for review. ( 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
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, 26 insertions(+), 7 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-msc refs/changes/28/39428/1
diff --git a/include/osmocom/msc/gsm_04_11_gsup.h b/include/osmocom/msc/gsm_04_11_gsup.h index 4034f5e..e9f1a34 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, uint8_t *ui); 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, uint8_t *ui);
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..cc91988 100644 --- a/src/libmsc/gsm_04_11.c +++ b/src/libmsc/gsm_04_11.c @@ -852,7 +852,10 @@
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 = NULL; + if (rph->len > 2 && rph->data[0] == GSM411_IE_RP_USER_DATA) + ui = &(rph->data[1]); + return gsm411_gsup_mt_fwd_sm_res(trans, rph->msg_ref, ui); }
if (!sms) { @@ -893,7 +896,12 @@
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 = NULL; + uint8_t ui_iei_pos = cause_len + 1; + + if (rph->len > (ui_iei_pos + 2) && rph->data[ui_iei_pos] == GSM411_IE_RP_USER_DATA) + ui = &(rph->data[ui_iei_pos + 1]); + return gsm411_gsup_mt_fwd_sm_err(trans, rph->msg_ref, cause, ui); }
if (!sms) { diff --git a/src/libmsc/gsm_04_11_gsup.c b/src/libmsc/gsm_04_11_gsup.c index 96fdbc6..877172c 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, uint8_t *ui) { 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) { + gsup_msg.sm_rp_ui_len = ui[0]; + gsup_msg.sm_rp_ui = &(ui[1]); + } + 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, uint8_t *ui) { 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) { + gsup_msg.sm_rp_ui_len = ui[0]; + gsup_msg.sm_rp_ui = &(ui[1]); + } + return gsup_client_mux_tx(trans->net->gcm, &gsup_msg); }