batman-adv: fix packet checksum in receive path
[pandora-kernel.git] / net / batman-adv / soft-interface.c
index f9cc957..dbe1a8c 100644 (file)
@@ -686,10 +686,16 @@ void interface_rx(struct net_device *soft_iface,
        skb_pull_rcsum(skb, hdr_size);
        skb_reset_mac_header(skb);
 
+       if (unlikely(!pskb_may_pull(skb, ETH_HLEN)))
+               goto dropped;
+
        ethhdr = (struct ethhdr *)skb_mac_header(skb);
 
        switch (ntohs(ethhdr->h_proto)) {
        case ETH_P_8021Q:
+               if (!pskb_may_pull(skb, VLAN_ETH_HLEN))
+                       goto dropped;
+
                vhdr = (struct vlan_ethhdr *)skb->data;
                vid = ntohs(vhdr->h_vlan_TCI) & VLAN_VID_MASK;
 
@@ -726,15 +732,8 @@ void interface_rx(struct net_device *soft_iface,
        }
 
        /* skb->dev & skb->pkt_type are set here */
-       if (unlikely(!pskb_may_pull(skb, ETH_HLEN)))
-               goto dropped;
        skb->protocol = eth_type_trans(skb, soft_iface);
-
-       /* should not be necessary anymore as we use skb_pull_rcsum()
-        * TODO: please verify this and remove this TODO
-        * -- Dec 21st 2009, Simon Wunderlich */
-
-/*     skb->ip_summed = CHECKSUM_UNNECESSARY;*/
+       skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN);
 
        bat_priv->stats.rx_packets++;
        bat_priv->stats.rx_bytes += skb->len + sizeof(struct ethhdr);