aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv6')
-rw-r--r--net/ipv6/ip6_tunnel.c11
-rw-r--r--net/ipv6/sit.c8
2 files changed, 12 insertions, 7 deletions
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c
index da43038ae18e..02730ef26b0f 100644
--- a/net/ipv6/ip6_tunnel.c
+++ b/net/ipv6/ip6_tunnel.c
@@ -581,7 +581,8 @@ ip4ip6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
581 fl.fl4_dst = eiph->saddr; 581 fl.fl4_dst = eiph->saddr;
582 fl.fl4_tos = RT_TOS(eiph->tos); 582 fl.fl4_tos = RT_TOS(eiph->tos);
583 fl.proto = IPPROTO_IPIP; 583 fl.proto = IPPROTO_IPIP;
584 if (ip_route_output_key(dev_net(skb->dev), &rt, &fl)) 584 rt = ip_route_output_key(dev_net(skb->dev), &fl);
585 if (IS_ERR(rt))
585 goto out; 586 goto out;
586 587
587 skb2->dev = rt->dst.dev; 588 skb2->dev = rt->dst.dev;
@@ -593,12 +594,14 @@ ip4ip6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
593 fl.fl4_dst = eiph->daddr; 594 fl.fl4_dst = eiph->daddr;
594 fl.fl4_src = eiph->saddr; 595 fl.fl4_src = eiph->saddr;
595 fl.fl4_tos = eiph->tos; 596 fl.fl4_tos = eiph->tos;
596 if (ip_route_output_key(dev_net(skb->dev), &rt, &fl) || 597 rt = ip_route_output_key(dev_net(skb->dev), &fl);
598 if (IS_ERR(rt) ||
597 rt->dst.dev->type != ARPHRD_TUNNEL) { 599 rt->dst.dev->type != ARPHRD_TUNNEL) {
598 ip_rt_put(rt); 600 if (!IS_ERR(rt))
601 ip_rt_put(rt);
599 goto out; 602 goto out;
600 } 603 }
601 skb_dst_set(skb2, (struct dst_entry *)rt); 604 skb_dst_set(skb2, &rt->dst);
602 } else { 605 } else {
603 ip_rt_put(rt); 606 ip_rt_put(rt);
604 if (ip_route_input(skb2, eiph->daddr, eiph->saddr, eiph->tos, 607 if (ip_route_input(skb2, eiph->daddr, eiph->saddr, eiph->tos,
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c
index b1599a345c10..b8c8adbd7cf6 100644
--- a/net/ipv6/sit.c
+++ b/net/ipv6/sit.c
@@ -738,7 +738,8 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,
738 .fl4_tos = RT_TOS(tos), 738 .fl4_tos = RT_TOS(tos),
739 .oif = tunnel->parms.link, 739 .oif = tunnel->parms.link,
740 .proto = IPPROTO_IPV6 }; 740 .proto = IPPROTO_IPV6 };
741 if (ip_route_output_key(dev_net(dev), &rt, &fl)) { 741 rt = ip_route_output_key(dev_net(dev), &fl);
742 if (IS_ERR(rt)) {
742 dev->stats.tx_carrier_errors++; 743 dev->stats.tx_carrier_errors++;
743 goto tx_error_icmp; 744 goto tx_error_icmp;
744 } 745 }
@@ -862,8 +863,9 @@ static void ipip6_tunnel_bind_dev(struct net_device *dev)
862 .fl4_tos = RT_TOS(iph->tos), 863 .fl4_tos = RT_TOS(iph->tos),
863 .oif = tunnel->parms.link, 864 .oif = tunnel->parms.link,
864 .proto = IPPROTO_IPV6 }; 865 .proto = IPPROTO_IPV6 };
865 struct rtable *rt; 866 struct rtable *rt = ip_route_output_key(dev_net(dev), &fl);
866 if (!ip_route_output_key(dev_net(dev), &rt, &fl)) { 867
868 if (!IS_ERR(rt)) {
867 tdev = rt->dst.dev; 869 tdev = rt->dst.dev;
868 ip_rt_put(rt); 870 ip_rt_put(rt);
869 } 871 }