diff --git a/src/sflowtool.c b/src/sflowtool.c index b964019..22d7f6e 100644 --- a/src/sflowtool.c +++ b/src/sflowtool.c @@ -206,6 +206,8 @@ typedef struct _SFFieldList { typedef struct _SFConfig { /* sflow(R) options */ uint16_t sFlowInputPort; + int sFlowSocketBufferSizeIpv4; + int sFlowSocketBufferSizeIpv6; /* netflow(TM) options */ uint16_t netFlowOutputPort; SFLAddress netFlowOutputIP; @@ -5811,6 +5813,13 @@ static int openInputUDPSocket(char *address, uint16_t port) return -1; } + if (sfConfig.sFlowSocketBufferSizeIpv4 != -1) { + if ((setsockopt(soc, SOL_SOCKET, SO_RCVBUF, &sfConfig.sFlowSocketBufferSizeIpv4, (socklen_t) sizeof(sfConfig.sFlowSocketBufferSizeIpv4))) == -1) { + fprintf(ERROUT, "v4 setsockopt( SO_RCVBUF ) failed, %s\n", strerror(errno)); + return -1; + } + } + /* make socket non-blocking */ int save_fd = fcntl(soc, F_GETFL); save_fd |= O_NONBLOCK; @@ -5852,6 +5861,13 @@ static int openInputUDP6Socket(char *address, uint16_t port) exit(-6); } + if (sfConfig.sFlowSocketBufferSizeIpv6 != -1) { + if ((setsockopt(soc, SOL_SOCKET, SO_RCVBUF, &sfConfig.sFlowSocketBufferSizeIpv6, (socklen_t) sizeof(sfConfig.sFlowSocketBufferSizeIpv6))) == -1) { + fprintf(ERROUT, "v6 setsockopt( SO_RCVBUF ) failed, %s\n", strerror(errno)); + return -1; + } + } + /* make socket non-blocking */ int save_fd = fcntl(soc, F_GETFL); save_fd |= O_NONBLOCK; @@ -6475,6 +6491,10 @@ static void instructions(char *command) fprintf(ERROUT,"general:\n"); fprintf(ERROUT, " -k - keep going on non-signal errors rather than aborting\n"); fprintf(ERROUT, " -D - allow hosts to be referenced by DNS name\n"); + fprintf(ERROUT, " -u - set IPv4 UDP socket buffer size\n"); + fprintf(ERROUT, " (has no effect if sflowtool doesn't listen on IPv4 socket)\n"); + fprintf(ERROUT, " -U - set IPv6 UDP socket buffer size\n"); + fprintf(ERROUT, " (has no effect if sflowtool doesn't listen on IPv6 socket)\n"); fprintf(ERROUT,"\n"); fprintf(ERROUT,"forwarding:\n"); fprintf(ERROUT, " -f host/port - forward sflow to IP (or hostname if -D added)\n"); @@ -6539,6 +6559,8 @@ static void process_command_line(int argc, char *argv[]) sfConfig.listen4 = NO; sfConfig.listen6 = YES; sfConfig.keepGoing = NO; + sfConfig.sFlowSocketBufferSizeIpv4 = -1; + sfConfig.sFlowSocketBufferSizeIpv6 = -1; /* change "+v" to "-V" and "+4" to "-A" @@ -6584,6 +6606,8 @@ static void process_command_line(int argc, char *argv[]) // ==== argument required ==== { "fields", required_argument, NULL, 'L' }, { "port", required_argument, NULL, 'p' }, + { "socket-buffer-size-ipv4", required_argument, NULL, 'u' }, + { "socket-buffer-size-ipv6", required_argument, NULL, 'U' }, { "read-pcap", required_argument, NULL, 'r' }, { "read-pcap-sampling", required_argument, NULL, 'R' }, { "read-pcap-playback", required_argument, NULL, 'P' }, @@ -6599,7 +6623,7 @@ static void process_command_line(int argc, char *argv[]) in = getopt_long(argc, argv, - "ljJgtTM