@@ -479,51 +479,19 @@ static void receive_buf(struct virtnet_info *vi, struct receive_queue *rq,
479479 stats -> rx_packets ++ ;
480480 u64_stats_update_end (& stats -> rx_syncp );
481481
482- if (hdr -> hdr .flags & VIRTIO_NET_HDR_F_NEEDS_CSUM ) {
483- pr_debug ("Needs csum!\n" );
484- if (!skb_partial_csum_set (skb ,
485- virtio16_to_cpu (vi -> vdev , hdr -> hdr .csum_start ),
486- virtio16_to_cpu (vi -> vdev , hdr -> hdr .csum_offset )))
487- goto frame_err ;
488- } else if (hdr -> hdr .flags & VIRTIO_NET_HDR_F_DATA_VALID ) {
482+ if (hdr -> hdr .flags & VIRTIO_NET_HDR_F_DATA_VALID )
489483 skb -> ip_summed = CHECKSUM_UNNECESSARY ;
490- }
491484
492485 skb -> protocol = eth_type_trans (skb , dev );
493486 pr_debug ("Receiving skb proto 0x%04x len %i type %i\n" ,
494487 ntohs (skb -> protocol ), skb -> len , skb -> pkt_type );
495488
496- if (hdr -> hdr .gso_type != VIRTIO_NET_HDR_GSO_NONE ) {
497- pr_debug ("GSO!\n" );
498- switch (hdr -> hdr .gso_type & ~VIRTIO_NET_HDR_GSO_ECN ) {
499- case VIRTIO_NET_HDR_GSO_TCPV4 :
500- skb_shinfo (skb )-> gso_type = SKB_GSO_TCPV4 ;
501- break ;
502- case VIRTIO_NET_HDR_GSO_UDP :
503- skb_shinfo (skb )-> gso_type = SKB_GSO_UDP ;
504- break ;
505- case VIRTIO_NET_HDR_GSO_TCPV6 :
506- skb_shinfo (skb )-> gso_type = SKB_GSO_TCPV6 ;
507- break ;
508- default :
509- net_warn_ratelimited ("%s: bad gso type %u.\n" ,
510- dev -> name , hdr -> hdr .gso_type );
511- goto frame_err ;
512- }
513-
514- if (hdr -> hdr .gso_type & VIRTIO_NET_HDR_GSO_ECN )
515- skb_shinfo (skb )-> gso_type |= SKB_GSO_TCP_ECN ;
516-
517- skb_shinfo (skb )-> gso_size = virtio16_to_cpu (vi -> vdev ,
518- hdr -> hdr .gso_size );
519- if (skb_shinfo (skb )-> gso_size == 0 ) {
520- net_warn_ratelimited ("%s: zero gso size.\n" , dev -> name );
521- goto frame_err ;
522- }
523-
524- /* Header must be checked, and gso_segs computed. */
525- skb_shinfo (skb )-> gso_type |= SKB_GSO_DODGY ;
526- skb_shinfo (skb )-> gso_segs = 0 ;
489+ if (virtio_net_hdr_to_skb (skb , & hdr -> hdr ,
490+ virtio_is_little_endian (vi -> vdev ))) {
491+ net_warn_ratelimited ("%s: bad gso: type: %u, size: %u\n" ,
492+ dev -> name , hdr -> hdr .gso_type ,
493+ hdr -> hdr .gso_size );
494+ goto frame_err ;
527495 }
528496
529497 napi_gro_receive (& rq -> napi , skb );
@@ -868,35 +836,9 @@ static int xmit_skb(struct send_queue *sq, struct sk_buff *skb)
868836 else
869837 hdr = skb_vnet_hdr (skb );
870838
871- if (skb -> ip_summed == CHECKSUM_PARTIAL ) {
872- hdr -> hdr .flags = VIRTIO_NET_HDR_F_NEEDS_CSUM ;
873- hdr -> hdr .csum_start = cpu_to_virtio16 (vi -> vdev ,
874- skb_checksum_start_offset (skb ));
875- hdr -> hdr .csum_offset = cpu_to_virtio16 (vi -> vdev ,
876- skb -> csum_offset );
877- } else {
878- hdr -> hdr .flags = 0 ;
879- hdr -> hdr .csum_offset = hdr -> hdr .csum_start = 0 ;
880- }
881-
882- if (skb_is_gso (skb )) {
883- hdr -> hdr .hdr_len = cpu_to_virtio16 (vi -> vdev , skb_headlen (skb ));
884- hdr -> hdr .gso_size = cpu_to_virtio16 (vi -> vdev ,
885- skb_shinfo (skb )-> gso_size );
886- if (skb_shinfo (skb )-> gso_type & SKB_GSO_TCPV4 )
887- hdr -> hdr .gso_type = VIRTIO_NET_HDR_GSO_TCPV4 ;
888- else if (skb_shinfo (skb )-> gso_type & SKB_GSO_TCPV6 )
889- hdr -> hdr .gso_type = VIRTIO_NET_HDR_GSO_TCPV6 ;
890- else if (skb_shinfo (skb )-> gso_type & SKB_GSO_UDP )
891- hdr -> hdr .gso_type = VIRTIO_NET_HDR_GSO_UDP ;
892- else
893- BUG ();
894- if (skb_shinfo (skb )-> gso_type & SKB_GSO_TCP_ECN )
895- hdr -> hdr .gso_type |= VIRTIO_NET_HDR_GSO_ECN ;
896- } else {
897- hdr -> hdr .gso_type = VIRTIO_NET_HDR_GSO_NONE ;
898- hdr -> hdr .gso_size = hdr -> hdr .hdr_len = 0 ;
899- }
839+ if (virtio_net_hdr_from_skb (skb , & hdr -> hdr ,
840+ virtio_is_little_endian (vi -> vdev )))
841+ BUG ();
900842
901843 if (vi -> mergeable_rx_bufs )
902844 hdr -> num_buffers = 0 ;
0 commit comments