summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc Kleine-Budde <mkl@pengutronix.de>2015-05-10 22:48:36 +0200
committerMarc Kleine-Budde <mkl@pengutronix.de>2015-05-10 23:10:58 +0200
commit50d721b860dd8f7526534bea1a8fb8d65daea239 (patch)
treeb350a722def69e56be7cc670f338aaf6d8874d40
parent30535005d64e8960c39804d70322ff1b8c240a4e (diff)
downloadcanutils-50d721b860dd8f7526534bea1a8fb8d65daea239.tar.gz
canutils-50d721b860dd8f7526534bea1a8fb8d65daea239.tar.xz
cansequence: print out dropped packages by socket counter
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
-rw-r--r--src/GNUmakefile.am3
-rw-r--r--src/cansequence.c38
2 files changed, 37 insertions, 4 deletions
diff --git a/src/GNUmakefile.am b/src/GNUmakefile.am
index 121677a..95e192a 100644
--- a/src/GNUmakefile.am
+++ b/src/GNUmakefile.am
@@ -15,7 +15,8 @@ AM_CPPFLAGS = \
-I$(top_srcdir)/include \
-I$(top_builddir)/include \
-DPF_CAN=29 \
- -DAF_CAN=PF_CAN
+ -DAF_CAN=PF_CAN \
+ -DSO_RXQ_OVFL=40
MAINTAINERCLEANFILES = \
GNUmakefile.in
diff --git a/src/cansequence.c b/src/cansequence.c
index 394a0bf..0939b9e 100644
--- a/src/cansequence.c
+++ b/src/cansequence.c
@@ -78,10 +78,26 @@ static void sigterm(int signo)
static void do_receive()
{
+ uint8_t ctrlmsg[CMSG_SPACE(sizeof(struct timeval)) + CMSG_SPACE(sizeof(__u32))];
+ struct iovec iov = {
+ .iov_base = &frame,
+ };
+ struct msghdr msg = {
+ .msg_iov = &iov,
+ .msg_iovlen = 1,
+ .msg_control = &ctrlmsg,
+ };
+ struct cmsghdr *cmsg;
+ const int dropmonitor_on = 1;
unsigned int seq_wrap = 0;
uint8_t sequence = 0;
ssize_t nbytes;
+ if (setsockopt(s, SOL_SOCKET, SO_RXQ_OVFL,
+ &dropmonitor_on, sizeof(dropmonitor_on)) < 0) {
+ perror("setsockopt() SO_RXQ_OVFL not supported by your Linux Kernel");
+ }
+
/* enable recv. now */
if (setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, filter, sizeof(filter))) {
perror("setsockopt()");
@@ -89,7 +105,11 @@ static void do_receive()
}
while ((infinite || loopcount--) && running) {
- nbytes = read(s, &frame, sizeof(struct can_frame));
+ msg.msg_iov[0].iov_len = sizeof(frame);
+ msg.msg_controllen = sizeof(ctrlmsg);
+ msg.msg_flags = 0;
+ nbytes = recvmsg(s, &msg, 0);
+
if (nbytes < 0) {
perror("read()");
exit(EXIT_FAILURE);
@@ -104,8 +124,20 @@ static void do_receive()
printf("received frame. sequence number: %d\n", frame.data[0]);
if (frame.data[0] != sequence) {
- printf("received wrong sequence count. expected: %d, got: %d\n",
- sequence, frame.data[0]);
+ uint32_t overflows = 0;
+
+ for (cmsg = CMSG_FIRSTHDR(&msg);
+ cmsg && (cmsg->cmsg_level == SOL_SOCKET);
+ cmsg = CMSG_NXTHDR(&msg,cmsg)) {
+ if (cmsg->cmsg_type == SO_RXQ_OVFL) {
+ memcpy(&overflows, CMSG_DATA(cmsg), sizeof(overflows));
+ break;
+ }
+ }
+
+ fprintf(stderr, "received wrong sequence count. expected: %d, got: %d, socket overflows: %u\n",
+ sequence, frame.data[0], overflows);
+
if (quit)
exit(EXIT_FAILURE);