qemu-trivial
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-trivial] [PATCH] vmxnet3: Pad short frames to minimum size (60


From: Michael Tokarev
Subject: Re: [Qemu-trivial] [PATCH] vmxnet3: Pad short frames to minimum size (60 bytes)
Date: Sun, 24 Aug 2014 16:06:53 +0400
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Icedove/24.7.0

20.08.2014 16:27, Ben Draper wrote:
> When running VMware ESXi under qemu-kvm the guest discards frames
> that are too short. Short ARP Requests will be dropped, this prevents
> guests on the same bridge as VMware ESXi from communicating. This patch
> simply adds the padding on the network device itself.

I'm not sure it is "trivial enough", so to say.  Do we have a maintainer
for vmxnet?  It's been written and updated several times by vmware (Daynix)
people, maybe they can comment on this somehow?  I mean, if we don't have
a maintainer for this device, it is okay to go to -trivial, but maybe it's
a good idea to try to reach the author(s) first?  (Adding Cc).

Especially since this change is only required in certain cases, not
generally.

Thanks,

/mjt

> Signed-off-by: Ben Draper <address@hidden>
> ---
>  hw/net/vmxnet3.c |   10 ++++++++++
>  1 file changed, 10 insertions(+)
> 
> diff --git a/hw/net/vmxnet3.c b/hw/net/vmxnet3.c
> index 791321f..f246fa1 100644
> --- a/hw/net/vmxnet3.c
> +++ b/hw/net/vmxnet3.c
> @@ -34,6 +34,7 @@
>  
>  #define PCI_DEVICE_ID_VMWARE_VMXNET3_REVISION 0x1
>  #define VMXNET3_MSIX_BAR_SIZE 0x2000
> +#define MIN_BUF_SIZE 60
>  
>  #define VMXNET3_BAR0_IDX      (0)
>  #define VMXNET3_BAR1_IDX      (1)
> @@ -1871,12 +1872,21 @@ vmxnet3_receive(NetClientState *nc, const uint8_t 
> *buf, size_t size)
>  {
>      VMXNET3State *s = qemu_get_nic_opaque(nc);
>      size_t bytes_indicated;
> +    uint8_t min_buf[MIN_BUF_SIZE];
>  
>      if (!vmxnet3_can_receive(nc)) {
>          VMW_PKPRN("Cannot receive now");
>          return -1;
>      }
>  
> +    /* Pad to minimum Ethernet frame length */
> +    if (size < sizeof(min_buf)) {
> +        memcpy(min_buf, buf, size);
> +        memset(&min_buf[size], 0, sizeof(min_buf) - size);
> +        buf = min_buf;
> +        size = sizeof(min_buf);
> +    }
> +
>      if (s->peer_has_vhdr) {
>          vmxnet_rx_pkt_set_vhdr(s->rx_pkt, (struct virtio_net_hdr *)buf);
>          buf += sizeof(struct virtio_net_hdr);
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]