]> Pileus Git - ~andy/linux/blobdiff - net/ipv4/ip_gre.c
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
[~andy/linux] / net / ipv4 / ip_gre.c
index 38673d2860e293404a9109c88ec9b03ab6b810f1..b57532d4742c7cccc95a05dd641bfc47875b4717 100644 (file)
@@ -10,6 +10,8 @@
  *
  */
 
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
 #include <linux/capability.h>
 #include <linux/module.h>
 #include <linux/types.h>
@@ -730,15 +732,16 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev
 
                if (skb->protocol == htons(ETH_P_IP)) {
                        rt = skb_rtable(skb);
-                       if ((dst = rt->rt_gateway) == 0)
-                               goto tx_error_icmp;
+                       dst = rt->rt_gateway;
                }
 #if IS_ENABLED(CONFIG_IPV6)
                else if (skb->protocol == htons(ETH_P_IPV6)) {
-                       struct neighbour *neigh = dst_get_neighbour_noref(skb_dst(skb));
                        const struct in6_addr *addr6;
+                       struct neighbour *neigh;
+                       bool do_tx_error_icmp;
                        int addr_type;
 
+                       neigh = dst_neigh_lookup(skb_dst(skb), &ipv6_hdr(skb)->daddr);
                        if (neigh == NULL)
                                goto tx_error;
 
@@ -751,9 +754,14 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev
                        }
 
                        if ((addr_type & IPV6_ADDR_COMPATv4) == 0)
+                               do_tx_error_icmp = true;
+                       else {
+                               do_tx_error_icmp = false;
+                               dst = addr6->s6_addr32[3];
+                       }
+                       neigh_release(neigh);
+                       if (do_tx_error_icmp)
                                goto tx_error_icmp;
-
-                       dst = addr6->s6_addr32[3];
                }
 #endif
                else
@@ -914,9 +922,10 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev
        __IPTUNNEL_XMIT(tstats, &dev->stats);
        return NETDEV_TX_OK;
 
+#if IS_ENABLED(CONFIG_IPV6)
 tx_error_icmp:
        dst_link_failure(skb);
-
+#endif
 tx_error:
        dev->stats.tx_errors++;
        dev_kfree_skb(skb);
@@ -1529,7 +1538,7 @@ static int ipgre_newlink(struct net *src_net, struct net_device *dev, struct nla
                return -EEXIST;
 
        if (dev->type == ARPHRD_ETHER && !tb[IFLA_ADDRESS])
-               random_ether_addr(dev->dev_addr);
+               eth_hw_addr_random(dev);
 
        mtu = ipgre_tunnel_bind_dev(dev);
        if (!tb[IFLA_MTU])
@@ -1709,7 +1718,7 @@ static int __init ipgre_init(void)
 {
        int err;
 
-       printk(KERN_INFO "GRE over IPv4 tunneling driver\n");
+       pr_info("GRE over IPv4 tunneling driver\n");
 
        err = register_pernet_device(&ipgre_net_ops);
        if (err < 0)
@@ -1717,7 +1726,7 @@ static int __init ipgre_init(void)
 
        err = gre_add_protocol(&ipgre_protocol, GREPROTO_CISCO);
        if (err < 0) {
-               printk(KERN_INFO "ipgre init: can't add protocol\n");
+               pr_info("%s: can't add protocol\n", __func__);
                goto add_proto_failed;
        }
 
@@ -1746,7 +1755,7 @@ static void __exit ipgre_fini(void)
        rtnl_link_unregister(&ipgre_tap_ops);
        rtnl_link_unregister(&ipgre_link_ops);
        if (gre_del_protocol(&ipgre_protocol, GREPROTO_CISCO) < 0)
-               printk(KERN_INFO "ipgre close: can't remove protocol\n");
+               pr_info("%s: can't remove protocol\n", __func__);
        unregister_pernet_device(&ipgre_net_ops);
 }