cansequence: show delta and obsolute overflows

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
pull/254/head^2
Marc Kleine-Budde 2015-09-17 13:47:24 +02:00
parent de5b9607dc
commit d699135833
1 changed files with 14 additions and 4 deletions

View File

@ -94,6 +94,7 @@ static void do_receive()
uint32_t sequence_rx = 0; uint32_t sequence_rx = 0;
uint32_t sequence_delta = 0; uint32_t sequence_delta = 0;
uint32_t sequence = 0; uint32_t sequence = 0;
unsigned int overflow_old = 0;
if (setsockopt(s, SOL_SOCKET, SO_RXQ_OVFL, if (setsockopt(s, SOL_SOCKET, SO_RXQ_OVFL,
&dropmonitor_on, sizeof(dropmonitor_on)) < 0) { &dropmonitor_on, sizeof(dropmonitor_on)) < 0) {
@ -129,7 +130,8 @@ static void do_receive()
sequence_delta = (sequence_rx - sequence) & sequence_mask; sequence_delta = (sequence_rx - sequence) & sequence_mask;
if (sequence_delta) { if (sequence_delta) {
struct cmsghdr *cmsg; struct cmsghdr *cmsg;
uint32_t overflows = 0; uint32_t overflow = 0;
uint32_t overflow_delta;
drop_count++; drop_count++;
@ -137,18 +139,26 @@ static void do_receive()
cmsg && (cmsg->cmsg_level == SOL_SOCKET); cmsg && (cmsg->cmsg_level == SOL_SOCKET);
cmsg = CMSG_NXTHDR(&msg,cmsg)) { cmsg = CMSG_NXTHDR(&msg,cmsg)) {
if (cmsg->cmsg_type == SO_RXQ_OVFL) { if (cmsg->cmsg_type == SO_RXQ_OVFL) {
memcpy(&overflows, CMSG_DATA(cmsg), sizeof(overflows)); memcpy(&overflow, CMSG_DATA(cmsg), sizeof(overflow));
break; break;
} }
} }
fprintf(stderr, "[%d] received wrong sequence count. expected: %d, got: %d, socket overflows: %u\n", overflow_delta = overflow - overflow_old;
drop_count, sequence & sequence_mask, sequence_rx, overflows);
fprintf(stderr,
"sequence CNT: %6u, RX: %6u expected: %3u missing: %4u skt overfl d: %4u a: %4u delta: %3u incident: %u\n",
sequence, sequence_rx,
sequence & sequence_mask, sequence_delta,
overflow_delta, overflow,
sequence_delta - overflow_delta,
drop_count);
if (drop_count == drop_until_quit) if (drop_count == drop_until_quit)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
sequence = sequence_rx; sequence = sequence_rx;
overflow_old = overflow;
} else if (verbose > 1) { } else if (verbose > 1) {
printf("sequence CNT: %6u, RX: %6u\n", sequence, sequence_rx); printf("sequence CNT: %6u, RX: %6u\n", sequence, sequence_rx);
} }