[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);
>