eb4df25f53
Current support for unique data is to compile with config.h var FIXED_VALUES as 0, and this is only supported on compilation time, as a result the user may use only single mode for each compilation. Starting with this commit the user will have the ability to use this feature on the fly by using this new option: --unique-data Example of unique data usage: Insert many rules with different encap data for a flows that have encap action in it. Signed-off-by: Wisam Jaddo <wisamm@nvidia.com> Acked-by: Alexander Kozyrev <akozyrev@nvidia.com>
73 lines
1.7 KiB
C
73 lines
1.7 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright 2020 Mellanox Technologies, Ltd
|
|
*
|
|
* The file contains the implementations of the method to
|
|
* fill items, actions & attributes in their corresponding
|
|
* arrays, and then generate rte_flow rule.
|
|
*
|
|
* After the generation. The rule goes to validation then
|
|
* creation state and then return the results.
|
|
*/
|
|
|
|
#include <stdint.h>
|
|
|
|
#include "flow_gen.h"
|
|
#include "items_gen.h"
|
|
#include "actions_gen.h"
|
|
#include "config.h"
|
|
|
|
static void
|
|
fill_attributes(struct rte_flow_attr *attr,
|
|
uint64_t *flow_attrs, uint16_t group)
|
|
{
|
|
uint8_t i;
|
|
for (i = 0; i < MAX_ATTRS_NUM; i++) {
|
|
if (flow_attrs[i] == 0)
|
|
break;
|
|
if (flow_attrs[i] & INGRESS)
|
|
attr->ingress = 1;
|
|
else if (flow_attrs[i] & EGRESS)
|
|
attr->egress = 1;
|
|
else if (flow_attrs[i] & TRANSFER)
|
|
attr->transfer = 1;
|
|
}
|
|
attr->group = group;
|
|
}
|
|
|
|
struct rte_flow *
|
|
generate_flow(uint16_t port_id,
|
|
uint16_t group,
|
|
uint64_t *flow_attrs,
|
|
uint64_t *flow_items,
|
|
uint64_t *flow_actions,
|
|
uint16_t next_table,
|
|
uint32_t outer_ip_src,
|
|
uint16_t hairpinq,
|
|
uint64_t encap_data,
|
|
uint64_t decap_data,
|
|
uint8_t core_idx,
|
|
bool unique_data,
|
|
struct rte_flow_error *error)
|
|
{
|
|
struct rte_flow_attr attr;
|
|
struct rte_flow_item items[MAX_ITEMS_NUM];
|
|
struct rte_flow_action actions[MAX_ACTIONS_NUM];
|
|
struct rte_flow *flow = NULL;
|
|
|
|
memset(items, 0, sizeof(items));
|
|
memset(actions, 0, sizeof(actions));
|
|
memset(&attr, 0, sizeof(struct rte_flow_attr));
|
|
|
|
fill_attributes(&attr, flow_attrs, group);
|
|
|
|
fill_actions(actions, flow_actions,
|
|
outer_ip_src, next_table, hairpinq,
|
|
encap_data, decap_data, core_idx,
|
|
unique_data);
|
|
|
|
fill_items(items, flow_items, outer_ip_src, core_idx);
|
|
|
|
flow = rte_flow_create(port_id, &attr, items, actions, error);
|
|
return flow;
|
|
}
|