Timings seems to be OK, (to be checked more accurately)
This commit is contained in:
@@ -344,11 +344,11 @@ typedef struct et_scenario_s {
|
||||
|
||||
hash_table_t *hash_mme2association_id;
|
||||
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; // 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)
|
||||
struct timeval time_last_tx_packet; // Time last sent packet
|
||||
struct timeval time_last_rx_packet; // Time last packet received with all previous scenario RX packet received.
|
||||
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;
|
||||
|
||||
|
||||
|
||||
@@ -55,17 +55,19 @@ uint32_t g_constraints = ET_BIT_MASK_MATCH_SCTP_STREAM | ET_BIT_MASK_MA
|
||||
int timeval_subtract (struct timeval * const result, struct timeval * const a, struct timeval * const b)
|
||||
{
|
||||
struct timeval b2;
|
||||
int nsec = 0;
|
||||
b2.tv_sec = b->tv_sec;
|
||||
b2.tv_usec = b->tv_usec;
|
||||
|
||||
|
||||
/* Perform the carry for the later subtraction by updating y. */
|
||||
if (a->tv_usec < b2.tv_usec) {
|
||||
int nsec = (b2.tv_usec - a->tv_usec) / 1000000 + 1;
|
||||
nsec = (b2.tv_usec - a->tv_usec) / 1000000 + 1;
|
||||
b2.tv_usec -= 1000000 * nsec;
|
||||
b2.tv_sec += nsec;
|
||||
}
|
||||
if (a->tv_usec - b2.tv_usec > 1000000) {
|
||||
int nsec = (a->tv_usec - b2.tv_usec) / 1000000;
|
||||
nsec = (a->tv_usec - b2.tv_usec) / 1000000;
|
||||
b2.tv_usec += 1000000 * nsec;
|
||||
b2.tv_sec -= nsec;
|
||||
}
|
||||
@@ -75,7 +77,8 @@ int timeval_subtract (struct timeval * const result, struct timeval * const a, s
|
||||
result->tv_sec = a->tv_sec - b2.tv_sec;
|
||||
result->tv_usec = a->tv_usec - b2.tv_usec;
|
||||
|
||||
/* Return 1 if result is negative. */
|
||||
LOG_D(ENB_APP, "timeval_subtract(%ld.%06d, %ld.%06d)=%ld.%06d\n", a->tv_sec, a->tv_usec, b->tv_sec, b->tv_usec, result->tv_sec, result->tv_usec);
|
||||
|
||||
return a->tv_sec < b2.tv_sec;
|
||||
}
|
||||
|
||||
@@ -117,15 +120,22 @@ void et_scenario_schedule_tx_packet(et_packet_t * const packet)
|
||||
AssertFatal(gettimeofday(&now, NULL) == 0, "gettimeofday failed");
|
||||
timeval_subtract(&offset_last_tx_packet,&now,&g_scenario->time_last_tx_packet);
|
||||
timeval_subtract(&offset_last_rx_packet,&now,&g_scenario->time_last_rx_packet);
|
||||
LOG_D(ENB_APP, "offset_last_tx_packet=%ld.%06d\n", offset_last_tx_packet.tv_sec, offset_last_tx_packet.tv_usec);
|
||||
LOG_D(ENB_APP, "offset_last_rx_packet=%ld.%06d\n", offset_last_rx_packet.tv_sec, offset_last_rx_packet.tv_usec);
|
||||
|
||||
last_packet_was_tx = timeval_subtract(&offset_tx_rx,&offset_last_tx_packet,&offset_last_rx_packet);
|
||||
if (last_packet_was_tx) {
|
||||
LOG_D(ENB_APP, "last_packet_was_tx\n");
|
||||
we_are_too_early = timeval_subtract(&offset,&offset_last_tx_packet,&packet->time_relative_to_last_sent_packet);
|
||||
LOG_D(ENB_APP, "we_are_too_early=%d, offset=%ld.%06d\n", we_are_too_early, offset.tv_sec, offset.tv_usec);
|
||||
} else {
|
||||
LOG_D(ENB_APP, "last_packet_was_rx\n");
|
||||
we_are_too_early = timeval_subtract(&offset,&offset_last_rx_packet,&packet->time_relative_to_last_received_packet);
|
||||
LOG_D(ENB_APP, "we_are_too_early=%d, offset=%ld.%06d\n", we_are_too_early, offset.tv_sec, offset.tv_usec);
|
||||
}
|
||||
if (we_are_too_early > 0) {
|
||||
// set timer
|
||||
LOG_D(ENB_APP, "Send packet num %u original frame number %u in %ld.%d sec\n",
|
||||
LOG_D(ENB_APP, "Send packet num %u original frame number %u in %ld.%06d sec\n",
|
||||
packet->packet_number, packet->original_frame_number, offset.tv_sec, offset.tv_usec);
|
||||
|
||||
packet->status = ET_PACKET_STATUS_SCHEDULED_FOR_SENDING;
|
||||
@@ -138,6 +148,10 @@ void et_scenario_schedule_tx_packet(et_packet_t * const packet)
|
||||
LOG_D(ENB_APP, "Send packet num %u original frame number %u immediately\n", packet->packet_number, packet->original_frame_number);
|
||||
// send immediately
|
||||
AssertFatal(0 == gettimeofday(&packet->timestamp_packet, NULL), "gettimeofday() Failed");
|
||||
|
||||
g_scenario->time_last_tx_packet.tv_sec = packet->timestamp_packet.tv_sec;
|
||||
g_scenario->time_last_tx_packet.tv_usec = packet->timestamp_packet.tv_usec;
|
||||
|
||||
et_s1ap_eNB_itti_send_sctp_data_req(
|
||||
packet->enb_instance,
|
||||
packet->sctp_hdr.u.data_hdr.assoc_id,
|
||||
@@ -266,6 +280,10 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_waiting_tx(et_event_t event)
|
||||
case ET_EVENT_TX_TIMED_PACKET:
|
||||
// send immediately
|
||||
AssertFatal(0 == gettimeofday(&event.u.tx_timed_packet->timestamp_packet, NULL), "gettimeofday() Failed");
|
||||
|
||||
g_scenario->time_last_tx_packet.tv_sec = event.u.tx_timed_packet->timestamp_packet.tv_sec;
|
||||
g_scenario->time_last_tx_packet.tv_usec = event.u.tx_timed_packet->timestamp_packet.tv_usec;
|
||||
|
||||
et_s1ap_eNB_itti_send_sctp_data_req(
|
||||
event.u.tx_timed_packet->enb_instance,
|
||||
event.u.tx_timed_packet->sctp_hdr.u.data_hdr.assoc_id,
|
||||
@@ -325,8 +343,7 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_connecting_s1c(et_event_t even
|
||||
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");
|
||||
// hack simulate we have been able to get the right timing values for STCP connect
|
||||
AssertFatal(gettimeofday(&g_scenario->time_last_rx_packet, NULL) == 0, "gettimeofday failed");
|
||||
|
||||
while (NULL != g_scenario->next_packet) {
|
||||
@@ -452,6 +469,7 @@ et_fsm_state_t et_scenario_fsm_notify_event_state_null(et_event_t event)
|
||||
// Try to register each eNB
|
||||
g_scenario->registered_enb = 0;
|
||||
g_fsm_state = ET_FSM_STATE_CONNECTING_S1C;
|
||||
AssertFatal(gettimeofday(&g_scenario->time_last_tx_packet, NULL) == 0, "gettimeofday failed");
|
||||
et_eNB_app_register (g_scenario->enb_properties);
|
||||
pthread_mutex_unlock(&g_fsm_lock);
|
||||
return g_fsm_state;
|
||||
|
||||
@@ -343,6 +343,7 @@ et_packet_t* et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node) {
|
||||
|
||||
xml_char = xmlGetProp(node, (const xmlChar *)"action");
|
||||
packet->action = et_action_str2et_action_t(xml_char);
|
||||
packet->status = ET_PACKET_STATUS_NONE;
|
||||
xmlFree(xml_char);
|
||||
packet->packet_number = packet_number++;
|
||||
|
||||
|
||||
@@ -254,13 +254,18 @@ 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);
|
||||
S1AP_DEBUG("Packet received: num %u | original frame number %u \n", packet->packet_number, packet->original_frame_number);
|
||||
S1AP_DEBUG("Last Packet received: num %u | original frame number %u \n", g_scenario->last_rx_packet->packet_number, g_scenario->last_rx_packet->original_frame_number);
|
||||
|
||||
p = g_scenario->last_rx_packet;
|
||||
while (NULL != p) {
|
||||
if (p->action == ET_PACKET_ACTION_S1C_RECEIVE) {
|
||||
if (p->status == ET_PACKET_STATUS_RECEIVED) {
|
||||
if (ET_PACKET_ACTION_S1C_RECEIVE == p->action) {
|
||||
if ((ET_PACKET_STATUS_RECEIVED == p->status) || (ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT == p->status)) {
|
||||
g_scenario->last_rx_packet = p;
|
||||
g_scenario->time_last_rx_packet.tv_sec = p->timestamp_packet.tv_sec;
|
||||
g_scenario->time_last_rx_packet.tv_usec = p->timestamp_packet.tv_usec;
|
||||
S1AP_DEBUG("Set Last Packet received: num %u | original frame number %u \n", g_scenario->last_rx_packet->packet_number, g_scenario->last_rx_packet->original_frame_number);
|
||||
S1AP_DEBUG("Set time_last_rx_packet %ld.%06d\n", g_scenario->time_last_rx_packet.tv_sec, g_scenario->time_last_rx_packet.tv_usec);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
@@ -268,7 +273,7 @@ int et_scenario_set_packet_received(et_packet_t * const packet)
|
||||
p = p->next;
|
||||
}
|
||||
|
||||
if (packet->timer_id != 0) {
|
||||
if (0 != packet->timer_id) {
|
||||
rc = timer_remove(packet->timer_id);
|
||||
AssertFatal(rc == 0, "TODO: Debug Timer on Rx packet num %d unknown", packet->packet_number);
|
||||
return rc;
|
||||
@@ -291,9 +296,14 @@ int et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const s1ap_data_ind)
|
||||
packet = g_scenario->list_packet;
|
||||
while (NULL != packet) {
|
||||
if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) {
|
||||
if (packet->status == ET_PACKET_STATUS_RECEIVED) {
|
||||
if ((ET_PACKET_STATUS_RECEIVED == packet->status) || (ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT == packet->status)) {
|
||||
g_scenario->last_rx_packet = packet;
|
||||
g_scenario->time_last_rx_packet = g_scenario->last_rx_packet->timestamp_packet;
|
||||
if (ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT != packet->status) {
|
||||
g_scenario->time_last_rx_packet.tv_sec = packet->timestamp_packet.tv_sec;
|
||||
g_scenario->time_last_rx_packet.tv_usec = packet->timestamp_packet.tv_usec;
|
||||
}
|
||||
S1AP_DEBUG("Set Last Packet received: num %u | original frame number %u \n", g_scenario->last_rx_packet->packet_number, g_scenario->last_rx_packet->original_frame_number);
|
||||
S1AP_DEBUG("Set time_last_rx_packet %ld.%06d\n", g_scenario->time_last_rx_packet.tv_sec, g_scenario->time_last_rx_packet.tv_usec);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
@@ -309,10 +319,13 @@ int et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const s1ap_data_ind)
|
||||
if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) {
|
||||
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);
|
||||
S1AP_DEBUG("Compare RX packet with packet: num %u | original frame number %u \n", packet->packet_number, packet->original_frame_number);
|
||||
packet->timestamp_packet.tv_sec = rx_packet->timestamp_packet.tv_sec;
|
||||
packet->timestamp_packet.tv_usec = rx_packet->timestamp_packet.tv_usec;
|
||||
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));
|
||||
S1AP_DEBUG("Compare RX packet with packet: num %u | original frame number %u failed:%s\n",
|
||||
packet->packet_number, packet->original_frame_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)) {
|
||||
|
||||
Reference in New Issue
Block a user