11d3f62a0SOleksandr Kolomeiets /* 21d3f62a0SOleksandr Kolomeiets * SPDX-License-Identifier: BSD-3-Clause 31d3f62a0SOleksandr Kolomeiets * Copyright(c) 2023 Napatech A/S 41d3f62a0SOleksandr Kolomeiets */ 51d3f62a0SOleksandr Kolomeiets 61d3f62a0SOleksandr Kolomeiets #ifndef _FLOW_API_ENGINE_H_ 71d3f62a0SOleksandr Kolomeiets #define _FLOW_API_ENGINE_H_ 81d3f62a0SOleksandr Kolomeiets 98385ba0eSSerhii Iliushyk #include <stdint.h> 10e02fdb65SSerhii Iliushyk #include <stdatomic.h> 11e02fdb65SSerhii Iliushyk 12e02fdb65SSerhii Iliushyk #include "hw_mod_backend.h" 13e02fdb65SSerhii Iliushyk #include "stream_binary_flow_api.h" 148385ba0eSSerhii Iliushyk 151d3f62a0SOleksandr Kolomeiets /* 161d3f62a0SOleksandr Kolomeiets * Resource management 177917b0d3SOleksandr Kolomeiets */ 187917b0d3SOleksandr Kolomeiets #define BIT_CONTAINER_8_ALIGN(x) (((x) + 7) / 8) 197917b0d3SOleksandr Kolomeiets 207917b0d3SOleksandr Kolomeiets /* 217917b0d3SOleksandr Kolomeiets * Resource management 221d3f62a0SOleksandr Kolomeiets * These are free resources in FPGA 231d3f62a0SOleksandr Kolomeiets * Other FPGA memory lists are linked to one of these 241d3f62a0SOleksandr Kolomeiets * and will implicitly follow them 251d3f62a0SOleksandr Kolomeiets */ 261d3f62a0SOleksandr Kolomeiets enum res_type_e { 271d3f62a0SOleksandr Kolomeiets RES_QUEUE, 281d3f62a0SOleksandr Kolomeiets RES_CAT_CFN, 291d3f62a0SOleksandr Kolomeiets RES_CAT_COT, 301d3f62a0SOleksandr Kolomeiets RES_CAT_EXO, 311d3f62a0SOleksandr Kolomeiets RES_CAT_LEN, 321d3f62a0SOleksandr Kolomeiets RES_KM_FLOW_TYPE, 331d3f62a0SOleksandr Kolomeiets RES_KM_CATEGORY, 341d3f62a0SOleksandr Kolomeiets RES_HSH_RCP, 351d3f62a0SOleksandr Kolomeiets RES_PDB_RCP, 361d3f62a0SOleksandr Kolomeiets RES_QSL_RCP, 371d3f62a0SOleksandr Kolomeiets RES_QSL_QST, 381d3f62a0SOleksandr Kolomeiets RES_SLC_LR_RCP, 391d3f62a0SOleksandr Kolomeiets 401d3f62a0SOleksandr Kolomeiets RES_FLM_FLOW_TYPE, 411d3f62a0SOleksandr Kolomeiets RES_FLM_RCP, 421d3f62a0SOleksandr Kolomeiets RES_TPE_RCP, 431d3f62a0SOleksandr Kolomeiets RES_TPE_EXT, 441d3f62a0SOleksandr Kolomeiets RES_TPE_RPL, 451d3f62a0SOleksandr Kolomeiets RES_SCRUB_RCP, 461d3f62a0SOleksandr Kolomeiets RES_COUNT, 47*c4e84cd7SSerhii Iliushyk RES_INVALID, 48*c4e84cd7SSerhii Iliushyk RES_END 491d3f62a0SOleksandr Kolomeiets }; 501d3f62a0SOleksandr Kolomeiets 51b01eb812SDanylo Vodopianov /* 52b01eb812SDanylo Vodopianov * Flow NIC offload management 53b01eb812SDanylo Vodopianov */ 54b01eb812SDanylo Vodopianov #define MAX_OUTPUT_DEST (128) 55b01eb812SDanylo Vodopianov 569bd46cf2SDanylo Vodopianov #define MAX_WORD_NUM 24 579bd46cf2SDanylo Vodopianov #define MAX_BANKS 6 589bd46cf2SDanylo Vodopianov 599bd46cf2SDanylo Vodopianov #define MAX_TCAM_START_OFFSETS 4 609bd46cf2SDanylo Vodopianov 614033e053SDanylo Vodopianov #define MAX_FLM_MTRS_SUPPORTED 4 628385ba0eSSerhii Iliushyk #define MAX_CPY_WRITERS_SUPPORTED 8 638385ba0eSSerhii Iliushyk 646fec9a9aSSerhii Iliushyk #define MAX_MATCH_FIELDS 16 656fec9a9aSSerhii Iliushyk 66c6821abfSDanylo Vodopianov /* 679bd46cf2SDanylo Vodopianov * 128 128 32 32 32 689bd46cf2SDanylo Vodopianov * Have | QW0 || QW4 || SW8 || SW9 | SWX in FPGA 699bd46cf2SDanylo Vodopianov * 709bd46cf2SDanylo Vodopianov * Each word may start at any offset, though 719bd46cf2SDanylo Vodopianov * they are combined in chronological order, with all enabled to 729bd46cf2SDanylo Vodopianov * build the extracted match data, thus that is how the match key 739bd46cf2SDanylo Vodopianov * must be build 74c6821abfSDanylo Vodopianov */ 759bd46cf2SDanylo Vodopianov enum extractor_e { 769bd46cf2SDanylo Vodopianov KM_USE_EXTRACTOR_UNDEF, 779bd46cf2SDanylo Vodopianov KM_USE_EXTRACTOR_QWORD, 789bd46cf2SDanylo Vodopianov KM_USE_EXTRACTOR_SWORD, 79c6821abfSDanylo Vodopianov }; 80c6821abfSDanylo Vodopianov 816fec9a9aSSerhii Iliushyk struct match_elem_s { 829bd46cf2SDanylo Vodopianov enum extractor_e extr; 836fec9a9aSSerhii Iliushyk int masked_for_tcam; /* if potentially selected for TCAM */ 846fec9a9aSSerhii Iliushyk uint32_t e_word[4]; 856fec9a9aSSerhii Iliushyk uint32_t e_mask[4]; 866fec9a9aSSerhii Iliushyk 876fec9a9aSSerhii Iliushyk int extr_start_offs_id; 886fec9a9aSSerhii Iliushyk int8_t rel_offs; 896fec9a9aSSerhii Iliushyk uint32_t word_len; 906fec9a9aSSerhii Iliushyk }; 916fec9a9aSSerhii Iliushyk 929bd46cf2SDanylo Vodopianov enum cam_tech_use_e { 939bd46cf2SDanylo Vodopianov KM_CAM, 949bd46cf2SDanylo Vodopianov KM_TCAM, 959bd46cf2SDanylo Vodopianov KM_SYNERGY 969bd46cf2SDanylo Vodopianov }; 979bd46cf2SDanylo Vodopianov 986fec9a9aSSerhii Iliushyk struct km_flow_def_s { 996fec9a9aSSerhii Iliushyk struct flow_api_backend_s *be; 1006fec9a9aSSerhii Iliushyk 1019bd46cf2SDanylo Vodopianov /* For keeping track of identical entries */ 1029bd46cf2SDanylo Vodopianov struct km_flow_def_s *reference; 1039bd46cf2SDanylo Vodopianov struct km_flow_def_s *root; 1049bd46cf2SDanylo Vodopianov 1056fec9a9aSSerhii Iliushyk /* For collect flow elements and sorting */ 1066fec9a9aSSerhii Iliushyk struct match_elem_s match[MAX_MATCH_FIELDS]; 1079bd46cf2SDanylo Vodopianov struct match_elem_s *match_map[MAX_MATCH_FIELDS]; 1086fec9a9aSSerhii Iliushyk int num_ftype_elem; 1096fec9a9aSSerhii Iliushyk 1109bd46cf2SDanylo Vodopianov /* Finally formatted CAM/TCAM entry */ 1119bd46cf2SDanylo Vodopianov enum cam_tech_use_e target; 1129bd46cf2SDanylo Vodopianov uint32_t entry_word[MAX_WORD_NUM]; 1139bd46cf2SDanylo Vodopianov uint32_t entry_mask[MAX_WORD_NUM]; 1149bd46cf2SDanylo Vodopianov int key_word_size; 1159bd46cf2SDanylo Vodopianov 1169bd46cf2SDanylo Vodopianov /* TCAM calculated possible bank start offsets */ 1179bd46cf2SDanylo Vodopianov int start_offsets[MAX_TCAM_START_OFFSETS]; 1189bd46cf2SDanylo Vodopianov int num_start_offsets; 1199bd46cf2SDanylo Vodopianov 1206fec9a9aSSerhii Iliushyk /* Flow information */ 1216fec9a9aSSerhii Iliushyk /* HW input port ID needed for compare. In port must be identical on flow types */ 1226fec9a9aSSerhii Iliushyk uint32_t port_id; 1239bd46cf2SDanylo Vodopianov uint32_t info; /* used for color (actions) */ 1249bd46cf2SDanylo Vodopianov int info_set; 1259bd46cf2SDanylo Vodopianov int flow_type; /* 0 is illegal and used as unset */ 1269bd46cf2SDanylo Vodopianov int flushed_to_target; /* if this km entry has been finally programmed into NIC hw */ 1279bd46cf2SDanylo Vodopianov 1289bd46cf2SDanylo Vodopianov /* CAM specific bank management */ 1299bd46cf2SDanylo Vodopianov int cam_paired; 1309bd46cf2SDanylo Vodopianov int record_indexes[MAX_BANKS]; 1319bd46cf2SDanylo Vodopianov int bank_used; 1329bd46cf2SDanylo Vodopianov uint32_t *cuckoo_moves; /* for CAM statistics only */ 1339bd46cf2SDanylo Vodopianov struct cam_distrib_s *cam_dist; 1347fa0bf29SDanylo Vodopianov struct hasher_s *hsh; 1359bd46cf2SDanylo Vodopianov 1369bd46cf2SDanylo Vodopianov /* TCAM specific bank management */ 1379bd46cf2SDanylo Vodopianov struct tcam_distrib_s *tcam_dist; 1389bd46cf2SDanylo Vodopianov int tcam_start_bank; 1399bd46cf2SDanylo Vodopianov int tcam_record; 1409bd46cf2SDanylo Vodopianov }; 1419bd46cf2SDanylo Vodopianov 1429bd46cf2SDanylo Vodopianov /* 1437fa0bf29SDanylo Vodopianov * RSS configuration, see struct rte_flow_action_rss 1447fa0bf29SDanylo Vodopianov */ 1457fa0bf29SDanylo Vodopianov struct hsh_def_s { 1467fa0bf29SDanylo Vodopianov enum rte_eth_hash_function func; /* RSS hash function to apply */ 1477fa0bf29SDanylo Vodopianov /* RSS hash types, see definition of RTE_ETH_RSS_* for hash calculation options */ 1487fa0bf29SDanylo Vodopianov uint64_t types; 1497fa0bf29SDanylo Vodopianov uint32_t key_len; /* Hash key length in bytes. */ 1507fa0bf29SDanylo Vodopianov const uint8_t *key; /* Hash key. */ 1517fa0bf29SDanylo Vodopianov }; 1527fa0bf29SDanylo Vodopianov 1537fa0bf29SDanylo Vodopianov /* 154c0d44442SDanylo Vodopianov * AGE configuration, see struct rte_flow_action_age 155c0d44442SDanylo Vodopianov */ 156c0d44442SDanylo Vodopianov struct age_def_s { 157c0d44442SDanylo Vodopianov uint32_t timeout; 158c0d44442SDanylo Vodopianov void *context; 159c0d44442SDanylo Vodopianov }; 160c0d44442SDanylo Vodopianov 161c0d44442SDanylo Vodopianov /* 1629bd46cf2SDanylo Vodopianov * Tunnel encapsulation header definition 1639bd46cf2SDanylo Vodopianov */ 1649bd46cf2SDanylo Vodopianov #define MAX_TUN_HDR_SIZE 128 1659bd46cf2SDanylo Vodopianov 1669bd46cf2SDanylo Vodopianov struct tunnel_header_s { 1679bd46cf2SDanylo Vodopianov union { 1689bd46cf2SDanylo Vodopianov uint8_t hdr8[MAX_TUN_HDR_SIZE]; 1699bd46cf2SDanylo Vodopianov uint32_t hdr32[(MAX_TUN_HDR_SIZE + 3) / 4]; 1709bd46cf2SDanylo Vodopianov } d; 1719bd46cf2SDanylo Vodopianov 1729bd46cf2SDanylo Vodopianov uint8_t len; 1739bd46cf2SDanylo Vodopianov 1749bd46cf2SDanylo Vodopianov uint8_t nb_vlans; 1759bd46cf2SDanylo Vodopianov 1769bd46cf2SDanylo Vodopianov uint8_t ip_version; /* 4: v4, 6: v6 */ 1779bd46cf2SDanylo Vodopianov 1789bd46cf2SDanylo Vodopianov uint8_t new_outer; 1799bd46cf2SDanylo Vodopianov uint8_t l2_len; 1809bd46cf2SDanylo Vodopianov uint8_t l3_len; 1819bd46cf2SDanylo Vodopianov uint8_t l4_len; 1826fec9a9aSSerhii Iliushyk }; 1836fec9a9aSSerhii Iliushyk 184e02fdb65SSerhii Iliushyk enum flow_port_type_e { 185e02fdb65SSerhii Iliushyk PORT_NONE, /* not defined or drop */ 186e02fdb65SSerhii Iliushyk PORT_INTERNAL, /* no queues attached */ 187e02fdb65SSerhii Iliushyk PORT_PHY, /* MAC phy output queue */ 188e02fdb65SSerhii Iliushyk PORT_VIRT, /* Memory queues to Host */ 189e02fdb65SSerhii Iliushyk }; 190e02fdb65SSerhii Iliushyk 191e02fdb65SSerhii Iliushyk struct output_s { 192e02fdb65SSerhii Iliushyk uint32_t owning_port_id;/* the port who owns this output destination */ 193e02fdb65SSerhii Iliushyk enum flow_port_type_e type; 194e02fdb65SSerhii Iliushyk int id; /* depending on port type: queue ID or physical port id or not used */ 195e02fdb65SSerhii Iliushyk int active; /* activated */ 196e02fdb65SSerhii Iliushyk }; 197e02fdb65SSerhii Iliushyk 198e02fdb65SSerhii Iliushyk struct nic_flow_def { 199e02fdb65SSerhii Iliushyk /* 200e02fdb65SSerhii Iliushyk * Frame Decoder match info collected 201e02fdb65SSerhii Iliushyk */ 202e02fdb65SSerhii Iliushyk int l2_prot; 203e02fdb65SSerhii Iliushyk int l3_prot; 204e02fdb65SSerhii Iliushyk int l4_prot; 205e02fdb65SSerhii Iliushyk int tunnel_prot; 206e02fdb65SSerhii Iliushyk int tunnel_l3_prot; 207e02fdb65SSerhii Iliushyk int tunnel_l4_prot; 208e02fdb65SSerhii Iliushyk int vlans; 209e02fdb65SSerhii Iliushyk int fragmentation; 210e02fdb65SSerhii Iliushyk int ip_prot; 211e02fdb65SSerhii Iliushyk int tunnel_ip_prot; 212e02fdb65SSerhii Iliushyk /* 213e02fdb65SSerhii Iliushyk * Additional meta data for various functions 214e02fdb65SSerhii Iliushyk */ 215e02fdb65SSerhii Iliushyk int in_port_override; 216e02fdb65SSerhii Iliushyk int non_empty; /* default value is -1; value 1 means flow actions update */ 217e02fdb65SSerhii Iliushyk struct output_s dst_id[MAX_OUTPUT_DEST];/* define the output to use */ 218e02fdb65SSerhii Iliushyk /* total number of available queues defined for all outputs - i.e. number of dst_id's */ 219e02fdb65SSerhii Iliushyk int dst_num_avail; 220e02fdb65SSerhii Iliushyk 221e02fdb65SSerhii Iliushyk /* 222e02fdb65SSerhii Iliushyk * Mark or Action info collection 223e02fdb65SSerhii Iliushyk */ 224e02fdb65SSerhii Iliushyk uint32_t mark; 225e02fdb65SSerhii Iliushyk 226e02fdb65SSerhii Iliushyk uint32_t jump_to_group; 227e02fdb65SSerhii Iliushyk 2284033e053SDanylo Vodopianov uint32_t mtr_ids[MAX_FLM_MTRS_SUPPORTED]; 2294033e053SDanylo Vodopianov 230e02fdb65SSerhii Iliushyk int full_offload; 2316fec9a9aSSerhii Iliushyk 2326fec9a9aSSerhii Iliushyk /* 233c6821abfSDanylo Vodopianov * Action push tunnel 234c6821abfSDanylo Vodopianov */ 235c6821abfSDanylo Vodopianov struct tunnel_header_s tun_hdr; 236c6821abfSDanylo Vodopianov 237c6821abfSDanylo Vodopianov /* 238c6821abfSDanylo Vodopianov * If DPDK RTE tunnel helper API used 239c6821abfSDanylo Vodopianov * this holds the tunnel if used in flow 240c6821abfSDanylo Vodopianov */ 241c6821abfSDanylo Vodopianov struct tunnel_s *tnl; 242c6821abfSDanylo Vodopianov 243c6821abfSDanylo Vodopianov /* 244c6821abfSDanylo Vodopianov * Header Stripper 245c6821abfSDanylo Vodopianov */ 246c6821abfSDanylo Vodopianov int header_strip_end_dyn; 247c6821abfSDanylo Vodopianov int header_strip_end_ofs; 248c6821abfSDanylo Vodopianov 249c6821abfSDanylo Vodopianov /* 2506fec9a9aSSerhii Iliushyk * Modify field 2516fec9a9aSSerhii Iliushyk */ 2526fec9a9aSSerhii Iliushyk struct { 2536fec9a9aSSerhii Iliushyk uint32_t select; 254339ca124SDanylo Vodopianov uint32_t dyn; 255339ca124SDanylo Vodopianov uint32_t ofs; 256339ca124SDanylo Vodopianov uint32_t len; 257339ca124SDanylo Vodopianov uint32_t level; 2586fec9a9aSSerhii Iliushyk union { 2596fec9a9aSSerhii Iliushyk uint8_t value8[16]; 2606fec9a9aSSerhii Iliushyk uint16_t value16[8]; 2616fec9a9aSSerhii Iliushyk uint32_t value32[4]; 2626fec9a9aSSerhii Iliushyk }; 2636fec9a9aSSerhii Iliushyk } modify_field[MAX_CPY_WRITERS_SUPPORTED]; 2646fec9a9aSSerhii Iliushyk 2656fec9a9aSSerhii Iliushyk uint32_t modify_field_count; 266339ca124SDanylo Vodopianov uint8_t ttl_sub_enable; 267339ca124SDanylo Vodopianov uint8_t ttl_sub_ipv4; 268339ca124SDanylo Vodopianov uint8_t ttl_sub_outer; 2696fec9a9aSSerhii Iliushyk 2706fec9a9aSSerhii Iliushyk /* 2716fec9a9aSSerhii Iliushyk * Key Matcher flow definitions 2726fec9a9aSSerhii Iliushyk */ 2736fec9a9aSSerhii Iliushyk struct km_flow_def_s km; 2747fa0bf29SDanylo Vodopianov 2757fa0bf29SDanylo Vodopianov /* 2767fa0bf29SDanylo Vodopianov * Hash module RSS definitions 2777fa0bf29SDanylo Vodopianov */ 2787fa0bf29SDanylo Vodopianov struct hsh_def_s hsh; 279c0d44442SDanylo Vodopianov 280c0d44442SDanylo Vodopianov /* 281c0d44442SDanylo Vodopianov * AGE action timeout 282c0d44442SDanylo Vodopianov */ 283c0d44442SDanylo Vodopianov struct age_def_s age; 2846019656dSOleksandr Kolomeiets 2856019656dSOleksandr Kolomeiets /* 2866019656dSOleksandr Kolomeiets * TX fragmentation IFR/RPP_LR MTU recipe 2876019656dSOleksandr Kolomeiets */ 2886019656dSOleksandr Kolomeiets uint8_t flm_mtu_fragmentation_recipe; 289e02fdb65SSerhii Iliushyk }; 290e02fdb65SSerhii Iliushyk 291e02fdb65SSerhii Iliushyk enum flow_handle_type { 292e02fdb65SSerhii Iliushyk FLOW_HANDLE_TYPE_FLOW, 293e02fdb65SSerhii Iliushyk FLOW_HANDLE_TYPE_FLM, 294e02fdb65SSerhii Iliushyk }; 2958385ba0eSSerhii Iliushyk 2962005c549SSerhii Iliushyk struct flow_handle { 297e02fdb65SSerhii Iliushyk enum flow_handle_type type; 298e02fdb65SSerhii Iliushyk uint32_t flm_id; 299e02fdb65SSerhii Iliushyk uint16_t caller_id; 300e02fdb65SSerhii Iliushyk uint16_t learn_ignored; 301e02fdb65SSerhii Iliushyk 3022005c549SSerhii Iliushyk struct flow_eth_dev *dev; 3032005c549SSerhii Iliushyk struct flow_handle *next; 304e02fdb65SSerhii Iliushyk struct flow_handle *prev; 305e02fdb65SSerhii Iliushyk 3066f0fe142SOleksandr Kolomeiets /* Flow specific pointer to application data stored during action creation. */ 3076f0fe142SOleksandr Kolomeiets void *context; 308e02fdb65SSerhii Iliushyk void *user_data; 309e02fdb65SSerhii Iliushyk 310e02fdb65SSerhii Iliushyk union { 311e02fdb65SSerhii Iliushyk struct { 312e02fdb65SSerhii Iliushyk /* 313e02fdb65SSerhii Iliushyk * 1st step conversion and validation of flow 314e02fdb65SSerhii Iliushyk * verified and converted flow match + actions structure 315e02fdb65SSerhii Iliushyk */ 316e02fdb65SSerhii Iliushyk struct nic_flow_def *fd; 317e02fdb65SSerhii Iliushyk /* 318e02fdb65SSerhii Iliushyk * 2nd step NIC HW resource allocation and configuration 319e02fdb65SSerhii Iliushyk * NIC resource management structures 320e02fdb65SSerhii Iliushyk */ 321e02fdb65SSerhii Iliushyk struct { 322e02fdb65SSerhii Iliushyk uint32_t db_idx_counter; 323e02fdb65SSerhii Iliushyk uint32_t db_idxs[RES_COUNT]; 324e02fdb65SSerhii Iliushyk }; 325e02fdb65SSerhii Iliushyk uint32_t port_id; /* MAC port ID or override of virtual in_port */ 326e02fdb65SSerhii Iliushyk }; 327e02fdb65SSerhii Iliushyk 328e02fdb65SSerhii Iliushyk struct { 329e02fdb65SSerhii Iliushyk uint32_t flm_db_idx_counter; 330e02fdb65SSerhii Iliushyk uint32_t flm_db_idxs[RES_COUNT]; 331e02fdb65SSerhii Iliushyk 3324033e053SDanylo Vodopianov uint32_t flm_mtr_ids[MAX_FLM_MTRS_SUPPORTED]; 3334033e053SDanylo Vodopianov 334e02fdb65SSerhii Iliushyk uint32_t flm_data[10]; 335e02fdb65SSerhii Iliushyk uint8_t flm_prot; 336e02fdb65SSerhii Iliushyk uint8_t flm_kid; 337e02fdb65SSerhii Iliushyk uint8_t flm_prio; 338e02fdb65SSerhii Iliushyk uint8_t flm_ft; 339e02fdb65SSerhii Iliushyk 340e02fdb65SSerhii Iliushyk uint16_t flm_rpl_ext_ptr; 341e02fdb65SSerhii Iliushyk uint32_t flm_nat_ipv4; 342e02fdb65SSerhii Iliushyk uint16_t flm_nat_port; 343e02fdb65SSerhii Iliushyk uint8_t flm_dscp; 344e02fdb65SSerhii Iliushyk uint32_t flm_teid; 345e02fdb65SSerhii Iliushyk uint8_t flm_rqi; 346e02fdb65SSerhii Iliushyk uint8_t flm_qfi; 347e7e01fd1SDanylo Vodopianov uint8_t flm_scrub_prof; 3481042162dSDanylo Vodopianov 3496019656dSOleksandr Kolomeiets uint8_t flm_mtu_fragmentation_recipe; 3506019656dSOleksandr Kolomeiets 3511042162dSDanylo Vodopianov /* Flow specific pointer to application template table cell stored during 3521042162dSDanylo Vodopianov * flow create. 3531042162dSDanylo Vodopianov */ 3541042162dSDanylo Vodopianov struct flow_template_table_cell *template_table_cell; 3551042162dSDanylo Vodopianov bool flm_async; 356e02fdb65SSerhii Iliushyk }; 357e02fdb65SSerhii Iliushyk }; 3582005c549SSerhii Iliushyk }; 3592005c549SSerhii Iliushyk 36087b3bb06SDanylo Vodopianov struct flow_pattern_template { 36196d92ae4SDanylo Vodopianov struct nic_flow_def *fd; 36287b3bb06SDanylo Vodopianov }; 36387b3bb06SDanylo Vodopianov 36487b3bb06SDanylo Vodopianov struct flow_actions_template { 3651042162dSDanylo Vodopianov struct nic_flow_def *fd; 3661042162dSDanylo Vodopianov 3671042162dSDanylo Vodopianov uint32_t num_dest_port; 3681042162dSDanylo Vodopianov uint32_t num_queues; 36987b3bb06SDanylo Vodopianov }; 3701042162dSDanylo Vodopianov 3711042162dSDanylo Vodopianov struct flow_template_table_cell { 3721042162dSDanylo Vodopianov atomic_int status; 3731042162dSDanylo Vodopianov atomic_int counter; 3741042162dSDanylo Vodopianov 3751042162dSDanylo Vodopianov uint32_t flm_db_idx_counter; 3761042162dSDanylo Vodopianov uint32_t flm_db_idxs[RES_COUNT]; 3771042162dSDanylo Vodopianov 3781042162dSDanylo Vodopianov uint32_t flm_key_id; 3791042162dSDanylo Vodopianov uint32_t flm_ft; 3801042162dSDanylo Vodopianov 3811042162dSDanylo Vodopianov uint16_t flm_rpl_ext_ptr; 3821042162dSDanylo Vodopianov uint8_t flm_scrub_prof; 3831042162dSDanylo Vodopianov }; 3841042162dSDanylo Vodopianov 38587b3bb06SDanylo Vodopianov struct flow_template_table { 3861042162dSDanylo Vodopianov struct flow_pattern_template **pattern_templates; 3871042162dSDanylo Vodopianov uint8_t nb_pattern_templates; 3881042162dSDanylo Vodopianov 3891042162dSDanylo Vodopianov struct flow_actions_template **actions_templates; 3901042162dSDanylo Vodopianov uint8_t nb_actions_templates; 3911042162dSDanylo Vodopianov 3921042162dSDanylo Vodopianov struct flow_template_table_cell *pattern_action_pairs; 3931042162dSDanylo Vodopianov 3941042162dSDanylo Vodopianov struct rte_flow_attr attr; 3951042162dSDanylo Vodopianov uint16_t forced_vlan_vid; 3961042162dSDanylo Vodopianov uint16_t caller_id; 39787b3bb06SDanylo Vodopianov }; 39887b3bb06SDanylo Vodopianov 3999bd46cf2SDanylo Vodopianov void km_attach_ndev_resource_management(struct km_flow_def_s *km, void **handle); 4001d3f62a0SOleksandr Kolomeiets void km_free_ndev_resource_management(void **handle); 4011d3f62a0SOleksandr Kolomeiets 4026fec9a9aSSerhii Iliushyk int km_add_match_elem(struct km_flow_def_s *km, uint32_t e_word[4], uint32_t e_mask[4], 4036fec9a9aSSerhii Iliushyk uint32_t word_len, enum frame_offs_e start, int8_t offset); 4046fec9a9aSSerhii Iliushyk 4059bd46cf2SDanylo Vodopianov int km_key_create(struct km_flow_def_s *km, uint32_t port_id); 4069bd46cf2SDanylo Vodopianov /* 4079bd46cf2SDanylo Vodopianov * Compares 2 KM key definitions after first collect validate and optimization. 4089bd46cf2SDanylo Vodopianov * km is compared against an existing km1. 4099bd46cf2SDanylo Vodopianov * if identical, km1 flow_type is returned 4109bd46cf2SDanylo Vodopianov */ 4119bd46cf2SDanylo Vodopianov int km_key_compare(struct km_flow_def_s *km, struct km_flow_def_s *km1); 4129bd46cf2SDanylo Vodopianov 4139bd46cf2SDanylo Vodopianov int km_rcp_set(struct km_flow_def_s *km, int index); 4149bd46cf2SDanylo Vodopianov 4159bd46cf2SDanylo Vodopianov int km_write_data_match_entry(struct km_flow_def_s *km, uint32_t color); 4169bd46cf2SDanylo Vodopianov int km_clear_data_match_entry(struct km_flow_def_s *km); 4179bd46cf2SDanylo Vodopianov 4181d3f62a0SOleksandr Kolomeiets void kcc_free_ndev_resource_management(void **handle); 4191d3f62a0SOleksandr Kolomeiets 4208385ba0eSSerhii Iliushyk /* 4218385ba0eSSerhii Iliushyk * Group management 4228385ba0eSSerhii Iliushyk */ 4238385ba0eSSerhii Iliushyk int flow_group_handle_create(void **handle, uint32_t group_count); 4248385ba0eSSerhii Iliushyk int flow_group_handle_destroy(void **handle); 425e02fdb65SSerhii Iliushyk 426e02fdb65SSerhii Iliushyk int flow_group_translate_get(void *handle, uint8_t owner_id, uint8_t port_id, uint32_t group_in, 427e02fdb65SSerhii Iliushyk uint32_t *group_out); 428e02fdb65SSerhii Iliushyk 4291d3f62a0SOleksandr Kolomeiets #endif /* _FLOW_API_ENGINE_H_ */ 430