Message ID | 20220125084702.3636253-5-andrew@daynix.com (mailing list archive) |
---|---|
State | RFC |
Headers | show |
Series | TUN/VirtioNet USO features support. | expand |
在 2022/1/25 下午4:47, Andrew Melnychenko 写道: > Now, it's possible to convert vnet packets from/to skb. I suggest to change the title to "net: support XXX offload in vnet header" Thanks > > Signed-off-by: Andrew Melnychenko <andrew@daynix.com> > --- > include/linux/virtio_net.h | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > diff --git a/include/linux/virtio_net.h b/include/linux/virtio_net.h > index a960de68ac69..9311d41d0a81 100644 > --- a/include/linux/virtio_net.h > +++ b/include/linux/virtio_net.h > @@ -17,6 +17,9 @@ static inline bool virtio_net_hdr_match_proto(__be16 protocol, __u8 gso_type) > case VIRTIO_NET_HDR_GSO_UDP: > return protocol == cpu_to_be16(ETH_P_IP) || > protocol == cpu_to_be16(ETH_P_IPV6); > + case VIRTIO_NET_HDR_GSO_UDP_L4: > + return protocol == cpu_to_be16(ETH_P_IP) || > + protocol == cpu_to_be16(ETH_P_IPV6); > default: > return false; > } > @@ -31,6 +34,7 @@ static inline int virtio_net_hdr_set_proto(struct sk_buff *skb, > switch (hdr->gso_type & ~VIRTIO_NET_HDR_GSO_ECN) { > case VIRTIO_NET_HDR_GSO_TCPV4: > case VIRTIO_NET_HDR_GSO_UDP: > + case VIRTIO_NET_HDR_GSO_UDP_L4: > skb->protocol = cpu_to_be16(ETH_P_IP); > break; > case VIRTIO_NET_HDR_GSO_TCPV6: > @@ -69,6 +73,11 @@ static inline int virtio_net_hdr_to_skb(struct sk_buff *skb, > ip_proto = IPPROTO_UDP; > thlen = sizeof(struct udphdr); > break; > + case VIRTIO_NET_HDR_GSO_UDP_L4: > + gso_type = SKB_GSO_UDP_L4; > + ip_proto = IPPROTO_UDP; > + thlen = sizeof(struct udphdr); > + break; > default: > return -EINVAL; > } > @@ -182,6 +191,8 @@ static inline int virtio_net_hdr_from_skb(const struct sk_buff *skb, > hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV4; > else if (sinfo->gso_type & SKB_GSO_TCPV6) > hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV6; > + else if (sinfo->gso_type & SKB_GSO_UDP_L4) > + hdr->gso_type = VIRTIO_NET_HDR_GSO_UDP_L4; > else > return -EINVAL; > if (sinfo->gso_type & SKB_GSO_TCP_ECN)
diff --git a/include/linux/virtio_net.h b/include/linux/virtio_net.h index a960de68ac69..9311d41d0a81 100644 --- a/include/linux/virtio_net.h +++ b/include/linux/virtio_net.h @@ -17,6 +17,9 @@ static inline bool virtio_net_hdr_match_proto(__be16 protocol, __u8 gso_type) case VIRTIO_NET_HDR_GSO_UDP: return protocol == cpu_to_be16(ETH_P_IP) || protocol == cpu_to_be16(ETH_P_IPV6); + case VIRTIO_NET_HDR_GSO_UDP_L4: + return protocol == cpu_to_be16(ETH_P_IP) || + protocol == cpu_to_be16(ETH_P_IPV6); default: return false; } @@ -31,6 +34,7 @@ static inline int virtio_net_hdr_set_proto(struct sk_buff *skb, switch (hdr->gso_type & ~VIRTIO_NET_HDR_GSO_ECN) { case VIRTIO_NET_HDR_GSO_TCPV4: case VIRTIO_NET_HDR_GSO_UDP: + case VIRTIO_NET_HDR_GSO_UDP_L4: skb->protocol = cpu_to_be16(ETH_P_IP); break; case VIRTIO_NET_HDR_GSO_TCPV6: @@ -69,6 +73,11 @@ static inline int virtio_net_hdr_to_skb(struct sk_buff *skb, ip_proto = IPPROTO_UDP; thlen = sizeof(struct udphdr); break; + case VIRTIO_NET_HDR_GSO_UDP_L4: + gso_type = SKB_GSO_UDP_L4; + ip_proto = IPPROTO_UDP; + thlen = sizeof(struct udphdr); + break; default: return -EINVAL; } @@ -182,6 +191,8 @@ static inline int virtio_net_hdr_from_skb(const struct sk_buff *skb, hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV4; else if (sinfo->gso_type & SKB_GSO_TCPV6) hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV6; + else if (sinfo->gso_type & SKB_GSO_UDP_L4) + hdr->gso_type = VIRTIO_NET_HDR_GSO_UDP_L4; else return -EINVAL; if (sinfo->gso_type & SKB_GSO_TCP_ECN)
Now, it's possible to convert vnet packets from/to skb. Signed-off-by: Andrew Melnychenko <andrew@daynix.com> --- include/linux/virtio_net.h | 11 +++++++++++ 1 file changed, 11 insertions(+)