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, 471d3f62a0SOleksandr Kolomeiets RES_INVALID 481d3f62a0SOleksandr Kolomeiets }; 491d3f62a0SOleksandr Kolomeiets 50b01eb812SDanylo Vodopianov /* 51b01eb812SDanylo Vodopianov * Flow NIC offload management 52b01eb812SDanylo Vodopianov */ 53b01eb812SDanylo Vodopianov #define MAX_OUTPUT_DEST (128) 54b01eb812SDanylo Vodopianov 559bd46cf2SDanylo Vodopianov #define MAX_WORD_NUM 24 569bd46cf2SDanylo Vodopianov #define MAX_BANKS 6 579bd46cf2SDanylo Vodopianov 589bd46cf2SDanylo Vodopianov #define MAX_TCAM_START_OFFSETS 4 599bd46cf2SDanylo Vodopianov 608385ba0eSSerhii Iliushyk #define MAX_CPY_WRITERS_SUPPORTED 8 618385ba0eSSerhii Iliushyk 626fec9a9aSSerhii Iliushyk #define MAX_MATCH_FIELDS 16 636fec9a9aSSerhii Iliushyk 64c6821abfSDanylo Vodopianov /* 659bd46cf2SDanylo Vodopianov * 128 128 32 32 32 669bd46cf2SDanylo Vodopianov * Have | QW0 || QW4 || SW8 || SW9 | SWX in FPGA 679bd46cf2SDanylo Vodopianov * 689bd46cf2SDanylo Vodopianov * Each word may start at any offset, though 699bd46cf2SDanylo Vodopianov * they are combined in chronological order, with all enabled to 709bd46cf2SDanylo Vodopianov * build the extracted match data, thus that is how the match key 719bd46cf2SDanylo Vodopianov * must be build 72c6821abfSDanylo Vodopianov */ 739bd46cf2SDanylo Vodopianov enum extractor_e { 749bd46cf2SDanylo Vodopianov KM_USE_EXTRACTOR_UNDEF, 759bd46cf2SDanylo Vodopianov KM_USE_EXTRACTOR_QWORD, 769bd46cf2SDanylo Vodopianov KM_USE_EXTRACTOR_SWORD, 77c6821abfSDanylo Vodopianov }; 78c6821abfSDanylo Vodopianov 796fec9a9aSSerhii Iliushyk struct match_elem_s { 809bd46cf2SDanylo Vodopianov enum extractor_e extr; 816fec9a9aSSerhii Iliushyk int masked_for_tcam; /* if potentially selected for TCAM */ 826fec9a9aSSerhii Iliushyk uint32_t e_word[4]; 836fec9a9aSSerhii Iliushyk uint32_t e_mask[4]; 846fec9a9aSSerhii Iliushyk 856fec9a9aSSerhii Iliushyk int extr_start_offs_id; 866fec9a9aSSerhii Iliushyk int8_t rel_offs; 876fec9a9aSSerhii Iliushyk uint32_t word_len; 886fec9a9aSSerhii Iliushyk }; 896fec9a9aSSerhii Iliushyk 909bd46cf2SDanylo Vodopianov enum cam_tech_use_e { 919bd46cf2SDanylo Vodopianov KM_CAM, 929bd46cf2SDanylo Vodopianov KM_TCAM, 939bd46cf2SDanylo Vodopianov KM_SYNERGY 949bd46cf2SDanylo Vodopianov }; 959bd46cf2SDanylo Vodopianov 966fec9a9aSSerhii Iliushyk struct km_flow_def_s { 976fec9a9aSSerhii Iliushyk struct flow_api_backend_s *be; 986fec9a9aSSerhii Iliushyk 999bd46cf2SDanylo Vodopianov /* For keeping track of identical entries */ 1009bd46cf2SDanylo Vodopianov struct km_flow_def_s *reference; 1019bd46cf2SDanylo Vodopianov struct km_flow_def_s *root; 1029bd46cf2SDanylo Vodopianov 1036fec9a9aSSerhii Iliushyk /* For collect flow elements and sorting */ 1046fec9a9aSSerhii Iliushyk struct match_elem_s match[MAX_MATCH_FIELDS]; 1059bd46cf2SDanylo Vodopianov struct match_elem_s *match_map[MAX_MATCH_FIELDS]; 1066fec9a9aSSerhii Iliushyk int num_ftype_elem; 1076fec9a9aSSerhii Iliushyk 1089bd46cf2SDanylo Vodopianov /* Finally formatted CAM/TCAM entry */ 1099bd46cf2SDanylo Vodopianov enum cam_tech_use_e target; 1109bd46cf2SDanylo Vodopianov uint32_t entry_word[MAX_WORD_NUM]; 1119bd46cf2SDanylo Vodopianov uint32_t entry_mask[MAX_WORD_NUM]; 1129bd46cf2SDanylo Vodopianov int key_word_size; 1139bd46cf2SDanylo Vodopianov 1149bd46cf2SDanylo Vodopianov /* TCAM calculated possible bank start offsets */ 1159bd46cf2SDanylo Vodopianov int start_offsets[MAX_TCAM_START_OFFSETS]; 1169bd46cf2SDanylo Vodopianov int num_start_offsets; 1179bd46cf2SDanylo Vodopianov 1186fec9a9aSSerhii Iliushyk /* Flow information */ 1196fec9a9aSSerhii Iliushyk /* HW input port ID needed for compare. In port must be identical on flow types */ 1206fec9a9aSSerhii Iliushyk uint32_t port_id; 1219bd46cf2SDanylo Vodopianov uint32_t info; /* used for color (actions) */ 1229bd46cf2SDanylo Vodopianov int info_set; 1239bd46cf2SDanylo Vodopianov int flow_type; /* 0 is illegal and used as unset */ 1249bd46cf2SDanylo Vodopianov int flushed_to_target; /* if this km entry has been finally programmed into NIC hw */ 1259bd46cf2SDanylo Vodopianov 1269bd46cf2SDanylo Vodopianov /* CAM specific bank management */ 1279bd46cf2SDanylo Vodopianov int cam_paired; 1289bd46cf2SDanylo Vodopianov int record_indexes[MAX_BANKS]; 1299bd46cf2SDanylo Vodopianov int bank_used; 1309bd46cf2SDanylo Vodopianov uint32_t *cuckoo_moves; /* for CAM statistics only */ 1319bd46cf2SDanylo Vodopianov struct cam_distrib_s *cam_dist; 1327fa0bf29SDanylo Vodopianov struct hasher_s *hsh; 1339bd46cf2SDanylo Vodopianov 1349bd46cf2SDanylo Vodopianov /* TCAM specific bank management */ 1359bd46cf2SDanylo Vodopianov struct tcam_distrib_s *tcam_dist; 1369bd46cf2SDanylo Vodopianov int tcam_start_bank; 1379bd46cf2SDanylo Vodopianov int tcam_record; 1389bd46cf2SDanylo Vodopianov }; 1399bd46cf2SDanylo Vodopianov 1409bd46cf2SDanylo Vodopianov /* 1417fa0bf29SDanylo Vodopianov * RSS configuration, see struct rte_flow_action_rss 1427fa0bf29SDanylo Vodopianov */ 1437fa0bf29SDanylo Vodopianov struct hsh_def_s { 1447fa0bf29SDanylo Vodopianov enum rte_eth_hash_function func; /* RSS hash function to apply */ 1457fa0bf29SDanylo Vodopianov /* RSS hash types, see definition of RTE_ETH_RSS_* for hash calculation options */ 1467fa0bf29SDanylo Vodopianov uint64_t types; 1477fa0bf29SDanylo Vodopianov uint32_t key_len; /* Hash key length in bytes. */ 1487fa0bf29SDanylo Vodopianov const uint8_t *key; /* Hash key. */ 1497fa0bf29SDanylo Vodopianov }; 1507fa0bf29SDanylo Vodopianov 1517fa0bf29SDanylo Vodopianov /* 1529bd46cf2SDanylo Vodopianov * Tunnel encapsulation header definition 1539bd46cf2SDanylo Vodopianov */ 1549bd46cf2SDanylo Vodopianov #define MAX_TUN_HDR_SIZE 128 1559bd46cf2SDanylo Vodopianov 1569bd46cf2SDanylo Vodopianov struct tunnel_header_s { 1579bd46cf2SDanylo Vodopianov union { 1589bd46cf2SDanylo Vodopianov uint8_t hdr8[MAX_TUN_HDR_SIZE]; 1599bd46cf2SDanylo Vodopianov uint32_t hdr32[(MAX_TUN_HDR_SIZE + 3) / 4]; 1609bd46cf2SDanylo Vodopianov } d; 1619bd46cf2SDanylo Vodopianov 1629bd46cf2SDanylo Vodopianov uint8_t len; 1639bd46cf2SDanylo Vodopianov 1649bd46cf2SDanylo Vodopianov uint8_t nb_vlans; 1659bd46cf2SDanylo Vodopianov 1669bd46cf2SDanylo Vodopianov uint8_t ip_version; /* 4: v4, 6: v6 */ 1679bd46cf2SDanylo Vodopianov 1689bd46cf2SDanylo Vodopianov uint8_t new_outer; 1699bd46cf2SDanylo Vodopianov uint8_t l2_len; 1709bd46cf2SDanylo Vodopianov uint8_t l3_len; 1719bd46cf2SDanylo Vodopianov uint8_t l4_len; 1726fec9a9aSSerhii Iliushyk }; 1736fec9a9aSSerhii Iliushyk 174e02fdb65SSerhii Iliushyk enum flow_port_type_e { 175e02fdb65SSerhii Iliushyk PORT_NONE, /* not defined or drop */ 176e02fdb65SSerhii Iliushyk PORT_INTERNAL, /* no queues attached */ 177e02fdb65SSerhii Iliushyk PORT_PHY, /* MAC phy output queue */ 178e02fdb65SSerhii Iliushyk PORT_VIRT, /* Memory queues to Host */ 179e02fdb65SSerhii Iliushyk }; 180e02fdb65SSerhii Iliushyk 181e02fdb65SSerhii Iliushyk struct output_s { 182e02fdb65SSerhii Iliushyk uint32_t owning_port_id;/* the port who owns this output destination */ 183e02fdb65SSerhii Iliushyk enum flow_port_type_e type; 184e02fdb65SSerhii Iliushyk int id; /* depending on port type: queue ID or physical port id or not used */ 185e02fdb65SSerhii Iliushyk int active; /* activated */ 186e02fdb65SSerhii Iliushyk }; 187e02fdb65SSerhii Iliushyk 188e02fdb65SSerhii Iliushyk struct nic_flow_def { 189e02fdb65SSerhii Iliushyk /* 190e02fdb65SSerhii Iliushyk * Frame Decoder match info collected 191e02fdb65SSerhii Iliushyk */ 192e02fdb65SSerhii Iliushyk int l2_prot; 193e02fdb65SSerhii Iliushyk int l3_prot; 194e02fdb65SSerhii Iliushyk int l4_prot; 195e02fdb65SSerhii Iliushyk int tunnel_prot; 196e02fdb65SSerhii Iliushyk int tunnel_l3_prot; 197e02fdb65SSerhii Iliushyk int tunnel_l4_prot; 198e02fdb65SSerhii Iliushyk int vlans; 199e02fdb65SSerhii Iliushyk int fragmentation; 200e02fdb65SSerhii Iliushyk int ip_prot; 201e02fdb65SSerhii Iliushyk int tunnel_ip_prot; 202e02fdb65SSerhii Iliushyk /* 203e02fdb65SSerhii Iliushyk * Additional meta data for various functions 204e02fdb65SSerhii Iliushyk */ 205e02fdb65SSerhii Iliushyk int in_port_override; 206e02fdb65SSerhii Iliushyk int non_empty; /* default value is -1; value 1 means flow actions update */ 207e02fdb65SSerhii Iliushyk struct output_s dst_id[MAX_OUTPUT_DEST];/* define the output to use */ 208e02fdb65SSerhii Iliushyk /* total number of available queues defined for all outputs - i.e. number of dst_id's */ 209e02fdb65SSerhii Iliushyk int dst_num_avail; 210e02fdb65SSerhii Iliushyk 211e02fdb65SSerhii Iliushyk /* 212e02fdb65SSerhii Iliushyk * Mark or Action info collection 213e02fdb65SSerhii Iliushyk */ 214e02fdb65SSerhii Iliushyk uint32_t mark; 215e02fdb65SSerhii Iliushyk 216e02fdb65SSerhii Iliushyk uint32_t jump_to_group; 217e02fdb65SSerhii Iliushyk 218e02fdb65SSerhii Iliushyk int full_offload; 2196fec9a9aSSerhii Iliushyk 2206fec9a9aSSerhii Iliushyk /* 221c6821abfSDanylo Vodopianov * Action push tunnel 222c6821abfSDanylo Vodopianov */ 223c6821abfSDanylo Vodopianov struct tunnel_header_s tun_hdr; 224c6821abfSDanylo Vodopianov 225c6821abfSDanylo Vodopianov /* 226c6821abfSDanylo Vodopianov * If DPDK RTE tunnel helper API used 227c6821abfSDanylo Vodopianov * this holds the tunnel if used in flow 228c6821abfSDanylo Vodopianov */ 229c6821abfSDanylo Vodopianov struct tunnel_s *tnl; 230c6821abfSDanylo Vodopianov 231c6821abfSDanylo Vodopianov /* 232c6821abfSDanylo Vodopianov * Header Stripper 233c6821abfSDanylo Vodopianov */ 234c6821abfSDanylo Vodopianov int header_strip_end_dyn; 235c6821abfSDanylo Vodopianov int header_strip_end_ofs; 236c6821abfSDanylo Vodopianov 237c6821abfSDanylo Vodopianov /* 2386fec9a9aSSerhii Iliushyk * Modify field 2396fec9a9aSSerhii Iliushyk */ 2406fec9a9aSSerhii Iliushyk struct { 2416fec9a9aSSerhii Iliushyk uint32_t select; 242339ca124SDanylo Vodopianov uint32_t dyn; 243339ca124SDanylo Vodopianov uint32_t ofs; 244339ca124SDanylo Vodopianov uint32_t len; 245339ca124SDanylo Vodopianov uint32_t level; 2466fec9a9aSSerhii Iliushyk union { 2476fec9a9aSSerhii Iliushyk uint8_t value8[16]; 2486fec9a9aSSerhii Iliushyk uint16_t value16[8]; 2496fec9a9aSSerhii Iliushyk uint32_t value32[4]; 2506fec9a9aSSerhii Iliushyk }; 2516fec9a9aSSerhii Iliushyk } modify_field[MAX_CPY_WRITERS_SUPPORTED]; 2526fec9a9aSSerhii Iliushyk 2536fec9a9aSSerhii Iliushyk uint32_t modify_field_count; 254339ca124SDanylo Vodopianov uint8_t ttl_sub_enable; 255339ca124SDanylo Vodopianov uint8_t ttl_sub_ipv4; 256339ca124SDanylo Vodopianov uint8_t ttl_sub_outer; 2576fec9a9aSSerhii Iliushyk 2586fec9a9aSSerhii Iliushyk /* 2596fec9a9aSSerhii Iliushyk * Key Matcher flow definitions 2606fec9a9aSSerhii Iliushyk */ 2616fec9a9aSSerhii Iliushyk struct km_flow_def_s km; 2627fa0bf29SDanylo Vodopianov 2637fa0bf29SDanylo Vodopianov /* 2647fa0bf29SDanylo Vodopianov * Hash module RSS definitions 2657fa0bf29SDanylo Vodopianov */ 2667fa0bf29SDanylo Vodopianov struct hsh_def_s hsh; 267e02fdb65SSerhii Iliushyk }; 268e02fdb65SSerhii Iliushyk 269e02fdb65SSerhii Iliushyk enum flow_handle_type { 270e02fdb65SSerhii Iliushyk FLOW_HANDLE_TYPE_FLOW, 271e02fdb65SSerhii Iliushyk FLOW_HANDLE_TYPE_FLM, 272e02fdb65SSerhii Iliushyk }; 2738385ba0eSSerhii Iliushyk 2742005c549SSerhii Iliushyk struct flow_handle { 275e02fdb65SSerhii Iliushyk enum flow_handle_type type; 276e02fdb65SSerhii Iliushyk uint32_t flm_id; 277e02fdb65SSerhii Iliushyk uint16_t caller_id; 278e02fdb65SSerhii Iliushyk uint16_t learn_ignored; 279e02fdb65SSerhii Iliushyk 2802005c549SSerhii Iliushyk struct flow_eth_dev *dev; 2812005c549SSerhii Iliushyk struct flow_handle *next; 282e02fdb65SSerhii Iliushyk struct flow_handle *prev; 283e02fdb65SSerhii Iliushyk 2846f0fe142SOleksandr Kolomeiets /* Flow specific pointer to application data stored during action creation. */ 2856f0fe142SOleksandr Kolomeiets void *context; 286e02fdb65SSerhii Iliushyk void *user_data; 287e02fdb65SSerhii Iliushyk 288e02fdb65SSerhii Iliushyk union { 289e02fdb65SSerhii Iliushyk struct { 290e02fdb65SSerhii Iliushyk /* 291e02fdb65SSerhii Iliushyk * 1st step conversion and validation of flow 292e02fdb65SSerhii Iliushyk * verified and converted flow match + actions structure 293e02fdb65SSerhii Iliushyk */ 294e02fdb65SSerhii Iliushyk struct nic_flow_def *fd; 295e02fdb65SSerhii Iliushyk /* 296e02fdb65SSerhii Iliushyk * 2nd step NIC HW resource allocation and configuration 297e02fdb65SSerhii Iliushyk * NIC resource management structures 298e02fdb65SSerhii Iliushyk */ 299e02fdb65SSerhii Iliushyk struct { 300e02fdb65SSerhii Iliushyk uint32_t db_idx_counter; 301e02fdb65SSerhii Iliushyk uint32_t db_idxs[RES_COUNT]; 302e02fdb65SSerhii Iliushyk }; 303e02fdb65SSerhii Iliushyk uint32_t port_id; /* MAC port ID or override of virtual in_port */ 304e02fdb65SSerhii Iliushyk }; 305e02fdb65SSerhii Iliushyk 306e02fdb65SSerhii Iliushyk struct { 307e02fdb65SSerhii Iliushyk uint32_t flm_db_idx_counter; 308e02fdb65SSerhii Iliushyk uint32_t flm_db_idxs[RES_COUNT]; 309e02fdb65SSerhii Iliushyk 310e02fdb65SSerhii Iliushyk uint32_t flm_data[10]; 311e02fdb65SSerhii Iliushyk uint8_t flm_prot; 312e02fdb65SSerhii Iliushyk uint8_t flm_kid; 313e02fdb65SSerhii Iliushyk uint8_t flm_prio; 314e02fdb65SSerhii Iliushyk uint8_t flm_ft; 315e02fdb65SSerhii Iliushyk 316e02fdb65SSerhii Iliushyk uint16_t flm_rpl_ext_ptr; 317e02fdb65SSerhii Iliushyk uint32_t flm_nat_ipv4; 318e02fdb65SSerhii Iliushyk uint16_t flm_nat_port; 319e02fdb65SSerhii Iliushyk uint8_t flm_dscp; 320e02fdb65SSerhii Iliushyk uint32_t flm_teid; 321e02fdb65SSerhii Iliushyk uint8_t flm_rqi; 322e02fdb65SSerhii Iliushyk uint8_t flm_qfi; 323*e7e01fd1SDanylo Vodopianov uint8_t flm_scrub_prof; 324e02fdb65SSerhii Iliushyk }; 325e02fdb65SSerhii Iliushyk }; 3262005c549SSerhii Iliushyk }; 3272005c549SSerhii Iliushyk 3289bd46cf2SDanylo Vodopianov void km_attach_ndev_resource_management(struct km_flow_def_s *km, void **handle); 3291d3f62a0SOleksandr Kolomeiets void km_free_ndev_resource_management(void **handle); 3301d3f62a0SOleksandr Kolomeiets 3316fec9a9aSSerhii Iliushyk int km_add_match_elem(struct km_flow_def_s *km, uint32_t e_word[4], uint32_t e_mask[4], 3326fec9a9aSSerhii Iliushyk uint32_t word_len, enum frame_offs_e start, int8_t offset); 3336fec9a9aSSerhii Iliushyk 3349bd46cf2SDanylo Vodopianov int km_key_create(struct km_flow_def_s *km, uint32_t port_id); 3359bd46cf2SDanylo Vodopianov /* 3369bd46cf2SDanylo Vodopianov * Compares 2 KM key definitions after first collect validate and optimization. 3379bd46cf2SDanylo Vodopianov * km is compared against an existing km1. 3389bd46cf2SDanylo Vodopianov * if identical, km1 flow_type is returned 3399bd46cf2SDanylo Vodopianov */ 3409bd46cf2SDanylo Vodopianov int km_key_compare(struct km_flow_def_s *km, struct km_flow_def_s *km1); 3419bd46cf2SDanylo Vodopianov 3429bd46cf2SDanylo Vodopianov int km_rcp_set(struct km_flow_def_s *km, int index); 3439bd46cf2SDanylo Vodopianov 3449bd46cf2SDanylo Vodopianov int km_write_data_match_entry(struct km_flow_def_s *km, uint32_t color); 3459bd46cf2SDanylo Vodopianov int km_clear_data_match_entry(struct km_flow_def_s *km); 3469bd46cf2SDanylo Vodopianov 3471d3f62a0SOleksandr Kolomeiets void kcc_free_ndev_resource_management(void **handle); 3481d3f62a0SOleksandr Kolomeiets 3498385ba0eSSerhii Iliushyk /* 3508385ba0eSSerhii Iliushyk * Group management 3518385ba0eSSerhii Iliushyk */ 3528385ba0eSSerhii Iliushyk int flow_group_handle_create(void **handle, uint32_t group_count); 3538385ba0eSSerhii Iliushyk int flow_group_handle_destroy(void **handle); 354e02fdb65SSerhii Iliushyk 355e02fdb65SSerhii Iliushyk int flow_group_translate_get(void *handle, uint8_t owner_id, uint8_t port_id, uint32_t group_in, 356e02fdb65SSerhii Iliushyk uint32_t *group_out); 357e02fdb65SSerhii Iliushyk 3581d3f62a0SOleksandr Kolomeiets #endif /* _FLOW_API_ENGINE_H_ */ 359