From: Boris Sukholitko <hidden> Date: 2021-05-30 11:41:27
Currently vlan modification action checks existence of vlan priority by
comparing it to 0. Therefore it is impossible to modify existing vlan
tag to have priority 0.
For example, the following tc command will change the vlan id but will
not affect vlan priority:
tc filter add dev eth1 ingress matchall action vlan modify id 300 \
priority 0 pipe mirred egress redirect dev eth2
The incoming packet on eth1:
ethertype 802.1Q (0x8100), vlan 200, p 4, ethertype IPv4
will be changed to:
ethertype 802.1Q (0x8100), vlan 300, p 4, ethertype IPv4
although the user has intended to have p == 0.
The fix is to add tcfv_push_prio_exists flag to struct tcf_vlan_params
and rely on it when deciding to set the priority.
The same flag is used to avoid dumping unset vlan priority.
Change Log:
v2 -> v3:
- Push assumes that the priority is being set
- tcf_vlan_get_fill_size accounts for priority existence
v1 -> v2:
- Do not dump unset priority and fix tests accordingly
- Test for priority 0 modification
Boris Sukholitko (3):
net/sched: act_vlan: Fix modify to allow 0
net/sched: act_vlan: No dump for unset priority
net/sched: act_vlan: Test priority 0 modification
include/net/tc_act/tc_vlan.h | 1 +
net/sched/act_vlan.c | 26 ++++++++++++-----
.../tc-testing/tc-tests/actions/vlan.json | 28 +++++++++++++++++--
3 files changed, 46 insertions(+), 9 deletions(-)
--
2.29.3
From: Boris Sukholitko <hidden> Date: 2021-05-30 11:41:39
Currently vlan modification action checks existence of vlan priority by
comparing it to 0. Therefore it is impossible to modify existing vlan
tag to have priority 0.
For example, the following tc command will change the vlan id but will
not affect vlan priority:
tc filter add dev eth1 ingress matchall action vlan modify id 300 \
priority 0 pipe mirred egress redirect dev eth2
The incoming packet on eth1:
ethertype 802.1Q (0x8100), vlan 200, p 4, ethertype IPv4
will be changed to:
ethertype 802.1Q (0x8100), vlan 300, p 4, ethertype IPv4
although the user has intended to have p == 0.
The fix is to add tcfv_push_prio_exists flag to struct tcf_vlan_params
and rely on it when deciding to set the priority.
Fixes: 45a497f2d149a4a8061c (net/sched: act_vlan: Introduce TCA_VLAN_ACT_MODIFY vlan action)
Signed-off-by: Boris Sukholitko <redacted>
---
include/net/tc_act/tc_vlan.h | 1 +
net/sched/act_vlan.c | 7 +++++--
2 files changed, 6 insertions(+), 2 deletions(-)
From: Boris Sukholitko <hidden> Date: 2021-05-30 11:41:50
Dump vlan priority only if it has been previously set.
Fix the tests accordingly.
Signed-off-by: Boris Sukholitko <redacted>
---
net/sched/act_vlan.c | 19 ++++++++++++++-----
.../tc-testing/tc-tests/actions/vlan.json | 4 ++--
2 files changed, 16 insertions(+), 7 deletions(-)
From: Boris Sukholitko <hidden> Date: 2021-05-30 11:42:00
Because explicitly being set, the priority 0 should appear
in the output.
Signed-off-by: Boris Sukholitko <redacted>
---
.../tc-testing/tc-tests/actions/vlan.json | 24 +++++++++++++++++++
1 file changed, 24 insertions(+)
On Sun, May 30, 2021 at 02:40:49PM +0300, Boris Sukholitko wrote:
Currently vlan modification action checks existence of vlan priority by
comparing it to 0. Therefore it is impossible to modify existing vlan
tag to have priority 0.
hello Boris, thanks for following up!
Change Log:
v2 -> v3:
- Push assumes that the priority is being set
- tcf_vlan_get_fill_size accounts for priority existence
From: Jamal Hadi Salim <jhs@mojatatu.com> Date: 2021-05-31 12:13:13
On 2021-05-31 7:57 a.m., Davide Caratti wrote:
On Sun, May 30, 2021 at 02:40:49PM +0300, Boris Sukholitko wrote:
quoted
Currently vlan modification action checks existence of vlan priority by
comparing it to 0. Therefore it is impossible to modify existing vlan
tag to have priority 0.
hello Boris, thanks for following up!
quoted
Change Log:
v2 -> v3:
- Push assumes that the priority is being set
- tcf_vlan_get_fill_size accounts for priority existence
Reviewed-by: Davide Caratti <redacted>
Looks good to me as well. And thanks for adding the tests!
Acked-by: Jamal Hadi Salim <jhs@mojatatu.com>
cheers,
jamal
This jumps out a little bit - if we need to take this lock to inspect
tcf_vlan_params, then I infer its value may change. And if it may
change what guarantees it doesn't change between calculating the skb
length and dumping?
It's common practice to calculate the max skb len required when
attributes are this small.
This jumps out a little bit - if we need to take this lock to inspect
tcf_vlan_params, then I infer its value may change. And if it may
change what guarantees it doesn't change between calculating the skb
length and dumping?
It's common practice to calculate the max skb len required when
attributes are this small.
I believe you are right.
I've just sent out v4 of the patch with tcf_vlan_get_fill_size change
reverted.
Thanks,
Boris.
This jumps out a little bit - if we need to take this lock to inspect
tcf_vlan_params, then I infer its value may change. And if it may
change what guarantees it doesn't change between calculating the skb
length and dumping?
It's common practice to calculate the max skb len required when
attributes are this small.
I believe you are right.
ouch, that's my fault actually - it's true, TC rules can be
modified and dumped at the same time. Then the only thing we can
do is to account for TCA_VLAN_PUSH_VLAN_PRIORITY even if we will not
fill it.
thanks for spotting this,
--
davide