Redefine clear_vlan to initialize one struct vlan_head
Define   clear_vlans to initialize key.eth.vlan and key.eth.cvlan
Calls the revised functions accurately

Reasoning:

For vlan packet, current code calls clear_vlan unnecessarily,
since parse_vlan sets key->eth.vlan and key->eth.cvlan correctly.
Only special case where return value <=0 needs inialization
certail key.eth.vlan or key.eth.cvlan specifically.

For none-vlan case, parse_vlan returns on the first parse_vlan_tag
which returns 0, in this case, calls clear_vlan

For MAC_PROTO_NONE, logic is intact after this revision

Signed-off-by: Eddy Tao <taoyuan_e...@hotmail.com>
---
 net/openvswitch/flow.c | 24 ++++++++++++++++--------
 1 file changed, 16 insertions(+), 8 deletions(-)

diff --git a/net/openvswitch/flow.c b/net/openvswitch/flow.c
index e20d1a973417..30a90597cab6 100644
--- a/net/openvswitch/flow.c
+++ b/net/openvswitch/flow.c
@@ -480,12 +480,16 @@ static int parse_vlan_tag(struct sk_buff *skb, struct 
vlan_head *key_vh,
        return 1;
 }
 
-static void clear_vlan(struct sw_flow_key *key)
+static inline void clear_vlan(struct vlan_head *vlan)
 {
-       key->eth.vlan.tci = 0;
-       key->eth.vlan.tpid = 0;
-       key->eth.cvlan.tci = 0;
-       key->eth.cvlan.tpid = 0;
+       vlan->tci = 0;
+       vlan->tpid = 0;
+}
+
+static inline void clear_vlans(struct sw_flow_key *key)
+{
+       clear_vlan(&key->eth.vlan);
+       clear_vlan(&key->eth.cvlan);
 }
 
 static int parse_vlan(struct sk_buff *skb, struct sw_flow_key *key)
@@ -498,14 +502,18 @@ static int parse_vlan(struct sk_buff *skb, struct 
sw_flow_key *key)
        } else {
                /* Parse outer vlan tag in the non-accelerated case. */
                res = parse_vlan_tag(skb, &key->eth.vlan, true);
-               if (res <= 0)
+               if (res <= 0) {
+                       clear_vlans(key);
                        return res;
+               }
        }
 
        /* Parse inner vlan tag. */
        res = parse_vlan_tag(skb, &key->eth.cvlan, false);
-       if (res <= 0)
+       if (res <= 0) {
+               clear_vlan(&key->eth.cvlan);
                return res;
+       }
 
        return 0;
 }
@@ -918,8 +926,8 @@ static int key_extract(struct sk_buff *skb, struct 
sw_flow_key *key)
        skb_reset_mac_header(skb);
 
        /* Link layer. */
-       clear_vlan(key);
        if (ovs_key_mac_proto(key) == MAC_PROTO_NONE) {
+               clear_vlans(key);
                if (unlikely(eth_type_vlan(skb->protocol)))
                        return -EINVAL;
 
-- 
2.27.0

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to