1
0
mirror of https://github.com/openbsd/src.git synced 2025-01-10 06:47:55 -08:00

Fix receiving VLAN packets if LRO is enabled on ix(4).

The vlan packet bit is only valid for the last descriptor's receive
status.  When receiving just one buffer per packet, it makes no
difference, but with LRO there are multiple descriptors.  Checking
only the first one resulted in VLAN headers being stripped and large
packets appear as regular on ix interface.  Move the code setting
vlan tag from first to last descriptor.

bug reported and fix tested by Hrvoje Popovski
OK jan@
This commit is contained in:
bluhm 2023-08-21 21:45:18 +00:00
parent 081ccc5d84
commit 55040973a9

View File

@ -1,4 +1,4 @@
/* $OpenBSD: if_ix.c,v 1.203 2023/08/03 18:56:32 jan Exp $ */
/* $OpenBSD: if_ix.c,v 1.204 2023/08/21 21:45:18 bluhm Exp $ */
/******************************************************************************
@ -3230,12 +3230,6 @@ ixgbe_rxeof(struct rx_ring *rxr)
sendmp = mp;
sendmp->m_pkthdr.len = 0;
sendmp->m_pkthdr.ph_mss = 0;
#if NVLAN > 0
if (staterr & IXGBE_RXD_STAT_VP) {
sendmp->m_pkthdr.ether_vtag = vtag;
SET(sendmp->m_flags, M_VLANTAG);
}
#endif
}
sendmp->m_pkthdr.len += mp->m_len;
/*
@ -3256,7 +3250,12 @@ ixgbe_rxeof(struct rx_ring *rxr)
uint16_t pkts;
ixgbe_rx_checksum(staterr, sendmp);
#if NVLAN > 0
if (staterr & IXGBE_RXD_STAT_VP) {
sendmp->m_pkthdr.ether_vtag = vtag;
SET(sendmp->m_flags, M_VLANTAG);
}
#endif
if (hashtype != IXGBE_RXDADV_RSSTYPE_NONE) {
sendmp->m_pkthdr.ph_flowid = hash;
SET(sendmp->m_pkthdr.csum_flags, M_FLOWID);