TCP_INIT_CWND setsockopt doesn't work on passive connections.
|Assignee:||Dan McDonald||% Done:|
|Category:||kernel||Estimated time:||6.00 hours|
The current implementation of the IPPROTO_TCP/TCP_INIT_CWND only affects a socket before accept() and connect(). This is quite limiting and unnecessary. There is a Google patch for Linux that implements this stuff correctly there and we should adopt their approach. They allow (via ioctl, I recommend keeping this a setsockopt) a modification of the initial window until data is first sent on the socket.
Specifically, this allows for following:
p = socket
bind(p) // http web server
setsockopt(p, IPPROTO_TCP, TCP_INIT_CWND, &10...)
c = accept(p)
// up to here currently works, the rest is limited by the current implementation
request = read(c)
setsockopt(c, IPPROTO_TCP, TCP_INIT_CWND, &2...)
This use-case demonstrates adjusting the initial congestion window before data send on the socket to enable different treatment of clients based on network information and request information (like user-agent indicating mobile browser).
#1 Updated by Dan McDonald over 3 years ago
- Assignee set to Dan McDonald
After having a conversation with the poster, here's the problem statement:
Consider a server having a policy of dynamically setting the initial congestion window based on knowledge of a specific peer (e.g. based on IP address). This knowledge only comes after the three-way handshake (i.e. when accept() returns a new socket). Today, the setsockopt(..TCP_INIT_CWND...) works, but doesn't affect any change after the accept() operation.
This bug aims to address that problem.
#2 Updated by Dan McDonald over 3 years ago
The proposed fix slightly alters the semantics of TCP_INIT_CWND:
IF (and only if) the socket in question is both in ESTABLISHED state,
and has not yet sent any data (checked by comparing "iss" to "snxt"),
the TCP connection's actual congestion window size will also be