Remove VLAN_TAG_PRESENT from drivers
Subsystems (5)
cover Remove VLAN_TAG_PRESENT from drivers
This series removes VLAN_TAG_PRESENT use from network drivers in preparation to removing its special meaning.
Michał Mirosław (4):
i40iw: remove use of VLAN_TAG_PRESENT
cnic: remove use of VLAN_TAG_PRESENT
gianfar: remove use of VLAN_TAG_PRESENT
OVS: remove use of VLAN_TAG_PRESENT
drivers/infiniband/hw/i40iw/i40iw_cm.c | 8 +++---- drivers/net/ethernet/broadcom/cnic.c | 2 +- .../net/ethernet/freescale/gianfar_ethtool.c | 8 +++---- net/openvswitch/actions.c | 13 +++++++---- net/openvswitch/flow.c | 4 ++-- net/openvswitch/flow.h | 2 +- net/openvswitch/flow_netlink.c | 22 +++++++++---------- 7 files changed, 31 insertions(+), 28 deletions(-)
Signature · 1 line
2.19.1
PATCH 1/1 i40iw: remove use of VLAN_TAG_PRESENT
--- drivers/infiniband/hw/i40iw/i40iw_cm.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/infiniband/hw/i40iw/i40iw_cm.c +4 -4
@@ -404,7 +404,7 @@ static struct i40iw_puda_buf *i40iw_form_cm_frame(struct i40iw_cm_node *cm_node,if (pdata) pd_len = pdata->size; -if (cm_node->vlan_id <VLAN_TAG_PRESENT ) +if (cm_node->vlan_id <=VLAN_VID_MASK ) eth_hlen +=4 ;if (cm_node->ipv4)
@@ -433,7 +433,7 @@ static struct i40iw_puda_buf *i40iw_form_cm_frame(struct i40iw_cm_node *cm_node,ether_addr_copy (ethh->h_dest, cm_node->rem_mac);ether_addr_copy (ethh->h_source, cm_node->loc_mac); -if (cm_node->vlan_id <VLAN_TAG_PRESENT ) { +if (cm_node->vlan_id <=VLAN_VID_MASK ) { ((struct vlan_ethhdr *)ethh)->h_vlan_proto =htons (ETH_P_8021Q ); vtag = (cm_node->user_pri <<VLAN_PRIO_SHIFT ) | cm_node->vlan_id; ((struct vlan_ethhdr *)ethh)->h_vlan_TCI =htons (vtag);
@@ -463,7 +463,7 @@ static struct i40iw_puda_buf *i40iw_form_cm_frame(struct i40iw_cm_node *cm_node,ether_addr_copy (ethh->h_dest, cm_node->rem_mac);ether_addr_copy (ethh->h_source, cm_node->loc_mac); -if (cm_node->vlan_id <VLAN_TAG_PRESENT ) { +if (cm_node->vlan_id <=VLAN_VID_MASK ) { ((struct vlan_ethhdr *)ethh)->h_vlan_proto =htons (ETH_P_8021Q ); vtag = (cm_node->user_pri <<VLAN_PRIO_SHIFT ) | cm_node->vlan_id; ((struct vlan_ethhdr *)ethh)->h_vlan_TCI =htons (vtag);
@@ -3323,7 +3323,7 @@ static void i40iw_init_tcp_ctx(struct i40iw_cm_node *cm_node, tcp_info->flow_label =0 ; tcp_info->snd_mss =cpu_to_le32 (((u32 )cm_node->tcp_cntxt.mss)); -if (cm_node->vlan_id <VLAN_TAG_PRESENT ) { +if (cm_node->vlan_id <=VLAN_VID_MASK ) { tcp_info->insert_vlan_tag = true; tcp_info->vlan_tag =cpu_to_le16 (((u16 )cm_node->user_pri <<I40IW_VLAN_PRIO_SHIFT ) | cm_node->vlan_id);
Signature · 1 line
2.19.1
PATCH 2/4 cnic: remove use of VLAN_TAG_PRESENT
In reply to Michał MirosławThis just removes VLAN_TAG_PRESENT use. VLAN TCI=0 special meaning is deeply embedded in the driver code and so is left as is.
--- drivers/net/ethernet/broadcom/cnic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/broadcom/cnic.c +1 -1
@@ -5731,7 +5731,7 @@ static int cnic_netdev_event(struct notifier_block *this, unsigned long event,if (realdev) { dev =cnic_from_netdev (realdev);if (dev) { - vid |=VLAN_TAG_PRESENT ; + vid |=VLAN_CFI_MASK ;/* make non-zero */ cnic_rcv_netevent (dev->cnic_priv, event, vid);cnic_put (dev); }
Signature · 1 line
2.19.1
PATCH 3/4 gianfar: remove use of VLAN_TAG_PRESENT
In reply to Michał Mirosław--- drivers/net/ethernet/freescale/gianfar_ethtool.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
drivers/net/ethernet/freescale/gianfar_ethtool.c +3 -5
@@ -1134,11 +1134,9 @@ static int gfar_convert_to_filer(struct ethtool_rx_flow_spec *rule, prio =vlan_tci_prio (rule); prio_mask =vlan_tci_priom (rule); -if (cfi ==VLAN_TAG_PRESENT && cfi_mask ==VLAN_TAG_PRESENT ) { - vlan |=RQFPR_CFI ; - vlan_mask |=RQFPR_CFI ; - }else if (cfi !=VLAN_TAG_PRESENT && - cfi_mask ==VLAN_TAG_PRESENT ) { +if (cfi_mask) { +if (cfi) + vlan |=RQFPR_CFI ; vlan_mask |=RQFPR_CFI ; } }
Signature · 1 line
2.19.1
PATCH 4/4 OVS: remove use of VLAN_TAG_PRESENT
In reply to Michał MirosławThis 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.
--- net/openvswitch/actions.c | 13 +++++++++---- net/openvswitch/flow.c | 4 ++-- net/openvswitch/flow.h | 2 +- net/openvswitch/flow_netlink.c | 22 +++++++++++----------- 4 files changed, 23 insertions(+), 18 deletions(-)
net/openvswitch/actions.c +9 -4
@@ -301,7 +301,7 @@ static int push_vlan(struct sk_buff *skb, struct sw_flow_key *key, key->eth.vlan.tpid = 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. */
@@ -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); *OVS_CB (skb) = data->cb; skb->inner_protocol = data->inner_protocol; - skb->vlan_tci = data->vlan_tci; - skb->vlan_proto = data->vlan_proto; +if (data->vlan_tci &VLAN_CFI_MASK ) +__vlan_hwaccel_put_tag (skb, data->vlan_proto, data->vlan_tci & ~VLAN_CFI_MASK ); +else +__vlan_hwaccel_clear_tag (skb);/* Reconstruct the MAC header. */ 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->inner_protocol = skb->inner_protocol; 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->mac_proto = mac_proto; data->l2_len = hlen;
net/openvswitch/flow.c +2 -2
@@ -325,7 +325,7 @@ static int parse_vlan_tag(struct sk_buff *skb, struct vlan_head *key_vh,return -ENOMEM ; 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;if (unlikely (untag_vlan)) {
@@ -358,7 +358,7 @@ static int parse_vlan(struct sk_buff *skb, struct sw_flow_key *key)int res;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; }else {/* Parse outer vlan tag in the non-accelerated case. */
net/openvswitch/flow.h +1 -1
@@ -60,7 +60,7 @@ struct ovs_tunnel_info {struct vlan_head {__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 \
net/openvswitch/flow_netlink.c +11 -11
@@ -990,9 +990,9 @@ static int validate_vlan_from_nlattrs(const struct sw_flow_match *match,if (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) { -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" );return -EINVAL ; }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 tpid =0 ;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 & -htons (VLAN_TAG_PRESENT )); +htons (VLAN_CFI_MASK ));if (!(key_attrs & (1 <<OVS_KEY_ATTR_ENCAP ))) {/* 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));return -EINVAL ; } -if (!(tci &htons (VLAN_TAG_PRESENT ))) { -OVS_NLERR (log,"%s TCI mask does not have exact match for VLAN_TAG_PRESENT bit." , +if (!(tci &htons (VLAN_CFI_MASK ))) { +OVS_NLERR (log,"%s TCI mask does not have exact match for VLAN_CFI_MASK bit." , (inner) ?"C-VLAN" :"VLAN" );return -EINVAL ; }
@@ -1095,7 +1095,7 @@ static int parse_vlan_from_nlattrs(struct sw_flow_match *match,if (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) { err =__parse_vlan_from_nlattrs (match, key_attrs, true, a, is_mask, log);
@@ -2943,7 +2943,7 @@ static int __ovs_nla_copy_actions(struct net *net, const struct nlattr *attr, vlan =nla_data (a);if (!eth_type_vlan (vlan->vlan_tpid))return -EINVAL ; -if (!(vlan->vlan_tci &htons (VLAN_TAG_PRESENT ))) +if (!(vlan->vlan_tci &htons (VLAN_CFI_MASK )))return -EINVAL ; vlan_tci = vlan->vlan_tci;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 * 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_IPV6) && 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 : -if (vlan_tci &htons (VLAN_TAG_PRESENT ) || +if (vlan_tci &htons (VLAN_CFI_MASK ) || !eth_p_mpls (eth_type))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 :if (mac_proto !=MAC_PROTO_ETHERNET )return -EINVAL ; -if (vlan_tci &htons (VLAN_TAG_PRESENT )) +if (vlan_tci &htons (VLAN_CFI_MASK ))return -EINVAL ; mac_proto =MAC_PROTO_NONE ;break ;
Signature · 1 line
2.19.1
A message that is not in the archive (sent off-list or not yet received): cover.1541698641.git.mirq-linux-CoA6ZxLDdyEEUmgCuDUIdw@public.gmane.org
Quoted 2 lines · Michał Mirosław
This series removes
VLAN_TAG_PRESENTuse from network drivers in preparation to removing its special meaning.
Can you please give an extra explanation why it is removed? Such series come out-of-blue, for people who are not following netdev mailing list closely (drivers/infiniband/*).
Thanks
Quoted 19 lines
Michał Mirosław (4):
i40iw: remove use ofVLAN_TAG_PRESENT
cnic: remove use ofVLAN_TAG_PRESENT
gianfar: remove use ofVLAN_TAG_PRESENT
OVS: remove use ofVLAN_TAG_PRESENTdrivers/infiniband/hw/i40iw/i40iw_cm.c | 8 +++---- drivers/net/ethernet/broadcom/cnic.c | 2 +- .../net/ethernet/freescale/gianfar_ethtool.c | 8 +++---- net/openvswitch/actions.c | 13 +++++++---- net/openvswitch/flow.c | 4 ++-- net/openvswitch/flow.h | 2 +- net/openvswitch/flow_netlink.c | 22 +++++++++---------- 7 files changed, 31 insertions(+), 28 deletions(-)--
2.19.1
Quoted 6 lines · Leon Romanovsky
Quoted 2 lines · Michał Mirosław
This series removes
VLAN_TAG_PRESENTuse from network drivers in preparation to removing its special meaning.Can you please give an extra explanation why it is removed? Such series come out-of-blue, for people who are not following netdev mailing list closely (
drivers/infiniband/*).
This is one of the steps to remove VLAN_TAG_PRESENT overlap with CFI/DEI bit of VLAN tag. Currently this overlap causes Linux kernel to always clear CFI/DEI in packets.
There is skb_vlan_tag_present() that drivers should use to check if the tag in skb is valid.
Best Regards,
Michał Mirosław
David Miller
maintainerFrom: Michał Mirosław <[email protected]>
Date: Thu, 08 Nov 2018 18:44:46 +0100
Quoted 2 lines
This series removes
VLAN_TAG_PRESENTuse from network drivers in preparation to removing its special meaning.
Series applied, thank you.
Quoted 11 lines · Michał Mirosław
This series removes
VLAN_TAG_PRESENTuse from network drivers in preparation to removing its special meaning.Michał Mirosław (4):
i40iw: remove use ofVLAN_TAG_PRESENT
cnic: remove use ofVLAN_TAG_PRESENT
gianfar: remove use ofVLAN_TAG_PRESENT
OVS: remove use ofVLAN_TAG_PRESENTdrivers/infiniband/hw/i40iw/i40iw_cm.c | 8 +++----
i40iw bit looks fine. Thanks!