skb = skb_copy(skb, GFP_ATOMIC);
                if (!skb)
                        return NET_RX_DROP;
+               ethhdr = (struct ethhdr *)skb_mac_header(skb);
                kfree_skb(skb_old);
        }
 
        unsigned long flags;
        uint8_t dstaddr[ETH_ALEN];
 
-       icmp_packet = (struct icmp_packet *) skb->data;
-       ethhdr = (struct ethhdr *) skb_mac_header(skb);
+       icmp_packet = (struct icmp_packet *)skb->data;
+       ethhdr = (struct ethhdr *)skb_mac_header(skb);
 
        /* add data to device queue */
        if (icmp_packet->msg_type != ECHO_REQUEST) {
                        skb = skb_copy(skb, GFP_ATOMIC);
                        if (!skb)
                                return NET_RX_DROP;
-                       icmp_packet = (struct icmp_packet *) skb->data;
+
+                       icmp_packet = (struct icmp_packet *)skb->data;
+                       ethhdr = (struct ethhdr *)skb_mac_header(skb);
                        kfree_skb(skb_old);
                }
 
                        if (!skb)
                                return NET_RX_DROP;
                        icmp_packet = (struct icmp_packet *) skb->data;
+                       ethhdr = (struct ethhdr *)skb_mac_header(skb);
                        kfree_skb(skb_old);
                }
 
        if (!is_my_mac(ethhdr->h_dest))
                return NET_RX_DROP;
 
-       icmp_packet = (struct icmp_packet *) skb->data;
+       icmp_packet = (struct icmp_packet *)skb->data;
 
        /* packet for me */
        if (is_my_mac(icmp_packet->dst))
                        skb = skb_copy(skb, GFP_ATOMIC);
                        if (!skb)
                                return NET_RX_DROP;
-                       icmp_packet = (struct icmp_packet *) skb->data;
+                       icmp_packet = (struct icmp_packet *)skb->data;
+                       ethhdr = (struct ethhdr *)skb_mac_header(skb);
                        kfree_skb(skb_old);
                }
 
                        skb = skb_copy(skb, GFP_ATOMIC);
                        if (!skb)
                                return NET_RX_DROP;
-                       unicast_packet = (struct unicast_packet *) skb->data;
+                       unicast_packet = (struct unicast_packet *)skb->data;
+                       ethhdr = (struct ethhdr *)skb_mac_header(skb);
                        kfree_skb(skb_old);
                }
                /* decrement ttl */