[U-Boot] [PATCH 1/3] net: defragment IP packets

Robin Getz rgetz at blackfin.uclinux.org
Fri Jul 31 15:40:37 CEST 2009


On Fri 31 Jul 2009 08:16, Alessandro Rubini pondered:
> >> or simply your 
> >> ether+uboot can't keep up with the data rate.
> > 
> > That doesn't explain, why does it work, when there is no fragmentation???
> 
> Well, with no fragmentation there is less traffic. Each tftp packet is
> one patch, instead of a burst of packets (intermixed with pings).
> 
> Is the target replying to all pings? 

Yes. And I can see the same in wireshark.

> Or is it loosing some? 

No.

> If it looses say 30%, I expect one fragment in 3 to be lost as well.
> If your big-tftp is 4 fragments, 20% passes it loss is equally spread 
((2/3)^4),
> but I fear much less as the burst saturates the incoming queue. 
> 
> >> I'm pretty sure it's like this.
> > 
> > I'm not convinced yet - but need to do some further poking on a different 
> > network...
> 
> Thanks for these tests, mine is just guessing.

No problem. I want to make sure it is robust as well.

> > What is missing in the reassembly code (that is described in RFC815) 
> > is the timer. (quote from the RFC):
> > --------------
> > The  final  part  of  the  algorithm  is  some  sort of timer based
> > mechanism which decrements the time to  live  field  of  each  partially
> > reassembled  datagram,  so that incomplete datagrams which have outlived
> > their usefulness can be detected and deleted.
> > --------------
> 
> But I reassemble one packet only, so I don't need to timeout
> partly-filled packets to recover memory. 

But it is for the state that you described - the user cntr-C a current 
transfer, and the reassembly algorithm doesn't know to throw away a partially 
accepted packet, when things are cancelled...

> A soon as I have a fragment for a new packet, the old packet is 
> discarded (while unfragmented stuff flies intermixed).

Which works when you receive a complete fragment.

As you indicated - what really happens is it causes a timeout on the first 
packet. Up to you if you want to handle this or not...

All that should be needed is just to clear things in the start of NetLoop() 
(before eth_init) - there are a few things in there for CONFIG_NET_MULTI 
already, so I don't think that is a big deal... (That becomes your timer - a 
one shot at the very beginning of the transfer :)

-Robin


More information about the U-Boot mailing list