diff options
Diffstat (limited to 'src/gsm/gsup.c')
-rw-r--r-- | src/gsm/gsup.c | 75 |
1 files changed, 74 insertions, 1 deletions
diff --git a/src/gsm/gsup.c b/src/gsm/gsup.c index 18b35806..e4339971 100644 --- a/src/gsm/gsup.c +++ b/src/gsm/gsup.c @@ -67,6 +67,14 @@ const struct value_string osmo_gsup_message_type_names[] = { OSMO_VALUE_STRING(OSMO_GSUP_MSGT_PROC_SS_ERROR), OSMO_VALUE_STRING(OSMO_GSUP_MSGT_PROC_SS_RESULT), + OSMO_VALUE_STRING(OSMO_GSUP_MSGT_MO_FORWARD_SM_REQUEST), + OSMO_VALUE_STRING(OSMO_GSUP_MSGT_MO_FORWARD_SM_ERROR), + OSMO_VALUE_STRING(OSMO_GSUP_MSGT_MO_FORWARD_SM_RESULT), + + OSMO_VALUE_STRING(OSMO_GSUP_MSGT_MT_FORWARD_SM_REQUEST), + OSMO_VALUE_STRING(OSMO_GSUP_MSGT_MT_FORWARD_SM_ERROR), + OSMO_VALUE_STRING(OSMO_GSUP_MSGT_MT_FORWARD_SM_RESULT), + { 0, NULL } }; @@ -434,6 +442,35 @@ int osmo_gsup_decode(const uint8_t *const_data, size_t data_len, gsup_msg->ss_info_len = value_len; break; + case OSMO_GSUP_SM_RP_MR_IE: + gsup_msg->sm_rp_mr = value; + break; + + case OSMO_GSUP_SM_RP_DA_IE: + rc = osmo_gsup_sms_decode_sm_rp_da(gsup_msg, value, value_len); + if (rc) + return rc; + break; + + case OSMO_GSUP_SM_RP_OA_IE: + rc = osmo_gsup_sms_decode_sm_rp_oa(gsup_msg, value, value_len); + if (rc) + return rc; + break; + + case OSMO_GSUP_SM_RP_UI_IE: + gsup_msg->sm_rp_ui = value; + gsup_msg->sm_rp_ui_len = value_len; + break; + + case OSMO_GSUP_SM_RP_MMS_IE: + gsup_msg->sm_rp_mms = value; + break; + + case OSMO_GSUP_SM_RP_CAUSE_IE: + gsup_msg->sm_rp_cause = value; + break; + default: LOGP(DLGSUP, LOGL_NOTICE, "GSUP IE type %d unknown\n", iei); @@ -529,7 +566,7 @@ static void encode_auth_info(struct msgb *msg, enum osmo_gsup_iei iei, int osmo_gsup_encode(struct msgb *msg, const struct osmo_gsup_message *gsup_msg) { uint8_t u8; - int idx; + int idx, rc; uint8_t bcd_buf[GSM48_MI_SIZE] = {0}; size_t bcd_len; @@ -626,6 +663,42 @@ int osmo_gsup_encode(struct msgb *msg, const struct osmo_gsup_message *gsup_msg) gsup_msg->ss_info_len, gsup_msg->ss_info); } + if (gsup_msg->sm_rp_mr) { + msgb_tlv_put(msg, OSMO_GSUP_SM_RP_MR_IE, + sizeof(*gsup_msg->sm_rp_mr), gsup_msg->sm_rp_mr); + } + + if (gsup_msg->sm_rp_da_type) { + rc = osmo_gsup_sms_encode_sm_rp_da(msg, gsup_msg); + if (rc) { + LOGP(DLGSUP, LOGL_ERROR, "Failed to encode SM-RP-DA IE\n"); + return -EINVAL; + } + } + + if (gsup_msg->sm_rp_oa_type) { + rc = osmo_gsup_sms_encode_sm_rp_oa(msg, gsup_msg); + if (rc) { + LOGP(DLGSUP, LOGL_ERROR, "Failed to encode SM-RP-OA IE\n"); + return -EINVAL; + } + } + + if (gsup_msg->sm_rp_ui) { + msgb_tlv_put(msg, OSMO_GSUP_SM_RP_UI_IE, + gsup_msg->sm_rp_ui_len, gsup_msg->sm_rp_ui); + } + + if (gsup_msg->sm_rp_mms) { + msgb_tlv_put(msg, OSMO_GSUP_SM_RP_MMS_IE, + sizeof(*gsup_msg->sm_rp_mms), gsup_msg->sm_rp_mms); + } + + if (gsup_msg->sm_rp_cause) { + msgb_tlv_put(msg, OSMO_GSUP_SM_RP_CAUSE_IE, + sizeof(*gsup_msg->sm_rp_cause), gsup_msg->sm_rp_cause); + } + return 0; } |