[IGMP]: Optimize kfree_skb in igmp_rcv.
[sfrench/cifs-2.6.git] / net / ipv4 / igmp.c
index 928bc3284554fefc8756c3829bbf72c0073e835b..732cd07e6071bdc0aa9b514286bdd80ec934183d 100644 (file)
@@ -301,7 +301,7 @@ static struct sk_buff *igmpv3_newpack(struct net_device *dev, int size)
                                    .nl_u = { .ip4_u = {
                                    .daddr = IGMPV3_ALL_MCR } },
                                    .proto = IPPROTO_IGMP };
-               if (ip_route_output_key(&rt, &fl)) {
+               if (ip_route_output_key(&init_net, &rt, &fl)) {
                        kfree_skb(skb);
                        return NULL;
                }
@@ -645,7 +645,7 @@ static int igmp_send_report(struct in_device *in_dev, struct ip_mc_list *pmc,
                struct flowi fl = { .oif = dev->ifindex,
                                    .nl_u = { .ip4_u = { .daddr = dst } },
                                    .proto = IPPROTO_IGMP };
-               if (ip_route_output_key(&rt, &fl))
+               if (ip_route_output_key(&init_net, &rt, &fl))
                        return -1;
        }
        if (rt->rt_src == 0) {
@@ -922,13 +922,11 @@ int igmp_rcv(struct sk_buff *skb)
        struct in_device *in_dev = in_dev_get(skb->dev);
        int len = skb->len;
 
-       if (in_dev==NULL) {
-               kfree_skb(skb);
-               return 0;
-       }
+       if (in_dev == NULL)
+               goto drop;
 
        if (!pskb_may_pull(skb, sizeof(struct igmphdr)))
-               goto drop;
+               goto drop_ref;
 
        switch (skb->ip_summed) {
        case CHECKSUM_COMPLETE:
@@ -938,7 +936,7 @@ int igmp_rcv(struct sk_buff *skb)
        case CHECKSUM_NONE:
                skb->csum = 0;
                if (__skb_checksum_complete(skb))
-                       goto drop;
+                       goto drop_ref;
        }
 
        ih = igmp_hdr(skb);
@@ -972,8 +970,9 @@ int igmp_rcv(struct sk_buff *skb)
                break;
        }
 
-drop:
+drop_ref:
        in_dev_put(in_dev);
+drop:
        kfree_skb(skb);
        return 0;
 }
@@ -1395,13 +1394,13 @@ static struct in_device * ip_mc_find_dev(struct ip_mreqn *imr)
                return idev;
        }
        if (imr->imr_address.s_addr) {
-               dev = ip_dev_find(imr->imr_address.s_addr);
+               dev = ip_dev_find(&init_net, imr->imr_address.s_addr);
                if (!dev)
                        return NULL;
                dev_put(dev);
        }
 
-       if (!dev && !ip_route_output_key(&rt, &fl)) {
+       if (!dev && !ip_route_output_key(&init_net, &rt, &fl)) {
                dev = rt->u.dst.dev;
                ip_rt_put(rt);
        }