aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/tcp_ipv4.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/tcp_ipv4.c')
-rw-r--r--net/ipv4/tcp_ipv4.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index a4a3390a5287..657ae334f125 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -1257,11 +1257,21 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
1257 tcp_rsk(req)->af_specific = &tcp_request_sock_ipv4_ops; 1257 tcp_rsk(req)->af_specific = &tcp_request_sock_ipv4_ops;
1258#endif 1258#endif
1259 1259
1260 ireq = inet_rsk(req);
1261 ireq->loc_addr = daddr;
1262 ireq->rmt_addr = saddr;
1263 ireq->no_srccheck = inet_sk(sk)->transparent;
1264 ireq->opt = tcp_v4_save_options(sk, skb);
1265
1266 dst = inet_csk_route_req(sk, req);
1267 if(!dst)
1268 goto drop_and_free;
1269
1260 tcp_clear_options(&tmp_opt); 1270 tcp_clear_options(&tmp_opt);
1261 tmp_opt.mss_clamp = 536; 1271 tmp_opt.mss_clamp = 536;
1262 tmp_opt.user_mss = tcp_sk(sk)->rx_opt.user_mss; 1272 tmp_opt.user_mss = tcp_sk(sk)->rx_opt.user_mss;
1263 1273
1264 tcp_parse_options(skb, &tmp_opt, 0); 1274 tcp_parse_options(skb, &tmp_opt, 0, dst);
1265 1275
1266 if (want_cookie && !tmp_opt.saw_tstamp) 1276 if (want_cookie && !tmp_opt.saw_tstamp)
1267 tcp_clear_options(&tmp_opt); 1277 tcp_clear_options(&tmp_opt);
@@ -1270,14 +1280,8 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
1270 1280
1271 tcp_openreq_init(req, &tmp_opt, skb); 1281 tcp_openreq_init(req, &tmp_opt, skb);
1272 1282
1273 ireq = inet_rsk(req);
1274 ireq->loc_addr = daddr;
1275 ireq->rmt_addr = saddr;
1276 ireq->no_srccheck = inet_sk(sk)->transparent;
1277 ireq->opt = tcp_v4_save_options(sk, skb);
1278
1279 if (security_inet_conn_request(sk, skb, req)) 1283 if (security_inet_conn_request(sk, skb, req))
1280 goto drop_and_free; 1284 goto drop_and_release;
1281 1285
1282 if (!want_cookie) 1286 if (!want_cookie)
1283 TCP_ECN_create_request(req, tcp_hdr(skb)); 1287 TCP_ECN_create_request(req, tcp_hdr(skb));
@@ -1302,7 +1306,6 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
1302 */ 1306 */
1303 if (tmp_opt.saw_tstamp && 1307 if (tmp_opt.saw_tstamp &&
1304 tcp_death_row.sysctl_tw_recycle && 1308 tcp_death_row.sysctl_tw_recycle &&
1305 (dst = inet_csk_route_req(sk, req)) != NULL &&
1306 (peer = rt_get_peer((struct rtable *)dst)) != NULL && 1309 (peer = rt_get_peer((struct rtable *)dst)) != NULL &&
1307 peer->v4daddr == saddr) { 1310 peer->v4daddr == saddr) {
1308 if (get_seconds() < peer->tcp_ts_stamp + TCP_PAWS_MSL && 1311 if (get_seconds() < peer->tcp_ts_stamp + TCP_PAWS_MSL &&