1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright 2020 Mellanox Technologies, Ltd
3 *
4 * The file contains the implementations of the method to
5 * fill items, actions & attributes in their corresponding
6 * arrays, and then generate rte_flow rule.
7 *
8 * After the generation. The rule goes to validation then
9 * creation state and then return the results.
10 */
11
12 #include <stdint.h>
13
14 #include "flow_gen.h"
15 #include "items_gen.h"
16 #include "actions_gen.h"
17 #include "config.h"
18
19 static void
fill_attributes(struct rte_flow_attr * attr,uint64_t * flow_attrs,uint16_t group,uint8_t max_priority)20 fill_attributes(struct rte_flow_attr *attr,
21 uint64_t *flow_attrs, uint16_t group, uint8_t max_priority)
22 {
23 uint8_t i;
24 for (i = 0; i < MAX_ATTRS_NUM; i++) {
25 if (flow_attrs[i] == 0)
26 break;
27 if (flow_attrs[i] & INGRESS)
28 attr->ingress = 1;
29 else if (flow_attrs[i] & EGRESS)
30 attr->egress = 1;
31 else if (flow_attrs[i] & TRANSFER)
32 attr->transfer = 1;
33 }
34 attr->group = group;
35 attr->priority = rte_rand_max(max_priority);
36 }
37
38 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,uint16_t dst_port,uint8_t core_idx,uint8_t rx_queues_count,bool unique_data,uint8_t max_priority,struct rte_flow_error * error)39 generate_flow(uint16_t port_id,
40 uint16_t group,
41 uint64_t *flow_attrs,
42 uint64_t *flow_items,
43 uint64_t *flow_actions,
44 uint16_t next_table,
45 uint32_t outer_ip_src,
46 uint16_t hairpinq,
47 uint64_t encap_data,
48 uint64_t decap_data,
49 uint16_t dst_port,
50 uint8_t core_idx,
51 uint8_t rx_queues_count,
52 bool unique_data,
53 uint8_t max_priority,
54 struct rte_flow_error *error)
55 {
56 struct rte_flow_attr attr;
57 struct rte_flow_item items[MAX_ITEMS_NUM];
58 struct rte_flow_action actions[MAX_ACTIONS_NUM];
59 struct rte_flow *flow = NULL;
60
61 memset(items, 0, sizeof(items));
62 memset(actions, 0, sizeof(actions));
63 memset(&attr, 0, sizeof(struct rte_flow_attr));
64
65 fill_attributes(&attr, flow_attrs, group, max_priority);
66
67 fill_actions(actions, flow_actions,
68 outer_ip_src, next_table, hairpinq,
69 encap_data, decap_data, core_idx,
70 unique_data, rx_queues_count, dst_port);
71
72 fill_items(items, flow_items, outer_ip_src, core_idx);
73
74 flow = rte_flow_create(port_id, &attr, items, actions, error);
75 return flow;
76 }
77