1/* $NetBSD: inet_windowsize.c,v 1.2 2017/02/14 01:16:49 christos 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 */ 61int inet_windowsize = 0; 62 63/* set_inet_windowsize - set TCP send/receive window size */ 64 65void 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, (void *) &windowsize, 79 sizeof(windowsize)) < 0) 80 msg_warn("setsockopt SO_SNDBUF %d: %m", windowsize); 81 if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (void *) &windowsize, 82 sizeof(windowsize)) < 0) 83 msg_warn("setsockopt SO_RCVBUF %d: %m", windowsize); 84} 85