[SMS] MO-SMS Done

This commit is contained in:
Sukchan Lee 2019-07-13 14:51:35 +09:00
parent 663861d17b
commit 8e37f64c33
9 changed files with 108 additions and 8 deletions

View File

@ -244,7 +244,18 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
sgsap_send_uplink_unitdata(mme_ue,
&message->emm.uplink_nas_transport.nas_message_container);
} else {
S1AP_MME_UE_S1AP_ID_t MME_UE_S1AP_ID;
S1AP_ENB_UE_S1AP_ID_t ENB_UE_S1AP_ID;
ogs_warn("No connection of MSC/VLR");
MME_UE_S1AP_ID = enb_ue->mme_ue_s1ap_id;
ENB_UE_S1AP_ID = enb_ue->enb_ue_s1ap_id;
rv = s1ap_send_error_indication(enb_ue->enb,
&MME_UE_S1AP_ID, &ENB_UE_S1AP_ID,
S1AP_Cause_PR_transport,
S1AP_CauseTransport_transport_resource_unavailable);
ogs_assert(rv == OGS_OK);
}
return;

View File

@ -33,6 +33,8 @@ void sgsap_handle_location_update_accept(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
mme_ue_t *mme_ue = NULL;
enb_ue_t *enb_ue = NULL;
char imsi_bcd[MAX_IMSI_BCD_LEN+1];
nas_mobile_identity_imsi_t *nas_mobile_identity_imsi = NULL;
int nas_mobile_identity_imsi_len = 0;
nas_lai_t *lai = NULL;
@ -74,8 +76,6 @@ void sgsap_handle_location_update_accept(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
ogs_assert(nas_mobile_identity_imsi_len == SGSAP_IE_IMSI_LEN);
if (nas_mobile_identity_imsi->type == NAS_MOBILE_IDENTITY_IMSI) {
char imsi_bcd[MAX_IMSI_BCD_LEN+1];
nas_imsi_to_bcd(nas_mobile_identity_imsi,
nas_mobile_identity_imsi_len, imsi_bcd);
mme_ue = mme_ue_find_by_imsi_bcd(imsi_bcd);
@ -121,6 +121,8 @@ void sgsap_handle_location_update_reject(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
mme_ue_t *mme_ue = NULL;
enb_ue_t *enb_ue = NULL;
char imsi_bcd[MAX_IMSI_BCD_LEN+1];
nas_mobile_identity_imsi_t *nas_mobile_identity_imsi = NULL;
int nas_mobile_identity_imsi_len = 0;
nas_emm_cause_t emm_cause = 0;
@ -162,8 +164,6 @@ void sgsap_handle_location_update_reject(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
ogs_assert(nas_mobile_identity_imsi_len == SGSAP_IE_IMSI_LEN);
if (nas_mobile_identity_imsi->type == NAS_MOBILE_IDENTITY_IMSI) {
char imsi_bcd[MAX_IMSI_BCD_LEN+1];
nas_imsi_to_bcd(nas_mobile_identity_imsi,
nas_mobile_identity_imsi_len, imsi_bcd);
mme_ue = mme_ue_find_by_imsi_bcd(imsi_bcd);
@ -191,6 +191,8 @@ void sgsap_handle_detach_ack(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
ogs_tlv_t *root = NULL, *iter = NULL;
mme_ue_t *mme_ue = NULL;
char imsi_bcd[MAX_IMSI_BCD_LEN+1];
uint8_t type = 0;
nas_mobile_identity_imsi_t *nas_mobile_identity_imsi = NULL;
int nas_mobile_identity_imsi_len = 0;
@ -231,8 +233,6 @@ void sgsap_handle_detach_ack(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
ogs_assert(nas_mobile_identity_imsi_len == SGSAP_IE_IMSI_LEN);
if (nas_mobile_identity_imsi->type == NAS_MOBILE_IDENTITY_IMSI) {
char imsi_bcd[MAX_IMSI_BCD_LEN+1];
nas_imsi_to_bcd(nas_mobile_identity_imsi,
nas_mobile_identity_imsi_len, imsi_bcd);
mme_ue = mme_ue_find_by_imsi_bcd(imsi_bcd);
@ -251,12 +251,13 @@ void sgsap_handle_paging_request(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
ogs_tlv_t *root = NULL, *iter = NULL;
mme_ue_t *mme_ue = NULL;
char imsi_bcd[MAX_IMSI_BCD_LEN+1];
nas_mobile_identity_imsi_t *nas_mobile_identity_imsi = NULL;
int nas_mobile_identity_imsi_len = 0;
nas_lai_t *lai = NULL;
char vlr_name[SGSAP_IE_VLR_NAME_LEN] = { 0, };
uint8_t service_indicator = 0;
char imsi_bcd[MAX_IMSI_BCD_LEN+1];
ogs_assert(vlr);
ogs_assert(pkbuf);
@ -343,3 +344,57 @@ void sgsap_handle_reset_indication(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
sgsap_send_reset_ack(vlr);
}
void sgsap_handle_release_request(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
{
ogs_tlv_t *root = NULL, *iter = NULL;
mme_ue_t *mme_ue = NULL;
char imsi_bcd[MAX_IMSI_BCD_LEN+1];
nas_mobile_identity_imsi_t *nas_mobile_identity_imsi = NULL;
int nas_mobile_identity_imsi_len = 0;
ogs_assert(vlr);
ogs_assert(pkbuf);
ogs_debug("[SGSAP] RELEASE-REQUEST");
ogs_pkbuf_pull(pkbuf, 1);
root = ogs_tlv_parse_block(pkbuf->len, pkbuf->data, OGS_TLV_MODE_T1_L1);
ogs_assert(root);
iter = root;
while (iter) {
switch (iter->type) {
case SGSAP_IE_IMSI_TYPE:
nas_mobile_identity_imsi = iter->value;
nas_mobile_identity_imsi_len = iter->length;
break;
default:
ogs_warn("Invalid Type [%d]", iter->type);
break;
}
iter = iter->next;
}
ogs_tlv_free_all(root);
ogs_assert(nas_mobile_identity_imsi);
ogs_assert(nas_mobile_identity_imsi_len == SGSAP_IE_IMSI_LEN);
if (nas_mobile_identity_imsi->type == NAS_MOBILE_IDENTITY_IMSI) {
nas_imsi_to_bcd(nas_mobile_identity_imsi,
nas_mobile_identity_imsi_len, imsi_bcd);
mme_ue = mme_ue_find_by_imsi_bcd(imsi_bcd);
} else
ogs_assert_if_reached();
if (mme_ue)
ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
else
ogs_warn("Unknown IMSI[%s]", imsi_bcd);
}

View File

@ -31,6 +31,7 @@ void sgsap_handle_location_update_reject(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf);
void sgsap_handle_detach_ack(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf);
void sgsap_handle_paging_request(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf);
void sgsap_handle_reset_indication(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf);
void sgsap_handle_release_request(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf);
#ifdef __cplusplus
}

View File

@ -136,6 +136,9 @@ void sgsap_state_connected(ogs_fsm_t *s, mme_event_t *e)
mme_vlr_free_node(vlr);
OGS_FSM_TRAN(s, sgsap_state_will_connect);
break;
case SGSAP_RELEASE_REQUEST:
sgsap_handle_release_request(vlr, pkbuf);
break;
default:
ogs_warn("Unknown Message Type: [%d]", type);
break;

View File

@ -40,7 +40,7 @@ extern "C" {
#define SGSAP_RESET_INDICATION 21
#define SGSAP_RESET_ACK 22
#define SGSAP_MO_CSFB_INDICIATION 24
#define SGSAP_REELASE_REQUEST 27
#define SGSAP_RELEASE_REQUEST 27
#define SGSAP_IE_IMSI_TYPE 1
#define SGSAP_IE_IMSI_LEN MAX_IMSI_LEN

View File

@ -3347,3 +3347,25 @@ int testsgsap_reset_indication(ogs_pkbuf_t **pkbuf, int i)
return OGS_OK;
}
int testsgsap_release_request(ogs_pkbuf_t **pkbuf, int i)
{
char *payload[TESTS1AP_MAX_MESSAGE] = {
"1b01082926240000 111893",
"",
"",
};
uint16_t len[TESTS1AP_MAX_MESSAGE] = {
11,
0,
0,
};
char hexbuf[MAX_SDU_LEN];
*pkbuf = ogs_pkbuf_alloc(NULL, MAX_SDU_LEN);
ogs_pkbuf_put_data(*pkbuf,
OGS_HEX(payload[i], strlen(payload[i]), hexbuf), len[i]);
return OGS_OK;
}

View File

@ -143,6 +143,7 @@ int testsgsap_location_update_reject(ogs_pkbuf_t **pkbuf, int i);
int testsgsap_imsi_detach_ack(ogs_pkbuf_t **pkbuf, int i);
int testsgsap_paging_request(ogs_pkbuf_t **pkbuf, int i);
int testsgsap_reset_indication(ogs_pkbuf_t **pkbuf, int i);
int testsgsap_release_request(ogs_pkbuf_t **pkbuf, int i);
#ifdef __cplusplus
}

View File

@ -212,6 +212,12 @@ static void test1_func(abts_case *tc, void *data)
ABTS_PTR_NOTNULL(tc, recvbuf);
ogs_pkbuf_free(recvbuf);
/* Send SGsAP-RELEASE-REQUEST */
rv = testsgsap_release_request(&sendbuf, 0);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
rv = testvlr_sgsap_send(sgsap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Send UE Context Release Request */
rv = tests1ap_build_ue_context_release_request(&sendbuf, msgindex);
ABTS_INT_EQUAL(tc, OGS_OK, rv);

View File

@ -58,6 +58,7 @@ mo-idle-test : SUCCESS
mt-idle-test : SUCCESS
mo-active-test : SUCCESS
mt-active-test : SUCCESS
mo-sms-test : SUCCESS
All tests passed.
])
AT_CLEANUP