linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / net / ipv4 / ipmr.c
index 85893ee..5c94c22 100644 (file)
@@ -28,6 +28,7 @@
  *
  */
 
+#include <linux/config.h>
 #include <asm/system.h>
 #include <asm/uaccess.h>
 #include <linux/types.h>
@@ -414,10 +415,10 @@ static int vif_add(struct vifctl *vifc, int mrtsock)
                        return -ENOBUFS;
                break;
        case 0:
-               dev = ip_dev_find(vifc->vifc_lcl_addr.s_addr);
+               dev=ip_dev_find(vifc->vifc_lcl_addr.s_addr);
                if (!dev)
                        return -EADDRNOTAVAIL;
-               dev_put(dev);
+               __dev_put(dev);
                break;
        default:
                return -EINVAL;
@@ -1461,6 +1462,7 @@ int pim_rcv_v1(struct sk_buff * skb)
        skb_pull(skb, (u8*)encap - skb->data);
        skb->nh.iph = (struct iphdr *)skb->data;
        skb->dev = reg_dev;
+       memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options));
        skb->protocol = htons(ETH_P_IP);
        skb->ip_summed = 0;
        skb->pkt_type = PACKET_HOST;
@@ -1516,6 +1518,7 @@ static int pim_rcv(struct sk_buff * skb)
        skb_pull(skb, (u8*)encap - skb->data);
        skb->nh.iph = (struct iphdr *)skb->data;
        skb->dev = reg_dev;
+       memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options));
        skb->protocol = htons(ETH_P_IP);
        skb->ip_summed = 0;
        skb->pkt_type = PACKET_HOST;
@@ -1578,7 +1581,6 @@ int ipmr_get_route(struct sk_buff *skb, struct rtmsg *rtm, int nowait)
        cache = ipmr_cache_find(rt->rt_src, rt->rt_dst);
 
        if (cache==NULL) {
-               struct sk_buff *skb2;
                struct net_device *dev;
                int vif;
 
@@ -1592,18 +1594,12 @@ int ipmr_get_route(struct sk_buff *skb, struct rtmsg *rtm, int nowait)
                        read_unlock(&mrt_lock);
                        return -ENODEV;
                }
-               skb2 = skb_clone(skb, GFP_ATOMIC);
-               if (!skb2) {
-                       read_unlock(&mrt_lock);
-                       return -ENOMEM;
-               }
-
-               skb2->nh.raw = skb_push(skb2, sizeof(struct iphdr));
-               skb2->nh.iph->ihl = sizeof(struct iphdr)>>2;
-               skb2->nh.iph->saddr = rt->rt_src;
-               skb2->nh.iph->daddr = rt->rt_dst;
-               skb2->nh.iph->version = 0;
-               err = ipmr_cache_unresolved(vif, skb2);
+               skb->nh.raw = skb_push(skb, sizeof(struct iphdr));
+               skb->nh.iph->ihl = sizeof(struct iphdr)>>2;
+               skb->nh.iph->saddr = rt->rt_src;
+               skb->nh.iph->daddr = rt->rt_dst;
+               skb->nh.iph->version = 0;
+               err = ipmr_cache_unresolved(vif, skb);
                read_unlock(&mrt_lock);
                return err;
        }