diff options
-rw-r--r-- | drivers/net/macvtap.c | 2 | ||||
-rw-r--r-- | drivers/net/tun.c | 2 | ||||
-rw-r--r-- | drivers/net/virtio_net.c | 2 | ||||
-rw-r--r-- | include/linux/virtio_net.h | 1 | ||||
-rw-r--r-- | net/packet/af_packet.c | 2 |
5 files changed, 9 insertions, 0 deletions
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c index 6696e56e6320..ecee0fe65a97 100644 --- a/drivers/net/macvtap.c +++ b/drivers/net/macvtap.c | |||
@@ -508,6 +508,8 @@ static int macvtap_skb_to_vnet_hdr(const struct sk_buff *skb, | |||
508 | vnet_hdr->flags = VIRTIO_NET_HDR_F_NEEDS_CSUM; | 508 | vnet_hdr->flags = VIRTIO_NET_HDR_F_NEEDS_CSUM; |
509 | vnet_hdr->csum_start = skb_checksum_start_offset(skb); | 509 | vnet_hdr->csum_start = skb_checksum_start_offset(skb); |
510 | vnet_hdr->csum_offset = skb->csum_offset; | 510 | vnet_hdr->csum_offset = skb->csum_offset; |
511 | } else if (skb->ip_summed == CHECKSUM_UNNECESSARY) { | ||
512 | vnet_hdr->flags = VIRTIO_NET_HDR_F_DATA_VALID; | ||
511 | } /* else everything is zero */ | 513 | } /* else everything is zero */ |
512 | 514 | ||
513 | return 0; | 515 | return 0; |
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index ef68e13c042d..4dab85eecb60 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
@@ -788,6 +788,8 @@ static ssize_t tun_put_user(struct tun_struct *tun, | |||
788 | gso.flags = VIRTIO_NET_HDR_F_NEEDS_CSUM; | 788 | gso.flags = VIRTIO_NET_HDR_F_NEEDS_CSUM; |
789 | gso.csum_start = skb_checksum_start_offset(skb); | 789 | gso.csum_start = skb_checksum_start_offset(skb); |
790 | gso.csum_offset = skb->csum_offset; | 790 | gso.csum_offset = skb->csum_offset; |
791 | } else if (skb->ip_summed == CHECKSUM_UNNECESSARY) { | ||
792 | gso.flags = VIRTIO_NET_HDR_F_DATA_VALID; | ||
791 | } /* else everything is zero */ | 793 | } /* else everything is zero */ |
792 | 794 | ||
793 | if (unlikely(memcpy_toiovecend(iv, (void *)&gso, total, | 795 | if (unlikely(memcpy_toiovecend(iv, (void *)&gso, total, |
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index f6853247a620..be3686a298da 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
@@ -274,6 +274,8 @@ static void receive_buf(struct net_device *dev, void *buf, unsigned int len) | |||
274 | hdr->hdr.csum_start, | 274 | hdr->hdr.csum_start, |
275 | hdr->hdr.csum_offset)) | 275 | hdr->hdr.csum_offset)) |
276 | goto frame_err; | 276 | goto frame_err; |
277 | } else if (hdr->hdr.flags & VIRTIO_NET_HDR_F_DATA_VALID) { | ||
278 | skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
277 | } | 279 | } |
278 | 280 | ||
279 | skb->protocol = eth_type_trans(skb, dev); | 281 | skb->protocol = eth_type_trans(skb, dev); |
diff --git a/include/linux/virtio_net.h b/include/linux/virtio_net.h index 136040bba3e3..970d5a2a9047 100644 --- a/include/linux/virtio_net.h +++ b/include/linux/virtio_net.h | |||
@@ -63,6 +63,7 @@ struct virtio_net_config { | |||
63 | * specify GSO or CSUM features, you can simply ignore the header. */ | 63 | * specify GSO or CSUM features, you can simply ignore the header. */ |
64 | struct virtio_net_hdr { | 64 | struct virtio_net_hdr { |
65 | #define VIRTIO_NET_HDR_F_NEEDS_CSUM 1 // Use csum_start, csum_offset | 65 | #define VIRTIO_NET_HDR_F_NEEDS_CSUM 1 // Use csum_start, csum_offset |
66 | #define VIRTIO_NET_HDR_F_DATA_VALID 2 // Csum is valid | ||
66 | __u8 flags; | 67 | __u8 flags; |
67 | #define VIRTIO_NET_HDR_GSO_NONE 0 // Not a GSO frame | 68 | #define VIRTIO_NET_HDR_GSO_NONE 0 // Not a GSO frame |
68 | #define VIRTIO_NET_HDR_GSO_TCPV4 1 // GSO frame, IPv4 TCP (TSO) | 69 | #define VIRTIO_NET_HDR_GSO_TCPV4 1 // GSO frame, IPv4 TCP (TSO) |
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 67f6749a0a45..b54ec41adea9 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
@@ -1685,6 +1685,8 @@ static int packet_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1685 | vnet_hdr.flags = VIRTIO_NET_HDR_F_NEEDS_CSUM; | 1685 | vnet_hdr.flags = VIRTIO_NET_HDR_F_NEEDS_CSUM; |
1686 | vnet_hdr.csum_start = skb_checksum_start_offset(skb); | 1686 | vnet_hdr.csum_start = skb_checksum_start_offset(skb); |
1687 | vnet_hdr.csum_offset = skb->csum_offset; | 1687 | vnet_hdr.csum_offset = skb->csum_offset; |
1688 | } else if (skb->ip_summed == CHECKSUM_UNNECESSARY) { | ||
1689 | vnet_hdr.flags = VIRTIO_NET_HDR_F_DATA_VALID; | ||
1688 | } /* else everything is zero */ | 1690 | } /* else everything is zero */ |
1689 | 1691 | ||
1690 | err = memcpy_toiovec(msg->msg_iov, (void *)&vnet_hdr, | 1692 | err = memcpy_toiovec(msg->msg_iov, (void *)&vnet_hdr, |