]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - net/ipv4/igmp.c
[NET]: Remove more unneeded typecasts on *malloc()
[mv-sheeva.git] / net / ipv4 / igmp.c
index 8b6d3939e1e60922fc41d6e7e04723486aade385..192092b89e534732ae8ab1eb6f62015ecfb2f2a1 100644 (file)
@@ -91,6 +91,8 @@
 #include <linux/if_arp.h>
 #include <linux/rtnetlink.h>
 #include <linux/times.h>
+
+#include <net/arp.h>
 #include <net/ip.h>
 #include <net/protocol.h>
 #include <net/route.h>
@@ -872,11 +874,18 @@ int igmp_rcv(struct sk_buff *skb)
                return 0;
        }
 
-       if (!pskb_may_pull(skb, sizeof(struct igmphdr)) || 
-           (u16)csum_fold(skb_checksum(skb, 0, len, 0))) {
-               in_dev_put(in_dev);
-               kfree_skb(skb);
-               return 0;
+       if (!pskb_may_pull(skb, sizeof(struct igmphdr)))
+               goto drop;
+
+       switch (skb->ip_summed) {
+       case CHECKSUM_HW:
+               if (!(u16)csum_fold(skb->csum))
+                       break;
+               /* fall through */
+       case CHECKSUM_NONE:
+               skb->csum = 0;
+               if (__skb_checksum_complete(skb))
+                       goto drop;
        }
 
        ih = skb->h.igmph;
@@ -890,7 +899,10 @@ int igmp_rcv(struct sk_buff *skb)
                /* Is it our report looped back? */
                if (((struct rtable*)skb->dst)->fl.iif == 0)
                        break;
-               igmp_heard_report(in_dev, ih->group);
+               /* don't rely on MC router hearing unicast reports */
+               if (skb->pkt_type == PACKET_MULTICAST ||
+                   skb->pkt_type == PACKET_BROADCAST)
+                       igmp_heard_report(in_dev, ih->group);
                break;
        case IGMP_PIM:
 #ifdef CONFIG_IP_PIMSM_V1
@@ -906,6 +918,8 @@ int igmp_rcv(struct sk_buff *skb)
        default:
                NETDEBUG(KERN_DEBUG "New IGMP type=%d, why we do not know about it?\n", ih->type);
        }
+
+drop:
        in_dev_put(in_dev);
        kfree_skb(skb);
        return 0;
@@ -961,7 +975,7 @@ static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im)
         * for deleted items allows change reports to use common code with
         * non-deleted or query-response MCA's.
         */
-       pmc = (struct ip_mc_list *)kmalloc(sizeof(*pmc), GFP_KERNEL);
+       pmc = kmalloc(sizeof(*pmc), GFP_KERNEL);
        if (!pmc)
                return;
        memset(pmc, 0, sizeof(*pmc));
@@ -1141,7 +1155,7 @@ void ip_mc_inc_group(struct in_device *in_dev, u32 addr)
                }
        }
 
-       im = (struct ip_mc_list *)kmalloc(sizeof(*im), GFP_KERNEL);
+       im = kmalloc(sizeof(*im), GFP_KERNEL);
        if (!im)
                goto out;
 
@@ -1462,7 +1476,7 @@ static int ip_mc_add1_src(struct ip_mc_list *pmc, int sfmode,
                psf_prev = psf;
        }
        if (!psf) {
-               psf = (struct ip_sf_list *)kmalloc(sizeof(*psf), GFP_ATOMIC);
+               psf = kmalloc(sizeof(*psf), GFP_ATOMIC);
                if (!psf)
                        return -ENOBUFS;
                memset(psf, 0, sizeof(*psf));
@@ -1645,7 +1659,7 @@ int ip_mc_join_group(struct sock *sk , struct ip_mreqn *imr)
        err = -ENOBUFS;
        if (count >= sysctl_igmp_max_memberships)
                goto done;
-       iml = (struct ip_mc_socklist *)sock_kmalloc(sk,sizeof(*iml),GFP_KERNEL);
+       iml = sock_kmalloc(sk,sizeof(*iml),GFP_KERNEL);
        if (iml == NULL)
                goto done;
 
@@ -1809,8 +1823,7 @@ int ip_mc_source(int add, int omode, struct sock *sk, struct
 
                if (psl)
                        count += psl->sl_max;
-               newpsl = (struct ip_sf_socklist *)sock_kmalloc(sk,
-                       IP_SFLSIZE(count), GFP_KERNEL);
+               newpsl = sock_kmalloc(sk, IP_SFLSIZE(count), GFP_KERNEL);
                if (!newpsl) {
                        err = -ENOBUFS;
                        goto done;
@@ -1893,8 +1906,8 @@ int ip_mc_msfilter(struct sock *sk, struct ip_msfilter *msf, int ifindex)
                goto done;
        }
        if (msf->imsf_numsrc) {
-               newpsl = (struct ip_sf_socklist *)sock_kmalloc(sk,
-                               IP_SFLSIZE(msf->imsf_numsrc), GFP_KERNEL);
+               newpsl = sock_kmalloc(sk, IP_SFLSIZE(msf->imsf_numsrc),
+                                                          GFP_KERNEL);
                if (!newpsl) {
                        err = -ENOBUFS;
                        goto done;
@@ -1908,8 +1921,11 @@ int ip_mc_msfilter(struct sock *sk, struct ip_msfilter *msf, int ifindex)
                        sock_kfree_s(sk, newpsl, IP_SFLSIZE(newpsl->sl_max));
                        goto done;
                }
-       } else
+       } else {
                newpsl = NULL;
+               (void) ip_mc_add_src(in_dev, &msf->imsf_multiaddr,
+                                    msf->imsf_fmode, 0, NULL, 0);
+       }
        psl = pmc->sflist;
        if (psl) {
                (void) ip_mc_del_src(in_dev, &msf->imsf_multiaddr, pmc->sfmode,