mirror of
				https://gitea.osmocom.org/cellular-infrastructure/osmo-msc.git
				synced 2025-11-04 05:53:23 +00:00 
			
		
		
		
	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
This commit is contained in:
		@@ -12,8 +12,8 @@ int gsm411_gsup_mo_ready_for_sm_req(struct gsm_trans *trans, uint8_t sm_rp_mr);
 | 
				
			|||||||
int gsm411_gsup_mo_fwd_sm_req(struct gsm_trans *trans, struct msgb *msg,
 | 
					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);
 | 
						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,
 | 
					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);
 | 
					int gsm411_gsup_rx(struct gsup_client_mux *gcm, void *data, const struct osmo_gsup_message *gsup_msg);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -852,7 +852,19 @@ static int gsm411_rx_rp_ack(struct gsm_trans *trans,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if (trans->net->sms_over_gsup) {
 | 
						if (trans->net->sms_over_gsup) {
 | 
				
			||||||
		/* Forward towards SMSC via 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) {
 | 
						if (!sms) {
 | 
				
			||||||
@@ -893,7 +905,23 @@ static int gsm411_rx_rp_error(struct gsm_trans *trans,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if (trans->net->sms_over_gsup) {
 | 
						if (trans->net->sms_over_gsup) {
 | 
				
			||||||
		/* Forward towards SMSC via 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) {
 | 
						if (!sms) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -184,7 +184,7 @@ msg_error:
 | 
				
			|||||||
	return -EINVAL;
 | 
						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;
 | 
						struct osmo_gsup_message gsup_msg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -202,11 +202,17 @@ int gsm411_gsup_mt_fwd_sm_res(struct gsm_trans *trans, uint8_t sm_rp_mr)
 | 
				
			|||||||
	gsup_msg.destination_name_len = trans->sms.gsup_source_name_len;
 | 
						gsup_msg.destination_name_len = trans->sms.gsup_source_name_len;
 | 
				
			||||||
	gsup_client_mux_tx_set_source(trans->net->gcm, &gsup_msg);
 | 
						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);
 | 
						return gsup_client_mux_tx(trans->net->gcm, &gsup_msg);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int gsm411_gsup_mt_fwd_sm_err(struct gsm_trans *trans,
 | 
					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;
 | 
						struct osmo_gsup_message gsup_msg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -227,7 +233,12 @@ int gsm411_gsup_mt_fwd_sm_err(struct gsm_trans *trans,
 | 
				
			|||||||
	/* SM-RP-Cause value */
 | 
						/* SM-RP-Cause value */
 | 
				
			||||||
	gsup_msg.sm_rp_cause = &cause;
 | 
						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);
 | 
						return gsup_client_mux_tx(trans->net->gcm, &gsup_msg);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user