2018-01-08 13:35:35 +00:00
|
|
|
/* SPDX-License-Identifier: BSD-3-Clause
|
2017-03-16 12:41:08 +00:00
|
|
|
*
|
2021-03-11 10:00:40 +00:00
|
|
|
* Copyright(c) 2019-2021 Xilinx, Inc.
|
2020-03-30 10:27:26 +00:00
|
|
|
* Copyright(c) 2017-2019 Solarflare Communications Inc.
|
2017-03-09 15:26:27 +00:00
|
|
|
*
|
|
|
|
* This software was jointly developed between OKTET Labs (under contract
|
|
|
|
* for Solarflare) and Solarflare Communications, Inc.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _SFC_FLOW_H
|
|
|
|
#define _SFC_FLOW_H
|
|
|
|
|
|
|
|
#include <rte_tailq.h>
|
|
|
|
#include <rte_flow_driver.h>
|
|
|
|
|
|
|
|
#include "efx.h"
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
2018-03-06 15:24:54 +00:00
|
|
|
/*
|
|
|
|
* The maximum number of fully elaborated hardware filter specifications
|
|
|
|
* which can be produced from a template by means of multiplication, if
|
|
|
|
* missing match flags are needed to be taken into account
|
|
|
|
*/
|
2018-03-06 15:24:57 +00:00
|
|
|
#define SF_FLOW_SPEC_NB_FILTERS_MAX 8
|
2018-03-06 15:24:54 +00:00
|
|
|
|
2020-10-20 09:13:08 +00:00
|
|
|
/* Used to guard action masks */
|
|
|
|
#define SFC_BUILD_SET_OVERFLOW(_action, _set) \
|
|
|
|
RTE_BUILD_BUG_ON((_action) >= sizeof(_set) * CHAR_BIT)
|
|
|
|
|
2017-08-30 18:17:41 +00:00
|
|
|
/* RSS configuration storage */
|
|
|
|
struct sfc_flow_rss {
|
|
|
|
unsigned int rxq_hw_index_min;
|
|
|
|
unsigned int rxq_hw_index_max;
|
|
|
|
unsigned int rss_hash_types;
|
|
|
|
uint8_t rss_key[EFX_RSS_KEY_SIZE];
|
|
|
|
unsigned int rss_tbl[EFX_RSS_TBL_SIZE];
|
|
|
|
};
|
|
|
|
|
2020-03-05 10:47:49 +00:00
|
|
|
/* Flow engines supported by the implementation */
|
|
|
|
enum sfc_flow_spec_type {
|
|
|
|
SFC_FLOW_SPEC_FILTER = 0,
|
2020-10-20 09:12:47 +00:00
|
|
|
SFC_FLOW_SPEC_MAE,
|
2020-03-05 10:47:49 +00:00
|
|
|
|
|
|
|
SFC_FLOW_SPEC_NTYPES
|
|
|
|
};
|
|
|
|
|
|
|
|
/* VNIC-specific flow specification */
|
|
|
|
struct sfc_flow_spec_filter {
|
2018-03-06 15:24:54 +00:00
|
|
|
/* partial specification from flow rule */
|
|
|
|
efx_filter_spec_t template;
|
|
|
|
/* fully elaborated hardware filters specifications */
|
|
|
|
efx_filter_spec_t filters[SF_FLOW_SPEC_NB_FILTERS_MAX];
|
|
|
|
/* number of complete specifications */
|
|
|
|
unsigned int count;
|
2020-03-05 10:47:47 +00:00
|
|
|
/* RSS toggle */
|
|
|
|
boolean_t rss;
|
2020-09-24 12:40:59 +00:00
|
|
|
/* RSS hash toggle */
|
|
|
|
boolean_t rss_hash_required;
|
2020-03-05 10:47:47 +00:00
|
|
|
/* RSS configuration */
|
|
|
|
struct sfc_flow_rss rss_conf;
|
2018-03-06 15:24:54 +00:00
|
|
|
};
|
|
|
|
|
2020-10-20 09:12:47 +00:00
|
|
|
/* MAE-specific flow specification */
|
|
|
|
struct sfc_flow_spec_mae {
|
|
|
|
/* Desired priority level */
|
|
|
|
unsigned int priority;
|
2020-10-20 09:13:41 +00:00
|
|
|
/* Outer rule registry entry */
|
|
|
|
struct sfc_mae_outer_rule *outer_rule;
|
2020-10-20 09:12:49 +00:00
|
|
|
/* EFX match specification */
|
|
|
|
efx_mae_match_spec_t *match_spec;
|
2020-10-20 09:12:55 +00:00
|
|
|
/* Action set registry entry */
|
|
|
|
struct sfc_mae_action_set *action_set;
|
2020-10-20 09:13:04 +00:00
|
|
|
/* Firmware-allocated rule ID */
|
|
|
|
efx_mae_rule_id_t rule_id;
|
2020-10-20 09:12:47 +00:00
|
|
|
};
|
|
|
|
|
2020-03-05 10:47:49 +00:00
|
|
|
/* Flow specification */
|
|
|
|
struct sfc_flow_spec {
|
|
|
|
/* Flow specification type (engine-based) */
|
|
|
|
enum sfc_flow_spec_type type;
|
|
|
|
|
|
|
|
RTE_STD_C11
|
|
|
|
union {
|
|
|
|
/* Filter-based (VNIC level flows) specification */
|
|
|
|
struct sfc_flow_spec_filter filter;
|
2020-10-20 09:12:47 +00:00
|
|
|
/* MAE-based (lower-level HW switch flows) specification */
|
|
|
|
struct sfc_flow_spec_mae mae;
|
2020-03-05 10:47:49 +00:00
|
|
|
};
|
|
|
|
};
|
|
|
|
|
2017-03-09 15:26:27 +00:00
|
|
|
/* PMD-specific definition of the opaque type from rte_flow.h */
|
|
|
|
struct rte_flow {
|
2020-03-05 10:47:49 +00:00
|
|
|
struct sfc_flow_spec spec; /* flow specification */
|
2017-03-09 15:26:27 +00:00
|
|
|
TAILQ_ENTRY(rte_flow) entries; /* flow list entries */
|
|
|
|
};
|
|
|
|
|
|
|
|
TAILQ_HEAD(sfc_flow_list, rte_flow);
|
|
|
|
|
|
|
|
extern const struct rte_flow_ops sfc_flow_ops;
|
|
|
|
|
2020-03-05 10:47:53 +00:00
|
|
|
enum sfc_flow_item_layers {
|
|
|
|
SFC_FLOW_ITEM_ANY_LAYER,
|
|
|
|
SFC_FLOW_ITEM_START_LAYER,
|
|
|
|
SFC_FLOW_ITEM_L2,
|
|
|
|
SFC_FLOW_ITEM_L3,
|
|
|
|
SFC_FLOW_ITEM_L4,
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Flow parse context types */
|
|
|
|
enum sfc_flow_parse_ctx_type {
|
|
|
|
SFC_FLOW_PARSE_CTX_FILTER = 0,
|
2020-10-20 09:12:49 +00:00
|
|
|
SFC_FLOW_PARSE_CTX_MAE,
|
2020-03-05 10:47:53 +00:00
|
|
|
|
|
|
|
SFC_FLOW_PARSE_CTX_NTYPES
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Flow parse context */
|
|
|
|
struct sfc_flow_parse_ctx {
|
|
|
|
enum sfc_flow_parse_ctx_type type;
|
|
|
|
|
|
|
|
RTE_STD_C11
|
|
|
|
union {
|
|
|
|
/* Context pointer valid for filter-based (VNIC) flows */
|
|
|
|
efx_filter_spec_t *filter;
|
2020-10-20 09:12:49 +00:00
|
|
|
/* Context pointer valid for MAE-based flows */
|
|
|
|
struct sfc_mae_parse_ctx *mae;
|
2020-03-05 10:47:53 +00:00
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef int (sfc_flow_item_parse)(const struct rte_flow_item *item,
|
|
|
|
struct sfc_flow_parse_ctx *parse_ctx,
|
|
|
|
struct rte_flow_error *error);
|
|
|
|
|
|
|
|
struct sfc_flow_item {
|
|
|
|
enum rte_flow_item_type type; /* Type of item */
|
2021-07-21 04:15:05 +00:00
|
|
|
const char *name; /* Item name */
|
2020-03-05 10:47:53 +00:00
|
|
|
enum sfc_flow_item_layers layer; /* Layer of item */
|
|
|
|
enum sfc_flow_item_layers prev_layer; /* Previous layer of item */
|
|
|
|
enum sfc_flow_parse_ctx_type ctx_type; /* Parse context type */
|
|
|
|
sfc_flow_item_parse *parse; /* Parsing function */
|
|
|
|
};
|
|
|
|
|
2021-07-21 04:15:05 +00:00
|
|
|
struct sfc_adapter;
|
|
|
|
|
|
|
|
int sfc_flow_parse_pattern(struct sfc_adapter *sa,
|
|
|
|
const struct sfc_flow_item *flow_items,
|
2020-03-05 10:47:53 +00:00
|
|
|
unsigned int nb_flow_items,
|
|
|
|
const struct rte_flow_item pattern[],
|
|
|
|
struct sfc_flow_parse_ctx *parse_ctx,
|
|
|
|
struct rte_flow_error *error);
|
|
|
|
|
|
|
|
int sfc_flow_parse_init(const struct rte_flow_item *item,
|
|
|
|
const void **spec_ptr,
|
|
|
|
const void **mask_ptr,
|
|
|
|
const void *supp_mask,
|
|
|
|
const void *def_mask,
|
|
|
|
unsigned int size,
|
|
|
|
struct rte_flow_error *error);
|
|
|
|
|
2017-03-09 15:26:27 +00:00
|
|
|
void sfc_flow_init(struct sfc_adapter *sa);
|
|
|
|
void sfc_flow_fini(struct sfc_adapter *sa);
|
|
|
|
int sfc_flow_start(struct sfc_adapter *sa);
|
|
|
|
void sfc_flow_stop(struct sfc_adapter *sa);
|
|
|
|
|
2020-03-05 10:47:51 +00:00
|
|
|
typedef int (sfc_flow_parse_cb_t)(struct rte_eth_dev *dev,
|
|
|
|
const struct rte_flow_item items[],
|
|
|
|
const struct rte_flow_action actions[],
|
|
|
|
struct rte_flow *flow,
|
|
|
|
struct rte_flow_error *error);
|
|
|
|
|
2020-10-20 09:12:53 +00:00
|
|
|
typedef int (sfc_flow_verify_cb_t)(struct sfc_adapter *sa,
|
|
|
|
struct rte_flow *flow);
|
|
|
|
|
2020-10-20 09:12:49 +00:00
|
|
|
typedef void (sfc_flow_cleanup_cb_t)(struct sfc_adapter *sa,
|
|
|
|
struct rte_flow *flow);
|
|
|
|
|
2020-03-05 10:47:52 +00:00
|
|
|
typedef int (sfc_flow_insert_cb_t)(struct sfc_adapter *sa,
|
|
|
|
struct rte_flow *flow);
|
|
|
|
|
|
|
|
typedef int (sfc_flow_remove_cb_t)(struct sfc_adapter *sa,
|
|
|
|
struct rte_flow *flow);
|
|
|
|
|
2021-07-02 08:39:48 +00:00
|
|
|
typedef int (sfc_flow_query_cb_t)(struct rte_eth_dev *dev,
|
|
|
|
struct rte_flow *flow,
|
|
|
|
const struct rte_flow_action *action,
|
|
|
|
void *data,
|
|
|
|
struct rte_flow_error *error);
|
|
|
|
|
2017-03-09 15:26:27 +00:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif /* _SFC_FLOW_H */
|