From: Dekel Peled Date: Tue, 3 Mar 2020 12:37:30 +0000 (+0200) Subject: net/mlx5: fix mask used for IPv6 item validation X-Git-Url: http://git.droids-corp.org/?p=dpdk.git;a=commitdiff_plain;h=6bd5efb23db9e419dec51fbea7f71c2fd3703d75 net/mlx5: fix mask used for IPv6 item validation The nic_mask struct in function mlx5_flow_validate_item_ipv6() includes hop_limits field. This is redundant since matching on this item is not supported using Verbs flow engine (dv_flow_en=0). (Separate patch will be sent to handle this issue for DV flow engine.) Setting a rule including match on this field will fail: testpmd> flow create 0 ingress pattern eth / ipv6 hop is 1 / end actions drop / end port_flow_complain(): Caught PMD error type 1 (cause unspecified): hardware refuses to create flow: Operation not supported This patch removes the redundant field from nic_mask, to ensure that such flow rules will be rejected by PMD validation: testpmd> flow create 0 ingress pattern eth / ipv6 hop is 1 / end actions drop / end port_flow_complain(): Caught PMD error type 13 (specific pattern item): cause: 0x7fffffffa2c8, mask enables non supported bits: Operation not supported The related lines in function flow_verbs_translate_item_ipv6() are removed as well, since they are redundant. Fixes: 23c1d42c7138 ("net/mlx5: split flow validation to dedicated function") Fixes: 84c406e74524 ("net/mlx5: add flow translate function") Cc: stable@dpdk.org Signed-off-by: Dekel Peled Acked-by: Matan Azrad --- diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c index 16c1ef3532..41072da6df 100644 --- a/drivers/net/mlx5/mlx5_flow.c +++ b/drivers/net/mlx5/mlx5_flow.c @@ -1640,7 +1640,6 @@ mlx5_flow_validate_item_ipv6(const struct rte_flow_item *item, "\xff\xff\xff\xff\xff\xff\xff\xff", .vtc_flow = RTE_BE32(0xffffffff), .proto = 0xff, - .hop_limits = 0xff, }, }; const int tunnel = !!(item_flags & MLX5_FLOW_LAYER_TUNNEL); diff --git a/drivers/net/mlx5/mlx5_flow_verbs.c b/drivers/net/mlx5/mlx5_flow_verbs.c index 04845f8f4c..459e7b6483 100644 --- a/drivers/net/mlx5/mlx5_flow_verbs.c +++ b/drivers/net/mlx5/mlx5_flow_verbs.c @@ -494,14 +494,12 @@ flow_verbs_translate_item_ipv6(struct mlx5_flow *dev_flow, ipv6.val.traffic_class = (vtc_flow_val & RTE_IPV6_HDR_TC_MASK) >> RTE_IPV6_HDR_TC_SHIFT; ipv6.val.next_hdr = spec->hdr.proto; - ipv6.val.hop_limit = spec->hdr.hop_limits; ipv6.mask.flow_label = rte_cpu_to_be_32((vtc_flow_mask & RTE_IPV6_HDR_FL_MASK) >> RTE_IPV6_HDR_FL_SHIFT); ipv6.mask.traffic_class = (vtc_flow_mask & RTE_IPV6_HDR_TC_MASK) >> RTE_IPV6_HDR_TC_SHIFT; ipv6.mask.next_hdr = mask->hdr.proto; - ipv6.mask.hop_limit = mask->hdr.hop_limits; /* Remove unwanted bits from values. */ for (i = 0; i < RTE_DIM(ipv6.val.src_ip); ++i) { ipv6.val.src_ip[i] &= ipv6.mask.src_ip[i]; @@ -510,7 +508,6 @@ flow_verbs_translate_item_ipv6(struct mlx5_flow *dev_flow, ipv6.val.flow_label &= ipv6.mask.flow_label; ipv6.val.traffic_class &= ipv6.mask.traffic_class; ipv6.val.next_hdr &= ipv6.mask.next_hdr; - ipv6.val.hop_limit &= ipv6.mask.hop_limit; } flow_verbs_spec_add(&dev_flow->verbs, &ipv6, size); }