From 2fa68fbdddf324315717055bdda0d2cbf44614e6 Mon Sep 17 00:00:00 2001 From: Zhe Weng Date: Tue, 4 Jul 2023 18:18:47 +0800 Subject: [PATCH] drivers/virtio-net: Support different LL_GUARDSIZE Previously, the CONFIG_NET_LL_GUARDSIZE is fixed to 32 (64-Bit) or 28 (32-Bit), it's a little bit tricky. Now add support to any value greater than minimal size. Signed-off-by: Zhe Weng --- drivers/virtio/virtio-net.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/drivers/virtio/virtio-net.c b/drivers/virtio/virtio-net.c index 1c463d4fe9..b0e3e0f9ac 100644 --- a/drivers/virtio/virtio-net.c +++ b/drivers/virtio/virtio-net.c @@ -42,6 +42,7 @@ /* Virtio net header size and packet buffer size */ #define VIRTIO_NET_HDRSIZE (sizeof(struct virtio_net_hdr_s)) +#define VIRTIO_NET_LLHDRSIZE (sizeof(struct virtio_net_llhdr_s)) #define VIRTIO_NET_BUFSIZE (MAX_NETDEV_PKTSIZE + CONFIG_NET_GUARDSIZE) /* Virtio net virtqueue index and number */ @@ -89,17 +90,21 @@ struct virtio_net_priv_s * | |<--------- datalen -------->| * ^base ^data * - * CONFIG_NET_LL_GUARDSIZE = sizeof(struct virtio_net_llhdr_s) + ETH_HDR_SIZE - * = sizeof(uintptr) + 10 + 14 - * = 32 (64-Bit) - * = 28 (32-Bit) + * CONFIG_NET_LL_GUARDSIZE >= VIRTIO_NET_LLHDRSIZE + ETH_HDR_SIZE + * = sizeof(uintptr) + 10 + 14 + * = 32 (64-Bit) + * = 28 (32-Bit) */ -struct virtio_net_llhdr_s +begin_packed_struct struct virtio_net_llhdr_s { FAR netpkt_t *pkt; /* Netpaket pointer */ struct virtio_net_hdr_s vhdr; /* Virtio net header */ -}; +} end_packed_struct; + +static_assert(CONFIG_NET_LL_GUARDSIZE >= VIRTIO_NET_LLHDRSIZE + ETH_HDRLEN, + "CONFIG_NET_LL_GUARDSIZE cannot be less than ETH_HDRLEN" + " + VIRTIO_NET_LLHDRSIZE"); /**************************************************************************** * Private Function Prototypes @@ -180,7 +185,9 @@ static void virtio_net_rxfill(FAR struct netdev_lowerhalf_s *dev) /* Alloc cookie and net header from transport layer */ - hdr = (FAR struct virtio_net_llhdr_s *)netpkt_getbase(pkt); + hdr = (FAR struct virtio_net_llhdr_s *) + (netpkt_getdata(dev, pkt) - VIRTIO_NET_LLHDRSIZE); + DEBUGASSERT((FAR uint8_t *)hdr >= netpkt_getbase(pkt)); memset(&hdr->vhdr, 0, sizeof(hdr->vhdr)); hdr->pkt = pkt; @@ -294,7 +301,9 @@ static int virtio_net_send(FAR struct netdev_lowerhalf_s *dev, return -EINVAL; } - hdr = (FAR struct virtio_net_llhdr_s *)netpkt_getbase(pkt); + hdr = (FAR struct virtio_net_llhdr_s *) + (netpkt_getdata(dev, pkt) - VIRTIO_NET_LLHDRSIZE); + DEBUGASSERT((FAR uint8_t *)hdr >= netpkt_getbase(pkt)); hdr->pkt = pkt; memset(&hdr->vhdr, 0, sizeof(hdr->vhdr));