Merge remote branch 'origin/topic/robin/work'

* origin/topic/robin/work:
  Smarter way to increase the parent/child pipe's socket buffer. (Craig Leres).
  Fixing bug with defining bro_int_t and bro_uint_t as 64-bit in some platforms.
This commit is contained in:
Robin Sommer 2011-02-07 13:43:48 -08:00
commit abc365e38f
5 changed files with 49 additions and 24 deletions

View file

@ -1,3 +1,11 @@
1.6-dev.41 Mon Feb 7 13:43:56 PST 2011
- Smarter way to increase the parent/child pipe's socket buffer.
(Craig Leres).
- Fixing bug with defining bro_int_t and bro_uint_t to be 64 bits wide
on some platforms. (Robin Sommer)
1.6-dev.39 Mon Jan 31 16:42:23 PST 2011 1.6-dev.39 Mon Jan 31 16:42:23 PST 2011
- Login's confused messages now go through weird.bro. (Robin Sommer) - Login's confused messages now go through weird.bro. (Robin Sommer)

View file

@ -1 +1 @@
1.6-dev.39 1.6-dev.41

View file

@ -544,6 +544,36 @@ void RemoteSerializer::Init()
initialized = 1; initialized = 1;
} }
void RemoteSerializer::SetSocketBufferSize(int fd, int opt, const char *what, int size, int verbose)
{
int defsize = 0;
socklen_t len = sizeof(defsize);
if ( getsockopt(fd, SOL_SOCKET, opt, (void *)&defsize, &len) < 0 )
{
if ( verbose )
Log(LogInfo, fmt("warning: cannot get socket buffer size (%s): %s", what, strerror(errno)));
return;
}
for ( int trysize = size; trysize > defsize; trysize -= 1024 )
{
if ( setsockopt(fd, SOL_SOCKET, opt, &trysize, sizeof(trysize)) >= 0 )
{
if ( verbose )
{
if ( trysize == size )
Log(LogInfo, fmt("raised pipe's socket buffer size from %dK to %dK", defsize / 1024, trysize / 1024));
else
Log(LogInfo, fmt("raised pipe's socket buffer size from %dK to %dK (%dK was requested)", defsize / 1024, trysize / 1024, size / 1024));
}
return;
}
}
Log(LogInfo, fmt("warning: cannot increase %s socket buffer size from %dK (%dK was requested)", what, defsize / 1024, size / 1024));
}
void RemoteSerializer::Fork() void RemoteSerializer::Fork()
{ {
if ( child_pid ) if ( child_pid )
@ -562,25 +592,11 @@ void RemoteSerializer::Fork()
return; return;
} }
int bufsize; // Try to increase the size of the socket send and receive buffers.
socklen_t len = sizeof(bufsize); SetSocketBufferSize(pipe[0], SO_SNDBUF, "SO_SNDBUF", SOCKBUF_SIZE, 1);
SetSocketBufferSize(pipe[0], SO_RCVBUF, "SO_RCVBUF", SOCKBUF_SIZE, 0);
if ( getsockopt(pipe[0], SOL_SOCKET, SO_SNDBUF, &bufsize, &len ) < 0 ) SetSocketBufferSize(pipe[1], SO_SNDBUF, "SO_SNDBUF", SOCKBUF_SIZE, 0);
Log(LogInfo, fmt("warning: cannot get socket buffer size: %s", strerror(errno))); SetSocketBufferSize(pipe[1], SO_RCVBUF, "SO_RCVBUF", SOCKBUF_SIZE, 0);
else
Log(LogInfo, fmt("pipe's socket buffer size is %d, setting to %d", bufsize, SOCKBUF_SIZE));
bufsize = SOCKBUF_SIZE;
if ( setsockopt(pipe[0], SOL_SOCKET, SO_SNDBUF,
&bufsize, sizeof(bufsize) ) < 0 ||
setsockopt(pipe[0], SOL_SOCKET, SO_RCVBUF,
&bufsize, sizeof(bufsize) ) < 0 ||
setsockopt(pipe[1], SOL_SOCKET, SO_SNDBUF,
&bufsize, sizeof(bufsize) ) < 0 ||
setsockopt(pipe[1], SOL_SOCKET, SO_RCVBUF,
&bufsize, sizeof(bufsize) ) < 0 )
Log(LogInfo, fmt("warning: cannot set socket buffer size to %dK: %s", bufsize / 1024, strerror(errno)));
child_pid = 0; child_pid = 0;

View file

@ -297,6 +297,8 @@ protected:
bool SendToChild(char type, Peer* peer, int nargs, ...); // can send uints32 only bool SendToChild(char type, Peer* peer, int nargs, ...); // can send uints32 only
bool SendToChild(ChunkedIO::Chunk* c); bool SendToChild(ChunkedIO::Chunk* c);
void SetSocketBufferSize(int fd, int opt, const char *what, int size, int verbose);
private: private:
enum { TYPE, ARGS } msgstate; // current state of reading comm. enum { TYPE, ARGS } msgstate; // current state of reading comm.
Peer* current_peer; Peer* current_peer;

View file

@ -39,13 +39,9 @@
extern HeapLeakChecker* heap_checker; extern HeapLeakChecker* heap_checker;
#endif #endif
typedef unsigned long long int uint64;
typedef unsigned int uint32; typedef unsigned int uint32;
typedef unsigned short uint16; typedef unsigned short uint16;
typedef unsigned char uint8; typedef unsigned char uint8;
typedef long long int int64;
typedef int64 bro_int_t;
typedef uint64 bro_uint_t;
#if SIZEOF_LONG_LONG == 8 #if SIZEOF_LONG_LONG == 8
typedef unsigned long long uint64; typedef unsigned long long uint64;
@ -57,6 +53,9 @@ typedef long int int64;
# error "Couldn't reliably identify 64-bit type. Please report to bro@bro-ids.org." # error "Couldn't reliably identify 64-bit type. Please report to bro@bro-ids.org."
#endif #endif
typedef int64 bro_int_t;
typedef uint64 bro_uint_t;
// "ptr_compat_uint" and "ptr_compat_int" are (un)signed integers of // "ptr_compat_uint" and "ptr_compat_int" are (un)signed integers of
// pointer size. They can be cast safely to a pointer, e.g. in Lists, // pointer size. They can be cast safely to a pointer, e.g. in Lists,
// which represent their entities as void* pointers. // which represent their entities as void* pointers.