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




reply via email to

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