18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ 28c2ecf20Sopenharmony_ci/* Copyright (C) 2017-2018 Netronome Systems, Inc. */ 38c2ecf20Sopenharmony_ci 48c2ecf20Sopenharmony_ci#ifndef NFP_FLOWER_CMSG_H 58c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_H 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#include <linux/bitfield.h> 88c2ecf20Sopenharmony_ci#include <linux/skbuff.h> 98c2ecf20Sopenharmony_ci#include <linux/types.h> 108c2ecf20Sopenharmony_ci#include <net/geneve.h> 118c2ecf20Sopenharmony_ci#include <net/gre.h> 128c2ecf20Sopenharmony_ci#include <net/vxlan.h> 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#include "../nfp_app.h" 158c2ecf20Sopenharmony_ci#include "../nfpcore/nfp_cpp.h" 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci#define NFP_FLOWER_LAYER_EXT_META BIT(0) 188c2ecf20Sopenharmony_ci#define NFP_FLOWER_LAYER_PORT BIT(1) 198c2ecf20Sopenharmony_ci#define NFP_FLOWER_LAYER_MAC BIT(2) 208c2ecf20Sopenharmony_ci#define NFP_FLOWER_LAYER_TP BIT(3) 218c2ecf20Sopenharmony_ci#define NFP_FLOWER_LAYER_IPV4 BIT(4) 228c2ecf20Sopenharmony_ci#define NFP_FLOWER_LAYER_IPV6 BIT(5) 238c2ecf20Sopenharmony_ci#define NFP_FLOWER_LAYER_CT BIT(6) 248c2ecf20Sopenharmony_ci#define NFP_FLOWER_LAYER_VXLAN BIT(7) 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci#define NFP_FLOWER_LAYER2_GRE BIT(0) 278c2ecf20Sopenharmony_ci#define NFP_FLOWER_LAYER2_QINQ BIT(4) 288c2ecf20Sopenharmony_ci#define NFP_FLOWER_LAYER2_GENEVE BIT(5) 298c2ecf20Sopenharmony_ci#define NFP_FLOWER_LAYER2_GENEVE_OP BIT(6) 308c2ecf20Sopenharmony_ci#define NFP_FLOWER_LAYER2_TUN_IPV6 BIT(7) 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci#define NFP_FLOWER_MASK_VLAN_PRIO GENMASK(15, 13) 338c2ecf20Sopenharmony_ci#define NFP_FLOWER_MASK_VLAN_PRESENT BIT(12) 348c2ecf20Sopenharmony_ci#define NFP_FLOWER_MASK_VLAN_VID GENMASK(11, 0) 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci#define NFP_FLOWER_MASK_MPLS_LB GENMASK(31, 12) 378c2ecf20Sopenharmony_ci#define NFP_FLOWER_MASK_MPLS_TC GENMASK(11, 9) 388c2ecf20Sopenharmony_ci#define NFP_FLOWER_MASK_MPLS_BOS BIT(8) 398c2ecf20Sopenharmony_ci#define NFP_FLOWER_MASK_MPLS_Q BIT(0) 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci#define NFP_FL_IP_FRAG_FIRST BIT(7) 428c2ecf20Sopenharmony_ci#define NFP_FL_IP_FRAGMENTED BIT(6) 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci/* GRE Tunnel flags */ 458c2ecf20Sopenharmony_ci#define NFP_FL_GRE_FLAG_KEY BIT(2) 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci/* Compressed HW representation of TCP Flags */ 488c2ecf20Sopenharmony_ci#define NFP_FL_TCP_FLAG_URG BIT(4) 498c2ecf20Sopenharmony_ci#define NFP_FL_TCP_FLAG_PSH BIT(3) 508c2ecf20Sopenharmony_ci#define NFP_FL_TCP_FLAG_RST BIT(2) 518c2ecf20Sopenharmony_ci#define NFP_FL_TCP_FLAG_SYN BIT(1) 528c2ecf20Sopenharmony_ci#define NFP_FL_TCP_FLAG_FIN BIT(0) 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci#define NFP_FL_SC_ACT_DROP 0x80000000 558c2ecf20Sopenharmony_ci#define NFP_FL_SC_ACT_USER 0x7D000000 568c2ecf20Sopenharmony_ci#define NFP_FL_SC_ACT_POPV 0x6A000000 578c2ecf20Sopenharmony_ci#define NFP_FL_SC_ACT_NULL 0x00000000 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci/* The maximum action list size (in bytes) supported by the NFP. 608c2ecf20Sopenharmony_ci */ 618c2ecf20Sopenharmony_ci#define NFP_FL_MAX_A_SIZ 1216 628c2ecf20Sopenharmony_ci#define NFP_FL_LW_SIZ 2 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ci/* Maximum allowed geneve options */ 658c2ecf20Sopenharmony_ci#define NFP_FL_MAX_GENEVE_OPT_ACT 32 668c2ecf20Sopenharmony_ci#define NFP_FL_MAX_GENEVE_OPT_CNT 64 678c2ecf20Sopenharmony_ci#define NFP_FL_MAX_GENEVE_OPT_KEY 32 688c2ecf20Sopenharmony_ci#define NFP_FL_MAX_GENEVE_OPT_KEY_V6 8 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci/* Action opcodes */ 718c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_OUTPUT 0 728c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_PUSH_VLAN 1 738c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_POP_VLAN 2 748c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_PUSH_MPLS 3 758c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_POP_MPLS 4 768c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_TUNNEL 6 778c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_ETHERNET 7 788c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_MPLS 8 798c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_IPV4_ADDRS 9 808c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_IPV4_TTL_TOS 10 818c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_IPV6_SRC 11 828c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_IPV6_DST 12 838c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_IPV6_TC_HL_FL 13 848c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_UDP 14 858c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_TCP 15 868c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_PRE_LAG 16 878c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_PRE_TUNNEL 17 888c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_PUSH_GENEVE 26 898c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_NUM 32 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_ci#define NFP_FL_OUT_FLAGS_LAST BIT(15) 928c2ecf20Sopenharmony_ci#define NFP_FL_OUT_FLAGS_USE_TUN BIT(4) 938c2ecf20Sopenharmony_ci#define NFP_FL_OUT_FLAGS_TYPE_IDX GENMASK(2, 0) 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_ci#define NFP_FL_PUSH_VLAN_PRIO GENMASK(15, 13) 968c2ecf20Sopenharmony_ci#define NFP_FL_PUSH_VLAN_VID GENMASK(11, 0) 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci#define IPV6_FLOW_LABEL_MASK cpu_to_be32(0x000fffff) 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_ci/* LAG ports */ 1018c2ecf20Sopenharmony_ci#define NFP_FL_LAG_OUT 0xC0DE0000 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_ci/* Tunnel ports */ 1048c2ecf20Sopenharmony_ci#define NFP_FL_PORT_TYPE_TUN 0x50000000 1058c2ecf20Sopenharmony_ci#define NFP_FL_TUNNEL_TYPE GENMASK(7, 4) 1068c2ecf20Sopenharmony_ci#define NFP_FL_PRE_TUN_INDEX GENMASK(2, 0) 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_ci#define NFP_FLOWER_WORKQ_MAX_SKBS 30000 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci/* Cmesg reply (empirical) timeout*/ 1118c2ecf20Sopenharmony_ci#define NFP_FL_REPLY_TIMEOUT msecs_to_jiffies(40) 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_ci#define nfp_flower_cmsg_warn(app, fmt, args...) \ 1148c2ecf20Sopenharmony_ci do { \ 1158c2ecf20Sopenharmony_ci if (net_ratelimit()) \ 1168c2ecf20Sopenharmony_ci nfp_warn((app)->cpp, fmt, ## args); \ 1178c2ecf20Sopenharmony_ci } while (0) 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_cienum nfp_flower_tun_type { 1208c2ecf20Sopenharmony_ci NFP_FL_TUNNEL_NONE = 0, 1218c2ecf20Sopenharmony_ci NFP_FL_TUNNEL_GRE = 1, 1228c2ecf20Sopenharmony_ci NFP_FL_TUNNEL_VXLAN = 2, 1238c2ecf20Sopenharmony_ci NFP_FL_TUNNEL_GENEVE = 4, 1248c2ecf20Sopenharmony_ci}; 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_cistruct nfp_fl_act_head { 1278c2ecf20Sopenharmony_ci u8 jump_id; 1288c2ecf20Sopenharmony_ci u8 len_lw; 1298c2ecf20Sopenharmony_ci}; 1308c2ecf20Sopenharmony_ci 1318c2ecf20Sopenharmony_cistruct nfp_fl_set_eth { 1328c2ecf20Sopenharmony_ci struct nfp_fl_act_head head; 1338c2ecf20Sopenharmony_ci __be16 reserved; 1348c2ecf20Sopenharmony_ci u8 eth_addr_mask[ETH_ALEN * 2]; 1358c2ecf20Sopenharmony_ci u8 eth_addr_val[ETH_ALEN * 2]; 1368c2ecf20Sopenharmony_ci}; 1378c2ecf20Sopenharmony_ci 1388c2ecf20Sopenharmony_cistruct nfp_fl_set_ip4_addrs { 1398c2ecf20Sopenharmony_ci struct nfp_fl_act_head head; 1408c2ecf20Sopenharmony_ci __be16 reserved; 1418c2ecf20Sopenharmony_ci __be32 ipv4_src_mask; 1428c2ecf20Sopenharmony_ci __be32 ipv4_src; 1438c2ecf20Sopenharmony_ci __be32 ipv4_dst_mask; 1448c2ecf20Sopenharmony_ci __be32 ipv4_dst; 1458c2ecf20Sopenharmony_ci}; 1468c2ecf20Sopenharmony_ci 1478c2ecf20Sopenharmony_cistruct nfp_fl_set_ip4_ttl_tos { 1488c2ecf20Sopenharmony_ci struct nfp_fl_act_head head; 1498c2ecf20Sopenharmony_ci u8 ipv4_ttl_mask; 1508c2ecf20Sopenharmony_ci u8 ipv4_tos_mask; 1518c2ecf20Sopenharmony_ci u8 ipv4_ttl; 1528c2ecf20Sopenharmony_ci u8 ipv4_tos; 1538c2ecf20Sopenharmony_ci __be16 reserved; 1548c2ecf20Sopenharmony_ci}; 1558c2ecf20Sopenharmony_ci 1568c2ecf20Sopenharmony_cistruct nfp_fl_set_ipv6_tc_hl_fl { 1578c2ecf20Sopenharmony_ci struct nfp_fl_act_head head; 1588c2ecf20Sopenharmony_ci u8 ipv6_tc_mask; 1598c2ecf20Sopenharmony_ci u8 ipv6_hop_limit_mask; 1608c2ecf20Sopenharmony_ci __be16 reserved; 1618c2ecf20Sopenharmony_ci u8 ipv6_tc; 1628c2ecf20Sopenharmony_ci u8 ipv6_hop_limit; 1638c2ecf20Sopenharmony_ci __be32 ipv6_label_mask; 1648c2ecf20Sopenharmony_ci __be32 ipv6_label; 1658c2ecf20Sopenharmony_ci}; 1668c2ecf20Sopenharmony_ci 1678c2ecf20Sopenharmony_cistruct nfp_fl_set_ipv6_addr { 1688c2ecf20Sopenharmony_ci struct nfp_fl_act_head head; 1698c2ecf20Sopenharmony_ci __be16 reserved; 1708c2ecf20Sopenharmony_ci struct { 1718c2ecf20Sopenharmony_ci __be32 mask; 1728c2ecf20Sopenharmony_ci __be32 exact; 1738c2ecf20Sopenharmony_ci } ipv6[4]; 1748c2ecf20Sopenharmony_ci}; 1758c2ecf20Sopenharmony_ci 1768c2ecf20Sopenharmony_cistruct nfp_fl_set_tport { 1778c2ecf20Sopenharmony_ci struct nfp_fl_act_head head; 1788c2ecf20Sopenharmony_ci __be16 reserved; 1798c2ecf20Sopenharmony_ci u8 tp_port_mask[4]; 1808c2ecf20Sopenharmony_ci u8 tp_port_val[4]; 1818c2ecf20Sopenharmony_ci}; 1828c2ecf20Sopenharmony_ci 1838c2ecf20Sopenharmony_cistruct nfp_fl_output { 1848c2ecf20Sopenharmony_ci struct nfp_fl_act_head head; 1858c2ecf20Sopenharmony_ci __be16 flags; 1868c2ecf20Sopenharmony_ci __be32 port; 1878c2ecf20Sopenharmony_ci}; 1888c2ecf20Sopenharmony_ci 1898c2ecf20Sopenharmony_cistruct nfp_fl_push_vlan { 1908c2ecf20Sopenharmony_ci struct nfp_fl_act_head head; 1918c2ecf20Sopenharmony_ci __be16 reserved; 1928c2ecf20Sopenharmony_ci __be16 vlan_tpid; 1938c2ecf20Sopenharmony_ci __be16 vlan_tci; 1948c2ecf20Sopenharmony_ci}; 1958c2ecf20Sopenharmony_ci 1968c2ecf20Sopenharmony_cistruct nfp_fl_pop_vlan { 1978c2ecf20Sopenharmony_ci struct nfp_fl_act_head head; 1988c2ecf20Sopenharmony_ci __be16 reserved; 1998c2ecf20Sopenharmony_ci}; 2008c2ecf20Sopenharmony_ci 2018c2ecf20Sopenharmony_cistruct nfp_fl_pre_lag { 2028c2ecf20Sopenharmony_ci struct nfp_fl_act_head head; 2038c2ecf20Sopenharmony_ci __be16 group_id; 2048c2ecf20Sopenharmony_ci u8 lag_version[3]; 2058c2ecf20Sopenharmony_ci u8 instance; 2068c2ecf20Sopenharmony_ci}; 2078c2ecf20Sopenharmony_ci 2088c2ecf20Sopenharmony_ci#define NFP_FL_PRE_LAG_VER_OFF 8 2098c2ecf20Sopenharmony_ci 2108c2ecf20Sopenharmony_cistruct nfp_fl_pre_tunnel { 2118c2ecf20Sopenharmony_ci struct nfp_fl_act_head head; 2128c2ecf20Sopenharmony_ci __be16 flags; 2138c2ecf20Sopenharmony_ci union { 2148c2ecf20Sopenharmony_ci __be32 ipv4_dst; 2158c2ecf20Sopenharmony_ci struct in6_addr ipv6_dst; 2168c2ecf20Sopenharmony_ci }; 2178c2ecf20Sopenharmony_ci}; 2188c2ecf20Sopenharmony_ci 2198c2ecf20Sopenharmony_ci#define NFP_FL_PRE_TUN_IPV6 BIT(0) 2208c2ecf20Sopenharmony_ci 2218c2ecf20Sopenharmony_cistruct nfp_fl_set_tun { 2228c2ecf20Sopenharmony_ci struct nfp_fl_act_head head; 2238c2ecf20Sopenharmony_ci __be16 reserved; 2248c2ecf20Sopenharmony_ci __be64 tun_id __packed; 2258c2ecf20Sopenharmony_ci __be32 tun_type_index; 2268c2ecf20Sopenharmony_ci __be16 tun_flags; 2278c2ecf20Sopenharmony_ci u8 ttl; 2288c2ecf20Sopenharmony_ci u8 tos; 2298c2ecf20Sopenharmony_ci __be16 outer_vlan_tpid; 2308c2ecf20Sopenharmony_ci __be16 outer_vlan_tci; 2318c2ecf20Sopenharmony_ci u8 tun_len; 2328c2ecf20Sopenharmony_ci u8 res2; 2338c2ecf20Sopenharmony_ci __be16 tun_proto; 2348c2ecf20Sopenharmony_ci}; 2358c2ecf20Sopenharmony_ci 2368c2ecf20Sopenharmony_cistruct nfp_fl_push_geneve { 2378c2ecf20Sopenharmony_ci struct nfp_fl_act_head head; 2388c2ecf20Sopenharmony_ci __be16 reserved; 2398c2ecf20Sopenharmony_ci __be16 class; 2408c2ecf20Sopenharmony_ci u8 type; 2418c2ecf20Sopenharmony_ci u8 length; 2428c2ecf20Sopenharmony_ci u8 opt_data[]; 2438c2ecf20Sopenharmony_ci}; 2448c2ecf20Sopenharmony_ci 2458c2ecf20Sopenharmony_cistruct nfp_fl_push_mpls { 2468c2ecf20Sopenharmony_ci struct nfp_fl_act_head head; 2478c2ecf20Sopenharmony_ci __be16 ethtype; 2488c2ecf20Sopenharmony_ci __be32 lse; 2498c2ecf20Sopenharmony_ci}; 2508c2ecf20Sopenharmony_ci 2518c2ecf20Sopenharmony_cistruct nfp_fl_pop_mpls { 2528c2ecf20Sopenharmony_ci struct nfp_fl_act_head head; 2538c2ecf20Sopenharmony_ci __be16 ethtype; 2548c2ecf20Sopenharmony_ci}; 2558c2ecf20Sopenharmony_ci 2568c2ecf20Sopenharmony_cistruct nfp_fl_set_mpls { 2578c2ecf20Sopenharmony_ci struct nfp_fl_act_head head; 2588c2ecf20Sopenharmony_ci __be16 reserved; 2598c2ecf20Sopenharmony_ci __be32 lse_mask; 2608c2ecf20Sopenharmony_ci __be32 lse; 2618c2ecf20Sopenharmony_ci}; 2628c2ecf20Sopenharmony_ci 2638c2ecf20Sopenharmony_ci/* Metadata with L2 (1W/4B) 2648c2ecf20Sopenharmony_ci * ---------------------------------------------------------------- 2658c2ecf20Sopenharmony_ci * 3 2 1 2668c2ecf20Sopenharmony_ci * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 2678c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2688c2ecf20Sopenharmony_ci * | key_type | mask_id | PCP |p| vlan outermost VID | 2698c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2708c2ecf20Sopenharmony_ci * ^ ^ 2718c2ecf20Sopenharmony_ci * NOTE: | TCI | 2728c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2738c2ecf20Sopenharmony_ci */ 2748c2ecf20Sopenharmony_cistruct nfp_flower_meta_tci { 2758c2ecf20Sopenharmony_ci u8 nfp_flow_key_layer; 2768c2ecf20Sopenharmony_ci u8 mask_id; 2778c2ecf20Sopenharmony_ci __be16 tci; 2788c2ecf20Sopenharmony_ci}; 2798c2ecf20Sopenharmony_ci 2808c2ecf20Sopenharmony_ci/* Extended metadata for additional key_layers (1W/4B) 2818c2ecf20Sopenharmony_ci * ---------------------------------------------------------------- 2828c2ecf20Sopenharmony_ci * 3 2 1 2838c2ecf20Sopenharmony_ci * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 2848c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2858c2ecf20Sopenharmony_ci * | nfp_flow_key_layer2 | 2868c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2878c2ecf20Sopenharmony_ci */ 2888c2ecf20Sopenharmony_cistruct nfp_flower_ext_meta { 2898c2ecf20Sopenharmony_ci __be32 nfp_flow_key_layer2; 2908c2ecf20Sopenharmony_ci}; 2918c2ecf20Sopenharmony_ci 2928c2ecf20Sopenharmony_ci/* Port details (1W/4B) 2938c2ecf20Sopenharmony_ci * ---------------------------------------------------------------- 2948c2ecf20Sopenharmony_ci * 3 2 1 2958c2ecf20Sopenharmony_ci * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 2968c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2978c2ecf20Sopenharmony_ci * | port_ingress | 2988c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2998c2ecf20Sopenharmony_ci */ 3008c2ecf20Sopenharmony_cistruct nfp_flower_in_port { 3018c2ecf20Sopenharmony_ci __be32 in_port; 3028c2ecf20Sopenharmony_ci}; 3038c2ecf20Sopenharmony_ci 3048c2ecf20Sopenharmony_ci/* L2 details (4W/16B) 3058c2ecf20Sopenharmony_ci * 3 2 1 3068c2ecf20Sopenharmony_ci * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 3078c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 3088c2ecf20Sopenharmony_ci * | mac_addr_dst, 31 - 0 | 3098c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 3108c2ecf20Sopenharmony_ci * | mac_addr_dst, 47 - 32 | mac_addr_src, 15 - 0 | 3118c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 3128c2ecf20Sopenharmony_ci * | mac_addr_src, 47 - 16 | 3138c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 3148c2ecf20Sopenharmony_ci * | mpls outermost label | TC |B| reserved |q| 3158c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 3168c2ecf20Sopenharmony_ci */ 3178c2ecf20Sopenharmony_cistruct nfp_flower_mac_mpls { 3188c2ecf20Sopenharmony_ci u8 mac_dst[6]; 3198c2ecf20Sopenharmony_ci u8 mac_src[6]; 3208c2ecf20Sopenharmony_ci __be32 mpls_lse; 3218c2ecf20Sopenharmony_ci}; 3228c2ecf20Sopenharmony_ci 3238c2ecf20Sopenharmony_ci/* VLAN details (2W/8B) 3248c2ecf20Sopenharmony_ci * 3 2 1 3258c2ecf20Sopenharmony_ci * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 3268c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 3278c2ecf20Sopenharmony_ci * | outer_tpid | outer_tci | 3288c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 3298c2ecf20Sopenharmony_ci * | inner_tpid | inner_tci | 3308c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 3318c2ecf20Sopenharmony_ci */ 3328c2ecf20Sopenharmony_cistruct nfp_flower_vlan { 3338c2ecf20Sopenharmony_ci __be16 outer_tpid; 3348c2ecf20Sopenharmony_ci __be16 outer_tci; 3358c2ecf20Sopenharmony_ci __be16 inner_tpid; 3368c2ecf20Sopenharmony_ci __be16 inner_tci; 3378c2ecf20Sopenharmony_ci}; 3388c2ecf20Sopenharmony_ci 3398c2ecf20Sopenharmony_ci/* L4 ports (for UDP, TCP, SCTP) (1W/4B) 3408c2ecf20Sopenharmony_ci * 3 2 1 3418c2ecf20Sopenharmony_ci * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 3428c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 3438c2ecf20Sopenharmony_ci * | port_src | port_dst | 3448c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 3458c2ecf20Sopenharmony_ci */ 3468c2ecf20Sopenharmony_cistruct nfp_flower_tp_ports { 3478c2ecf20Sopenharmony_ci __be16 port_src; 3488c2ecf20Sopenharmony_ci __be16 port_dst; 3498c2ecf20Sopenharmony_ci}; 3508c2ecf20Sopenharmony_ci 3518c2ecf20Sopenharmony_cistruct nfp_flower_ip_ext { 3528c2ecf20Sopenharmony_ci u8 tos; 3538c2ecf20Sopenharmony_ci u8 proto; 3548c2ecf20Sopenharmony_ci u8 ttl; 3558c2ecf20Sopenharmony_ci u8 flags; 3568c2ecf20Sopenharmony_ci}; 3578c2ecf20Sopenharmony_ci 3588c2ecf20Sopenharmony_ci/* L3 IPv4 details (3W/12B) 3598c2ecf20Sopenharmony_ci * 3 2 1 3608c2ecf20Sopenharmony_ci * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 3618c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 3628c2ecf20Sopenharmony_ci * | DSCP |ECN| protocol | ttl | flags | 3638c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 3648c2ecf20Sopenharmony_ci * | ipv4_addr_src | 3658c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 3668c2ecf20Sopenharmony_ci * | ipv4_addr_dst | 3678c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 3688c2ecf20Sopenharmony_ci */ 3698c2ecf20Sopenharmony_cistruct nfp_flower_ipv4 { 3708c2ecf20Sopenharmony_ci struct nfp_flower_ip_ext ip_ext; 3718c2ecf20Sopenharmony_ci __be32 ipv4_src; 3728c2ecf20Sopenharmony_ci __be32 ipv4_dst; 3738c2ecf20Sopenharmony_ci}; 3748c2ecf20Sopenharmony_ci 3758c2ecf20Sopenharmony_ci/* L3 IPv6 details (10W/40B) 3768c2ecf20Sopenharmony_ci * 3 2 1 3778c2ecf20Sopenharmony_ci * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 3788c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 3798c2ecf20Sopenharmony_ci * | DSCP |ECN| protocol | ttl | flags | 3808c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 3818c2ecf20Sopenharmony_ci * | ipv6_exthdr | res | ipv6_flow_label | 3828c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 3838c2ecf20Sopenharmony_ci * | ipv6_addr_src, 31 - 0 | 3848c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 3858c2ecf20Sopenharmony_ci * | ipv6_addr_src, 63 - 32 | 3868c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 3878c2ecf20Sopenharmony_ci * | ipv6_addr_src, 95 - 64 | 3888c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 3898c2ecf20Sopenharmony_ci * | ipv6_addr_src, 127 - 96 | 3908c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 3918c2ecf20Sopenharmony_ci * | ipv6_addr_dst, 31 - 0 | 3928c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 3938c2ecf20Sopenharmony_ci * | ipv6_addr_dst, 63 - 32 | 3948c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 3958c2ecf20Sopenharmony_ci * | ipv6_addr_dst, 95 - 64 | 3968c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 3978c2ecf20Sopenharmony_ci * | ipv6_addr_dst, 127 - 96 | 3988c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 3998c2ecf20Sopenharmony_ci */ 4008c2ecf20Sopenharmony_cistruct nfp_flower_ipv6 { 4018c2ecf20Sopenharmony_ci struct nfp_flower_ip_ext ip_ext; 4028c2ecf20Sopenharmony_ci __be32 ipv6_flow_label_exthdr; 4038c2ecf20Sopenharmony_ci struct in6_addr ipv6_src; 4048c2ecf20Sopenharmony_ci struct in6_addr ipv6_dst; 4058c2ecf20Sopenharmony_ci}; 4068c2ecf20Sopenharmony_ci 4078c2ecf20Sopenharmony_cistruct nfp_flower_tun_ipv4 { 4088c2ecf20Sopenharmony_ci __be32 src; 4098c2ecf20Sopenharmony_ci __be32 dst; 4108c2ecf20Sopenharmony_ci}; 4118c2ecf20Sopenharmony_ci 4128c2ecf20Sopenharmony_cistruct nfp_flower_tun_ipv6 { 4138c2ecf20Sopenharmony_ci struct in6_addr src; 4148c2ecf20Sopenharmony_ci struct in6_addr dst; 4158c2ecf20Sopenharmony_ci}; 4168c2ecf20Sopenharmony_ci 4178c2ecf20Sopenharmony_cistruct nfp_flower_tun_ip_ext { 4188c2ecf20Sopenharmony_ci u8 tos; 4198c2ecf20Sopenharmony_ci u8 ttl; 4208c2ecf20Sopenharmony_ci}; 4218c2ecf20Sopenharmony_ci 4228c2ecf20Sopenharmony_ci/* Flow Frame IPv4 UDP TUNNEL --> Tunnel details (4W/16B) 4238c2ecf20Sopenharmony_ci * ----------------------------------------------------------------- 4248c2ecf20Sopenharmony_ci * 3 2 1 4258c2ecf20Sopenharmony_ci * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 4268c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 4278c2ecf20Sopenharmony_ci * | ipv4_addr_src | 4288c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 4298c2ecf20Sopenharmony_ci * | ipv4_addr_dst | 4308c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 4318c2ecf20Sopenharmony_ci * | Reserved | tos | ttl | 4328c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 4338c2ecf20Sopenharmony_ci * | Reserved | 4348c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 4358c2ecf20Sopenharmony_ci * | VNI | Reserved | 4368c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 4378c2ecf20Sopenharmony_ci */ 4388c2ecf20Sopenharmony_cistruct nfp_flower_ipv4_udp_tun { 4398c2ecf20Sopenharmony_ci struct nfp_flower_tun_ipv4 ipv4; 4408c2ecf20Sopenharmony_ci __be16 reserved1; 4418c2ecf20Sopenharmony_ci struct nfp_flower_tun_ip_ext ip_ext; 4428c2ecf20Sopenharmony_ci __be32 reserved2; 4438c2ecf20Sopenharmony_ci __be32 tun_id; 4448c2ecf20Sopenharmony_ci}; 4458c2ecf20Sopenharmony_ci 4468c2ecf20Sopenharmony_ci/* Flow Frame IPv6 UDP TUNNEL --> Tunnel details (11W/44B) 4478c2ecf20Sopenharmony_ci * ----------------------------------------------------------------- 4488c2ecf20Sopenharmony_ci * 3 2 1 4498c2ecf20Sopenharmony_ci * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 4508c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 4518c2ecf20Sopenharmony_ci * | ipv6_addr_src, 31 - 0 | 4528c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 4538c2ecf20Sopenharmony_ci * | ipv6_addr_src, 63 - 32 | 4548c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 4558c2ecf20Sopenharmony_ci * | ipv6_addr_src, 95 - 64 | 4568c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 4578c2ecf20Sopenharmony_ci * | ipv6_addr_src, 127 - 96 | 4588c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 4598c2ecf20Sopenharmony_ci * | ipv6_addr_dst, 31 - 0 | 4608c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 4618c2ecf20Sopenharmony_ci * | ipv6_addr_dst, 63 - 32 | 4628c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 4638c2ecf20Sopenharmony_ci * | ipv6_addr_dst, 95 - 64 | 4648c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 4658c2ecf20Sopenharmony_ci * | ipv6_addr_dst, 127 - 96 | 4668c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 4678c2ecf20Sopenharmony_ci * | Reserved | tos | ttl | 4688c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 4698c2ecf20Sopenharmony_ci * | Reserved | 4708c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 4718c2ecf20Sopenharmony_ci * | VNI | Reserved | 4728c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 4738c2ecf20Sopenharmony_ci */ 4748c2ecf20Sopenharmony_cistruct nfp_flower_ipv6_udp_tun { 4758c2ecf20Sopenharmony_ci struct nfp_flower_tun_ipv6 ipv6; 4768c2ecf20Sopenharmony_ci __be16 reserved1; 4778c2ecf20Sopenharmony_ci struct nfp_flower_tun_ip_ext ip_ext; 4788c2ecf20Sopenharmony_ci __be32 reserved2; 4798c2ecf20Sopenharmony_ci __be32 tun_id; 4808c2ecf20Sopenharmony_ci}; 4818c2ecf20Sopenharmony_ci 4828c2ecf20Sopenharmony_ci/* Flow Frame GRE TUNNEL --> Tunnel details (6W/24B) 4838c2ecf20Sopenharmony_ci * ----------------------------------------------------------------- 4848c2ecf20Sopenharmony_ci * 3 2 1 4858c2ecf20Sopenharmony_ci * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 4868c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 4878c2ecf20Sopenharmony_ci * | ipv4_addr_src | 4888c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 4898c2ecf20Sopenharmony_ci * | ipv4_addr_dst | 4908c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 4918c2ecf20Sopenharmony_ci * | tun_flags | tos | ttl | 4928c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 4938c2ecf20Sopenharmony_ci * | Reserved | Ethertype | 4948c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 4958c2ecf20Sopenharmony_ci * | Key | 4968c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 4978c2ecf20Sopenharmony_ci * | Reserved | 4988c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 4998c2ecf20Sopenharmony_ci */ 5008c2ecf20Sopenharmony_ci 5018c2ecf20Sopenharmony_cistruct nfp_flower_ipv4_gre_tun { 5028c2ecf20Sopenharmony_ci struct nfp_flower_tun_ipv4 ipv4; 5038c2ecf20Sopenharmony_ci __be16 tun_flags; 5048c2ecf20Sopenharmony_ci struct nfp_flower_tun_ip_ext ip_ext; 5058c2ecf20Sopenharmony_ci __be16 reserved1; 5068c2ecf20Sopenharmony_ci __be16 ethertype; 5078c2ecf20Sopenharmony_ci __be32 tun_key; 5088c2ecf20Sopenharmony_ci __be32 reserved2; 5098c2ecf20Sopenharmony_ci}; 5108c2ecf20Sopenharmony_ci 5118c2ecf20Sopenharmony_ci/* Flow Frame GRE TUNNEL V6 --> Tunnel details (12W/48B) 5128c2ecf20Sopenharmony_ci * ----------------------------------------------------------------- 5138c2ecf20Sopenharmony_ci * 3 2 1 5148c2ecf20Sopenharmony_ci * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 5158c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5168c2ecf20Sopenharmony_ci * | ipv6_addr_src, 31 - 0 | 5178c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5188c2ecf20Sopenharmony_ci * | ipv6_addr_src, 63 - 32 | 5198c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5208c2ecf20Sopenharmony_ci * | ipv6_addr_src, 95 - 64 | 5218c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5228c2ecf20Sopenharmony_ci * | ipv6_addr_src, 127 - 96 | 5238c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5248c2ecf20Sopenharmony_ci * | ipv6_addr_dst, 31 - 0 | 5258c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5268c2ecf20Sopenharmony_ci * | ipv6_addr_dst, 63 - 32 | 5278c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5288c2ecf20Sopenharmony_ci * | ipv6_addr_dst, 95 - 64 | 5298c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5308c2ecf20Sopenharmony_ci * | ipv6_addr_dst, 127 - 96 | 5318c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5328c2ecf20Sopenharmony_ci * | tun_flags | tos | ttl | 5338c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5348c2ecf20Sopenharmony_ci * | Reserved | Ethertype | 5358c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5368c2ecf20Sopenharmony_ci * | Key | 5378c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5388c2ecf20Sopenharmony_ci * | Reserved | 5398c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5408c2ecf20Sopenharmony_ci */ 5418c2ecf20Sopenharmony_cistruct nfp_flower_ipv6_gre_tun { 5428c2ecf20Sopenharmony_ci struct nfp_flower_tun_ipv6 ipv6; 5438c2ecf20Sopenharmony_ci __be16 tun_flags; 5448c2ecf20Sopenharmony_ci struct nfp_flower_tun_ip_ext ip_ext; 5458c2ecf20Sopenharmony_ci __be16 reserved1; 5468c2ecf20Sopenharmony_ci __be16 ethertype; 5478c2ecf20Sopenharmony_ci __be32 tun_key; 5488c2ecf20Sopenharmony_ci __be32 reserved2; 5498c2ecf20Sopenharmony_ci}; 5508c2ecf20Sopenharmony_ci 5518c2ecf20Sopenharmony_cistruct nfp_flower_geneve_options { 5528c2ecf20Sopenharmony_ci u8 data[NFP_FL_MAX_GENEVE_OPT_KEY]; 5538c2ecf20Sopenharmony_ci}; 5548c2ecf20Sopenharmony_ci 5558c2ecf20Sopenharmony_ci#define NFP_FL_TUN_VNI_OFFSET 8 5568c2ecf20Sopenharmony_ci 5578c2ecf20Sopenharmony_ci/* The base header for a control message packet. 5588c2ecf20Sopenharmony_ci * Defines an 8-bit version, and an 8-bit type, padded 5598c2ecf20Sopenharmony_ci * to a 32-bit word. Rest of the packet is type-specific. 5608c2ecf20Sopenharmony_ci */ 5618c2ecf20Sopenharmony_cistruct nfp_flower_cmsg_hdr { 5628c2ecf20Sopenharmony_ci __be16 pad; 5638c2ecf20Sopenharmony_ci u8 type; 5648c2ecf20Sopenharmony_ci u8 version; 5658c2ecf20Sopenharmony_ci}; 5668c2ecf20Sopenharmony_ci 5678c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_HLEN sizeof(struct nfp_flower_cmsg_hdr) 5688c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_VER1 1 5698c2ecf20Sopenharmony_ci 5708c2ecf20Sopenharmony_ci/* Types defined for port related control messages */ 5718c2ecf20Sopenharmony_cienum nfp_flower_cmsg_type_port { 5728c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_FLOW_ADD = 0, 5738c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_FLOW_MOD = 1, 5748c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_FLOW_DEL = 2, 5758c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_LAG_CONFIG = 4, 5768c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_PORT_REIFY = 6, 5778c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_MAC_REPR = 7, 5788c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_PORT_MOD = 8, 5798c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_MERGE_HINT = 9, 5808c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_NO_NEIGH = 10, 5818c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_TUN_MAC = 11, 5828c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_ACTIVE_TUNS = 12, 5838c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_TUN_NEIGH = 13, 5848c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_TUN_IPS = 14, 5858c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_FLOW_STATS = 15, 5868c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_PORT_ECHO = 16, 5878c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_QOS_MOD = 18, 5888c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_QOS_DEL = 19, 5898c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_QOS_STATS = 20, 5908c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_PRE_TUN_RULE = 21, 5918c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_TUN_IPS_V6 = 22, 5928c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_NO_NEIGH_V6 = 23, 5938c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_TUN_NEIGH_V6 = 24, 5948c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_ACTIVE_TUNS_V6 = 25, 5958c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_MAX = 32, 5968c2ecf20Sopenharmony_ci}; 5978c2ecf20Sopenharmony_ci 5988c2ecf20Sopenharmony_ci/* NFP_FLOWER_CMSG_TYPE_MAC_REPR */ 5998c2ecf20Sopenharmony_cistruct nfp_flower_cmsg_mac_repr { 6008c2ecf20Sopenharmony_ci u8 reserved[3]; 6018c2ecf20Sopenharmony_ci u8 num_ports; 6028c2ecf20Sopenharmony_ci struct { 6038c2ecf20Sopenharmony_ci u8 idx; 6048c2ecf20Sopenharmony_ci u8 info; 6058c2ecf20Sopenharmony_ci u8 nbi_port; 6068c2ecf20Sopenharmony_ci u8 phys_port; 6078c2ecf20Sopenharmony_ci } ports[]; 6088c2ecf20Sopenharmony_ci}; 6098c2ecf20Sopenharmony_ci 6108c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_MAC_REPR_NBI GENMASK(1, 0) 6118c2ecf20Sopenharmony_ci 6128c2ecf20Sopenharmony_ci/* NFP_FLOWER_CMSG_TYPE_PORT_MOD */ 6138c2ecf20Sopenharmony_cistruct nfp_flower_cmsg_portmod { 6148c2ecf20Sopenharmony_ci __be32 portnum; 6158c2ecf20Sopenharmony_ci u8 reserved; 6168c2ecf20Sopenharmony_ci u8 info; 6178c2ecf20Sopenharmony_ci __be16 mtu; 6188c2ecf20Sopenharmony_ci}; 6198c2ecf20Sopenharmony_ci 6208c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_PORTMOD_INFO_LINK BIT(0) 6218c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_PORTMOD_MTU_CHANGE_ONLY BIT(1) 6228c2ecf20Sopenharmony_ci 6238c2ecf20Sopenharmony_ci/* NFP_FLOWER_CMSG_TYPE_PORT_REIFY */ 6248c2ecf20Sopenharmony_cistruct nfp_flower_cmsg_portreify { 6258c2ecf20Sopenharmony_ci __be32 portnum; 6268c2ecf20Sopenharmony_ci u16 reserved; 6278c2ecf20Sopenharmony_ci __be16 info; 6288c2ecf20Sopenharmony_ci}; 6298c2ecf20Sopenharmony_ci 6308c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_PORTREIFY_INFO_EXIST BIT(0) 6318c2ecf20Sopenharmony_ci 6328c2ecf20Sopenharmony_ci/* NFP_FLOWER_CMSG_TYPE_FLOW_MERGE_HINT */ 6338c2ecf20Sopenharmony_cistruct nfp_flower_cmsg_merge_hint { 6348c2ecf20Sopenharmony_ci u8 reserved[3]; 6358c2ecf20Sopenharmony_ci u8 count; 6368c2ecf20Sopenharmony_ci struct { 6378c2ecf20Sopenharmony_ci __be32 host_ctx; 6388c2ecf20Sopenharmony_ci __be64 host_cookie; 6398c2ecf20Sopenharmony_ci } __packed flow[]; 6408c2ecf20Sopenharmony_ci}; 6418c2ecf20Sopenharmony_ci 6428c2ecf20Sopenharmony_cienum nfp_flower_cmsg_port_type { 6438c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_PORT_TYPE_UNSPEC = 0x0, 6448c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_PORT_TYPE_PHYS_PORT = 0x1, 6458c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_PORT_TYPE_PCIE_PORT = 0x2, 6468c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_PORT_TYPE_OTHER_PORT = 0x3, 6478c2ecf20Sopenharmony_ci}; 6488c2ecf20Sopenharmony_ci 6498c2ecf20Sopenharmony_cienum nfp_flower_cmsg_port_vnic_type { 6508c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_PORT_VNIC_TYPE_VF = 0x0, 6518c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_PORT_VNIC_TYPE_PF = 0x1, 6528c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_PORT_VNIC_TYPE_CTRL = 0x2, 6538c2ecf20Sopenharmony_ci}; 6548c2ecf20Sopenharmony_ci 6558c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_PORT_TYPE GENMASK(31, 28) 6568c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_PORT_SYS_ID GENMASK(27, 24) 6578c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_PORT_NFP_ID GENMASK(23, 22) 6588c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_PORT_PCI GENMASK(15, 14) 6598c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_PORT_VNIC_TYPE GENMASK(13, 12) 6608c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_PORT_VNIC GENMASK(11, 6) 6618c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_PORT_PCIE_Q GENMASK(5, 0) 6628c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_PORT_PHYS_PORT_NUM GENMASK(7, 0) 6638c2ecf20Sopenharmony_ci 6648c2ecf20Sopenharmony_cistatic inline u32 nfp_flower_internal_port_get_port_id(u8 internal_port) 6658c2ecf20Sopenharmony_ci{ 6668c2ecf20Sopenharmony_ci return FIELD_PREP(NFP_FLOWER_CMSG_PORT_PHYS_PORT_NUM, internal_port) | 6678c2ecf20Sopenharmony_ci FIELD_PREP(NFP_FLOWER_CMSG_PORT_TYPE, 6688c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_PORT_TYPE_OTHER_PORT); 6698c2ecf20Sopenharmony_ci} 6708c2ecf20Sopenharmony_ci 6718c2ecf20Sopenharmony_cistatic inline u32 nfp_flower_cmsg_phys_port(u8 phys_port) 6728c2ecf20Sopenharmony_ci{ 6738c2ecf20Sopenharmony_ci return FIELD_PREP(NFP_FLOWER_CMSG_PORT_PHYS_PORT_NUM, phys_port) | 6748c2ecf20Sopenharmony_ci FIELD_PREP(NFP_FLOWER_CMSG_PORT_TYPE, 6758c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_PORT_TYPE_PHYS_PORT); 6768c2ecf20Sopenharmony_ci} 6778c2ecf20Sopenharmony_ci 6788c2ecf20Sopenharmony_cistatic inline u32 6798c2ecf20Sopenharmony_cinfp_flower_cmsg_pcie_port(u8 nfp_pcie, enum nfp_flower_cmsg_port_vnic_type type, 6808c2ecf20Sopenharmony_ci u8 vnic, u8 q) 6818c2ecf20Sopenharmony_ci{ 6828c2ecf20Sopenharmony_ci return FIELD_PREP(NFP_FLOWER_CMSG_PORT_PCI, nfp_pcie) | 6838c2ecf20Sopenharmony_ci FIELD_PREP(NFP_FLOWER_CMSG_PORT_VNIC_TYPE, type) | 6848c2ecf20Sopenharmony_ci FIELD_PREP(NFP_FLOWER_CMSG_PORT_VNIC, vnic) | 6858c2ecf20Sopenharmony_ci FIELD_PREP(NFP_FLOWER_CMSG_PORT_PCIE_Q, q) | 6868c2ecf20Sopenharmony_ci FIELD_PREP(NFP_FLOWER_CMSG_PORT_TYPE, 6878c2ecf20Sopenharmony_ci NFP_FLOWER_CMSG_PORT_TYPE_PCIE_PORT); 6888c2ecf20Sopenharmony_ci} 6898c2ecf20Sopenharmony_ci 6908c2ecf20Sopenharmony_cistatic inline void *nfp_flower_cmsg_get_data(struct sk_buff *skb) 6918c2ecf20Sopenharmony_ci{ 6928c2ecf20Sopenharmony_ci return (unsigned char *)skb->data + NFP_FLOWER_CMSG_HLEN; 6938c2ecf20Sopenharmony_ci} 6948c2ecf20Sopenharmony_ci 6958c2ecf20Sopenharmony_cistatic inline int nfp_flower_cmsg_get_data_len(struct sk_buff *skb) 6968c2ecf20Sopenharmony_ci{ 6978c2ecf20Sopenharmony_ci return skb->len - NFP_FLOWER_CMSG_HLEN; 6988c2ecf20Sopenharmony_ci} 6998c2ecf20Sopenharmony_ci 7008c2ecf20Sopenharmony_cistatic inline bool 7018c2ecf20Sopenharmony_cinfp_fl_netdev_is_tunnel_type(struct net_device *netdev, 7028c2ecf20Sopenharmony_ci enum nfp_flower_tun_type tun_type) 7038c2ecf20Sopenharmony_ci{ 7048c2ecf20Sopenharmony_ci if (netif_is_vxlan(netdev)) 7058c2ecf20Sopenharmony_ci return tun_type == NFP_FL_TUNNEL_VXLAN; 7068c2ecf20Sopenharmony_ci if (netif_is_gretap(netdev)) 7078c2ecf20Sopenharmony_ci return tun_type == NFP_FL_TUNNEL_GRE; 7088c2ecf20Sopenharmony_ci if (netif_is_geneve(netdev)) 7098c2ecf20Sopenharmony_ci return tun_type == NFP_FL_TUNNEL_GENEVE; 7108c2ecf20Sopenharmony_ci 7118c2ecf20Sopenharmony_ci return false; 7128c2ecf20Sopenharmony_ci} 7138c2ecf20Sopenharmony_ci 7148c2ecf20Sopenharmony_cistatic inline bool nfp_fl_is_netdev_to_offload(struct net_device *netdev) 7158c2ecf20Sopenharmony_ci{ 7168c2ecf20Sopenharmony_ci if (!netdev->rtnl_link_ops) 7178c2ecf20Sopenharmony_ci return false; 7188c2ecf20Sopenharmony_ci if (!strcmp(netdev->rtnl_link_ops->kind, "openvswitch")) 7198c2ecf20Sopenharmony_ci return true; 7208c2ecf20Sopenharmony_ci if (netif_is_vxlan(netdev)) 7218c2ecf20Sopenharmony_ci return true; 7228c2ecf20Sopenharmony_ci if (netif_is_geneve(netdev)) 7238c2ecf20Sopenharmony_ci return true; 7248c2ecf20Sopenharmony_ci if (netif_is_gretap(netdev)) 7258c2ecf20Sopenharmony_ci return true; 7268c2ecf20Sopenharmony_ci 7278c2ecf20Sopenharmony_ci return false; 7288c2ecf20Sopenharmony_ci} 7298c2ecf20Sopenharmony_ci 7308c2ecf20Sopenharmony_cistruct sk_buff * 7318c2ecf20Sopenharmony_cinfp_flower_cmsg_mac_repr_start(struct nfp_app *app, unsigned int num_ports); 7328c2ecf20Sopenharmony_civoid 7338c2ecf20Sopenharmony_cinfp_flower_cmsg_mac_repr_add(struct sk_buff *skb, unsigned int idx, 7348c2ecf20Sopenharmony_ci unsigned int nbi, unsigned int nbi_port, 7358c2ecf20Sopenharmony_ci unsigned int phys_port); 7368c2ecf20Sopenharmony_ciint nfp_flower_cmsg_portmod(struct nfp_repr *repr, bool carrier_ok, 7378c2ecf20Sopenharmony_ci unsigned int mtu, bool mtu_only); 7388c2ecf20Sopenharmony_ciint nfp_flower_cmsg_portreify(struct nfp_repr *repr, bool exists); 7398c2ecf20Sopenharmony_civoid nfp_flower_cmsg_process_rx(struct work_struct *work); 7408c2ecf20Sopenharmony_civoid nfp_flower_cmsg_rx(struct nfp_app *app, struct sk_buff *skb); 7418c2ecf20Sopenharmony_cistruct sk_buff * 7428c2ecf20Sopenharmony_cinfp_flower_cmsg_alloc(struct nfp_app *app, unsigned int size, 7438c2ecf20Sopenharmony_ci enum nfp_flower_cmsg_type_port type, gfp_t flag); 7448c2ecf20Sopenharmony_ci 7458c2ecf20Sopenharmony_ci#endif 746