mlx5: make flow steering rule generator more generic
Upcoming flow director support will reuse this function to generate filter rules. Signed-off-by: Yaacov Hazan <yaacovh@mellanox.com> Signed-off-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
This commit is contained in:
parent
0497ddaac5
commit
1a56bdaceb
@ -241,7 +241,7 @@ hash_rxq_add_mac_flow(struct hash_rxq *hash_rxq, unsigned int mac_index,
|
||||
const uint8_t (*mac)[ETHER_ADDR_LEN] =
|
||||
(const uint8_t (*)[ETHER_ADDR_LEN])
|
||||
priv->mac[mac_index].addr_bytes;
|
||||
FLOW_ATTR_SPEC_ETH(data, hash_rxq_flow_attr(hash_rxq, NULL, 0));
|
||||
FLOW_ATTR_SPEC_ETH(data, priv_flow_attr(priv, NULL, 0, hash_rxq->type));
|
||||
struct ibv_exp_flow_attr *attr = &data->attr;
|
||||
struct ibv_exp_flow_spec_eth *spec = &data->spec;
|
||||
unsigned int vlan_enabled = !!priv->vlan_filter_n;
|
||||
@ -256,7 +256,7 @@ hash_rxq_add_mac_flow(struct hash_rxq *hash_rxq, unsigned int mac_index,
|
||||
* This layout is expected by libibverbs.
|
||||
*/
|
||||
assert(((uint8_t *)attr + sizeof(*attr)) == (uint8_t *)spec);
|
||||
hash_rxq_flow_attr(hash_rxq, attr, sizeof(data));
|
||||
priv_flow_attr(priv, attr, sizeof(data), hash_rxq->type);
|
||||
/* The first specification must be Ethernet. */
|
||||
assert(spec->type == IBV_EXP_FLOW_SPEC_ETH);
|
||||
assert(spec->size == sizeof(*spec));
|
||||
|
@ -129,8 +129,9 @@ static int
|
||||
hash_rxq_special_flow_enable(struct hash_rxq *hash_rxq,
|
||||
enum hash_rxq_flow_type flow_type)
|
||||
{
|
||||
struct priv *priv = hash_rxq->priv;
|
||||
struct ibv_exp_flow *flow;
|
||||
FLOW_ATTR_SPEC_ETH(data, hash_rxq_flow_attr(hash_rxq, NULL, 0));
|
||||
FLOW_ATTR_SPEC_ETH(data, priv_flow_attr(priv, NULL, 0, hash_rxq->type));
|
||||
struct ibv_exp_flow_attr *attr = &data->attr;
|
||||
struct ibv_exp_flow_spec_eth *spec = &data->spec;
|
||||
const uint8_t *mac;
|
||||
@ -148,7 +149,7 @@ hash_rxq_special_flow_enable(struct hash_rxq *hash_rxq,
|
||||
* This layout is expected by libibverbs.
|
||||
*/
|
||||
assert(((uint8_t *)attr + sizeof(*attr)) == (uint8_t *)spec);
|
||||
hash_rxq_flow_attr(hash_rxq, attr, sizeof(data));
|
||||
priv_flow_attr(priv, attr, sizeof(data), hash_rxq->type);
|
||||
/* The first specification must be Ethernet. */
|
||||
assert(spec->type == IBV_EXP_FLOW_SPEC_ETH);
|
||||
assert(spec->size == sizeof(*spec));
|
||||
|
@ -210,27 +210,27 @@ const size_t rss_hash_default_key_len = sizeof(rss_hash_default_key);
|
||||
* information from hash_rxq_init[]. Nothing is written to flow_attr when
|
||||
* flow_attr_size is not large enough, but the required size is still returned.
|
||||
*
|
||||
* @param[in] hash_rxq
|
||||
* Pointer to hash RX queue.
|
||||
* @param priv
|
||||
* Pointer to private structure.
|
||||
* @param[out] flow_attr
|
||||
* Pointer to flow attribute structure to fill. Note that the allocated
|
||||
* area must be larger and large enough to hold all flow specifications.
|
||||
* @param flow_attr_size
|
||||
* Entire size of flow_attr and trailing room for flow specifications.
|
||||
* @param type
|
||||
* Hash RX queue type to use for flow steering rule.
|
||||
*
|
||||
* @return
|
||||
* Total size of the flow attribute buffer. No errors are defined.
|
||||
*/
|
||||
size_t
|
||||
hash_rxq_flow_attr(const struct hash_rxq *hash_rxq,
|
||||
struct ibv_exp_flow_attr *flow_attr,
|
||||
size_t flow_attr_size)
|
||||
priv_flow_attr(struct priv *priv, struct ibv_exp_flow_attr *flow_attr,
|
||||
size_t flow_attr_size, enum hash_rxq_type type)
|
||||
{
|
||||
size_t offset = sizeof(*flow_attr);
|
||||
enum hash_rxq_type type = hash_rxq->type;
|
||||
const struct hash_rxq_init *init = &hash_rxq_init[type];
|
||||
|
||||
assert(hash_rxq->priv != NULL);
|
||||
assert(priv != NULL);
|
||||
assert((size_t)type < RTE_DIM(hash_rxq_init));
|
||||
do {
|
||||
offset += init->flow_spec.hdr.size;
|
||||
@ -244,7 +244,7 @@ hash_rxq_flow_attr(const struct hash_rxq *hash_rxq,
|
||||
.type = IBV_EXP_FLOW_ATTR_NORMAL,
|
||||
.priority = init->flow_priority,
|
||||
.num_of_specs = 0,
|
||||
.port = hash_rxq->priv->port,
|
||||
.port = priv->port,
|
||||
.flags = 0,
|
||||
};
|
||||
do {
|
||||
|
@ -270,8 +270,8 @@ extern const unsigned int hash_rxq_init_n;
|
||||
extern uint8_t rss_hash_default_key[];
|
||||
extern const size_t rss_hash_default_key_len;
|
||||
|
||||
size_t hash_rxq_flow_attr(const struct hash_rxq *, struct ibv_exp_flow_attr *,
|
||||
size_t);
|
||||
size_t priv_flow_attr(struct priv *, struct ibv_exp_flow_attr *,
|
||||
size_t, enum hash_rxq_type);
|
||||
int priv_create_hash_rxqs(struct priv *);
|
||||
void priv_destroy_hash_rxqs(struct priv *);
|
||||
int priv_allow_flow_type(struct priv *, enum hash_rxq_flow_type);
|
||||
|
Loading…
x
Reference in New Issue
Block a user