1ed01e436SSerhii Iliushyk /* 2ed01e436SSerhii Iliushyk * SPDX-License-Identifier: BSD-3-Clause 3ed01e436SSerhii Iliushyk * Copyright(c) 2023 Napatech A/S 4ed01e436SSerhii Iliushyk */ 5ed01e436SSerhii Iliushyk 6ed01e436SSerhii Iliushyk #ifndef __CREATE_ELEMENTS_H__ 7ed01e436SSerhii Iliushyk #define __CREATE_ELEMENTS_H__ 8ed01e436SSerhii Iliushyk 9e526adf1SSerhii Iliushyk #include "stdint.h" 10ed01e436SSerhii Iliushyk 11ed01e436SSerhii Iliushyk #include "stream_binary_flow_api.h" 12ed01e436SSerhii Iliushyk #include <rte_flow.h> 13ed01e436SSerhii Iliushyk 14e526adf1SSerhii Iliushyk #define MAX_ELEMENTS 64 15e526adf1SSerhii Iliushyk #define MAX_ACTIONS 32 16e526adf1SSerhii Iliushyk 17e526adf1SSerhii Iliushyk struct cnv_match_s { 18e526adf1SSerhii Iliushyk struct rte_flow_item rte_flow_item[MAX_ELEMENTS]; 19e526adf1SSerhii Iliushyk }; 20e526adf1SSerhii Iliushyk 21e526adf1SSerhii Iliushyk struct cnv_attr_s { 22e526adf1SSerhii Iliushyk struct cnv_match_s match; 23e526adf1SSerhii Iliushyk struct rte_flow_attr attr; 24e526adf1SSerhii Iliushyk uint16_t forced_vlan_vid; 25e526adf1SSerhii Iliushyk uint16_t caller_id; 26e526adf1SSerhii Iliushyk }; 27e526adf1SSerhii Iliushyk 28e526adf1SSerhii Iliushyk struct cnv_action_s { 29e526adf1SSerhii Iliushyk struct rte_flow_action flow_actions[MAX_ACTIONS]; 308eed292bSSerhii Iliushyk struct rte_flow_action_rss flow_rss; 31c6821abfSDanylo Vodopianov struct flow_action_raw_encap encap; 32c6821abfSDanylo Vodopianov struct flow_action_raw_decap decap; 33e526adf1SSerhii Iliushyk struct rte_flow_action_queue queue; 34e526adf1SSerhii Iliushyk }; 35e526adf1SSerhii Iliushyk 36e526adf1SSerhii Iliushyk /* 37e526adf1SSerhii Iliushyk * Only needed because it eases the use of statistics through NTAPI 38e526adf1SSerhii Iliushyk * for faster integration into NTAPI version of driver 39e526adf1SSerhii Iliushyk * Therefore, this is only a good idea when running on a temporary NTAPI 40e526adf1SSerhii Iliushyk * The query() functionality must go to flow engine, when moved to Open Source driver 41e526adf1SSerhii Iliushyk */ 42e526adf1SSerhii Iliushyk 43e526adf1SSerhii Iliushyk struct rte_flow { 44e526adf1SSerhii Iliushyk void *flw_hdl; 45e526adf1SSerhii Iliushyk int used; 46e526adf1SSerhii Iliushyk 47e526adf1SSerhii Iliushyk uint32_t flow_stat_id; 48e526adf1SSerhii Iliushyk 49*effa0469SDanylo Vodopianov uint64_t stat_pkts; 50*effa0469SDanylo Vodopianov uint64_t stat_bytes; 51*effa0469SDanylo Vodopianov uint8_t stat_tcp_flags; 52*effa0469SDanylo Vodopianov 53e526adf1SSerhii Iliushyk uint16_t caller_id; 54e526adf1SSerhii Iliushyk }; 55e526adf1SSerhii Iliushyk 56e526adf1SSerhii Iliushyk enum nt_rte_flow_item_type { 57e526adf1SSerhii Iliushyk NT_RTE_FLOW_ITEM_TYPE_END = INT_MIN, 58e526adf1SSerhii Iliushyk NT_RTE_FLOW_ITEM_TYPE_TUNNEL, 59e526adf1SSerhii Iliushyk }; 60e526adf1SSerhii Iliushyk 61e526adf1SSerhii Iliushyk extern rte_spinlock_t flow_lock; 62c6821abfSDanylo Vodopianov 63c6821abfSDanylo Vodopianov int interpret_raw_data(uint8_t *data, uint8_t *preserve, int size, struct rte_flow_item *out); 64e526adf1SSerhii Iliushyk int convert_error(struct rte_flow_error *error, struct rte_flow_error *rte_flow_error); 65e526adf1SSerhii Iliushyk int create_attr(struct cnv_attr_s *attribute, const struct rte_flow_attr *attr); 66e526adf1SSerhii Iliushyk int create_match_elements(struct cnv_match_s *match, const struct rte_flow_item items[], 67e526adf1SSerhii Iliushyk int max_elem); 68e526adf1SSerhii Iliushyk int create_action_elements_inline(struct cnv_action_s *action, 69e526adf1SSerhii Iliushyk const struct rte_flow_action actions[], 70e526adf1SSerhii Iliushyk int max_elem, 71e526adf1SSerhii Iliushyk uint32_t queue_offset); 72e526adf1SSerhii Iliushyk 73ed01e436SSerhii Iliushyk #endif /* __CREATE_ELEMENTS_H__ */ 74