At the moment the buffersize will be set to the default even if the
current value
is smaller.
The following diff fixes this problem.
Index: netinet/tcp_usrreq.c
===================================================================
RCS file: /cvs/src/sys/netinet/tcp_usrreq.c,v
retrieving revision 1.131
diff -u -p -u -p -r1.131 tcp_usrreq.c
--- netinet/tcp_usrreq.c 18 Jun 2016 10:36:13 -0000 1.131
+++ netinet/tcp_usrreq.c 5 Jul 2016 09:26:24 -0000
@@ -979,10 +979,11 @@ tcp_update_sndspace(struct tcpcb *tp)
struct socket *so = tp->t_inpcb->inp_socket;
u_long nmax;
- if (sbchecklowmem())
+ if (sbchecklowmem()) {
/* low on memory try to get rid of some */
- nmax = tcp_sendspace;
- else if (so->so_snd.sb_wat != tcp_sendspace)
+ if (so->so_snd.sb_hiwat < nmax)
+ nmax = tcp_sendspace;
+ } else if (so->so_snd.sb_wat != tcp_sendspace)
/* user requested buffer size, auto-scaling disabled */
nmax = so->so_snd.sb_wat;
else
@@ -1017,10 +1018,11 @@ tcp_update_rcvspace(struct tcpcb *tp)
struct socket *so = tp->t_inpcb->inp_socket;
u_long nmax = so->so_rcv.sb_hiwat;
- if (sbchecklowmem())
+ if (sbchecklowmem()) {
/* low on memory try to get rid of some */
- nmax = tcp_recvspace;
- else if (so->so_rcv.sb_wat != tcp_recvspace)
+ if (tcp_recvspace < nmax)
+ nmax = tcp_recvspace;
+ } else if (so->so_rcv.sb_wat != tcp_recvspace)
/* user requested buffer size, auto-scaling disabled */
nmax = so->so_rcv.sb_wat;
else {