[PATCH iwl-next 9/10] ice: use inline helpers instead of memcmp() for IPv6 mask checks in ice_ethtool_fdir

Aleksandr Loktionov
2026-04-10T07:49:38Z

Replace static full_ipv6_addr_mask / zero_ipv6_addr_mask structs
and the associated memcmp() calls in ice_ethtool_fdir.c with the
kernel-provided ipv6_addr_any() helper and a new ice_ipv6_mask_full()
inline, reducing boilerplate and making intent clearer.

Suggested-by: Larysa Zaremba <larysa.zaremba@intel.com>
Signed-off-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
---
.../net/ethernet/intel/ice/ice_ethtool_fdir.c | 57 ++++++-------------
1 file changed, 16 insertions(+), 41 deletions(-)

diff --git a/drivers/net/ethernet/intel/ice/ice_ethtool_fdir.c b/drivers/net/ethernet/intel/ice/ice_ethtool_fdir.c
index aceec18..1d7c595 100644
--- a/drivers/net/ethernet/intel/ice/ice_ethtool_fdir.c
+++ b/drivers/net/ethernet/intel/ice/ice_ethtool_fdir.c
@@ -8,23 +8,10 @@
#include "ice_fdir.h"
#include "ice_flow.h"

-static struct in6_addr full_ipv6_addr_mask = {
- .in6_u = {
- .u6_addr8 = {
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- }
- }
-};
-
-static struct in6_addr zero_ipv6_addr_mask = {
- .in6_u = {
- .u6_addr8 = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- }
- }
-};
+static bool ice_ipv6_mask_full(const __be32 *a)
+{
+ return (a[0] & a[1] & a[2] & a[3]) == cpu_to_be32(0xffffffff);
+}

/* calls to ice_flow_add_prof require the number of segments in the array
* for segs_cnt. In this code that is one more than the index.
@@ -1070,10 +1057,8 @@ ice_set_fdir_ip6_seg(struct ice_flow_seg_info *seg,
enum ice_flow_field src_port, dst_port;

/* make sure we don't have any empty rule */
- if (!memcmp(tcp_ip6_spec->ip6src, &zero_ipv6_addr_mask,
- sizeof(struct in6_addr)) &&
- !memcmp(tcp_ip6_spec->ip6dst, &zero_ipv6_addr_mask,
- sizeof(struct in6_addr)) &&
+ if (ipv6_addr_any((struct in6_addr *)tcp_ip6_spec->ip6src) &&
+ ipv6_addr_any((struct in6_addr *)tcp_ip6_spec->ip6dst) &&
!tcp_ip6_spec->psrc && !tcp_ip6_spec->pdst)
return -EINVAL;

@@ -1097,24 +1082,20 @@ ice_set_fdir_ip6_seg(struct ice_flow_seg_info *seg,
*perfect_fltr = true;
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV6 | l4_proto);

- if (!memcmp(tcp_ip6_spec->ip6src, &full_ipv6_addr_mask,
- sizeof(struct in6_addr)))
+ if (ice_ipv6_mask_full(tcp_ip6_spec->ip6src))
ice_flow_set_fld(seg, ICE_FLOW_FIELD_IDX_IPV6_SA,
ICE_FLOW_FLD_OFF_INVAL, ICE_FLOW_FLD_OFF_INVAL,
ICE_FLOW_FLD_OFF_INVAL, false);
- else if (!memcmp(tcp_ip6_spec->ip6src, &zero_ipv6_addr_mask,
- sizeof(struct in6_addr)))
+ else if (ipv6_addr_any((struct in6_addr *)tcp_ip6_spec->ip6src))
*perfect_fltr = false;
else
return -EOPNOTSUPP;

- if (!memcmp(tcp_ip6_spec->ip6dst, &full_ipv6_addr_mask,
- sizeof(struct in6_addr)))
+ if (ice_ipv6_mask_full(tcp_ip6_spec->ip6dst))
ice_flow_set_fld(seg, ICE_FLOW_FIELD_IDX_IPV6_DA,
ICE_FLOW_FLD_OFF_INVAL, ICE_FLOW_FLD_OFF_INVAL,
ICE_FLOW_FLD_OFF_INVAL, false);
- else if (!memcmp(tcp_ip6_spec->ip6dst, &zero_ipv6_addr_mask,
- sizeof(struct in6_addr)))
+ else if (ipv6_addr_any((struct in6_addr *)tcp_ip6_spec->ip6dst))
*perfect_fltr = false;
else
return -EOPNOTSUPP;
@@ -1167,33 +1148,27 @@ ice_set_fdir_ip6_usr_seg(struct ice_flow_seg_info *seg,
if (usr_ip6_spec->l4_proto)
return -EOPNOTSUPP;
/* empty rules are not valid */
- if (!memcmp(usr_ip6_spec->ip6src, &zero_ipv6_addr_mask,
- sizeof(struct in6_addr)) &&
- !memcmp(usr_ip6_spec->ip6dst, &zero_ipv6_addr_mask,
- sizeof(struct in6_addr)))
+ if (ipv6_addr_any((struct in6_addr *)usr_ip6_spec->ip6src) &&
+ ipv6_addr_any((struct in6_addr *)usr_ip6_spec->ip6dst))
return -EINVAL;

*perfect_fltr = true;
ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV6);

- if (!memcmp(usr_ip6_spec->ip6src, &full_ipv6_addr_mask,
- sizeof(struct in6_addr)))
+ if (ice_ipv6_mask_full(usr_ip6_spec->ip6src))
ice_flow_set_fld(seg, ICE_FLOW_FIELD_IDX_IPV6_SA,
ICE_FLOW_FLD_OFF_INVAL, ICE_FLOW_FLD_OFF_INVAL,
ICE_FLOW_FLD_OFF_INVAL, false);
- else if (!memcmp(usr_ip6_spec->ip6src, &zero_ipv6_addr_mask,
- sizeof(struct in6_addr)))
+ else if (ipv6_addr_any((struct in6_addr *)usr_ip6_spec->ip6src))
*perfect_fltr = false;
else
return -EOPNOTSUPP;

- if (!memcmp(usr_ip6_spec->ip6dst, &full_ipv6_addr_mask,
- sizeof(struct in6_addr)))
+ if (ice_ipv6_mask_full(usr_ip6_spec->ip6dst))
ice_flow_set_fld(seg, ICE_FLOW_FIELD_IDX_IPV6_DA,
ICE_FLOW_FLD_OFF_INVAL, ICE_FLOW_FLD_OFF_INVAL,
ICE_FLOW_FLD_OFF_INVAL, false);
- else if (!memcmp(usr_ip6_spec->ip6dst, &zero_ipv6_addr_mask,
- sizeof(struct in6_addr)))
+ else if (ipv6_addr_any((struct in6_addr *)usr_ip6_spec->ip6dst))
*perfect_fltr = false;
else
return -EOPNOTSUPP;
--
2.52.0