Hi Itamar & Erez, Typo: NA64 -> NAT64
BR. Bing > -----Original Message----- > From: Itamar Gozlan <igoz...@nvidia.com> > Sent: Tuesday, July 9, 2024 8:31 PM > To: Itamar Gozlan <igoz...@nvidia.com>; Erez Shitrit <ere...@nvidia.com>; > Hamdan Agbariya <hamd...@nvidia.com>; Yevgeny Kliteynik > <klit...@nvidia.com>; Alex Vesker <va...@nvidia.com>; Slava Ovsiienko > <viachesl...@nvidia.com>; NBU-Contact-Thomas Monjalon (EXTERNAL) > <tho...@monjalon.net>; Suanming Mou <suanmi...@nvidia.com>; Dariusz > Sosnowski <dsosnow...@nvidia.com>; Bing Zhao <bi...@nvidia.com>; Ori Kam > <or...@nvidia.com>; Matan Azrad <ma...@nvidia.com> > Cc: dev@dpdk.org; sta...@dpdk.org > Subject: [PATCH 8/8] net/mlx5/hws: fix NA64 copy TOS field instead of TTL > > From: Erez Shitrit <ere...@nvidia.com> > > We don't have enough registers to copy TTL and TOS, so we will set TTL to > be the default value (64) and will copy TOS. > > Fixes: 06d969a8c5b8 ("net/mlx5/hws: support NAT64 flow action") > Cc: ere...@nvidia.com > Cc: sta...@dpdk.org > > Signed-off-by: Erez Shitrit <ere...@nvidia.com> > Acked-by: Matan Azrad <ma...@nvidia.com> > --- > drivers/net/mlx5/hws/mlx5dr_action.c | 66 +++++++++++++++++++++++----- > drivers/net/mlx5/hws/mlx5dr_action.h | 2 + > 2 files changed, 56 insertions(+), 12 deletions(-) > > diff --git a/drivers/net/mlx5/hws/mlx5dr_action.c > b/drivers/net/mlx5/hws/mlx5dr_action.c > index 8d3d0033e5..8f6be37818 100644 > --- a/drivers/net/mlx5/hws/mlx5dr_action.c > +++ b/drivers/net/mlx5/hws/mlx5dr_action.c > @@ -315,21 +315,27 @@ mlx5dr_action_create_nat64_copy_state(struct > mlx5dr_context *ctx, > struct mlx5dr_action *action; > uint32_t packet_len_field; > uint8_t *action_ptr; > - uint32_t ttl_field; > + uint32_t tos_field; > + uint32_t tos_size; > uint32_t src_addr; > uint32_t dst_addr; > bool is_v4_to_v6; > + uint32_t ecn; > > is_v4_to_v6 = attr->flags & MLX5DR_ACTION_NAT64_V4_TO_V6; > > if (is_v4_to_v6) { > packet_len_field = MLX5_MODI_OUT_IPV4_TOTAL_LEN; > - ttl_field = MLX5_MODI_OUT_IPV4_TTL; > + tos_field = MLX5_MODI_OUT_IP_DSCP; > + tos_size = 6; > + ecn = MLX5_MODI_OUT_IP_ECN; > src_addr = MLX5_MODI_OUT_SIPV4; > dst_addr = MLX5_MODI_OUT_DIPV4; > } else { > packet_len_field = MLX5_MODI_OUT_IPV6_PAYLOAD_LEN; > - ttl_field = MLX5_MODI_OUT_IPV6_HOPLIMIT; > + tos_field = MLX5_MODI_OUT_IPV6_TRAFFIC_CLASS; > + tos_size = 8; > + ecn = 0; > src_addr = MLX5_MODI_OUT_SIPV6_31_0; > dst_addr = MLX5_MODI_OUT_DIPV6_31_0; > } > @@ -352,7 +358,7 @@ mlx5dr_action_create_nat64_copy_state(struct > mlx5dr_context *ctx, > } > > /* | 8 bit - 8 bit - 16 bit | > - * | ttl - protocol - packet-len | > + * | TOS - protocol - packet-len | > */ > MLX5_SET(copy_action_in, action_ptr, action_type, > MLX5_MODIFICATION_TYPE_COPY); > MLX5_SET(copy_action_in, action_ptr, src_field, packet_len_field); > @@ -377,12 +383,25 @@ mlx5dr_action_create_nat64_copy_state(struct > mlx5dr_context *ctx, > action_ptr += MLX5DR_ACTION_DOUBLE_SIZE; > > MLX5_SET(copy_action_in, action_ptr, action_type, > MLX5_MODIFICATION_TYPE_COPY); > - MLX5_SET(copy_action_in, action_ptr, src_field, ttl_field); > + MLX5_SET(copy_action_in, action_ptr, src_field, tos_field); > MLX5_SET(copy_action_in, action_ptr, dst_field, > attr->registers[MLX5DR_ACTION_NAT64_REG_CONTROL]); > MLX5_SET(copy_action_in, action_ptr, dst_offset, 24); > - MLX5_SET(copy_action_in, action_ptr, length, 8); > + MLX5_SET(copy_action_in, action_ptr, length, tos_size); > action_ptr += MLX5DR_ACTION_DOUBLE_SIZE; > + /* in ipv4 TOS = {dscp (6bits) - ecn (2bits) }*/ > + if (ecn) { > + MLX5_SET(copy_action_in, action_ptr, action_type, > MLX5_MODIFICATION_TYPE_NOP); > + action_ptr += MLX5DR_ACTION_DOUBLE_SIZE; > + > + MLX5_SET(copy_action_in, action_ptr, action_type, > MLX5_MODIFICATION_TYPE_COPY); > + MLX5_SET(copy_action_in, action_ptr, src_field, ecn); > + MLX5_SET(copy_action_in, action_ptr, dst_field, > + attr->registers[MLX5DR_ACTION_NAT64_REG_CONTROL]); > + MLX5_SET(copy_action_in, action_ptr, dst_offset, 24 + > tos_size); > + MLX5_SET(copy_action_in, action_ptr, length, > MLX5DR_ACTION_NAT64_ECN_SIZE); > + action_ptr += MLX5DR_ACTION_DOUBLE_SIZE; > + } > > /* set sip and dip to 0, in order to have new csum */ > mlx5dr_action_create_nat64_zero_all_addr(&action_ptr, is_v4_to_v6); > @@ -543,10 +562,13 @@ mlx5dr_action_create_nat64_copy_back_state(struct > mlx5dr_context *ctx, > uint32_t packet_len_field; > uint32_t packet_len_add; > uint8_t *action_ptr; > + uint32_t tos_field; > uint32_t ttl_field; > + uint32_t tos_size; > uint32_t src_addr; > uint32_t dst_addr; > bool is_v4_to_v6; > + uint32_t ecn; > > is_v4_to_v6 = attr->flags & MLX5DR_ACTION_NAT64_V4_TO_V6; > > @@ -557,6 +579,9 @@ mlx5dr_action_create_nat64_copy_back_state(struct > mlx5dr_context *ctx, > ttl_field = MLX5_MODI_OUT_IPV6_HOPLIMIT; > src_addr = MLX5_MODI_OUT_SIPV6_31_0; > dst_addr = MLX5_MODI_OUT_DIPV6_31_0; > + tos_field = MLX5_MODI_OUT_IPV6_TRAFFIC_CLASS; > + tos_size = 8; > + ecn = 0; > } else { > packet_len_field = MLX5_MODI_OUT_IPV4_TOTAL_LEN; > /* ipv4 len is including 20 bytes of the header, so add 20 > over ipv6 len */ @@ -564,6 +589,9 @@ > mlx5dr_action_create_nat64_copy_back_state(struct mlx5dr_context *ctx, > ttl_field = MLX5_MODI_OUT_IPV4_TTL; > src_addr = MLX5_MODI_OUT_SIPV4; > dst_addr = MLX5_MODI_OUT_DIPV4; > + tos_field = MLX5_MODI_OUT_IP_DSCP; > + tos_size = 6; > + ecn = MLX5_MODI_OUT_IP_ECN; > } > > memset(modify_action_data, 0, sizeof(modify_action_data)); @@ - > 578,20 +606,34 @@ mlx5dr_action_create_nat64_copy_back_state(struct > mlx5dr_context *ctx, > MLX5_SET(copy_action_in, action_ptr, length, 16); > action_ptr += MLX5DR_ACTION_DOUBLE_SIZE; > > - MLX5_SET(copy_action_in, action_ptr, action_type, > MLX5_MODIFICATION_TYPE_NOP); > - action_ptr += MLX5DR_ACTION_DOUBLE_SIZE; > - > - MLX5_SET(copy_action_in, action_ptr, action_type, > MLX5_MODIFICATION_TYPE_NOP); > + MLX5_SET(set_action_in, action_ptr, action_type, > MLX5_MODIFICATION_TYPE_SET); > + MLX5_SET(set_action_in, action_ptr, field, ttl_field); > + MLX5_SET(set_action_in, action_ptr, length, 8); > + MLX5_SET(set_action_in, action_ptr, data, > +MLX5DR_ACTION_NAT64_TTL_DEFAULT_VAL); > action_ptr += MLX5DR_ACTION_DOUBLE_SIZE; > > + /* copy TOS */ > MLX5_SET(copy_action_in, action_ptr, action_type, > MLX5_MODIFICATION_TYPE_COPY); > MLX5_SET(copy_action_in, action_ptr, src_field, > attr->registers[MLX5DR_ACTION_NAT64_REG_CONTROL]); > - MLX5_SET(copy_action_in, action_ptr, dst_field, ttl_field); > + MLX5_SET(copy_action_in, action_ptr, dst_field, tos_field); > MLX5_SET(copy_action_in, action_ptr, src_offset, 24); > - MLX5_SET(copy_action_in, action_ptr, length, 8); > + MLX5_SET(copy_action_in, action_ptr, length, tos_size); > action_ptr += MLX5DR_ACTION_DOUBLE_SIZE; > > + if (ecn) { > + MLX5_SET(copy_action_in, action_ptr, action_type, > MLX5_MODIFICATION_TYPE_NOP); > + action_ptr += MLX5DR_ACTION_DOUBLE_SIZE; > + > + MLX5_SET(copy_action_in, action_ptr, action_type, > MLX5_MODIFICATION_TYPE_COPY); > + MLX5_SET(copy_action_in, action_ptr, src_field, > + attr->registers[MLX5DR_ACTION_NAT64_REG_CONTROL]); > + MLX5_SET(copy_action_in, action_ptr, dst_field, ecn); > + MLX5_SET(copy_action_in, action_ptr, src_offset, 24 + > tos_size); > + MLX5_SET(copy_action_in, action_ptr, length, > MLX5DR_ACTION_NAT64_ECN_SIZE); > + action_ptr += MLX5DR_ACTION_DOUBLE_SIZE; > + } > + > MLX5_SET(copy_action_in, action_ptr, action_type, > MLX5_MODIFICATION_TYPE_NOP); > action_ptr += MLX5DR_ACTION_DOUBLE_SIZE; > > diff --git a/drivers/net/mlx5/hws/mlx5dr_action.h > b/drivers/net/mlx5/hws/mlx5dr_action.h > index faea6bb1f4..ba4ce55228 100644 > --- a/drivers/net/mlx5/hws/mlx5dr_action.h > +++ b/drivers/net/mlx5/hws/mlx5dr_action.h > @@ -79,6 +79,8 @@ enum { > MLX5DR_ACTION_NAT64_IPV4_HEADER = 5, > MLX5DR_ACTION_NAT64_IPV6_VER = 0x60000000, > MLX5DR_ACTION_NAT64_IPV4_VER = 0x45000000, > + MLX5DR_ACTION_NAT64_TTL_DEFAULT_VAL = 64, > + MLX5DR_ACTION_NAT64_ECN_SIZE = 2, > }; > > /* 3 stages for the nat64 action */ > -- > 2.39.3