diff options
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/ip6_gre.c | 3 | ||||
-rw-r--r-- | net/ipv6/ip6_output.c | 11 | ||||
-rw-r--r-- | net/ipv6/netfilter/nf_dup_ipv6.c | 1 | ||||
-rw-r--r-- | net/ipv6/tcp_ipv6.c | 4 | ||||
-rw-r--r-- | net/ipv6/udp.c | 12 |
5 files changed, 16 insertions, 15 deletions
diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c index f4ac2842d4d9..fdc9de276ab1 100644 --- a/net/ipv6/ip6_gre.c +++ b/net/ipv6/ip6_gre.c | |||
@@ -1256,6 +1256,8 @@ static int ip6gre_tap_init(struct net_device *dev) | |||
1256 | if (ret) | 1256 | if (ret) |
1257 | return ret; | 1257 | return ret; |
1258 | 1258 | ||
1259 | dev->priv_flags |= IFF_LIVE_ADDR_CHANGE; | ||
1260 | |||
1259 | tunnel = netdev_priv(dev); | 1261 | tunnel = netdev_priv(dev); |
1260 | 1262 | ||
1261 | ip6gre_tnl_link_config(tunnel, 1); | 1263 | ip6gre_tnl_link_config(tunnel, 1); |
@@ -1289,6 +1291,7 @@ static void ip6gre_tap_setup(struct net_device *dev) | |||
1289 | 1291 | ||
1290 | dev->features |= NETIF_F_NETNS_LOCAL; | 1292 | dev->features |= NETIF_F_NETNS_LOCAL; |
1291 | dev->priv_flags &= ~IFF_TX_SKB_SHARING; | 1293 | dev->priv_flags &= ~IFF_TX_SKB_SHARING; |
1294 | dev->priv_flags |= IFF_LIVE_ADDR_CHANGE; | ||
1292 | } | 1295 | } |
1293 | 1296 | ||
1294 | static bool ip6gre_netlink_encap_parms(struct nlattr *data[], | 1297 | static bool ip6gre_netlink_encap_parms(struct nlattr *data[], |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index cbf127ae7c67..635b8d340cdb 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -1071,17 +1071,12 @@ struct dst_entry *ip6_sk_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6, | |||
1071 | const struct in6_addr *final_dst) | 1071 | const struct in6_addr *final_dst) |
1072 | { | 1072 | { |
1073 | struct dst_entry *dst = sk_dst_check(sk, inet6_sk(sk)->dst_cookie); | 1073 | struct dst_entry *dst = sk_dst_check(sk, inet6_sk(sk)->dst_cookie); |
1074 | int err; | ||
1075 | 1074 | ||
1076 | dst = ip6_sk_dst_check(sk, dst, fl6); | 1075 | dst = ip6_sk_dst_check(sk, dst, fl6); |
1076 | if (!dst) | ||
1077 | dst = ip6_dst_lookup_flow(sk, fl6, final_dst); | ||
1077 | 1078 | ||
1078 | err = ip6_dst_lookup_tail(sock_net(sk), sk, &dst, fl6); | 1079 | return dst; |
1079 | if (err) | ||
1080 | return ERR_PTR(err); | ||
1081 | if (final_dst) | ||
1082 | fl6->daddr = *final_dst; | ||
1083 | |||
1084 | return xfrm_lookup_route(sock_net(sk), dst, flowi6_to_flowi(fl6), sk, 0); | ||
1085 | } | 1080 | } |
1086 | EXPORT_SYMBOL_GPL(ip6_sk_dst_lookup_flow); | 1081 | EXPORT_SYMBOL_GPL(ip6_sk_dst_lookup_flow); |
1087 | 1082 | ||
diff --git a/net/ipv6/netfilter/nf_dup_ipv6.c b/net/ipv6/netfilter/nf_dup_ipv6.c index 6989c70ae29f..4a84b5ad9ecb 100644 --- a/net/ipv6/netfilter/nf_dup_ipv6.c +++ b/net/ipv6/netfilter/nf_dup_ipv6.c | |||
@@ -33,6 +33,7 @@ static bool nf_dup_ipv6_route(struct net *net, struct sk_buff *skb, | |||
33 | fl6.daddr = *gw; | 33 | fl6.daddr = *gw; |
34 | fl6.flowlabel = (__force __be32)(((iph->flow_lbl[0] & 0xF) << 16) | | 34 | fl6.flowlabel = (__force __be32)(((iph->flow_lbl[0] & 0xF) << 16) | |
35 | (iph->flow_lbl[1] << 8) | iph->flow_lbl[2]); | 35 | (iph->flow_lbl[1] << 8) | iph->flow_lbl[2]); |
36 | fl6.flowi6_flags = FLOWI_FLAG_KNOWN_NH; | ||
36 | dst = ip6_route_output(net, NULL, &fl6); | 37 | dst = ip6_route_output(net, NULL, &fl6); |
37 | if (dst->error) { | 38 | if (dst->error) { |
38 | dst_release(dst); | 39 | dst_release(dst); |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 79e33e02f11a..f36c2d076fce 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -1721,7 +1721,9 @@ static void get_tcp6_sock(struct seq_file *seq, struct sock *sp, int i) | |||
1721 | destp = ntohs(inet->inet_dport); | 1721 | destp = ntohs(inet->inet_dport); |
1722 | srcp = ntohs(inet->inet_sport); | 1722 | srcp = ntohs(inet->inet_sport); |
1723 | 1723 | ||
1724 | if (icsk->icsk_pending == ICSK_TIME_RETRANS) { | 1724 | if (icsk->icsk_pending == ICSK_TIME_RETRANS || |
1725 | icsk->icsk_pending == ICSK_TIME_EARLY_RETRANS || | ||
1726 | icsk->icsk_pending == ICSK_TIME_LOSS_PROBE) { | ||
1725 | timer_active = 1; | 1727 | timer_active = 1; |
1726 | timer_expires = icsk->icsk_timeout; | 1728 | timer_expires = icsk->icsk_timeout; |
1727 | } else if (icsk->icsk_pending == ICSK_TIME_PROBE0) { | 1729 | } else if (icsk->icsk_pending == ICSK_TIME_PROBE0) { |
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 2da1896af934..f421c9f23c5b 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
@@ -653,12 +653,12 @@ int udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) | |||
653 | } | 653 | } |
654 | } | 654 | } |
655 | 655 | ||
656 | if (rcu_access_pointer(sk->sk_filter)) { | 656 | if (rcu_access_pointer(sk->sk_filter) && |
657 | if (udp_lib_checksum_complete(skb)) | 657 | udp_lib_checksum_complete(skb)) |
658 | goto csum_error; | 658 | goto csum_error; |
659 | if (sk_filter(sk, skb)) | 659 | |
660 | goto drop; | 660 | if (sk_filter(sk, skb)) |
661 | } | 661 | goto drop; |
662 | 662 | ||
663 | udp_csum_pull_header(skb); | 663 | udp_csum_pull_header(skb); |
664 | if (sk_rcvqueues_full(sk, sk->sk_rcvbuf)) { | 664 | if (sk_rcvqueues_full(sk, sk->sk_rcvbuf)) { |