From: Greg Kroah-Hartman Date: Thu, 27 Jun 2013 18:21:12 +0000 (-0700) Subject: fix up queue-3.4/bonding-rlb-mode-of-bond-should-not-alter-arp-originating-via-bridge... X-Git-Tag: v3.4.51~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=99c1632f2939b21c35b7f88ea796b0d5056a82d9;p=thirdparty%2Fkernel%2Fstable-queue.git fix up queue-3.4/bonding-rlb-mode-of-bond-should-not-alter-arp-originating-via-bridge.patch --- diff --git a/queue-3.4/bonding-rlb-mode-of-bond-should-not-alter-arp-originating-via-bridge.patch b/queue-3.4/bonding-rlb-mode-of-bond-should-not-alter-arp-originating-via-bridge.patch index 7ddab2fcf7d..15f2f04dca0 100644 --- a/queue-3.4/bonding-rlb-mode-of-bond-should-not-alter-arp-originating-via-bridge.patch +++ b/queue-3.4/bonding-rlb-mode-of-bond-should-not-alter-arp-originating-via-bridge.patch @@ -1,4 +1,4 @@ -From e97ad85630ba172b34ee1ef9ea9f8cbe41bd9498 Mon Sep 17 00:00:00 2001 +From 8f8cfb2ed5a5f6492c66e4eb56ef8360794948de Mon Sep 17 00:00:00 2001 From: Zheng Li Date: Wed, 19 Jun 2013 00:53:47 -0700 Subject: bonding: rlb mode of bond should not alter ARP originating via bridge @@ -31,8 +31,7 @@ Signed-off-by: Greg Kroah-Hartman --- drivers/net/bonding/bond_alb.c | 6 ++++++ drivers/net/bonding/bonding.h | 13 +++++++++++++ - include/linux/etherdevice.h | 33 +++++++++++++++++++++++++++++++++ - 3 files changed, 52 insertions(+) + 2 files changed, 19 insertions(+) --- a/drivers/net/bonding/bond_alb.c +++ b/drivers/net/bonding/bond_alb.c @@ -70,7 +69,7 @@ Signed-off-by: Greg Kroah-Hartman + struct slave *tmp; + + bond_for_each_slave(bond, tmp, i) -+ if (ether_addr_equal_64bits(mac, tmp->dev->dev_addr)) ++ if (!compare_ether_addr_64bits(mac, tmp->dev->dev_addr)) + return tmp; + + return NULL; @@ -78,43 +77,3 @@ Signed-off-by: Greg Kroah-Hartman /* exported from bond_main.c */ extern int bond_net_id; ---- a/include/linux/etherdevice.h -+++ b/include/linux/etherdevice.h -@@ -277,4 +277,37 @@ static inline unsigned long compare_ethe - #endif - } - -+/** -+ * ether_addr_equal_64bits - Compare two Ethernet addresses -+ * @addr1: Pointer to an array of 8 bytes -+ * @addr2: Pointer to an other array of 8 bytes -+ * -+ * Compare two Ethernet addresses, returns true if equal, false otherwise. -+ * -+ * The function doesn't need any conditional branches and possibly uses -+ * word memory accesses on CPU allowing cheap unaligned memory reads. -+ * arrays = { byte1, byte2, byte3, byte4, byte5, byte6, pad1, pad2 } -+ * -+ * Please note that alignment of addr1 & addr2 are only guaranteed to be 16 bits. -+ */ -+ -+static inline bool ether_addr_equal_64bits(const u8 addr1[6+2], -+ const u8 addr2[6+2]) -+{ -+#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS -+ unsigned long fold = ((*(unsigned long *)addr1) ^ -+ (*(unsigned long *)addr2)); -+ -+ if (sizeof(fold) == 8) -+ return zap_last_2bytes(fold) == 0; -+ -+ fold |= zap_last_2bytes((*(unsigned long *)(addr1 + 4)) ^ -+ (*(unsigned long *)(addr2 + 4))); -+ return fold == 0; -+#else -+ return ether_addr_equal(addr1, addr2); -+#endif -+} -+ -+ - #endif /* _LINUX_ETHERDEVICE_H */