[CSFB] Implement SGsAP UE-UNREACHABLE message

This commit is contained in:
Sukchan Lee 2019-07-21 13:08:21 +09:00
parent 9f4204ef8e
commit 5e78b78166
8 changed files with 58 additions and 3 deletions

View File

@ -293,6 +293,13 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
mme_ue->imsi_bcd);
CLEAR_MME_UE_TIMER(mme_ue->t3413);
if (CS_CALL_SERVICE_INDICATOR(mme_ue) ||
SMS_SERVICE_INDICATOR(mme_ue)) {
sgsap_send_ue_unreachable(mme_ue,
SGSAP_SGS_CAUSE_UE_UNREACHABLE);
}
CLEAR_SERVICE_INDICATOR(mme_ue);
} else {
mme_ue->t3413.retry_count++;
/*

View File

@ -442,8 +442,6 @@ struct mme_ue_s {
ogs_assert((__mME)); \
(__mME)->service_indicator = 0; \
} while(0);
#define SGSAP_CS_CALL_SERVICE_INDICATOR 1
#define SGSAP_SMS_SERVICE_INDICATOR 2
#define CS_CALL_SERVICE_INDICATOR(__mME) \
(MME_P_TMSI_IS_AVAILABLE(__mME) && \

View File

@ -198,7 +198,6 @@ void s1ap_state_operational(ogs_fsm_t *s, mme_event_t *e)
ogs_assert(e->enb_ue);
if (e->enb_ue->t_ue_context_release.retry_count >=
mme_timer_cfg(MME_TIMER_UE_CONTEXT_RELEASE)->max_count) {
/* Paging failed */
ogs_warn("[S1AP] UE Context Release failed. Stop Releasing");
CLEAR_ENB_UE_TIMER(e->enb_ue->t_ue_context_release);

View File

@ -307,3 +307,31 @@ ogs_pkbuf_t *sgsap_build_uplink_unidata(
return pkbuf;
}
ogs_pkbuf_t *sgsap_build_ue_unreachable(mme_ue_t *mme_ue, uint8_t sgs_cause)
{
mme_vlr_t *vlr = NULL;
ogs_tlv_t *root = NULL;
ogs_pkbuf_t *pkbuf = NULL;
ogs_assert(mme_ue);
vlr = mme_ue->vlr;
ogs_assert(vlr);
root = ogs_tlv_add(NULL, SGSAP_IE_IMSI_TYPE, SGSAP_IE_IMSI_LEN, 0,
&mme_ue->nas_mobile_identity_imsi);
ogs_tlv_add(root, SGSAP_IE_SGS_CAUSE_TYPE,
SGSAP_IE_SGS_CAUSE_LEN, 0, &sgs_cause);
pkbuf = ogs_pkbuf_alloc(NULL, MAX_SDU_LEN);
ogs_pkbuf_put_u8(pkbuf, SGSAP_UE_UNREACHABLE);
ogs_pkbuf_put(pkbuf, MAX_SDU_LEN-1);
ogs_pkbuf_trim(pkbuf, 1+ogs_tlv_render(root,
pkbuf->data+1, MAX_SDU_LEN-1, OGS_TLV_MODE_T1_L1));
ogs_tlv_free_all(root);
return pkbuf;
}

View File

@ -37,6 +37,7 @@ ogs_pkbuf_t *sgsap_build_service_request(mme_ue_t *mme_ue, uint8_t emm_mode);
ogs_pkbuf_t *sgsap_build_reset_ack(mme_vlr_t *vlr);
ogs_pkbuf_t *sgsap_build_uplink_unidata(
mme_ue_t *mme_ue, nas_message_container_t *nas_message_container);
ogs_pkbuf_t *sgsap_build_ue_unreachable(mme_ue_t *mme_ue, uint8_t sgs_cause);
#ifdef __cplusplus
}

View File

@ -230,3 +230,20 @@ int sgsap_send_uplink_unitdata(
return OGS_OK;
}
int sgsap_send_ue_unreachable(mme_ue_t *mme_ue, uint8_t sgs_cause)
{
int rv;
ogs_pkbuf_t *pkbuf = NULL;
ogs_assert(mme_ue);
ogs_debug("[SGSAP] UE-UNREACHABLE");
ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
ogs_debug(" CAUSE[%d]", sgs_cause);
pkbuf = sgsap_build_ue_unreachable(mme_ue, sgs_cause);
rv = sgsap_send_to_vlr(mme_ue, pkbuf);
ogs_assert(rv == OGS_OK);
return OGS_OK;
}

View File

@ -50,6 +50,7 @@ int sgsap_send_service_request(mme_ue_t *mme_ue, uint8_t emm_mode);
int sgsap_send_reset_ack(mme_vlr_t *vlr);
int sgsap_send_uplink_unitdata(
mme_ue_t *mme_ue, nas_message_container_t *nas_message_container);
int sgsap_send_ue_unreachable(mme_ue_t *mme_ue, uint8_t sgs_cause);
#ifdef __cplusplus
}

View File

@ -41,6 +41,7 @@ extern "C" {
#define SGSAP_RESET_ACK 22
#define SGSAP_MO_CSFB_INDICIATION 24
#define SGSAP_RELEASE_REQUEST 27
#define SGSAP_UE_UNREACHABLE 31
#define SGSAP_IE_IMSI_TYPE 1
#define SGSAP_IE_IMSI_LEN MAX_IMSI_LEN
@ -75,6 +76,9 @@ extern "C" {
#define SGSAP_EPS_UPDATE_IMSI_ATTACH 1
#define SGSAP_EPS_UPDATE_NORMAL 2
#define SGSAP_CS_CALL_SERVICE_INDICATOR 1
#define SGSAP_SMS_SERVICE_INDICATOR 2
#define SGSAP_EPS_DETACH_NETWORK_INITIATED 1
#define SGSAP_EPS_DETACH_UE_INITIATED 2
#define SGSAP_EPS_DETACH_EPS_SERVICE_NOT_ALLOWED 3