A small fix for if_em.c, if_igb.c, if_ixgbe.c
John Baldwin
jhb at freebsd.org
Fri Dec 13 22:17:36 UTC 2013
On Friday, December 13, 2013 4:51:18 pm Adrian Chadd wrote:
> On 13 December 2013 10:26, John Baldwin <jhb at freebsd.org> wrote:
> > On Monday, December 09, 2013 2:37:08 pm Adrian Chadd wrote:
> >> Jack / John - thoughts?
> >
> > Note that if_start has always worked the way if_transmit would work with the
> > err = 0 change. All the other drivers in the tree are already giving you an
> > error if an earlier packet in the IFQ fails to transmit, and it's been that
> > way for decades. If you decide to make if_transmit precise (only return an
> > error if the specific packet fails), the corresponding change for if_start()
> > drivers would be to never return an error ever.
>
> Right. If we want some kind of sane network behaviour moving forward
> we .. well, we have to define it as being sane. :-)
>
> IMHO if_start()'s API should've been:
>
> * queue something to the ifnet queue - fail it we can't queue it
> * call if_start() to start trying to transmit something - a failure is
> not that the queued frame failed, but the driver is unable to dequeue
> frames.
>
> Anyone using if_start() failing as "the frame i just queued failed to
> transmit" is broken and well, we should just replace it with
> if_transmit().
Hmm, I was a bit wrong. Driver if_start routines return void, so they
only failed if the IFQ filled up completely. In that case, I think it is
fine to move forward with what you want (only return an error for failures
involving the packet passed to if_transmit), but I don't think we should
hange if_transmit drivers to just always return 0.
--
John Baldwin
More information about the freebsd-net
mailing list