|
@@ -1979,40 +1979,8 @@ static int __packet_rcv_vnet(const struct sk_buff *skb,
|
|
{
|
|
{
|
|
*vnet_hdr = (const struct virtio_net_hdr) { 0 };
|
|
*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;
|
|
return 0;
|
|
}
|
|
}
|