Rewriter VLAN Tagging (ES0)
Before a frame is transmitted on a port it is subject to one ES0 lookup.
ES0 is intended for VLAN tag manipulations and is controlled by the tc flower filter command.
ES0 supports only one keyset on each switch:
| Switch | Keyset |
|---|---|
Sparx5 |
ISDX |
LAN966x |
VID |
| A keyset is an internal value used by the hardware. A flower key is what the user specifies in the tc flower filter command. |
1. ISDX
The ISDX keyset is used for all lookups and matches on the following flower keys:
| Flower key | Value | Example | Description |
|---|---|---|---|
vlan_id |
<VID> or <VID>/<VID_MASK> |
vlan_id 1234 or vlan_id 0x100/0xff0 |
The classified VID to match. |
vlan_ethtype |
<PROTO> |
vlan_ethtype all |
Only 'all' is allowed here as ES0 cannot match on a specific protocol. |
2. VID
The VID keyset is used for all lookups and matches on the following flower keys:
| Flower key | Value | Example | Description |
|---|---|---|---|
vlan_id |
<VID> or <VID>/<VID_MASK> |
vlan_id 1234 or vlan_id 0x100/0xff0 |
The classified VID to match. |
vlan_prio |
<PCP> or <PCP>/<PCP_MASK> |
vlan_prio 3 or vlan_id 0x0/0x1 |
The classified PCP to match. |
vlan_ethtype |
<PROTO> |
vlan_ethtype all |
Only 'all' is allowed here as ES0 cannot match on a specific protocol. |
3. Filter examples
This filter matches on the classified VID and PCP and pops the VLAN tag:
$ tc qdisc add dev eth0 clsact
$ tc filter add dev eth0 egress chain 10000000 prio 10 handle 42 protocol 802.1q flower skip_sw \
vlan_id 100 \
vlan_prio 1 \
vlan_ethtype all \
action vlan pop \
action goto chain 10000001
| Sparx5: Does not support vlan_prio, the vlan actions (will be added in a future release). |
This filter matches on the classified VID and PCP and modifies the VLAN tag:
$ tc qdisc add dev eth0 clsact
$ tc filter add dev eth0 egress chain 10000000 prio 10 handle 42 protocol 802.1q flower skip_sw \
vlan_id 100 \
vlan_prio 1 \
vlan_ethtype all \
action vlan modify id 200 priority 2 \
action goto chain 10000001
This filter matches on the classified VID and PCP and adds an outermost VLAN service tag:
$ tc qdisc add dev eth0 clsact
$ tc filter add dev eth0 egress chain 10000000 prio 10 handle 42 protocol 802.1q flower skip_sw \
vlan_id 100 \
vlan_prio 1 \
vlan_ethtype all \
action vlan push protocol 802.1ad id 200 priority 2 \
action goto chain 10000001
3.1. ES0 Actions
The ES0 lookup supports the actions shown in this table:
| Flower action | Example | Description | Sparx5 | LAN966x |
|---|---|---|---|---|
pass |
action pass |
This is a no-op action. |
✔ |
✔ |
vlan pop |
action vlan pop |
Pops the outermost VLAN tag. |
· |
✔ |
vlan modify [protocol <PROTO>] id <VID> priority <PCP> |
action vlan modify id 100 priority 3 |
Modifies the frame to a specific VID, PCP, and optionally VLAN protocol of 802.1Q or 802.1ad. Default is 802.1Q. |
· |
✔ |
vlan push [protocol <PROTO>] id <VID> priority <PCP> |
action vlan push protocol 802.1ad id 100 priority 3 |
Add an outermost VLAN tag with specific VID, PCP, and optionally VLAN protocol of 802.1Q or 802.1ad. Default is 802.1Q. |
· |
✔ |
goto chain <CHAIN> |
action goto chain 10000001 |
Which chain to go to after this match. A required no-op action where the chain number must be higher than the ES0 chain number (10000000). |
✔ |
✔ |
4. ES0 Status
Use the tc filter show command to see the filter configuration for a specific port.
Add -s to also see the statistics:
$ tc -s filter show dev eth3 egress
filter protocol 802.1Q pref 100 flower chain 10000000
filter protocol 802.1Q pref 100 flower chain 10000000 handle 0xc8
vlan_id 3857
vlan_prio 1
vlan_ethtype all
eth_type 0003
skip_sw
in_hw in_hw_count 1
action order 1: vlan push id 3874 protocol 802.1ad priority 2 pipe
index 1 ref 1 bind 1 installed 0 sec used 0 sec
Action statistics:
Sent 0 bytes 1 pkt (dropped 0, overlimits 0 requeues 0)
Sent software 0 bytes 0 pkt
Sent hardware 0 bytes 1 pkt
backlog 0b 0p requeues 0
used_hw_stats immediate
action order 2: gact action goto chain 10000001
random type none pass val 0
index 1 ref 1 bind 1 installed 0 sec used 0 sec
Action statistics:
Sent 0 bytes 1 pkt (dropped 0, overlimits 0 requeues 0)
Sent software 0 bytes 0 pkt
Sent hardware 0 bytes 1 pkt
backlog 0b 0p requeues 0
used_hw_stats immediate
First comes information about the filter, then the match and finally the actions including statistics.
The number of frames that has his the filter is shown as Sent hardware 0 bytes 1 pkt.
Note that the hardware does not support counting the number of bytes and that the counter in ES0 is only 1 bit wide.
This means that the pkt counter shown here will only increment by one each time the tc -s filter show command is executed.
In the current kernel the same statistics are shown for all actions in a filter. This might change in the future.