[SGsAP] add MM-INFORMATION-REQUEST(Discard by Option2)

This commit is contained in:
Sukchan Lee 2019-07-21 22:52:28 +09:00
parent f19009c736
commit d791f0034d
7 changed files with 71 additions and 2 deletions

View File

@ -479,3 +479,59 @@ void sgsap_handle_release_request(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
ogs_warn("Unknown IMSI[%s]", imsi_bcd);
}
void sgsap_handle_mm_information_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] MM-INFORMATION-REQUEST(DISCARD by OPTION2)");
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;
case SGSAP_IE_MM_INFORMATION_TYPE:
/* TODO */
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

@ -33,6 +33,7 @@ void sgsap_handle_paging_request(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf);
void sgsap_handle_downlink_unitdata(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);
void sgsap_handle_mm_information_request(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf);
#ifdef __cplusplus
}

View File

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

View File

@ -40,6 +40,7 @@ extern "C" {
#define SGSAP_RESET_INDICATION 21
#define SGSAP_RESET_ACK 22
#define SGSAP_MO_CSFB_INDICIATION 24
#define SGSAP_MM_INFORMATION_REQUEST 26
#define SGSAP_RELEASE_REQUEST 27
#define SGSAP_UE_UNREACHABLE 31
@ -64,6 +65,7 @@ extern "C" {
#define SGSAP_IE_IMSI_DETACH_INDICATION_TYPE 17
#define SGSAP_IE_IMSI_DETACH_INDICATION_LEN 1
#define SGSAP_IE_NAS_MESSAGE_CONTAINER_TYPE 22
#define SGSAP_IE_MM_INFORMATION_TYPE 23
#define SGSAP_IE_SERVICE_INDICATOR_TYPE 32
#define SGSAP_IE_SERVICE_INDICATOR_LEN 1
#define SGSAP_IE_TAI_TYPE 35

View File

@ -3464,16 +3464,16 @@ int testsgsap_downlink_unitdata(ogs_pkbuf_t **pkbuf, int i)
int testsgsap_mm_information_request(ogs_pkbuf_t **pkbuf, int i)
{
char *payload[TESTS1AP_MAX_MESSAGE] = {
"",
"1a01087942120000 0000301714430483 d46413450483d464 1347917071028401"
"29",
"",
"",
};
uint16_t len[TESTS1AP_MAX_MESSAGE] = {
0,
33,
0,
0,
};
char hexbuf[MAX_SDU_LEN];

View File

@ -145,6 +145,7 @@ 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);
int testsgsap_downlink_unitdata(ogs_pkbuf_t **pkbuf, int i);
int testsgsap_mm_information_request(ogs_pkbuf_t **pkbuf, int i);
#ifdef __cplusplus
}

View File

@ -208,6 +208,12 @@ static void test1_func(abts_case *tc, void *data)
ABTS_PTR_NOTNULL(tc, recvbuf);
ogs_pkbuf_free(recvbuf);
/* Send SGsAP-MM-INFORMATION-REQUEST */
rv = testsgsap_mm_information_request(&sendbuf, 0);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
rv = testvlr_sgsap_send(sgsap, sendbuf);
ABTS_INT_EQUAL(tc, OGS_OK, rv);
/* Retreive M-TMSI */
enb_ue = enb_ue_find_by_mme_ue_s1ap_id(248);
ogs_assert(enb_ue);