linux/drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
   2/* Copyright (c) 2018 Mellanox Technologies. */
   3
   4#ifndef __MLX5_EN_TC_CT_H__
   5#define __MLX5_EN_TC_CT_H__
   6
   7#include <net/pkt_cls.h>
   8#include <linux/mlx5/fs.h>
   9#include <net/tc_act/tc_ct.h>
  10
  11#include "en.h"
  12
  13struct mlx5_flow_attr;
  14struct mlx5e_tc_mod_hdr_acts;
  15struct mlx5_rep_uplink_priv;
  16struct mlx5e_tc_flow;
  17struct mlx5e_priv;
  18
  19struct mlx5_fs_chains;
  20struct mlx5_tc_ct_priv;
  21struct mlx5_ct_flow;
  22
  23struct nf_flowtable;
  24
  25struct mlx5_ct_attr {
  26        u16 zone;
  27        u16 ct_action;
  28        struct mlx5_ct_flow *ct_flow;
  29        struct nf_flowtable *nf_ft;
  30        u32 ct_labels_id;
  31};
  32
  33#define zone_to_reg_ct {\
  34        .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_2,\
  35        .moffset = 0,\
  36        .mlen = 16,\
  37        .soffset = MLX5_BYTE_OFF(fte_match_param,\
  38                                 misc_parameters_2.metadata_reg_c_2),\
  39}
  40
  41#define ctstate_to_reg_ct {\
  42        .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_2,\
  43        .moffset = 16,\
  44        .mlen = 16,\
  45        .soffset = MLX5_BYTE_OFF(fte_match_param,\
  46                                 misc_parameters_2.metadata_reg_c_2),\
  47}
  48
  49#define mark_to_reg_ct {\
  50        .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_3,\
  51        .moffset = 0,\
  52        .mlen = 32,\
  53        .soffset = MLX5_BYTE_OFF(fte_match_param,\
  54                                 misc_parameters_2.metadata_reg_c_3),\
  55}
  56
  57#define labels_to_reg_ct {\
  58        .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_4,\
  59        .moffset = 0,\
  60        .mlen = 32,\
  61        .soffset = MLX5_BYTE_OFF(fte_match_param,\
  62                                 misc_parameters_2.metadata_reg_c_4),\
  63}
  64
  65#define fteid_to_reg_ct {\
  66        .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_5,\
  67        .moffset = 0,\
  68        .mlen = 32,\
  69        .soffset = MLX5_BYTE_OFF(fte_match_param,\
  70                                 misc_parameters_2.metadata_reg_c_5),\
  71}
  72
  73#define zone_restore_to_reg_ct {\
  74        .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_1,\
  75        .moffset = 0,\
  76        .mlen = ESW_ZONE_ID_BITS,\
  77        .soffset = MLX5_BYTE_OFF(fte_match_param,\
  78                                 misc_parameters_2.metadata_reg_c_1),\
  79}
  80
  81#define nic_zone_restore_to_reg_ct {\
  82        .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_B,\
  83        .moffset = 16,\
  84        .mlen = ESW_ZONE_ID_BITS,\
  85}
  86
  87#define REG_MAPPING_MLEN(reg) (mlx5e_tc_attr_to_reg_mappings[reg].mlen)
  88#define REG_MAPPING_MOFFSET(reg) (mlx5e_tc_attr_to_reg_mappings[reg].moffset)
  89
  90#if IS_ENABLED(CONFIG_MLX5_TC_CT)
  91
  92struct mlx5_tc_ct_priv *
  93mlx5_tc_ct_init(struct mlx5e_priv *priv, struct mlx5_fs_chains *chains,
  94                struct mod_hdr_tbl *mod_hdr,
  95                enum mlx5_flow_namespace_type ns_type,
  96                struct mlx5e_post_act *post_act);
  97void
  98mlx5_tc_ct_clean(struct mlx5_tc_ct_priv *ct_priv);
  99
 100void
 101mlx5_tc_ct_match_del(struct mlx5_tc_ct_priv *priv, struct mlx5_ct_attr *ct_attr);
 102
 103int
 104mlx5_tc_ct_match_add(struct mlx5_tc_ct_priv *priv,
 105                     struct mlx5_flow_spec *spec,
 106                     struct flow_cls_offload *f,
 107                     struct mlx5_ct_attr *ct_attr,
 108                     struct netlink_ext_ack *extack);
 109int mlx5_tc_ct_add_no_trk_match(struct mlx5_flow_spec *spec);
 110int
 111mlx5_tc_ct_parse_action(struct mlx5_tc_ct_priv *priv,
 112                        struct mlx5_flow_attr *attr,
 113                        const struct flow_action_entry *act,
 114                        struct netlink_ext_ack *extack);
 115
 116struct mlx5_flow_handle *
 117mlx5_tc_ct_flow_offload(struct mlx5_tc_ct_priv *priv,
 118                        struct mlx5e_tc_flow *flow,
 119                        struct mlx5_flow_spec *spec,
 120                        struct mlx5_flow_attr *attr,
 121                        struct mlx5e_tc_mod_hdr_acts *mod_hdr_acts);
 122void
 123mlx5_tc_ct_delete_flow(struct mlx5_tc_ct_priv *priv,
 124                       struct mlx5e_tc_flow *flow,
 125                       struct mlx5_flow_attr *attr);
 126
 127bool
 128mlx5e_tc_ct_restore_flow(struct mlx5_tc_ct_priv *ct_priv,
 129                         struct sk_buff *skb, u8 zone_restore_id);
 130
 131#else /* CONFIG_MLX5_TC_CT */
 132
 133static inline struct mlx5_tc_ct_priv *
 134mlx5_tc_ct_init(struct mlx5e_priv *priv, struct mlx5_fs_chains *chains,
 135                struct mod_hdr_tbl *mod_hdr,
 136                enum mlx5_flow_namespace_type ns_type,
 137                struct mlx5e_post_act *post_act)
 138{
 139        return NULL;
 140}
 141
 142static inline void
 143mlx5_tc_ct_clean(struct mlx5_tc_ct_priv *ct_priv)
 144{
 145}
 146
 147static inline void
 148mlx5_tc_ct_match_del(struct mlx5_tc_ct_priv *priv, struct mlx5_ct_attr *ct_attr) {}
 149
 150static inline int
 151mlx5_tc_ct_match_add(struct mlx5_tc_ct_priv *priv,
 152                     struct mlx5_flow_spec *spec,
 153                     struct flow_cls_offload *f,
 154                     struct mlx5_ct_attr *ct_attr,
 155                     struct netlink_ext_ack *extack)
 156{
 157        struct flow_rule *rule = flow_cls_offload_flow_rule(f);
 158
 159        if (!flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_CT))
 160                return 0;
 161
 162        NL_SET_ERR_MSG_MOD(extack, "mlx5 tc ct offload isn't enabled.");
 163        return -EOPNOTSUPP;
 164}
 165
 166static inline int
 167mlx5_tc_ct_add_no_trk_match(struct mlx5_flow_spec *spec)
 168{
 169        return 0;
 170}
 171
 172static inline int
 173mlx5_tc_ct_parse_action(struct mlx5_tc_ct_priv *priv,
 174                        struct mlx5_flow_attr *attr,
 175                        const struct flow_action_entry *act,
 176                        struct netlink_ext_ack *extack)
 177{
 178        NL_SET_ERR_MSG_MOD(extack, "mlx5 tc ct offload isn't enabled.");
 179        return -EOPNOTSUPP;
 180}
 181
 182static inline struct mlx5_flow_handle *
 183mlx5_tc_ct_flow_offload(struct mlx5_tc_ct_priv *priv,
 184                        struct mlx5e_tc_flow *flow,
 185                        struct mlx5_flow_spec *spec,
 186                        struct mlx5_flow_attr *attr,
 187                        struct mlx5e_tc_mod_hdr_acts *mod_hdr_acts)
 188{
 189        return ERR_PTR(-EOPNOTSUPP);
 190}
 191
 192static inline void
 193mlx5_tc_ct_delete_flow(struct mlx5_tc_ct_priv *priv,
 194                       struct mlx5e_tc_flow *flow,
 195                       struct mlx5_flow_attr *attr)
 196{
 197}
 198
 199static inline bool
 200mlx5e_tc_ct_restore_flow(struct mlx5_tc_ct_priv *ct_priv,
 201                         struct sk_buff *skb, u8 zone_restore_id)
 202{
 203        if (!zone_restore_id)
 204                return true;
 205
 206        return false;
 207}
 208
 209#endif /* !IS_ENABLED(CONFIG_MLX5_TC_CT) */
 210#endif /* __MLX5_EN_TC_CT_H__ */
 211