[intel] Strip spurious VLAN tags received by virtual function NICs
authorMichael Brown <mcb30@ipxe.org>
Mon, 11 Jul 2016 16:14:14 +0000 (17:14 +0100)
committerMichael Brown <mcb30@ipxe.org>
Tue, 12 Jul 2016 08:14:41 +0000 (09:14 +0100)
commitdb3443608fe32fffb4f6ad467bfc035a824bff52
treef8a2d65147e484ec8eeabc4b2c86d35ac6534119
parent45dd627689b73b7e80789d73c85d4a1080a7b8ea
[intel] Strip spurious VLAN tags received by virtual function NICs

The physical function may be configured to transparently insert a VLAN
tag into all transmitted packets.  Unfortunately, it does not
equivalently strip this same VLAN tag from all received packets.  This
behaviour may be observed in some Amazon EC2 instances with Enhanced
Networking enabled: transmissions work as expected but all packets
received by iPXE appear to have a spurious VLAN tag.

We can configure the receive queue to strip VLAN tags via the
RXDCTL.VME bit.  We need to find out from the PF driver whether or not
we should do so.

There exists a "get queue configuration" mailbox message which
contains a field labelled IXGBE_VF_TRANS_VLAN in the Linux driver.

A comment in the Linux PF driver describes this field as "notify VF of
need for VLAN tag stripping, and correct queue".  It will be filled
with a non-zero value if the PF is enforcing the use of a single VLAN
tag.  It will also be filled with a non-zero value if the PF is using
multiple traffic classes.

The Linux VF driver seems to treat this field as being simply the
number of traffic classes, and gives it no VLAN-related
interpretation.  The Linux VF driver instead handles the VLAN tag
stripping by simply assuming that any unrecognised VLAN tag ought to
be silently dropped.

We choose to strip and ignore the VLAN tag if the IXGBE_VF_TRANS_VLAN
field has a non-zero value.

Reported-by: Leonid Vasetsky <leonidv@velostrata.com>
Tested-by: Leonid Vasetsky <leonidv@velostrata.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/drivers/net/intelvf.c
src/drivers/net/intelvf.h
src/drivers/net/intelx.h
src/drivers/net/intelxvf.c