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