Ok, I've dug into it a bit more. The root bits here were more exposed
from the ifnet changes that were made, but the TL;DR is that if the
driver starts to transmit the frame and fails, we can't return an
error. We have to free the buffer ourselves.

So for ath, and maybe iwn too, we can't return an error if we decide
to start encapsulating the frame. That's the point where the mbuf may
change. For something like "interface is down", "queue depth is too
large", etc then we can do it.

So for ath, I think I have to pick a point in the output path where we
won't return the mbuf. It's likely once we call ath_tx_start() then we
should consume the mbuf and return no-error. Now, the bug bug here is
that ath_tx_start() actually does free the mbuf, and we .. then return
failure codes. We should return OK, and consume the node reference.

I'll sleep on it and see :)

freebsd-wireless@freebsd.org mailing list
To unsubscribe, send any mail to "freebsd-wireless-unsubscr...@freebsd.org"

Reply via email to