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 558385ba0eSSerhii Iliushyk #define MAX_CPY_WRITERS_SUPPORTED 8 568385ba0eSSerhii Iliushyk 576fec9a9aSSerhii Iliushyk #define MAX_MATCH_FIELDS 16 586fec9a9aSSerhii Iliushyk 59*c6821abfSDanylo Vodopianov /* 60*c6821abfSDanylo Vodopianov * Tunnel encapsulation header definition 61*c6821abfSDanylo Vodopianov */ 62*c6821abfSDanylo Vodopianov #define MAX_TUN_HDR_SIZE 128 63*c6821abfSDanylo Vodopianov struct tunnel_header_s { 64*c6821abfSDanylo Vodopianov union { 65*c6821abfSDanylo Vodopianov uint8_t hdr8[MAX_TUN_HDR_SIZE]; 66*c6821abfSDanylo Vodopianov uint32_t hdr32[(MAX_TUN_HDR_SIZE + 3) / 4]; 67*c6821abfSDanylo Vodopianov } d; 68*c6821abfSDanylo Vodopianov uint32_t user_port_id; 69*c6821abfSDanylo Vodopianov uint8_t len; 70*c6821abfSDanylo Vodopianov 71*c6821abfSDanylo Vodopianov uint8_t nb_vlans; 72*c6821abfSDanylo Vodopianov 73*c6821abfSDanylo Vodopianov uint8_t ip_version; /* 4: v4, 6: v6 */ 74*c6821abfSDanylo Vodopianov uint16_t ip_csum_precalc; 75*c6821abfSDanylo Vodopianov 76*c6821abfSDanylo Vodopianov uint8_t new_outer; 77*c6821abfSDanylo Vodopianov uint8_t l2_len; 78*c6821abfSDanylo Vodopianov uint8_t l3_len; 79*c6821abfSDanylo Vodopianov uint8_t l4_len; 80*c6821abfSDanylo Vodopianov }; 81*c6821abfSDanylo Vodopianov 826fec9a9aSSerhii Iliushyk struct match_elem_s { 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 926fec9a9aSSerhii Iliushyk struct km_flow_def_s { 936fec9a9aSSerhii Iliushyk struct flow_api_backend_s *be; 946fec9a9aSSerhii Iliushyk 956fec9a9aSSerhii Iliushyk /* For collect flow elements and sorting */ 966fec9a9aSSerhii Iliushyk struct match_elem_s match[MAX_MATCH_FIELDS]; 976fec9a9aSSerhii Iliushyk int num_ftype_elem; 986fec9a9aSSerhii Iliushyk 996fec9a9aSSerhii Iliushyk /* Flow information */ 1006fec9a9aSSerhii Iliushyk /* HW input port ID needed for compare. In port must be identical on flow types */ 1016fec9a9aSSerhii Iliushyk uint32_t port_id; 1026fec9a9aSSerhii Iliushyk }; 1036fec9a9aSSerhii Iliushyk 104e02fdb65SSerhii Iliushyk enum flow_port_type_e { 105e02fdb65SSerhii Iliushyk PORT_NONE, /* not defined or drop */ 106e02fdb65SSerhii Iliushyk PORT_INTERNAL, /* no queues attached */ 107e02fdb65SSerhii Iliushyk PORT_PHY, /* MAC phy output queue */ 108e02fdb65SSerhii Iliushyk PORT_VIRT, /* Memory queues to Host */ 109e02fdb65SSerhii Iliushyk }; 110e02fdb65SSerhii Iliushyk 111e02fdb65SSerhii Iliushyk struct output_s { 112e02fdb65SSerhii Iliushyk uint32_t owning_port_id;/* the port who owns this output destination */ 113e02fdb65SSerhii Iliushyk enum flow_port_type_e type; 114e02fdb65SSerhii Iliushyk int id; /* depending on port type: queue ID or physical port id or not used */ 115e02fdb65SSerhii Iliushyk int active; /* activated */ 116e02fdb65SSerhii Iliushyk }; 117e02fdb65SSerhii Iliushyk 118e02fdb65SSerhii Iliushyk struct nic_flow_def { 119e02fdb65SSerhii Iliushyk /* 120e02fdb65SSerhii Iliushyk * Frame Decoder match info collected 121e02fdb65SSerhii Iliushyk */ 122e02fdb65SSerhii Iliushyk int l2_prot; 123e02fdb65SSerhii Iliushyk int l3_prot; 124e02fdb65SSerhii Iliushyk int l4_prot; 125e02fdb65SSerhii Iliushyk int tunnel_prot; 126e02fdb65SSerhii Iliushyk int tunnel_l3_prot; 127e02fdb65SSerhii Iliushyk int tunnel_l4_prot; 128e02fdb65SSerhii Iliushyk int vlans; 129e02fdb65SSerhii Iliushyk int fragmentation; 130e02fdb65SSerhii Iliushyk int ip_prot; 131e02fdb65SSerhii Iliushyk int tunnel_ip_prot; 132e02fdb65SSerhii Iliushyk /* 133e02fdb65SSerhii Iliushyk * Additional meta data for various functions 134e02fdb65SSerhii Iliushyk */ 135e02fdb65SSerhii Iliushyk int in_port_override; 136e02fdb65SSerhii Iliushyk int non_empty; /* default value is -1; value 1 means flow actions update */ 137e02fdb65SSerhii Iliushyk struct output_s dst_id[MAX_OUTPUT_DEST];/* define the output to use */ 138e02fdb65SSerhii Iliushyk /* total number of available queues defined for all outputs - i.e. number of dst_id's */ 139e02fdb65SSerhii Iliushyk int dst_num_avail; 140e02fdb65SSerhii Iliushyk 141e02fdb65SSerhii Iliushyk /* 142e02fdb65SSerhii Iliushyk * Mark or Action info collection 143e02fdb65SSerhii Iliushyk */ 144e02fdb65SSerhii Iliushyk uint32_t mark; 145e02fdb65SSerhii Iliushyk 146e02fdb65SSerhii Iliushyk uint32_t jump_to_group; 147e02fdb65SSerhii Iliushyk 148e02fdb65SSerhii Iliushyk int full_offload; 1496fec9a9aSSerhii Iliushyk 1506fec9a9aSSerhii Iliushyk /* 151*c6821abfSDanylo Vodopianov * Action push tunnel 152*c6821abfSDanylo Vodopianov */ 153*c6821abfSDanylo Vodopianov struct tunnel_header_s tun_hdr; 154*c6821abfSDanylo Vodopianov 155*c6821abfSDanylo Vodopianov /* 156*c6821abfSDanylo Vodopianov * If DPDK RTE tunnel helper API used 157*c6821abfSDanylo Vodopianov * this holds the tunnel if used in flow 158*c6821abfSDanylo Vodopianov */ 159*c6821abfSDanylo Vodopianov struct tunnel_s *tnl; 160*c6821abfSDanylo Vodopianov 161*c6821abfSDanylo Vodopianov /* 162*c6821abfSDanylo Vodopianov * Header Stripper 163*c6821abfSDanylo Vodopianov */ 164*c6821abfSDanylo Vodopianov int header_strip_end_dyn; 165*c6821abfSDanylo Vodopianov int header_strip_end_ofs; 166*c6821abfSDanylo Vodopianov 167*c6821abfSDanylo Vodopianov /* 1686fec9a9aSSerhii Iliushyk * Modify field 1696fec9a9aSSerhii Iliushyk */ 1706fec9a9aSSerhii Iliushyk struct { 1716fec9a9aSSerhii Iliushyk uint32_t select; 172339ca124SDanylo Vodopianov uint32_t dyn; 173339ca124SDanylo Vodopianov uint32_t ofs; 174339ca124SDanylo Vodopianov uint32_t len; 175339ca124SDanylo Vodopianov uint32_t level; 1766fec9a9aSSerhii Iliushyk union { 1776fec9a9aSSerhii Iliushyk uint8_t value8[16]; 1786fec9a9aSSerhii Iliushyk uint16_t value16[8]; 1796fec9a9aSSerhii Iliushyk uint32_t value32[4]; 1806fec9a9aSSerhii Iliushyk }; 1816fec9a9aSSerhii Iliushyk } modify_field[MAX_CPY_WRITERS_SUPPORTED]; 1826fec9a9aSSerhii Iliushyk 1836fec9a9aSSerhii Iliushyk uint32_t modify_field_count; 184339ca124SDanylo Vodopianov uint8_t ttl_sub_enable; 185339ca124SDanylo Vodopianov uint8_t ttl_sub_ipv4; 186339ca124SDanylo Vodopianov uint8_t ttl_sub_outer; 1876fec9a9aSSerhii Iliushyk 1886fec9a9aSSerhii Iliushyk /* 1896fec9a9aSSerhii Iliushyk * Key Matcher flow definitions 1906fec9a9aSSerhii Iliushyk */ 1916fec9a9aSSerhii Iliushyk struct km_flow_def_s km; 192e02fdb65SSerhii Iliushyk }; 193e02fdb65SSerhii Iliushyk 194e02fdb65SSerhii Iliushyk enum flow_handle_type { 195e02fdb65SSerhii Iliushyk FLOW_HANDLE_TYPE_FLOW, 196e02fdb65SSerhii Iliushyk FLOW_HANDLE_TYPE_FLM, 197e02fdb65SSerhii Iliushyk }; 1988385ba0eSSerhii Iliushyk 1992005c549SSerhii Iliushyk struct flow_handle { 200e02fdb65SSerhii Iliushyk enum flow_handle_type type; 201e02fdb65SSerhii Iliushyk uint32_t flm_id; 202e02fdb65SSerhii Iliushyk uint16_t caller_id; 203e02fdb65SSerhii Iliushyk uint16_t learn_ignored; 204e02fdb65SSerhii Iliushyk 2052005c549SSerhii Iliushyk struct flow_eth_dev *dev; 2062005c549SSerhii Iliushyk struct flow_handle *next; 207e02fdb65SSerhii Iliushyk struct flow_handle *prev; 208e02fdb65SSerhii Iliushyk 209e02fdb65SSerhii Iliushyk void *user_data; 210e02fdb65SSerhii Iliushyk 211e02fdb65SSerhii Iliushyk union { 212e02fdb65SSerhii Iliushyk struct { 213e02fdb65SSerhii Iliushyk /* 214e02fdb65SSerhii Iliushyk * 1st step conversion and validation of flow 215e02fdb65SSerhii Iliushyk * verified and converted flow match + actions structure 216e02fdb65SSerhii Iliushyk */ 217e02fdb65SSerhii Iliushyk struct nic_flow_def *fd; 218e02fdb65SSerhii Iliushyk /* 219e02fdb65SSerhii Iliushyk * 2nd step NIC HW resource allocation and configuration 220e02fdb65SSerhii Iliushyk * NIC resource management structures 221e02fdb65SSerhii Iliushyk */ 222e02fdb65SSerhii Iliushyk struct { 223e02fdb65SSerhii Iliushyk uint32_t db_idx_counter; 224e02fdb65SSerhii Iliushyk uint32_t db_idxs[RES_COUNT]; 225e02fdb65SSerhii Iliushyk }; 226e02fdb65SSerhii Iliushyk uint32_t port_id; /* MAC port ID or override of virtual in_port */ 227e02fdb65SSerhii Iliushyk }; 228e02fdb65SSerhii Iliushyk 229e02fdb65SSerhii Iliushyk struct { 230e02fdb65SSerhii Iliushyk uint32_t flm_db_idx_counter; 231e02fdb65SSerhii Iliushyk uint32_t flm_db_idxs[RES_COUNT]; 232e02fdb65SSerhii Iliushyk 233e02fdb65SSerhii Iliushyk uint32_t flm_data[10]; 234e02fdb65SSerhii Iliushyk uint8_t flm_prot; 235e02fdb65SSerhii Iliushyk uint8_t flm_kid; 236e02fdb65SSerhii Iliushyk uint8_t flm_prio; 237e02fdb65SSerhii Iliushyk uint8_t flm_ft; 238e02fdb65SSerhii Iliushyk 239e02fdb65SSerhii Iliushyk uint16_t flm_rpl_ext_ptr; 240e02fdb65SSerhii Iliushyk uint32_t flm_nat_ipv4; 241e02fdb65SSerhii Iliushyk uint16_t flm_nat_port; 242e02fdb65SSerhii Iliushyk uint8_t flm_dscp; 243e02fdb65SSerhii Iliushyk uint32_t flm_teid; 244e02fdb65SSerhii Iliushyk uint8_t flm_rqi; 245e02fdb65SSerhii Iliushyk uint8_t flm_qfi; 246e02fdb65SSerhii Iliushyk }; 247e02fdb65SSerhii Iliushyk }; 2482005c549SSerhii Iliushyk }; 2492005c549SSerhii Iliushyk 2501d3f62a0SOleksandr Kolomeiets void km_free_ndev_resource_management(void **handle); 2511d3f62a0SOleksandr Kolomeiets 2526fec9a9aSSerhii Iliushyk int km_add_match_elem(struct km_flow_def_s *km, uint32_t e_word[4], uint32_t e_mask[4], 2536fec9a9aSSerhii Iliushyk uint32_t word_len, enum frame_offs_e start, int8_t offset); 2546fec9a9aSSerhii Iliushyk 2551d3f62a0SOleksandr Kolomeiets void kcc_free_ndev_resource_management(void **handle); 2561d3f62a0SOleksandr Kolomeiets 2578385ba0eSSerhii Iliushyk /* 2588385ba0eSSerhii Iliushyk * Group management 2598385ba0eSSerhii Iliushyk */ 2608385ba0eSSerhii Iliushyk int flow_group_handle_create(void **handle, uint32_t group_count); 2618385ba0eSSerhii Iliushyk int flow_group_handle_destroy(void **handle); 262e02fdb65SSerhii Iliushyk 263e02fdb65SSerhii Iliushyk int flow_group_translate_get(void *handle, uint8_t owner_id, uint8_t port_id, uint32_t group_in, 264e02fdb65SSerhii Iliushyk uint32_t *group_out); 265e02fdb65SSerhii Iliushyk 2661d3f62a0SOleksandr Kolomeiets #endif /* _FLOW_API_ENGINE_H_ */ 267