numam-dpdk/drivers/net/sfc/sfc_flow.h
Roman Zhukov 5448324dc5 net/sfc: multiply of specs with an unknown destination MAC
To filter all traffic, need to create two hardware filter specifications
with both unknown unicast and unknown multicast destination MAC address
match flags.

In terms of RTE flow API, this would require adding multiple flow rules
with corresponding ETH items. In order to avoid such a complication, the
patch implements a mechanism to auto-complete an underlying filter
representation of a flow rule in order to create additional filter
specifications featuring the missing match flags.

Signed-off-by: Roman Zhukov <roman.zhukov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Ivan Malov <ivan.malov@oktetlabs.ru>
2018-03-30 14:08:43 +02:00

75 lines
1.9 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
*
* Copyright (c) 2017-2018 Solarflare Communications Inc.
* All rights reserved.
*
* 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
/*
* 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
*/
#define SF_FLOW_SPEC_NB_FILTERS_MAX 8
#if EFSYS_OPT_RX_SCALE
/* 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];
};
#endif /* EFSYS_OPT_RX_SCALE */
/* Filter specification storage */
struct sfc_flow_spec {
/* 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;
};
/* PMD-specific definition of the opaque type from rte_flow.h */
struct rte_flow {
struct sfc_flow_spec spec; /* flow spec for hardware filter(s) */
#if EFSYS_OPT_RX_SCALE
boolean_t rss; /* RSS toggle */
struct sfc_flow_rss rss_conf; /* RSS configuration */
#endif /* EFSYS_OPT_RX_SCALE */
TAILQ_ENTRY(rte_flow) entries; /* flow list entries */
};
TAILQ_HEAD(sfc_flow_list, rte_flow);
extern const struct rte_flow_ops sfc_flow_ops;
struct sfc_adapter;
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);
#ifdef __cplusplus
}
#endif
#endif /* _SFC_FLOW_H */