sfxge: assert either kernel or internal copy of interface flags
ioctl to put interface down sets ifp->if_flags which holds the intended administratively defined state and calls driver callback to apply it. When everything is done, driver updates internal copy of interface flags sc->if_flags which holds the operational state. So, transmit from Rx path is possible when interface is intended to be administratively down in accordance with ifp->if_flags, but not applied yet and the operational state is up in accordance with sc->if_flags. Sponsored by: Solarflare Communications, Inc. Differential Revision: https://reviews.freebsd.org/D2075
This commit is contained in:
parent
d5ec585697
commit
87581ab817
@ -676,7 +676,16 @@ sfxge_if_transmit(struct ifnet *ifp, struct mbuf *m)
|
|||||||
|
|
||||||
sc = (struct sfxge_softc *)ifp->if_softc;
|
sc = (struct sfxge_softc *)ifp->if_softc;
|
||||||
|
|
||||||
KASSERT(ifp->if_flags & IFF_UP, ("interface not up"));
|
/*
|
||||||
|
* Transmit may be called when interface is up from the kernel
|
||||||
|
* point of view, but not yet up (in progress) from the driver
|
||||||
|
* point of view. I.e. link aggregation bring up.
|
||||||
|
* Transmit may be called when interface is up from the driver
|
||||||
|
* point of view, but already down from the kernel point of
|
||||||
|
* view. I.e. Rx when interface shutdown is in progress.
|
||||||
|
*/
|
||||||
|
KASSERT((ifp->if_flags & IFF_UP) || (sc->if_flags & IFF_UP),
|
||||||
|
("interface not up"));
|
||||||
|
|
||||||
/* Pick the desired transmit queue. */
|
/* Pick the desired transmit queue. */
|
||||||
if (m->m_pkthdr.csum_flags & (CSUM_DELAY_DATA | CSUM_TSO)) {
|
if (m->m_pkthdr.csum_flags & (CSUM_DELAY_DATA | CSUM_TSO)) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user