Commit a94df26d authored by Joanne Hugé's avatar Joanne Hugé

Merge branch 'packet-exchange' into measure-analysis

parents 660a9ae0 8b44c169
...@@ -18,7 +18,12 @@ CLIENT_SRCS += utilities.c ...@@ -18,7 +18,12 @@ CLIENT_SRCS += utilities.c
SERVER_OBJS = $(SERVER_SRCS:%.c=%.o) SERVER_OBJS = $(SERVER_SRCS:%.c=%.o)
CLIENT_OBJS = $(CLIENT_SRCS:%.c=%.o) CLIENT_OBJS = $(CLIENT_SRCS:%.c=%.o)
ifeq ($(DEBUG),)
CFLAGS = -O2 -Wall -Wextra
else
CFLAGS = -Og -g -Wall -Wextra CFLAGS = -Og -g -Wall -Wextra
endif
CFLAGS += -MD -MP CFLAGS += -MD -MP
CFLAGS += -I $(SRCDIR) CFLAGS += -I $(SRCDIR)
CFLAGS += -std=gnu99 CFLAGS += -std=gnu99
......
...@@ -78,7 +78,7 @@ struct timespec measures_start; ...@@ -78,7 +78,7 @@ struct timespec measures_start;
struct timespec measures_end; struct timespec measures_end;
static void help(char *argv[]) { static void help(char *argv[]) {
printf("Usage: %s -f IF [-abethgv] [-d BUF_LEN] [-i USEC] [-l N] [-p PRIO] [-r USEC]\n\n", argv[0]); printf("Usage: %s -f IF [-abethgv] [-d BUF_LEN] [-i USEC] [-l N] [-p PRIO] [-q PACKET_PRIO] [-r USEC]\n\n", argv[0]);
printf(" -a Run the real time thread on CPU1\n"); printf(" -a Run the real time thread on CPU1\n");
printf(" -b Measure RTT\n"); printf(" -b Measure RTT\n");
printf(" -d BUF_LEN Set the length of tx buffer\n"); printf(" -d BUF_LEN Set the length of tx buffer\n");
...@@ -89,6 +89,7 @@ static void help(char *argv[]) { ...@@ -89,6 +89,7 @@ static void help(char *argv[]) {
printf(" -i USEC Wake up the real time thread every USEC microseconds (Default: 10ms)\n"); printf(" -i USEC Wake up the real time thread every USEC microseconds (Default: 10ms)\n");
printf(" -l N Wake up the real time thread N times (Default: 0)\n"); printf(" -l N Wake up the real time thread N times (Default: 0)\n");
printf(" -p PRIO Run the real time thread at priority PRIO\n"); printf(" -p PRIO Run the real time thread at priority PRIO\n");
printf(" -q PACKET_PRIO Send packets with PACKET_PRIO priority\n");
printf(" -r USEC Refresh the non real time main thread every USEC microseconds (Default: 50ms)\n"); printf(" -r USEC Refresh the non real time main thread every USEC microseconds (Default: 50ms)\n");
printf(" -t Enable timestamps\n"); printf(" -t Enable timestamps\n");
printf(" -v Verbose\n"); printf(" -v Verbose\n");
...@@ -231,6 +232,7 @@ int main(int argc, char *argv[]) { ...@@ -231,6 +232,7 @@ int main(int argc, char *argv[]) {
// Critical TSN task // Critical TSN task
static void do_tsn_task(struct thread_param *param, uint64_t next_txtime) { static void do_tsn_task(struct thread_param *param, uint64_t next_txtime) {
struct timespec t1, t2; struct timespec t1, t2;
int rtt_us;
// One way packet sending // One way packet sending
if (tsn_task == SEND_PACKET_TASK) { if (tsn_task == SEND_PACKET_TASK) {
...@@ -249,6 +251,15 @@ static void do_tsn_task(struct thread_param *param, uint64_t next_txtime) { ...@@ -249,6 +251,15 @@ static void do_tsn_task(struct thread_param *param, uint64_t next_txtime) {
clock_gettime(CLOCK_MONOTONIC, &t2); clock_gettime(CLOCK_MONOTONIC, &t2);
param->stats.rtt = calcdiff_ns(t2, t1); param->stats.rtt = calcdiff_ns(t2, t1);
if(enable_histograms) {
rtt_us = param->stats.rtt / 1000;
if(rtt_us > MAX_HIST_VAL) {
fprintf(stderr, "RTT value higher than MAX_HIST_VAL : %d ( > %d)\n", rtt_us, MAX_HIST_VAL);
exit(EXIT_FAILURE);
}
histograms[0][rtt_us]++;
}
} }
} }
...@@ -257,6 +268,7 @@ static void print_histograms() { ...@@ -257,6 +268,7 @@ static void print_histograms() {
uint64_t duration; uint64_t duration;
int duration_hour, duration_minutes, interval; int duration_hour, duration_minutes, interval;
int max_hist_val, nb_hists;
clock_gettime(CLOCK_MONOTONIC, &measures_end); clock_gettime(CLOCK_MONOTONIC, &measures_end);
...@@ -266,27 +278,41 @@ static void print_histograms() { ...@@ -266,27 +278,41 @@ static void print_histograms() {
interval = param->interval / 1000; interval = param->interval / 1000;
printf("{\"measure_sets\": [{" if(tsn_task == SEND_PACKET_TASK) {
"\"measure_type\": \"packet_send_timestamps\"," printf("{\"measure_sets\": [{"
"\"props_names\": [\"user_space\", \"kernel_space\"]," "\"measure_type\": \"packet_send_timestamps\","
"\"units\": [\"us\", \"us\"]," "\"props_names\": [\"user_space\", \"kernel_space\"],"
"\"props_type\": \"histogram\"," "\"units\": [\"us\", \"us\"],"
"\"metadata\": {" "\"props_type\": \"histogram\","
"\"i\": \"%dus\", \"duration\": \"%dh%d\"" "\"metadata\": {"
"}," "\"i\": \"%dus\", \"duration\": \"%dh%d\""
"\"props\": [", interval, duration_hour, duration_minutes); "},"
"\"props\": [", interval, duration_hour, duration_minutes);
int max_hist_val = 0; } else if(tsn_task == RTT_TASK) {
for (int i = 0; i < 2; i++) printf("{\"measure_sets\": [{"
"\"measure_type\": \"packet_rtt\","
"\"props_names\": [\"rtt\"],"
"\"units\": [\"us\"],"
"\"props_type\": \"histogram\","
"\"metadata\": {"
"\"i\": \"%dus\", \"duration\": \"%dh%d\""
"},"
"\"props\": [", interval, duration_hour, duration_minutes);
}
nb_hists = tsn_task == SEND_PACKET_TASK ? 2 : 1;
max_hist_val = 0;
for (int i = 0; i < nb_hists; i++)
for (int j = 0; j < MAX_HIST_VAL; j++) for (int j = 0; j < MAX_HIST_VAL; j++)
if (histograms[i][j]) if (histograms[i][j])
max_hist_val = j > max_hist_val ? j : max_hist_val; max_hist_val = j > max_hist_val ? j : max_hist_val;
for (int i = 0; i < 2; i++) { for (int i = 0; i < nb_hists; i++) {
printf("["); printf("[");
for (int j = 0; j < max_hist_val; j++) for (int j = 0; j < max_hist_val; j++)
printf("%" PRIi64 "%s", histograms[i][j], (j + 1 < max_hist_val ? ", " : "")); printf("%" PRIi64 "%s", histograms[i][j], (j + 1 < max_hist_val ? ", " : ""));
printf("%s", (i + 1 < 2 ? "], " : "]")); printf("%s", (i + 1 < nb_hists ? "], " : "]"));
} }
printf( "]}]}\n"); printf( "]}]}\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment