Skip to contentSkip to conversation

bonding: Do not tx-balance some IPv6 packets on ALB/TLB bonds

RFC PATCH Applied Vlad Yasevich 4 participants 6 messages Aug 28, 2008 – Sep 13, 2008

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

RFC PATCH 1/1 bonding: Do not tx-balance some IPv6 packets on ALB/TLB bonds

It's been more then a month and still no replies. Is this just not interesting, or did this get lost in the shuffle...

Please take a look. This patch makes ALB/TLB modes work much more reliably with IPv6.

Thanks
-vlad

---

I've been trying to configure IPv6 on ALB and TLB bonds and have found that there is a 50-50 chance that IPv6 doesn't configure a global address on such bond. After further investigation, it appears that DAD probes are tx-balanced between the bond members. When the DAD probe is sent on the secondary device, it ends up arriving back on the primary, since that interface is also in the multicast group. As a result, we get a false positive duplicate address and fail to configure a global IPv6 address. The easy solution seems to be to not tx-balance DAD problems. Also, we should probably not balance all-note-mulicasts as well since they are the equivalent of IPv4 broadcasts.

---

IPv6 all-node-multicasts and DAD probes should not be tx-balanced on ALB/TLB bonds. The all-node-multicast is an equivalent to IPv4 broadcasts. DAD probes have to be sent only on the primary so that we don't get false-positive detections.

---
 drivers/net/bonding/bond_alb.c |   24 ++++++++++++++++++++++++
 1 files changed, 24 insertions(+), 0 deletions(-)
drivers/net/bonding/bond_alb.c +24 -0
index 5a67372..684440c 100644
@@ -38,6 +38,7 @@
 #include <linux/in.h>
 #include <net/ipx.h>
 #include <net/arp.h>
+#include <net/ipv6.h>
 #include <asm/byteorder.h>
 #include "bonding.h"
 #include "bond_alb.h"
@@ -81,6 +82,7 @@
 #define RLB_PROMISC_TIMEOUT	10*ALB_TIMER_TICKS_PER_SEC
 
 static const u8 mac_bcast[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff};
+static const u8 mac_v6_allmcast[ETH_ALEN] = {0x33,0x33,0x00,0x00,0x00,0x01};
 static const int alb_delta_in_ticks = HZ / ALB_TIMER_TICKS_PER_SEC;
 
 #pragma pack(1)
@@ -1288,6 +1290,7 @@ int bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev)
 	u32 hash_index = 0;
 	const u8 *hash_start = NULL;
 	int res = 1;
+	struct ipv6hdr *ip6hdr;
 
 	skb_reset_mac_header(skb);
 	eth_data = eth_hdr(skb);
@@ -1317,11 +1320,32 @@ int bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev)
 	}
 		break;
 	case ETH_P_IPV6:
+		/* IPv6 doesn't really use broadcast mac address, but leave
+		 * that here just in case.
+		 */
 		if (memcmp(eth_data->h_dest, mac_bcast, ETH_ALEN) == 0) {
 			do_tx_balance = 0;
 			break;
 		}
 
+		/* IPv6 uses all-nodes multicast as an equivalent to
+		 * broadcasts in IPv4.
+		 */
+		if (memcmp(eth_data->h_dest, mac_v6_allmcast, ETH_ALEN) == 0) {
+			do_tx_balance = 0;
+			break;
+		}
+
+		/* Additianally, DAD probes should not be tx-balanced as that
+		 * will lead to false positives for duplicate addresses and
+		 * prevent address configuration from working.
+		 */
+		ip6hdr = ipv6_hdr(skb);
+		if (ipv6_addr_any(&ip6hdr->saddr)) {
+			do_tx_balance = 0;
+			break;
+		}
+
 		hash_start = (char *)&(ipv6_hdr(skb)->daddr);
 		hash_size = sizeof(ipv6_hdr(skb)->daddr);
 		break;
Signature · 5 lines
1.5.3.5
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
maintainer
#1 lore raw

From: Vlad Yasevich <[email protected]>
Date: Thu, 28 Aug 2008 15:38:41 -0400

Quoted 5 lines

It's been more then a month and still no replies. Is this just not interesting, or did this get lost in the shuffle...

Please take a look. This patch makes ALB/TLB modes work much more reliably with IPv6.

Jeff, or someone, please be sure to pick this up.

Thanks.

Quoted 90 lines

I've been trying to configure IPv6 on ALB and TLB bonds and have found that there is a 50-50 chance that IPv6 doesn't configure a global address on such bond. After further investigation, it appears that DAD probes are tx-balanced between the bond members. When the DAD probe is sent on the secondary device, it ends up arriving back on the primary, since that interface is also in the multicast group. As a result, we get a false positive duplicate address and fail to configure a global IPv6 address. The easy solution seems to be to not tx-balance DAD problems. Also, we should probably not balance all-note-mulicasts as well since they are the equivalent of IPv4 broadcasts.

---

IPv6 all-node-multicasts and DAD probes should not be tx-balanced on ALB/TLB bonds. The all-node-multicast is an equivalent to IPv4 broadcasts. DAD probes have to be sent only on the primary so that we don't get false-positive detections.

---
 drivers/net/bonding/bond_alb.c |   24 ++++++++++++++++++++++++
 1 files changed, 24 insertions(+), 0 deletions(-)
drivers/net/bonding/bond_alb.c +24 -0
index 5a67372..684440c 100644
@@ -38,6 +38,7 @@
 #include <linux/in.h>
 #include <net/ipx.h>
 #include <net/arp.h>
+#include <net/ipv6.h>
 #include <asm/byteorder.h>
 #include "bonding.h"
 #include "bond_alb.h"
@@ -81,6 +82,7 @@
 #define RLB_PROMISC_TIMEOUT	10*ALB_TIMER_TICKS_PER_SEC
 
 static const u8 mac_bcast[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff};
+static const u8 mac_v6_allmcast[ETH_ALEN] = {0x33,0x33,0x00,0x00,0x00,0x01};
 static const int alb_delta_in_ticks = HZ / ALB_TIMER_TICKS_PER_SEC;
 
 #pragma pack(1)
@@ -1288,6 +1290,7 @@ int bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev)
 	u32 hash_index = 0;
 	const u8 *hash_start = NULL;
 	int res = 1;
+	struct ipv6hdr *ip6hdr;
 
 	skb_reset_mac_header(skb);
 	eth_data = eth_hdr(skb);
@@ -1317,11 +1320,32 @@ int bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev)
 	}
 		break;
 	case ETH_P_IPV6:
+		/* IPv6 doesn't really use broadcast mac address, but leave
+		 * that here just in case.
+		 */
 		if (memcmp(eth_data->h_dest, mac_bcast, ETH_ALEN) == 0) {
 			do_tx_balance = 0;
 			break;
 		}
 
+		/* IPv6 uses all-nodes multicast as an equivalent to
+		 * broadcasts in IPv4.
+		 */
+		if (memcmp(eth_data->h_dest, mac_v6_allmcast, ETH_ALEN) == 0) {
+			do_tx_balance = 0;
+			break;
+		}
+
+		/* Additianally, DAD probes should not be tx-balanced as that
+		 * will lead to false positives for duplicate addresses and
+		 * prevent address configuration from working.
+		 */
+		ip6hdr = ipv6_hdr(skb);
+		if (ipv6_addr_any(&ip6hdr->saddr)) {
+			do_tx_balance = 0;
+			break;
+		}
+
 		hash_start = (char *)&(ipv6_hdr(skb)->daddr);
 		hash_size = sizeof(ipv6_hdr(skb)->daddr);
 		break;
Signature · 5 lines
1.5.3.5
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
#2 lore raw
Quoted 10 lines · David Miller

From: Vlad Yasevich <[email protected]>
Date: Thu, 28 Aug 2008 15:38:41 -0400

Quoted 5 lines

It's been more then a month and still no replies. Is this just not interesting, or did this get lost in the shuffle...

Please take a look. This patch makes ALB/TLB modes work much more reliably with IPv6.

Jeff, or someone, please be sure to pick this up.

For 2.6.27-rc, I presume?

#3 lore raw
Quoted 7 lines · Jeff Garzik
Quoted 6 lines · David Miller

From: Vlad Yasevich <[email protected]>
Date: Thu, 28 Aug 2008 15:38:41 -0400

Quoted 3 lines

It's been more then a month and still no replies. Is this just not interesting, or did this get lost in the shuffle...

Quoted 8 lines
Quoted 4 lines
Quoted 2 lines

Please take a look. This patch makes ALB/TLB modes work much more reliably with IPv6.

Jeff, or someone, please be sure to pick this up.

For 2.6.27-rc, I presume?

Fine by me.

Thanks
-vlad

#4 lore raw
In reply to Jeff Garzik
Quoted 7 lines · Jeff Garzik
Quoted 6 lines · David Miller

From: Vlad Yasevich <[email protected]>
Date: Thu, 28 Aug 2008 15:38:41 -0400

Quoted 3 lines

It's been more then a month and still no replies. Is this just not interesting, or did this get lost in the shuffle...

Quoted 6 lines
Quoted 4 lines
Quoted 2 lines

Please take a look. This patch makes ALB/TLB modes work much more reliably with IPv6.

Jeff, or someone, please be sure to pick this up.

For 2.6.27-rc, I presume?

Ok with me. I haven't tested this yet (just got back from
vacation), but the description sounds reasonable.

	-J

---
-Jay Vosburgh, IBM Linux Technology Center, [email protected]

Applied
#5 lore raw
In reply to Vlad Yasevich
Quoted 82 lines · Vlad Yasevich

It's been more then a month and still no replies. Is this just not interesting, or did this get lost in the shuffle...

Please take a look. This patch makes ALB/TLB modes work much more reliably with IPv6.

Thanks
-vlad

---

I've been trying to configure IPv6 on ALB and TLB bonds and have found that there is a 50-50 chance that IPv6 doesn't configure a global address on such bond. After further investigation, it appears that DAD probes are tx-balanced between the bond members. When the DAD probe is sent on the secondary device, it ends up arriving back on the primary, since that interface is also in the multicast group. As a result, we get a false positive duplicate address and fail to configure a global IPv6 address. The easy solution seems to be to not tx-balance DAD problems. Also, we should probably not balance all-note-mulicasts as well since they are the equivalent of IPv4 broadcasts.

---

IPv6 all-node-multicasts and DAD probes should not be tx-balanced on ALB/TLB bonds. The all-node-multicast is an equivalent to IPv4 broadcasts. DAD probes have to be sent only on the primary so that we don't get false-positive detections.

---
 drivers/net/bonding/bond_alb.c |   24 ++++++++++++++++++++++++
 1 files changed, 24 insertions(+), 0 deletions(-)
drivers/net/bonding/bond_alb.c +15 -0
index 5a67372..684440c 100644
@@ -38,6 +38,7 @@
 #include <linux/in.h>
 #include <net/ipx.h>
 #include <net/arp.h>
+#include <net/ipv6.h>
 #include <asm/byteorder.h>
 #include "bonding.h"
 #include "bond_alb.h"
@@ -81,6 +82,7 @@
 #define RLB_PROMISC_TIMEOUT	10*ALB_TIMER_TICKS_PER_SEC
 
 static const u8 mac_bcast[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff};
+static const u8 mac_v6_allmcast[ETH_ALEN] = {0x33,0x33,0x00,0x00,0x00,0x01};
 static const int alb_delta_in_ticks = HZ / ALB_TIMER_TICKS_PER_SEC;
 
 #pragma pack(1)
@@ -1288,6 +1290,7 @@ int bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev)
 	u32 hash_index = 0;
 	const u8 *hash_start = NULL;
 	int res = 1;
+	struct ipv6hdr *ip6hdr;
 
 	skb_reset_mac_header(skb);
 	eth_data = eth_hdr(skb);
@@ -1317,11 +1320,32 @@ int bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev)
 	}
 		break;
 	case ETH_P_IPV6:
+		/* IPv6 doesn't really use broadcast mac address, but leave
+		 * that here just in case.
+		 */
 		if (memcmp(eth_data->h_dest, mac_bcast, ETH_ALEN) == 0) {
 			do_tx_balance = 0;
 			break;
 		}
 
+		/* IPv6 uses all-nodes multicast as an equivalent to
+		 * broadcasts in IPv4.
+		 */
+		if (memcmp(eth_data->h_dest, mac_v6_allmcast, ETH_ALEN) == 0) {
+			do_tx_balance = 0;
+			break;
+		}
+
+		/* Additianally, DAD probes should not be tx-balanced as that

drivers/net/bonding/bond_alb.c int bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev) · line 1349

Quoted 10 lines
drivers/net/bonding/bond_alb.c +9 -0
+		 * will lead to false positives for duplicate addresses and
+		 * prevent address configuration from working.
+		 */
+		ip6hdr = ipv6_hdr(skb);
+		if (ipv6_addr_any(&ip6hdr->saddr)) {
+			do_tx_balance = 0;
+			break;
+		}
+
 		hash_start = (char *)&(ipv6_hdr(skb)->daddr);

applied