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