tech-net archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: refactoring ip_output() and the L2 _output()



On Fri, Feb 01, 2013 at 05:27:07PM -0600, David Young wrote:
> I've been trying to get a handle on a few of the many MP-safety problems
> in the network stack.  My investigations brought me yesterday to
> ether_output().
> 
> ether_output() is surprisingly complicated.  The ether_output() that one
> would hope for takes an ifnet, a packet, and a nexthop as arguments,
> adds the correct L2 header to the front of the packet, and calls into a
> driver's transmit routine.  The ether_output() that we have does some
> acrobatics with routes, ARP resolution, cons'ing up and prepending an L2
> header, queueing the packet and nudging the driver.
> 
> Here are the route acrobatics with some annotations:
> 
>         if ((rt = rt0) != NULL) {
>                 if ((rt->rt_flags & RTF_UP) == 0) {
> 
> It's funny that we get into ether_output() with an rtentry that's
> not even usable.  I'm not sure how that happens.  I will have to
> look more carefully at what ip_output() is doing.

I think the checks for !RTF_UP have something to do with the route
caches (struct route).  I'm experimenting with a tree that uses no route
caches and dispenses with this strange logic: if I remember, I will let
you know how that goes.

Dave

-- 
David Young
dyoung%pobox.com@localhost    Urbana, IL    (217) 721-9981


Home | Main Index | Thread Index | Old Index