diff options
| -rw-r--r-- | drivers/net/virtio_net.c | 27 | 
1 files changed, 18 insertions, 9 deletions
| diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 494242bb9cf6..231ad91a919d 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -312,6 +312,14 @@ struct padded_vnet_hdr {  	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); @@ -353,9 +361,10 @@ static int rxq2vq(int rxq)  	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;  }  /* @@ -478,7 +487,7 @@ static struct sk_buff *page_to_skb(struct virtnet_info *vi,  				   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; @@ -563,7 +572,7 @@ static struct sk_buff *page_to_skb(struct virtnet_info *vi,  		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); @@ -975,7 +984,7 @@ static struct sk_buff *receive_small_build_skb(struct virtnet_info *vi,  		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;  } @@ -1586,7 +1595,7 @@ static void receive_buf(struct virtnet_info *vi, struct receive_queue *rq,  {  	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); @@ -1606,9 +1615,9 @@ static void receive_buf(struct virtnet_info *vi, struct receive_queue *rq,  	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; @@ -2114,7 +2123,7 @@ static int xmit_skb(struct send_queue *sq, struct sk_buff *skb)  	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, | 
