Print this page
1434 TCP_INIT_CWND setsockopt doesn't work on passive connections.

*** 692,714 **** /* * Only allow socket with network configuration * privilege to set the initial cwnd to be larger * than allowed by RFC 3390. */ ! if (val <= MIN(4, MAX(2, 4380 / tcp->tcp_mss))) { ! tcp->tcp_init_cwnd = val; ! break; ! } ! if ((reterr = secpolicy_ip_config(cr, B_TRUE)) != 0) { *outlenp = 0; return (reterr); } if (val > tcp_max_init_cwnd) { *outlenp = 0; return (EINVAL); } tcp->tcp_init_cwnd = val; break; /* * TCP_KEEPIDLE is in seconds but TCP_KEEPALIVE_THRESHOLD * is in milliseconds. TCP_KEEPIDLE is introduced for --- 692,724 ---- /* * Only allow socket with network configuration * privilege to set the initial cwnd to be larger * than allowed by RFC 3390. */ ! if (val > MIN(4, MAX(2, 4380 / tcp->tcp_mss))) { ! if ((reterr = secpolicy_ip_config(cr, B_TRUE)) ! != 0) { *outlenp = 0; return (reterr); } if (val > tcp_max_init_cwnd) { *outlenp = 0; return (EINVAL); } + } + tcp->tcp_init_cwnd = val; + + /* + * If the socket is connected, AND no outbound data + * has been sent, reset the actual cwnd values. + */ + if (tcp->tcp_state == TCPS_ESTABLISHED && + tcp->tcp_iss == tcp->tcp_snxt - 1) { + tcp->tcp_cwnd = + MIN(tcp->tcp_rwnd, val * tcp->tcp_mss); + } break; /* * TCP_KEEPIDLE is in seconds but TCP_KEEPALIVE_THRESHOLD * is in milliseconds. TCP_KEEPIDLE is introduced for