diff --git a/lib/core/ogs-conv.c b/lib/core/ogs-conv.c index cbbdf706f..3cef05a8a 100644 --- a/lib/core/ogs-conv.c +++ b/lib/core/ogs-conv.c @@ -108,6 +108,27 @@ void *ogs_bcd_to_buffer(const char *in, void *out, int *out_len) return out; } +void *ogs_bcd_to_buffer_reverse_order(const char *in, void *out, int *out_len) +{ + int i = 0; + uint8_t *out_p = out; + int in_len = strlen(in); + + for (i = 0; i < in_len; i++) { + if (i & 0x01) + out_p[i>>1] = out_p[i>>1] | ((in[i] - 0x30) & 0x0F); + else + out_p[i>>1] = ((in[i] - 0x30) << 4) & 0xF0; + } + + *out_len = (in_len + 1) / 2; + if (in_len & 0x01) { + out_p[(*out_len)-1] |= 0xF0; + } + + return out; +} + void *ogs_buffer_to_bcd(uint8_t *in, int in_len, void *out) { int i = 0; diff --git a/lib/core/ogs-conv.h b/lib/core/ogs-conv.h index 5e5396425..324da27ee 100644 --- a/lib/core/ogs-conv.h +++ b/lib/core/ogs-conv.h @@ -34,6 +34,7 @@ void *ogs_hex_to_ascii(void *in, int in_len, void *out, int out_len); void *ogs_uint64_to_buffer(uint64_t num, int size, void *buffer); uint64_t ogs_buffer_to_uint64(void *buffer, int size); void *ogs_bcd_to_buffer(const char *in, void *out, int *out_len); +void *ogs_bcd_to_buffer_reverse_order(const char *in, void *out, int *out_len); void *ogs_buffer_to_bcd(uint8_t *in, int in_len, void *out); char ogs_from_hex(char ch); diff --git a/lib/core/ogs-timer.c b/lib/core/ogs-timer.c index 71737a1e1..34d4938ed 100644 --- a/lib/core/ogs-timer.c +++ b/lib/core/ogs-timer.c @@ -27,18 +27,6 @@ typedef struct ogs_timer_mgr_s { ogs_rbtree_t tree; } ogs_timer_mgr_t; -typedef struct ogs_timer_s { - ogs_rbnode_t rbnode; - ogs_lnode_t lnode; - - void (*cb)(void*); - void *data; - - ogs_timer_mgr_t *manager; - bool running; - ogs_time_t timeout;; -} ogs_timer_t; - static void add_timer_node( ogs_rbtree_t *tree, ogs_timer_t *timer, ogs_time_t duration) { diff --git a/lib/core/ogs-timer.h b/lib/core/ogs-timer.h index 5c990e92f..7c8abd6c0 100644 --- a/lib/core/ogs-timer.h +++ b/lib/core/ogs-timer.h @@ -29,7 +29,17 @@ extern "C" { #endif typedef struct ogs_timer_mgr_s ogs_timer_mgr_t; -typedef struct ogs_timer_s ogs_timer_t;; +typedef struct ogs_timer_s { + ogs_rbnode_t rbnode; + ogs_lnode_t lnode; + + void (*cb)(void*); + void *data; + + ogs_timer_mgr_t *manager; + bool running; + ogs_time_t timeout; +} ogs_timer_t; ogs_timer_mgr_t *ogs_timer_mgr_create(void); void ogs_timer_mgr_destroy(ogs_timer_mgr_t *manager); diff --git a/lib/nas/5gs/types.c b/lib/nas/5gs/types.c index b41f9e054..e62d5fe3c 100644 --- a/lib/nas/5gs/types.c +++ b/lib/nas/5gs/types.c @@ -151,7 +151,7 @@ int ogs_nas_parse_nssai(ogs_s_nssai_t *s_nssai, ogs_nas_nssai_t *nas_nssai) ogs_assert(nas_nssai); ogs_assert(s_nssai); - if (!nas_nssai->buffer || !nas_nssai->length) { + if (!nas_nssai->length) { ogs_error("No NSSAI [%p:%d]", nas_nssai->buffer, nas_nssai->length); return OGS_ERROR; } diff --git a/lib/nas/common/conv.c b/lib/nas/common/conv.c index e2ab3ccec..823df0081 100644 --- a/lib/nas/common/conv.c +++ b/lib/nas/common/conv.c @@ -53,3 +53,22 @@ void ogs_nas_imeisv_to_bcd( bcd[bcd_len] = 0; } + +void *ogs_nas_imeisv_bcd_to_buffer(const char *in, uint8_t *out, int *out_len) +{ + + /* + * TS38.413 + * 9.3.1.54 Masked IMEISV + * + * The first to fourth bits correspond to the first digit of the IMEISV, + * the fifth to eighth bits correspond to the second digit of the IMEISV, + * and so on + * + * IMEISV buffer uses different ordering. + * So, I'll other function instead of ogs_bcd_to_buffer(); + * + */ + + return ogs_bcd_to_buffer_reverse_order(in, out, out_len); +} diff --git a/lib/nas/common/conv.h b/lib/nas/common/conv.h index 195f5fee2..a6c3ea68e 100644 --- a/lib/nas/common/conv.h +++ b/lib/nas/common/conv.h @@ -32,6 +32,7 @@ extern "C" { void ogs_nas_imeisv_to_bcd( ogs_nas_mobile_identity_imeisv_t *imeisv, uint8_t imeisv_len, char *bcd); +void *ogs_nas_imeisv_bcd_to_buffer(const char *in, uint8_t *out, int *out_len); #ifdef __cplusplus } diff --git a/lib/ngap/message.c b/lib/ngap/message.c index 077fa276a..cd223bc89 100644 --- a/lib/ngap/message.c +++ b/lib/ngap/message.c @@ -31,8 +31,6 @@ ogs_pkbuf_t *nga_ngap_encode(ogs_ngap_message_t *message) asn_fprint(stdout, &asn_DEF_NGAP_NGAP_PDU, message); pkbuf = ogs_asn_encode(&asn_DEF_NGAP_NGAP_PDU, message); - ogs_asn_free(&asn_DEF_NGAP_NGAP_PDU, message); - if (pkbuf == NULL) { ogs_error("Failed to encode NGAP-PDU"); return NULL; diff --git a/lib/s1ap/message.c b/lib/s1ap/message.c index 9feca6c48..8d08bb8dd 100644 --- a/lib/s1ap/message.c +++ b/lib/s1ap/message.c @@ -31,8 +31,6 @@ ogs_pkbuf_t *ogs_s1ap_encode(ogs_s1ap_message_t *message) asn_fprint(stdout, &asn_DEF_S1AP_S1AP_PDU, message); pkbuf = ogs_asn_encode(&asn_DEF_S1AP_S1AP_PDU, message); - ogs_asn_free(&asn_DEF_S1AP_S1AP_PDU, message); - if (pkbuf == NULL) { ogs_error("Failed to encode S1AP-PDU"); return NULL; diff --git a/lib/sbi/client.c b/lib/sbi/client.c index a2bf4bde0..ce00c1789 100644 --- a/lib/sbi/client.c +++ b/lib/sbi/client.c @@ -133,6 +133,7 @@ void ogs_sbi_client_remove(ogs_sbi_client_t *client) ogs_assert(client->t_curl); ogs_timer_delete(client->t_curl); + client->t_curl = NULL; ogs_assert(client->multi); curl_multi_cleanup(client->multi); @@ -581,8 +582,8 @@ static void event_cb(short when, ogs_socket_t fd, void *data) ogs_timer_t *timer; timer = client->t_curl; - ogs_assert(timer); - ogs_timer_stop(timer); + if (timer) + ogs_timer_stop(timer); } } diff --git a/lib/sbi/context.c b/lib/sbi/context.c index 59f157c2b..3de7926d5 100644 --- a/lib/sbi/context.c +++ b/lib/sbi/context.c @@ -442,6 +442,19 @@ ogs_sbi_nf_instance_t *ogs_sbi_nf_instance_add(char *id) nf_instance->time.heartbeat = ogs_config()->time.nf_instance.heartbeat; + nf_instance->t_registration_interval = ogs_timer_add( + ogs_sbi_self()->timer_mgr, NULL, nf_instance); + ogs_assert(nf_instance->t_registration_interval); + nf_instance->t_heartbeat_interval = ogs_timer_add( + ogs_sbi_self()->timer_mgr, NULL, nf_instance); + ogs_assert(nf_instance->t_heartbeat_interval); + nf_instance->t_heartbeat = ogs_timer_add( + ogs_sbi_self()->timer_mgr, NULL, nf_instance); + ogs_assert(nf_instance->t_heartbeat); + nf_instance->t_validity = ogs_timer_add( + ogs_sbi_self()->timer_mgr, NULL, nf_instance); + ogs_assert(nf_instance->t_validity); + ogs_list_add(&ogs_sbi_self()->nf_instance_list, nf_instance); return nf_instance; @@ -482,6 +495,11 @@ void ogs_sbi_nf_instance_remove(ogs_sbi_nf_instance_t *nf_instance) ogs_sbi_nf_instance_clear(nf_instance); + ogs_timer_delete(nf_instance->t_registration_interval); + ogs_timer_delete(nf_instance->t_heartbeat_interval); + ogs_timer_delete(nf_instance->t_heartbeat); + ogs_timer_delete(nf_instance->t_validity); + if (nf_instance->client) ogs_sbi_client_remove(nf_instance->client); diff --git a/src/amf/context.h b/src/amf/context.h index 1932ad2cc..890a62492 100644 --- a/src/amf/context.h +++ b/src/amf/context.h @@ -252,8 +252,8 @@ struct amf_ue_s { ogs_nas_5gs_mobile_identity_suci_t nas_mobile_identity_suci; char *pei; - uint8_t imeisv[OGS_MAX_IMEISV_LEN]; - int imeisv_len; + uint8_t masked_imeisv[OGS_MAX_IMEISV_LEN]; + int masked_imeisv_len; char imeisv_bcd[OGS_MAX_IMEISV_BCD_LEN+1]; ogs_nas_mobile_identity_imeisv_t nas_mobile_identity_imeisv; diff --git a/src/amf/gmm-handler.c b/src/amf/gmm-handler.c index 2ae38afa0..eb1e7dd86 100644 --- a/src/amf/gmm-handler.c +++ b/src/amf/gmm-handler.c @@ -717,8 +717,10 @@ int gmm_handle_security_mode_complete(amf_ue_t *amf_ue, mobile_identity_imeisv, imeisv->length); ogs_nas_imeisv_to_bcd(mobile_identity_imeisv, imeisv->length, amf_ue->imeisv_bcd); - ogs_bcd_to_buffer(amf_ue->imeisv_bcd, - amf_ue->imeisv, &amf_ue->imeisv_len); + ogs_nas_imeisv_bcd_to_buffer(amf_ue->imeisv_bcd, + amf_ue->masked_imeisv, &amf_ue->masked_imeisv_len); + amf_ue->masked_imeisv[5] = 0xff; + amf_ue->masked_imeisv[6] = 0xff; if (amf_ue->pei) ogs_free(amf_ue->pei); amf_ue->pei = ogs_msprintf("imeisv-%s", amf_ue->imeisv_bcd); diff --git a/src/amf/nf-sm.c b/src/amf/nf-sm.c index 8674a2236..5e5a01dd5 100644 --- a/src/amf/nf-sm.c +++ b/src/amf/nf-sm.c @@ -62,18 +62,16 @@ void amf_nf_state_initial(ogs_fsm_t *s, amf_event_t *e) ogs_assert(nf_instance); ogs_assert(nf_instance->id); - nf_instance->t_registration_interval = ogs_timer_add(amf_self()->timer_mgr, - amf_timer_nf_instance_registration_interval, nf_instance); ogs_assert(nf_instance->t_registration_interval); - nf_instance->t_heartbeat_interval = ogs_timer_add(amf_self()->timer_mgr, - amf_timer_nf_instance_heartbeat_interval, nf_instance); + nf_instance->t_registration_interval->cb = + amf_timer_nf_instance_registration_interval; ogs_assert(nf_instance->t_heartbeat_interval); - nf_instance->t_heartbeat = ogs_timer_add(amf_self()->timer_mgr, - amf_timer_nf_instance_heartbeat, nf_instance); + nf_instance->t_heartbeat_interval->cb = + amf_timer_nf_instance_heartbeat_interval; ogs_assert(nf_instance->t_heartbeat); - nf_instance->t_validity = ogs_timer_add(amf_self()->timer_mgr, - amf_timer_nf_instance_validity, nf_instance); + nf_instance->t_heartbeat->cb = amf_timer_nf_instance_heartbeat; ogs_assert(nf_instance->t_validity); + nf_instance->t_validity->cb = amf_timer_nf_instance_validity; if (NF_INSTANCE_IS_SELF(nf_instance->id)) { OGS_FSM_TRAN(s, &amf_nf_state_will_register); @@ -84,20 +82,10 @@ void amf_nf_state_initial(ogs_fsm_t *s, amf_event_t *e) void amf_nf_state_final(ogs_fsm_t *s, amf_event_t *e) { - ogs_sbi_nf_instance_t *nf_instance = NULL; - ogs_assert(s); ogs_assert(e); amf_sm_debug(e); - - nf_instance = e->sbi.data; - ogs_assert(nf_instance); - - ogs_timer_delete(nf_instance->t_registration_interval); - ogs_timer_delete(nf_instance->t_heartbeat_interval); - ogs_timer_delete(nf_instance->t_heartbeat); - ogs_timer_delete(nf_instance->t_validity); } void amf_nf_state_will_register(ogs_fsm_t *s, amf_event_t *e) @@ -117,7 +105,8 @@ void amf_nf_state_will_register(ogs_fsm_t *s, amf_event_t *e) switch (e->id) { case OGS_FSM_ENTRY_SIG: - ogs_timer_start(nf_instance->t_registration_interval, + if (NF_INSTANCE_IS_SELF(nf_instance->id)) + ogs_timer_start(nf_instance->t_registration_interval, amf_timer_cfg(AMF_TIMER_NF_INSTANCE_REGISTRATION_INTERVAL)-> duration); @@ -125,7 +114,8 @@ void amf_nf_state_will_register(ogs_fsm_t *s, amf_event_t *e) break; case OGS_FSM_EXIT_SIG: - ogs_timer_stop(nf_instance->t_registration_interval); + if (NF_INSTANCE_IS_SELF(nf_instance->id)) + ogs_timer_stop(nf_instance->t_registration_interval); break; case AMF_EVT_SBI_CLIENT: @@ -171,8 +161,9 @@ void amf_nf_state_will_register(ogs_fsm_t *s, amf_event_t *e) ogs_warn("[%s] Retry to registration with NRF", nf_instance->id); - ogs_timer_start(nf_instance->t_registration_interval, - amf_timer_cfg(AMF_TIMER_NF_INSTANCE_REGISTRATION_INTERVAL)-> + if (NF_INSTANCE_IS_SELF(nf_instance->id)) + ogs_timer_start(nf_instance->t_registration_interval, + amf_timer_cfg(AMF_TIMER_NF_INSTANCE_REGISTRATION_INTERVAL)-> duration); ogs_nnrf_nfm_send_nf_register(nf_instance); @@ -276,10 +267,9 @@ void amf_nf_state_registered(ogs_fsm_t *s, amf_event_t *e) case AMF_EVT_SBI_TIMER: switch(e->timer_id) { case AMF_TIMER_NF_INSTANCE_HEARTBEAT_INTERVAL: - if (nf_instance->time.heartbeat) { + if (nf_instance->time.heartbeat) ogs_timer_start(nf_instance->t_heartbeat_interval, ogs_time_from_sec(nf_instance->time.heartbeat)); - } ogs_nnrf_nfm_send_nf_update(nf_instance); break; @@ -350,17 +340,15 @@ void amf_nf_state_exception(ogs_fsm_t *s, amf_event_t *e) switch (e->id) { case OGS_FSM_ENTRY_SIG: - if (NF_INSTANCE_IS_SELF(nf_instance->id)) { + if (NF_INSTANCE_IS_SELF(nf_instance->id)) ogs_timer_start(nf_instance->t_registration_interval, amf_timer_cfg(AMF_TIMER_NF_INSTANCE_REGISTRATION_INTERVAL)-> duration); - } break; case OGS_FSM_EXIT_SIG: - if (NF_INSTANCE_IS_SELF(nf_instance->id)) { + if (NF_INSTANCE_IS_SELF(nf_instance->id)) ogs_timer_stop(nf_instance->t_registration_interval); - } break; case AMF_EVT_SBI_TIMER: diff --git a/src/amf/ngap-build.c b/src/amf/ngap-build.c index 172c9d128..1dbfe9bdd 100644 --- a/src/amf/ngap-build.c +++ b/src/amf/ngap-build.c @@ -146,7 +146,7 @@ ogs_pkbuf_t *ngap_build_ng_setup_response(void) amf_self()->plmn_support[i].s_nssai[j].sst, sST); if (amf_self()->plmn_support[i].s_nssai[j].sd.v != OGS_S_NSSAI_NO_SD_VALUE) { - s_NSSAI->sD = CALLOC(1, sizeof(ogs_uint24_t)); + s_NSSAI->sD = CALLOC(1, sizeof(NGAP_SD_t)); ogs_asn_uint24_to_OCTET_STRING( amf_self()->plmn_support[i].s_nssai[j].sd, s_NSSAI->sD); } @@ -413,7 +413,7 @@ ogs_pkbuf_t *ngap_build_initial_context_setup_request( ogs_asn_uint8_to_OCTET_STRING(sess->s_nssai.sst, sST); if (sess->s_nssai.sd.v != OGS_S_NSSAI_NO_SD_VALUE) { - s_NSSAI->sD = CALLOC(1, sizeof(ogs_uint24_t)); + s_NSSAI->sD = CALLOC(1, sizeof(NGAP_SD_t)); ogs_asn_uint24_to_OCTET_STRING(sess->s_nssai.sd, s_NSSAI->sD); } @@ -489,7 +489,7 @@ ogs_pkbuf_t *ngap_build_initial_context_setup_request( amf_self()->plmn_support[i].s_nssai[j].sst, sST); if (amf_self()->plmn_support[i].s_nssai[j].sd.v != OGS_S_NSSAI_NO_SD_VALUE) { - s_NSSAI->sD = CALLOC(1, sizeof(ogs_uint24_t)); + s_NSSAI->sD = CALLOC(1, sizeof(NGAP_SD_t)); ogs_asn_uint24_to_OCTET_STRING( amf_self()->plmn_support[i].s_nssai[j].sd, s_NSSAI->sD); } @@ -555,7 +555,7 @@ ogs_pkbuf_t *ngap_build_initial_context_setup_request( UERadioCapability); } - if (amf_ue->imeisv_len) { + if (amf_ue->masked_imeisv_len) { ie = CALLOC(1, sizeof(NGAP_InitialContextSetupRequestIEs_t)); ASN_SEQUENCE_ADD(&InitialContextSetupRequest->protocolIEs, ie); @@ -566,12 +566,10 @@ ogs_pkbuf_t *ngap_build_initial_context_setup_request( MaskedIMEISV = &ie->value.choice.MaskedIMEISV; - MaskedIMEISV->size = amf_ue->imeisv_len; + MaskedIMEISV->size = amf_ue->masked_imeisv_len; MaskedIMEISV->buf = CALLOC(MaskedIMEISV->size, sizeof(uint8_t)); MaskedIMEISV->bits_unused = 0; - memcpy(MaskedIMEISV->buf, amf_ue->imeisv, MaskedIMEISV->size); - MaskedIMEISV->buf[5] = 0xff; - MaskedIMEISV->buf[6] = 0xff; + memcpy(MaskedIMEISV->buf, amf_ue->masked_imeisv, MaskedIMEISV->size); } if (gmmbuf) { @@ -900,7 +898,7 @@ ogs_pkbuf_t *ngap_build_pdu_session_resource_setup_request( sST = &s_NSSAI->sST; ogs_asn_uint8_to_OCTET_STRING(sess->s_nssai.sst, sST); if (sess->s_nssai.sd.v != OGS_S_NSSAI_NO_SD_VALUE) { - s_NSSAI->sD = CALLOC(1, sizeof(ogs_uint24_t)); + s_NSSAI->sD = CALLOC(1, sizeof(NGAP_SD_t)); ogs_asn_uint24_to_OCTET_STRING(sess->s_nssai.sd, s_NSSAI->sD); } diff --git a/src/amf/ngap-sctp.c b/src/amf/ngap-sctp.c index e109e4c69..b895c91cf 100644 --- a/src/amf/ngap-sctp.c +++ b/src/amf/ngap-sctp.c @@ -104,7 +104,7 @@ void ngap_accept_handler(ogs_sock_t *sock) ogs_assert(addr); memcpy(addr, &new->remote_addr, sizeof(ogs_sockaddr_t)); - ogs_info("eNB-S1 accepted[%s]:%d in s1_path module", + ogs_info("gNB-S1 accepted[%s]:%d in ng-path module", OGS_ADDR(addr, buf), OGS_PORT(addr)); ngap_event_push(AMF_EVT_NGAP_LO_ACCEPT, diff --git a/src/amf/nsmf-handler.c b/src/amf/nsmf-handler.c index 23ebbc98d..c87ec611b 100644 --- a/src/amf/nsmf-handler.c +++ b/src/amf/nsmf-handler.c @@ -213,9 +213,17 @@ int amf_nsmf_pdu_session_handle_update_sm_context( sess->n2smbuf = ogs_pkbuf_copy(n2smbuf); ogs_assert(sess->n2smbuf); - if (SESSION_SYNC_DONE(amf_ue)) + if (SESSION_SYNC_DONE(amf_ue)) { nas_5gs_send_accept(amf_ue); + ogs_list_for_each(&amf_ue->sess_list, sess) { + if (sess->n2smbuf) { + ogs_pkbuf_free(sess->n2smbuf); + sess->n2smbuf = NULL; + } + } + } + } else { ogs_error("Invalid UpCnxState [UE:%d,SMF:%d]", sess->ueUpCnxState, sess->smfUpCnxState); diff --git a/src/ausf/nf-sm.c b/src/ausf/nf-sm.c index da724513a..66b6878d7 100644 --- a/src/ausf/nf-sm.c +++ b/src/ausf/nf-sm.c @@ -62,18 +62,16 @@ void ausf_nf_state_initial(ogs_fsm_t *s, ausf_event_t *e) ogs_assert(nf_instance); ogs_assert(nf_instance->id); - nf_instance->t_registration_interval = ogs_timer_add(ausf_self()->timer_mgr, - ausf_timer_nf_instance_registration_interval, nf_instance); ogs_assert(nf_instance->t_registration_interval); - nf_instance->t_heartbeat_interval = ogs_timer_add(ausf_self()->timer_mgr, - ausf_timer_nf_instance_heartbeat_interval, nf_instance); + nf_instance->t_registration_interval->cb = + ausf_timer_nf_instance_registration_interval; ogs_assert(nf_instance->t_heartbeat_interval); - nf_instance->t_heartbeat = ogs_timer_add(ausf_self()->timer_mgr, - ausf_timer_nf_instance_heartbeat, nf_instance); + nf_instance->t_heartbeat_interval->cb = + ausf_timer_nf_instance_heartbeat_interval; ogs_assert(nf_instance->t_heartbeat); - nf_instance->t_validity = ogs_timer_add(ausf_self()->timer_mgr, - ausf_timer_nf_instance_validity, nf_instance); + nf_instance->t_heartbeat->cb = ausf_timer_nf_instance_heartbeat; ogs_assert(nf_instance->t_validity); + nf_instance->t_validity->cb = ausf_timer_nf_instance_validity; if (NF_INSTANCE_IS_SELF(nf_instance->id)) { OGS_FSM_TRAN(s, &ausf_nf_state_will_register); @@ -84,20 +82,10 @@ void ausf_nf_state_initial(ogs_fsm_t *s, ausf_event_t *e) void ausf_nf_state_final(ogs_fsm_t *s, ausf_event_t *e) { - ogs_sbi_nf_instance_t *nf_instance = NULL; - ogs_assert(s); ogs_assert(e); ausf_sm_debug(e); - - nf_instance = e->sbi.data; - ogs_assert(nf_instance); - - ogs_timer_delete(nf_instance->t_registration_interval); - ogs_timer_delete(nf_instance->t_heartbeat_interval); - ogs_timer_delete(nf_instance->t_heartbeat); - ogs_timer_delete(nf_instance->t_validity); } void ausf_nf_state_will_register(ogs_fsm_t *s, ausf_event_t *e) @@ -117,7 +105,8 @@ void ausf_nf_state_will_register(ogs_fsm_t *s, ausf_event_t *e) switch (e->id) { case OGS_FSM_ENTRY_SIG: - ogs_timer_start(nf_instance->t_registration_interval, + if (NF_INSTANCE_IS_SELF(nf_instance->id)) + ogs_timer_start(nf_instance->t_registration_interval, ausf_timer_cfg(AUSF_TIMER_NF_INSTANCE_REGISTRATION_INTERVAL)-> duration); @@ -125,7 +114,8 @@ void ausf_nf_state_will_register(ogs_fsm_t *s, ausf_event_t *e) break; case OGS_FSM_EXIT_SIG: - ogs_timer_stop(nf_instance->t_registration_interval); + if (NF_INSTANCE_IS_SELF(nf_instance->id)) + ogs_timer_stop(nf_instance->t_registration_interval); break; case AUSF_EVT_SBI_CLIENT: @@ -171,7 +161,8 @@ void ausf_nf_state_will_register(ogs_fsm_t *s, ausf_event_t *e) ogs_warn("[%s] Retry to registration with NRF", nf_instance->id); - ogs_timer_start(nf_instance->t_registration_interval, + if (NF_INSTANCE_IS_SELF(nf_instance->id)) + ogs_timer_start(nf_instance->t_registration_interval, ausf_timer_cfg(AUSF_TIMER_NF_INSTANCE_REGISTRATION_INTERVAL)-> duration); @@ -276,10 +267,9 @@ void ausf_nf_state_registered(ogs_fsm_t *s, ausf_event_t *e) case AUSF_EVT_SBI_TIMER: switch(e->timer_id) { case AUSF_TIMER_NF_INSTANCE_HEARTBEAT_INTERVAL: - if (nf_instance->time.heartbeat) { + if (nf_instance->time.heartbeat) ogs_timer_start(nf_instance->t_heartbeat_interval, ogs_time_from_sec(nf_instance->time.heartbeat)); - } ogs_nnrf_nfm_send_nf_update(nf_instance); break; @@ -352,17 +342,15 @@ void ausf_nf_state_exception(ogs_fsm_t *s, ausf_event_t *e) switch (e->id) { case OGS_FSM_ENTRY_SIG: - if (NF_INSTANCE_IS_SELF(nf_instance->id)) { + if (NF_INSTANCE_IS_SELF(nf_instance->id)) ogs_timer_start(nf_instance->t_registration_interval, ausf_timer_cfg(AUSF_TIMER_NF_INSTANCE_REGISTRATION_INTERVAL)-> duration); - } break; case OGS_FSM_EXIT_SIG: - if (NF_INSTANCE_IS_SELF(nf_instance->id)) { + if (NF_INSTANCE_IS_SELF(nf_instance->id)) ogs_timer_stop(nf_instance->t_registration_interval); - } break; case AUSF_EVT_SBI_TIMER: diff --git a/src/mme/emm-handler.c b/src/mme/emm-handler.c index bc572efdc..6cffbfbcc 100644 --- a/src/mme/emm-handler.c +++ b/src/mme/emm-handler.c @@ -655,7 +655,10 @@ int emm_handle_security_mode_complete(mme_ue_t *mme_ue, mme_ue->imeisv_bcd); ogs_bcd_to_buffer(mme_ue->imeisv_bcd, mme_ue->imeisv, &mme_ue->imeisv_len); - mme_ue->imeisv_presence = true; + ogs_nas_imeisv_bcd_to_buffer(mme_ue->imeisv_bcd, + mme_ue->masked_imeisv, &mme_ue->masked_imeisv_len); + mme_ue->masked_imeisv[5] = 0xff; + mme_ue->masked_imeisv[6] = 0xff; break; default: ogs_warn("Invalid IMEISV Type[%d]", imeisv->imeisv.type); diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index 635b53373..7d09bc46c 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -310,9 +310,10 @@ struct mme_ue_s { char imsi_bcd[OGS_MAX_IMSI_BCD_LEN+1]; ogs_nas_mobile_identity_imsi_t nas_mobile_identity_imsi; - bool imeisv_presence; uint8_t imeisv[OGS_MAX_IMEISV_LEN]; int imeisv_len; + uint8_t masked_imeisv[OGS_MAX_IMEISV_LEN]; + int masked_imeisv_len; char imeisv_bcd[OGS_MAX_IMEISV_BCD_LEN+1]; ogs_nas_mobile_identity_imeisv_t nas_mobile_identity_imeisv; diff --git a/src/mme/mme-fd-path.c b/src/mme/mme-fd-path.c index bf2eb4632..f3811d68b 100644 --- a/src/mme/mme-fd-path.c +++ b/src/mme/mme-fd-path.c @@ -493,7 +493,7 @@ void mme_s6a_send_ulr(mme_ue_t *mme_ue) ogs_assert(ret == 0); /* Set the Terminal-Information AVP */ - if (mme_ue->imeisv_presence) { + if (mme_ue->imeisv_len) { ret = fd_msg_avp_new(ogs_diam_s6a_terminal_information, 0, &avp); ogs_assert(ret == 0); diff --git a/src/mme/mme-s11-build.c b/src/mme/mme-s11-build.c index d38d9f30b..7eb238641 100644 --- a/src/mme/mme-s11-build.c +++ b/src/mme/mme-s11-build.c @@ -61,7 +61,7 @@ ogs_pkbuf_t *mme_s11_build_create_session_request( req->imsi.data = mme_ue->imsi; req->imsi.len = mme_ue->imsi_len; - if (mme_ue->imeisv_presence) { + if (mme_ue->imeisv_len) { req->me_identity.presence = 1; req->me_identity.data = mme_ue->imeisv; req->me_identity.len = mme_ue->imeisv_len; diff --git a/src/mme/s1ap-build.c b/src/mme/s1ap-build.c index 73e004a79..b5d725b33 100644 --- a/src/mme/s1ap-build.c +++ b/src/mme/s1ap-build.c @@ -274,6 +274,7 @@ ogs_pkbuf_t *s1ap_build_initial_context_setup_request( S1AP_E_RABToBeSetupListCtxtSUReq_t *E_RABToBeSetupListCtxtSUReq = NULL; S1AP_UESecurityCapabilities_t *UESecurityCapabilities = NULL; S1AP_SecurityKey_t *SecurityKey = NULL; + S1AP_Masked_IMEISV_t *Masked_IMEISV = NULL; enb_ue_t *enb_ue = NULL; mme_sess_t *sess = NULL; @@ -537,6 +538,23 @@ ogs_pkbuf_t *s1ap_build_initial_context_setup_request( UERadioCapability); } + if (mme_ue->imeisv_len) { + ie = CALLOC(1, sizeof(S1AP_InitialContextSetupRequestIEs_t)); + ASN_SEQUENCE_ADD(&InitialContextSetupRequest->protocolIEs, ie); + + ie->id = S1AP_ProtocolIE_ID_id_Masked_IMEISV; + ie->criticality = S1AP_Criticality_ignore; + ie->value.present = + S1AP_InitialContextSetupRequestIEs__value_PR_Masked_IMEISV; + + Masked_IMEISV = &ie->value.choice.Masked_IMEISV; + + Masked_IMEISV->size = mme_ue->masked_imeisv_len; + Masked_IMEISV->buf = CALLOC(Masked_IMEISV->size, sizeof(uint8_t)); + Masked_IMEISV->bits_unused = 0; + memcpy(Masked_IMEISV->buf, mme_ue->masked_imeisv, Masked_IMEISV->size); + } + return ogs_s1ap_encode(&pdu); } diff --git a/src/smf/nf-sm.c b/src/smf/nf-sm.c index 8f271bbe6..d1f36c371 100644 --- a/src/smf/nf-sm.c +++ b/src/smf/nf-sm.c @@ -62,18 +62,16 @@ void smf_nf_state_initial(ogs_fsm_t *s, smf_event_t *e) ogs_assert(nf_instance); ogs_assert(nf_instance->id); - nf_instance->t_registration_interval = ogs_timer_add(smf_self()->timer_mgr, - smf_timer_nf_instance_registration_interval, nf_instance); ogs_assert(nf_instance->t_registration_interval); - nf_instance->t_heartbeat_interval = ogs_timer_add(smf_self()->timer_mgr, - smf_timer_nf_instance_heartbeat_interval, nf_instance); + nf_instance->t_registration_interval->cb = + smf_timer_nf_instance_registration_interval; ogs_assert(nf_instance->t_heartbeat_interval); - nf_instance->t_heartbeat = ogs_timer_add(smf_self()->timer_mgr, - smf_timer_nf_instance_heartbeat, nf_instance); + nf_instance->t_heartbeat_interval->cb = + smf_timer_nf_instance_heartbeat_interval; ogs_assert(nf_instance->t_heartbeat); - nf_instance->t_validity = ogs_timer_add(smf_self()->timer_mgr, - smf_timer_nf_instance_validity, nf_instance); + nf_instance->t_heartbeat->cb = smf_timer_nf_instance_heartbeat; ogs_assert(nf_instance->t_validity); + nf_instance->t_validity->cb = smf_timer_nf_instance_validity; if (NF_INSTANCE_IS_SELF(nf_instance->id)) { OGS_FSM_TRAN(s, &smf_nf_state_will_register); @@ -84,20 +82,10 @@ void smf_nf_state_initial(ogs_fsm_t *s, smf_event_t *e) void smf_nf_state_final(ogs_fsm_t *s, smf_event_t *e) { - ogs_sbi_nf_instance_t *nf_instance = NULL; - ogs_assert(s); ogs_assert(e); smf_sm_debug(e); - - nf_instance = e->sbi.data; - ogs_assert(nf_instance); - - ogs_timer_delete(nf_instance->t_registration_interval); - ogs_timer_delete(nf_instance->t_heartbeat_interval); - ogs_timer_delete(nf_instance->t_heartbeat); - ogs_timer_delete(nf_instance->t_validity); } void smf_nf_state_will_register(ogs_fsm_t *s, smf_event_t *e) @@ -117,7 +105,8 @@ void smf_nf_state_will_register(ogs_fsm_t *s, smf_event_t *e) switch (e->id) { case OGS_FSM_ENTRY_SIG: - ogs_timer_start(nf_instance->t_registration_interval, + if (NF_INSTANCE_IS_SELF(nf_instance->id)) + ogs_timer_start(nf_instance->t_registration_interval, smf_timer_cfg(SMF_TIMER_NF_INSTANCE_REGISTRATION_INTERVAL)-> duration); @@ -125,7 +114,8 @@ void smf_nf_state_will_register(ogs_fsm_t *s, smf_event_t *e) break; case OGS_FSM_EXIT_SIG: - ogs_timer_stop(nf_instance->t_registration_interval); + if (NF_INSTANCE_IS_SELF(nf_instance->id)) + ogs_timer_stop(nf_instance->t_registration_interval); break; case SMF_EVT_SBI_CLIENT: @@ -171,8 +161,9 @@ void smf_nf_state_will_register(ogs_fsm_t *s, smf_event_t *e) ogs_warn("[%s] Retry to registration with NRF", nf_instance->id); - ogs_timer_start(nf_instance->t_registration_interval, - smf_timer_cfg(SMF_TIMER_NF_INSTANCE_REGISTRATION_INTERVAL)-> + if (NF_INSTANCE_IS_SELF(nf_instance->id)) + ogs_timer_start(nf_instance->t_registration_interval, + smf_timer_cfg(SMF_TIMER_NF_INSTANCE_REGISTRATION_INTERVAL)-> duration); ogs_nnrf_nfm_send_nf_register(nf_instance); @@ -277,10 +268,9 @@ void smf_nf_state_registered(ogs_fsm_t *s, smf_event_t *e) case SMF_EVT_SBI_TIMER: switch(e->timer_id) { case SMF_TIMER_NF_INSTANCE_HEARTBEAT_INTERVAL: - if (nf_instance->time.heartbeat) { + if (nf_instance->time.heartbeat) ogs_timer_start(nf_instance->t_heartbeat_interval, ogs_time_from_sec(nf_instance->time.heartbeat)); - } ogs_nnrf_nfm_send_nf_update(nf_instance); break; @@ -353,17 +343,15 @@ void smf_nf_state_exception(ogs_fsm_t *s, smf_event_t *e) switch (e->id) { case OGS_FSM_ENTRY_SIG: - if (NF_INSTANCE_IS_SELF(nf_instance->id)) { + if (NF_INSTANCE_IS_SELF(nf_instance->id)) ogs_timer_start(nf_instance->t_registration_interval, smf_timer_cfg(SMF_TIMER_NF_INSTANCE_REGISTRATION_INTERVAL)-> duration); - } break; case OGS_FSM_EXIT_SIG: - if (NF_INSTANCE_IS_SELF(nf_instance->id)) { + if (NF_INSTANCE_IS_SELF(nf_instance->id)) ogs_timer_stop(nf_instance->t_registration_interval); - } break; case SMF_EVT_SBI_TIMER: diff --git a/src/smf/nsmf-handler.c b/src/smf/nsmf-handler.c index 0ce0e8956..36b5c95aa 100644 --- a/src/smf/nsmf-handler.c +++ b/src/smf/nsmf-handler.c @@ -250,6 +250,8 @@ bool smf_nsmf_handle_update_sm_context( /********************************************************* * Handle ACTIVATING ********************************************************/ + OpenAPI_sm_context_updated_data_t SmContextUpdatedData; + OpenAPI_ref_to_binary_data_t n2SmInfo; if (sess->smfUpCnxState == OpenAPI_up_cnx_state_ACTIVATED) { ogs_warn("[%s:%d] FALLBACK - UpCnxState has already been " @@ -295,9 +297,6 @@ bool smf_nsmf_handle_update_sm_context( "ACTIVATING", smf_ue->supi, sess->psi); } - OpenAPI_sm_context_updated_data_t SmContextUpdatedData; - OpenAPI_ref_to_binary_data_t n2SmInfo; - /* UPDATE_UpCnxState - SYNC */ sess->smfUpCnxState = sess->ueUpCnxState; diff --git a/src/udm/nf-sm.c b/src/udm/nf-sm.c index 9e0323bce..d0a419113 100644 --- a/src/udm/nf-sm.c +++ b/src/udm/nf-sm.c @@ -62,18 +62,16 @@ void udm_nf_state_initial(ogs_fsm_t *s, udm_event_t *e) ogs_assert(nf_instance); ogs_assert(nf_instance->id); - nf_instance->t_registration_interval = ogs_timer_add(udm_self()->timer_mgr, - udm_timer_nf_instance_registration_interval, nf_instance); ogs_assert(nf_instance->t_registration_interval); - nf_instance->t_heartbeat_interval = ogs_timer_add(udm_self()->timer_mgr, - udm_timer_nf_instance_heartbeat_interval, nf_instance); + nf_instance->t_registration_interval->cb = + udm_timer_nf_instance_registration_interval; ogs_assert(nf_instance->t_heartbeat_interval); - nf_instance->t_heartbeat = ogs_timer_add(udm_self()->timer_mgr, - udm_timer_nf_instance_heartbeat, nf_instance); + nf_instance->t_heartbeat_interval->cb = + udm_timer_nf_instance_heartbeat_interval; ogs_assert(nf_instance->t_heartbeat); - nf_instance->t_validity = ogs_timer_add(udm_self()->timer_mgr, - udm_timer_nf_instance_validity, nf_instance); + nf_instance->t_heartbeat->cb = udm_timer_nf_instance_heartbeat; ogs_assert(nf_instance->t_validity); + nf_instance->t_validity->cb = udm_timer_nf_instance_validity; if (NF_INSTANCE_IS_SELF(nf_instance->id)) { OGS_FSM_TRAN(s, &udm_nf_state_will_register); @@ -84,20 +82,10 @@ void udm_nf_state_initial(ogs_fsm_t *s, udm_event_t *e) void udm_nf_state_final(ogs_fsm_t *s, udm_event_t *e) { - ogs_sbi_nf_instance_t *nf_instance = NULL; - ogs_assert(s); ogs_assert(e); udm_sm_debug(e); - - nf_instance = e->sbi.data; - ogs_assert(nf_instance); - - ogs_timer_delete(nf_instance->t_registration_interval); - ogs_timer_delete(nf_instance->t_heartbeat_interval); - ogs_timer_delete(nf_instance->t_heartbeat); - ogs_timer_delete(nf_instance->t_validity); } void udm_nf_state_will_register(ogs_fsm_t *s, udm_event_t *e) @@ -117,7 +105,8 @@ void udm_nf_state_will_register(ogs_fsm_t *s, udm_event_t *e) switch (e->id) { case OGS_FSM_ENTRY_SIG: - ogs_timer_start(nf_instance->t_registration_interval, + if (NF_INSTANCE_IS_SELF(nf_instance->id)) + ogs_timer_start(nf_instance->t_registration_interval, udm_timer_cfg(UDM_TIMER_NF_INSTANCE_REGISTRATION_INTERVAL)-> duration); @@ -125,7 +114,8 @@ void udm_nf_state_will_register(ogs_fsm_t *s, udm_event_t *e) break; case OGS_FSM_EXIT_SIG: - ogs_timer_stop(nf_instance->t_registration_interval); + if (NF_INSTANCE_IS_SELF(nf_instance->id)) + ogs_timer_stop(nf_instance->t_registration_interval); break; case UDM_EVT_SBI_CLIENT: @@ -171,8 +161,9 @@ void udm_nf_state_will_register(ogs_fsm_t *s, udm_event_t *e) ogs_warn("[%s] Retry to registration with NRF", nf_instance->id); - ogs_timer_start(nf_instance->t_registration_interval, - udm_timer_cfg(UDM_TIMER_NF_INSTANCE_REGISTRATION_INTERVAL)-> + if (NF_INSTANCE_IS_SELF(nf_instance->id)) + ogs_timer_start(nf_instance->t_registration_interval, + udm_timer_cfg(UDM_TIMER_NF_INSTANCE_REGISTRATION_INTERVAL)-> duration); ogs_nnrf_nfm_send_nf_register(nf_instance); @@ -276,10 +267,9 @@ void udm_nf_state_registered(ogs_fsm_t *s, udm_event_t *e) case UDM_EVT_SBI_TIMER: switch(e->timer_id) { case UDM_TIMER_NF_INSTANCE_HEARTBEAT_INTERVAL: - if (nf_instance->time.heartbeat) { + if (nf_instance->time.heartbeat) ogs_timer_start(nf_instance->t_heartbeat_interval, ogs_time_from_sec(nf_instance->time.heartbeat)); - } ogs_nnrf_nfm_send_nf_update(nf_instance); break; @@ -352,17 +342,15 @@ void udm_nf_state_exception(ogs_fsm_t *s, udm_event_t *e) switch (e->id) { case OGS_FSM_ENTRY_SIG: - if (NF_INSTANCE_IS_SELF(nf_instance->id)) { + if (NF_INSTANCE_IS_SELF(nf_instance->id)) ogs_timer_start(nf_instance->t_registration_interval, udm_timer_cfg(UDM_TIMER_NF_INSTANCE_REGISTRATION_INTERVAL)-> duration); - } break; case OGS_FSM_EXIT_SIG: - if (NF_INSTANCE_IS_SELF(nf_instance->id)) { + if (NF_INSTANCE_IS_SELF(nf_instance->id)) ogs_timer_stop(nf_instance->t_registration_interval); - } break; case UDM_EVT_SBI_TIMER: diff --git a/src/udr/nf-sm.c b/src/udr/nf-sm.c index d81efd7a2..af17f922b 100644 --- a/src/udr/nf-sm.c +++ b/src/udr/nf-sm.c @@ -62,18 +62,16 @@ void udr_nf_state_initial(ogs_fsm_t *s, udr_event_t *e) ogs_assert(nf_instance); ogs_assert(nf_instance->id); - nf_instance->t_registration_interval = ogs_timer_add(udr_self()->timer_mgr, - udr_timer_nf_instance_registration_interval, nf_instance); ogs_assert(nf_instance->t_registration_interval); - nf_instance->t_heartbeat_interval = ogs_timer_add(udr_self()->timer_mgr, - udr_timer_nf_instance_heartbeat_interval, nf_instance); + nf_instance->t_registration_interval->cb = + udr_timer_nf_instance_registration_interval; ogs_assert(nf_instance->t_heartbeat_interval); - nf_instance->t_heartbeat = ogs_timer_add(udr_self()->timer_mgr, - udr_timer_nf_instance_heartbeat, nf_instance); + nf_instance->t_heartbeat_interval->cb = + udr_timer_nf_instance_heartbeat_interval; ogs_assert(nf_instance->t_heartbeat); - nf_instance->t_validity = ogs_timer_add(udr_self()->timer_mgr, - udr_timer_nf_instance_validity, nf_instance); + nf_instance->t_heartbeat->cb = udr_timer_nf_instance_heartbeat; ogs_assert(nf_instance->t_validity); + nf_instance->t_validity->cb = udr_timer_nf_instance_validity; if (NF_INSTANCE_IS_SELF(nf_instance->id)) { OGS_FSM_TRAN(s, &udr_nf_state_will_register); @@ -84,20 +82,10 @@ void udr_nf_state_initial(ogs_fsm_t *s, udr_event_t *e) void udr_nf_state_final(ogs_fsm_t *s, udr_event_t *e) { - ogs_sbi_nf_instance_t *nf_instance = NULL; - ogs_assert(s); ogs_assert(e); udr_sm_debug(e); - - nf_instance = e->sbi.data; - ogs_assert(nf_instance); - - ogs_timer_delete(nf_instance->t_registration_interval); - ogs_timer_delete(nf_instance->t_heartbeat_interval); - ogs_timer_delete(nf_instance->t_heartbeat); - ogs_timer_delete(nf_instance->t_validity); } void udr_nf_state_will_register(ogs_fsm_t *s, udr_event_t *e) @@ -117,7 +105,8 @@ void udr_nf_state_will_register(ogs_fsm_t *s, udr_event_t *e) switch (e->id) { case OGS_FSM_ENTRY_SIG: - ogs_timer_start(nf_instance->t_registration_interval, + if (NF_INSTANCE_IS_SELF(nf_instance->id)) + ogs_timer_start(nf_instance->t_registration_interval, udr_timer_cfg(UDR_TIMER_NF_INSTANCE_REGISTRATION_INTERVAL)-> duration); @@ -125,7 +114,8 @@ void udr_nf_state_will_register(ogs_fsm_t *s, udr_event_t *e) break; case OGS_FSM_EXIT_SIG: - ogs_timer_stop(nf_instance->t_registration_interval); + if (NF_INSTANCE_IS_SELF(nf_instance->id)) + ogs_timer_stop(nf_instance->t_registration_interval); break; case UDR_EVT_SBI_CLIENT: @@ -171,8 +161,9 @@ void udr_nf_state_will_register(ogs_fsm_t *s, udr_event_t *e) ogs_warn("[%s] Retry to registration with NRF", nf_instance->id); - ogs_timer_start(nf_instance->t_registration_interval, - udr_timer_cfg(UDR_TIMER_NF_INSTANCE_REGISTRATION_INTERVAL)-> + if (NF_INSTANCE_IS_SELF(nf_instance->id)) + ogs_timer_start(nf_instance->t_registration_interval, + udr_timer_cfg(UDR_TIMER_NF_INSTANCE_REGISTRATION_INTERVAL)-> duration); ogs_nnrf_nfm_send_nf_register(nf_instance); @@ -276,10 +267,9 @@ void udr_nf_state_registered(ogs_fsm_t *s, udr_event_t *e) case UDR_EVT_SBI_TIMER: switch(e->timer_id) { case UDR_TIMER_NF_INSTANCE_HEARTBEAT_INTERVAL: - if (nf_instance->time.heartbeat) { + if (nf_instance->time.heartbeat) ogs_timer_start(nf_instance->t_heartbeat_interval, ogs_time_from_sec(nf_instance->time.heartbeat)); - } ogs_nnrf_nfm_send_nf_update(nf_instance); break; @@ -352,17 +342,15 @@ void udr_nf_state_exception(ogs_fsm_t *s, udr_event_t *e) switch (e->id) { case OGS_FSM_ENTRY_SIG: - if (NF_INSTANCE_IS_SELF(nf_instance->id)) { + if (NF_INSTANCE_IS_SELF(nf_instance->id)) ogs_timer_start(nf_instance->t_registration_interval, udr_timer_cfg(UDR_TIMER_NF_INSTANCE_REGISTRATION_INTERVAL)-> duration); - } break; case OGS_FSM_EXIT_SIG: - if (NF_INSTANCE_IS_SELF(nf_instance->id)) { + if (NF_INSTANCE_IS_SELF(nf_instance->id)) ogs_timer_stop(nf_instance->t_registration_interval); - } break; case UDR_EVT_SBI_TIMER: diff --git a/src/upf/gtp-path.c b/src/upf/gtp-path.c index 63d2cc316..ec8328d16 100644 --- a/src/upf/gtp-path.c +++ b/src/upf/gtp-path.c @@ -152,6 +152,11 @@ static void _gtpv1_u_recv_cb(short when, ogs_socket_t fd, void *data) goto cleanup; } + if (gtp_h->type == OGS_GTPU_MSGTYPE_ERR_IND) { + ogs_error("[RECV] Error Indication from [%s]", OGS_ADDR(&from, buf)); + goto cleanup; + } + if (gtp_h->type != OGS_GTPU_MSGTYPE_GPDU) { ogs_error("[DROP] Invalid GTPU Type [%d]", gtp_h->type); ogs_log_hexdump(OGS_LOG_ERROR, pkbuf->data, pkbuf->len); diff --git a/tests/00101/issues-482-test.c b/tests/00101/issues-482-test.c index d412c6aef..ec646f1b4 100644 --- a/tests/00101/issues-482-test.c +++ b/tests/00101/issues-482-test.c @@ -118,6 +118,29 @@ static void test1_func(abts_case *tc, void *data) test_ue_set_mobile_identity_suci(&test_ue, &mobile_identity_suci, 13); + memset(&test_ue.mobile_identity_imeisv, 0, + sizeof(ogs_nas_mobile_identity_imeisv_t)); + + test_ue.mobile_identity_imeisv.type = OGS_NAS_5GS_MOBILE_IDENTITY_IMEISV; + test_ue.mobile_identity_imeisv.odd_even = OGS_NAS_MOBILE_IDENTITY_EVEN; + test_ue.mobile_identity_imeisv.digit1 = 8; + test_ue.mobile_identity_imeisv.digit2 = 6; + test_ue.mobile_identity_imeisv.digit3 = 6; + test_ue.mobile_identity_imeisv.digit4 = 5; + test_ue.mobile_identity_imeisv.digit5 = 0; + test_ue.mobile_identity_imeisv.digit6 = 7; + test_ue.mobile_identity_imeisv.digit7 = 0; + test_ue.mobile_identity_imeisv.digit8 = 4; + test_ue.mobile_identity_imeisv.digit9 = 0; + test_ue.mobile_identity_imeisv.digit10 = 0; + test_ue.mobile_identity_imeisv.digit11 = 4; + test_ue.mobile_identity_imeisv.digit12 = 0; + test_ue.mobile_identity_imeisv.digit13 = 5; + test_ue.mobile_identity_imeisv.digit14 = 3; + test_ue.mobile_identity_imeisv.digit15 = 0; + test_ue.mobile_identity_imeisv.digit16 = 1; + test_ue.mobile_identity_imeisv.digit17 = 0xf; + test_ue.nas.access_type = OGS_ACCESS_TYPE_3GPP; test_ue.abba_len = 2; @@ -272,8 +295,6 @@ static void test1_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); - /* Send Registration complete */ gmmbuf = testgmm_build_registration_complete(&test_ue); ABTS_PTR_NOTNULL(tc, gmmbuf); @@ -287,7 +308,6 @@ static void test1_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); testngap_recv(&test_ue, recvbuf); -#if 0 /* Send PDU session establishment request */ gsmbuf = testgsm_build_pdu_session_establishment_request(&test_sess); ABTS_PTR_NOTNULL(tc, gsmbuf); @@ -300,6 +320,8 @@ static void test1_func(abts_case *tc, void *data) ABTS_INT_EQUAL(tc, OGS_OK, rv); /* Receive PDU session establishment accept */ + ogs_msleep(100); + recvbuf = testgnb_ngap_read(ngap); ABTS_PTR_NOTNULL(tc, recvbuf); testngap_recv(&test_ue, recvbuf); @@ -310,16 +332,12 @@ static void test1_func(abts_case *tc, void *data) rv = testgnb_gtpu_send(gtpu, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); - /* Send PDU session resource setup response */ sendbuf = testngap_build_pdu_session_resource_setup_response(&test_sess); ABTS_PTR_NOTNULL(tc, sendbuf); rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); - /* Receive GTP-U ICMP Packet */ recvbuf = testgnb_gtpu_read(gtpu); ABTS_PTR_NOTNULL(tc, recvbuf); @@ -336,7 +354,7 @@ static void test1_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); ogs_pkbuf_free(recvbuf); - ogs_msleep(50); + ogs_msleep(100); /* Send De-registration request */ gmmbuf = testgmm_build_de_registration_request(&test_ue, 1); @@ -356,9 +374,8 @@ static void test1_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, sendbuf); rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); -#endif - ogs_msleep(50); + ogs_msleep(100); /********** Remove Subscriber in Database */ doc = BCON_NEW("imsi", BCON_UTF8(test_ue.imsi)); diff --git a/tests/common/context.h b/tests/common/context.h index ebf17533e..99b0b7b78 100644 --- a/tests/common/context.h +++ b/tests/common/context.h @@ -109,6 +109,7 @@ typedef struct test_ue_s { char *supi; /* TS33.501 : SUPI */ ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + ogs_nas_mobile_identity_imeisv_t mobile_identity_imeisv; uint16_t mobile_identity_suci_length; ogs_nas_5gs_guti_t nas_guti; diff --git a/tests/common/gmm-build.c b/tests/common/gmm-build.c index bf7f51c8d..6fc46cc6e 100644 --- a/tests/common/gmm-build.c +++ b/tests/common/gmm-build.c @@ -517,17 +517,14 @@ ogs_pkbuf_t *testgmm_build_security_mode_complete( OGS_NAS_EXTENDED_PROTOCOL_DISCRIMINATOR_5GMM; message.gmm.h.message_type = OGS_NAS_5GS_SECURITY_MODE_COMPLETE; - security_mode_complete->presencemask |= - OGS_NAS_5GS_SECURITY_MODE_COMPLETE_IMEISV_PRESENT; - memset(&mobile_identity_imeisv, 0, sizeof(mobile_identity_imeisv)); - imeisv->length = sizeof(mobile_identity_imeisv); - imeisv->buffer = &mobile_identity_imeisv; - - mobile_identity_imeisv.type = OGS_NAS_5GS_MOBILE_IDENTITY_IMEISV; - mobile_identity_imeisv.odd_even = OGS_NAS_MOBILE_IDENTITY_EVEN; - mobile_identity_imeisv.digit1 = 1; - mobile_identity_imeisv.digit2 = 1; - mobile_identity_imeisv.digit3 = 1; + if (test_ue->mobile_identity_imeisv.type == + OGS_NAS_5GS_MOBILE_IDENTITY_IMEISV) { + security_mode_complete->presencemask |= + OGS_NAS_5GS_SECURITY_MODE_COMPLETE_IMEISV_PRESENT; + memset(&mobile_identity_imeisv, 0, sizeof(mobile_identity_imeisv)); + imeisv->length = sizeof(mobile_identity_imeisv); + imeisv->buffer = &test_ue->mobile_identity_imeisv; + } if (nasbuf) { security_mode_complete->presencemask |= diff --git a/tests/common/ngap-build.c b/tests/common/ngap-build.c index d912ad277..d303b183f 100644 --- a/tests/common/ngap-build.c +++ b/tests/common/ngap-build.c @@ -137,7 +137,7 @@ ogs_pkbuf_t *testngap_build_ng_setup_request(uint32_t gnb_id, uint8_t bitsize) sd.v = s_nssai->sd.v; if (sd.v == OGS_S_NSSAI_NO_SD_VALUE) sd.v = 0x010000; - SliceSupportItem->s_NSSAI.sD = CALLOC(1, sizeof(ogs_uint24_t)); + SliceSupportItem->s_NSSAI.sD = CALLOC(1, sizeof(NGAP_SD_t)); ogs_asn_uint24_to_OCTET_STRING(sd, SliceSupportItem->s_NSSAI.sD); ASN_SEQUENCE_ADD(&BroadcastPLMNItem->tAISliceSupportList.list, @@ -696,7 +696,7 @@ ogs_pkbuf_t *testngap_build_ue_context_release_request(test_ue_t *test_ue, PDUSessionList = &ie->value.choice.PDUSessionResourceListCxtRelReq; PDUSessionItem = - CALLOC(1, sizeof(struct NGAP_PDUSessionResourceSetupItemSURes)); + CALLOC(1, sizeof(struct NGAP_PDUSessionResourceItemCxtRelReq)); ASN_SEQUENCE_ADD(&PDUSessionList->list, PDUSessionItem); sess = test_ue->sess; diff --git a/tests/minimal/minimal-test.c b/tests/minimal/minimal-test.c index 8d25ec8ff..a016aaf88 100644 --- a/tests/minimal/minimal-test.c +++ b/tests/minimal/minimal-test.c @@ -118,6 +118,14 @@ static void test1_func(abts_case *tc, void *data) test_ue_set_mobile_identity_suci(&test_ue, &mobile_identity_suci, 12); + memset(&test_ue.mobile_identity_imeisv, 0, + sizeof(ogs_nas_mobile_identity_imeisv_t)); + test_ue.mobile_identity_imeisv.type = OGS_NAS_5GS_MOBILE_IDENTITY_IMEISV; + test_ue.mobile_identity_imeisv.odd_even = OGS_NAS_MOBILE_IDENTITY_EVEN; + test_ue.mobile_identity_imeisv.digit1 = 1; + test_ue.mobile_identity_imeisv.digit2 = 1; + test_ue.mobile_identity_imeisv.digit3 = 1; + test_ue.nas.access_type = OGS_ACCESS_TYPE_3GPP; test_ue.abba_len = 2; @@ -292,6 +300,8 @@ static void test1_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); ogs_pkbuf_free(recvbuf); + ogs_msleep(100); + /********** Remove Subscriber in Database */ doc = BCON_NEW("imsi", BCON_UTF8(test_ue.imsi)); ABTS_PTR_NOTNULL(tc, doc); diff --git a/tests/registration/auth-test.c b/tests/registration/auth-test.c index 45e17ce60..233c5a8f8 100644 --- a/tests/registration/auth-test.c +++ b/tests/registration/auth-test.c @@ -118,6 +118,28 @@ static void test1_func(abts_case *tc, void *data) test_ue_set_mobile_identity_suci(&test_ue, &mobile_identity_suci, 13); + memset(&test_ue.mobile_identity_imeisv, 0, + sizeof(ogs_nas_mobile_identity_imeisv_t)); + test_ue.mobile_identity_imeisv.type = OGS_NAS_5GS_MOBILE_IDENTITY_IMEISV; + test_ue.mobile_identity_imeisv.odd_even = OGS_NAS_MOBILE_IDENTITY_EVEN; + test_ue.mobile_identity_imeisv.digit1 = 8; + test_ue.mobile_identity_imeisv.digit2 = 6; + test_ue.mobile_identity_imeisv.digit3 = 6; + test_ue.mobile_identity_imeisv.digit4 = 5; + test_ue.mobile_identity_imeisv.digit5 = 0; + test_ue.mobile_identity_imeisv.digit6 = 7; + test_ue.mobile_identity_imeisv.digit7 = 0; + test_ue.mobile_identity_imeisv.digit8 = 4; + test_ue.mobile_identity_imeisv.digit9 = 0; + test_ue.mobile_identity_imeisv.digit10 = 0; + test_ue.mobile_identity_imeisv.digit11 = 4; + test_ue.mobile_identity_imeisv.digit12 = 0; + test_ue.mobile_identity_imeisv.digit13 = 5; + test_ue.mobile_identity_imeisv.digit14 = 3; + test_ue.mobile_identity_imeisv.digit15 = 0; + test_ue.mobile_identity_imeisv.digit16 = 1; + test_ue.mobile_identity_imeisv.digit17 = 0xf; + test_ue.nas.access_type = OGS_ACCESS_TYPE_3GPP; test_ue.abba_len = 2; @@ -234,7 +256,7 @@ static void test1_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); + ogs_msleep(100); /********** Remove Subscriber in Database */ doc = BCON_NEW("imsi", BCON_UTF8(test_ue.imsi)); diff --git a/tests/registration/dereg-test.c b/tests/registration/dereg-test.c index 5396898f8..dc23d1330 100644 --- a/tests/registration/dereg-test.c +++ b/tests/registration/dereg-test.c @@ -118,6 +118,28 @@ static void test1_func(abts_case *tc, void *data) test_ue_set_mobile_identity_suci(&test_ue, &mobile_identity_suci, 13); + memset(&test_ue.mobile_identity_imeisv, 0, + sizeof(ogs_nas_mobile_identity_imeisv_t)); + test_ue.mobile_identity_imeisv.type = OGS_NAS_5GS_MOBILE_IDENTITY_IMEISV; + test_ue.mobile_identity_imeisv.odd_even = OGS_NAS_MOBILE_IDENTITY_EVEN; + test_ue.mobile_identity_imeisv.digit1 = 8; + test_ue.mobile_identity_imeisv.digit2 = 6; + test_ue.mobile_identity_imeisv.digit3 = 6; + test_ue.mobile_identity_imeisv.digit4 = 5; + test_ue.mobile_identity_imeisv.digit5 = 0; + test_ue.mobile_identity_imeisv.digit6 = 7; + test_ue.mobile_identity_imeisv.digit7 = 0; + test_ue.mobile_identity_imeisv.digit8 = 4; + test_ue.mobile_identity_imeisv.digit9 = 0; + test_ue.mobile_identity_imeisv.digit10 = 0; + test_ue.mobile_identity_imeisv.digit11 = 4; + test_ue.mobile_identity_imeisv.digit12 = 0; + test_ue.mobile_identity_imeisv.digit13 = 5; + test_ue.mobile_identity_imeisv.digit14 = 3; + test_ue.mobile_identity_imeisv.digit15 = 0; + test_ue.mobile_identity_imeisv.digit16 = 1; + test_ue.mobile_identity_imeisv.digit17 = 0xf; + test_ue.nas.access_type = OGS_ACCESS_TYPE_3GPP; test_ue.abba_len = 2; @@ -240,7 +262,7 @@ static void test1_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); + ogs_msleep(100); /* Send Registration complete */ gmmbuf = testgmm_build_registration_complete(&test_ue); @@ -277,16 +299,14 @@ static void test1_func(abts_case *tc, void *data) rv = testgnb_gtpu_send(gtpu, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); - /* Send PDU session resource setup response */ + ogs_msleep(100); + sendbuf = testngap_build_pdu_session_resource_setup_response(&test_sess); ABTS_PTR_NOTNULL(tc, sendbuf); rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); - /* Receive GTP-U ICMP Packet */ recvbuf = testgnb_gtpu_read(gtpu); ABTS_PTR_NOTNULL(tc, recvbuf); @@ -303,7 +323,7 @@ static void test1_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); ogs_pkbuf_free(recvbuf); - ogs_msleep(50); + ogs_msleep(100); /* Send De-registration request */ gmmbuf = testgmm_build_de_registration_request(&test_ue, 1); @@ -324,7 +344,7 @@ static void test1_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); + ogs_msleep(100); /********** Remove Subscriber in Database */ doc = BCON_NEW("imsi", BCON_UTF8(test_ue.imsi)); diff --git a/tests/registration/gmm-status-test.c b/tests/registration/gmm-status-test.c index dd9349c4a..0d0696b37 100644 --- a/tests/registration/gmm-status-test.c +++ b/tests/registration/gmm-status-test.c @@ -118,6 +118,28 @@ static void test1_func(abts_case *tc, void *data) test_ue_set_mobile_identity_suci(&test_ue, &mobile_identity_suci, 13); + memset(&test_ue.mobile_identity_imeisv, 0, + sizeof(ogs_nas_mobile_identity_imeisv_t)); + test_ue.mobile_identity_imeisv.type = OGS_NAS_5GS_MOBILE_IDENTITY_IMEISV; + test_ue.mobile_identity_imeisv.odd_even = OGS_NAS_MOBILE_IDENTITY_EVEN; + test_ue.mobile_identity_imeisv.digit1 = 8; + test_ue.mobile_identity_imeisv.digit2 = 6; + test_ue.mobile_identity_imeisv.digit3 = 6; + test_ue.mobile_identity_imeisv.digit4 = 5; + test_ue.mobile_identity_imeisv.digit5 = 0; + test_ue.mobile_identity_imeisv.digit6 = 7; + test_ue.mobile_identity_imeisv.digit7 = 0; + test_ue.mobile_identity_imeisv.digit8 = 4; + test_ue.mobile_identity_imeisv.digit9 = 0; + test_ue.mobile_identity_imeisv.digit10 = 0; + test_ue.mobile_identity_imeisv.digit11 = 4; + test_ue.mobile_identity_imeisv.digit12 = 0; + test_ue.mobile_identity_imeisv.digit13 = 5; + test_ue.mobile_identity_imeisv.digit14 = 3; + test_ue.mobile_identity_imeisv.digit15 = 0; + test_ue.mobile_identity_imeisv.digit16 = 1; + test_ue.mobile_identity_imeisv.digit17 = 0xf; + test_ue.nas.access_type = OGS_ACCESS_TYPE_3GPP; test_ue.abba_len = 2; @@ -264,6 +286,8 @@ static void test1_func(abts_case *tc, void *data) testngap_recv(&test_ue, recvbuf); /* Send GMM Status */ + ogs_msleep(100); + gmmbuf = testgmm_build_gmm_status(&test_ue, OGS_5GMM_CAUSE_MESSAGE_NOT_COMPATIBLE_WITH_THE_PROTOCOL_STATE); ABTS_PTR_NOTNULL(tc, gmmbuf); @@ -283,7 +307,7 @@ static void test1_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); + ogs_msleep(100); /********** Remove Subscriber in Database */ doc = BCON_NEW("imsi", BCON_UTF8(test_ue.imsi)); diff --git a/tests/registration/guti-test.c b/tests/registration/guti-test.c index ffbb875c2..ea50d65cc 100644 --- a/tests/registration/guti-test.c +++ b/tests/registration/guti-test.c @@ -118,6 +118,28 @@ static void test1_func(abts_case *tc, void *data) test_ue_set_mobile_identity_suci(&test_ue, &mobile_identity_suci, 13); + memset(&test_ue.mobile_identity_imeisv, 0, + sizeof(ogs_nas_mobile_identity_imeisv_t)); + test_ue.mobile_identity_imeisv.type = OGS_NAS_5GS_MOBILE_IDENTITY_IMEISV; + test_ue.mobile_identity_imeisv.odd_even = OGS_NAS_MOBILE_IDENTITY_EVEN; + test_ue.mobile_identity_imeisv.digit1 = 8; + test_ue.mobile_identity_imeisv.digit2 = 6; + test_ue.mobile_identity_imeisv.digit3 = 6; + test_ue.mobile_identity_imeisv.digit4 = 5; + test_ue.mobile_identity_imeisv.digit5 = 0; + test_ue.mobile_identity_imeisv.digit6 = 7; + test_ue.mobile_identity_imeisv.digit7 = 0; + test_ue.mobile_identity_imeisv.digit8 = 4; + test_ue.mobile_identity_imeisv.digit9 = 0; + test_ue.mobile_identity_imeisv.digit10 = 0; + test_ue.mobile_identity_imeisv.digit11 = 4; + test_ue.mobile_identity_imeisv.digit12 = 0; + test_ue.mobile_identity_imeisv.digit13 = 5; + test_ue.mobile_identity_imeisv.digit14 = 3; + test_ue.mobile_identity_imeisv.digit15 = 0; + test_ue.mobile_identity_imeisv.digit16 = 1; + test_ue.mobile_identity_imeisv.digit17 = 0xf; + test_ue.nas.access_type = OGS_ACCESS_TYPE_3GPP; test_ue.abba_len = 2; @@ -254,8 +276,6 @@ static void test1_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); - /* Send Registration complete */ gmmbuf = testgmm_build_registration_complete(&test_ue); ABTS_PTR_NOTNULL(tc, gmmbuf); @@ -285,14 +305,14 @@ static void test1_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); testngap_recv(&test_ue, recvbuf); + ogs_msleep(100); + /* Send GTP-U ICMP Packet */ rv = test_gtpu_build_ping(&sendbuf, &test_sess, "10.45.0.1"); ABTS_INT_EQUAL(tc, OGS_OK, rv); rv = testgnb_gtpu_send(gtpu, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); - /* Send PDU session resource setup response */ sendbuf = testngap_build_pdu_session_resource_setup_response(&test_sess); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -315,12 +335,12 @@ static void test1_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); ogs_pkbuf_free(recvbuf); + ogs_msleep(100); + /* Update Registration request type */ test_ue.nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_MOBILITY_UPDATING; - ogs_msleep(50); - /* Send Registration request : Uplink Data Status */ test_ue.registration_request_type.integrity_protected = 0; test_ue.registration_request_type.uplink_data_status = 1; @@ -352,8 +372,6 @@ static void test1_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); - /* Send GTP-U ICMP Packet */ rv = test_gtpu_build_ping(&sendbuf, &test_sess, "10.45.0.1"); ABTS_INT_EQUAL(tc, OGS_OK, rv); @@ -365,7 +383,7 @@ static void test1_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); ogs_pkbuf_free(recvbuf); - ogs_msleep(50); + ogs_msleep(100); /* Update Registration request type */ test_ue.nas.registration.value = @@ -436,8 +454,6 @@ static void test1_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); - /* Send Registration complete */ gmmbuf = testgmm_build_registration_complete(&test_ue); ABTS_PTR_NOTNULL(tc, gmmbuf); @@ -467,7 +483,7 @@ static void test1_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); testngap_recv(&test_ue, recvbuf); - ogs_msleep(50); + ogs_msleep(100); /* Send PDU session resource setup response */ sendbuf = testngap_build_pdu_session_resource_setup_response(&test_sess); @@ -475,8 +491,6 @@ static void test1_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); - /* Send GTP-U ICMP Packet */ rv = test_gtpu_build_ping(&sendbuf, &test_sess, "10.45.0.1"); ABTS_INT_EQUAL(tc, OGS_OK, rv); @@ -488,7 +502,7 @@ static void test1_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); ogs_pkbuf_free(recvbuf); - ogs_msleep(50); + ogs_msleep(100); /********** Remove Subscriber in Database */ doc = BCON_NEW("imsi", BCON_UTF8(test_ue.imsi)); diff --git a/tests/registration/identity-test.c b/tests/registration/identity-test.c index efb67ae6d..6710f53c0 100644 --- a/tests/registration/identity-test.c +++ b/tests/registration/identity-test.c @@ -118,6 +118,28 @@ static void test1_func(abts_case *tc, void *data) test_ue_set_mobile_identity_suci(&test_ue, &mobile_identity_suci, 13); + memset(&test_ue.mobile_identity_imeisv, 0, + sizeof(ogs_nas_mobile_identity_imeisv_t)); + test_ue.mobile_identity_imeisv.type = OGS_NAS_5GS_MOBILE_IDENTITY_IMEISV; + test_ue.mobile_identity_imeisv.odd_even = OGS_NAS_MOBILE_IDENTITY_EVEN; + test_ue.mobile_identity_imeisv.digit1 = 8; + test_ue.mobile_identity_imeisv.digit2 = 6; + test_ue.mobile_identity_imeisv.digit3 = 6; + test_ue.mobile_identity_imeisv.digit4 = 5; + test_ue.mobile_identity_imeisv.digit5 = 0; + test_ue.mobile_identity_imeisv.digit6 = 7; + test_ue.mobile_identity_imeisv.digit7 = 0; + test_ue.mobile_identity_imeisv.digit8 = 4; + test_ue.mobile_identity_imeisv.digit9 = 0; + test_ue.mobile_identity_imeisv.digit10 = 0; + test_ue.mobile_identity_imeisv.digit11 = 4; + test_ue.mobile_identity_imeisv.digit12 = 0; + test_ue.mobile_identity_imeisv.digit13 = 5; + test_ue.mobile_identity_imeisv.digit14 = 3; + test_ue.mobile_identity_imeisv.digit15 = 0; + test_ue.mobile_identity_imeisv.digit16 = 1; + test_ue.mobile_identity_imeisv.digit17 = 0xf; + test_ue.nas.access_type = OGS_ACCESS_TYPE_3GPP; test_ue.abba_len = 2; @@ -240,8 +262,6 @@ static void test1_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); - /* Send Registration complete */ gmmbuf = testgmm_build_registration_complete(&test_ue); ABTS_PTR_NOTNULL(tc, gmmbuf); @@ -272,17 +292,19 @@ static void test1_func(abts_case *tc, void *data) testngap_recv(&test_ue, recvbuf); /* Send PDU session resource setup response */ + ogs_msleep(100); + sendbuf = testngap_build_pdu_session_resource_setup_response(&test_sess); ABTS_PTR_NOTNULL(tc, sendbuf); rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); + ogs_msleep(100); + /* Update Registration request type */ test_ue.nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_MOBILITY_UPDATING; - ogs_msleep(50); - /* Send Registration request */ test_ue.registration_request_type.integrity_protected = 1; test_ue.registration_request_type.guti = 1; @@ -307,9 +329,9 @@ static void test1_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); - /* Send De-registration request */ + ogs_msleep(100); + gmmbuf = testgmm_build_de_registration_request(&test_ue, 1); ABTS_PTR_NOTNULL(tc, gmmbuf); sendbuf = testngap_build_uplink_nas_transport(&test_ue, gmmbuf); @@ -328,7 +350,7 @@ static void test1_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); + ogs_msleep(100); /* Update Registration request type */ test_ue.nas.registration.value = @@ -373,7 +395,7 @@ static void test1_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); + ogs_msleep(100); /********** Remove Subscriber in Database */ doc = BCON_NEW("imsi", BCON_UTF8(test_ue.imsi)); diff --git a/tests/registration/idle-test.c b/tests/registration/idle-test.c index 85c586eb1..32d8f622e 100644 --- a/tests/registration/idle-test.c +++ b/tests/registration/idle-test.c @@ -118,6 +118,28 @@ static void test1_func(abts_case *tc, void *data) test_ue_set_mobile_identity_suci(&test_ue, &mobile_identity_suci, 13); + memset(&test_ue.mobile_identity_imeisv, 0, + sizeof(ogs_nas_mobile_identity_imeisv_t)); + test_ue.mobile_identity_imeisv.type = OGS_NAS_5GS_MOBILE_IDENTITY_IMEISV; + test_ue.mobile_identity_imeisv.odd_even = OGS_NAS_MOBILE_IDENTITY_EVEN; + test_ue.mobile_identity_imeisv.digit1 = 8; + test_ue.mobile_identity_imeisv.digit2 = 6; + test_ue.mobile_identity_imeisv.digit3 = 6; + test_ue.mobile_identity_imeisv.digit4 = 5; + test_ue.mobile_identity_imeisv.digit5 = 0; + test_ue.mobile_identity_imeisv.digit6 = 7; + test_ue.mobile_identity_imeisv.digit7 = 0; + test_ue.mobile_identity_imeisv.digit8 = 4; + test_ue.mobile_identity_imeisv.digit9 = 0; + test_ue.mobile_identity_imeisv.digit10 = 0; + test_ue.mobile_identity_imeisv.digit11 = 4; + test_ue.mobile_identity_imeisv.digit12 = 0; + test_ue.mobile_identity_imeisv.digit13 = 5; + test_ue.mobile_identity_imeisv.digit14 = 3; + test_ue.mobile_identity_imeisv.digit15 = 0; + test_ue.mobile_identity_imeisv.digit16 = 1; + test_ue.mobile_identity_imeisv.digit17 = 0xf; + test_ue.nas.access_type = OGS_ACCESS_TYPE_3GPP; test_ue.abba_len = 2; @@ -240,8 +262,6 @@ static void test1_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); - /* Send Registration complete */ gmmbuf = testgmm_build_registration_complete(&test_ue); ABTS_PTR_NOTNULL(tc, gmmbuf); @@ -277,9 +297,9 @@ static void test1_func(abts_case *tc, void *data) rv = testgnb_gtpu_send(gtpu, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); - /* Send PDU session resource setup response */ + ogs_msleep(100); + sendbuf = testngap_build_pdu_session_resource_setup_response(&test_sess); ABTS_PTR_NOTNULL(tc, sendbuf); rv = testgnb_ngap_send(ngap, sendbuf); @@ -301,7 +321,7 @@ static void test1_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); ogs_pkbuf_free(recvbuf); - ogs_msleep(50); + ogs_msleep(100); /* Send UE context release request */ sendbuf = testngap_build_ue_context_release_request(&test_ue, @@ -379,7 +399,7 @@ static void test1_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); ogs_pkbuf_free(recvbuf); - ogs_msleep(50); + ogs_msleep(100); /* Send UE context release request */ sendbuf = testngap_build_ue_context_release_request(&test_ue, @@ -461,7 +481,7 @@ static void test1_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); ogs_pkbuf_free(recvbuf); - ogs_msleep(50); + ogs_msleep(100); /********** Remove Subscriber in Database */ doc = BCON_NEW("imsi", BCON_UTF8(test_ue.imsi)); @@ -581,6 +601,28 @@ static void test2_func(abts_case *tc, void *data) test_ue_set_mobile_identity_suci(&test_ue, &mobile_identity_suci, 13); + memset(&test_ue.mobile_identity_imeisv, 0, + sizeof(ogs_nas_mobile_identity_imeisv_t)); + test_ue.mobile_identity_imeisv.type = OGS_NAS_5GS_MOBILE_IDENTITY_IMEISV; + test_ue.mobile_identity_imeisv.odd_even = OGS_NAS_MOBILE_IDENTITY_EVEN; + test_ue.mobile_identity_imeisv.digit1 = 8; + test_ue.mobile_identity_imeisv.digit2 = 6; + test_ue.mobile_identity_imeisv.digit3 = 6; + test_ue.mobile_identity_imeisv.digit4 = 5; + test_ue.mobile_identity_imeisv.digit5 = 0; + test_ue.mobile_identity_imeisv.digit6 = 7; + test_ue.mobile_identity_imeisv.digit7 = 0; + test_ue.mobile_identity_imeisv.digit8 = 4; + test_ue.mobile_identity_imeisv.digit9 = 0; + test_ue.mobile_identity_imeisv.digit10 = 0; + test_ue.mobile_identity_imeisv.digit11 = 4; + test_ue.mobile_identity_imeisv.digit12 = 0; + test_ue.mobile_identity_imeisv.digit13 = 5; + test_ue.mobile_identity_imeisv.digit14 = 3; + test_ue.mobile_identity_imeisv.digit15 = 0; + test_ue.mobile_identity_imeisv.digit16 = 1; + test_ue.mobile_identity_imeisv.digit17 = 0xf; + test_ue.nas.access_type = OGS_ACCESS_TYPE_3GPP; test_ue.abba_len = 2; @@ -703,7 +745,7 @@ static void test2_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); + ogs_msleep(100); /* Send Registration complete */ gmmbuf = testgmm_build_registration_complete(&test_ue); @@ -737,7 +779,7 @@ static void test2_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); + ogs_msleep(100); /* * Send Service request Using InitialUEMessage @@ -770,7 +812,7 @@ static void test2_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); + ogs_msleep(100); /********** Remove Subscriber in Database */ doc = BCON_NEW("imsi", BCON_UTF8(test_ue.imsi)); @@ -890,6 +932,28 @@ static void test3_func(abts_case *tc, void *data) test_ue_set_mobile_identity_suci(&test_ue, &mobile_identity_suci, 13); + memset(&test_ue.mobile_identity_imeisv, 0, + sizeof(ogs_nas_mobile_identity_imeisv_t)); + test_ue.mobile_identity_imeisv.type = OGS_NAS_5GS_MOBILE_IDENTITY_IMEISV; + test_ue.mobile_identity_imeisv.odd_even = OGS_NAS_MOBILE_IDENTITY_EVEN; + test_ue.mobile_identity_imeisv.digit1 = 8; + test_ue.mobile_identity_imeisv.digit2 = 6; + test_ue.mobile_identity_imeisv.digit3 = 6; + test_ue.mobile_identity_imeisv.digit4 = 5; + test_ue.mobile_identity_imeisv.digit5 = 0; + test_ue.mobile_identity_imeisv.digit6 = 7; + test_ue.mobile_identity_imeisv.digit7 = 0; + test_ue.mobile_identity_imeisv.digit8 = 4; + test_ue.mobile_identity_imeisv.digit9 = 0; + test_ue.mobile_identity_imeisv.digit10 = 0; + test_ue.mobile_identity_imeisv.digit11 = 4; + test_ue.mobile_identity_imeisv.digit12 = 0; + test_ue.mobile_identity_imeisv.digit13 = 5; + test_ue.mobile_identity_imeisv.digit14 = 3; + test_ue.mobile_identity_imeisv.digit15 = 0; + test_ue.mobile_identity_imeisv.digit16 = 1; + test_ue.mobile_identity_imeisv.digit17 = 0xf; + test_ue.nas.access_type = OGS_ACCESS_TYPE_3GPP; test_ue.abba_len = 2; @@ -1012,7 +1076,7 @@ static void test3_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); + ogs_msleep(100); /* Send Registration complete */ gmmbuf = testgmm_build_registration_complete(&test_ue); @@ -1049,9 +1113,9 @@ static void test3_func(abts_case *tc, void *data) rv = testgnb_gtpu_send(gtpu, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); - /* Send PDU session resource setup response */ + ogs_msleep(100); + sendbuf = testngap_build_pdu_session_resource_setup_response(&test_sess); ABTS_PTR_NOTNULL(tc, sendbuf); rv = testgnb_ngap_send(ngap, sendbuf); @@ -1073,7 +1137,7 @@ static void test3_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); ogs_pkbuf_free(recvbuf); - ogs_msleep(50); + ogs_msleep(100); /* * Send Service request Using InitialUEMessage @@ -1160,7 +1224,7 @@ static void test3_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); ogs_pkbuf_free(recvbuf); - ogs_msleep(50); + ogs_msleep(100); /********** Remove Subscriber in Database */ doc = BCON_NEW("imsi", BCON_UTF8(test_ue.imsi)); @@ -1284,6 +1348,28 @@ static void test4_func(abts_case *tc, void *data) test_ue_set_mobile_identity_suci(&test_ue, &mobile_identity_suci, 13); + memset(&test_ue.mobile_identity_imeisv, 0, + sizeof(ogs_nas_mobile_identity_imeisv_t)); + test_ue.mobile_identity_imeisv.type = OGS_NAS_5GS_MOBILE_IDENTITY_IMEISV; + test_ue.mobile_identity_imeisv.odd_even = OGS_NAS_MOBILE_IDENTITY_EVEN; + test_ue.mobile_identity_imeisv.digit1 = 8; + test_ue.mobile_identity_imeisv.digit2 = 6; + test_ue.mobile_identity_imeisv.digit3 = 6; + test_ue.mobile_identity_imeisv.digit4 = 5; + test_ue.mobile_identity_imeisv.digit5 = 0; + test_ue.mobile_identity_imeisv.digit6 = 7; + test_ue.mobile_identity_imeisv.digit7 = 0; + test_ue.mobile_identity_imeisv.digit8 = 4; + test_ue.mobile_identity_imeisv.digit9 = 0; + test_ue.mobile_identity_imeisv.digit10 = 0; + test_ue.mobile_identity_imeisv.digit11 = 4; + test_ue.mobile_identity_imeisv.digit12 = 0; + test_ue.mobile_identity_imeisv.digit13 = 5; + test_ue.mobile_identity_imeisv.digit14 = 3; + test_ue.mobile_identity_imeisv.digit15 = 0; + test_ue.mobile_identity_imeisv.digit16 = 1; + test_ue.mobile_identity_imeisv.digit17 = 0xf; + test_ue.nas.access_type = OGS_ACCESS_TYPE_3GPP; test_ue.abba_len = 2; @@ -1420,7 +1506,7 @@ static void test4_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); + ogs_msleep(100); /* Send Registration complete */ gmmbuf = testgmm_build_registration_complete(&test_ue); @@ -1454,7 +1540,7 @@ static void test4_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); + ogs_msleep(100); /* * Send Service request Using InitialUEMessage @@ -1504,13 +1590,13 @@ static void test4_func(abts_case *tc, void *data) testngap_recv(&test_ue, recvbuf); /* Send PDU session resource setup response */ + ogs_msleep(100); + sendbuf = testngap_build_pdu_session_resource_setup_response(&test_sess); ABTS_PTR_NOTNULL(tc, sendbuf); rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); - /* Send GTP-U ICMP Packet */ rv = test_gtpu_build_ping(&sendbuf, &test_sess, "10.45.0.1"); ABTS_INT_EQUAL(tc, OGS_OK, rv); @@ -1522,7 +1608,7 @@ static void test4_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); ogs_pkbuf_free(recvbuf); - ogs_msleep(50); + ogs_msleep(100); /* * Send Service request Using InitialUEMessage @@ -1564,7 +1650,7 @@ static void test4_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); + ogs_msleep(100); /* Send GTP-U ICMP Packet */ rv = test_gtpu_build_ping(&sendbuf, &test_sess, "10.45.0.1"); @@ -1577,7 +1663,7 @@ static void test4_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); ogs_pkbuf_free(recvbuf); - for (i = 0; i < 5; i++) { + for (i = 0; i < 200; i++) { /* * Send Service request Using UplinkNASTransport * - Uplink Data Status @@ -1620,12 +1706,12 @@ static void test4_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); testngap_recv(&test_ue, recvbuf); - ogs_msleep(50); + ogs_msleep(100); test_ue.ran_ue_ngap_id = ran_ue_ngap_id; test_ue.amf_ue_ngap_id = amf_ue_ngap_id; - for (i = 0; i < 5; i++) { + for (i = 0; i < 200; i++) { /* * Send Service request Using UplinkNASTransport * - Uplink Data Status @@ -1669,7 +1755,7 @@ static void test4_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); + ogs_msleep(100); /********** Remove Subscriber in Database */ doc = BCON_NEW("imsi", BCON_UTF8(test_ue.imsi)); diff --git a/tests/registration/ue-context-test.c b/tests/registration/ue-context-test.c index fd9a8bafd..dbe9c00a0 100644 --- a/tests/registration/ue-context-test.c +++ b/tests/registration/ue-context-test.c @@ -118,6 +118,28 @@ static void test1_func(abts_case *tc, void *data) test_ue_set_mobile_identity_suci(&test_ue, &mobile_identity_suci, 13); + memset(&test_ue.mobile_identity_imeisv, 0, + sizeof(ogs_nas_mobile_identity_imeisv_t)); + test_ue.mobile_identity_imeisv.type = OGS_NAS_5GS_MOBILE_IDENTITY_IMEISV; + test_ue.mobile_identity_imeisv.odd_even = OGS_NAS_MOBILE_IDENTITY_EVEN; + test_ue.mobile_identity_imeisv.digit1 = 8; + test_ue.mobile_identity_imeisv.digit2 = 6; + test_ue.mobile_identity_imeisv.digit3 = 6; + test_ue.mobile_identity_imeisv.digit4 = 5; + test_ue.mobile_identity_imeisv.digit5 = 0; + test_ue.mobile_identity_imeisv.digit6 = 7; + test_ue.mobile_identity_imeisv.digit7 = 0; + test_ue.mobile_identity_imeisv.digit8 = 4; + test_ue.mobile_identity_imeisv.digit9 = 0; + test_ue.mobile_identity_imeisv.digit10 = 0; + test_ue.mobile_identity_imeisv.digit11 = 4; + test_ue.mobile_identity_imeisv.digit12 = 0; + test_ue.mobile_identity_imeisv.digit13 = 5; + test_ue.mobile_identity_imeisv.digit14 = 3; + test_ue.mobile_identity_imeisv.digit15 = 0; + test_ue.mobile_identity_imeisv.digit16 = 1; + test_ue.mobile_identity_imeisv.digit17 = 0xf; + test_ue.nas.access_type = OGS_ACCESS_TYPE_3GPP; test_ue.abba_len = 2; @@ -246,7 +268,7 @@ static void test1_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); - ogs_msleep(50); + ogs_msleep(100); /********** Remove Subscriber in Database */ doc = BCON_NEW("imsi", BCON_UTF8(test_ue.imsi));