diff options
Diffstat (limited to 'net/ipv4/tcp_ipv4.c')
-rw-r--r-- | net/ipv4/tcp_ipv4.c | 44 |
1 files changed, 17 insertions, 27 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 0c4a64355603..54139fa514e6 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -138,14 +138,6 @@ int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp) | |||
138 | } | 138 | } |
139 | EXPORT_SYMBOL_GPL(tcp_twsk_unique); | 139 | EXPORT_SYMBOL_GPL(tcp_twsk_unique); |
140 | 140 | ||
141 | static int tcp_repair_connect(struct sock *sk) | ||
142 | { | ||
143 | tcp_connect_init(sk); | ||
144 | tcp_finish_connect(sk, NULL); | ||
145 | |||
146 | return 0; | ||
147 | } | ||
148 | |||
149 | /* This will initiate an outgoing connection. */ | 141 | /* This will initiate an outgoing connection. */ |
150 | int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | 142 | int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) |
151 | { | 143 | { |
@@ -250,10 +242,7 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |||
250 | 242 | ||
251 | inet->inet_id = tp->write_seq ^ jiffies; | 243 | inet->inet_id = tp->write_seq ^ jiffies; |
252 | 244 | ||
253 | if (likely(!tp->repair)) | 245 | err = tcp_connect(sk); |
254 | err = tcp_connect(sk); | ||
255 | else | ||
256 | err = tcp_repair_connect(sk); | ||
257 | 246 | ||
258 | rt = NULL; | 247 | rt = NULL; |
259 | if (err) | 248 | if (err) |
@@ -877,10 +866,13 @@ static int tcp_v4_send_synack(struct sock *sk, struct dst_entry *dst, | |||
877 | } | 866 | } |
878 | 867 | ||
879 | static int tcp_v4_rtx_synack(struct sock *sk, struct request_sock *req, | 868 | static int tcp_v4_rtx_synack(struct sock *sk, struct request_sock *req, |
880 | struct request_values *rvp) | 869 | struct request_values *rvp) |
881 | { | 870 | { |
882 | TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_RETRANSSEGS); | 871 | int res = tcp_v4_send_synack(sk, NULL, req, rvp, 0, false); |
883 | return tcp_v4_send_synack(sk, NULL, req, rvp, 0, false); | 872 | |
873 | if (!res) | ||
874 | TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_RETRANSSEGS); | ||
875 | return res; | ||
884 | } | 876 | } |
885 | 877 | ||
886 | /* | 878 | /* |
@@ -1070,7 +1062,7 @@ int tcp_md5_do_del(struct sock *sk, const union tcp_md5_addr *addr, int family) | |||
1070 | } | 1062 | } |
1071 | EXPORT_SYMBOL(tcp_md5_do_del); | 1063 | EXPORT_SYMBOL(tcp_md5_do_del); |
1072 | 1064 | ||
1073 | void tcp_clear_md5_list(struct sock *sk) | 1065 | static void tcp_clear_md5_list(struct sock *sk) |
1074 | { | 1066 | { |
1075 | struct tcp_sock *tp = tcp_sk(sk); | 1067 | struct tcp_sock *tp = tcp_sk(sk); |
1076 | struct tcp_md5sig_key *key; | 1068 | struct tcp_md5sig_key *key; |
@@ -1386,7 +1378,8 @@ static int tcp_v4_conn_req_fastopen(struct sock *sk, | |||
1386 | struct sock *child; | 1378 | struct sock *child; |
1387 | int err; | 1379 | int err; |
1388 | 1380 | ||
1389 | req->retrans = 0; | 1381 | req->num_retrans = 0; |
1382 | req->num_timeout = 0; | ||
1390 | req->sk = NULL; | 1383 | req->sk = NULL; |
1391 | 1384 | ||
1392 | child = inet_csk(sk)->icsk_af_ops->syn_recv_sock(sk, skb, req, NULL); | 1385 | child = inet_csk(sk)->icsk_af_ops->syn_recv_sock(sk, skb, req, NULL); |
@@ -1741,7 +1734,7 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb, | |||
1741 | 1734 | ||
1742 | tcp_initialize_rcv_mss(newsk); | 1735 | tcp_initialize_rcv_mss(newsk); |
1743 | tcp_synack_rtt_meas(newsk, req); | 1736 | tcp_synack_rtt_meas(newsk, req); |
1744 | newtp->total_retrans = req->retrans; | 1737 | newtp->total_retrans = req->num_retrans; |
1745 | 1738 | ||
1746 | #ifdef CONFIG_TCP_MD5SIG | 1739 | #ifdef CONFIG_TCP_MD5SIG |
1747 | /* Copy over the MD5 key from the original socket */ | 1740 | /* Copy over the MD5 key from the original socket */ |
@@ -1774,10 +1767,8 @@ exit: | |||
1774 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENDROPS); | 1767 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENDROPS); |
1775 | return NULL; | 1768 | return NULL; |
1776 | put_and_exit: | 1769 | put_and_exit: |
1777 | tcp_clear_xmit_timers(newsk); | 1770 | inet_csk_prepare_forced_close(newsk); |
1778 | tcp_cleanup_congestion_control(newsk); | 1771 | tcp_done(newsk); |
1779 | bh_unlock_sock(newsk); | ||
1780 | sock_put(newsk); | ||
1781 | goto exit; | 1772 | goto exit; |
1782 | } | 1773 | } |
1783 | EXPORT_SYMBOL(tcp_v4_syn_recv_sock); | 1774 | EXPORT_SYMBOL(tcp_v4_syn_recv_sock); |
@@ -1919,7 +1910,6 @@ EXPORT_SYMBOL(tcp_v4_do_rcv); | |||
1919 | 1910 | ||
1920 | void tcp_v4_early_demux(struct sk_buff *skb) | 1911 | void tcp_v4_early_demux(struct sk_buff *skb) |
1921 | { | 1912 | { |
1922 | struct net *net = dev_net(skb->dev); | ||
1923 | const struct iphdr *iph; | 1913 | const struct iphdr *iph; |
1924 | const struct tcphdr *th; | 1914 | const struct tcphdr *th; |
1925 | struct sock *sk; | 1915 | struct sock *sk; |
@@ -1927,16 +1917,16 @@ void tcp_v4_early_demux(struct sk_buff *skb) | |||
1927 | if (skb->pkt_type != PACKET_HOST) | 1917 | if (skb->pkt_type != PACKET_HOST) |
1928 | return; | 1918 | return; |
1929 | 1919 | ||
1930 | if (!pskb_may_pull(skb, ip_hdrlen(skb) + sizeof(struct tcphdr))) | 1920 | if (!pskb_may_pull(skb, skb_transport_offset(skb) + sizeof(struct tcphdr))) |
1931 | return; | 1921 | return; |
1932 | 1922 | ||
1933 | iph = ip_hdr(skb); | 1923 | iph = ip_hdr(skb); |
1934 | th = (struct tcphdr *) ((char *)iph + ip_hdrlen(skb)); | 1924 | th = tcp_hdr(skb); |
1935 | 1925 | ||
1936 | if (th->doff < sizeof(struct tcphdr) / 4) | 1926 | if (th->doff < sizeof(struct tcphdr) / 4) |
1937 | return; | 1927 | return; |
1938 | 1928 | ||
1939 | sk = __inet_lookup_established(net, &tcp_hashinfo, | 1929 | sk = __inet_lookup_established(dev_net(skb->dev), &tcp_hashinfo, |
1940 | iph->saddr, th->source, | 1930 | iph->saddr, th->source, |
1941 | iph->daddr, ntohs(th->dest), | 1931 | iph->daddr, ntohs(th->dest), |
1942 | skb->skb_iif); | 1932 | skb->skb_iif); |
@@ -2640,7 +2630,7 @@ static void get_openreq4(const struct sock *sk, const struct request_sock *req, | |||
2640 | 0, 0, /* could print option size, but that is af dependent. */ | 2630 | 0, 0, /* could print option size, but that is af dependent. */ |
2641 | 1, /* timers active (only the expire timer) */ | 2631 | 1, /* timers active (only the expire timer) */ |
2642 | jiffies_delta_to_clock_t(delta), | 2632 | jiffies_delta_to_clock_t(delta), |
2643 | req->retrans, | 2633 | req->num_timeout, |
2644 | from_kuid_munged(seq_user_ns(f), uid), | 2634 | from_kuid_munged(seq_user_ns(f), uid), |
2645 | 0, /* non standard timer */ | 2635 | 0, /* non standard timer */ |
2646 | 0, /* open_requests have no inode */ | 2636 | 0, /* open_requests have no inode */ |