bonding: set correct vlan id for alb xmit path
Subsystems (3)
PATCH RESEND 1/1 bonding: set correct vlan id for alb xmit path
The commit d3ab3ffd1d728d7ee77340e7e7e2c7cfe6a4013e (bonding: use rlb_client_info->vlan_id instead of ->tag) remove the rlb_client_info->tag, but occur some issues, The vlan_get_tag() will return 0 for success and -EINVAL for error, so the client_info->vlan_id always be set to 0 if the vlan_get_tag return 0 for success, so the client_info would never get a correct vlan id, and could not send a skb for vlan id 0.
Fix this by convert the client_info->vlan_id from u16 to s16, and set to -1 for default value, the s16 is enough for the range of the vlan id.
--- drivers/net/bonding/bond_alb.c | 8 ++++---- drivers/net/bonding/bond_alb.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-)
drivers/net/bonding/bond_alb.c +4 -4
@@ -539,7 +539,7 @@ static void rlb_update_client(struct rlb_client_info *client_info) skb->dev = client_info->slave->dev; -if (client_info->vlan_id) { +if (client_info->vlan_id >=0 ) { skb =vlan_put_tag (skb,htons (ETH_P_8021Q ), client_info->vlan_id);if (!skb) { pr_err("%s: Error: failed to insert VLAN tag\n",
@@ -722,8 +722,8 @@ static struct slave *rlb_choose_channel(struct sk_buff *skb, struct bonding *bon client_info->ntt =0 ; } -if (!vlan_get_tag (skb, &client_info->vlan_id)) - client_info->vlan_id =0 ; +if (vlan_get_tag (skb, &client_info->vlan_id)) + client_info->vlan_id =-1 ;if (!client_info->assigned) {u32 prev_tbl_head = bond_info->rx_hashtbl_used_head;
@@ -827,7 +827,7 @@ static void rlb_init_table_entry_dst(struct rlb_client_info *entry) entry->used_prev =RLB_NULL_INDEX ; entry->assigned =0 ; entry->slave =NULL ; - entry->vlan_id =0 ; + entry->vlan_id =-1 ; }static void rlb_init_table_entry_src (struct rlb_client_info *entry) {
drivers/net/bonding/bond_alb.h +1 -1
@@ -125,7 +125,7 @@ struct rlb_client_info {u8 assigned;/* checking whether this entry is assigned */ u8 ntt;/* flag - need to transmit client info */ struct slave *slave;/* the slave assigned to this client */ -unsigned short vlan_id;/* VLAN tag associated with IP address */ +short vlan_id;/* VLAN tag associated with IP address */ };struct tlb_slave_info {
Signature · 1 line
1.8.0
Quoted 7 lines · Ding Tianhong
The commit
d3ab3ffd1d728d7ee77340e7e7e2c7cfe6a4013e(bonding: userlb_client_info->vlan_idinstead of ->tag) remove therlb_client_info->tag, but occur some issues, Thevlan_get_tag()will return 0 for success and-EINVALfor error, so theclient_info->vlan_idalways be set to 0 if thevlan_get_tagreturn 0 for success, so theclient_infowould never get a correct vlan id, and could not send a skb for vlan id 0.
VLAN id 0 is a reserved value, afaik, used for traffic prioritizing (by 8021p), so it shouldn't be treated as a normal VLAN.
Also, I remember that it was used internally for HW filtering, so it might interfere with those (if a devices has NETIF_F_HW_VLAN_CTAG_FITLER VLAN id 0 is added automatically).
Based on these I don't think that bonding should see VLAN 0 as a normal VLAN.
Quoted 66 lines
Fix this by convert the
client_info->vlan_idfrom u16 to s16, and set to -1 for default value, the s16 is enough for the range of the vlan id.Fixes d3ab3ffd1d7 (bonding: use rlb_client_info->vlan_id instead of ->tag)Cc Jay Vosburgh <[email protected]>Cc Veaceslav Falico <[email protected]>Cc Andy Gospodarek <[email protected]>Signed-off-by Ding Tianhong <[email protected]>---
drivers/net/bonding/bond_alb.c| 8 ++++----drivers/net/bonding/bond_alb.h| 2 +-2 files changed, 5 insertions(+), 5 deletions(-)drivers/net/bonding/bond_alb.c +4
-4@@ -539,7 +539,7 @@ static void rlb_update_client(struct rlb_client_info *client_info) skb->dev = client_info->slave->dev; -if (client_info->vlan_id) { +if (client_info->vlan_id >=0 ) { skb =vlan_put_tag (skb,htons (ETH_P_8021Q ), client_info->vlan_id);if (!skb) { pr_err("%s: Error: failed to insert VLAN tag\n",@@ -722,8 +722,8 @@ static struct slave *rlb_choose_channel(struct sk_buff *skb, struct bonding *bon client_info->ntt =0 ; } -if (!vlan_get_tag (skb, &client_info->vlan_id)) - client_info->vlan_id =0 ; +if (vlan_get_tag (skb, &client_info->vlan_id)) + client_info->vlan_id =-1 ;if (!client_info->assigned) {u32 prev_tbl_head = bond_info->rx_hashtbl_used_head;@@ -827,7 +827,7 @@ static void rlb_init_table_entry_dst(struct rlb_client_info *entry) entry->used_prev =RLB_NULL_INDEX ; entry->assigned =0 ; entry->slave =NULL ; - entry->vlan_id =0 ; + entry->vlan_id =-1 ; }static void rlb_init_table_entry_src (struct rlb_client_info *entry) {drivers/net/bonding/bond_alb.h +1
-1@@ -125,7 +125,7 @@ struct rlb_client_info {u8 assigned;/* checking whether this entry is assigned */ u8 ntt;/* flag - need to transmit client info */ struct slave *slave;/* the slave assigned to this client */ -unsigned short vlan_id;/* VLAN tag associated with IP address */ +short vlan_id;/* VLAN tag associated with IP address */ };struct tlb_slave_info {Signature · 1 line
1.8.0
Quoted 12 lines · Veaceslav Falico
Quoted 7 lines · Ding Tianhong
The commit
d3ab3ffd1d728d7ee77340e7e7e2c7cfe6a4013e(bonding: userlb_client_info->vlan_idinstead of ->tag) remove therlb_client_info->tag, but occur some issues, Thevlan_get_tag()will return 0 for success and-EINVALfor error, so theclient_info->vlan_idalways be set to 0 if thevlan_get_tagreturn 0 for success, so theclient_infowould never get a correct vlan id, and could not send a skb for vlan id 0.VLAN id 0 is a reserved value, afaik, used for traffic prioritizing (by 8021p), so it shouldn't be treated as a normal VLAN.
Quoted 7 lines
Also, I remember that it was used internally for HW filtering, so it might interfere with those (if a devices has
NETIF_F_HW_VLAN_CTAG_FITLERVLAN id 0 is added automatically).Based on these I don't think that bonding should see VLAN 0 as a normal VLAN.
Yes, the vlan id 0 is reserved, this tag could not indicate a valid vlan group although I set some vlan dev to id 0 and they could work, this has trouble me for a long time, maybe I need to add some restrict for vlan id, I will remove the vlan id 0 and resend, thanks.
Ding
Quoted 69 lines
Quoted 66 lines
Fix this by convert the
client_info->vlan_idfrom u16 to s16, and set to -1 for default value, the s16 is enough for the range of the vlan id.Fixes d3ab3ffd1d7 (bonding: use rlb_client_info->vlan_id instead of ->tag)Cc Jay Vosburgh <[email protected]>Cc Veaceslav Falico <[email protected]>Cc Andy Gospodarek <[email protected]>Signed-off-by Ding Tianhong <[email protected]>---
drivers/net/bonding/bond_alb.c| 8 ++++----drivers/net/bonding/bond_alb.h| 2 +-2 files changed, 5 insertions(+), 5 deletions(-)drivers/net/bonding/bond_alb.c +4
-4@@ -539,7 +539,7 @@ static void rlb_update_client(struct rlb_client_info *client_info) skb->dev = client_info->slave->dev; -if (client_info->vlan_id) { +if (client_info->vlan_id >=0 ) { skb =vlan_put_tag (skb,htons (ETH_P_8021Q ), client_info->vlan_id);if (!skb) { pr_err("%s: Error: failed to insert VLAN tag\n",@@ -722,8 +722,8 @@ static struct slave *rlb_choose_channel(struct sk_buff *skb, struct bonding *bon client_info->ntt =0 ; } -if (!vlan_get_tag (skb, &client_info->vlan_id)) - client_info->vlan_id =0 ; +if (vlan_get_tag (skb, &client_info->vlan_id)) + client_info->vlan_id =-1 ;if (!client_info->assigned) {u32 prev_tbl_head = bond_info->rx_hashtbl_used_head;@@ -827,7 +827,7 @@ static void rlb_init_table_entry_dst(struct rlb_client_info *entry) entry->used_prev =RLB_NULL_INDEX ; entry->assigned =0 ; entry->slave =NULL ; - entry->vlan_id =0 ; + entry->vlan_id =-1 ; }static void rlb_init_table_entry_src (struct rlb_client_info *entry) {drivers/net/bonding/bond_alb.h +1
-1@@ -125,7 +125,7 @@ struct rlb_client_info {u8 assigned;/* checking whether this entry is assigned */ u8 ntt;/* flag - need to transmit client info */ struct slave *slave;/* the slave assigned to this client */ -unsigned short vlan_id;/* VLAN tag associated with IP address */ +short vlan_id;/* VLAN tag associated with IP address */ };struct tlb_slave_info {Signature · 1 line
1.8.0.