Message ID | 1557167317-50202-1-git-send-email-xiangxia.m.yue@gmail.com |
---|---|
State | Awaiting Upstream |
Delegated to: | David Miller |
Headers | show |
Series | net/mlx5e: Allow matching only enc_key_id/enc_dst_port for decapsulation action | expand |
On 06/05/2019 21:28, xiangxia.m.yue@gmail.com wrote: > From: Tonghao Zhang <xiangxia.m.yue@gmail.com> > > In some case, we don't care the enc_src_ip and enc_dst_ip, and > if we don't match the field enc_src_ip and enc_dst_ip, we can use > fewer flows in hardware when revice the tunnel packets. For example, > the tunnel packets may be sent from different hosts, we must offload > one rule for each host. > > $ tc filter add dev vxlan0 protocol ip parent ffff: prio 1 \ > flower dst_mac 00:11:22:33:44:00 \ > enc_src_ip Host0_IP enc_dst_ip 2.2.2.100 \ > enc_dst_port 4789 enc_key_id 100 \ > action tunnel_key unset action mirred egress redirect dev eth0_1 > > $ tc filter add dev vxlan0 protocol ip parent ffff: prio 1 \ > flower dst_mac 00:11:22:33:44:00 \ > enc_src_ip Host1_IP enc_dst_ip 2.2.2.100 \ > enc_dst_port 4789 enc_key_id 100 \ > action tunnel_key unset action mirred egress redirect dev eth0_1 > > If we support flows which only match the enc_key_id and enc_dst_port, > a flow can process the packets sent to VM which (mac 00:11:22:33:44:00). > > $ tc filter add dev vxlan0 protocol ip parent ffff: prio 1 \ > flower dst_mac 00:11:22:33:44:00 \ > enc_dst_port 4789 enc_key_id 100 \ > action tunnel_key unset action mirred egress redirect dev eth0_1 > > Signed-off-by: Tonghao Zhang <xiangxia.m.yue@gmail.com> > --- > drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 27 +++++++------------------ > 1 file changed, 7 insertions(+), 20 deletions(-) > > diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c > index 122f457..91e4db1 100644 > --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c > +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c > @@ -1339,7 +1339,6 @@ static int parse_tunnel_attr(struct mlx5e_priv *priv, > void *headers_v = MLX5_ADDR_OF(fte_match_param, spec->match_value, > outer_headers); > struct flow_rule *rule = tc_cls_flower_offload_flow_rule(f); > - struct flow_match_control enc_control; > int err; > > err = mlx5e_tc_tun_parse(filter_dev, priv, spec, f, > @@ -1350,9 +1349,7 @@ static int parse_tunnel_attr(struct mlx5e_priv *priv, > return err; > } > > - flow_rule_match_enc_control(rule, &enc_control); > - > - if (enc_control.key->addr_type == FLOW_DISSECTOR_KEY_IPV4_ADDRS) { > + if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS)) { > struct flow_match_ipv4_addrs match; > > flow_rule_match_enc_ipv4_addrs(rule, &match); > @@ -1372,7 +1369,7 @@ static int parse_tunnel_attr(struct mlx5e_priv *priv, > > MLX5_SET_TO_ONES(fte_match_set_lyr_2_4, headers_c, ethertype); > MLX5_SET(fte_match_set_lyr_2_4, headers_v, ethertype, ETH_P_IP); > - } else if (enc_control.key->addr_type == FLOW_DISSECTOR_KEY_IPV6_ADDRS) { > + } else if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS)) { > struct flow_match_ipv6_addrs match; > > flow_rule_match_enc_ipv6_addrs(rule, &match); > @@ -1504,22 +1501,12 @@ static int __parse_cls_flower(struct mlx5e_priv *priv, > return -EOPNOTSUPP; > } > > - if ((flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS) || > - flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_KEYID) || > - flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_PORTS)) && > - flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_CONTROL)) { > - struct flow_match_control match; > - > - flow_rule_match_enc_control(rule, &match); > - switch (match.key->addr_type) { > - case FLOW_DISSECTOR_KEY_IPV4_ADDRS: > - case FLOW_DISSECTOR_KEY_IPV6_ADDRS: > - if (parse_tunnel_attr(priv, spec, f, filter_dev, tunnel_match_level)) > - return -EOPNOTSUPP; > - break; > - default: > + if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS) || > + flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS) || > + flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_KEYID) || > + flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_PORTS)) { > + if (parse_tunnel_attr(priv, spec, f, filter_dev, tunnel_match_level)) > return -EOPNOTSUPP; > - } > > /* In decap flow, header pointers should point to the inner > * headers, outer header were already set by parse_tunnel_attr > Reviewed-by: Roi Dayan <roid@mellanox.com>
On Sun, May 12, 2019 at 5:08 PM Roi Dayan <roid@mellanox.com> wrote: > > > > On 06/05/2019 21:28, xiangxia.m.yue@gmail.com wrote: > > From: Tonghao Zhang <xiangxia.m.yue@gmail.com> > > > > In some case, we don't care the enc_src_ip and enc_dst_ip, and > > if we don't match the field enc_src_ip and enc_dst_ip, we can use > > fewer flows in hardware when revice the tunnel packets. For example, > > the tunnel packets may be sent from different hosts, we must offload > > one rule for each host. > > > > $ tc filter add dev vxlan0 protocol ip parent ffff: prio 1 \ > > flower dst_mac 00:11:22:33:44:00 \ > > enc_src_ip Host0_IP enc_dst_ip 2.2.2.100 \ > > enc_dst_port 4789 enc_key_id 100 \ > > action tunnel_key unset action mirred egress redirect dev eth0_1 > > > > $ tc filter add dev vxlan0 protocol ip parent ffff: prio 1 \ > > flower dst_mac 00:11:22:33:44:00 \ > > enc_src_ip Host1_IP enc_dst_ip 2.2.2.100 \ > > enc_dst_port 4789 enc_key_id 100 \ > > action tunnel_key unset action mirred egress redirect dev eth0_1 > > > > If we support flows which only match the enc_key_id and enc_dst_port, > > a flow can process the packets sent to VM which (mac 00:11:22:33:44:00). > > > > $ tc filter add dev vxlan0 protocol ip parent ffff: prio 1 \ > > flower dst_mac 00:11:22:33:44:00 \ > > enc_dst_port 4789 enc_key_id 100 \ > > action tunnel_key unset action mirred egress redirect dev eth0_1 > > > > Signed-off-by: Tonghao Zhang <xiangxia.m.yue@gmail.com> > > --- > > drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 27 +++++++------------------ > > 1 file changed, 7 insertions(+), 20 deletions(-) > > > > diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c > > index 122f457..91e4db1 100644 > > --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c > > +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c > > @@ -1339,7 +1339,6 @@ static int parse_tunnel_attr(struct mlx5e_priv *priv, > > void *headers_v = MLX5_ADDR_OF(fte_match_param, spec->match_value, > > outer_headers); > > struct flow_rule *rule = tc_cls_flower_offload_flow_rule(f); > > - struct flow_match_control enc_control; > > int err; > > > > err = mlx5e_tc_tun_parse(filter_dev, priv, spec, f, > > @@ -1350,9 +1349,7 @@ static int parse_tunnel_attr(struct mlx5e_priv *priv, > > return err; > > } > > > > - flow_rule_match_enc_control(rule, &enc_control); > > - > > - if (enc_control.key->addr_type == FLOW_DISSECTOR_KEY_IPV4_ADDRS) { > > + if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS)) { > > struct flow_match_ipv4_addrs match; > > > > flow_rule_match_enc_ipv4_addrs(rule, &match); > > @@ -1372,7 +1369,7 @@ static int parse_tunnel_attr(struct mlx5e_priv *priv, > > > > MLX5_SET_TO_ONES(fte_match_set_lyr_2_4, headers_c, ethertype); > > MLX5_SET(fte_match_set_lyr_2_4, headers_v, ethertype, ETH_P_IP); > > - } else if (enc_control.key->addr_type == FLOW_DISSECTOR_KEY_IPV6_ADDRS) { > > + } else if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS)) { > > struct flow_match_ipv6_addrs match; > > > > flow_rule_match_enc_ipv6_addrs(rule, &match); > > @@ -1504,22 +1501,12 @@ static int __parse_cls_flower(struct mlx5e_priv *priv, > > return -EOPNOTSUPP; > > } > > > > - if ((flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS) || > > - flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_KEYID) || > > - flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_PORTS)) && > > - flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_CONTROL)) { > > - struct flow_match_control match; > > - > > - flow_rule_match_enc_control(rule, &match); > > - switch (match.key->addr_type) { > > - case FLOW_DISSECTOR_KEY_IPV4_ADDRS: > > - case FLOW_DISSECTOR_KEY_IPV6_ADDRS: > > - if (parse_tunnel_attr(priv, spec, f, filter_dev, tunnel_match_level)) > > - return -EOPNOTSUPP; > > - break; > > - default: > > + if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS) || > > + flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS) || > > + flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_KEYID) || > > + flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_PORTS)) { > > + if (parse_tunnel_attr(priv, spec, f, filter_dev, tunnel_match_level)) > > return -EOPNOTSUPP; > > - } > > > > /* In decap flow, header pointers should point to the inner > > * headers, outer header were already set by parse_tunnel_attr > > > > > Reviewed-by: Roi Dayan <roid@mellanox.com> Hi Saeed, this patch is ready, will be applied ?
On Fri, 2019-05-24 at 18:54 +0800, Tonghao Zhang wrote: > On Sun, May 12, 2019 at 5:08 PM Roi Dayan <roid@mellanox.com> wrote: > > > > > > On 06/05/2019 21:28, xiangxia.m.yue@gmail.com wrote: > > > From: Tonghao Zhang <xiangxia.m.yue@gmail.com> > > > > > > In some case, we don't care the enc_src_ip and enc_dst_ip, and > > > if we don't match the field enc_src_ip and enc_dst_ip, we can use > > > fewer flows in hardware when revice the tunnel packets. For > > > example, > > > the tunnel packets may be sent from different hosts, we must > > > offload > > > one rule for each host. > > > > > > $ tc filter add dev vxlan0 protocol ip parent ffff: prio 1 > > > \ > > > flower dst_mac 00:11:22:33:44:00 \ > > > enc_src_ip Host0_IP enc_dst_ip 2.2.2.100 \ > > > enc_dst_port 4789 enc_key_id 100 \ > > > action tunnel_key unset action mirred egress > > > redirect dev eth0_1 > > > > > > $ tc filter add dev vxlan0 protocol ip parent ffff: prio 1 > > > \ > > > flower dst_mac 00:11:22:33:44:00 \ > > > enc_src_ip Host1_IP enc_dst_ip 2.2.2.100 \ > > > enc_dst_port 4789 enc_key_id 100 \ > > > action tunnel_key unset action mirred egress > > > redirect dev eth0_1 > > > > > > If we support flows which only match the enc_key_id and > > > enc_dst_port, > > > a flow can process the packets sent to VM which (mac > > > 00:11:22:33:44:00). > > > > > > $ tc filter add dev vxlan0 protocol ip parent ffff: prio 1 > > > \ > > > flower dst_mac 00:11:22:33:44:00 \ > > > enc_dst_port 4789 enc_key_id 100 \ > > > action tunnel_key unset action mirred egress > > > redirect dev eth0_1 > > > > > > Signed-off-by: Tonghao Zhang <xiangxia.m.yue@gmail.com> > > > --- > > > drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 27 +++++++-- > > > ---------------- > > > 1 file changed, 7 insertions(+), 20 deletions(-) > > > > > > diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c > > > b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c > > > index 122f457..91e4db1 100644 > > > --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c > > > +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c > > > @@ -1339,7 +1339,6 @@ static int parse_tunnel_attr(struct > > > mlx5e_priv *priv, > > > void *headers_v = MLX5_ADDR_OF(fte_match_param, spec- > > > >match_value, > > > outer_headers); > > > struct flow_rule *rule = > > > tc_cls_flower_offload_flow_rule(f); > > > - struct flow_match_control enc_control; > > > int err; > > > > > > err = mlx5e_tc_tun_parse(filter_dev, priv, spec, f, > > > @@ -1350,9 +1349,7 @@ static int parse_tunnel_attr(struct > > > mlx5e_priv *priv, > > > return err; > > > } > > > > > > - flow_rule_match_enc_control(rule, &enc_control); > > > - > > > - if (enc_control.key->addr_type == > > > FLOW_DISSECTOR_KEY_IPV4_ADDRS) { > > > + if (flow_rule_match_key(rule, > > > FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS)) { > > > struct flow_match_ipv4_addrs match; > > > > > > flow_rule_match_enc_ipv4_addrs(rule, &match); > > > @@ -1372,7 +1369,7 @@ static int parse_tunnel_attr(struct > > > mlx5e_priv *priv, > > > > > > MLX5_SET_TO_ONES(fte_match_set_lyr_2_4, headers_c, > > > ethertype); > > > MLX5_SET(fte_match_set_lyr_2_4, headers_v, > > > ethertype, ETH_P_IP); > > > - } else if (enc_control.key->addr_type == > > > FLOW_DISSECTOR_KEY_IPV6_ADDRS) { > > > + } else if (flow_rule_match_key(rule, > > > FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS)) { > > > struct flow_match_ipv6_addrs match; > > > > > > flow_rule_match_enc_ipv6_addrs(rule, &match); > > > @@ -1504,22 +1501,12 @@ static int __parse_cls_flower(struct > > > mlx5e_priv *priv, > > > return -EOPNOTSUPP; > > > } > > > > > > - if ((flow_rule_match_key(rule, > > > FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS) || > > > - flow_rule_match_key(rule, > > > FLOW_DISSECTOR_KEY_ENC_KEYID) || > > > - flow_rule_match_key(rule, > > > FLOW_DISSECTOR_KEY_ENC_PORTS)) && > > > - flow_rule_match_key(rule, > > > FLOW_DISSECTOR_KEY_ENC_CONTROL)) { > > > - struct flow_match_control match; > > > - > > > - flow_rule_match_enc_control(rule, &match); > > > - switch (match.key->addr_type) { > > > - case FLOW_DISSECTOR_KEY_IPV4_ADDRS: > > > - case FLOW_DISSECTOR_KEY_IPV6_ADDRS: > > > - if (parse_tunnel_attr(priv, spec, f, > > > filter_dev, tunnel_match_level)) > > > - return -EOPNOTSUPP; > > > - break; > > > - default: > > > + if (flow_rule_match_key(rule, > > > FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS) || > > > + flow_rule_match_key(rule, > > > FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS) || > > > + flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_KEYID) > > > || > > > + flow_rule_match_key(rule, > > > FLOW_DISSECTOR_KEY_ENC_PORTS)) { > > > + if (parse_tunnel_attr(priv, spec, f, filter_dev, > > > tunnel_match_level)) > > > return -EOPNOTSUPP; > > > - } > > > > > > /* In decap flow, header pointers should point to > > > the inner > > > * headers, outer header were already set by > > > parse_tunnel_attr > > > > > > > Reviewed-by: Roi Dayan <roid@mellanox.com> > Hi Saeed, > this patch is ready, will be applied ? Hi Tonghao, sorry for the delay, there is some conflict with an internal patch in my tree. I will resolve it soon and apply your patch, will let you know. Thanks, Saeed.
On Thu, 2019-05-30 at 19:36 +0000, Saeed Mahameed wrote: > On Fri, 2019-05-24 at 18:54 +0800, Tonghao Zhang wrote: > > On Sun, May 12, 2019 at 5:08 PM Roi Dayan <roid@mellanox.com> > > wrote: > > > > > > On 06/05/2019 21:28, xiangxia.m.yue@gmail.com wrote: > > > > From: Tonghao Zhang <xiangxia.m.yue@gmail.com> > > > > > > > > In some case, we don't care the enc_src_ip and enc_dst_ip, and > > > > if we don't match the field enc_src_ip and enc_dst_ip, we can > > > > use > > > > fewer flows in hardware when revice the tunnel packets. For > > > > example, > > > > the tunnel packets may be sent from different hosts, we must > > > > offload > > > > one rule for each host. > > > > > > > > $ tc filter add dev vxlan0 protocol ip parent ffff: prio > > > > 1 > > > > \ > > > > flower dst_mac 00:11:22:33:44:00 \ > > > > enc_src_ip Host0_IP enc_dst_ip 2.2.2.100 \ > > > > enc_dst_port 4789 enc_key_id 100 \ > > > > action tunnel_key unset action mirred egress > > > > redirect dev eth0_1 > > > > > > > > $ tc filter add dev vxlan0 protocol ip parent ffff: prio > > > > 1 > > > > \ > > > > flower dst_mac 00:11:22:33:44:00 \ > > > > enc_src_ip Host1_IP enc_dst_ip 2.2.2.100 \ > > > > enc_dst_port 4789 enc_key_id 100 \ > > > > action tunnel_key unset action mirred egress > > > > redirect dev eth0_1 > > > > > > > > If we support flows which only match the enc_key_id and > > > > enc_dst_port, > > > > a flow can process the packets sent to VM which (mac > > > > 00:11:22:33:44:00). > > > > > > > > $ tc filter add dev vxlan0 protocol ip parent ffff: prio > > > > 1 > > > > \ > > > > flower dst_mac 00:11:22:33:44:00 \ > > > > enc_dst_port 4789 enc_key_id 100 \ > > > > action tunnel_key unset action mirred egress > > > > redirect dev eth0_1 > > > > > > > > Signed-off-by: Tonghao Zhang <xiangxia.m.yue@gmail.com> > > > > --- > > > > drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 27 +++++++-- > > > > ---------------- > > > > 1 file changed, 7 insertions(+), 20 deletions(-) > > > > > > > > diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c > > > > b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c > > > > index 122f457..91e4db1 100644 > > > > --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c > > > > +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c > > > > @@ -1339,7 +1339,6 @@ static int parse_tunnel_attr(struct > > > > mlx5e_priv *priv, > > > > void *headers_v = MLX5_ADDR_OF(fte_match_param, spec- > > > > > match_value, > > > > outer_headers); > > > > struct flow_rule *rule = > > > > tc_cls_flower_offload_flow_rule(f); > > > > - struct flow_match_control enc_control; > > > > int err; > > > > > > > > err = mlx5e_tc_tun_parse(filter_dev, priv, spec, f, > > > > @@ -1350,9 +1349,7 @@ static int parse_tunnel_attr(struct > > > > mlx5e_priv *priv, > > > > return err; > > > > } > > > > > > > > - flow_rule_match_enc_control(rule, &enc_control); > > > > - > > > > - if (enc_control.key->addr_type == > > > > FLOW_DISSECTOR_KEY_IPV4_ADDRS) { > > > > + if (flow_rule_match_key(rule, > > > > FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS)) { > > > > struct flow_match_ipv4_addrs match; > > > > > > > > flow_rule_match_enc_ipv4_addrs(rule, &match); > > > > @@ -1372,7 +1369,7 @@ static int parse_tunnel_attr(struct > > > > mlx5e_priv *priv, > > > > > > > > MLX5_SET_TO_ONES(fte_match_set_lyr_2_4, > > > > headers_c, > > > > ethertype); > > > > MLX5_SET(fte_match_set_lyr_2_4, headers_v, > > > > ethertype, ETH_P_IP); > > > > - } else if (enc_control.key->addr_type == > > > > FLOW_DISSECTOR_KEY_IPV6_ADDRS) { > > > > + } else if (flow_rule_match_key(rule, > > > > FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS)) { > > > > struct flow_match_ipv6_addrs match; > > > > > > > > flow_rule_match_enc_ipv6_addrs(rule, &match); > > > > @@ -1504,22 +1501,12 @@ static int __parse_cls_flower(struct > > > > mlx5e_priv *priv, > > > > return -EOPNOTSUPP; > > > > } > > > > > > > > - if ((flow_rule_match_key(rule, > > > > FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS) || > > > > - flow_rule_match_key(rule, > > > > FLOW_DISSECTOR_KEY_ENC_KEYID) || > > > > - flow_rule_match_key(rule, > > > > FLOW_DISSECTOR_KEY_ENC_PORTS)) && > > > > - flow_rule_match_key(rule, > > > > FLOW_DISSECTOR_KEY_ENC_CONTROL)) { > > > > - struct flow_match_control match; > > > > - > > > > - flow_rule_match_enc_control(rule, &match); > > > > - switch (match.key->addr_type) { > > > > - case FLOW_DISSECTOR_KEY_IPV4_ADDRS: > > > > - case FLOW_DISSECTOR_KEY_IPV6_ADDRS: > > > > - if (parse_tunnel_attr(priv, spec, f, > > > > filter_dev, tunnel_match_level)) > > > > - return -EOPNOTSUPP; > > > > - break; > > > > - default: > > > > + if (flow_rule_match_key(rule, > > > > FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS) || > > > > + flow_rule_match_key(rule, > > > > FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS) || > > > > + flow_rule_match_key(rule, > > > > FLOW_DISSECTOR_KEY_ENC_KEYID) > > > > + flow_rule_match_key(rule, > > > > FLOW_DISSECTOR_KEY_ENC_PORTS)) { > > > > + if (parse_tunnel_attr(priv, spec, f, filter_dev, > > > > tunnel_match_level)) > > > > return -EOPNOTSUPP; > > > > - } > > > > > > > > /* In decap flow, header pointers should point to > > > > the inner > > > > * headers, outer header were already set by > > > > parse_tunnel_attr > > > > > > > > > > Reviewed-by: Roi Dayan <roid@mellanox.com> > > Hi Saeed, > > this patch is ready, will be applied ? > > Hi Tonghao, > sorry for the delay, there is some conflict with an internal patch in > my tree. > I will resolve it soon and apply your patch, will let you know. > Applied to net-next-mlx5, will be sent later today to net-next. Thanks!
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c index 122f457..91e4db1 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c @@ -1339,7 +1339,6 @@ static int parse_tunnel_attr(struct mlx5e_priv *priv, void *headers_v = MLX5_ADDR_OF(fte_match_param, spec->match_value, outer_headers); struct flow_rule *rule = tc_cls_flower_offload_flow_rule(f); - struct flow_match_control enc_control; int err; err = mlx5e_tc_tun_parse(filter_dev, priv, spec, f, @@ -1350,9 +1349,7 @@ static int parse_tunnel_attr(struct mlx5e_priv *priv, return err; } - flow_rule_match_enc_control(rule, &enc_control); - - if (enc_control.key->addr_type == FLOW_DISSECTOR_KEY_IPV4_ADDRS) { + if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS)) { struct flow_match_ipv4_addrs match; flow_rule_match_enc_ipv4_addrs(rule, &match); @@ -1372,7 +1369,7 @@ static int parse_tunnel_attr(struct mlx5e_priv *priv, MLX5_SET_TO_ONES(fte_match_set_lyr_2_4, headers_c, ethertype); MLX5_SET(fte_match_set_lyr_2_4, headers_v, ethertype, ETH_P_IP); - } else if (enc_control.key->addr_type == FLOW_DISSECTOR_KEY_IPV6_ADDRS) { + } else if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS)) { struct flow_match_ipv6_addrs match; flow_rule_match_enc_ipv6_addrs(rule, &match); @@ -1504,22 +1501,12 @@ static int __parse_cls_flower(struct mlx5e_priv *priv, return -EOPNOTSUPP; } - if ((flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS) || - flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_KEYID) || - flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_PORTS)) && - flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_CONTROL)) { - struct flow_match_control match; - - flow_rule_match_enc_control(rule, &match); - switch (match.key->addr_type) { - case FLOW_DISSECTOR_KEY_IPV4_ADDRS: - case FLOW_DISSECTOR_KEY_IPV6_ADDRS: - if (parse_tunnel_attr(priv, spec, f, filter_dev, tunnel_match_level)) - return -EOPNOTSUPP; - break; - default: + if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS) || + flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS) || + flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_KEYID) || + flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_PORTS)) { + if (parse_tunnel_attr(priv, spec, f, filter_dev, tunnel_match_level)) return -EOPNOTSUPP; - } /* In decap flow, header pointers should point to the inner * headers, outer header were already set by parse_tunnel_attr