Index: sys/net/iflib.h =================================================================== --- sys/net/iflib.h +++ sys/net/iflib.h @@ -187,6 +187,7 @@ void (*ift_rxd_refill) (void * , if_rxd_update_t iru); void (*ift_rxd_flush) (void *, uint16_t qsidx, uint8_t flidx, qidx_t pidx); int (*ift_legacy_intr) (void *); + qidx_t (*ift_txq_select) (void *, struct mbuf *); } *if_txrx_t; typedef struct if_softc_ctx { @@ -398,6 +399,16 @@ */ #define IFLIB_PSEUDO_ETHER 0x80000 +/* The following IFLIB_FEATURE_* defines are for driver modules to determine + * what features this version of iflib supports. They shall be defined to the + * first __FreeBSD_version that introduced the feature. + */ +/* + * Driver can set its own TX queue selection function + * as ift_txq_select in struct if_txrx + */ +#define IFLIB_FEATURE_QUEUE_SELECT 1400045 + /* * Interface has an admin completion queue */ Index: sys/net/iflib.c =================================================================== --- sys/net/iflib.c +++ sys/net/iflib.c @@ -209,6 +209,7 @@ #define isc_rxd_refill ifc_txrx.ift_rxd_refill #define isc_rxd_flush ifc_txrx.ift_rxd_flush #define isc_legacy_intr ifc_txrx.ift_legacy_intr +#define isc_txq_select ifc_txrx.ift_txq_select eventhandler_tag ifc_vlan_attach_event; eventhandler_tag ifc_vlan_detach_event; struct ether_addr ifc_mac; @@ -4153,11 +4154,14 @@ MPASS(m->m_nextpkt == NULL); /* ALTQ-enabled interfaces always use queue 0. */ qidx = 0; - if ((NTXQSETS(ctx) > 1) && M_HASHTYPE_GET(m) && !ALTQ_IS_ENABLED(&ifp->if_snd)) + /* Use driver-supplied queue selection method if it exists */ + if (ctx->isc_txq_select) + qidx = ctx->isc_txq_select(ctx->ifc_softc, m); + /* If not, use iflib's standard method */ + else if ((NTXQSETS(ctx) > 1) && M_HASHTYPE_GET(m) && !ALTQ_IS_ENABLED(&ifp->if_snd)) qidx = QIDX(ctx, m); - /* - * XXX calculate buf_ring based on flowid (divvy up bits?) - */ + + /* Set TX queue */ txq = &ctx->ifc_txqs[qidx]; #ifdef DRIVER_BACKPRESSURE Index: sys/sys/param.h =================================================================== --- sys/sys/param.h +++ sys/sys/param.h @@ -76,7 +76,7 @@ * cannot include sys/param.h and should only be updated here. */ #undef __FreeBSD_version -#define __FreeBSD_version 1400044 +#define __FreeBSD_version 1400045 /* * __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,