1 /* $NetBSD: inet_windowsize.c,v 1.1.1.1 2009/06/23 10:09:00 tron Exp $ */ 2 3 /*++ 4 /* NAME 5 /* inet_windowsize 3 6 /* SUMMARY 7 /* TCP window scaling control 8 /* SYNOPSIS 9 /* #include <iostuff.h> 10 /* 11 /* int inet_windowsize; 12 /* 13 /* void set_inet_windowsize(sock, windowsize) 14 /* int sock; 15 /* int windowsize; 16 /* DESCRIPTION 17 /* set_inet_windowsize() overrides the default TCP window size 18 /* with the specified value. When called before listen() or 19 /* accept(), this works around broken infrastructure that 20 /* mis-handles TCP window scaling options. 21 /* 22 /* The global inet_windowsize variable is available for other 23 /* routines to remember that they wish to override the default 24 /* TCP window size. The variable is not accessed by the 25 /* set_inet_windowsize() function itself. 26 /* 27 /* Arguments: 28 /* .IP sock 29 /* TCP communication endpoint, before the connect(2) or listen(2) call. 30 /* .IP windowsize 31 /* The preferred TCP window size. This must be > 0. 32 /* DIAGNOSTICS 33 /* Panic: interface violation. 34 /* Warnings: some error return from setsockopt(). 35 /* LICENSE 36 /* .ad 37 /* .fi 38 /* The Secure Mailer license must be distributed with this software. 39 /* AUTHOR(S) 40 /* Wietse Venema 41 /* IBM T.J. Watson Research 42 /* P.O. Box 704 43 /* Yorktown Heights, NY 10598, USA 44 /*--*/ 45 46 /* System libraries. */ 47 48 #include <sys_defs.h> 49 #include <sys/socket.h> 50 51 /* Utility library. */ 52 53 #include <msg.h> 54 #include <iostuff.h> 55 56 /* Application storage. */ 57 58 /* 59 * Tunable to work around broken routers. 60 */ 61 int inet_windowsize = 0; 62 63 /* set_inet_windowsize - set TCP send/receive window size */ 64 65 void set_inet_windowsize(int sock, int windowsize) 66 { 67 68 /* 69 * Sanity check. 70 */ 71 if (windowsize <= 0) 72 msg_panic("inet_windowsize: bad window size %d", windowsize); 73 74 /* 75 * Generic implementation: set the send and receive buffer size before 76 * listen() or connect(). 77 */ 78 if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *) &windowsize, 79 sizeof(windowsize)) < 0) 80 msg_warn("setsockopt SO_SNDBUF %d: %m", windowsize); 81 if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *) &windowsize, 82 sizeof(windowsize)) < 0) 83 msg_warn("setsockopt SO_RCVBUF %d: %m", windowsize); 84 } 85