diff --git a/openair3/TEST/EPC_TEST/play_scenario.h b/openair3/TEST/EPC_TEST/play_scenario.h index d5f11e40f9dfd9d74042ae7152c794e5008af7d2..604d0000bccc26143c707b82e7581b527c53ebe0 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.h +++ b/openair3/TEST/EPC_TEST/play_scenario.h @@ -173,7 +173,8 @@ typedef enum { ET_FSM_STATE_START = 0, ET_FSM_STATE_NULL = ET_FSM_STATE_START, ET_FSM_STATE_CONNECTING_S1C, - ET_FSM_STATE_WAITING_EVENT, + ET_FSM_STATE_WAITING_RX_EVENT, + ET_FSM_STATE_WAITING_TX_EVENT, ET_FSM_STATE_RUNNING, ET_FSM_STATE_END } et_fsm_state_t; @@ -359,6 +360,7 @@ typedef enum { ET_EVENT_RX_S1AP, ET_EVENT_RX_PACKET_TIME_OUT, ET_EVENT_TX_TIMED_PACKET, + ET_EVENT_TICK, ET_EVENT_END } et_event_code_t; @@ -413,10 +415,10 @@ void et_s1ap_eNB_insert_new_instance(s1ap_eNB_instance_t *new_instance_p); struct s1ap_eNB_mme_data_s *et_s1ap_eNB_get_MME(s1ap_eNB_instance_t *instance_p,int32_t assoc_id, uint16_t cnx_id); s1ap_eNB_instance_t *et_s1ap_eNB_get_instance(instance_t instance); void et_s1ap_eNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uint8_t *buffer,uint32_t buffer_length, uint16_t stream); -int et_s1ap_is_matching(et_s1ap_t * const s1ap1, et_s1ap_t * const s1ap2, const uint32_t constraints); +long et_s1ap_is_matching(et_s1ap_t * const s1ap1, et_s1ap_t * const s1ap2, const uint32_t constraints); et_packet_t* et_build_packet_from_s1ap_data_ind(et_event_s1ap_data_ind_t * const s1ap_data_ind); -void et_scenario_set_packet_received(et_packet_t * const packet); -void et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const sctp_data_ind); +int et_scenario_set_packet_received(et_packet_t * const packet); +int et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const sctp_data_ind); void et_s1ap_eNB_handle_sctp_data_ind(sctp_data_ind_t * const sctp_data_ind); void et_s1ap_eNB_register_mme(s1ap_eNB_instance_t *instance_p, net_ip_address_t *mme_ip_address, @@ -435,7 +437,8 @@ int et_generate_xml_scenario( char const * tsml_out_scenario_filename); //------------------------- et_fsm_state_t et_scenario_fsm_notify_event_state_running(et_event_t event); -et_fsm_state_t et_scenario_fsm_notify_event_state_waiting(et_event_t event); +et_fsm_state_t et_scenario_fsm_notify_event_state_waiting_tx(et_event_t event); +et_fsm_state_t et_scenario_fsm_notify_event_state_waiting_rx(et_event_t event); et_fsm_state_t et_scenario_fsm_notify_event_state_connecting_s1c(et_event_t event); et_fsm_state_t et_scenario_fsm_notify_event_state_null(et_event_t event); et_fsm_state_t et_scenario_fsm_notify_event(et_event_t event); @@ -448,10 +451,10 @@ void et_parse_sctp(xmlDocPtr doc, const xmlNode const *sctp_node, et_sctp_hdr_t et_packet_t* et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node); et_scenario_t* et_generate_scenario(const char * const et_scenario_filename ); //------------------------- -int et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, s1ap_message * const m2, const uint32_t constraints); +long et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, s1ap_message * const m2, const uint32_t constraints); //------------------------- -int et_sctp_data_is_matching(sctp_datahdr_t * const sctp1, sctp_datahdr_t * const sctp2, const uint32_t constraints); -int et_sctp_is_matching(et_sctp_hdr_t * const sctp1, et_sctp_hdr_t * const sctp2, const uint32_t constraints); +long et_sctp_data_is_matching(sctp_datahdr_t * const sctp1, sctp_datahdr_t * const sctp2, const uint32_t constraints); +long et_sctp_is_matching(et_sctp_hdr_t * const sctp1, et_sctp_hdr_t * const sctp2, const uint32_t constraints); //------------------------------------------------------------------------------ void et_print_hex_octets(const unsigned char * const byte_stream, const unsigned long int num); int et_is_file_exists ( const char const * file_nameP, const char const *file_roleP); diff --git a/openair3/TEST/EPC_TEST/play_scenario_fsm.c b/openair3/TEST/EPC_TEST/play_scenario_fsm.c index d561668b17b74b69482112239f9e1ae432873a3a..b6ff0de85916b0e18eb638ac83ce95756ad27586 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_fsm.c +++ b/openair3/TEST/EPC_TEST/play_scenario_fsm.c @@ -87,7 +87,7 @@ void et_scenario_wait_rx_packet(et_packet_t * const packet) NULL, &packet->timer_id) < 0) { AssertFatal(0, " Can not start waiting RX event timer\n"); } - g_fsm_state = ET_FSM_STATE_WAITING_EVENT; + g_fsm_state = ET_FSM_STATE_WAITING_RX_EVENT; packet->status = ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING; } //------------------------------------------------------------------------------ @@ -107,7 +107,7 @@ void et_scenario_schedule_tx_packet(et_packet_t * const packet) AssertFatal(NULL != s1ap_eNB_instance, "Cannot get s1ap_eNB_instance_t for eNB instance %d", packet->enb_instance); LOG_D(ENB_APP, "%s\n", __FUNCTION__); - g_fsm_state = ET_FSM_STATE_WAITING_EVENT; + g_fsm_state = ET_FSM_STATE_WAITING_TX_EVENT; switch (packet->sctp_hdr.chunk_type) { case SCTP_CID_DATA: @@ -160,6 +160,10 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_running(et_event_t event) { switch (event.code){ + case ET_EVENT_TICK: + //TODO + + break; case ET_EVENT_RX_PACKET_TIME_OUT: AssertFatal(0, "Event ET_EVENT_RX_PACKET_TIME_OUT not handled in FSM state ET_FSM_STATE_RUNNING"); break; @@ -177,18 +181,17 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_running(et_event_t event) } //------------------------------------------------------------------------------ -et_fsm_state_t et_scenario_fsm_notify_event_state_waiting(et_event_t event) +et_fsm_state_t et_scenario_fsm_notify_event_state_waiting_tx(et_event_t event) { - + int rv = 0; switch (event.code){ - case ET_EVENT_RX_PACKET_TIME_OUT: - fprintf(stderr, "Error The following packet is not received:\n"); - et_display_packet(event.u.rx_packet_time_out); - AssertFatal(0, "Waited packet not received"); + case ET_EVENT_TICK: break; + case ET_EVENT_RX_S1AP: - et_s1ap_process_rx_packet(&event.u.s1ap_data_ind); + rv = et_s1ap_process_rx_packet(&event.u.s1ap_data_ind); break; + case ET_EVENT_TX_TIMED_PACKET: // send immediately AssertFatal(0 == gettimeofday(&event.u.tx_timed_packet->timestamp_packet, NULL), "gettimeofday() Failed"); @@ -202,9 +205,39 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_waiting(et_event_t event) g_fsm_state = ET_FSM_STATE_RUNNING; break; + case ET_EVENT_RX_PACKET_TIME_OUT: + default: + AssertFatal(0, "Case event %d not handled in ET_FSM_STATE_WAITING_TX", event.code); + } + pthread_mutex_unlock(&g_fsm_lock); + return 0; +} + +//------------------------------------------------------------------------------ +et_fsm_state_t et_scenario_fsm_notify_event_state_waiting_rx(et_event_t event) +{ + int rv = 0; + switch (event.code){ + case ET_EVENT_TICK: + break; + case ET_EVENT_RX_PACKET_TIME_OUT: + fprintf(stderr, "Error The following packet is not received:\n"); + et_display_packet(event.u.rx_packet_time_out); + AssertFatal(0, "Waited packet not received"); + break; + + case ET_EVENT_RX_S1AP: + rv = et_s1ap_process_rx_packet(&event.u.s1ap_data_ind); + // waited packet + if (rv == 0) { + g_fsm_state = ET_FSM_STATE_RUNNING; + } + break; + + case ET_EVENT_TX_TIMED_PACKET: default: - AssertFatal(0, "Case event %d not handled in ET_FSM_STATE_WAITING", event.code); + AssertFatal(0, "Case event %d not handled in ET_FSM_STATE_WAITING_RX", event.code); } pthread_mutex_unlock(&g_fsm_lock); return 0; @@ -215,6 +248,9 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_connecting_s1c(et_event_t even { switch (event.code){ + case ET_EVENT_TICK: + break; + case ET_EVENT_S1C_CONNECTED: // hack simulate we have been able to get the right timing values AssertFatal(gettimeofday(&g_scenario->time_last_tx_packet, NULL) == 0, "gettimeofday failed"); @@ -227,6 +263,11 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_connecting_s1c(et_event_t even if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_SEND) { et_scenario_schedule_tx_packet(g_scenario->next_packet); pthread_mutex_unlock(&g_fsm_lock); + + et_event_t continue_event; + continue_event.code = ET_EVENT_TICK; + et_scenario_fsm_notify_event(continue_event); + return g_fsm_state; } else if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { if (g_scenario->next_packet->status == ET_PACKET_STATUS_RECEIVED) { @@ -289,6 +330,9 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_connecting_s1c(et_event_t even et_fsm_state_t et_scenario_fsm_notify_event_state_null(et_event_t event) { switch (event.code){ + case ET_EVENT_TICK: + break; + case ET_EVENT_INIT: AssertFatal(NULL == g_scenario, "Current scenario not ended"); g_scenario = event.u.init.scenario; @@ -304,6 +348,11 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_null(et_event_t event) if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_SEND) { et_scenario_schedule_tx_packet(g_scenario->next_packet); pthread_mutex_unlock(&g_fsm_lock); + + et_event_t continue_event; + continue_event.code = ET_EVENT_TICK; + et_scenario_fsm_notify_event(continue_event); + return g_fsm_state; } else if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { if (g_scenario->next_packet->status == ET_PACKET_STATUS_RECEIVED) { @@ -382,7 +431,8 @@ et_fsm_state_t et_scenario_fsm_notify_event(et_event_t event) switch (g_fsm_state){ case ET_FSM_STATE_NULL: return et_scenario_fsm_notify_event_state_null(event); break; case ET_FSM_STATE_CONNECTING_S1C: return et_scenario_fsm_notify_event_state_connecting_s1c(event); break; - case ET_FSM_STATE_WAITING_EVENT: return et_scenario_fsm_notify_event_state_waiting(event); break; + case ET_FSM_STATE_WAITING_TX_EVENT: return et_scenario_fsm_notify_event_state_waiting_tx(event); break; + case ET_FSM_STATE_WAITING_RX_EVENT: return et_scenario_fsm_notify_event_state_waiting_rx(event); break; case ET_FSM_STATE_RUNNING: return et_scenario_fsm_notify_event_state_running(event); break; default: AssertFatal(0, "Case fsm_state %d not handled", g_fsm_state); diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c index 92cc3f766eabcb5e9198736f7474c9dfba1bac9a..336dc547d52e38dbff80d8084e3b52792c37dc5d 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c @@ -189,7 +189,7 @@ void et_s1ap_eNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, itti_send_msg_to_task(TASK_SCTP, instance, message_p); } //------------------------------------------------------------------------------ -int et_s1ap_is_matching(et_s1ap_t * const s1ap1, et_s1ap_t * const s1ap2, const uint32_t constraints) +long et_s1ap_is_matching(et_s1ap_t * const s1ap1, et_s1ap_t * const s1ap2, const uint32_t constraints) { if (s1ap1->pdu.present != s1ap2->pdu.present) return -ET_ERROR_MATCH_PACKET_S1AP_PRESENT; switch (s1ap1->pdu.present) { @@ -247,19 +247,22 @@ et_packet_t* et_build_packet_from_s1ap_data_ind(et_event_s1ap_data_ind_t * const //------------------------------------------------------------------------------ -void et_scenario_set_packet_received(et_packet_t * const packet) +// return 0 if packet was waited +int et_scenario_set_packet_received(et_packet_t * const packet) { int rc = 0; packet->status = ET_PACKET_STATUS_RECEIVED; S1AP_DEBUG("Packet num %d received\n", packet->packet_number); if (packet->timer_id != 0) { rc = timer_remove(packet->timer_id); - AssertFatal(rc == 0, "Timer on Rx packet num %d unknown", packet->packet_number); + AssertFatal(rc == 0, "TODO: Debug Timer on Rx packet num %d unknown", packet->packet_number); + return rc; } + return 1; } //------------------------------------------------------------------------------ -void et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const s1ap_data_ind) +int et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const s1ap_data_ind) { et_packet_t * packet = NULL; et_packet_t * rx_packet = NULL; @@ -291,9 +294,15 @@ void et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const s1ap_data_ind) rv = et_sctp_is_matching(&packet->sctp_hdr, &rx_packet->sctp_hdr, g_constraints); if (0 == rv) { S1AP_DEBUG("Compare RX packet with packet num %d succeeded\n", packet->packet_number); - et_scenario_set_packet_received(packet); + return et_scenario_set_packet_received(packet); } else { S1AP_DEBUG("Compare RX packet with packet num %d failed %s\n", packet->packet_number, et_error_match2str(rv)); + // asn1 compare no match return code, may not collide with non asn1 error return codes + // (each asn1 rc <= 166 (enum e_S1ap_ProtocolIE_ID, in generated file S1ap_ProtocolIE_ID.h)) + if ((rv > 0) || (rv <= -ET_ERROR_MATCH_END)) { + //TODO MME_UE_S1AP_ID, etc. + AssertFatal(0,"Some work needed there"); + } } } not_found += 1; @@ -301,6 +310,7 @@ void et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const s1ap_data_ind) } S1AP_DEBUG("Rx packet not found in scenario:\n"); et_display_packet_sctp(&rx_packet->sctp_hdr); + return -1; } //------------------------------------------------------------------------------ @@ -344,6 +354,10 @@ void et_s1ap_eNB_handle_sctp_data_ind(sctp_data_ind_t * const sctp_data_ind) et_scenario_fsm_notify_event(event); + memset((void*)&event, 0, sizeof(event)); + event.code = ET_EVENT_TICK; + et_scenario_fsm_notify_event(event); + } //------------------------------------------------------------------------------ void et_s1ap_eNB_register_mme(s1ap_eNB_instance_t *instance_p, diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c index 239621854a201fe86c4b9baf492770607c2fa3e3..5300476e982d18776054256149442e3df3f21879 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c @@ -58,15 +58,15 @@ extern et_scenario_t *g_scenario; extern uint32_t g_constraints; //------------------------------------------------------------------------------ -int et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, s1ap_message * const m2, const uint32_t constraints) +long et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, s1ap_message * const m2, const uint32_t constraints) { long ret = 0; AssertFatal(m1 != NULL, "bad parameter m1"); AssertFatal(m2 != NULL, "bad parameter m2"); AssertFatal((present == S1AP_PDU_PR_initiatingMessage) || (present == S1AP_PDU_PR_successfulOutcome) || - (present == S1AP_PDU_PR_unsuccessfulOutcome) , "bad parameter S1AP_PDU_PR present "); - if (m1->procedureCode != m2->procedureCode) return -ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE; + (present == S1AP_PDU_PR_unsuccessfulOutcome) , "Bad parameter S1AP_PDU_PR present "); + AssertFatal( m1->procedureCode == m2->procedureCode, "Bad parameters: no matching procedure codes"); // some cases can never occur since uplink only. diff --git a/openair3/TEST/EPC_TEST/play_scenario_sctp.c b/openair3/TEST/EPC_TEST/play_scenario_sctp.c index a61701d92d0ab6109f549b7feaf0c3405b090ca5..07206f53b81f9680ff526afbaeb7a316ec9b6323 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_sctp.c +++ b/openair3/TEST/EPC_TEST/play_scenario_sctp.c @@ -44,7 +44,7 @@ #include "play_scenario.h" //------------------------------------------------------------------------------ -int et_sctp_data_is_matching(sctp_datahdr_t * const sctp1, sctp_datahdr_t * const sctp2, const uint32_t constraints) +long et_sctp_data_is_matching(sctp_datahdr_t * const sctp1, sctp_datahdr_t * const sctp2, const uint32_t constraints) { // no comparison for ports if (sctp1->ppid != sctp2->ppid) { @@ -73,7 +73,7 @@ int et_sctp_data_is_matching(sctp_datahdr_t * const sctp1, sctp_datahdr_t * cons } //------------------------------------------------------------------------------ -int et_sctp_is_matching(et_sctp_hdr_t * const sctp1, et_sctp_hdr_t * const sctp2, const uint32_t constraints) +long et_sctp_is_matching(et_sctp_hdr_t * const sctp1, et_sctp_hdr_t * const sctp2, const uint32_t constraints) { // no comparison for ports if (sctp1->chunk_type != sctp2->chunk_type) return -ET_ERROR_MATCH_PACKET_SCTP_CHUNK_TYPE;