lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20210929155334.12454-24-shenjian15@huawei.com>
Date:   Wed, 29 Sep 2021 23:51:10 +0800
From:   Jian Shen <shenjian15@...wei.com>
To:     <davem@...emloft.net>, <kuba@...nel.org>, <andrew@...n.ch>,
        <hkallweit1@...il.com>
CC:     <netdev@...r.kernel.org>, <linuxarm@...neuler.org>
Subject: [RFCv2 net-next 023/167] net: add netdev feature helpers

For the prototype of netdev_features_t will be changed from
u64 to unsigned long *, so it's necessary to add a set of
helpers to do the logic operation.

This is a temporary patch, used to compatible with the
current prototype of netdev_features_t. The parameters styles
are not consistent for among these helpers, in order to minimize
the modification when change the netdev_features_t to bitmap.

It also introduce a new macro NETDEV_FEATURE_DWORDS, used for
scenario define the features as an array, so it can be
initialized when define structure.

Signed-off-by: Jian Shen <shenjian15@...wei.com>
---
 include/linux/netdev_features.h | 135 ++++++++++++++++++++++++++++++++
 1 file changed, 135 insertions(+)

diff --git a/include/linux/netdev_features.h b/include/linux/netdev_features.h
index 2c6b9e416225..b3fa05c88eef 100644
--- a/include/linux/netdev_features.h
+++ b/include/linux/netdev_features.h
@@ -101,6 +101,8 @@ enum {
 	/**/NETDEV_FEATURE_COUNT
 };
 
+#define NETDEV_FEATURE_DWORDS	DIV_ROUND_UP(NETDEV_FEATURE_COUNT, 64)
+
 /* copy'n'paste compression ;) */
 #define __NETIF_F_BIT(bit)	((netdev_features_t)1 << (bit))
 #define __NETIF_F(name)		__NETIF_F_BIT(NETIF_F_##name##_BIT)
@@ -261,4 +263,137 @@ static inline int find_next_netdev_feature(u64 feature, unsigned long start)
 				 NETIF_F_GSO_UDP_TUNNEL |		\
 				 NETIF_F_GSO_UDP_TUNNEL_CSUM)
 
+static inline void netdev_feature_zero(netdev_features_t *dst)
+{
+	*dst = 0;
+}
+
+static inline void netdev_feature_fill(netdev_features_t *dst)
+{
+	*dst = ~0;
+}
+
+static inline void netdev_feature_copy(netdev_features_t *dst,
+				       const netdev_features_t src)
+{
+	*dst = src;
+}
+
+static inline void netdev_feature_and(netdev_features_t *dst,
+				      const netdev_features_t a,
+				      const netdev_features_t b)
+{
+	*dst = a & b;
+}
+
+static inline void netdev_feature_or(netdev_features_t *dst,
+				     const netdev_features_t a,
+				     const netdev_features_t b)
+{
+	*dst = a | b;
+}
+
+static inline void netdev_feature_xor(netdev_features_t *dst,
+				      const netdev_features_t a,
+				      const netdev_features_t b)
+{
+	*dst = a ^ b;
+}
+
+static inline bool netdev_feature_empty(netdev_features_t src)
+{
+	return src == 0;
+}
+
+static inline bool netdev_feature_equal(const netdev_features_t src1,
+					const netdev_features_t src2)
+{
+	return src1 == src2;
+}
+
+static inline int netdev_feature_andnot(netdev_features_t *dst,
+					const netdev_features_t src1,
+					const netdev_features_t src2)
+{
+	*dst = src1 & ~src2;
+	return 0;
+}
+
+static inline void netdev_feature_set_bit(int nr, netdev_features_t *addr)
+{
+	*addr |= __NETIF_F_BIT(nr);
+}
+
+static inline void netdev_feature_clear_bit(int nr, netdev_features_t *addr)
+{
+	*addr &= ~(__NETIF_F_BIT(nr));
+}
+
+static inline void netdev_feature_mod_bit(int nr, netdev_features_t *addr,
+					  int set)
+{
+	if (set)
+		netdev_feature_set_bit(nr, addr);
+	else
+		netdev_feature_clear_bit(nr, addr);
+}
+
+static inline void netdev_feature_change_bit(int nr, netdev_features_t *addr)
+{
+	*addr ^= __NETIF_F_BIT(nr);
+}
+
+static inline int netdev_feature_test_bit(int nr, const netdev_features_t addr)
+{
+	return (addr & __NETIF_F_BIT(nr)) > 0;
+}
+
+static inline void netdev_feature_set_bit_array(const int *array,
+						int array_size,
+						netdev_features_t *addr)
+{
+	int i;
+
+	for (i = 0; i < array_size; i++)
+		netdev_feature_set_bit(array[i], addr);
+}
+
+/* only be used for the first 64 bits features */
+static inline void netdev_feature_set_bits(u64 bits, netdev_features_t *addr)
+{
+	*addr |= bits;
+}
+
+/* only be used for the first 64 bits features */
+static inline void netdev_feature_clear_bits(u64 bits, netdev_features_t *addr)
+{
+	*addr &= ~bits;
+}
+
+/* only be used for the first 64 bits features */
+static inline bool netdev_feature_test_bits(u64 bits,
+					    const netdev_features_t addr)
+{
+	return (addr & bits) > 0;
+}
+
+/* only be used for the first 64 bits features */
+static inline void netdev_feature_and_bits(u64 bits,
+					   netdev_features_t *addr)
+{
+	*addr &= bits;
+}
+
+static inline int netdev_feature_intersects(const netdev_features_t src1,
+					    const netdev_features_t src2)
+{
+	return (src1 & src2) > 0;
+}
+
+static inline int netdev_feature_subset(const netdev_features_t src1,
+					const netdev_features_t src2)
+{
+	return (src1 & src2) == src2;
+}
+
 #endif	/* _LINUX_NETDEV_FEATURES_H */
-- 
2.33.0

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ