From: Oliver Hartkopp Date: Thu, 16 Apr 2009 08:05:42 +0000 (+0000) Subject: Added commandline option '-r' to set the per-socket receive buffer size. X-Git-Url: https://rtime.felk.cvut.cz/gitweb/sojka/can-utils.git/commitdiff_plain/e765683c9b498362620bf4a1c28cf90c47d32a70 Added commandline option '-r' to set the per-socket receive buffer size. --- diff --git a/candump.c b/candump.c index 9300e7d..ae20374 100644 --- a/candump.c +++ b/candump.c @@ -115,6 +115,7 @@ void print_usage(char *prg) fprintf(stderr, " -l (log CAN-frames into file. Sets '-s %d' by default)\n", SILENT_ON); fprintf(stderr, " -L (use log file format on stdout)\n"); fprintf(stderr, " -n (terminate after receiption of CAN frames)\n"); + fprintf(stderr, " -r (set socket receive buffer to )\n"); fprintf(stderr, "\n"); fprintf(stderr, "Up to %d CAN interfaces with optional filter sets can be specified\n", MAXSOCK); fprintf(stderr, "on the commandline in the form: [,filter]*\n"); @@ -203,6 +204,7 @@ int main(int argc, char **argv) unsigned char log = 0; unsigned char logfrmt = 0; int count = 0; + int rcvbuf_size = 0; int opt, ret; int currmax, numfilter; char *ptr, *nptr; @@ -222,7 +224,7 @@ int main(int argc, char **argv) last_tv.tv_sec = 0; last_tv.tv_usec = 0; - while ((opt = getopt(argc, argv, "t:ciaSs:b:B:lLn:h?")) != -1) { + while ((opt = getopt(argc, argv, "t:ciaSs:b:B:lLn:r:h?")) != -1) { switch (opt) { case 't': timestamp = optarg[0]; @@ -313,6 +315,14 @@ int main(int argc, char **argv) } break; + case 'r': + rcvbuf_size = atoi(optarg); + if (rcvbuf_size < 1) { + print_usage(basename(argv[0])); + exit(1); + } + break; + default: print_usage(basename(argv[0])); exit(1); @@ -452,6 +462,30 @@ int main(int argc, char **argv) } /* if (nptr) */ + if (rcvbuf_size) { + + int curr_rcvbuf_size; + socklen_t curr_rcvbuf_size_len = sizeof(curr_rcvbuf_size); + + if (setsockopt(s[i], SOL_SOCKET, SO_RCVBUF, + &rcvbuf_size, sizeof(rcvbuf_size)) < 0) { + perror("setsockopt SO_RCVBUF"); + exit(1); + } + + if (getsockopt(s[i], SOL_SOCKET, SO_RCVBUF, + &curr_rcvbuf_size, &curr_rcvbuf_size_len) < 0) { + perror("getsockopt SO_RCVBUF"); + exit(1); + } + + /* Only print a warning the first time we detect the adjustment */ + /* n.b.: The wanted size is doubled in Linux in net/sore/sock.c */ + if (!i && curr_rcvbuf_size < rcvbuf_size*2) + fprintf(stderr, "The socket receive buffer size was " + "adjusted due to /proc/sys/net/core/rmem_max.\n"); + } + if (bind(s[i], (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind"); return 1;