[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: |
Dmitry Fleytman |
Subject: |
Re: [Qemu-trivial] [PATCH] vmxnet3: Pad short frames to minimum size (60 bytes) |
Date: |
Sun, 24 Aug 2014 15:28:31 +0300 |
On Aug 24, 2014, at 15:06 PM, Michael Tokarev <address@hidden> wrote:
> 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.
Hi Michael,
I’m the maintainer of vmxnet3/pvscsi devices in QEMU. Thanks for CC’ing me.
I think this patch is correct and needed.
As we saw a few times already on different operating systems,
vmware drivers expect short packets to be padded as required
by corresponding RFC. Therefore this patch fixes a real bug.
Reviewed-by: Dmitry Fleytman <address@hidden>
>
> 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);
>>
>