136cf85c8SOleksandr Kolomeiets /* 236cf85c8SOleksandr Kolomeiets * SPDX-License-Identifier: BSD-3-Clause 336cf85c8SOleksandr Kolomeiets * Copyright(c) 2023 Napatech A/S 436cf85c8SOleksandr Kolomeiets */ 536cf85c8SOleksandr Kolomeiets 636cf85c8SOleksandr Kolomeiets #ifndef _FLOW_API_H_ 736cf85c8SOleksandr Kolomeiets #define _FLOW_API_H_ 836cf85c8SOleksandr Kolomeiets 91d3f62a0SOleksandr Kolomeiets #include <pthread.h> 101d3f62a0SOleksandr Kolomeiets 110ea00f33SOleksandr Kolomeiets #include "ntlog.h" 120ea00f33SOleksandr Kolomeiets 131d3f62a0SOleksandr Kolomeiets #include "flow_api_engine.h" 148df4a5f8SOleksandr Kolomeiets #include "hw_mod_backend.h" 151d3f62a0SOleksandr Kolomeiets #include "stream_binary_flow_api.h" 161d3f62a0SOleksandr Kolomeiets 171d3f62a0SOleksandr Kolomeiets /* 181d3f62a0SOleksandr Kolomeiets * Flow NIC and Eth port device management 191d3f62a0SOleksandr Kolomeiets */ 201d3f62a0SOleksandr Kolomeiets 211d3f62a0SOleksandr Kolomeiets struct hw_mod_resource_s { 221d3f62a0SOleksandr Kolomeiets uint8_t *alloc_bm; /* allocation bitmap */ 231d3f62a0SOleksandr Kolomeiets uint32_t *ref; /* reference counter for each resource element */ 241d3f62a0SOleksandr Kolomeiets uint32_t resource_count;/* number of total available entries */ 251d3f62a0SOleksandr Kolomeiets }; 261d3f62a0SOleksandr Kolomeiets 271d3f62a0SOleksandr Kolomeiets /* 281d3f62a0SOleksandr Kolomeiets * Device Management API 291d3f62a0SOleksandr Kolomeiets */ 301d3f62a0SOleksandr Kolomeiets int flow_delete_eth_dev(struct flow_eth_dev *eth_dev); 311d3f62a0SOleksandr Kolomeiets 321d3f62a0SOleksandr Kolomeiets struct flow_eth_dev { 331d3f62a0SOleksandr Kolomeiets /* NIC that owns this port device */ 341d3f62a0SOleksandr Kolomeiets struct flow_nic_dev *ndev; 351d3f62a0SOleksandr Kolomeiets /* NIC port id */ 361d3f62a0SOleksandr Kolomeiets uint8_t port; 371d3f62a0SOleksandr Kolomeiets 381d3f62a0SOleksandr Kolomeiets /* 0th for exception */ 391d3f62a0SOleksandr Kolomeiets struct flow_queue_id_s rx_queue[FLOW_MAX_QUEUES + 1]; 401d3f62a0SOleksandr Kolomeiets 411d3f62a0SOleksandr Kolomeiets /* VSWITCH has exceptions sent on queue 0 per design */ 421d3f62a0SOleksandr Kolomeiets int num_queues; 431d3f62a0SOleksandr Kolomeiets 441d3f62a0SOleksandr Kolomeiets struct flow_eth_dev *next; 451d3f62a0SOleksandr Kolomeiets }; 468df4a5f8SOleksandr Kolomeiets 4736cf85c8SOleksandr Kolomeiets /* registered NIC backends */ 488df4a5f8SOleksandr Kolomeiets struct flow_nic_dev { 49*7917b0d3SOleksandr Kolomeiets uint8_t adapter_no; /* physical adapter no in the host system */ 50*7917b0d3SOleksandr Kolomeiets uint16_t ports; /* number of in-ports addressable on this NIC */ 51*7917b0d3SOleksandr Kolomeiets 521d3f62a0SOleksandr Kolomeiets struct hw_mod_resource_s res[RES_COUNT];/* raw NIC resource allocation table */ 531d3f62a0SOleksandr Kolomeiets void *km_res_handle; 541d3f62a0SOleksandr Kolomeiets void *kcc_res_handle; 551d3f62a0SOleksandr Kolomeiets 561d3f62a0SOleksandr Kolomeiets uint32_t flow_unique_id_counter; 571d3f62a0SOleksandr Kolomeiets /* linked list of all flows created on this NIC */ 581d3f62a0SOleksandr Kolomeiets struct flow_handle *flow_base; 591d3f62a0SOleksandr Kolomeiets 608df4a5f8SOleksandr Kolomeiets /* NIC backend API */ 618df4a5f8SOleksandr Kolomeiets struct flow_api_backend_s be; 621d3f62a0SOleksandr Kolomeiets /* linked list of created eth-port devices on this NIC */ 631d3f62a0SOleksandr Kolomeiets struct flow_eth_dev *eth_base; 641d3f62a0SOleksandr Kolomeiets pthread_mutex_t mtx; 651d3f62a0SOleksandr Kolomeiets 661d3f62a0SOleksandr Kolomeiets /* next NIC linked list */ 671d3f62a0SOleksandr Kolomeiets struct flow_nic_dev *next; 688df4a5f8SOleksandr Kolomeiets }; 6936cf85c8SOleksandr Kolomeiets 701d3f62a0SOleksandr Kolomeiets /* 711d3f62a0SOleksandr Kolomeiets * Resources 721d3f62a0SOleksandr Kolomeiets */ 731d3f62a0SOleksandr Kolomeiets 741d3f62a0SOleksandr Kolomeiets extern const char *dbg_res_descr[]; 751d3f62a0SOleksandr Kolomeiets 761d3f62a0SOleksandr Kolomeiets #define flow_nic_unset_bit(arr, x) \ 771d3f62a0SOleksandr Kolomeiets do { \ 781d3f62a0SOleksandr Kolomeiets size_t _temp_x = (x); \ 791d3f62a0SOleksandr Kolomeiets arr[_temp_x / 8] &= (uint8_t)(~(1 << (_temp_x % 8))); \ 801d3f62a0SOleksandr Kolomeiets } while (0) 811d3f62a0SOleksandr Kolomeiets 821d3f62a0SOleksandr Kolomeiets #define flow_nic_is_bit_set(arr, x) \ 831d3f62a0SOleksandr Kolomeiets ({ \ 841d3f62a0SOleksandr Kolomeiets size_t _temp_x = (x); \ 851d3f62a0SOleksandr Kolomeiets (arr[_temp_x / 8] & (uint8_t)(1 << (_temp_x % 8))); \ 861d3f62a0SOleksandr Kolomeiets }) 871d3f62a0SOleksandr Kolomeiets 881d3f62a0SOleksandr Kolomeiets #define flow_nic_mark_resource_unused(_ndev, res_type, index) \ 891d3f62a0SOleksandr Kolomeiets do { \ 901d3f62a0SOleksandr Kolomeiets typeof(res_type) _temp_res_type = (res_type); \ 911d3f62a0SOleksandr Kolomeiets size_t _temp_index = (index); \ 921d3f62a0SOleksandr Kolomeiets NT_LOG(DBG, FILTER, "mark resource unused: %s idx %zu", \ 931d3f62a0SOleksandr Kolomeiets dbg_res_descr[_temp_res_type], _temp_index); \ 941d3f62a0SOleksandr Kolomeiets flow_nic_unset_bit((_ndev)->res[_temp_res_type].alloc_bm, _temp_index); \ 951d3f62a0SOleksandr Kolomeiets } while (0) 961d3f62a0SOleksandr Kolomeiets 971d3f62a0SOleksandr Kolomeiets #define flow_nic_is_resource_used(_ndev, res_type, index) \ 981d3f62a0SOleksandr Kolomeiets (!!flow_nic_is_bit_set((_ndev)->res[res_type].alloc_bm, index)) 991d3f62a0SOleksandr Kolomeiets 1001d3f62a0SOleksandr Kolomeiets void flow_nic_free_resource(struct flow_nic_dev *ndev, enum res_type_e res_type, int idx); 1011d3f62a0SOleksandr Kolomeiets 1021d3f62a0SOleksandr Kolomeiets int flow_nic_deref_resource(struct flow_nic_dev *ndev, enum res_type_e res_type, int index); 1031d3f62a0SOleksandr Kolomeiets 10436cf85c8SOleksandr Kolomeiets #endif 105