int process_test_results()

in src/util.c [80:146]


int process_test_results(struct ntttcp_test_endpoint *tep)
{
	struct ntttcp_test_endpoint_results *tepr = tep->results;
	unsigned int i;
	double cpu_speed_mhz;
	double test_duration = tepr->actual_test_time;
	uint64_t total_bytes = tepr->total_bytes;
	long double cpu_ps_total_diff;

	if (test_duration == 0)
		return -1;

	/*
	 * calculate for per-thread counters, even for receiver's sync thread
	 * we will ignore that sync thread when printing in "print_test_results()"
	 */
	for (i = 0; i < tep->total_threads; i++) {
		if (tep->results->threads[i]->is_sync_thread == true)
			continue;

		tepr->threads[i]->KBps = tepr->threads[i]->total_bytes / tepr->threads[i]->actual_test_time / DECIMAL_BASED_UNIT_K;
		tepr->threads[i]->MBps = tepr->threads[i]->KBps / DECIMAL_BASED_UNIT_K;
		tepr->threads[i]->mbps = tepr->threads[i]->MBps * BYTE_TO_BITS;
	}

	/* calculate for overall counters */
	cpu_speed_mhz = read_value_from_proc(PROC_FILE_CPUINFO, CPU_SPEED_MHZ);
	tepr->cpu_speed_mhz = cpu_speed_mhz;

	tepr->retrans_segments_per_sec = (tepr->final_tcp_retrans->retrans_segs - tepr->init_tcp_retrans->retrans_segs) / test_duration;
	tepr->tcp_lost_retransmit_per_sec = (tepr->final_tcp_retrans->tcp_lost_retransmit - tepr->init_tcp_retrans->tcp_lost_retransmit) / test_duration;
	tepr->tcp_syn_retrans_per_sec = (tepr->final_tcp_retrans->tcp_syn_retrans - tepr->init_tcp_retrans->tcp_syn_retrans) / test_duration;
	tepr->tcp_fast_retrans_per_sec = (tepr->final_tcp_retrans->tcp_fast_retrans - tepr->init_tcp_retrans->tcp_fast_retrans) / test_duration;
	tepr->tcp_forward_retrans_per_sec = (tepr->final_tcp_retrans->tcp_forward_retrans - tepr->init_tcp_retrans->tcp_forward_retrans) / test_duration;
	tepr->tcp_slowStart_retrans_per_sec = (tepr->final_tcp_retrans->tcp_slowStart_retrans - tepr->init_tcp_retrans->tcp_slowStart_retrans) / test_duration;
	tepr->tcp_retrans_fail_per_sec = (tepr->final_tcp_retrans->tcp_retrans_fail - tepr->init_tcp_retrans->tcp_retrans_fail) / test_duration;

	tepr->packets_sent = tepr->final_tx_packets - tepr->init_tx_packets;
	tepr->packets_received = tepr->final_rx_packets - tepr->init_rx_packets;
	tepr->total_interrupts = tepr->final_interrupts - tepr->init_interrupts;
	tepr->packets_per_interrupt = tepr->total_interrupts == 0 ? 0 : (tepr->packets_sent + tepr->packets_received) / (double)tepr->total_interrupts;

	cpu_ps_total_diff = tepr->final_cpu_ps->total_time - tepr->init_cpu_ps->total_time;
	tepr->cpu_ps_user_usage = (tepr->final_cpu_ps->user_time - tepr->init_cpu_ps->user_time) / cpu_ps_total_diff;
	tepr->cpu_ps_system_usage = (tepr->final_cpu_ps->system_time - tepr->init_cpu_ps->system_time) / cpu_ps_total_diff;
	tepr->cpu_ps_idle_usage = (tepr->final_cpu_ps->idle_time - tepr->init_cpu_ps->idle_time) / cpu_ps_total_diff;
	tepr->cpu_ps_iowait_usage = (tepr->final_cpu_ps->iowait_time - tepr->init_cpu_ps->iowait_time) / cpu_ps_total_diff;
	tepr->cpu_ps_softirq_usage = (tepr->final_cpu_ps->softirq_time - tepr->init_cpu_ps->softirq_time) / cpu_ps_total_diff;

	/* calculate for counters for xml log (compatible with Windows ntttcp.exe) */
	tepr->throughput_Bps  = (double)total_bytes / test_duration;
	tepr->total_bytes_MB  = (double)total_bytes / DECIMAL_BASED_UNIT_M;
	tepr->throughput_MBps = tepr->total_bytes_MB / test_duration;
	tepr->throughput_mbps = tepr->throughput_MBps * BYTE_TO_BITS;
	tepr->cycles_per_byte = total_bytes == 0 ? 0 :
				cpu_speed_mhz * 1000 * 1000 * test_duration * (tepr->final_cpu_ps->nproc) * (1 - tepr->cpu_ps_idle_usage) / total_bytes;
	tepr->packets_retransmitted = tepr->final_tcp_retrans->retrans_segs - tepr->init_tcp_retrans->retrans_segs;
	tepr->cpu_busy_percent = ((tepr->final_cpu_usage->clock - tepr->init_cpu_usage->clock) * 1000000.0 / CLOCKS_PER_SEC)
				 / (tepr->final_cpu_usage->time - tepr->init_cpu_usage->time);
	tepr->errors = 0;

	/* calculate TCP RTT */
	if (tep->endpoint_role == ROLE_SENDER && tep->test->protocol == TCP)
		run_ntttcp_rtt_calculation_for_sender(tep);

	return 0;
}