mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
tcp: use tcp_v4_send_synack on first SYN-ACK
To avoid large code duplication in IPv6, we need to first simplify the complicate SYN-ACK sending code in tcp_v4_conn_request(). To use tcp_v4(6)_send_synack() to send all SYN-ACKs, we need to initialize the mini socket's receive window before trying to create the child socket and/or building the SYN-ACK packet. So we move that initialization from tcp_make_synack() to tcp_v4_conn_request() as a new function tcp_openreq_init_req_rwin(). After this refactoring the SYN-ACK sending code is simpler and easier to implement Fast Open for IPv6. Signed-off-by: Yuchung Cheng <ycheng@google.com> Signed-off-by: Daniel Lee <longinus00@gmail.com> Signed-off-by: Jerry Chu <hkchu@google.com> Acked-by: Neal Cardwell <ncardwell@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
89278c9dc9
commit
843f4a55e3
5 changed files with 85 additions and 105 deletions
|
@ -362,6 +362,37 @@ void tcp_twsk_destructor(struct sock *sk)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(tcp_twsk_destructor);
|
||||
|
||||
void tcp_openreq_init_rwin(struct request_sock *req,
|
||||
struct sock *sk, struct dst_entry *dst)
|
||||
{
|
||||
struct inet_request_sock *ireq = inet_rsk(req);
|
||||
struct tcp_sock *tp = tcp_sk(sk);
|
||||
__u8 rcv_wscale;
|
||||
int mss = dst_metric_advmss(dst);
|
||||
|
||||
if (tp->rx_opt.user_mss && tp->rx_opt.user_mss < mss)
|
||||
mss = tp->rx_opt.user_mss;
|
||||
|
||||
/* Set this up on the first call only */
|
||||
req->window_clamp = tp->window_clamp ? : dst_metric(dst, RTAX_WINDOW);
|
||||
|
||||
/* limit the window selection if the user enforce a smaller rx buffer */
|
||||
if (sk->sk_userlocks & SOCK_RCVBUF_LOCK &&
|
||||
(req->window_clamp > tcp_full_space(sk) || req->window_clamp == 0))
|
||||
req->window_clamp = tcp_full_space(sk);
|
||||
|
||||
/* tcp_full_space because it is guaranteed to be the first packet */
|
||||
tcp_select_initial_window(tcp_full_space(sk),
|
||||
mss - (ireq->tstamp_ok ? TCPOLEN_TSTAMP_ALIGNED : 0),
|
||||
&req->rcv_wnd,
|
||||
&req->window_clamp,
|
||||
ireq->wscale_ok,
|
||||
&rcv_wscale,
|
||||
dst_metric(dst, RTAX_INITRWND));
|
||||
ireq->rcv_wscale = rcv_wscale;
|
||||
}
|
||||
EXPORT_SYMBOL(tcp_openreq_init_rwin);
|
||||
|
||||
static inline void TCP_ECN_openreq_child(struct tcp_sock *tp,
|
||||
struct request_sock *req)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue