aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/virtio_net.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/virtio_net.c')
-rw-r--r--drivers/net/virtio_net.c13
1 files changed, 5 insertions, 8 deletions
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 381a2d8d8a81..192c91c8e799 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -227,7 +227,7 @@ static void set_skb_frag(struct sk_buff *skb, struct page *page,
227 skb->len += size; 227 skb->len += size;
228 skb->truesize += PAGE_SIZE; 228 skb->truesize += PAGE_SIZE;
229 skb_shinfo(skb)->nr_frags++; 229 skb_shinfo(skb)->nr_frags++;
230 skb_shinfo(skb)->gso_type |= SKB_GSO_SHARED_FRAG; 230 skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG;
231 *len -= size; 231 *len -= size;
232} 232}
233 233
@@ -387,18 +387,16 @@ static void receive_buf(struct receive_queue *rq, void *buf, unsigned int len)
387 ntohs(skb->protocol), skb->len, skb->pkt_type); 387 ntohs(skb->protocol), skb->len, skb->pkt_type);
388 388
389 if (hdr->hdr.gso_type != VIRTIO_NET_HDR_GSO_NONE) { 389 if (hdr->hdr.gso_type != VIRTIO_NET_HDR_GSO_NONE) {
390 unsigned short gso_type = 0;
391
392 pr_debug("GSO!\n"); 390 pr_debug("GSO!\n");
393 switch (hdr->hdr.gso_type & ~VIRTIO_NET_HDR_GSO_ECN) { 391 switch (hdr->hdr.gso_type & ~VIRTIO_NET_HDR_GSO_ECN) {
394 case VIRTIO_NET_HDR_GSO_TCPV4: 392 case VIRTIO_NET_HDR_GSO_TCPV4:
395 gso_type = SKB_GSO_TCPV4; 393 skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
396 break; 394 break;
397 case VIRTIO_NET_HDR_GSO_UDP: 395 case VIRTIO_NET_HDR_GSO_UDP:
398 gso_type = SKB_GSO_UDP; 396 skb_shinfo(skb)->gso_type = SKB_GSO_UDP;
399 break; 397 break;
400 case VIRTIO_NET_HDR_GSO_TCPV6: 398 case VIRTIO_NET_HDR_GSO_TCPV6:
401 gso_type = SKB_GSO_TCPV6; 399 skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6;
402 break; 400 break;
403 default: 401 default:
404 net_warn_ratelimited("%s: bad gso type %u.\n", 402 net_warn_ratelimited("%s: bad gso type %u.\n",
@@ -407,7 +405,7 @@ static void receive_buf(struct receive_queue *rq, void *buf, unsigned int len)
407 } 405 }
408 406
409 if (hdr->hdr.gso_type & VIRTIO_NET_HDR_GSO_ECN) 407 if (hdr->hdr.gso_type & VIRTIO_NET_HDR_GSO_ECN)
410 gso_type |= SKB_GSO_TCP_ECN; 408 skb_shinfo(skb)->gso_type |= SKB_GSO_TCP_ECN;
411 409
412 skb_shinfo(skb)->gso_size = hdr->hdr.gso_size; 410 skb_shinfo(skb)->gso_size = hdr->hdr.gso_size;
413 if (skb_shinfo(skb)->gso_size == 0) { 411 if (skb_shinfo(skb)->gso_size == 0) {
@@ -415,7 +413,6 @@ static void receive_buf(struct receive_queue *rq, void *buf, unsigned int len)
415 goto frame_err; 413 goto frame_err;
416 } 414 }
417 415
418 skb_shinfo(skb)->gso_type |= gso_type;
419 /* Header must be checked, and gso_segs computed. */ 416 /* Header must be checked, and gso_segs computed. */
420 skb_shinfo(skb)->gso_type |= SKB_GSO_DODGY; 417 skb_shinfo(skb)->gso_type |= SKB_GSO_DODGY;
421 skb_shinfo(skb)->gso_segs = 0; 418 skb_shinfo(skb)->gso_segs = 0;