diff options
Diffstat (limited to 'net/ipv6/tcp_ipv6.c')
-rw-r--r-- | net/ipv6/tcp_ipv6.c | 27 |
1 files changed, 12 insertions, 15 deletions
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index de709091b26d..da6e24416d75 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -461,7 +461,8 @@ out: | |||
461 | } | 461 | } |
462 | 462 | ||
463 | 463 | ||
464 | static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req) | 464 | static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req, |
465 | struct request_values *rvp) | ||
465 | { | 466 | { |
466 | struct inet6_request_sock *treq = inet6_rsk(req); | 467 | struct inet6_request_sock *treq = inet6_rsk(req); |
467 | struct ipv6_pinfo *np = inet6_sk(sk); | 468 | struct ipv6_pinfo *np = inet6_sk(sk); |
@@ -499,7 +500,7 @@ static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req) | |||
499 | if ((err = xfrm_lookup(sock_net(sk), &dst, &fl, sk, 0)) < 0) | 500 | if ((err = xfrm_lookup(sock_net(sk), &dst, &fl, sk, 0)) < 0) |
500 | goto done; | 501 | goto done; |
501 | 502 | ||
502 | skb = tcp_make_synack(sk, dst, req); | 503 | skb = tcp_make_synack(sk, dst, req, rvp); |
503 | if (skb) { | 504 | if (skb) { |
504 | struct tcphdr *th = tcp_hdr(skb); | 505 | struct tcphdr *th = tcp_hdr(skb); |
505 | 506 | ||
@@ -1161,13 +1162,13 @@ static struct sock *tcp_v6_hnd_req(struct sock *sk,struct sk_buff *skb) | |||
1161 | */ | 1162 | */ |
1162 | static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb) | 1163 | static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb) |
1163 | { | 1164 | { |
1165 | struct tcp_options_received tmp_opt; | ||
1166 | struct request_sock *req; | ||
1164 | struct inet6_request_sock *treq; | 1167 | struct inet6_request_sock *treq; |
1165 | struct ipv6_pinfo *np = inet6_sk(sk); | 1168 | struct ipv6_pinfo *np = inet6_sk(sk); |
1166 | struct tcp_options_received tmp_opt; | ||
1167 | struct tcp_sock *tp = tcp_sk(sk); | 1169 | struct tcp_sock *tp = tcp_sk(sk); |
1168 | struct request_sock *req = NULL; | ||
1169 | __u32 isn = TCP_SKB_CB(skb)->when; | ||
1170 | struct dst_entry *dst = __sk_dst_get(sk); | 1170 | struct dst_entry *dst = __sk_dst_get(sk); |
1171 | __u32 isn = TCP_SKB_CB(skb)->when; | ||
1171 | #ifdef CONFIG_SYN_COOKIES | 1172 | #ifdef CONFIG_SYN_COOKIES |
1172 | int want_cookie = 0; | 1173 | int want_cookie = 0; |
1173 | #else | 1174 | #else |
@@ -1239,23 +1240,19 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb) | |||
1239 | 1240 | ||
1240 | isn = tcp_v6_init_sequence(skb); | 1241 | isn = tcp_v6_init_sequence(skb); |
1241 | } | 1242 | } |
1242 | |||
1243 | tcp_rsk(req)->snt_isn = isn; | 1243 | tcp_rsk(req)->snt_isn = isn; |
1244 | 1244 | ||
1245 | security_inet_conn_request(sk, skb, req); | 1245 | security_inet_conn_request(sk, skb, req); |
1246 | 1246 | ||
1247 | if (tcp_v6_send_synack(sk, req)) | 1247 | if (tcp_v6_send_synack(sk, req, NULL) || want_cookie) |
1248 | goto drop; | 1248 | goto drop_and_free; |
1249 | 1249 | ||
1250 | if (!want_cookie) { | 1250 | inet6_csk_reqsk_queue_hash_add(sk, req, TCP_TIMEOUT_INIT); |
1251 | inet6_csk_reqsk_queue_hash_add(sk, req, TCP_TIMEOUT_INIT); | 1251 | return 0; |
1252 | return 0; | ||
1253 | } | ||
1254 | 1252 | ||
1253 | drop_and_free: | ||
1254 | reqsk_free(req); | ||
1255 | drop: | 1255 | drop: |
1256 | if (req) | ||
1257 | reqsk_free(req); | ||
1258 | |||
1259 | return 0; /* don't send reset */ | 1256 | return 0; /* don't send reset */ |
1260 | } | 1257 | } |
1261 | 1258 | ||