return packet_lookup_frame(po, rb, rb->head, status);
 }
 
-static u16 vlan_get_tci(struct sk_buff *skb, struct net_device *dev)
+static u16 vlan_get_tci(const struct sk_buff *skb, struct net_device *dev)
 {
-       u8 *skb_orig_data = skb->data;
-       int skb_orig_len = skb->len;
        struct vlan_hdr vhdr, *vh;
        unsigned int header_len;
 
        else
                return 0;
 
-       skb_push(skb, skb->data - skb_mac_header(skb));
-       vh = skb_header_pointer(skb, header_len, sizeof(vhdr), &vhdr);
-       if (skb_orig_data != skb->data) {
-               skb->data = skb_orig_data;
-               skb->len = skb_orig_len;
-       }
+       vh = skb_header_pointer(skb, skb_mac_offset(skb) + header_len,
+                               sizeof(vhdr), &vhdr);
        if (unlikely(!vh))
                return 0;