On Tue, Jul 08, 2025 at 05:07:05PM +0200, Morten Brørup wrote:
> > From: Bruce Richardson [mailto:bruce.richard...@intel.com]
> > Sent: Tuesday, 8 July 2025 12.16
> > 
> > On Tue, Jul 08, 2025 at 12:00:42AM +0200, Morten Brørup wrote:
> > >    From: Vladimir Medvedkin [mailto:medvedk...@gmail.com]
> > >    Sent: Monday, 7 July 2025 22.10
> > >
> > >
> > >    Hi Morten, all,
> > >
> > >
> > >
> > >    пн, 7 июл. 2025 г. в 19:09, Morten Brørup
> > >    <[1]m...@smartsharesystems.com>:
> > >
> > >      > From: Bruce Richardson [mailto:[2]bruce.richard...@intel.com]
> > >      > Sent: Friday, 4 July 2025 13.32
> > >      > Hi all,
> > >      >
> > >      > this email discussion comes at a bit of a fortunate time for
> > me,
> > >      as I'm
> > >      > currently looking at our vlan tag/qinq stripping behaviour in
> > our
> > >      Intel
> > >      > NIC
> > >      > drivers, and there is some discussion internally as to what our
> > >      driver
> > >      > behaviour should be compared to what it has historically been.
> > :-)
> > >      >
> > >      > The documentation - both in the NIC guide [1] and the testpmd
> > >      guide [2]
> > >      > -
> > >      > is rather short on detail as to what exactly the behaviour
> > should
> > >      be
> > >      > when
> > >      > vlan strip or qinq strip is implemented. Therefore, I'd hope
> > that
> > >      those
> > >      > more familiar with networking than me would be able to help
> > >      clarify
> > >      > things
> > >      > so we can document the correct behaviour precisely - and
> > hopefully
> > >      test
> > >      > our
> > >      > drivers against it in future!
> > >      >
> > 
> > <snipping full discussion for brevity>
> > 
> > So from the discussion, would the following be a good set of guidelines
> > to
> > document for correct driver behaviour:
> > 
> > * VLAN-strip always strips one VLAN tag if available. If multiple VLAN
> > tags
> >   are present, it strips the outer.
> 
> Yes.
> 
> > * QinQ strip, strips two VLAN tags if present. If only one tag is
> > present it
> >   behaves as VLAN-strip.
> 
> Yes.
> 
> > * Specifying both VLAN-strip and QinQ strip is the same as QinQ strip
> > alone (??)
> 
> Yes.
> 
> One more thought about this:
> With QinQ stripping enabled, an mbuf for a single VLAN tagged packet will 
> have the RX_VLAN and RX_VLAN_STRIPPED flags set.
> So, considering this output, it would be reasonable requiring that VLAN 
> stripping is also enabled when QinQ stripping is enabled.
> 
> On the other hand, that might be a new requirement for applications.
> So backwards compatibility speaks for making the VLAN stripping configuration 
> "don't care" when the QinQ stripping configuration is enabled.
> 
> > 
> > Mbuf reporting behaviour:
> > 
> > Input Traffic               VLAN-strip on           QinQ strip on
> > --------------              -------------           -------------
> > Single VLAN pkts            Tag in mbuf->vlan_tci   Tag in mbuf->vlan_tci
> > 
> > Double VLAN pkts            Outer tag in vlan_tci   Outer tag in 
> > vlan_tci_outer
> >                                                             Inner tag in 
> > vlan_tci
> > 
> > 
> > Does the above seem reasonable and correct?
> 
> Yes.
> 
> BTW: I think that having double tagged packets on a link configured for 
> single VLAN stripping is weird.
> But describing the expected behavior is good!
> 
> > 
> > My one (minor)concern would be the handling and placement of the single
> > tag
> > in the QinQ case. Depending on how the hardware treats a single tag in
> > that
> > mode, the data path may have to pay a penalty if the HW takes a single
> > VLAN
> > and places it in the "outer" position in the descriptor, since it needs
> > to
> > go in the "inner" position in the mbuf, necessitating some conditional
> > logic.  AFAIK (subject to me actually testing for confirmation), this
> > will
> > be the case for our Intel drivers.
> 
> If that is the case, then maybe someone already thought about this when 
> designing the NIC HW, and came to a different conclusion than I did.
> 
> Inspired by Vladimir's comments about QinQ packets with an S-TAG (Subscriber 
> tag) and no C-TAG (Customer tag), maybe we should consider the alternative:
> When configured for QinQ stripping, the first tag is always considered the 
> S-TAG, and thus always goes to the vlan_tci_outer, and the second (inner) tag 
> is optional, and goes to the vlan_tci if present.
> 
> <feature creep>
> When configured for QinQ stripping, we could control the single VLAN tag 
> placement through the VLAN stripping configuration:
> With VLAN stripping also enabled, the link is considered a "super hybrid", 
> and the VLAN ID of single VLAN tagged packets goes into vlan_tci (being a 
> normal VLAN tagged packet).
> With VLAN stripping disabled, the link is considered a pure QinQ trunk, and 
> the VLAN ID of single VLAN tagged packets goes into vlan_tci_outer (being the 
> S-TAG of a QinQ packet with no C-TAG).
> </feature creep>
> 
> But again, this only works when VLAN/QinQ stripping is enabled. Into which 
> fields the various VLAN tags are written when VLAN/QinQ stripping is disabled 
> will be fixed/hardcoded.
> I'm not even sure the vlan_tci and vlan_tci_outer fields are filled when 
> stripping is disabled. But there are separate mbuf flags for VLAN presence 
> and VLAN stripped (and QinQ presence and QinQ stripped), so it could be 
> supported.
> 
> Furthermore, in favor of my original suggestion, consider TX:
> TX of an mbuf with a single VLAN tag doesn't know about QinQ with no C-TAG, 
> and thus looks at vlan_tci when transmitting such packets.
> If we like symmetry, RX should behave similarly.
> 
> I'm leaning towards my original suggestion, but I don't have a strong opinion 
> about this.
> There are good arguments for both solutions, either vlan_tci or 
> vlan_tci_outer for single VLAN tagged packets received on a link configured 
> for QinQ.
> 
I'd tend toward your original suggestion too, where single vlan always gets
put in vlan_tci field if stripped.

I think if we were to go back and change things is would be to not have
"vlan_tci_outer" field, but have a "vlan_tci_2" field, where the *second* vlan
tag, if present, is put. That would mean that the behaviour would be
unambiguous and the field would only ever be under consideration for
double-vlan packets with QinQ strip enabled. Sadly, I think that would be
too big a change to make to the mbuf at this stage. :-(

/Bruce

Reply via email to