Patchwork Make SLIRP Ethernet packets size to 64 bytes minimum

login
register
mail settings
Submitter Fabien Chouteau
Date June 27, 2011, 12:41 p.m.
Message ID <1309178511-20027-1-git-send-email-chouteau@adacore.com>
Download mbox | patch
Permalink /patch/102155/
State New
Headers show

Comments

Fabien Chouteau - June 27, 2011, 12:41 p.m.
Signed-off-by: Fabien Chouteau <chouteau@adacore.com>
---
 slirp/slirp.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)
Stefan Hajnoczi - June 27, 2011, 1:50 p.m.
On Mon, Jun 27, 2011 at 1:41 PM, Fabien Chouteau <chouteau@adacore.com> wrote:
>
> Signed-off-by: Fabien Chouteau <chouteau@adacore.com>
> ---
>  slirp/slirp.c |    4 ++--
>  1 files changed, 2 insertions(+), 2 deletions(-)

Any particular bug that this fixes?

There have been 64 byte minimum padding patches to several emulated
NICs.  There has also been discussion about where the best place to do
this is.  Why is this patch necessary?

Stefan
Fabien Chouteau - June 27, 2011, 2:23 p.m.
On 27/06/2011 15:50, Stefan Hajnoczi wrote:
> On Mon, Jun 27, 2011 at 1:41 PM, Fabien Chouteau <chouteau@adacore.com> wrote:
>>
>> Signed-off-by: Fabien Chouteau <chouteau@adacore.com>
>> ---
>>  slirp/slirp.c |    4 ++--
>>  1 files changed, 2 insertions(+), 2 deletions(-)
> 
> Any particular bug that this fixes?
> 
> There have been 64 byte minimum padding patches to several emulated
> NICs.  There has also been discussion about where the best place to do
> this is.  Why is this patch necessary?
> 

This patch is necessary because some NICs are configured to drop short frames,
therefore the OS will not receive some of the packets generated by Qemu.

There's a first patch to fix this issue:
http://git.savannah.gnu.org/cgit/qemu.git/commit/?id=dbf3c4b4baceb91eb64d09f787cbe92d65188813

My patch fixes two other sources of short frames.
Stefan Hajnoczi - June 27, 2011, 3:39 p.m.
On Mon, Jun 27, 2011 at 3:23 PM, Fabien Chouteau <chouteau@adacore.com> wrote:
> On 27/06/2011 15:50, Stefan Hajnoczi wrote:
>> On Mon, Jun 27, 2011 at 1:41 PM, Fabien Chouteau <chouteau@adacore.com> wrote:
>>>
>>> Signed-off-by: Fabien Chouteau <chouteau@adacore.com>
>>> ---
>>>  slirp/slirp.c |    4 ++--
>>>  1 files changed, 2 insertions(+), 2 deletions(-)
>>
>> Any particular bug that this fixes?
>>
>> There have been 64 byte minimum padding patches to several emulated
>> NICs.  There has also been discussion about where the best place to do
>> this is.  Why is this patch necessary?
>>
>
> This patch is necessary because some NICs are configured to drop short frames,
> therefore the OS will not receive some of the packets generated by Qemu.
>
> There's a first patch to fix this issue:
> http://git.savannah.gnu.org/cgit/qemu.git/commit/?id=dbf3c4b4baceb91eb64d09f787cbe92d65188813
>
> My patch fixes two other sources of short frames.

Thanks for the explanation.  I stepped back from the discussion on
where the right place to fix this is last time around.  Now I'm
wondering why do anything in slirp when the other sources (tap, ...)
aren't padding to 64 bytes?

Stefan
Fabien Chouteau - June 27, 2011, 4:12 p.m.
On 27/06/2011 17:39, Stefan Hajnoczi wrote:
> On Mon, Jun 27, 2011 at 3:23 PM, Fabien Chouteau <chouteau@adacore.com> wrote:
>> On 27/06/2011 15:50, Stefan Hajnoczi wrote:
>>> On Mon, Jun 27, 2011 at 1:41 PM, Fabien Chouteau <chouteau@adacore.com> wrote:
>>>>
>>>> Signed-off-by: Fabien Chouteau <chouteau@adacore.com>
>>>> ---
>>>>  slirp/slirp.c |    4 ++--
>>>>  1 files changed, 2 insertions(+), 2 deletions(-)
>>>
>>> Any particular bug that this fixes?
>>>
>>> There have been 64 byte minimum padding patches to several emulated
>>> NICs.  There has also been discussion about where the best place to do
>>> this is.  Why is this patch necessary?
>>>
>>
>> This patch is necessary because some NICs are configured to drop short frames,
>> therefore the OS will not receive some of the packets generated by Qemu.
>>
>> There's a first patch to fix this issue:
>> http://git.savannah.gnu.org/cgit/qemu.git/commit/?id=dbf3c4b4baceb91eb64d09f787cbe92d65188813
>>
>> My patch fixes two other sources of short frames.
> 
> Thanks for the explanation.  I stepped back from the discussion on
> where the right place to fix this is last time around.  Now I'm
> wondering why do anything in slirp when the other sources (tap, ...)
> aren't padding to 64 bytes?

I think that packets generated by Qemu must follow RFC. For other sources, qemu
should keep original size when possible and put padding otherwise.
Stefan Hajnoczi - June 28, 2011, 8:34 a.m.
On Mon, Jun 27, 2011 at 5:12 PM, Fabien Chouteau <chouteau@adacore.com> wrote:
> On 27/06/2011 17:39, Stefan Hajnoczi wrote:
>> On Mon, Jun 27, 2011 at 3:23 PM, Fabien Chouteau <chouteau@adacore.com> wrote:
>>> On 27/06/2011 15:50, Stefan Hajnoczi wrote:
>>>> On Mon, Jun 27, 2011 at 1:41 PM, Fabien Chouteau <chouteau@adacore.com> wrote:
>>>>>
>>>>> Signed-off-by: Fabien Chouteau <chouteau@adacore.com>
>>>>> ---
>>>>>  slirp/slirp.c |    4 ++--
>>>>>  1 files changed, 2 insertions(+), 2 deletions(-)
>>>>
>>>> Any particular bug that this fixes?
>>>>
>>>> There have been 64 byte minimum padding patches to several emulated
>>>> NICs.  There has also been discussion about where the best place to do
>>>> this is.  Why is this patch necessary?
>>>>
>>>
>>> This patch is necessary because some NICs are configured to drop short frames,
>>> therefore the OS will not receive some of the packets generated by Qemu.
>>>
>>> There's a first patch to fix this issue:
>>> http://git.savannah.gnu.org/cgit/qemu.git/commit/?id=dbf3c4b4baceb91eb64d09f787cbe92d65188813
>>>
>>> My patch fixes two other sources of short frames.
>>
>> Thanks for the explanation.  I stepped back from the discussion on
>> where the right place to fix this is last time around.  Now I'm
>> wondering why do anything in slirp when the other sources (tap, ...)
>> aren't padding to 64 bytes?
>
> I think that packets generated by Qemu must follow RFC. For other sources, qemu
> should keep original size when possible and put padding otherwise.

slirp interfaces to net.h which does not emulate Ethernet.  For
example, it doesn't carry the Frame Check Sequence (FCS) as per the
Ethernet standard.  NICs that want to report FCS to the guest
calculate it themselves, just like they do with 64-byte padding.  So I
find it weird to say we should honor Ethernet when the transport we
are using is not Ethernet.

This patch doesn't hurt but we'd be just as well off without it.

Did you do this to fix a bug?  If so, then something else in QEMU
needs to be fixed, not slirp.

Stefan
Fabien Chouteau - June 28, 2011, 9:08 a.m.
On 28/06/2011 10:34, Stefan Hajnoczi wrote:
> On Mon, Jun 27, 2011 at 5:12 PM, Fabien Chouteau <chouteau@adacore.com> wrote:
>> On 27/06/2011 17:39, Stefan Hajnoczi wrote:
>>> On Mon, Jun 27, 2011 at 3:23 PM, Fabien Chouteau <chouteau@adacore.com> wrote:
>>>> On 27/06/2011 15:50, Stefan Hajnoczi wrote:
>>>>> On Mon, Jun 27, 2011 at 1:41 PM, Fabien Chouteau <chouteau@adacore.com> wrote:
>>>>>>
>>>>>> Signed-off-by: Fabien Chouteau <chouteau@adacore.com>
>>>>>> ---
>>>>>>  slirp/slirp.c |    4 ++--
>>>>>>  1 files changed, 2 insertions(+), 2 deletions(-)
>>>>>
>>>>> Any particular bug that this fixes?
>>>>>
>>>>> There have been 64 byte minimum padding patches to several emulated
>>>>> NICs.  There has also been discussion about where the best place to do
>>>>> this is.  Why is this patch necessary?
>>>>>
>>>>
>>>> This patch is necessary because some NICs are configured to drop short frames,
>>>> therefore the OS will not receive some of the packets generated by Qemu.
>>>>
>>>> There's a first patch to fix this issue:
>>>> http://git.savannah.gnu.org/cgit/qemu.git/commit/?id=dbf3c4b4baceb91eb64d09f787cbe92d65188813
>>>>
>>>> My patch fixes two other sources of short frames.
>>>
>>> Thanks for the explanation.  I stepped back from the discussion on
>>> where the right place to fix this is last time around.  Now I'm
>>> wondering why do anything in slirp when the other sources (tap, ...)
>>> aren't padding to 64 bytes?
>>
>> I think that packets generated by Qemu must follow RFC. For other sources, qemu
>> should keep original size when possible and put padding otherwise.
>
> slirp interfaces to net.h which does not emulate Ethernet.  For
> example, it doesn't carry the Frame Check Sequence (FCS) as per the
> Ethernet standard. NICs that want to report FCS to the guest
> calculate it themselves, just like they do with 64-byte padding.  So I
> find it weird to say we should honor Ethernet when the transport we
> are using is not Ethernet.

In this case it's always Ethernet frames, look at the two patched lines,
there's an Ethernet header:

uint8_t arp_req[max(ETH_HLEN + sizeof(struct arphdr), 64)];

slirp_output(slirp->opaque, buf, max(ip_data_len + ETH_HLEN, 64));

>
> This patch doesn't hurt but we'd be just as well off without it.
>
> Did you do this to fix a bug?  If so, then something else in QEMU
> needs to be fixed, not slirp.

When Qemu generates bad Ethernet frames, I think it's a bug.

And again, this is the extension of a previous patch. If this patch is not
valid then we should revert the first, it's also a question of consistency.
Stefan Hajnoczi - June 28, 2011, 1:15 p.m.
On Tue, Jun 28, 2011 at 10:08 AM, Fabien Chouteau <chouteau@adacore.com> wrote:
> On 28/06/2011 10:34, Stefan Hajnoczi wrote:
>> This patch doesn't hurt but we'd be just as well off without it.
>>
>> Did you do this to fix a bug?  If so, then something else in QEMU
>> needs to be fixed, not slirp.
>
> When Qemu generates bad Ethernet frames, I think it's a bug.
>
> And again, this is the extension of a previous patch. If this patch is not
> valid then we should revert the first, it's also a question of consistency.

IMO the previous patch is not necessary either.

Since there is no net subsystem maintainer who can help decide which
way to go, I'm going to back off from this issue.  Please go ahead.

Stefan
Fabien Chouteau - June 30, 2011, 8:38 a.m.
On 28/06/2011 15:15, Stefan Hajnoczi wrote:
> On Tue, Jun 28, 2011 at 10:08 AM, Fabien Chouteau <chouteau@adacore.com> wrote:
>> On 28/06/2011 10:34, Stefan Hajnoczi wrote:
>>> This patch doesn't hurt but we'd be just as well off without it.
>>>
>>> Did you do this to fix a bug?  If so, then something else in QEMU
>>> needs to be fixed, not slirp.
>>
>> When Qemu generates bad Ethernet frames, I think it's a bug.
>>
>> And again, this is the extension of a previous patch. If this patch is not
>> valid then we should revert the first, it's also a question of consistency.
> 
> IMO the previous patch is not necessary either.
> 
> Since there is no net subsystem maintainer who can help decide which
> way to go, I'm going to back off from this issue.  Please go ahead.
> 

OK thanks.

Any other comments?
Fabien Chouteau - July 5, 2011, 2:24 p.m.
On 30/06/2011 10:38, Fabien Chouteau wrote:
> On 28/06/2011 15:15, Stefan Hajnoczi wrote:
>> On Tue, Jun 28, 2011 at 10:08 AM, Fabien Chouteau <chouteau@adacore.com> wrote:
>>> On 28/06/2011 10:34, Stefan Hajnoczi wrote:
>>>> This patch doesn't hurt but we'd be just as well off without it.
>>>>
>>>> Did you do this to fix a bug?  If so, then something else in QEMU
>>>> needs to be fixed, not slirp.
>>>
>>> When Qemu generates bad Ethernet frames, I think it's a bug.
>>>
>>> And again, this is the extension of a previous patch. If this patch is not
>>> valid then we should revert the first, it's also a question of consistency.
>>
>> IMO the previous patch is not necessary either.
>>
>> Since there is no net subsystem maintainer who can help decide which
>> way to go, I'm going to back off from this issue.  Please go ahead.
>>
> 
> OK thanks.
> 
> Any other comments?
> 

This patch got no further comments, can it be applied please?

thanks,
Edgar Iglesias - Aug. 4, 2011, 11:04 p.m.
On Tue, Jun 28, 2011 at 09:34:16AM +0100, Stefan Hajnoczi wrote:
> On Mon, Jun 27, 2011 at 5:12 PM, Fabien Chouteau <chouteau@adacore.com> wrote:
> > On 27/06/2011 17:39, Stefan Hajnoczi wrote:
> >> On Mon, Jun 27, 2011 at 3:23 PM, Fabien Chouteau <chouteau@adacore.com> wrote:
> >>> On 27/06/2011 15:50, Stefan Hajnoczi wrote:
> >>>> On Mon, Jun 27, 2011 at 1:41 PM, Fabien Chouteau <chouteau@adacore.com> wrote:
> >>>>>
> >>>>> Signed-off-by: Fabien Chouteau <chouteau@adacore.com>
> >>>>> ---
> >>>>>  slirp/slirp.c |    4 ++--
> >>>>>  1 files changed, 2 insertions(+), 2 deletions(-)
> >>>>
> >>>> Any particular bug that this fixes?
> >>>>
> >>>> There have been 64 byte minimum padding patches to several emulated
> >>>> NICs.  There has also been discussion about where the best place to do
> >>>> this is.  Why is this patch necessary?
> >>>>
> >>>
> >>> This patch is necessary because some NICs are configured to drop short frames,
> >>> therefore the OS will not receive some of the packets generated by Qemu.
> >>>
> >>> There's a first patch to fix this issue:
> >>> http://git.savannah.gnu.org/cgit/qemu.git/commit/?id=dbf3c4b4baceb91eb64d09f787cbe92d65188813
> >>>
> >>> My patch fixes two other sources of short frames.
> >>
> >> Thanks for the explanation.  I stepped back from the discussion on
> >> where the right place to fix this is last time around.  Now I'm
> >> wondering why do anything in slirp when the other sources (tap, ...)
> >> aren't padding to 64 bytes?
> >
> > I think that packets generated by Qemu must follow RFC. For other sources, qemu
> > should keep original size when possible and put padding otherwise.
> 
> slirp interfaces to net.h which does not emulate Ethernet.  For
> example, it doesn't carry the Frame Check Sequence (FCS) as per the
> Ethernet standard.  NICs that want to report FCS to the guest
> calculate it themselves, just like they do with 64-byte padding.  So I
> find it weird to say we should honor Ethernet when the transport we
> are using is not Ethernet.
> 
> This patch doesn't hurt but we'd be just as well off without it.
> 
> Did you do this to fix a bug?  If so, then something else in QEMU
> needs to be fixed, not slirp.

Hi,

IMO SLIRP currently does claim to emulate Ethernet.

Part of the problem is that QEMU's internal net router doesnt really
route but acts more like a bridge between different networks. Different
network wire formats dont get translated, they just pass through.

To be able to emulate different network types, I think translation/routing
will be necessary.

Last time this came up, if I am not misstaken MST suggested that we
add a translation macro or a function call to the netdevice models to be
called when receiving packets that would translate into the desired
wire format. I wasn't very happy about that because I didnt want to
clutter the device models with stuff that the hw equivalence doesnt
do but I dont have any better suggestions and I definitely think a receive
call function to translate is better than the current state so thats
what I would suggest now.

MST, Im CC:ing you, please correct me if I remeber wrong.

In the long run I think every netdevice should register the wire format
is uses so that the core networking code can translate accordingly.
That way we could support something injecting XXX talking to an
Ethernet device. The internal format may very well be ethernet a la tap
format, i.e ethernet without preamble, padding and CRC.

Cheers

Patch

diff --git a/slirp/slirp.c b/slirp/slirp.c
index 1593be1..be30501 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -697,7 +697,7 @@  void if_encap(Slirp *slirp, const uint8_t *ip_data, int ip_data_len)
         return;
     
     if (!memcmp(slirp->client_ethaddr, zero_ethaddr, ETH_ALEN)) {
-        uint8_t arp_req[ETH_HLEN + sizeof(struct arphdr)];
+        uint8_t arp_req[max(ETH_HLEN + sizeof(struct arphdr), 64)];
         struct ethhdr *reh = (struct ethhdr *)arp_req;
         struct arphdr *rah = (struct arphdr *)(arp_req + ETH_HLEN);
         const struct ip *iph = (const struct ip *)ip_data;
@@ -734,7 +734,7 @@  void if_encap(Slirp *slirp, const uint8_t *ip_data, int ip_data_len)
         memcpy(&eh->h_source[2], &slirp->vhost_addr, 4);
         eh->h_proto = htons(ETH_P_IP);
         memcpy(buf + sizeof(struct ethhdr), ip_data, ip_data_len);
-        slirp_output(slirp->opaque, buf, ip_data_len + ETH_HLEN);
+        slirp_output(slirp->opaque, buf, max(ip_data_len + ETH_HLEN, 64));
     }
 }