diff --git a/openair3/TEST/EPC_TEST/play_scenario.c b/openair3/TEST/EPC_TEST/play_scenario.c index 216e098a018cec8681f710c002c329733c112702..9a9cb881b1ed39598e72c5b31e8172d8268ef59a 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.c +++ b/openair3/TEST/EPC_TEST/play_scenario.c @@ -283,6 +283,22 @@ const char * const et_chunk_type_cid2str(const sctp_cid_t chunk_type) } } //------------------------------------------------------------------------------ +const char * const et_error_match2str(const int err) +{ + switch (err) { + case -ET_ERROR_MATCH_PACKET_SCTP_CHUNK_TYPE: return "SCTP_CHUNK_TYPE"; break; + case -ET_ERROR_MATCH_PACKET_SCTP_PPID: return "SCTP_PPID"; break; + case -ET_ERROR_MATCH_PACKET_SCTP_ASSOC_ID: return "SCTP_ASSOC_ID"; break; + case -ET_ERROR_MATCH_PACKET_SCTP_STREAM_ID: return "SCTP_STREAM_ID"; break; + case -ET_ERROR_MATCH_PACKET_SCTP_SSN: return "SCTP_SSN"; break; + case -ET_ERROR_MATCH_PACKET_S1AP_PRESENT: return "S1AP_PRESENT"; break; + case -ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE: return "S1AP_PROCEDURE_CODE"; break; + case -ET_ERROR_MATCH_PACKET_S1AP_CRITICALITY: return "S1AP_CRITICALITY"; break; + default: + AssertFatal (0, "ERROR: Unknown match error %d!(TODO handle an1c error codes)\n", err); + } +} +//------------------------------------------------------------------------------ et_packet_action_t et_action_str2et_action_t(const xmlChar * const action) { if ((!xmlStrcmp(action, (const xmlChar *)"SEND"))) { return ET_PACKET_ACTION_S1C_SEND;} diff --git a/openair3/TEST/EPC_TEST/play_scenario.h b/openair3/TEST/EPC_TEST/play_scenario.h index 3c8c5faef810f065b942544d8352eddb0fa9c214..d5f11e40f9dfd9d74042ae7152c794e5008af7d2 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.h +++ b/openair3/TEST/EPC_TEST/play_scenario.h @@ -178,6 +178,19 @@ typedef enum { ET_FSM_STATE_END } et_fsm_state_t; +typedef enum { + ET_ERROR_MATCH_START = 1, + ET_ERROR_MATCH_PACKET_SCTP_CHUNK_TYPE = ET_ERROR_MATCH_START, + ET_ERROR_MATCH_PACKET_SCTP_PPID, + ET_ERROR_MATCH_PACKET_SCTP_ASSOC_ID, + ET_ERROR_MATCH_PACKET_SCTP_STREAM_ID, + ET_ERROR_MATCH_PACKET_SCTP_SSN, + ET_ERROR_MATCH_PACKET_S1AP_PRESENT, + ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE, + ET_ERROR_MATCH_PACKET_S1AP_CRITICALITY, + ET_ERROR_MATCH_END +} et_error_match_code_t; + @@ -332,9 +345,9 @@ typedef struct et_scenario_s { hash_table_t *hash_old_ue_mme_id2ue_mme_id; struct timeval time_last_tx_packet; struct timeval time_last_rx_packet; - et_packet_t *last_rx_packet; - et_packet_t *last_tx_packet; - et_packet_t *next_packet; + et_packet_t *last_rx_packet; // last packet received with all previous scenario RX packet received. + et_packet_t *last_tx_packet; // last sent packet + et_packet_t *next_packet; // next packet to be handled in the scenario (RX or TX packet) } et_scenario_t; @@ -402,6 +415,7 @@ 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); 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); 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, @@ -450,6 +464,7 @@ int et_compare_et_ip_to_net_ip_address(const et_ip_t * const ip, const net_ip_ad int et_hex2data(unsigned char * const data, const unsigned char * const hexstring, const unsigned int len); sctp_cid_t et_chunk_type_str2cid(const xmlChar * const chunk_type_str); const char * const et_chunk_type_cid2str(const sctp_cid_t chunk_type); +const char * const et_error_match2str(const int err); et_packet_action_t et_action_str2et_action_t(const xmlChar * const action); void et_ip_str2et_ip(const xmlChar * const ip_str, et_ip_t * const ip); void et_enb_config_init(const char const * lib_config_file_name_pP); diff --git a/openair3/TEST/EPC_TEST/play_scenario_display.c b/openair3/TEST/EPC_TEST/play_scenario_display.c index 406c69c85871f7cedf9e6eadee69ec865aae848e..2a924e952c14964cf9bfc759ce802736c630acac 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_display.c +++ b/openair3/TEST/EPC_TEST/play_scenario_display.c @@ -273,6 +273,28 @@ void et_display_packet(const et_packet_t * const packet) default: fprintf(stdout, "\tPacket:\tAction UNKNOWN\n"); } + switch(packet->status) { + case ET_PACKET_STATUS_NONE: + fprintf(stdout, "\tPacket:\tStatus NONE\n"); + break; + case ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT: + fprintf(stdout, "\tPacket:\tStatus NOT_TAKEN_IN_ACCOUNT\n"); + break; + case ET_PACKET_STATUS_SCHEDULED_FOR_SENDING: + fprintf(stdout, "\tPacket:\tStatus SCHEDULED_FOR_SENDING\n"); + break; + case ET_PACKET_STATUS_SENT: + fprintf(stdout, "\tPacket:\tStatus SENT\n"); + break; + case ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING: + fprintf(stdout, "\tPacket:\tStatus SCHEDULED_FOR_RECEIVING\n"); + break; + case ET_PACKET_STATUS_RECEIVED: + fprintf(stdout, "\tPacket:\tStatus RECEIVED\n"); + break; + default: + fprintf(stdout, "\tPacket:\tStatus UNKNOWN\n"); + } et_display_packet_ip(&packet->ip_hdr); et_display_packet_sctp(&packet->sctp_hdr); } diff --git a/openair3/TEST/EPC_TEST/play_scenario_fsm.c b/openair3/TEST/EPC_TEST/play_scenario_fsm.c index 23ef72035cd89275748de4b023429f89c11c2a13..d561668b17b74b69482112239f9e1ae432873a3a 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_fsm.c +++ b/openair3/TEST/EPC_TEST/play_scenario_fsm.c @@ -292,7 +292,10 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_null(et_event_t event) case ET_EVENT_INIT: AssertFatal(NULL == g_scenario, "Current scenario not ended"); g_scenario = event.u.init.scenario; - g_scenario->next_packet = g_scenario->list_packet; + g_scenario->next_packet = g_scenario->list_packet; + g_scenario->last_rx_packet = NULL; + g_scenario->last_tx_packet = NULL; + while (NULL != g_scenario->next_packet) { switch (g_scenario->next_packet->sctp_hdr.chunk_type) { diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c index 408ff72a4a8c44422bad1cbfe08d98cff2b6f12f..92cc3f766eabcb5e9198736f7474c9dfba1bac9a 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c @@ -191,21 +191,21 @@ void et_s1ap_eNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, //------------------------------------------------------------------------------ int 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 -6; + if (s1ap1->pdu.present != s1ap2->pdu.present) return -ET_ERROR_MATCH_PACKET_S1AP_PRESENT; switch (s1ap1->pdu.present) { case S1AP_PDU_PR_NOTHING: break; case S1AP_PDU_PR_initiatingMessage: - if (s1ap1->pdu.choice.initiatingMessage.procedureCode != s1ap2->pdu.choice.initiatingMessage.procedureCode) return -7; - if (s1ap1->pdu.choice.initiatingMessage.criticality != s1ap2->pdu.choice.initiatingMessage.criticality) return -8; + if (s1ap1->pdu.choice.initiatingMessage.procedureCode != s1ap2->pdu.choice.initiatingMessage.procedureCode) return -ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE; + if (s1ap1->pdu.choice.initiatingMessage.criticality != s1ap2->pdu.choice.initiatingMessage.criticality) return -ET_ERROR_MATCH_PACKET_S1AP_CRITICALITY; break; case S1AP_PDU_PR_successfulOutcome: - if (s1ap1->pdu.choice.successfulOutcome.procedureCode != s1ap2->pdu.choice.successfulOutcome.procedureCode) return -7; - if (s1ap1->pdu.choice.successfulOutcome.criticality != s1ap2->pdu.choice.successfulOutcome.criticality) return -8; + if (s1ap1->pdu.choice.successfulOutcome.procedureCode != s1ap2->pdu.choice.successfulOutcome.procedureCode) return -ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE; + if (s1ap1->pdu.choice.successfulOutcome.criticality != s1ap2->pdu.choice.successfulOutcome.criticality) return -ET_ERROR_MATCH_PACKET_S1AP_CRITICALITY; break; case S1AP_PDU_PR_unsuccessfulOutcome: - if (s1ap1->pdu.choice.unsuccessfulOutcome.procedureCode != s1ap2->pdu.choice.unsuccessfulOutcome.procedureCode) return -7; - if (s1ap1->pdu.choice.unsuccessfulOutcome.criticality != s1ap2->pdu.choice.unsuccessfulOutcome.criticality) return -8; + if (s1ap1->pdu.choice.unsuccessfulOutcome.procedureCode != s1ap2->pdu.choice.unsuccessfulOutcome.procedureCode) return -ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE; + if (s1ap1->pdu.choice.unsuccessfulOutcome.criticality != s1ap2->pdu.choice.unsuccessfulOutcome.criticality) return -ET_ERROR_MATCH_PACKET_S1AP_CRITICALITY; break; default: AssertFatal(0, "Unknown pdu.present %d", s1ap1->pdu.present); @@ -236,7 +236,8 @@ et_packet_t* et_build_packet_from_s1ap_data_ind(et_event_s1ap_data_ind_t * const packet->enb_instance = 0; //TODO //packet->ip_hdr; // keep in mind: allocated buffer: sctp_datahdr.payload.binary_stream - memcpy((void*)&packet->sctp_hdr, (void*)&s1ap_data_ind->sctp_datahdr, sizeof(packet->sctp_hdr)); + packet->sctp_hdr.chunk_type = SCTP_CID_DATA; + memcpy((void*)&packet->sctp_hdr.u.data_hdr, (void*)&s1ap_data_ind->sctp_datahdr, sizeof(packet->sctp_hdr)); //packet->next = NULL; packet->status = ET_PACKET_STATUS_RECEIVED; //packet->timer_id = 0; @@ -245,23 +246,54 @@ 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) +{ + 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); + } +} + //------------------------------------------------------------------------------ void 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; unsigned long int not_found = 1; + long rv = 0; AssertFatal (NULL != s1ap_data_ind, "Bad parameter sctp_data_ind\n"); rx_packet = et_build_packet_from_s1ap_data_ind(s1ap_data_ind); - packet = g_scenario->next_packet; + if (NULL == g_scenario->last_rx_packet) { + packet = g_scenario->list_packet; + while (NULL != packet) { + if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { + if (packet->status == ET_PACKET_STATUS_RECEIVED) { + g_scenario->last_rx_packet = packet; + } else { + break; + } + } + packet = packet->next; + } + packet = g_scenario->list_packet; + } else { + packet = g_scenario->last_rx_packet; + } // not_found threshold may sure depend on number of mme, may be not sure on number of UE while ((NULL != packet) && (not_found < 5)) { if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { - //TODO - if (et_sctp_is_matching(&packet->sctp_hdr, &rx_packet->sctp_hdr, g_constraints) == 0) { + 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); + } else { + S1AP_DEBUG("Compare RX packet with packet num %d failed %s\n", packet->packet_number, et_error_match2str(rv)); } } not_found += 1; @@ -388,9 +420,9 @@ void et_s1ap_update_assoc_id_of_packets(const int32_t assoc_id, case SCTP_CID_DATA : S1AP_DEBUG("%s for SCTP association (%u) SCTP_CID_DATA\n",__FUNCTION__,assoc_id); - if (ET_PACKET_STATUS_NONE == packet->status) { + if ((ET_PACKET_STATUS_NONE == packet->status) || (ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING == packet->status)) { if (0 < old_mme_port) { - if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_SEND) { + if (packet->action == ET_PACKET_ACTION_S1C_SEND) { ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.dst, &mme_desc_p->mme_net_ip_address); if (0 == ret) { ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.src, &s1ap_eNB_instance->s1c_net_ip_address); @@ -403,7 +435,7 @@ void et_s1ap_update_assoc_id_of_packets(const int32_t assoc_id, } } } - } else if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { + } else if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.src, &mme_desc_p->mme_net_ip_address); if (0 == ret) { ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.dst, &s1ap_eNB_instance->s1c_net_ip_address); @@ -474,6 +506,7 @@ void et_s1ap_update_assoc_id_of_packets(const int32_t assoc_id, break; default: + AssertFatal(0, "Unknown chunk_type %d packet num %d", packet->sctp_hdr.chunk_type, packet->packet_number); ; } packet = packet->next; 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 5ad5708babda376024bfd6fbde16955eb5eca89a..239621854a201fe86c4b9baf492770607c2fa3e3 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c @@ -63,86 +63,156 @@ int et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, long ret = 0; AssertFatal(m1 != NULL, "bad parameter m1"); AssertFatal(m2 != NULL, "bad parameter m2"); - if (m1->procedureCode != m2->procedureCode) return -1; + 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; // some cases can never occur since uplink only. switch (m1->procedureCode) { case S1ap_ProcedureCode_id_HandoverPreparation: - AssertFatal(0, "S1ap_ProcedureCode_id_InitialContextSetup not implemented"); + if (present == S1AP_PDU_PR_initiatingMessage) { + ret = s1ap_compare_s1ap_handoverrequiredies( + &m1->msg.s1ap_HandoverRequiredIEs, + &m2->msg.s1ap_HandoverRequiredIEs); + } else { + ret = s1ap_compare_s1ap_handovercommandies( + &m1->msg.s1ap_HandoverCommandIEs, + &m2->msg.s1ap_HandoverCommandIEs); + } break; + case S1ap_ProcedureCode_id_HandoverResourceAllocation: - AssertFatal(0, "S1ap_ProcedureCode_id_InitialContextSetup not implemented"); + if (present == S1AP_PDU_PR_initiatingMessage) { + ret = s1ap_compare_s1ap_handoverrequesties( + &m1->msg.s1ap_HandoverRequestIEs, + &m2->msg.s1ap_HandoverRequestIEs); + } else if (present == S1AP_PDU_PR_successfulOutcome) { + ret = s1ap_compare_s1ap_handoverrequestacknowledgeies( + &m1->msg.s1ap_HandoverRequestAcknowledgeIEs, + &m2->msg.s1ap_HandoverRequestAcknowledgeIEs); + } else if (present == S1AP_PDU_PR_unsuccessfulOutcome) { + ret = s1ap_compare_s1ap_handoverfailureies( + &m1->msg.s1ap_HandoverFailureIEs, + &m2->msg.s1ap_HandoverFailureIEs); + } break; + case S1ap_ProcedureCode_id_HandoverNotification: - AssertFatal(0, "S1ap_ProcedureCode_id_HandoverNotification not implemented"); + ret = s1ap_compare_s1ap_handovernotifyies( + &m1->msg.s1ap_HandoverNotifyIEs, + &m2->msg.s1ap_HandoverNotifyIEs); break; + case S1ap_ProcedureCode_id_PathSwitchRequest: ret = s1ap_compare_s1ap_pathswitchrequesties( &m1->msg.s1ap_PathSwitchRequestIEs, &m2->msg.s1ap_PathSwitchRequestIEs); break; + case S1ap_ProcedureCode_id_HandoverCancel: ret = s1ap_compare_s1ap_handovercancelies( &m1->msg.s1ap_HandoverCancelIEs, &m2->msg.s1ap_HandoverCancelIEs); break; + case S1ap_ProcedureCode_id_E_RABSetup: + if (present == S1AP_PDU_PR_initiatingMessage) { + ret = s1ap_compare_s1ap_e_rabsetuprequesties( + &m1->msg.s1ap_E_RABSetupRequestIEs, + &m2->msg.s1ap_E_RABSetupRequestIEs); + } else { + ret = s1ap_compare_s1ap_e_rabsetupresponseies( + &m1->msg.s1ap_E_RABSetupResponseIEs, + &m2->msg.s1ap_E_RABSetupResponseIEs); + } + break; + case S1ap_ProcedureCode_id_E_RABModify: + if (present == S1AP_PDU_PR_initiatingMessage) { + ret = s1ap_compare_s1ap_e_rabmodifyrequesties( + &m1->msg.s1ap_E_RABModifyRequestIEs, + &m2->msg.s1ap_E_RABModifyRequestIEs); + } else { + ret = s1ap_compare_s1ap_e_rabmodifyresponseies( + &m1->msg.s1ap_E_RABModifyResponseIEs, + &m2->msg.s1ap_E_RABModifyResponseIEs); + } + break; + case S1ap_ProcedureCode_id_E_RABRelease: if (present == S1AP_PDU_PR_initiatingMessage) { ret = s1ap_compare_s1ap_e_rabreleasecommandies( &m1->msg.s1ap_E_RABReleaseCommandIEs, &m2->msg.s1ap_E_RABReleaseCommandIEs); - } else if (present == S1AP_PDU_PR_successfulOutcome) { + } else { ret = s1ap_compare_s1ap_e_rabreleaseresponseies( &m1->msg.s1ap_E_RABReleaseResponseIEs, &m2->msg.s1ap_E_RABReleaseResponseIEs); } break; + case S1ap_ProcedureCode_id_E_RABReleaseIndication: ret = s1ap_compare_s1ap_e_rabreleaseindicationies( &m1->msg.s1ap_E_RABReleaseIndicationIEs, &m2->msg.s1ap_E_RABReleaseIndicationIEs); break; + case S1ap_ProcedureCode_id_InitialContextSetup: - AssertFatal(0, "S1ap_ProcedureCode_id_InitialContextSetup not implemented"); + if (present == S1AP_PDU_PR_initiatingMessage) { + ret = s1ap_compare_s1ap_initialcontextsetuprequesties( + &m1->msg.s1ap_InitialContextSetupRequestIEs, + &m2->msg.s1ap_InitialContextSetupRequestIEs); + } else { + ret = s1ap_compare_s1ap_initialcontextsetupresponseies( + &m1->msg.s1ap_InitialContextSetupResponseIEs, + &m2->msg.s1ap_InitialContextSetupResponseIEs); + } break; + case S1ap_ProcedureCode_id_Paging: ret = s1ap_compare_s1ap_pagingies( &m1->msg.s1ap_PagingIEs, &m2->msg.s1ap_PagingIEs); break; + case S1ap_ProcedureCode_id_downlinkNASTransport: ret = s1ap_compare_s1ap_downlinknastransporties( &m1->msg.s1ap_DownlinkNASTransportIEs, &m2->msg.s1ap_DownlinkNASTransportIEs); break; + case S1ap_ProcedureCode_id_initialUEMessage: ret = s1ap_compare_s1ap_initialuemessageies( &m1->msg.s1ap_InitialUEMessageIEs, &m2->msg.s1ap_InitialUEMessageIEs); break; + case S1ap_ProcedureCode_id_uplinkNASTransport: ret = s1ap_compare_s1ap_uplinknastransporties( &m1->msg.s1ap_UplinkNASTransportIEs, &m2->msg.s1ap_UplinkNASTransportIEs); break; + case S1ap_ProcedureCode_id_Reset: ret = s1ap_compare_s1ap_reseties( &m1->msg.s1ap_ResetIEs, &m2->msg.s1ap_ResetIEs); break; + case S1ap_ProcedureCode_id_ErrorIndication: ret = s1ap_compare_s1ap_errorindicationies( &m1->msg.s1ap_ErrorIndicationIEs, &m2->msg.s1ap_ErrorIndicationIEs); break; + case S1ap_ProcedureCode_id_NASNonDeliveryIndication: ret = s1ap_compare_s1ap_nasnondeliveryindication_ies( &m1->msg.s1ap_NASNonDeliveryIndication_IEs, &m2->msg.s1ap_NASNonDeliveryIndication_IEs); break; + case S1ap_ProcedureCode_id_S1Setup: if (present == S1AP_PDU_PR_initiatingMessage) { ret = s1ap_compare_s1ap_s1setuprequesties( @@ -158,21 +228,25 @@ int et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, &m2->msg.s1ap_S1SetupFailureIEs); } break; + case S1ap_ProcedureCode_id_UEContextReleaseRequest: ret = s1ap_compare_s1ap_uecontextreleaserequesties( &m1->msg.s1ap_UEContextReleaseRequestIEs, &m2->msg.s1ap_UEContextReleaseRequestIEs); break; + case S1ap_ProcedureCode_id_DownlinkS1cdma2000tunneling: ret = s1ap_compare_s1ap_downlinks1cdma2000tunnelingies( &m1->msg.s1ap_DownlinkS1cdma2000tunnelingIEs, &m2->msg.s1ap_DownlinkS1cdma2000tunnelingIEs); break; + case S1ap_ProcedureCode_id_UplinkS1cdma2000tunneling: ret = s1ap_compare_s1ap_uplinks1cdma2000tunnelingies( &m1->msg.s1ap_UplinkS1cdma2000tunnelingIEs, &m2->msg.s1ap_UplinkS1cdma2000tunnelingIEs); break; + case S1ap_ProcedureCode_id_UEContextModification: if (present == S1AP_PDU_PR_initiatingMessage) { ret = s1ap_compare_s1ap_uecontextmodificationrequesties( @@ -188,53 +262,152 @@ int et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, &m2->msg.s1ap_UEContextModificationFailureIEs); } break; + case S1ap_ProcedureCode_id_UECapabilityInfoIndication: ret = s1ap_compare_s1ap_uecapabilityinfoindicationies( &m1->msg.s1ap_UECapabilityInfoIndicationIEs, &m2->msg.s1ap_UECapabilityInfoIndicationIEs); break; - case S1ap_ProcedureCode_id_UEContextRelease: + case S1ap_ProcedureCode_id_UEContextRelease: + if (present == S1AP_PDU_PR_initiatingMessage) { + ret = s1ap_compare_s1ap_uecontextreleasecommandies( + &m1->msg.s1ap_UEContextReleaseCommandIEs, + &m2->msg.s1ap_UEContextReleaseCommandIEs); + } else { + ret = s1ap_compare_s1ap_uecontextreleasecompleteies( + &m1->msg.s1ap_UEContextReleaseCompleteIEs, + &m2->msg.s1ap_UEContextReleaseCompleteIEs); + } break; + case S1ap_ProcedureCode_id_eNBStatusTransfer: ret = s1ap_compare_s1ap_enbstatustransferies( &m1->msg.s1ap_ENBStatusTransferIEs, &m2->msg.s1ap_ENBStatusTransferIEs); break; + case S1ap_ProcedureCode_id_MMEStatusTransfer: ret = s1ap_compare_s1ap_mmestatustransferies( &m1->msg.s1ap_MMEStatusTransferIEs, &m2->msg.s1ap_MMEStatusTransferIEs); break; + case S1ap_ProcedureCode_id_DeactivateTrace: ret = s1ap_compare_s1ap_deactivatetraceies( &m1->msg.s1ap_DeactivateTraceIEs, &m2->msg.s1ap_DeactivateTraceIEs); break; + case S1ap_ProcedureCode_id_TraceStart: ret = s1ap_compare_s1ap_tracestarties( &m1->msg.s1ap_TraceStartIEs, &m2->msg.s1ap_TraceStartIEs); break; + case S1ap_ProcedureCode_id_TraceFailureIndication: ret = s1ap_compare_s1ap_tracefailureindicationies( &m1->msg.s1ap_TraceFailureIndicationIEs, &m2->msg.s1ap_TraceFailureIndicationIEs); break; + case S1ap_ProcedureCode_id_ENBConfigurationUpdate: + if (present == S1AP_PDU_PR_initiatingMessage) { + ret = s1ap_compare_s1ap_enbconfigurationupdateies( + &m1->msg.s1ap_ENBConfigurationUpdateIEs, + &m2->msg.s1ap_ENBConfigurationUpdateIEs); + } else if (present == S1AP_PDU_PR_successfulOutcome) { + ret = s1ap_compare_s1ap_enbconfigurationupdateacknowledgeies( + &m1->msg.s1ap_ENBConfigurationUpdateAcknowledgeIEs, + &m2->msg.s1ap_ENBConfigurationUpdateAcknowledgeIEs); + } else { + ret = s1ap_compare_s1ap_enbconfigurationupdatefailureies( + &m1->msg.s1ap_ENBConfigurationUpdateFailureIEs, + &m2->msg.s1ap_ENBConfigurationUpdateFailureIEs); + } + break; + case S1ap_ProcedureCode_id_MMEConfigurationUpdate: + if (present == S1AP_PDU_PR_initiatingMessage) { + ret = s1ap_compare_s1ap_mmeconfigurationupdateies( + &m1->msg.s1ap_MMEConfigurationUpdateIEs, + &m2->msg.s1ap_MMEConfigurationUpdateIEs); + } else if (present == S1AP_PDU_PR_successfulOutcome) { + ret = s1ap_compare_s1ap_mmeconfigurationupdateacknowledgeies( + &m1->msg.s1ap_MMEConfigurationUpdateAcknowledgeIEs, + &m2->msg.s1ap_MMEConfigurationUpdateAcknowledgeIEs); + } else { + ret = s1ap_compare_s1ap_mmeconfigurationupdatefailureies( + &m1->msg.s1ap_MMEConfigurationUpdateFailureIEs, + &m2->msg.s1ap_MMEConfigurationUpdateFailureIEs); + } + break; + case S1ap_ProcedureCode_id_LocationReportingControl: + ret = s1ap_compare_s1ap_locationreportingcontrolies( + &m1->msg.s1ap_LocationReportingControlIEs, + &m2->msg.s1ap_LocationReportingControlIEs); + break; + case S1ap_ProcedureCode_id_LocationReportingFailureIndication: + ret = s1ap_compare_s1ap_locationreportingfailureindicationies( + &m1->msg.s1ap_LocationReportingFailureIndicationIEs, + &m2->msg.s1ap_LocationReportingFailureIndicationIEs); + break; + case S1ap_ProcedureCode_id_LocationReport: + ret = s1ap_compare_s1ap_locationreporties( + &m1->msg.s1ap_LocationReportIEs, + &m2->msg.s1ap_LocationReportIEs); + break; + case S1ap_ProcedureCode_id_OverloadStart: + ret = s1ap_compare_s1ap_overloadstarties( + &m1->msg.s1ap_OverloadStartIEs, + &m2->msg.s1ap_OverloadStartIEs); + break; + case S1ap_ProcedureCode_id_OverloadStop: + ret = s1ap_compare_s1ap_overloadstopies( + &m1->msg.s1ap_OverloadStopIEs, + &m2->msg.s1ap_OverloadStopIEs); + break; + case S1ap_ProcedureCode_id_WriteReplaceWarning: + if (present == S1AP_PDU_PR_initiatingMessage) { + ret = s1ap_compare_s1ap_writereplacewarningrequesties( + &m1->msg.s1ap_WriteReplaceWarningRequestIEs, + &m2->msg.s1ap_WriteReplaceWarningRequestIEs); + } else { + ret = s1ap_compare_s1ap_writereplacewarningresponseies( + &m1->msg.s1ap_WriteReplaceWarningResponseIEs, + &m2->msg.s1ap_WriteReplaceWarningResponseIEs); + } + break; + case S1ap_ProcedureCode_id_eNBDirectInformationTransfer: + ret = s1ap_compare_s1ap_enbdirectinformationtransferies( + &m1->msg.s1ap_ENBDirectInformationTransferIEs, + &m2->msg.s1ap_ENBDirectInformationTransferIEs); + break; + case S1ap_ProcedureCode_id_MMEDirectInformationTransfer: + + ret = s1ap_compare_s1ap_mmedirectinformationtransferies( + &m1->msg.s1ap_MMEDirectInformationTransferIEs, + &m2->msg.s1ap_MMEDirectInformationTransferIEs); + break; + case S1ap_ProcedureCode_id_PrivateMessage: case S1ap_ProcedureCode_id_eNBConfigurationTransfer: case S1ap_ProcedureCode_id_MMEConfigurationTransfer: + case S1ap_ProcedureCode_id_CellTrafficTrace: + ret = s1ap_compare_s1ap_celltraffictraceies( + &m1->msg.s1ap_CellTrafficTraceIEs, + &m2->msg.s1ap_CellTrafficTraceIEs); + break; + case S1ap_ProcedureCode_id_Kill: if (present == S1AP_PDU_PR_initiatingMessage) { ret = s1ap_compare_s1ap_killrequesties( @@ -246,28 +419,33 @@ int et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, &m2->msg.s1ap_KillResponseIEs); } break; + case S1ap_ProcedureCode_id_downlinkUEAssociatedLPPaTransport: ret = s1ap_compare_s1ap_downlinkueassociatedlppatransport_ies( &m1->msg.s1ap_DownlinkUEAssociatedLPPaTransport_IEs, &m2->msg.s1ap_DownlinkUEAssociatedLPPaTransport_IEs); break; + case S1ap_ProcedureCode_id_uplinkUEAssociatedLPPaTransport: ret = s1ap_compare_s1ap_uplinkueassociatedlppatransport_ies( &m1->msg.s1ap_UplinkUEAssociatedLPPaTransport_IEs, &m2->msg.s1ap_UplinkUEAssociatedLPPaTransport_IEs); break; + case S1ap_ProcedureCode_id_downlinkNonUEAssociatedLPPaTransport: ret = s1ap_compare_s1ap_downlinknonueassociatedlppatransport_ies( &m1->msg.s1ap_DownlinkNonUEAssociatedLPPaTransport_IEs, &m2->msg.s1ap_DownlinkNonUEAssociatedLPPaTransport_IEs); break; + case S1ap_ProcedureCode_id_uplinkNonUEAssociatedLPPaTransport: ret = s1ap_compare_s1ap_uplinknonueassociatedlppatransport_ies( &m1->msg.s1ap_UplinkNonUEAssociatedLPPaTransport_IEs, &m2->msg.s1ap_UplinkNonUEAssociatedLPPaTransport_IEs); break; + default: AssertFatal(0, "Unknown procedure code %ld", m1->procedureCode); } - return 0; + return ret; } diff --git a/openair3/TEST/EPC_TEST/play_scenario_sctp.c b/openair3/TEST/EPC_TEST/play_scenario_sctp.c index 314beae8e17e04e2dbafabb7c09ff66a96f083e2..a61701d92d0ab6109f549b7feaf0c3405b090ca5 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_sctp.c +++ b/openair3/TEST/EPC_TEST/play_scenario_sctp.c @@ -47,20 +47,26 @@ int 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) return -4; - if (sctp1->assoc_id != sctp2->assoc_id) return -5; + if (sctp1->ppid != sctp2->ppid) { + S1AP_WARN("No Matching SCTP PPID %u %u\n", sctp1->ppid, sctp2->ppid); + return -ET_ERROR_MATCH_PACKET_SCTP_PPID; + } + if (sctp1->assoc_id != sctp2->assoc_id) { + S1AP_WARN("No Matching SCTP assoc id %u %u\n", sctp1->assoc_id, sctp2->assoc_id); + return -ET_ERROR_MATCH_PACKET_SCTP_ASSOC_ID; + } if (sctp1->stream != sctp2->stream) { if (constraints & ET_BIT_MASK_MATCH_SCTP_STREAM) { - return -2; + return -ET_ERROR_MATCH_PACKET_SCTP_STREAM_ID; } else { S1AP_WARN("No Matching SCTP stream %u %u\n", sctp1->stream, sctp2->stream); } } if (sctp1->ssn != sctp2->ssn) { if (constraints & ET_BIT_MASK_MATCH_SCTP_SSN) { - return -3; + return -ET_ERROR_MATCH_PACKET_SCTP_SSN; } else { - S1AP_WARN("No Matching SCTP ssn %u %u\n", sctp1->ssn, sctp2->ssn); + S1AP_WARN("No Matching SCTP STREAM SN %u %u\n", sctp1->ssn, sctp2->ssn); } } return et_s1ap_is_matching(&sctp1->payload, &sctp2->payload, constraints); @@ -70,7 +76,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) { // no comparison for ports - if (sctp1->chunk_type != sctp2->chunk_type) return -1; + if (sctp1->chunk_type != sctp2->chunk_type) return -ET_ERROR_MATCH_PACKET_SCTP_CHUNK_TYPE; switch (sctp1->chunk_type) { case SCTP_CID_DATA: return et_sctp_data_is_matching(&sctp1->u.data_hdr, &sctp2->u.data_hdr, constraints);