rk: revert to v3.10
[firefly-linux-kernel-4.4.55.git] / net / ipv6 / ndisc.c
index deedf7ddbc6e270500b40974367b72caae0cc6f7..ca4ffcc287f1ebbd3cdb5011660f385479d597d3 100644 (file)
@@ -372,11 +372,14 @@ static struct sk_buff *ndisc_alloc_skb(struct net_device *dev,
        int tlen = dev->needed_tailroom;
        struct sock *sk = dev_net(dev)->ipv6.ndisc_sk;
        struct sk_buff *skb;
+       int err;
 
-       skb = alloc_skb(hlen + sizeof(struct ipv6hdr) + len + tlen, GFP_ATOMIC);
+       skb = sock_alloc_send_skb(sk,
+                                 hlen + sizeof(struct ipv6hdr) + len + tlen,
+                                 1, &err);
        if (!skb) {
-               ND_PRINTK(0, err, "ndisc: %s failed to allocate an skb\n",
-                         __func__);
+               ND_PRINTK(0, err, "ndisc: %s failed to allocate an skb, err=%d\n",
+                         __func__, err);
                return NULL;
        }
 
@@ -386,11 +389,6 @@ static struct sk_buff *ndisc_alloc_skb(struct net_device *dev,
        skb_reserve(skb, hlen + sizeof(struct ipv6hdr));
        skb_reset_transport_header(skb);
 
-       /* Manually assign socket ownership as we avoid calling
-        * sock_alloc_send_pskb() to bypass wmem buffer limits
-        */
-       skb_set_owner_w(skb, sk);
-
        return skb;
 }
 
@@ -1193,14 +1191,7 @@ static void ndisc_router_discovery(struct sk_buff *skb)
        if (rt)
                rt6_set_expires(rt, jiffies + (HZ * lifetime));
        if (ra_msg->icmph.icmp6_hop_limit) {
-               /* Only set hop_limit on the interface if it is higher than
-                * the current hop_limit.
-                */
-               if (in6_dev->cnf.hop_limit < ra_msg->icmph.icmp6_hop_limit) {
-                       in6_dev->cnf.hop_limit = ra_msg->icmph.icmp6_hop_limit;
-               } else {
-                       ND_PRINTK(2, warn, "RA: Got route advertisement with lower hop_limit than current\n");
-               }
+               in6_dev->cnf.hop_limit = ra_msg->icmph.icmp6_hop_limit;
                if (rt)
                        dst_metric_set(&rt->dst, RTAX_HOPLIMIT,
                                       ra_msg->icmph.icmp6_hop_limit);
@@ -1584,7 +1575,7 @@ static int ndisc_netdev_event(struct notifier_block *this, unsigned long event,
        switch (event) {
        case NETDEV_CHANGEADDR:
                neigh_changeaddr(&nd_tbl, dev);
-               fib6_run_gc(0, net, false);
+               fib6_run_gc(~0UL, net);
                idev = in6_dev_get(dev);
                if (!idev)
                        break;
@@ -1594,7 +1585,7 @@ static int ndisc_netdev_event(struct notifier_block *this, unsigned long event,
                break;
        case NETDEV_DOWN:
                neigh_ifdown(&nd_tbl, dev);
-               fib6_run_gc(0, net, false);
+               fib6_run_gc(~0UL, net);
                break;
        case NETDEV_NOTIFY_PEERS:
                ndisc_send_unsol_na(dev);