[v7,3/3] net/mlx5/hws: add compare ESP sequence number support
Checks
Commit Message
Add support for compare item with "RTE_FLOW_FIELD_ESP_SEQ_NUM" field.
Signed-off-by: Michael Baum <michaelba@nvidia.com>
Acked-by: Suanming Mou <suanmingm@nvidia.com>
---
doc/guides/nics/mlx5.rst | 1 +
drivers/net/mlx5/hws/mlx5dr_definer.c | 22 ++++++++++++++++++++--
drivers/net/mlx5/mlx5_flow_hw.c | 3 +++
3 files changed, 24 insertions(+), 2 deletions(-)
@@ -434,6 +434,7 @@ Limitations
- Only single item is supported per pattern template.
- Only 32-bit comparison is supported or 16-bits for random field.
- Only supported for ``RTE_FLOW_FIELD_META``, ``RTE_FLOW_FIELD_TAG``,
+ ``RTE_FLOW_FIELD_ESP_SEQ_NUM``,
``RTE_FLOW_FIELD_RANDOM`` and ``RTE_FLOW_FIELD_VALUE``.
- The field type ``RTE_FLOW_FIELD_VALUE`` must be the base (``b``) field.
- The field type ``RTE_FLOW_FIELD_RANDOM`` can only be compared with
@@ -424,10 +424,20 @@ mlx5dr_definer_compare_base_value_set(const void *item_spec,
value = (const uint32_t *)&b->value[0];
- if (a->field == RTE_FLOW_FIELD_RANDOM)
+ switch (a->field) {
+ case RTE_FLOW_FIELD_RANDOM:
*base = htobe32(*value << 16);
- else
+ break;
+ case RTE_FLOW_FIELD_TAG:
+ case RTE_FLOW_FIELD_META:
*base = htobe32(*value);
+ break;
+ case RTE_FLOW_FIELD_ESP_SEQ_NUM:
+ *base = *value;
+ break;
+ default:
+ break;
+ }
MLX5_SET(ste_match_4dw_range_ctrl_dw, ctrl, base0, 1);
}
@@ -2930,6 +2940,14 @@ mlx5dr_definer_conv_item_compare_field(const struct rte_flow_field_data *f,
fc->compare_idx = dw_offset;
DR_CALC_SET_HDR(fc, random_number, random_number);
break;
+ case RTE_FLOW_FIELD_ESP_SEQ_NUM:
+ fc = &cd->fc[MLX5DR_DEFINER_FNAME_ESP_SEQUENCE_NUMBER];
+ fc->item_idx = item_idx;
+ fc->tag_set = &mlx5dr_definer_compare_set;
+ fc->tag_mask_set = &mlx5dr_definer_ones_set;
+ fc->compare_idx = dw_offset;
+ DR_CALC_SET_HDR(fc, ipsec, sequence_number);
+ break;
default:
DR_LOG(ERR, "%u field is not supported", f->field);
goto err_notsup;
@@ -6729,6 +6729,7 @@ flow_hw_item_compare_field_validate(enum rte_flow_field_id arg_field,
switch (arg_field) {
case RTE_FLOW_FIELD_TAG:
case RTE_FLOW_FIELD_META:
+ case RTE_FLOW_FIELD_ESP_SEQ_NUM:
break;
case RTE_FLOW_FIELD_RANDOM:
if (base_field == RTE_FLOW_FIELD_VALUE)
@@ -6747,6 +6748,7 @@ flow_hw_item_compare_field_validate(enum rte_flow_field_id arg_field,
case RTE_FLOW_FIELD_TAG:
case RTE_FLOW_FIELD_META:
case RTE_FLOW_FIELD_VALUE:
+ case RTE_FLOW_FIELD_ESP_SEQ_NUM:
break;
default:
return rte_flow_error_set(error, ENOTSUP,
@@ -6763,6 +6765,7 @@ flow_hw_item_compare_width_supported(enum rte_flow_field_id field)
switch (field) {
case RTE_FLOW_FIELD_TAG:
case RTE_FLOW_FIELD_META:
+ case RTE_FLOW_FIELD_ESP_SEQ_NUM:
return 32;
case RTE_FLOW_FIELD_RANDOM:
return 16;