char padding[12];
 };
 
+struct virtio_net_common_hdr {
+       union {
+               struct virtio_net_hdr hdr;
+               struct virtio_net_hdr_mrg_rxbuf mrg_hdr;
+               struct virtio_net_hdr_v1_hash hash_v1_hdr;
+       };
+};
+
 static void virtnet_rq_free_unused_buf(struct virtqueue *vq, void *buf);
 static void virtnet_sq_free_unused_buf(struct virtqueue *vq, void *buf);
 
        return rxq * 2;
 }
 
-static inline struct virtio_net_hdr_mrg_rxbuf *skb_vnet_hdr(struct sk_buff *skb)
+static inline struct virtio_net_common_hdr *
+skb_vnet_common_hdr(struct sk_buff *skb)
 {
-       return (struct virtio_net_hdr_mrg_rxbuf *)skb->cb;
+       return (struct virtio_net_common_hdr *)skb->cb;
 }
 
 /*
                                   unsigned int headroom)
 {
        struct sk_buff *skb;
-       struct virtio_net_hdr_mrg_rxbuf *hdr;
+       struct virtio_net_common_hdr *hdr;
        unsigned int copy, hdr_len, hdr_padded_len;
        struct page *page_to_free = NULL;
        int tailroom, shinfo_size;
                give_pages(rq, page);
 
 ok:
-       hdr = skb_vnet_hdr(skb);
+       hdr = skb_vnet_common_hdr(skb);
        memcpy(hdr, hdr_p, hdr_len);
        if (page_to_free)
                put_page(page_to_free);
                return NULL;
 
        buf += header_offset;
-       memcpy(skb_vnet_hdr(skb), buf, vi->hdr_len);
+       memcpy(skb_vnet_common_hdr(skb), buf, vi->hdr_len);
 
        return skb;
 }
 {
        struct net_device *dev = vi->dev;
        struct sk_buff *skb;
-       struct virtio_net_hdr_mrg_rxbuf *hdr;
+       struct virtio_net_common_hdr *hdr;
 
        if (unlikely(len < vi->hdr_len + ETH_HLEN)) {
                pr_debug("%s: short packet %i\n", dev->name, len);
        if (unlikely(!skb))
                return;
 
-       hdr = skb_vnet_hdr(skb);
+       hdr = skb_vnet_common_hdr(skb);
        if (dev->features & NETIF_F_RXHASH && vi->has_rss_hash_report)
-               virtio_skb_set_hash((const struct virtio_net_hdr_v1_hash *)hdr, skb);
+               virtio_skb_set_hash(&hdr->hash_v1_hdr, skb);
 
        if (hdr->hdr.flags & VIRTIO_NET_HDR_F_DATA_VALID)
                skb->ip_summed = CHECKSUM_UNNECESSARY;
        if (can_push)
                hdr = (struct virtio_net_hdr_mrg_rxbuf *)(skb->data - hdr_len);
        else
-               hdr = skb_vnet_hdr(skb);
+               hdr = &skb_vnet_common_hdr(skb)->mrg_hdr;
 
        if (virtio_net_hdr_from_skb(skb, &hdr->hdr,
                                    virtio_is_little_endian(vi->vdev), false,