From 0a9920e2dbc0891b418eed3366b59bb65c21c88c Mon Sep 17 00:00:00 2001 Message-Id: <0a9920e2dbc0891b418eed3366b59bb65c21c88c.1715376015.git.mdw@distorted.org.uk> From: Mark Wooding Date: Sat, 3 Mar 2001 11:15:19 +0000 Subject: [PATCH] Set the socket send and receive buffers to maximum. At least this way, we won't drop large packets on the floor. If the administrator wants to prevent fragmentation of TrIPE messages, he can lower the MTU on the tunnel interface. Getting path-MTU stuff out of the kernel is too much system-specific hard work for this program. Organization: Straylight/Edgeware From: mdw --- peer.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/peer.c b/peer.c index 2f3d09ab..f60f887f 100644 --- a/peer.c +++ b/peer.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: peer.c,v 1.4 2001/02/16 21:40:24 mdw Exp $ + * $Id: peer.c,v 1.5 2001/03/03 11:15:19 mdw Exp $ * * Communication with the peer * @@ -29,6 +29,13 @@ /*----- Revision history --------------------------------------------------* * * $Log: peer.c,v $ + * Revision 1.5 2001/03/03 11:15:19 mdw + * Set the socket send and receive buffers to maximum. At least this way, + * we won't drop large packets on the floor. If the administrator wants to + * prevent fragmentation of TrIPE messages, he can lower the MTU on the + * tunnel interface. Getting path-MTU stuff out of the kernel is too much + * system-specific hard work for this program. + * * Revision 1.4 2001/02/16 21:40:24 mdw * Change key exchange message interface. Maintain statistics. * @@ -273,6 +280,15 @@ void p_init(unsigned port) { int fd; struct sockaddr_in sin; + int len = 65536; + + /* --- Note on socket buffer sizes --- * + * + * For some bizarre reason, Linux 2.2 (at least) doubles the socket buffer + * sizes I pass to @setsockopt@. I'm not putting special-case code here + * for Linux: BSD (at least TCPv2) does what I tell it rather than second- + * guessing me. + */ if ((fd = socket(PF_INET, SOCK_DGRAM, 0)) < 0) die(EXIT_FAILURE, "socket creation failed: %s", strerror(errno)); @@ -282,6 +298,11 @@ void p_init(unsigned port) sin.sin_port = htons(port); if (bind(fd, (struct sockaddr *)&sin, sizeof(sin))) die(EXIT_FAILURE, "bind failed: %s", strerror(errno)); + if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &len, sizeof(len)) || + setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &len, sizeof(len))) { + die(EXIT_FAILURE, "failed to set socket buffer sizes: %s", + strerror(errno)); + } fdflags(fd, O_NONBLOCK, O_NONBLOCK, FD_CLOEXEC, FD_CLOEXEC); sel_initfile(&sel, &sock, fd, SEL_READ, p_read, 0); sel_addfile(&sock); -- [mdw]