]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
i40e: fix src IP mask checks and memcpy argument names in cloud filter
authorAlok Tiwari <alok.a.tiwari@oracle.com>
Mon, 10 Nov 2025 19:13:38 +0000 (11:13 -0800)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Tue, 10 Mar 2026 20:02:45 +0000 (13:02 -0700)
Fix following issues in the IPv4 and IPv6 cloud filter handling logic in
both the add and delete paths:

- The source-IP mask check incorrectly compares mask.src_ip[0] against
  tcf.dst_ip[0]. Update it to compare against tcf.src_ip[0]. This likely
  goes unnoticed because the check is in an "else if" path that only
  executes when dst_ip is not set, most cloud filter use cases focus on
  destination-IP matching, and the buggy condition can accidentally
  evaluate true in some cases.

- memcpy() for the IPv4 source address incorrectly uses
  ARRAY_SIZE(tcf.dst_ip) instead of ARRAY_SIZE(tcf.src_ip), although
  both arrays are the same size.

- The IPv4 memcpy operations used ARRAY_SIZE(tcf.dst_ip) and ARRAY_SIZE
  (tcf.src_ip), Update these to use sizeof(cfilter->ip.v4.dst_ip) and
  sizeof(cfilter->ip.v4.src_ip) to ensure correct and explicit copy size.

- In the IPv6 delete path, memcmp() uses sizeof(src_ip6) when comparing
  dst_ip6 fields. Replace this with sizeof(dst_ip6) to make the intent
  explicit, even though both fields are struct in6_addr.

Fixes: e284fc280473 ("i40e: Add and delete cloud filter")
Signed-off-by: Alok Tiwari <alok.a.tiwari@oracle.com>
Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
Reviewed-by: Paul Menzel <pmenzel@molgen.mpg.de>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c

index fdf40f8fb2399e39125c94a584b371b25736d868..a26c3d47ec1561f615e61f22fd9de9d220a553fc 100644 (file)
@@ -3833,10 +3833,10 @@ static int i40e_vc_del_cloud_filter(struct i40e_vf *vf, u8 *msg)
                cfilter.n_proto = ETH_P_IP;
                if (mask.dst_ip[0] & tcf.dst_ip[0])
                        memcpy(&cfilter.ip.v4.dst_ip, tcf.dst_ip,
-                              ARRAY_SIZE(tcf.dst_ip));
-               else if (mask.src_ip[0] & tcf.dst_ip[0])
+                              sizeof(cfilter.ip.v4.dst_ip));
+               else if (mask.src_ip[0] & tcf.src_ip[0])
                        memcpy(&cfilter.ip.v4.src_ip, tcf.src_ip,
-                              ARRAY_SIZE(tcf.dst_ip));
+                              sizeof(cfilter.ip.v4.src_ip));
                break;
        case VIRTCHNL_TCP_V6_FLOW:
                cfilter.n_proto = ETH_P_IPV6;
@@ -3891,7 +3891,7 @@ static int i40e_vc_del_cloud_filter(struct i40e_vf *vf, u8 *msg)
                /* for ipv6, mask is set for all sixteen bytes (4 words) */
                if (cfilter.n_proto == ETH_P_IPV6 && mask.dst_ip[3])
                        if (memcmp(&cfilter.ip.v6.dst_ip6, &cf->ip.v6.dst_ip6,
-                                  sizeof(cfilter.ip.v6.src_ip6)))
+                                  sizeof(cfilter.ip.v6.dst_ip6)))
                                continue;
                if (mask.vlan_id)
                        if (cfilter.vlan_id != cf->vlan_id)
@@ -3979,10 +3979,10 @@ static int i40e_vc_add_cloud_filter(struct i40e_vf *vf, u8 *msg)
                cfilter->n_proto = ETH_P_IP;
                if (mask.dst_ip[0] & tcf.dst_ip[0])
                        memcpy(&cfilter->ip.v4.dst_ip, tcf.dst_ip,
-                              ARRAY_SIZE(tcf.dst_ip));
-               else if (mask.src_ip[0] & tcf.dst_ip[0])
+                              sizeof(cfilter->ip.v4.dst_ip));
+               else if (mask.src_ip[0] & tcf.src_ip[0])
                        memcpy(&cfilter->ip.v4.src_ip, tcf.src_ip,
-                              ARRAY_SIZE(tcf.dst_ip));
+                              sizeof(cfilter->ip.v4.src_ip));
                break;
        case VIRTCHNL_TCP_V6_FLOW:
                cfilter->n_proto = ETH_P_IPV6;