diff options
author | David S. Miller <davem@davemloft.net> | 2012-07-16 06:44:56 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-07-16 06:44:56 -0400 |
commit | 35ad9b9cf7d8a2e6259a0d24022e910adb6f3489 (patch) | |
tree | d9772467e072f3f1d142aa0ce2fc56ef69c57cb7 /net/ipv6/tcp_ipv6.c | |
parent | 80d0a69fc57715dc9080c0567df1ed911b78abea (diff) |
ipv6: Add helper inet6_csk_update_pmtu().
This is the ipv6 version of inet_csk_update_pmtu().
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/tcp_ipv6.c')
-rw-r--r-- | net/ipv6/tcp_ipv6.c | 37 |
1 files changed, 4 insertions, 33 deletions
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 3071f377145c..ecdf241cad02 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -378,43 +378,14 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
378 | if ((1 << sk->sk_state) & (TCPF_LISTEN | TCPF_CLOSE)) | 378 | if ((1 << sk->sk_state) & (TCPF_LISTEN | TCPF_CLOSE)) |
379 | goto out; | 379 | goto out; |
380 | 380 | ||
381 | /* icmp should have updated the destination cache entry */ | 381 | dst = inet6_csk_update_pmtu(sk, ntohl(info)); |
382 | dst = __sk_dst_check(sk, np->dst_cookie); | 382 | if (!dst) |
383 | 383 | goto out; | |
384 | if (dst == NULL) { | ||
385 | struct inet_sock *inet = inet_sk(sk); | ||
386 | struct flowi6 fl6; | ||
387 | |||
388 | /* BUGGG_FUTURE: Again, it is not clear how | ||
389 | to handle rthdr case. Ignore this complexity | ||
390 | for now. | ||
391 | */ | ||
392 | memset(&fl6, 0, sizeof(fl6)); | ||
393 | fl6.flowi6_proto = IPPROTO_TCP; | ||
394 | fl6.daddr = np->daddr; | ||
395 | fl6.saddr = np->saddr; | ||
396 | fl6.flowi6_oif = sk->sk_bound_dev_if; | ||
397 | fl6.flowi6_mark = sk->sk_mark; | ||
398 | fl6.fl6_dport = inet->inet_dport; | ||
399 | fl6.fl6_sport = inet->inet_sport; | ||
400 | security_skb_classify_flow(skb, flowi6_to_flowi(&fl6)); | ||
401 | |||
402 | dst = ip6_dst_lookup_flow(sk, &fl6, NULL, false); | ||
403 | if (IS_ERR(dst)) { | ||
404 | sk->sk_err_soft = -PTR_ERR(dst); | ||
405 | goto out; | ||
406 | } | ||
407 | |||
408 | } else | ||
409 | dst_hold(dst); | ||
410 | |||
411 | dst->ops->update_pmtu(dst, ntohl(info)); | ||
412 | 384 | ||
413 | if (inet_csk(sk)->icsk_pmtu_cookie > dst_mtu(dst)) { | 385 | if (inet_csk(sk)->icsk_pmtu_cookie > dst_mtu(dst)) { |
414 | tcp_sync_mss(sk, dst_mtu(dst)); | 386 | tcp_sync_mss(sk, dst_mtu(dst)); |
415 | tcp_simple_retransmit(sk); | 387 | tcp_simple_retransmit(sk); |
416 | } /* else let the usual retransmit timer handle it */ | 388 | } |
417 | dst_release(dst); | ||
418 | goto out; | 389 | goto out; |
419 | } | 390 | } |
420 | 391 | ||