diff options
Diffstat (limited to 'net/openvswitch/datapath.c')
| -rw-r--r-- | net/openvswitch/datapath.c | 25 | 
1 files changed, 16 insertions, 9 deletions
diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index 524c0fd3078e..4d67ea856067 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c @@ -928,7 +928,6 @@ static int ovs_flow_cmd_new(struct sk_buff *skb, struct genl_info *info)  	struct sw_flow_mask mask;  	struct sk_buff *reply;  	struct datapath *dp; -	struct sw_flow_key key;  	struct sw_flow_actions *acts;  	struct sw_flow_match match;  	u32 ufid_flags = ovs_nla_get_ufid_flags(a[OVS_FLOW_ATTR_UFID_FLAGS]); @@ -956,20 +955,24 @@ static int ovs_flow_cmd_new(struct sk_buff *skb, struct genl_info *info)  	}  	/* Extract key. */ -	ovs_match_init(&match, &key, &mask); +	ovs_match_init(&match, &new_flow->key, false, &mask);  	error = ovs_nla_get_match(net, &match, a[OVS_FLOW_ATTR_KEY],  				  a[OVS_FLOW_ATTR_MASK], log);  	if (error)  		goto err_kfree_flow; -	ovs_flow_mask_key(&new_flow->key, &key, true, &mask); -  	/* Extract flow identifier. */  	error = ovs_nla_get_identifier(&new_flow->id, a[OVS_FLOW_ATTR_UFID], -				       &key, log); +				       &new_flow->key, log);  	if (error)  		goto err_kfree_flow; +	/* unmasked key is needed to match when ufid is not used. */ +	if (ovs_identifier_is_key(&new_flow->id)) +		match.key = new_flow->id.unmasked_key; + +	ovs_flow_mask_key(&new_flow->key, &new_flow->key, true, &mask); +  	/* Validate actions. */  	error = ovs_nla_copy_actions(net, a[OVS_FLOW_ATTR_ACTIONS],  				     &new_flow->key, &acts, log); @@ -996,7 +999,7 @@ static int ovs_flow_cmd_new(struct sk_buff *skb, struct genl_info *info)  	if (ovs_identifier_is_ufid(&new_flow->id))  		flow = ovs_flow_tbl_lookup_ufid(&dp->table, &new_flow->id);  	if (!flow) -		flow = ovs_flow_tbl_lookup(&dp->table, &key); +		flow = ovs_flow_tbl_lookup(&dp->table, &new_flow->key);  	if (likely(!flow)) {  		rcu_assign_pointer(new_flow->sf_acts, acts); @@ -1121,7 +1124,7 @@ static int ovs_flow_cmd_set(struct sk_buff *skb, struct genl_info *info)  	ufid_present = ovs_nla_get_ufid(&sfid, a[OVS_FLOW_ATTR_UFID], log);  	if (a[OVS_FLOW_ATTR_KEY]) { -		ovs_match_init(&match, &key, &mask); +		ovs_match_init(&match, &key, true, &mask);  		error = ovs_nla_get_match(net, &match, a[OVS_FLOW_ATTR_KEY],  					  a[OVS_FLOW_ATTR_MASK], log);  	} else if (!ufid_present) { @@ -1238,7 +1241,7 @@ static int ovs_flow_cmd_get(struct sk_buff *skb, struct genl_info *info)  	ufid_present = ovs_nla_get_ufid(&ufid, a[OVS_FLOW_ATTR_UFID], log);  	if (a[OVS_FLOW_ATTR_KEY]) { -		ovs_match_init(&match, &key, NULL); +		ovs_match_init(&match, &key, true, NULL);  		err = ovs_nla_get_match(net, &match, a[OVS_FLOW_ATTR_KEY], NULL,  					log);  	} else if (!ufid_present) { @@ -1297,7 +1300,7 @@ static int ovs_flow_cmd_del(struct sk_buff *skb, struct genl_info *info)  	ufid_present = ovs_nla_get_ufid(&ufid, a[OVS_FLOW_ATTR_UFID], log);  	if (a[OVS_FLOW_ATTR_KEY]) { -		ovs_match_init(&match, &key, NULL); +		ovs_match_init(&match, &key, true, NULL);  		err = ovs_nla_get_match(net, &match, a[OVS_FLOW_ATTR_KEY],  					NULL, log);  		if (unlikely(err)) @@ -2437,3 +2440,7 @@ module_exit(dp_cleanup);  MODULE_DESCRIPTION("Open vSwitch switching datapath");  MODULE_LICENSE("GPL"); +MODULE_ALIAS_GENL_FAMILY(OVS_DATAPATH_FAMILY); +MODULE_ALIAS_GENL_FAMILY(OVS_VPORT_FAMILY); +MODULE_ALIAS_GENL_FAMILY(OVS_FLOW_FAMILY); +MODULE_ALIAS_GENL_FAMILY(OVS_PACKET_FAMILY);  |