-From e97ad85630ba172b34ee1ef9ea9f8cbe41bd9498 Mon Sep 17 00:00:00 2001
+From 8f8cfb2ed5a5f6492c66e4eb56ef8360794948de Mon Sep 17 00:00:00 2001
From: Zheng Li <zheng.x.li@oracle.com>
Date: Wed, 19 Jun 2013 00:53:47 -0700
Subject: bonding: rlb mode of bond should not alter ARP originating via bridge
---
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
+ 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;
/* 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 */