diff options
Diffstat (limited to 'net/ipv4/tcp_ipv4.c')
-rw-r--r-- | net/ipv4/tcp_ipv4.c | 37 |
1 files changed, 19 insertions, 18 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 02f583b3744a..f7e6c2c2d2bb 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -149,9 +149,9 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |||
149 | struct inet_sock *inet = inet_sk(sk); | 149 | struct inet_sock *inet = inet_sk(sk); |
150 | struct tcp_sock *tp = tcp_sk(sk); | 150 | struct tcp_sock *tp = tcp_sk(sk); |
151 | struct sockaddr_in *usin = (struct sockaddr_in *)uaddr; | 151 | struct sockaddr_in *usin = (struct sockaddr_in *)uaddr; |
152 | __be16 orig_sport, orig_dport; | ||
152 | struct rtable *rt; | 153 | struct rtable *rt; |
153 | __be32 daddr, nexthop; | 154 | __be32 daddr, nexthop; |
154 | int tmp; | ||
155 | int err; | 155 | int err; |
156 | 156 | ||
157 | if (addr_len < sizeof(struct sockaddr_in)) | 157 | if (addr_len < sizeof(struct sockaddr_in)) |
@@ -167,14 +167,17 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |||
167 | nexthop = inet->opt->faddr; | 167 | nexthop = inet->opt->faddr; |
168 | } | 168 | } |
169 | 169 | ||
170 | tmp = ip_route_connect(&rt, nexthop, inet->inet_saddr, | 170 | orig_sport = inet->inet_sport; |
171 | RT_CONN_FLAGS(sk), sk->sk_bound_dev_if, | 171 | orig_dport = usin->sin_port; |
172 | IPPROTO_TCP, | 172 | rt = ip_route_connect(nexthop, inet->inet_saddr, |
173 | inet->inet_sport, usin->sin_port, sk, 1); | 173 | RT_CONN_FLAGS(sk), sk->sk_bound_dev_if, |
174 | if (tmp < 0) { | 174 | IPPROTO_TCP, |
175 | if (tmp == -ENETUNREACH) | 175 | orig_sport, orig_dport, sk, true); |
176 | if (IS_ERR(rt)) { | ||
177 | err = PTR_ERR(rt); | ||
178 | if (err == -ENETUNREACH) | ||
176 | IP_INC_STATS_BH(sock_net(sk), IPSTATS_MIB_OUTNOROUTES); | 179 | IP_INC_STATS_BH(sock_net(sk), IPSTATS_MIB_OUTNOROUTES); |
177 | return tmp; | 180 | return err; |
178 | } | 181 | } |
179 | 182 | ||
180 | if (rt->rt_flags & (RTCF_MULTICAST | RTCF_BROADCAST)) { | 183 | if (rt->rt_flags & (RTCF_MULTICAST | RTCF_BROADCAST)) { |
@@ -233,11 +236,14 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |||
233 | if (err) | 236 | if (err) |
234 | goto failure; | 237 | goto failure; |
235 | 238 | ||
236 | err = ip_route_newports(&rt, IPPROTO_TCP, | 239 | rt = ip_route_newports(rt, IPPROTO_TCP, |
237 | inet->inet_sport, inet->inet_dport, sk); | 240 | orig_sport, orig_dport, |
238 | if (err) | 241 | inet->inet_sport, inet->inet_dport, sk); |
242 | if (IS_ERR(rt)) { | ||
243 | err = PTR_ERR(rt); | ||
244 | rt = NULL; | ||
239 | goto failure; | 245 | goto failure; |
240 | 246 | } | |
241 | /* OK, now commit destination to socket. */ | 247 | /* OK, now commit destination to socket. */ |
242 | sk->sk_gso_type = SKB_GSO_TCPV4; | 248 | sk->sk_gso_type = SKB_GSO_TCPV4; |
243 | sk_setup_caps(sk, &rt->dst); | 249 | sk_setup_caps(sk, &rt->dst); |
@@ -1341,7 +1347,7 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb) | |||
1341 | tcp_death_row.sysctl_tw_recycle && | 1347 | tcp_death_row.sysctl_tw_recycle && |
1342 | (dst = inet_csk_route_req(sk, req)) != NULL && | 1348 | (dst = inet_csk_route_req(sk, req)) != NULL && |
1343 | (peer = rt_get_peer((struct rtable *)dst)) != NULL && | 1349 | (peer = rt_get_peer((struct rtable *)dst)) != NULL && |
1344 | peer->daddr.a4 == saddr) { | 1350 | peer->daddr.addr.a4 == saddr) { |
1345 | inet_peer_refcheck(peer); | 1351 | inet_peer_refcheck(peer); |
1346 | if ((u32)get_seconds() - peer->tcp_ts_stamp < TCP_PAWS_MSL && | 1352 | if ((u32)get_seconds() - peer->tcp_ts_stamp < TCP_PAWS_MSL && |
1347 | (s32)(peer->tcp_ts - req->ts_recent) > | 1353 | (s32)(peer->tcp_ts - req->ts_recent) > |
@@ -1556,12 +1562,10 @@ int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb) | |||
1556 | 1562 | ||
1557 | if (sk->sk_state == TCP_ESTABLISHED) { /* Fast path */ | 1563 | if (sk->sk_state == TCP_ESTABLISHED) { /* Fast path */ |
1558 | sock_rps_save_rxhash(sk, skb->rxhash); | 1564 | sock_rps_save_rxhash(sk, skb->rxhash); |
1559 | TCP_CHECK_TIMER(sk); | ||
1560 | if (tcp_rcv_established(sk, skb, tcp_hdr(skb), skb->len)) { | 1565 | if (tcp_rcv_established(sk, skb, tcp_hdr(skb), skb->len)) { |
1561 | rsk = sk; | 1566 | rsk = sk; |
1562 | goto reset; | 1567 | goto reset; |
1563 | } | 1568 | } |
1564 | TCP_CHECK_TIMER(sk); | ||
1565 | return 0; | 1569 | return 0; |
1566 | } | 1570 | } |
1567 | 1571 | ||
@@ -1583,13 +1587,10 @@ int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb) | |||
1583 | } else | 1587 | } else |
1584 | sock_rps_save_rxhash(sk, skb->rxhash); | 1588 | sock_rps_save_rxhash(sk, skb->rxhash); |
1585 | 1589 | ||
1586 | |||
1587 | TCP_CHECK_TIMER(sk); | ||
1588 | if (tcp_rcv_state_process(sk, skb, tcp_hdr(skb), skb->len)) { | 1590 | if (tcp_rcv_state_process(sk, skb, tcp_hdr(skb), skb->len)) { |
1589 | rsk = sk; | 1591 | rsk = sk; |
1590 | goto reset; | 1592 | goto reset; |
1591 | } | 1593 | } |
1592 | TCP_CHECK_TIMER(sk); | ||
1593 | return 0; | 1594 | return 0; |
1594 | 1595 | ||
1595 | reset: | 1596 | reset: |