mirror of
https://github.com/ukui/kernel.git
synced 2026-03-09 10:07:04 -07:00
net/mlx5e: CT: Introduce connection tracking
Add support for offloading tc ct action and ct matches.
We translate the tc filter with CT action the following HW model:
+-------------------+ +--------------------+ +--------------+
+ pre_ct (tc chain) +----->+ CT (nat or no nat) +--->+ post_ct +----->
+ original match + | + tuple + zone match + | + fte_id match + |
+-------------------+ | +--------------------+ | +--------------+ |
v v v
set chain miss mapping set mark original
set fte_id set label filter
set zone set established actions
set tunnel_id do nat (if needed)
do decap
Signed-off-by: Paul Blakey <paulb@mellanox.com>
Reviewed-by: Oz Shlomo <ozsh@mellanox.com>
Reviewed-by: Roi Dayan <roid@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
ee1c45e875
commit
4c3844d9e9
@@ -78,6 +78,16 @@ config MLX5_ESWITCH
|
||||
Legacy SRIOV mode (L2 mac vlan steering based).
|
||||
Switchdev mode (eswitch offloads).
|
||||
|
||||
config MLX5_TC_CT
|
||||
bool "MLX5 TC connection tracking offload support"
|
||||
depends on MLX5_CORE_EN && NET_SWITCHDEV && NF_FLOW_TABLE && NET_ACT_CT && NET_TC_SKB_EXT
|
||||
default y
|
||||
help
|
||||
Say Y here if you want to support offloading connection tracking rules
|
||||
via tc ct action.
|
||||
|
||||
If unsure, set to Y
|
||||
|
||||
config MLX5_CORE_EN_DCB
|
||||
bool "Data Center Bridging (DCB) Support"
|
||||
default y
|
||||
|
||||
@@ -37,6 +37,7 @@ mlx5_core-$(CONFIG_MLX5_ESWITCH) += en_rep.o en_tc.o en/tc_tun.o lib/port_tu
|
||||
lib/geneve.o en/mapping.o en/tc_tun_vxlan.o en/tc_tun_gre.o \
|
||||
en/tc_tun_geneve.o diag/en_tc_tracepoint.o
|
||||
mlx5_core-$(CONFIG_PCI_HYPERV_INTERFACE) += en/hv_vhca_stats.o
|
||||
mlx5_core-$(CONFIG_MLX5_TC_CT) += en/tc_ct.o
|
||||
|
||||
#
|
||||
# Core extra
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,140 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
|
||||
/* Copyright (c) 2018 Mellanox Technologies. */
|
||||
|
||||
#ifndef __MLX5_EN_TC_CT_H__
|
||||
#define __MLX5_EN_TC_CT_H__
|
||||
|
||||
#include <net/pkt_cls.h>
|
||||
#include <linux/mlx5/fs.h>
|
||||
#include <net/tc_act/tc_ct.h>
|
||||
|
||||
struct mlx5_esw_flow_attr;
|
||||
struct mlx5_rep_uplink_priv;
|
||||
struct mlx5e_tc_flow;
|
||||
struct mlx5e_priv;
|
||||
|
||||
struct mlx5_ct_flow;
|
||||
|
||||
struct mlx5_ct_attr {
|
||||
u16 zone;
|
||||
u16 ct_action;
|
||||
struct mlx5_ct_flow *ct_flow;
|
||||
};
|
||||
|
||||
#define zone_to_reg_ct {\
|
||||
.mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_2,\
|
||||
.moffset = 0,\
|
||||
.mlen = 2,\
|
||||
.soffset = MLX5_BYTE_OFF(fte_match_param,\
|
||||
misc_parameters_2.metadata_reg_c_2) + 2,\
|
||||
}
|
||||
|
||||
#define ctstate_to_reg_ct {\
|
||||
.mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_2,\
|
||||
.moffset = 2,\
|
||||
.mlen = 2,\
|
||||
.soffset = MLX5_BYTE_OFF(fte_match_param,\
|
||||
misc_parameters_2.metadata_reg_c_2),\
|
||||
}
|
||||
|
||||
#define mark_to_reg_ct {\
|
||||
.mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_3,\
|
||||
.moffset = 0,\
|
||||
.mlen = 4,\
|
||||
.soffset = MLX5_BYTE_OFF(fte_match_param,\
|
||||
misc_parameters_2.metadata_reg_c_3),\
|
||||
}
|
||||
|
||||
#define labels_to_reg_ct {\
|
||||
.mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_4,\
|
||||
.moffset = 0,\
|
||||
.mlen = 4,\
|
||||
.soffset = MLX5_BYTE_OFF(fte_match_param,\
|
||||
misc_parameters_2.metadata_reg_c_4),\
|
||||
}
|
||||
|
||||
#define fteid_to_reg_ct {\
|
||||
.mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_5,\
|
||||
.moffset = 0,\
|
||||
.mlen = 4,\
|
||||
.soffset = MLX5_BYTE_OFF(fte_match_param,\
|
||||
misc_parameters_2.metadata_reg_c_5),\
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_MLX5_TC_CT)
|
||||
|
||||
int
|
||||
mlx5_tc_ct_init(struct mlx5_rep_uplink_priv *uplink_priv);
|
||||
void
|
||||
mlx5_tc_ct_clean(struct mlx5_rep_uplink_priv *uplink_priv);
|
||||
|
||||
int
|
||||
mlx5_tc_ct_parse_match(struct mlx5e_priv *priv,
|
||||
struct mlx5_flow_spec *spec,
|
||||
struct flow_cls_offload *f,
|
||||
struct netlink_ext_ack *extack);
|
||||
int
|
||||
mlx5_tc_ct_parse_action(struct mlx5e_priv *priv,
|
||||
struct mlx5_esw_flow_attr *attr,
|
||||
const struct flow_action_entry *act,
|
||||
struct netlink_ext_ack *extack);
|
||||
|
||||
struct mlx5_flow_handle *
|
||||
mlx5_tc_ct_flow_offload(struct mlx5e_priv *priv,
|
||||
struct mlx5e_tc_flow *flow,
|
||||
struct mlx5_flow_spec *spec,
|
||||
struct mlx5_esw_flow_attr *attr);
|
||||
void
|
||||
mlx5_tc_ct_delete_flow(struct mlx5e_priv *priv,
|
||||
struct mlx5e_tc_flow *flow,
|
||||
struct mlx5_esw_flow_attr *attr);
|
||||
|
||||
#else /* CONFIG_MLX5_TC_CT */
|
||||
|
||||
static inline int
|
||||
mlx5_tc_ct_init(struct mlx5_rep_uplink_priv *uplink_priv)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void
|
||||
mlx5_tc_ct_clean(struct mlx5_rep_uplink_priv *uplink_priv)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int
|
||||
mlx5_tc_ct_parse_match(struct mlx5e_priv *priv,
|
||||
struct mlx5_flow_spec *spec,
|
||||
struct flow_cls_offload *f,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int
|
||||
mlx5_tc_ct_parse_action(struct mlx5e_priv *priv,
|
||||
struct mlx5_esw_flow_attr *attr,
|
||||
const struct flow_action_entry *act,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline struct mlx5_flow_handle *
|
||||
mlx5_tc_ct_flow_offload(struct mlx5e_priv *priv,
|
||||
struct mlx5e_tc_flow *flow,
|
||||
struct mlx5_flow_spec *spec,
|
||||
struct mlx5_esw_flow_attr *attr)
|
||||
{
|
||||
return ERR_PTR(-EOPNOTSUPP);
|
||||
}
|
||||
|
||||
static inline void
|
||||
mlx5_tc_ct_delete_flow(struct mlx5e_priv *priv,
|
||||
struct mlx5e_tc_flow *flow,
|
||||
struct mlx5_esw_flow_attr *attr)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* !IS_ENABLED(CONFIG_MLX5_TC_CT) */
|
||||
#endif /* __MLX5_EN_TC_CT_H__ */
|
||||
@@ -55,6 +55,7 @@ struct mlx5e_neigh_update_table {
|
||||
unsigned long min_interval; /* jiffies */
|
||||
};
|
||||
|
||||
struct mlx5_tc_ct_priv;
|
||||
struct mlx5_rep_uplink_priv {
|
||||
/* Filters DB - instantiated by the uplink representor and shared by
|
||||
* the uplink's VFs
|
||||
@@ -86,6 +87,8 @@ struct mlx5_rep_uplink_priv {
|
||||
struct mapping_ctx *tunnel_mapping;
|
||||
/* maps tun_enc_opts to a unique id*/
|
||||
struct mapping_ctx *tunnel_enc_opts_mapping;
|
||||
|
||||
struct mlx5_tc_ct_priv *ct_priv;
|
||||
};
|
||||
|
||||
struct mlx5e_rep_priv {
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
#include "en/port.h"
|
||||
#include "en/tc_tun.h"
|
||||
#include "en/mapping.h"
|
||||
#include "en/tc_ct.h"
|
||||
#include "lib/devcom.h"
|
||||
#include "lib/geneve.h"
|
||||
#include "diag/en_tc_tracepoint.h"
|
||||
@@ -87,6 +88,7 @@ enum {
|
||||
MLX5E_TC_FLOW_FLAG_DUP = MLX5E_TC_FLOW_BASE + 4,
|
||||
MLX5E_TC_FLOW_FLAG_NOT_READY = MLX5E_TC_FLOW_BASE + 5,
|
||||
MLX5E_TC_FLOW_FLAG_DELETED = MLX5E_TC_FLOW_BASE + 6,
|
||||
MLX5E_TC_FLOW_FLAG_CT = MLX5E_TC_FLOW_BASE + 7,
|
||||
};
|
||||
|
||||
#define MLX5E_TC_MAX_SPLITS 1
|
||||
@@ -193,6 +195,11 @@ struct mlx5e_tc_attr_to_reg_mapping mlx5e_tc_attr_to_reg_mappings[] = {
|
||||
.soffset = MLX5_BYTE_OFF(fte_match_param,
|
||||
misc_parameters_2.metadata_reg_c_1),
|
||||
},
|
||||
[ZONE_TO_REG] = zone_to_reg_ct,
|
||||
[CTSTATE_TO_REG] = ctstate_to_reg_ct,
|
||||
[MARK_TO_REG] = mark_to_reg_ct,
|
||||
[LABELS_TO_REG] = labels_to_reg_ct,
|
||||
[FTEID_TO_REG] = fteid_to_reg_ct,
|
||||
};
|
||||
|
||||
static void mlx5e_put_flow_tunnel_id(struct mlx5e_tc_flow *flow);
|
||||
@@ -1144,6 +1151,10 @@ mlx5e_tc_offload_fdb_rules(struct mlx5_eswitch *esw,
|
||||
struct mlx5_esw_flow_attr *attr)
|
||||
{
|
||||
struct mlx5_flow_handle *rule;
|
||||
struct mlx5e_tc_mod_hdr_acts;
|
||||
|
||||
if (flow_flag_test(flow, CT))
|
||||
return mlx5_tc_ct_flow_offload(flow->priv, flow, spec, attr);
|
||||
|
||||
rule = mlx5_eswitch_add_offloaded_rule(esw, spec, attr);
|
||||
if (IS_ERR(rule))
|
||||
@@ -1163,10 +1174,15 @@ mlx5e_tc_offload_fdb_rules(struct mlx5_eswitch *esw,
|
||||
static void
|
||||
mlx5e_tc_unoffload_fdb_rules(struct mlx5_eswitch *esw,
|
||||
struct mlx5e_tc_flow *flow,
|
||||
struct mlx5_esw_flow_attr *attr)
|
||||
struct mlx5_esw_flow_attr *attr)
|
||||
{
|
||||
flow_flag_clear(flow, OFFLOADED);
|
||||
|
||||
if (flow_flag_test(flow, CT)) {
|
||||
mlx5_tc_ct_delete_flow(flow->priv, flow, attr);
|
||||
return;
|
||||
}
|
||||
|
||||
if (attr->split_count)
|
||||
mlx5_eswitch_del_fwd_rule(esw, flow->rule[1], attr);
|
||||
|
||||
@@ -1938,6 +1954,11 @@ static void mlx5e_put_flow_tunnel_id(struct mlx5e_tc_flow *flow)
|
||||
enc_opts_id);
|
||||
}
|
||||
|
||||
u32 mlx5e_tc_get_flow_tun_id(struct mlx5e_tc_flow *flow)
|
||||
{
|
||||
return flow->tunnel_id;
|
||||
}
|
||||
|
||||
static int parse_tunnel_attr(struct mlx5e_priv *priv,
|
||||
struct mlx5e_tc_flow *flow,
|
||||
struct mlx5_flow_spec *spec,
|
||||
@@ -2103,6 +2124,7 @@ static int __parse_cls_flower(struct mlx5e_priv *priv,
|
||||
BIT(FLOW_DISSECTOR_KEY_ENC_CONTROL) |
|
||||
BIT(FLOW_DISSECTOR_KEY_TCP) |
|
||||
BIT(FLOW_DISSECTOR_KEY_IP) |
|
||||
BIT(FLOW_DISSECTOR_KEY_CT) |
|
||||
BIT(FLOW_DISSECTOR_KEY_ENC_IP) |
|
||||
BIT(FLOW_DISSECTOR_KEY_ENC_OPTS))) {
|
||||
NL_SET_ERR_MSG_MOD(extack, "Unsupported key");
|
||||
@@ -2913,7 +2935,9 @@ struct ipv6_hoplimit_word {
|
||||
__u8 hop_limit;
|
||||
};
|
||||
|
||||
static bool is_action_keys_supported(const struct flow_action_entry *act)
|
||||
static int is_action_keys_supported(const struct flow_action_entry *act,
|
||||
bool ct_flow, bool *modify_ip_header,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
u32 mask, offset;
|
||||
u8 htype;
|
||||
@@ -2932,7 +2956,13 @@ static bool is_action_keys_supported(const struct flow_action_entry *act)
|
||||
if (offset != offsetof(struct iphdr, ttl) ||
|
||||
ttl_word->protocol ||
|
||||
ttl_word->check) {
|
||||
return true;
|
||||
*modify_ip_header = true;
|
||||
}
|
||||
|
||||
if (ct_flow && offset >= offsetof(struct iphdr, saddr)) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"can't offload re-write of ipv4 address with action ct");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
} else if (htype == FLOW_ACT_MANGLE_HDR_TYPE_IP6) {
|
||||
struct ipv6_hoplimit_word *hoplimit_word =
|
||||
@@ -2941,15 +2971,27 @@ static bool is_action_keys_supported(const struct flow_action_entry *act)
|
||||
if (offset != offsetof(struct ipv6hdr, payload_len) ||
|
||||
hoplimit_word->payload_len ||
|
||||
hoplimit_word->nexthdr) {
|
||||
return true;
|
||||
*modify_ip_header = true;
|
||||
}
|
||||
|
||||
if (ct_flow && offset >= offsetof(struct ipv6hdr, saddr)) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"can't offload re-write of ipv6 address with action ct");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
} else if (ct_flow && (htype == FLOW_ACT_MANGLE_HDR_TYPE_TCP ||
|
||||
htype == FLOW_ACT_MANGLE_HDR_TYPE_UDP)) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"can't offload re-write of transport header ports with action ct");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
return false;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool modify_header_match_supported(struct mlx5_flow_spec *spec,
|
||||
struct flow_action *flow_action,
|
||||
u32 actions,
|
||||
u32 actions, bool ct_flow,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
const struct flow_action_entry *act;
|
||||
@@ -2957,7 +2999,7 @@ static bool modify_header_match_supported(struct mlx5_flow_spec *spec,
|
||||
void *headers_v;
|
||||
u16 ethertype;
|
||||
u8 ip_proto;
|
||||
int i;
|
||||
int i, err;
|
||||
|
||||
headers_v = get_match_headers_value(actions, spec);
|
||||
ethertype = MLX5_GET(fte_match_set_lyr_2_4, headers_v, ethertype);
|
||||
@@ -2972,10 +3014,10 @@ static bool modify_header_match_supported(struct mlx5_flow_spec *spec,
|
||||
act->id != FLOW_ACTION_ADD)
|
||||
continue;
|
||||
|
||||
if (is_action_keys_supported(act)) {
|
||||
modify_ip_header = true;
|
||||
break;
|
||||
}
|
||||
err = is_action_keys_supported(act, ct_flow,
|
||||
&modify_ip_header, extack);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
ip_proto = MLX5_GET(fte_match_set_lyr_2_4, headers_v, ip_protocol);
|
||||
@@ -2998,13 +3040,24 @@ static bool actions_match_supported(struct mlx5e_priv *priv,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct net_device *filter_dev = parse_attr->filter_dev;
|
||||
bool drop_action, pop_action;
|
||||
bool drop_action, pop_action, ct_flow;
|
||||
u32 actions;
|
||||
|
||||
if (mlx5e_is_eswitch_flow(flow))
|
||||
ct_flow = flow_flag_test(flow, CT);
|
||||
if (mlx5e_is_eswitch_flow(flow)) {
|
||||
actions = flow->esw_attr->action;
|
||||
else
|
||||
|
||||
if (flow->esw_attr->split_count && ct_flow) {
|
||||
/* All registers used by ct are cleared when using
|
||||
* split rules.
|
||||
*/
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"Can't offload mirroring with action ct");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
} else {
|
||||
actions = flow->nic_attr->action;
|
||||
}
|
||||
|
||||
drop_action = actions & MLX5_FLOW_CONTEXT_ACTION_DROP;
|
||||
pop_action = actions & MLX5_FLOW_CONTEXT_ACTION_VLAN_POP;
|
||||
@@ -3021,7 +3074,7 @@ static bool actions_match_supported(struct mlx5e_priv *priv,
|
||||
if (actions & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR)
|
||||
return modify_header_match_supported(&parse_attr->spec,
|
||||
flow_action, actions,
|
||||
extack);
|
||||
ct_flow, extack);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -3826,6 +3879,13 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv,
|
||||
action |= MLX5_FLOW_CONTEXT_ACTION_COUNT;
|
||||
attr->dest_chain = act->chain_index;
|
||||
break;
|
||||
case FLOW_ACTION_CT:
|
||||
err = mlx5_tc_ct_parse_action(priv, attr, act, extack);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
flow_flag_set(flow, CT);
|
||||
break;
|
||||
default:
|
||||
NL_SET_ERR_MSG_MOD(extack, "The offload action is not supported");
|
||||
return -EOPNOTSUPP;
|
||||
@@ -4066,6 +4126,10 @@ __mlx5e_add_fdb_flow(struct mlx5e_priv *priv,
|
||||
if (err)
|
||||
goto err_free;
|
||||
|
||||
err = mlx5_tc_ct_parse_match(priv, &parse_attr->spec, f, extack);
|
||||
if (err)
|
||||
goto err_free;
|
||||
|
||||
err = mlx5e_tc_add_fdb_flow(priv, flow, extack);
|
||||
complete_all(&flow->init_done);
|
||||
if (err) {
|
||||
@@ -4350,7 +4414,7 @@ int mlx5e_stats_flower(struct net_device *dev, struct mlx5e_priv *priv,
|
||||
goto errout;
|
||||
}
|
||||
|
||||
if (mlx5e_is_offloaded_flow(flow)) {
|
||||
if (mlx5e_is_offloaded_flow(flow) || flow_flag_test(flow, CT)) {
|
||||
counter = mlx5e_tc_get_counter(flow);
|
||||
if (!counter)
|
||||
goto errout;
|
||||
@@ -4622,6 +4686,10 @@ int mlx5e_tc_esw_init(struct rhashtable *tc_ht)
|
||||
uplink_priv = container_of(tc_ht, struct mlx5_rep_uplink_priv, tc_ht);
|
||||
priv = container_of(uplink_priv, struct mlx5e_rep_priv, uplink_priv);
|
||||
|
||||
err = mlx5_tc_ct_init(uplink_priv);
|
||||
if (err)
|
||||
goto err_ct;
|
||||
|
||||
mapping = mapping_create(sizeof(struct tunnel_match_key),
|
||||
TUNNEL_INFO_BITS_MASK, true);
|
||||
if (IS_ERR(mapping)) {
|
||||
@@ -4648,6 +4716,8 @@ err_ht_init:
|
||||
err_enc_opts_mapping:
|
||||
mapping_destroy(uplink_priv->tunnel_mapping);
|
||||
err_tun_mapping:
|
||||
mlx5_tc_ct_clean(uplink_priv);
|
||||
err_ct:
|
||||
netdev_warn(priv->netdev,
|
||||
"Failed to initialize tc (eswitch), err: %d", err);
|
||||
return err;
|
||||
@@ -4662,6 +4732,8 @@ void mlx5e_tc_esw_cleanup(struct rhashtable *tc_ht)
|
||||
uplink_priv = container_of(tc_ht, struct mlx5_rep_uplink_priv, tc_ht);
|
||||
mapping_destroy(uplink_priv->tunnel_enc_opts_mapping);
|
||||
mapping_destroy(uplink_priv->tunnel_mapping);
|
||||
|
||||
mlx5_tc_ct_clean(uplink_priv);
|
||||
}
|
||||
|
||||
int mlx5e_tc_num_filters(struct mlx5e_priv *priv, unsigned long flags)
|
||||
|
||||
@@ -94,6 +94,11 @@ void mlx5e_tc_reoffload_flows_work(struct work_struct *work);
|
||||
enum mlx5e_tc_attr_to_reg {
|
||||
CHAIN_TO_REG,
|
||||
TUNNEL_TO_REG,
|
||||
CTSTATE_TO_REG,
|
||||
ZONE_TO_REG,
|
||||
MARK_TO_REG,
|
||||
LABELS_TO_REG,
|
||||
FTEID_TO_REG,
|
||||
};
|
||||
|
||||
struct mlx5e_tc_attr_to_reg_mapping {
|
||||
@@ -139,6 +144,9 @@ int alloc_mod_hdr_actions(struct mlx5_core_dev *mdev,
|
||||
struct mlx5e_tc_mod_hdr_acts *mod_hdr_acts);
|
||||
void dealloc_mod_hdr_actions(struct mlx5e_tc_mod_hdr_acts *mod_hdr_acts);
|
||||
|
||||
struct mlx5e_tc_flow;
|
||||
u32 mlx5e_tc_get_flow_tun_id(struct mlx5e_tc_flow *flow);
|
||||
|
||||
#else /* CONFIG_MLX5_ESWITCH */
|
||||
static inline int mlx5e_tc_nic_init(struct mlx5e_priv *priv) { return 0; }
|
||||
static inline void mlx5e_tc_nic_cleanup(struct mlx5e_priv *priv) {}
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
#include <linux/mlx5/vport.h>
|
||||
#include <linux/mlx5/fs.h>
|
||||
#include "lib/mpfs.h"
|
||||
#include "en/tc_ct.h"
|
||||
|
||||
#define FDB_TC_MAX_CHAIN 3
|
||||
#define FDB_FT_CHAIN (FDB_TC_MAX_CHAIN + 1)
|
||||
@@ -424,6 +425,7 @@ struct mlx5_esw_flow_attr {
|
||||
u32 flags;
|
||||
struct mlx5_flow_table *fdb;
|
||||
struct mlx5_flow_table *dest_ft;
|
||||
struct mlx5_ct_attr ct_attr;
|
||||
struct mlx5e_tc_flow_parse_attr *parse_attr;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user