xref: /dpdk/app/test-flow-perf/flow_gen.c (revision fda3750de619617a258da4281de7535b4bad7401)
1bf3688f1SWisam Jaddo /* SPDX-License-Identifier: BSD-3-Clause
2bf3688f1SWisam Jaddo  * Copyright 2020 Mellanox Technologies, Ltd
3bf3688f1SWisam Jaddo  *
4bf3688f1SWisam Jaddo  * The file contains the implementations of the method to
5bf3688f1SWisam Jaddo  * fill items, actions & attributes in their corresponding
6bf3688f1SWisam Jaddo  * arrays, and then generate rte_flow rule.
7bf3688f1SWisam Jaddo  *
8bf3688f1SWisam Jaddo  * After the generation. The rule goes to validation then
9bf3688f1SWisam Jaddo  * creation state and then return the results.
10bf3688f1SWisam Jaddo  */
11bf3688f1SWisam Jaddo 
12bf3688f1SWisam Jaddo #include <stdint.h>
13bf3688f1SWisam Jaddo 
14bf3688f1SWisam Jaddo #include "flow_gen.h"
15bf3688f1SWisam Jaddo #include "items_gen.h"
16bf3688f1SWisam Jaddo #include "actions_gen.h"
17bf3688f1SWisam Jaddo #include "config.h"
18bf3688f1SWisam Jaddo 
19bf3688f1SWisam Jaddo static void
fill_attributes(struct rte_flow_attr * attr,uint64_t * flow_attrs,uint16_t group,uint8_t max_priority)20bf3688f1SWisam Jaddo fill_attributes(struct rte_flow_attr *attr,
21*fda3750dSSatheesh Paul 	uint64_t *flow_attrs, uint16_t group, uint8_t max_priority)
22bf3688f1SWisam Jaddo {
239001a863SWisam Jaddo 	uint8_t i;
249001a863SWisam Jaddo 	for (i = 0; i < MAX_ATTRS_NUM; i++) {
259001a863SWisam Jaddo 		if (flow_attrs[i] == 0)
269001a863SWisam Jaddo 			break;
279001a863SWisam Jaddo 		if (flow_attrs[i] & INGRESS)
28bf3688f1SWisam Jaddo 			attr->ingress = 1;
299001a863SWisam Jaddo 		else if (flow_attrs[i] & EGRESS)
30bf3688f1SWisam Jaddo 			attr->egress = 1;
319001a863SWisam Jaddo 		else if (flow_attrs[i] & TRANSFER)
32bf3688f1SWisam Jaddo 			attr->transfer = 1;
339001a863SWisam Jaddo 	}
34bf3688f1SWisam Jaddo 	attr->group = group;
35*fda3750dSSatheesh Paul 	attr->priority = rte_rand_max(max_priority);
36bf3688f1SWisam Jaddo }
37bf3688f1SWisam Jaddo 
38bf3688f1SWisam Jaddo 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)39bf3688f1SWisam Jaddo generate_flow(uint16_t port_id,
40bf3688f1SWisam Jaddo 	uint16_t group,
419001a863SWisam Jaddo 	uint64_t *flow_attrs,
429001a863SWisam Jaddo 	uint64_t *flow_items,
439001a863SWisam Jaddo 	uint64_t *flow_actions,
44bf3688f1SWisam Jaddo 	uint16_t next_table,
45bf3688f1SWisam Jaddo 	uint32_t outer_ip_src,
46bf3688f1SWisam Jaddo 	uint16_t hairpinq,
470c8f1f4aSWisam Jaddo 	uint64_t encap_data,
480c8f1f4aSWisam Jaddo 	uint64_t decap_data,
4980a32331SSean Zhang 	uint16_t dst_port,
50070316d0SWisam Jaddo 	uint8_t core_idx,
51741bb850SWisam Jaddo 	uint8_t rx_queues_count,
52eb4df25fSWisam Jaddo 	bool unique_data,
53*fda3750dSSatheesh Paul 	uint8_t max_priority,
54bf3688f1SWisam Jaddo 	struct rte_flow_error *error)
55bf3688f1SWisam Jaddo {
56bf3688f1SWisam Jaddo 	struct rte_flow_attr attr;
57bf3688f1SWisam Jaddo 	struct rte_flow_item items[MAX_ITEMS_NUM];
58bf3688f1SWisam Jaddo 	struct rte_flow_action actions[MAX_ACTIONS_NUM];
59bf3688f1SWisam Jaddo 	struct rte_flow *flow = NULL;
60bf3688f1SWisam Jaddo 
61bf3688f1SWisam Jaddo 	memset(items, 0, sizeof(items));
62bf3688f1SWisam Jaddo 	memset(actions, 0, sizeof(actions));
63bf3688f1SWisam Jaddo 	memset(&attr, 0, sizeof(struct rte_flow_attr));
64bf3688f1SWisam Jaddo 
65*fda3750dSSatheesh Paul 	fill_attributes(&attr, flow_attrs, group, max_priority);
66bf3688f1SWisam Jaddo 
67bf3688f1SWisam Jaddo 	fill_actions(actions, flow_actions,
680c8f1f4aSWisam Jaddo 		outer_ip_src, next_table, hairpinq,
69eb4df25fSWisam Jaddo 		encap_data, decap_data, core_idx,
7080a32331SSean Zhang 		unique_data, rx_queues_count, dst_port);
71bf3688f1SWisam Jaddo 
72070316d0SWisam Jaddo 	fill_items(items, flow_items, outer_ip_src, core_idx);
73bf3688f1SWisam Jaddo 
74bf3688f1SWisam Jaddo 	flow = rte_flow_create(port_id, &attr, items, actions, error);
75bf3688f1SWisam Jaddo 	return flow;
76bf3688f1SWisam Jaddo }
77