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 <[email protected]> --- 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 [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
