Hi,
Please see below.
On Tue, 23 Apr 2024, Jie Hai wrote:
Hi, Ivan Malov,
Sorry for the late reply.
On 2024/4/10 21:19, Ivan Malov wrote:
Hi Jie,
Consider the following examples:
1) flow create 0 ingress pattern eth / ipv4 proto is 17 / udp / end \
actions queue index 1 / end
2) flow create 0 ingress pattern eth / ipv4 / udp / end \
actions queue index 1 / end
Generally speaking, these two rules might be equivalent, with "proto is 17"
in
the first one probably being redundant (the very presence of "udp" item
might
stand for the same match criterion -- the protocol ID being 17).
I can understand that.
Very well.
And I'd be tempted to treat the "has_vlan" case similarly. Consider:
3) flow create 0 ingress pattern eth has_vlan is 1 / vlan / end \
actions queue index 1 / end
4) flow create 0 ingress pattern eth / vlan / end \
actions queue index 1 / end
(rule (3) is similar to "rule-0" from your example)
Rules (3) and (4) seem equivalent to me -- the "has_vlan is 1" bit might be
redundant in flow (3) -- the presence of item "vlan" sort of means the
same.
Rule (3) and (4) should probably match both single-tagged and double-tagged
packets because, in both cases, the pattern does not clarify which protocol
follows the outermost VLAN tag. If one needs to exclude double-tag match,
they should clarify the rule in one of the possible ways, in example:
- pattern eth / vlan has_more_vlan is 0 / end
- pattern eth / vlan tpid is 0x0800 / end
- pattern eth / vlan / ipv4 / end
(the "tpid" goes to the "hdr.eth_proto" of "struct rte_flow_item_vlan").
As mentioned above, `has_vlan is 1` and `vlan` are the same,
which means `vlan` stands for any-tagged vlan,
Then, is the introduction of `has_vlan` and `has_more_vlan` unnecessary?
It's not clear why you believe it's unnecessary. Some vendors support
boolean match on "is outer VLAN present" and "is inner VLAN present"
in addition to exact match on TPID/TCI. It may be convenient to
expose these match criteria as sub-fields in ETH and VLAN items.
This should allow for faster parsing as one can drop item VLAN
from pattern in case there's no intention to match on TPID/TCI.
There are drivers seeing `vlan` an one vlan layer and match 'eth/vlan/end'
with single-tagged packets, e.g.bnxt, hns3, etc.
I think this meaning makes it easier to distinguish the functions of the two.
The `has_more_vlan is 1` is defined and used by some drivers, like mlx5.
While the `has_more_vlan is 0` is not defined.
What do you mean by saying "not defined"? Not defined where?
Having "has_more_vlan is 0" is perfectly legit, isn't it?
Here you give the meaning as `having no vlan after this vlan`.
Then, What should the follow rule mean? single-tagged or double tagged?
- pattern eth / vlan tpid is 0x8100 has_more_vlan is 0 / end
Item VLAN here is supposed to describe the header _immediately_ following
the ETH one, isn't it? If so, the rule means single-tagged. Doesn't it?
Thank you.
With regard to the question about VLAN ID match, "pattern eth / vlan vid is
10",
as well as "pattern eth has_vlan is 1 / vlan vid is 10", should probably
match
only on the outermost tag ID, -- that is, not on the inner one and not on
both.
I agree with it.
That is because the "vid is 10" criterion relates to the specific header,
as per the match item it sits in. If the user wants to match on the
inner VLAN ID (say, 11), they should clarify specify it as follows:
- pattern eth / vlan vid is 10 / vlan vid is 11 / end
- pattern eth / vlan / vlan vid is 11 / end
Hopefully, the rest of DPDK vendor community can correct me in case I got
that wrong. Should you have more questions, please feel free to ask such.
Thank you.
On Wed, 10 Apr 2024, Jie Hai wrote:
Hi, all,
I have some questions about the sub-options for ``VLAN`` and ``ETH`` item.
According to the documentation, ``has_vlan`` is sub-option of ``ETH``
item and it means that the pattern contains at least one vlan.
The ``VLAN`` item is used to match tagged packets and have some
sub-options such as ``vid``, ``tci``, etc.
If we combine them, what should the effect be?
For instance,
rule-0: flow create 0 ingress pattern eth has_vlan is 1 / vlan / end
actions queue index 2 / end
rule-1: flow create 0 ingress pattern eth has_vlan is 1 / vlan vid is 10
/ end actions queue index 2 / end
For rule-0, should it match single-tagged packets only or multi-tagged
only or both?
That is to say, which one will take effect, `has_vlan is 1` or `vlan` or
both?
For rule-2, which packets should it match, with inner VLAN id 10, or outer
VLAN id 10, or both 10?
The hns3 driver supports only the exact matching of VLAN numer.
And it is planned to adapt ``has_vlan`` and ``has_more_vlan`` to the
meaning of one VLAN for hns3 driver. Therefore, if the preceding
combinations are supported, we need to confirm the exact meanings.
So, what are your views on the above question?
.