diff options
author | Eric Joyner <erj@FreeBSD.org> | 2020-04-27 22:02:44 +0000 |
---|---|---|
committer | Eric Joyner <erj@FreeBSD.org> | 2020-04-27 22:02:44 +0000 |
commit | 45818bf1a0fae8b5b13def517953d4a3d9d19257 (patch) | |
tree | ca53cb84e479ce96d354ec032c672143b320160f /sys/net/iflib.h | |
parent | 02343a67c22dff0d190d34004d71570352b53e76 (diff) | |
download | src-45818bf1a0fae8b5b13def517953d4a3d9d19257.tar.gz src-45818bf1a0fae8b5b13def517953d4a3d9d19257.zip |
iflib: Stop interface before (un)registering VLAN
This patch is intended to solve a specific problem that iavf(4)
encounters, but what it does can be extended to solve other issues.
To summarize the iavf(4) issue, if the PF driver configures VLAN
anti-spoof, then the VF driver needs to make sure no untagged traffic is
sent if a VLAN is configured, and vice-versa. This can be an issue when
a VLAN is being registered or unregistered, e.g. when a packet may be on
the ring with a VLAN in it, but the VLANs are being unregistered. This
can cause that tagged packet to go out and cause an MDD event.
To fix this, include a new interface-dependent function that drivers can
implement named IFDI_NEEDS_RESTART(). Right now, this function is called
in iflib_vlan_unregister/register() to determine whether the interface
needs to be stopped and started when a VLAN is registered or
unregistered. The default return value of IFDI_NEEDS_RESTART() is true,
so this fixes the MDD problem that iavf(4) encounters, since the
interface rings are flushed during a stop/init.
A future change to iavf(4) will implement that function just in case the
default value changes, and to make it explicit that this interface reset
is required when a VLAN is added or removed.
Reviewed by: gallatin@
MFC after: 1 week
Sponsored by: Intel Corporation
Differential Revision: https://reviews.freebsd.org/D22086
Notes
Notes:
svn path=/head/; revision=360398
Diffstat (limited to 'sys/net/iflib.h')
-rw-r--r-- | sys/net/iflib.h | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/sys/net/iflib.h b/sys/net/iflib.h index 46e454b5d937..9c0738a0faf9 100644 --- a/sys/net/iflib.h +++ b/sys/net/iflib.h @@ -377,6 +377,15 @@ typedef enum { #define IFLIB_SINGLE_IRQ_RX_ONLY 0x40000 /* + * These enum values are used in iflib_needs_restart to indicate to iflib + * functions whether or not the interface needs restarting when certain events + * happen. + */ +enum iflib_restart_event { + IFLIB_RESTART_VLAN_CONFIG, +}; + +/* * field accessors */ void *iflib_get_softc(if_ctx_t ctx); |