For tunnels with options, eg, geneve and vxlan with gbp, they share the
same way to compare the headers and options. Extract the code as a common
function for them
Change-Id: I3ea697293c8d5d66c0c20080dbde88f60bcbd62f
Signed-off-by: Gavin Li <gavinl@nvidia.com>
Reviewed-by: Roi Dayan <roid@nvidia.com>
Reviewed-by: Maor Dickman <maord@nvidia.com>
Acked-by: Saeed Mahameed <saeedm@nvidia.com>
---
.../ethernet/mellanox/mlx5/core/en/tc_tun.h | 3 ++
.../mellanox/mlx5/core/en/tc_tun_encap.c | 29 +++++++++++++++++++
.../mellanox/mlx5/core/en/tc_tun_geneve.c | 24 +--------------
3 files changed, 33 insertions(+), 23 deletions(-)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.h b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.h
index b38f693bbb52..92065568bb19 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.h
@@ -115,6 +115,9 @@ int mlx5e_tc_tun_parse_udp_ports(struct mlx5e_priv *priv,
bool mlx5e_tc_tun_encap_info_equal_generic(struct mlx5e_encap_key *a,
struct mlx5e_encap_key *b);
+bool mlx5e_tc_tun_encap_info_equal_options(struct mlx5e_encap_key *a,
+ struct mlx5e_encap_key *b,
+ __be16 tun_flags);
#endif /* CONFIG_MLX5_ESWITCH */
#endif //__MLX5_EN_TC_TUNNEL_H__
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.c b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.c
index 780224fd67a1..4df9d27a63ad 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.c
@@ -571,6 +571,35 @@ bool mlx5e_tc_tun_encap_info_equal_generic(struct mlx5e_encap_key *a,
a->tc_tunnel->tunnel_type == b->tc_tunnel->tunnel_type;
}
+bool mlx5e_tc_tun_encap_info_equal_options(struct mlx5e_encap_key *a,
+ struct mlx5e_encap_key *b,
+ __be16 tun_flags)
+{
+ struct ip_tunnel_info *a_info;
+ struct ip_tunnel_info *b_info;
+ bool a_has_opts, b_has_opts;
+
+ if (!mlx5e_tc_tun_encap_info_equal_generic(a, b))
+ return false;
+
+ a_has_opts = !!(a->ip_tun_key->tun_flags & tun_flags);
+ b_has_opts = !!(b->ip_tun_key->tun_flags & tun_flags);
+
+ /* keys are equal when both don't have any options attached */
+ if (!a_has_opts && !b_has_opts)
+ return true;
+
+ if (a_has_opts != b_has_opts)
+ return false;
+
+ /* options stored in memory next to ip_tunnel_info struct */
+ a_info = container_of(a->ip_tun_key, struct ip_tunnel_info, key);
+ b_info = container_of(b->ip_tun_key, struct ip_tunnel_info, key);
+
+ return a_info->options_len == b_info->options_len &&
+ memcmp(a_info + 1, b_info + 1, a_info->options_len) == 0;
+}
+
static int cmp_decap_info(struct mlx5e_decap_key *a,
struct mlx5e_decap_key *b)
{
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_geneve.c b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_geneve.c
index 054d80c4e65c..2bcd10b6d653 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_geneve.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_geneve.c
@@ -337,29 +337,7 @@ static int mlx5e_tc_tun_parse_geneve(struct mlx5e_priv *priv,
static bool mlx5e_tc_tun_encap_info_equal_geneve(struct mlx5e_encap_key *a,
struct mlx5e_encap_key *b)
{
- struct ip_tunnel_info *a_info;
- struct ip_tunnel_info *b_info;
- bool a_has_opts, b_has_opts;
-
- if (!mlx5e_tc_tun_encap_info_equal_generic(a, b))
- return false;
-
- a_has_opts = !!(a->ip_tun_key->tun_flags & TUNNEL_GENEVE_OPT);
- b_has_opts = !!(b->ip_tun_key->tun_flags & TUNNEL_GENEVE_OPT);
-
- /* keys are equal when both don't have any options attached */
- if (!a_has_opts && !b_has_opts)
- return true;
-
- if (a_has_opts != b_has_opts)
- return false;
-
- /* geneve options stored in memory next to ip_tunnel_info struct */
- a_info = container_of(a->ip_tun_key, struct ip_tunnel_info, key);
- b_info = container_of(b->ip_tun_key, struct ip_tunnel_info, key);
-
- return a_info->options_len == b_info->options_len &&
- memcmp(a_info + 1, b_info + 1, a_info->options_len) == 0;
+ return mlx5e_tc_tun_encap_info_equal_options(a, b, TUNNEL_GENEVE_OPT);
}
struct mlx5e_tc_tunnel geneve_tunnel = {
--
2.31.1
From: Gavin Li <gavinl@nvidia.com> Date: Tue, 14 Feb 2023 15:41:36 +0200 (dropping non-existent nikolay@nvidia.com) > For tunnels with options, eg, geneve and vxlan with gbp, they share the > same way to compare the headers and options. Extract the code as a common > function for them > > Change-Id: I3ea697293c8d5d66c0c20080dbde88f60bcbd62f > Signed-off-by: Gavin Li <gavinl@nvidia.com> > Reviewed-by: Roi Dayan <roid@nvidia.com> > Reviewed-by: Maor Dickman <maord@nvidia.com> > Acked-by: Saeed Mahameed <saeedm@nvidia.com> [...] > diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.c b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.c > index 780224fd67a1..4df9d27a63ad 100644 > --- a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.c > +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.c > @@ -571,6 +571,35 @@ bool mlx5e_tc_tun_encap_info_equal_generic(struct mlx5e_encap_key *a, > a->tc_tunnel->tunnel_type == b->tc_tunnel->tunnel_type; > } > > +bool mlx5e_tc_tun_encap_info_equal_options(struct mlx5e_encap_key *a, > + struct mlx5e_encap_key *b, > + __be16 tun_flags) > +{ > + struct ip_tunnel_info *a_info; > + struct ip_tunnel_info *b_info; > + bool a_has_opts, b_has_opts; > + > + if (!mlx5e_tc_tun_encap_info_equal_generic(a, b)) > + return false; > + > + a_has_opts = !!(a->ip_tun_key->tun_flags & tun_flags); > + b_has_opts = !!(b->ip_tun_key->tun_flags & tun_flags); > + > + /* keys are equal when both don't have any options attached */ > + if (!a_has_opts && !b_has_opts) > + return true; > + > + if (a_has_opts != b_has_opts) > + return false; > + > + /* options stored in memory next to ip_tunnel_info struct */ > + a_info = container_of(a->ip_tun_key, struct ip_tunnel_info, key); > + b_info = container_of(b->ip_tun_key, struct ip_tunnel_info, key); > + > + return a_info->options_len == b_info->options_len && > + memcmp(a_info + 1, b_info + 1, a_info->options_len) == 0; 1. memcmp() is not aligned to the first expr (off-by-one to the right). 2. `!expr` is preferred over `expr == 0`. > +} > + > static int cmp_decap_info(struct mlx5e_decap_key *a, > struct mlx5e_decap_key *b) > { [...] Thanks, Olek
On 2/14/2023 11:01 PM, Alexander Lobakin wrote: > External email: Use caution opening links or attachments > > > From: Gavin Li <gavinl@nvidia.com> > Date: Tue, 14 Feb 2023 15:41:36 +0200 > > (dropping non-existent nikolay@nvidia.com) > >> For tunnels with options, eg, geneve and vxlan with gbp, they share the >> same way to compare the headers and options. Extract the code as a common >> function for them >> >> Change-Id: I3ea697293c8d5d66c0c20080dbde88f60bcbd62f >> Signed-off-by: Gavin Li <gavinl@nvidia.com> >> Reviewed-by: Roi Dayan <roid@nvidia.com> >> Reviewed-by: Maor Dickman <maord@nvidia.com> >> Acked-by: Saeed Mahameed <saeedm@nvidia.com> > [...] > >> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.c b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.c >> index 780224fd67a1..4df9d27a63ad 100644 >> --- a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.c >> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.c >> @@ -571,6 +571,35 @@ bool mlx5e_tc_tun_encap_info_equal_generic(struct mlx5e_encap_key *a, >> a->tc_tunnel->tunnel_type == b->tc_tunnel->tunnel_type; >> } >> >> +bool mlx5e_tc_tun_encap_info_equal_options(struct mlx5e_encap_key *a, >> + struct mlx5e_encap_key *b, >> + __be16 tun_flags) >> +{ >> + struct ip_tunnel_info *a_info; >> + struct ip_tunnel_info *b_info; >> + bool a_has_opts, b_has_opts; >> + >> + if (!mlx5e_tc_tun_encap_info_equal_generic(a, b)) >> + return false; >> + >> + a_has_opts = !!(a->ip_tun_key->tun_flags & tun_flags); >> + b_has_opts = !!(b->ip_tun_key->tun_flags & tun_flags); >> + >> + /* keys are equal when both don't have any options attached */ >> + if (!a_has_opts && !b_has_opts) >> + return true; >> + >> + if (a_has_opts != b_has_opts) >> + return false; >> + >> + /* options stored in memory next to ip_tunnel_info struct */ >> + a_info = container_of(a->ip_tun_key, struct ip_tunnel_info, key); >> + b_info = container_of(b->ip_tun_key, struct ip_tunnel_info, key); >> + >> + return a_info->options_len == b_info->options_len && >> + memcmp(a_info + 1, b_info + 1, a_info->options_len) == 0; > 1. memcmp() is not aligned to the first expr (off-by-one to the right). Options start from "info + 1", see ip_tunnel_info_opts and will use it here to replace the "info+1". > 2. `!expr` is preferred over `expr == 0`. ACK > >> +} >> + >> static int cmp_decap_info(struct mlx5e_decap_key *a, >> struct mlx5e_decap_key *b) >> { > [...] > > Thanks, > Olek
From: Gavin Li <gavinl@nvidia.com> Date: Wed, 15 Feb 2023 10:54:12 +0800 > > On 2/14/2023 11:01 PM, Alexander Lobakin wrote: >> External email: Use caution opening links or attachments >> >> >> From: Gavin Li <gavinl@nvidia.com> >> Date: Tue, 14 Feb 2023 15:41:36 +0200 [...] >>> + if (a_has_opts != b_has_opts) >>> + return false; >>> + >>> + /* options stored in memory next to ip_tunnel_info struct */ >>> + a_info = container_of(a->ip_tun_key, struct ip_tunnel_info, key); >>> + b_info = container_of(b->ip_tun_key, struct ip_tunnel_info, key); >>> + >>> + return a_info->options_len == b_info->options_len && >>> + memcmp(a_info + 1, b_info + 1, a_info->options_len) == 0; >> 1. memcmp() is not aligned to the first expr (off-by-one to the right). > Options start from "info + 1", see ip_tunnel_info_opts and will use it > here to replace the "info+1". Nah, I mean the following. Your code: return a_info->options_len == b_info->options_len && memcmp(a_info + 1, b_info + 1, ... should be: return a_info->options_len == b_info->options_len && memcmp(a_info + 1, b_info + 1, ... 7 spaces instead of a tab to have it aligned to the prev line. >> 2. `!expr` is preferred over `expr == 0`. > ACK >> >>> +} >>> + >>> static int cmp_decap_info(struct mlx5e_decap_key *a, >>> struct mlx5e_decap_key *b) >>> { >> [...] >> >> Thanks, >> Olek Thanks, Olek
On 2/16/2023 12:56 AM, Alexander Lobakin wrote: > External email: Use caution opening links or attachments > > > From: Gavin Li <gavinl@nvidia.com> > Date: Wed, 15 Feb 2023 10:54:12 +0800 > >> On 2/14/2023 11:01 PM, Alexander Lobakin wrote: >>> External email: Use caution opening links or attachments >>> >>> >>> From: Gavin Li <gavinl@nvidia.com> >>> Date: Tue, 14 Feb 2023 15:41:36 +0200 > [...] > >>>> + if (a_has_opts != b_has_opts) >>>> + return false; >>>> + >>>> + /* options stored in memory next to ip_tunnel_info struct */ >>>> + a_info = container_of(a->ip_tun_key, struct ip_tunnel_info, key); >>>> + b_info = container_of(b->ip_tun_key, struct ip_tunnel_info, key); >>>> + >>>> + return a_info->options_len == b_info->options_len && >>>> + memcmp(a_info + 1, b_info + 1, a_info->options_len) == 0; >>> 1. memcmp() is not aligned to the first expr (off-by-one to the right). >> Options start from "info + 1", see ip_tunnel_info_opts and will use it >> here to replace the "info+1". > Nah, I mean the following. Your code: > > return a_info->options_len == b_info->options_len && > memcmp(a_info + 1, b_info + 1, ... > > should be: > > return a_info->options_len == b_info->options_len && > memcmp(a_info + 1, b_info + 1, ... > > 7 spaces instead of a tab to have it aligned to the prev line. ACK > >>> 2. `!expr` is preferred over `expr == 0`. >> ACK >>>> +} >>>> + >>>> static int cmp_decap_info(struct mlx5e_decap_key *a, >>>> struct mlx5e_decap_key *b) >>>> { >>> [...] >>> >>> Thanks, >>> Olek > Thanks, > Olek
© 2016 - 2025 Red Hat, Inc.