[ovs-dev,branch-2.10] lib/tc: treat vlan id and prio as independent fields

Message ID 1536825468-20974-1-git-send-email-pieter.jansenvanvuuren@netronome.com
State Accepted
Headers show
Series
  • [ovs-dev,branch-2.10] lib/tc: treat vlan id and prio as independent fields
Related show

Commit Message

Pieter Jansen van Vuuren Sept. 13, 2018, 7:57 a.m.
Previously the key was used to check the presence of vlan id and
prio fields instead of using the mask. Additionally the vlan id
field was considered to be present if only the prio field was set,
and vice versa. f.e. setting the following:

ovs-ofctl -OOpenFlow13,OpenFlow15 add-flow br0 \
priority=10,cookie=1,table=0,ip,dl_vlan_pcp=2,actions=output:2

Resulted in (instead of wildcarding vlan_id, filter matches 0):
filter protocol 802.1Q pref 1 flower chain 0
filter protocol 802.1Q pref 1 flower chain 0 handle 0x1
 vlan_id 0
 vlan_prio 2
 vlan_ethtype ip
 eth_type ipv4
 ip_flags nofrag
 in_hw
       action order 1: mirred (Egress Redirect to device eth1) stolen
       index 2 ref 1 bind 1 installed 5 sec used 5 sec
       Action statistics:
       Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
       backlog 0b 0p requeues 0
       cookie 47040ae7a94fff6afd7ed8aa04b11ba4

Signed-off-by: Pieter Jansen van Vuuren <pieter.jansenvanvuuren@netronome.com>
Reviewed-by: Simon Horman <horms+renesas@verge.net.au>
---
 lib/netdev-tc-offloads.c | 2 ++
 lib/tc.c                 | 6 +++++-
 2 files changed, 7 insertions(+), 1 deletion(-)

Comments

0-day Robot Sept. 13, 2018, 8:56 a.m. | #1
Bleep bloop.  Greetings Pieter Jansen van Vuuren, I am a robot and I have tried out your patch.
Thanks for your contribution.

I encountered some error that I wasn't expecting.  See the details below.


checkpatch:
ERROR: Too many signoffs; are you missing Co-authored-by lines?
Lines checked: 88, Warnings: 0, Errors: 1


Please check this out.  If you feel there has been an error, please email aconole@bytheb.org

Thanks,
0-day Robot
Simon Horman Sept. 13, 2018, 3 p.m. | #2
On Thu, Sep 13, 2018 at 08:57:48AM +0100, Pieter Jansen van Vuuren wrote:
> Previously the key was used to check the presence of vlan id and
> prio fields instead of using the mask. Additionally the vlan id
> field was considered to be present if only the prio field was set,
> and vice versa. f.e. setting the following:
> 
> ovs-ofctl -OOpenFlow13,OpenFlow15 add-flow br0 \
> priority=10,cookie=1,table=0,ip,dl_vlan_pcp=2,actions=output:2
> 
> Resulted in (instead of wildcarding vlan_id, filter matches 0):
> filter protocol 802.1Q pref 1 flower chain 0
> filter protocol 802.1Q pref 1 flower chain 0 handle 0x1
>  vlan_id 0
>  vlan_prio 2
>  vlan_ethtype ip
>  eth_type ipv4
>  ip_flags nofrag
>  in_hw
>        action order 1: mirred (Egress Redirect to device eth1) stolen
>        index 2 ref 1 bind 1 installed 5 sec used 5 sec
>        Action statistics:
>        Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
>        backlog 0b 0p requeues 0
>        cookie 47040ae7a94fff6afd7ed8aa04b11ba4
> 
> Signed-off-by: Pieter Jansen van Vuuren <pieter.jansenvanvuuren@netronome.com>

Thanks Pieter,

I have applied this backport to branch-2.10, branch-2.9 and branch-2.8.

Patch

diff --git a/lib/netdev-tc-offloads.c b/lib/netdev-tc-offloads.c
index 64f431c8d..f998ddfe1 100644
--- a/lib/netdev-tc-offloads.c
+++ b/lib/netdev-tc-offloads.c
@@ -960,10 +960,12 @@  netdev_tc_flow_put(struct netdev *netdev, struct match *match,
             && (vid_mask || pcp_mask)) {
             if (vid_mask) {
                 flower.key.vlan_id = vlan_tci_to_vid(key->vlans[0].tci);
+                flower.mask.vlan_id = vlan_tci_to_vid(mask->vlans[0].tci);
                 VLOG_DBG_RL(&rl, "vlan_id: %d\n", flower.key.vlan_id);
             }
             if (pcp_mask) {
                 flower.key.vlan_prio = vlan_tci_to_pcp(key->vlans[0].tci);
+                flower.mask.vlan_prio = vlan_tci_to_pcp(mask->vlans[0].tci);
                 VLOG_DBG_RL(&rl, "vlan_prio: %d\n", flower.key.vlan_prio);
             }
             flower.key.encap_eth_type = flower.key.eth_type;
diff --git a/lib/tc.c b/lib/tc.c
index d5123bd69..b385ff365 100644
--- a/lib/tc.c
+++ b/lib/tc.c
@@ -346,10 +346,12 @@  nl_parse_flower_vlan(struct nlattr **attrs, struct tc_flower *flower)
     if (attrs[TCA_FLOWER_KEY_VLAN_ID]) {
         flower->key.vlan_id =
             nl_attr_get_u16(attrs[TCA_FLOWER_KEY_VLAN_ID]);
+        flower->mask.vlan_id = 0xffff;
     }
     if (attrs[TCA_FLOWER_KEY_VLAN_PRIO]) {
         flower->key.vlan_prio =
             nl_attr_get_u8(attrs[TCA_FLOWER_KEY_VLAN_PRIO]);
+        flower->mask.vlan_prio = 0xff;
     }
 }
 
@@ -1637,9 +1639,11 @@  nl_msg_put_flower_options(struct ofpbuf *request, struct tc_flower *flower)
     nl_msg_put_be16(request, TCA_FLOWER_KEY_ETH_TYPE, flower->key.eth_type);
 
     if (is_vlan) {
-        if (flower->key.vlan_id || flower->key.vlan_prio) {
+        if (flower->key.vlan_id) {
             nl_msg_put_u16(request, TCA_FLOWER_KEY_VLAN_ID,
                            flower->key.vlan_id);
+        }
+        if (flower->key.vlan_prio) {
             nl_msg_put_u8(request, TCA_FLOWER_KEY_VLAN_PRIO,
                           flower->key.vlan_prio);
         }