ipv6/ndisc: Preserve IPv6 control buffer if protocol error handlers are called
[linux-2.6-microblaze.git] / net / ipv6 / ndisc.c
index 0ec2739..659ecf4 100644 (file)
@@ -1533,7 +1533,7 @@ static void ndisc_redirect_rcv(struct sk_buff *skb)
 
        if (!ndopts.nd_opts_rh) {
                ip6_redirect_no_header(skb, dev_net(skb->dev),
-                                       skb->dev->ifindex, 0);
+                                       skb->dev->ifindex);
                return;
        }
 
@@ -1732,10 +1732,9 @@ int ndisc_rcv(struct sk_buff *skb)
                return 0;
        }
 
-       memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb));
-
        switch (msg->icmph.icmp6_type) {
        case NDISC_NEIGHBOUR_SOLICITATION:
+               memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb));
                ndisc_recv_ns(skb);
                break;
 
@@ -1784,6 +1783,8 @@ static int ndisc_netdev_event(struct notifier_block *this, unsigned long event,
                change_info = ptr;
                if (change_info->flags_changed & IFF_NOARP)
                        neigh_changeaddr(&nd_tbl, dev);
+               if (!netif_carrier_ok(dev))
+                       neigh_carrier_down(&nd_tbl, dev);
                break;
        case NETDEV_DOWN:
                neigh_ifdown(&nd_tbl, dev);