packet: use common code for virtio_net_hdr and skb GSO conversion
authorMike Rapoport <rppt@linux.vnet.ibm.com>
Wed, 8 Jun 2016 13:09:22 +0000 (16:09 +0300)
committerDavid S. Miller <davem@davemloft.net>
Sat, 11 Jun 2016 06:03:56 +0000 (23:03 -0700)
Replace open coded conversion between virtio_net_hdr to skb GSO info with
virtio_net_hdr_from_skb

Signed-off-by: Mike Rapoport <rppt@linux.vnet.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/packet/af_packet.c

index 9bff6ef..d1f3b9e 100644 (file)
@@ -1979,40 +1979,8 @@ static int __packet_rcv_vnet(const struct sk_buff *skb,
 {
        *vnet_hdr = (const struct virtio_net_hdr) { 0 };
 
-       if (skb_is_gso(skb)) {
-               struct skb_shared_info *sinfo = skb_shinfo(skb);
-
-               /* This is a hint as to how much should be linear. */
-               vnet_hdr->hdr_len =
-                       __cpu_to_virtio16(vio_le(), skb_headlen(skb));
-               vnet_hdr->gso_size =
-                       __cpu_to_virtio16(vio_le(), sinfo->gso_size);
-
-               if (sinfo->gso_type & SKB_GSO_TCPV4)
-                       vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV4;
-               else if (sinfo->gso_type & SKB_GSO_TCPV6)
-                       vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV6;
-               else if (sinfo->gso_type & SKB_GSO_UDP)
-                       vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_UDP;
-               else if (sinfo->gso_type & SKB_GSO_FCOE)
-                       return -EINVAL;
-               else
-                       BUG();
-
-               if (sinfo->gso_type & SKB_GSO_TCP_ECN)
-                       vnet_hdr->gso_type |= VIRTIO_NET_HDR_GSO_ECN;
-       } else
-               vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_NONE;
-
-       if (skb->ip_summed == CHECKSUM_PARTIAL) {
-               vnet_hdr->flags = VIRTIO_NET_HDR_F_NEEDS_CSUM;
-               vnet_hdr->csum_start = __cpu_to_virtio16(vio_le(),
-                                 skb_checksum_start_offset(skb));
-               vnet_hdr->csum_offset = __cpu_to_virtio16(vio_le(),
-                                                skb->csum_offset);
-       } else if (skb->ip_summed == CHECKSUM_UNNECESSARY) {
-               vnet_hdr->flags = VIRTIO_NET_HDR_F_DATA_VALID;
-       } /* else everything is zero */
+       if (virtio_net_hdr_from_skb(skb, vnet_hdr, vio_le()))
+               BUG();
 
        return 0;
 }