etherdevice.h & bridge: netfilter: Add and use ether_addr_equal_masked
[cascardo/linux.git] / include / linux / etherdevice.h
index 37ff4a6..6fec9e8 100644 (file)
@@ -373,6 +373,29 @@ static inline bool ether_addr_equal_unaligned(const u8 *addr1, const u8 *addr2)
 #endif
 }
 
+/**
+ * ether_addr_equal_masked - Compare two Ethernet addresses with a mask
+ * @addr1: Pointer to a six-byte array containing the 1st Ethernet address
+ * @addr2: Pointer to a six-byte array containing the 2nd Ethernet address
+ * @mask: Pointer to a six-byte array containing the Ethernet address bitmask
+ *
+ * Compare two Ethernet addresses with a mask, returns true if for every bit
+ * set in the bitmask the equivalent bits in the ethernet addresses are equal.
+ * Using a mask with all bits set is a slower ether_addr_equal.
+ */
+static inline bool ether_addr_equal_masked(const u8 *addr1, const u8 *addr2,
+                                          const u8 *mask)
+{
+       int i;
+
+       for (i = 0; i < ETH_ALEN; i++) {
+               if ((addr1[i] ^ addr2[i]) & mask[i])
+                       return false;
+       }
+
+       return true;
+}
+
 /**
  * is_etherdev_addr - Tell if given Ethernet address belongs to the device.
  * @dev: Pointer to a device structure