diff --git a/sys/net/iflib.c b/sys/net/iflib.c --- a/sys/net/iflib.c +++ b/sys/net/iflib.c @@ -932,6 +932,8 @@ bus_dmamap_sync(fl->ifl_buf_tag, map[nic_i], BUS_DMASYNC_PREREAD); slot->flags &= ~NS_BUF_CHANGED; + /* clear the vlan id when returning the slot */ + slot->vtag = 0; nm_i = nm_next(nm_i, lim); nic_i = nm_next(nic_i, lim); @@ -1225,6 +1227,7 @@ ri.iri_cidx = *cidxp; error = ctx->isc_rxd_pkt_get(ctx->ifc_softc, &ri); + for (i = 0; i < ri.iri_nfrags; i++) { if (error) { ring->slot[nm_i].len = 0; @@ -1234,6 +1237,7 @@ if (i == (ri.iri_nfrags - 1)) { ring->slot[nm_i].len -= crclen; ring->slot[nm_i].flags = 0; + ring->slot[nm_i].vtag = ri.iri_vtag; /* Update receive counters */ rx_bytes += ri.iri_len; diff --git a/sys/net/netmap.h b/sys/net/netmap.h --- a/sys/net/netmap.h +++ b/sys/net/netmap.h @@ -164,6 +164,7 @@ uint16_t len; /* length for this slot */ uint16_t flags; /* buf changed, etc. */ uint64_t ptr; /* pointer for indirect buffers */ + uint16_t vtag; /* vlan id */ }; /*