@@ -316,9 +316,9 @@ mlx5dr_definer_icmp_dw1_set(struct mlx5dr_definer_fc *fc,
icmp_dw1 = (v->hdr.icmp_type << __mlx5_dw_bit_off(header_icmp, type)) |
(v->hdr.icmp_code << __mlx5_dw_bit_off(header_icmp, code)) |
- (v->hdr.icmp_cksum << __mlx5_dw_bit_off(header_icmp, cksum));
+ (rte_be_to_cpu_16(v->hdr.icmp_cksum) << __mlx5_dw_bit_off(header_icmp, cksum));
- DR_SET_BE32(tag, icmp_dw1, fc->byte_off, fc->bit_off, fc->bit_mask);
+ DR_SET(tag, icmp_dw1, fc->byte_off, fc->bit_off, fc->bit_mask);
}
static void
@@ -329,10 +329,10 @@ mlx5dr_definer_icmp_dw2_set(struct mlx5dr_definer_fc *fc,
const struct rte_flow_item_icmp *v = item_spec;
rte_be32_t icmp_dw2;
- icmp_dw2 = (v->hdr.icmp_ident << __mlx5_dw_bit_off(header_icmp, ident)) |
- (v->hdr.icmp_seq_nb << __mlx5_dw_bit_off(header_icmp, seq_nb));
+ icmp_dw2 = (rte_be_to_cpu_16(v->hdr.icmp_ident) << __mlx5_dw_bit_off(header_icmp, ident)) |
+ (rte_be_to_cpu_16(v->hdr.icmp_seq_nb) << __mlx5_dw_bit_off(header_icmp, seq_nb));
- DR_SET_BE32(tag, icmp_dw2, fc->byte_off, fc->bit_off, fc->bit_mask);
+ DR_SET(tag, icmp_dw2, fc->byte_off, fc->bit_off, fc->bit_mask);
}
static void
@@ -345,9 +345,50 @@ mlx5dr_definer_icmp6_dw1_set(struct mlx5dr_definer_fc *fc,
icmp_dw1 = (v->type << __mlx5_dw_bit_off(header_icmp, type)) |
(v->code << __mlx5_dw_bit_off(header_icmp, code)) |
- (v->checksum << __mlx5_dw_bit_off(header_icmp, cksum));
+ (rte_be_to_cpu_16(v->checksum) << __mlx5_dw_bit_off(header_icmp, cksum));
- DR_SET_BE32(tag, icmp_dw1, fc->byte_off, fc->bit_off, fc->bit_mask);
+ DR_SET(tag, icmp_dw1, fc->byte_off, fc->bit_off, fc->bit_mask);
+}
+
+static void
+mlx5dr_definer_icmp6_echo_dw1_mask_set(struct mlx5dr_definer_fc *fc,
+ __rte_unused const void *item_spec,
+ uint8_t *tag)
+{
+ const struct rte_flow_item_icmp6 spec = {0xFF, 0xFF, 0x0};
+ mlx5dr_definer_icmp6_dw1_set(fc, &spec, tag);
+}
+
+static void
+mlx5dr_definer_icmp6_echo_request_dw1_set(struct mlx5dr_definer_fc *fc,
+ __rte_unused const void *item_spec,
+ uint8_t *tag)
+{
+ const struct rte_flow_item_icmp6 spec = {RTE_ICMP6_ECHO_REQUEST, 0, 0};
+ mlx5dr_definer_icmp6_dw1_set(fc, &spec, tag);
+}
+
+static void
+mlx5dr_definer_icmp6_echo_reply_dw1_set(struct mlx5dr_definer_fc *fc,
+ __rte_unused const void *item_spec,
+ uint8_t *tag)
+{
+ const struct rte_flow_item_icmp6 spec = {RTE_ICMP6_ECHO_REPLY, 0, 0};
+ mlx5dr_definer_icmp6_dw1_set(fc, &spec, tag);
+}
+
+static void
+mlx5dr_definer_icmp6_echo_dw2_set(struct mlx5dr_definer_fc *fc,
+ const void *item_spec,
+ uint8_t *tag)
+{
+ const struct rte_flow_item_icmp6_echo *v = item_spec;
+ rte_be32_t dw2;
+
+ dw2 = (rte_be_to_cpu_16(v->echo.identifier) << __mlx5_dw_bit_off(header_icmp, ident)) |
+ (rte_be_to_cpu_16(v->echo.sequence) << __mlx5_dw_bit_off(header_icmp, seq_nb));
+
+ DR_SET(tag, dw2, fc->byte_off, fc->bit_off, fc->bit_mask);
}
static void
@@ -1419,9 +1460,9 @@ mlx5dr_definer_conv_item_icmp(struct mlx5dr_definer_conv_data *cd,
struct mlx5dr_definer_fc *fc;
bool inner = cd->tunnel;
- /* Overwrite match on outer L4 type ICMP */
+ /* Overwrite match on L4 type ICMP */
if (!cd->relaxed) {
- fc = &cd->fc[MLX5DR_DEFINER_FNAME_IP_PROTOCOL_O];
+ fc = &cd->fc[DR_CALC_FNAME(IP_PROTOCOL, inner)];
fc->item_idx = item_idx;
fc->tag_set = &mlx5dr_definer_icmp_protocol_set;
fc->tag_mask_set = &mlx5dr_definer_ones_set;
@@ -1457,9 +1498,9 @@ mlx5dr_definer_conv_item_icmp6(struct mlx5dr_definer_conv_data *cd,
struct mlx5dr_definer_fc *fc;
bool inner = cd->tunnel;
- /* Overwrite match on outer L4 type ICMP6 */
+ /* Overwrite match on L4 type ICMP6 */
if (!cd->relaxed) {
- fc = &cd->fc[MLX5DR_DEFINER_FNAME_IP_PROTOCOL_O];
+ fc = &cd->fc[DR_CALC_FNAME(IP_PROTOCOL, inner)];
fc->item_idx = item_idx;
fc->tag_set = &mlx5dr_definer_icmp_protocol_set;
fc->tag_mask_set = &mlx5dr_definer_ones_set;
@@ -1479,6 +1520,48 @@ mlx5dr_definer_conv_item_icmp6(struct mlx5dr_definer_conv_data *cd,
return 0;
}
+static int
+mlx5dr_definer_conv_item_icmp6_echo(struct mlx5dr_definer_conv_data *cd,
+ struct rte_flow_item *item,
+ int item_idx)
+{
+ const struct rte_flow_item_icmp6_echo *m = item->mask;
+ struct mlx5dr_definer_fc *fc;
+ bool inner = cd->tunnel;
+
+ if (!cd->relaxed) {
+ /* Overwrite match on L4 type ICMP6 */
+ fc = &cd->fc[DR_CALC_FNAME(IP_PROTOCOL, inner)];
+ fc->item_idx = item_idx;
+ fc->tag_set = &mlx5dr_definer_icmp_protocol_set;
+ fc->tag_mask_set = &mlx5dr_definer_ones_set;
+ DR_CALC_SET(fc, eth_l2, l4_type, inner);
+
+ /* Set fixed type and code for icmp6 echo request/reply */
+ fc = &cd->fc[MLX5DR_DEFINER_FNAME_ICMP_DW1];
+ fc->item_idx = item_idx;
+ fc->tag_mask_set = &mlx5dr_definer_icmp6_echo_dw1_mask_set;
+ if (item->type == RTE_FLOW_ITEM_TYPE_ICMP6_ECHO_REQUEST)
+ fc->tag_set = &mlx5dr_definer_icmp6_echo_request_dw1_set;
+ else /* RTE_FLOW_ITEM_TYPE_ICMP6_ECHO_REPLY */
+ fc->tag_set = &mlx5dr_definer_icmp6_echo_reply_dw1_set;
+ DR_CALC_SET_HDR(fc, tcp_icmp, icmp_dw1);
+ }
+
+ if (!m)
+ return 0;
+
+ /* Set identifier & sequence into icmp_dw2 */
+ if (m->echo.identifier || m->echo.sequence) {
+ fc = &cd->fc[MLX5DR_DEFINER_FNAME_ICMP_DW2];
+ fc->item_idx = item_idx;
+ fc->tag_set = &mlx5dr_definer_icmp6_echo_dw2_set;
+ DR_CALC_SET_HDR(fc, tcp_icmp, icmp_dw2);
+ }
+
+ return 0;
+}
+
static int
mlx5dr_definer_conv_item_meter_color(struct mlx5dr_definer_conv_data *cd,
struct rte_flow_item *item,
@@ -1615,6 +1698,11 @@ mlx5dr_definer_conv_items_to_hl(struct mlx5dr_context *ctx,
ret = mlx5dr_definer_conv_item_icmp6(&cd, items, i);
item_flags |= MLX5_FLOW_LAYER_ICMP6;
break;
+ case RTE_FLOW_ITEM_TYPE_ICMP6_ECHO_REQUEST:
+ case RTE_FLOW_ITEM_TYPE_ICMP6_ECHO_REPLY:
+ ret = mlx5dr_definer_conv_item_icmp6_echo(&cd, items, i);
+ item_flags |= MLX5_FLOW_LAYER_ICMP6;
+ break;
case RTE_FLOW_ITEM_TYPE_METER_COLOR:
ret = mlx5dr_definer_conv_item_meter_color(&cd, items, i);
item_flags |= MLX5_FLOW_ITEM_METER_COLOR;
@@ -536,16 +536,16 @@ struct mlx5_ifc_header_icmp_bits {
union {
u8 icmp_dw1[0x20];
struct {
- u8 cksum[0x10];
- u8 code[0x8];
u8 type[0x8];
+ u8 code[0x8];
+ u8 cksum[0x10];
};
};
union {
u8 icmp_dw2[0x20];
struct {
- u8 seq_nb[0x10];
u8 ident[0x10];
+ u8 seq_nb[0x10];
};
};
};