forked from mirrors/linux
		
	OVS: remove use of VLAN_TAG_PRESENT
This is a minimal change to allow removing of VLAN_TAG_PRESENT. It leaves OVS unable to use CFI bit, as fixing this would need a deeper surgery involving userspace interface. Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									f723a1a293
								
							
						
					
					
						commit
						9df46aefaf
					
				
					 4 changed files with 23 additions and 18 deletions
				
			
		|  | @ -301,7 +301,7 @@ static int push_vlan(struct sk_buff *skb, struct sw_flow_key *key, | ||||||
| 		key->eth.vlan.tpid = vlan->vlan_tpid; | 		key->eth.vlan.tpid = vlan->vlan_tpid; | ||||||
| 	} | 	} | ||||||
| 	return skb_vlan_push(skb, vlan->vlan_tpid, | 	return skb_vlan_push(skb, vlan->vlan_tpid, | ||||||
| 			     ntohs(vlan->vlan_tci) & ~VLAN_TAG_PRESENT); | 			     ntohs(vlan->vlan_tci) & ~VLAN_CFI_MASK); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* 'src' is already properly masked. */ | /* 'src' is already properly masked. */ | ||||||
|  | @ -822,8 +822,10 @@ static int ovs_vport_output(struct net *net, struct sock *sk, struct sk_buff *sk | ||||||
| 	__skb_dst_copy(skb, data->dst); | 	__skb_dst_copy(skb, data->dst); | ||||||
| 	*OVS_CB(skb) = data->cb; | 	*OVS_CB(skb) = data->cb; | ||||||
| 	skb->inner_protocol = data->inner_protocol; | 	skb->inner_protocol = data->inner_protocol; | ||||||
| 	skb->vlan_tci = data->vlan_tci; | 	if (data->vlan_tci & VLAN_CFI_MASK) | ||||||
| 	skb->vlan_proto = data->vlan_proto; | 		__vlan_hwaccel_put_tag(skb, data->vlan_proto, data->vlan_tci & ~VLAN_CFI_MASK); | ||||||
|  | 	else | ||||||
|  | 		__vlan_hwaccel_clear_tag(skb); | ||||||
| 
 | 
 | ||||||
| 	/* Reconstruct the MAC header.  */ | 	/* Reconstruct the MAC header.  */ | ||||||
| 	skb_push(skb, data->l2_len); | 	skb_push(skb, data->l2_len); | ||||||
|  | @ -867,7 +869,10 @@ static void prepare_frag(struct vport *vport, struct sk_buff *skb, | ||||||
| 	data->cb = *OVS_CB(skb); | 	data->cb = *OVS_CB(skb); | ||||||
| 	data->inner_protocol = skb->inner_protocol; | 	data->inner_protocol = skb->inner_protocol; | ||||||
| 	data->network_offset = orig_network_offset; | 	data->network_offset = orig_network_offset; | ||||||
| 	data->vlan_tci = skb->vlan_tci; | 	if (skb_vlan_tag_present(skb)) | ||||||
|  | 		data->vlan_tci = skb_vlan_tag_get(skb) | VLAN_CFI_MASK; | ||||||
|  | 	else | ||||||
|  | 		data->vlan_tci = 0; | ||||||
| 	data->vlan_proto = skb->vlan_proto; | 	data->vlan_proto = skb->vlan_proto; | ||||||
| 	data->mac_proto = mac_proto; | 	data->mac_proto = mac_proto; | ||||||
| 	data->l2_len = hlen; | 	data->l2_len = hlen; | ||||||
|  |  | ||||||
|  | @ -325,7 +325,7 @@ static int parse_vlan_tag(struct sk_buff *skb, struct vlan_head *key_vh, | ||||||
| 		return -ENOMEM; | 		return -ENOMEM; | ||||||
| 
 | 
 | ||||||
| 	vh = (struct vlan_head *)skb->data; | 	vh = (struct vlan_head *)skb->data; | ||||||
| 	key_vh->tci = vh->tci | htons(VLAN_TAG_PRESENT); | 	key_vh->tci = vh->tci | htons(VLAN_CFI_MASK); | ||||||
| 	key_vh->tpid = vh->tpid; | 	key_vh->tpid = vh->tpid; | ||||||
| 
 | 
 | ||||||
| 	if (unlikely(untag_vlan)) { | 	if (unlikely(untag_vlan)) { | ||||||
|  | @ -358,7 +358,7 @@ static int parse_vlan(struct sk_buff *skb, struct sw_flow_key *key) | ||||||
| 	int res; | 	int res; | ||||||
| 
 | 
 | ||||||
| 	if (skb_vlan_tag_present(skb)) { | 	if (skb_vlan_tag_present(skb)) { | ||||||
| 		key->eth.vlan.tci = htons(skb->vlan_tci); | 		key->eth.vlan.tci = htons(skb->vlan_tci) | htons(VLAN_CFI_MASK); | ||||||
| 		key->eth.vlan.tpid = skb->vlan_proto; | 		key->eth.vlan.tpid = skb->vlan_proto; | ||||||
| 	} else { | 	} else { | ||||||
| 		/* Parse outer vlan tag in the non-accelerated case. */ | 		/* Parse outer vlan tag in the non-accelerated case. */ | ||||||
|  |  | ||||||
|  | @ -60,7 +60,7 @@ struct ovs_tunnel_info { | ||||||
| 
 | 
 | ||||||
| struct vlan_head { | struct vlan_head { | ||||||
| 	__be16 tpid; /* Vlan type. Generally 802.1q or 802.1ad.*/ | 	__be16 tpid; /* Vlan type. Generally 802.1q or 802.1ad.*/ | ||||||
| 	__be16 tci;  /* 0 if no VLAN, VLAN_TAG_PRESENT set otherwise. */ | 	__be16 tci;  /* 0 if no VLAN, VLAN_CFI_MASK set otherwise. */ | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| #define OVS_SW_FLOW_KEY_METADATA_SIZE			\ | #define OVS_SW_FLOW_KEY_METADATA_SIZE			\ | ||||||
|  |  | ||||||
|  | @ -990,9 +990,9 @@ static int validate_vlan_from_nlattrs(const struct sw_flow_match *match, | ||||||
| 	if (a[OVS_KEY_ATTR_VLAN]) | 	if (a[OVS_KEY_ATTR_VLAN]) | ||||||
| 		tci = nla_get_be16(a[OVS_KEY_ATTR_VLAN]); | 		tci = nla_get_be16(a[OVS_KEY_ATTR_VLAN]); | ||||||
| 
 | 
 | ||||||
| 	if (!(tci & htons(VLAN_TAG_PRESENT))) { | 	if (!(tci & htons(VLAN_CFI_MASK))) { | ||||||
| 		if (tci) { | 		if (tci) { | ||||||
| 			OVS_NLERR(log, "%s TCI does not have VLAN_TAG_PRESENT bit set.", | 			OVS_NLERR(log, "%s TCI does not have VLAN_CFI_MASK bit set.", | ||||||
| 				  (inner) ? "C-VLAN" : "VLAN"); | 				  (inner) ? "C-VLAN" : "VLAN"); | ||||||
| 			return -EINVAL; | 			return -EINVAL; | ||||||
| 		} else if (nla_len(a[OVS_KEY_ATTR_ENCAP])) { | 		} else if (nla_len(a[OVS_KEY_ATTR_ENCAP])) { | ||||||
|  | @ -1013,9 +1013,9 @@ static int validate_vlan_mask_from_nlattrs(const struct sw_flow_match *match, | ||||||
| 	__be16 tci = 0; | 	__be16 tci = 0; | ||||||
| 	__be16 tpid = 0; | 	__be16 tpid = 0; | ||||||
| 	bool encap_valid = !!(match->key->eth.vlan.tci & | 	bool encap_valid = !!(match->key->eth.vlan.tci & | ||||||
| 			      htons(VLAN_TAG_PRESENT)); | 			      htons(VLAN_CFI_MASK)); | ||||||
| 	bool i_encap_valid = !!(match->key->eth.cvlan.tci & | 	bool i_encap_valid = !!(match->key->eth.cvlan.tci & | ||||||
| 				htons(VLAN_TAG_PRESENT)); | 				htons(VLAN_CFI_MASK)); | ||||||
| 
 | 
 | ||||||
| 	if (!(key_attrs & (1 << OVS_KEY_ATTR_ENCAP))) { | 	if (!(key_attrs & (1 << OVS_KEY_ATTR_ENCAP))) { | ||||||
| 		/* Not a VLAN. */ | 		/* Not a VLAN. */ | ||||||
|  | @ -1039,8 +1039,8 @@ static int validate_vlan_mask_from_nlattrs(const struct sw_flow_match *match, | ||||||
| 			  (inner) ? "C-VLAN" : "VLAN", ntohs(tpid)); | 			  (inner) ? "C-VLAN" : "VLAN", ntohs(tpid)); | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 	} | 	} | ||||||
| 	if (!(tci & htons(VLAN_TAG_PRESENT))) { | 	if (!(tci & htons(VLAN_CFI_MASK))) { | ||||||
| 		OVS_NLERR(log, "%s TCI mask does not have exact match for VLAN_TAG_PRESENT bit.", | 		OVS_NLERR(log, "%s TCI mask does not have exact match for VLAN_CFI_MASK bit.", | ||||||
| 			  (inner) ? "C-VLAN" : "VLAN"); | 			  (inner) ? "C-VLAN" : "VLAN"); | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 	} | 	} | ||||||
|  | @ -1095,7 +1095,7 @@ static int parse_vlan_from_nlattrs(struct sw_flow_match *match, | ||||||
| 	if (err) | 	if (err) | ||||||
| 		return err; | 		return err; | ||||||
| 
 | 
 | ||||||
| 	encap_valid = !!(match->key->eth.vlan.tci & htons(VLAN_TAG_PRESENT)); | 	encap_valid = !!(match->key->eth.vlan.tci & htons(VLAN_CFI_MASK)); | ||||||
| 	if (encap_valid) { | 	if (encap_valid) { | ||||||
| 		err = __parse_vlan_from_nlattrs(match, key_attrs, true, a, | 		err = __parse_vlan_from_nlattrs(match, key_attrs, true, a, | ||||||
| 						is_mask, log); | 						is_mask, log); | ||||||
|  | @ -2943,7 +2943,7 @@ static int __ovs_nla_copy_actions(struct net *net, const struct nlattr *attr, | ||||||
| 			vlan = nla_data(a); | 			vlan = nla_data(a); | ||||||
| 			if (!eth_type_vlan(vlan->vlan_tpid)) | 			if (!eth_type_vlan(vlan->vlan_tpid)) | ||||||
| 				return -EINVAL; | 				return -EINVAL; | ||||||
| 			if (!(vlan->vlan_tci & htons(VLAN_TAG_PRESENT))) | 			if (!(vlan->vlan_tci & htons(VLAN_CFI_MASK))) | ||||||
| 				return -EINVAL; | 				return -EINVAL; | ||||||
| 			vlan_tci = vlan->vlan_tci; | 			vlan_tci = vlan->vlan_tci; | ||||||
| 			break; | 			break; | ||||||
|  | @ -2959,7 +2959,7 @@ static int __ovs_nla_copy_actions(struct net *net, const struct nlattr *attr, | ||||||
| 			/* Prohibit push MPLS other than to a white list
 | 			/* Prohibit push MPLS other than to a white list
 | ||||||
| 			 * for packets that have a known tag order. | 			 * for packets that have a known tag order. | ||||||
| 			 */ | 			 */ | ||||||
| 			if (vlan_tci & htons(VLAN_TAG_PRESENT) || | 			if (vlan_tci & htons(VLAN_CFI_MASK) || | ||||||
| 			    (eth_type != htons(ETH_P_IP) && | 			    (eth_type != htons(ETH_P_IP) && | ||||||
| 			     eth_type != htons(ETH_P_IPV6) && | 			     eth_type != htons(ETH_P_IPV6) && | ||||||
| 			     eth_type != htons(ETH_P_ARP) && | 			     eth_type != htons(ETH_P_ARP) && | ||||||
|  | @ -2971,7 +2971,7 @@ static int __ovs_nla_copy_actions(struct net *net, const struct nlattr *attr, | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		case OVS_ACTION_ATTR_POP_MPLS: | 		case OVS_ACTION_ATTR_POP_MPLS: | ||||||
| 			if (vlan_tci & htons(VLAN_TAG_PRESENT) || | 			if (vlan_tci & htons(VLAN_CFI_MASK) || | ||||||
| 			    !eth_p_mpls(eth_type)) | 			    !eth_p_mpls(eth_type)) | ||||||
| 				return -EINVAL; | 				return -EINVAL; | ||||||
| 
 | 
 | ||||||
|  | @ -3036,7 +3036,7 @@ static int __ovs_nla_copy_actions(struct net *net, const struct nlattr *attr, | ||||||
| 		case OVS_ACTION_ATTR_POP_ETH: | 		case OVS_ACTION_ATTR_POP_ETH: | ||||||
| 			if (mac_proto != MAC_PROTO_ETHERNET) | 			if (mac_proto != MAC_PROTO_ETHERNET) | ||||||
| 				return -EINVAL; | 				return -EINVAL; | ||||||
| 			if (vlan_tci & htons(VLAN_TAG_PRESENT)) | 			if (vlan_tci & htons(VLAN_CFI_MASK)) | ||||||
| 				return -EINVAL; | 				return -EINVAL; | ||||||
| 			mac_proto = MAC_PROTO_NONE; | 			mac_proto = MAC_PROTO_NONE; | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Michał Mirosław
						Michał Mirosław