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