162306a36Sopenharmony_ci/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ 262306a36Sopenharmony_ci/* Copyright (C) 2017-2018 Netronome Systems, Inc. */ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#ifndef NFP_FLOWER_CMSG_H 562306a36Sopenharmony_ci#define NFP_FLOWER_CMSG_H 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/bitfield.h> 862306a36Sopenharmony_ci#include <linux/skbuff.h> 962306a36Sopenharmony_ci#include <linux/types.h> 1062306a36Sopenharmony_ci#include <net/geneve.h> 1162306a36Sopenharmony_ci#include <net/gre.h> 1262306a36Sopenharmony_ci#include <net/vxlan.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include "../nfp_app.h" 1562306a36Sopenharmony_ci#include "../nfpcore/nfp_cpp.h" 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#define NFP_FLOWER_LAYER_EXT_META BIT(0) 1862306a36Sopenharmony_ci#define NFP_FLOWER_LAYER_PORT BIT(1) 1962306a36Sopenharmony_ci#define NFP_FLOWER_LAYER_MAC BIT(2) 2062306a36Sopenharmony_ci#define NFP_FLOWER_LAYER_TP BIT(3) 2162306a36Sopenharmony_ci#define NFP_FLOWER_LAYER_IPV4 BIT(4) 2262306a36Sopenharmony_ci#define NFP_FLOWER_LAYER_IPV6 BIT(5) 2362306a36Sopenharmony_ci#define NFP_FLOWER_LAYER_CT BIT(6) 2462306a36Sopenharmony_ci#define NFP_FLOWER_LAYER_VXLAN BIT(7) 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define NFP_FLOWER_LAYER2_GRE BIT(0) 2762306a36Sopenharmony_ci#define NFP_FLOWER_LAYER2_QINQ BIT(4) 2862306a36Sopenharmony_ci#define NFP_FLOWER_LAYER2_GENEVE BIT(5) 2962306a36Sopenharmony_ci#define NFP_FLOWER_LAYER2_GENEVE_OP BIT(6) 3062306a36Sopenharmony_ci#define NFP_FLOWER_LAYER2_TUN_IPV6 BIT(7) 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci#define NFP_FLOWER_MASK_VLAN_PRIO GENMASK(15, 13) 3362306a36Sopenharmony_ci#define NFP_FLOWER_MASK_VLAN_PRESENT BIT(12) 3462306a36Sopenharmony_ci#define NFP_FLOWER_MASK_VLAN_VID GENMASK(11, 0) 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci#define NFP_FLOWER_MASK_MPLS_LB GENMASK(31, 12) 3762306a36Sopenharmony_ci#define NFP_FLOWER_MASK_MPLS_TC GENMASK(11, 9) 3862306a36Sopenharmony_ci#define NFP_FLOWER_MASK_MPLS_BOS BIT(8) 3962306a36Sopenharmony_ci#define NFP_FLOWER_MASK_MPLS_Q BIT(0) 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci#define NFP_FL_IP_FRAG_FIRST BIT(7) 4262306a36Sopenharmony_ci#define NFP_FL_IP_FRAGMENTED BIT(6) 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci/* GRE Tunnel flags */ 4562306a36Sopenharmony_ci#define NFP_FL_GRE_FLAG_KEY BIT(2) 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci/* Compressed HW representation of TCP Flags */ 4862306a36Sopenharmony_ci#define NFP_FL_TCP_FLAG_URG BIT(4) 4962306a36Sopenharmony_ci#define NFP_FL_TCP_FLAG_PSH BIT(3) 5062306a36Sopenharmony_ci#define NFP_FL_TCP_FLAG_RST BIT(2) 5162306a36Sopenharmony_ci#define NFP_FL_TCP_FLAG_SYN BIT(1) 5262306a36Sopenharmony_ci#define NFP_FL_TCP_FLAG_FIN BIT(0) 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci#define NFP_FL_SC_ACT_DROP 0x80000000 5562306a36Sopenharmony_ci#define NFP_FL_SC_ACT_USER 0x7D000000 5662306a36Sopenharmony_ci#define NFP_FL_SC_ACT_POPV 0x6A000000 5762306a36Sopenharmony_ci#define NFP_FL_SC_ACT_NULL 0x00000000 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci/* The maximum action list size (in bytes) supported by the NFP. 6062306a36Sopenharmony_ci */ 6162306a36Sopenharmony_ci#define NFP_FL_MAX_A_SIZ 1216 6262306a36Sopenharmony_ci#define NFP_FL_LW_SIZ 2 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci/* Maximum allowed geneve options */ 6562306a36Sopenharmony_ci#define NFP_FL_MAX_GENEVE_OPT_ACT 32 6662306a36Sopenharmony_ci#define NFP_FL_MAX_GENEVE_OPT_CNT 64 6762306a36Sopenharmony_ci#define NFP_FL_MAX_GENEVE_OPT_KEY 32 6862306a36Sopenharmony_ci#define NFP_FL_MAX_GENEVE_OPT_KEY_V6 8 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci/* Action opcodes */ 7162306a36Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_OUTPUT 0 7262306a36Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_PUSH_VLAN 1 7362306a36Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_POP_VLAN 2 7462306a36Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_PUSH_MPLS 3 7562306a36Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_POP_MPLS 4 7662306a36Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_TUNNEL 6 7762306a36Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_ETHERNET 7 7862306a36Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_MPLS 8 7962306a36Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_IPV4_ADDRS 9 8062306a36Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_IPV4_TTL_TOS 10 8162306a36Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_IPV6_SRC 11 8262306a36Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_IPV6_DST 12 8362306a36Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_IPV6_TC_HL_FL 13 8462306a36Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_UDP 14 8562306a36Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_TCP 15 8662306a36Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_PRE_LAG 16 8762306a36Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_PRE_TUNNEL 17 8862306a36Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_METER 24 8962306a36Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_PUSH_GENEVE 26 9062306a36Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_NUM 32 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci#define NFP_FL_OUT_FLAGS_LAST BIT(15) 9362306a36Sopenharmony_ci#define NFP_FL_OUT_FLAGS_USE_TUN BIT(4) 9462306a36Sopenharmony_ci#define NFP_FL_OUT_FLAGS_TYPE_IDX GENMASK(2, 0) 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci#define NFP_FL_PUSH_VLAN_PRIO GENMASK(15, 13) 9762306a36Sopenharmony_ci#define NFP_FL_PUSH_VLAN_VID GENMASK(11, 0) 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci/* LAG ports */ 10062306a36Sopenharmony_ci#define NFP_FL_LAG_OUT 0xC0DE0000 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci/* Tunnel ports */ 10362306a36Sopenharmony_ci#define NFP_FL_PORT_TYPE_TUN 0x50000000 10462306a36Sopenharmony_ci#define NFP_FL_TUNNEL_TYPE GENMASK(7, 4) 10562306a36Sopenharmony_ci#define NFP_FL_PRE_TUN_INDEX GENMASK(2, 0) 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci#define NFP_FLOWER_WORKQ_MAX_SKBS 30000 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci/* Cmesg reply (empirical) timeout*/ 11062306a36Sopenharmony_ci#define NFP_FL_REPLY_TIMEOUT msecs_to_jiffies(40) 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci#define nfp_flower_cmsg_warn(app, fmt, args...) \ 11362306a36Sopenharmony_ci do { \ 11462306a36Sopenharmony_ci if (net_ratelimit()) \ 11562306a36Sopenharmony_ci nfp_warn((app)->cpp, fmt, ## args); \ 11662306a36Sopenharmony_ci } while (0) 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_cienum nfp_flower_tun_type { 11962306a36Sopenharmony_ci NFP_FL_TUNNEL_NONE = 0, 12062306a36Sopenharmony_ci NFP_FL_TUNNEL_GRE = 1, 12162306a36Sopenharmony_ci NFP_FL_TUNNEL_VXLAN = 2, 12262306a36Sopenharmony_ci NFP_FL_TUNNEL_GENEVE = 4, 12362306a36Sopenharmony_ci}; 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_cistruct nfp_fl_act_head { 12662306a36Sopenharmony_ci u8 jump_id; 12762306a36Sopenharmony_ci u8 len_lw; 12862306a36Sopenharmony_ci}; 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_cistruct nfp_fl_set_eth { 13162306a36Sopenharmony_ci struct nfp_fl_act_head head; 13262306a36Sopenharmony_ci __be16 reserved; 13362306a36Sopenharmony_ci u8 eth_addr_mask[ETH_ALEN * 2]; 13462306a36Sopenharmony_ci u8 eth_addr_val[ETH_ALEN * 2]; 13562306a36Sopenharmony_ci}; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_cistruct nfp_fl_set_ip4_addrs { 13862306a36Sopenharmony_ci struct nfp_fl_act_head head; 13962306a36Sopenharmony_ci __be16 reserved; 14062306a36Sopenharmony_ci __be32 ipv4_src_mask; 14162306a36Sopenharmony_ci __be32 ipv4_src; 14262306a36Sopenharmony_ci __be32 ipv4_dst_mask; 14362306a36Sopenharmony_ci __be32 ipv4_dst; 14462306a36Sopenharmony_ci}; 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_cistruct nfp_fl_set_ip4_ttl_tos { 14762306a36Sopenharmony_ci struct nfp_fl_act_head head; 14862306a36Sopenharmony_ci u8 ipv4_ttl_mask; 14962306a36Sopenharmony_ci u8 ipv4_tos_mask; 15062306a36Sopenharmony_ci u8 ipv4_ttl; 15162306a36Sopenharmony_ci u8 ipv4_tos; 15262306a36Sopenharmony_ci __be16 reserved; 15362306a36Sopenharmony_ci}; 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_cistruct nfp_fl_set_ipv6_tc_hl_fl { 15662306a36Sopenharmony_ci struct nfp_fl_act_head head; 15762306a36Sopenharmony_ci u8 ipv6_tc_mask; 15862306a36Sopenharmony_ci u8 ipv6_hop_limit_mask; 15962306a36Sopenharmony_ci __be16 reserved; 16062306a36Sopenharmony_ci u8 ipv6_tc; 16162306a36Sopenharmony_ci u8 ipv6_hop_limit; 16262306a36Sopenharmony_ci __be32 ipv6_label_mask; 16362306a36Sopenharmony_ci __be32 ipv6_label; 16462306a36Sopenharmony_ci}; 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_cistruct nfp_fl_set_ipv6_addr { 16762306a36Sopenharmony_ci struct nfp_fl_act_head head; 16862306a36Sopenharmony_ci __be16 reserved; 16962306a36Sopenharmony_ci struct { 17062306a36Sopenharmony_ci __be32 mask; 17162306a36Sopenharmony_ci __be32 exact; 17262306a36Sopenharmony_ci } ipv6[4]; 17362306a36Sopenharmony_ci}; 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_cistruct nfp_fl_set_tport { 17662306a36Sopenharmony_ci struct nfp_fl_act_head head; 17762306a36Sopenharmony_ci __be16 reserved; 17862306a36Sopenharmony_ci u8 tp_port_mask[4]; 17962306a36Sopenharmony_ci u8 tp_port_val[4]; 18062306a36Sopenharmony_ci}; 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_cistruct nfp_fl_output { 18362306a36Sopenharmony_ci struct nfp_fl_act_head head; 18462306a36Sopenharmony_ci __be16 flags; 18562306a36Sopenharmony_ci __be32 port; 18662306a36Sopenharmony_ci}; 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_cistruct nfp_fl_push_vlan { 18962306a36Sopenharmony_ci struct nfp_fl_act_head head; 19062306a36Sopenharmony_ci __be16 reserved; 19162306a36Sopenharmony_ci __be16 vlan_tpid; 19262306a36Sopenharmony_ci __be16 vlan_tci; 19362306a36Sopenharmony_ci}; 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_cistruct nfp_fl_pop_vlan { 19662306a36Sopenharmony_ci struct nfp_fl_act_head head; 19762306a36Sopenharmony_ci __be16 reserved; 19862306a36Sopenharmony_ci}; 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_cistruct nfp_fl_pre_lag { 20162306a36Sopenharmony_ci struct nfp_fl_act_head head; 20262306a36Sopenharmony_ci __be16 group_id; 20362306a36Sopenharmony_ci u8 lag_version[3]; 20462306a36Sopenharmony_ci u8 instance; 20562306a36Sopenharmony_ci}; 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci#define NFP_FL_PRE_LAG_VER_OFF 8 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_cistruct nfp_fl_pre_tunnel { 21062306a36Sopenharmony_ci struct nfp_fl_act_head head; 21162306a36Sopenharmony_ci __be16 flags; 21262306a36Sopenharmony_ci union { 21362306a36Sopenharmony_ci __be32 ipv4_dst; 21462306a36Sopenharmony_ci struct in6_addr ipv6_dst; 21562306a36Sopenharmony_ci }; 21662306a36Sopenharmony_ci}; 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci#define NFP_FL_PRE_TUN_IPV6 BIT(0) 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_cistruct nfp_fl_set_tun { 22162306a36Sopenharmony_ci struct nfp_fl_act_head head; 22262306a36Sopenharmony_ci __be16 reserved; 22362306a36Sopenharmony_ci __be64 tun_id __packed; 22462306a36Sopenharmony_ci __be32 tun_type_index; 22562306a36Sopenharmony_ci __be16 tun_flags; 22662306a36Sopenharmony_ci u8 ttl; 22762306a36Sopenharmony_ci u8 tos; 22862306a36Sopenharmony_ci __be16 outer_vlan_tpid; 22962306a36Sopenharmony_ci __be16 outer_vlan_tci; 23062306a36Sopenharmony_ci u8 tun_len; 23162306a36Sopenharmony_ci u8 res2; 23262306a36Sopenharmony_ci __be16 tun_proto; 23362306a36Sopenharmony_ci}; 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_cistruct nfp_fl_push_geneve { 23662306a36Sopenharmony_ci struct nfp_fl_act_head head; 23762306a36Sopenharmony_ci __be16 reserved; 23862306a36Sopenharmony_ci __be16 class; 23962306a36Sopenharmony_ci u8 type; 24062306a36Sopenharmony_ci u8 length; 24162306a36Sopenharmony_ci u8 opt_data[]; 24262306a36Sopenharmony_ci}; 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_cistruct nfp_fl_push_mpls { 24562306a36Sopenharmony_ci struct nfp_fl_act_head head; 24662306a36Sopenharmony_ci __be16 ethtype; 24762306a36Sopenharmony_ci __be32 lse; 24862306a36Sopenharmony_ci}; 24962306a36Sopenharmony_ci 25062306a36Sopenharmony_cistruct nfp_fl_pop_mpls { 25162306a36Sopenharmony_ci struct nfp_fl_act_head head; 25262306a36Sopenharmony_ci __be16 ethtype; 25362306a36Sopenharmony_ci}; 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_cistruct nfp_fl_set_mpls { 25662306a36Sopenharmony_ci struct nfp_fl_act_head head; 25762306a36Sopenharmony_ci __be16 reserved; 25862306a36Sopenharmony_ci __be32 lse_mask; 25962306a36Sopenharmony_ci __be32 lse; 26062306a36Sopenharmony_ci}; 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_cistruct nfp_fl_meter { 26362306a36Sopenharmony_ci struct nfp_fl_act_head head; 26462306a36Sopenharmony_ci __be16 reserved; 26562306a36Sopenharmony_ci __be32 meter_id; 26662306a36Sopenharmony_ci}; 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_ci/* Metadata with L2 (1W/4B) 26962306a36Sopenharmony_ci * ---------------------------------------------------------------- 27062306a36Sopenharmony_ci * 3 2 1 27162306a36Sopenharmony_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 27262306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 27362306a36Sopenharmony_ci * | key_type | mask_id | PCP |p| vlan outermost VID | 27462306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 27562306a36Sopenharmony_ci * ^ ^ 27662306a36Sopenharmony_ci * NOTE: | TCI | 27762306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 27862306a36Sopenharmony_ci */ 27962306a36Sopenharmony_cistruct nfp_flower_meta_tci { 28062306a36Sopenharmony_ci u8 nfp_flow_key_layer; 28162306a36Sopenharmony_ci u8 mask_id; 28262306a36Sopenharmony_ci __be16 tci; 28362306a36Sopenharmony_ci}; 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_ci/* Extended metadata for additional key_layers (1W/4B) 28662306a36Sopenharmony_ci * ---------------------------------------------------------------- 28762306a36Sopenharmony_ci * 3 2 1 28862306a36Sopenharmony_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 28962306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 29062306a36Sopenharmony_ci * | nfp_flow_key_layer2 | 29162306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 29262306a36Sopenharmony_ci */ 29362306a36Sopenharmony_cistruct nfp_flower_ext_meta { 29462306a36Sopenharmony_ci __be32 nfp_flow_key_layer2; 29562306a36Sopenharmony_ci}; 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_ci/* Port details (1W/4B) 29862306a36Sopenharmony_ci * ---------------------------------------------------------------- 29962306a36Sopenharmony_ci * 3 2 1 30062306a36Sopenharmony_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 30162306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 30262306a36Sopenharmony_ci * | port_ingress | 30362306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 30462306a36Sopenharmony_ci */ 30562306a36Sopenharmony_cistruct nfp_flower_in_port { 30662306a36Sopenharmony_ci __be32 in_port; 30762306a36Sopenharmony_ci}; 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_ci/* L2 details (4W/16B) 31062306a36Sopenharmony_ci * 3 2 1 31162306a36Sopenharmony_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 31262306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 31362306a36Sopenharmony_ci * | mac_addr_dst, 31 - 0 | 31462306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 31562306a36Sopenharmony_ci * | mac_addr_dst, 47 - 32 | mac_addr_src, 15 - 0 | 31662306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 31762306a36Sopenharmony_ci * | mac_addr_src, 47 - 16 | 31862306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 31962306a36Sopenharmony_ci * | mpls outermost label | TC |B| reserved |q| 32062306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 32162306a36Sopenharmony_ci */ 32262306a36Sopenharmony_cistruct nfp_flower_mac_mpls { 32362306a36Sopenharmony_ci u8 mac_dst[6]; 32462306a36Sopenharmony_ci u8 mac_src[6]; 32562306a36Sopenharmony_ci __be32 mpls_lse; 32662306a36Sopenharmony_ci}; 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_ci/* VLAN details (2W/8B) 32962306a36Sopenharmony_ci * 3 2 1 33062306a36Sopenharmony_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 33162306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 33262306a36Sopenharmony_ci * | outer_tpid | outer_tci | 33362306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 33462306a36Sopenharmony_ci * | inner_tpid | inner_tci | 33562306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 33662306a36Sopenharmony_ci */ 33762306a36Sopenharmony_cistruct nfp_flower_vlan { 33862306a36Sopenharmony_ci __be16 outer_tpid; 33962306a36Sopenharmony_ci __be16 outer_tci; 34062306a36Sopenharmony_ci __be16 inner_tpid; 34162306a36Sopenharmony_ci __be16 inner_tci; 34262306a36Sopenharmony_ci}; 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci/* L4 ports (for UDP, TCP, SCTP) (1W/4B) 34562306a36Sopenharmony_ci * 3 2 1 34662306a36Sopenharmony_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 34762306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 34862306a36Sopenharmony_ci * | port_src | port_dst | 34962306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 35062306a36Sopenharmony_ci */ 35162306a36Sopenharmony_cistruct nfp_flower_tp_ports { 35262306a36Sopenharmony_ci __be16 port_src; 35362306a36Sopenharmony_ci __be16 port_dst; 35462306a36Sopenharmony_ci}; 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_cistruct nfp_flower_ip_ext { 35762306a36Sopenharmony_ci u8 tos; 35862306a36Sopenharmony_ci u8 proto; 35962306a36Sopenharmony_ci u8 ttl; 36062306a36Sopenharmony_ci u8 flags; 36162306a36Sopenharmony_ci}; 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_ci/* L3 IPv4 details (3W/12B) 36462306a36Sopenharmony_ci * 3 2 1 36562306a36Sopenharmony_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 36662306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 36762306a36Sopenharmony_ci * | DSCP |ECN| protocol | ttl | flags | 36862306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 36962306a36Sopenharmony_ci * | ipv4_addr_src | 37062306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 37162306a36Sopenharmony_ci * | ipv4_addr_dst | 37262306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 37362306a36Sopenharmony_ci */ 37462306a36Sopenharmony_cistruct nfp_flower_ipv4 { 37562306a36Sopenharmony_ci struct nfp_flower_ip_ext ip_ext; 37662306a36Sopenharmony_ci __be32 ipv4_src; 37762306a36Sopenharmony_ci __be32 ipv4_dst; 37862306a36Sopenharmony_ci}; 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_ci/* L3 IPv6 details (10W/40B) 38162306a36Sopenharmony_ci * 3 2 1 38262306a36Sopenharmony_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 38362306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 38462306a36Sopenharmony_ci * | DSCP |ECN| protocol | ttl | flags | 38562306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 38662306a36Sopenharmony_ci * | ipv6_exthdr | res | ipv6_flow_label | 38762306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 38862306a36Sopenharmony_ci * | ipv6_addr_src, 31 - 0 | 38962306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 39062306a36Sopenharmony_ci * | ipv6_addr_src, 63 - 32 | 39162306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 39262306a36Sopenharmony_ci * | ipv6_addr_src, 95 - 64 | 39362306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 39462306a36Sopenharmony_ci * | ipv6_addr_src, 127 - 96 | 39562306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 39662306a36Sopenharmony_ci * | ipv6_addr_dst, 31 - 0 | 39762306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 39862306a36Sopenharmony_ci * | ipv6_addr_dst, 63 - 32 | 39962306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 40062306a36Sopenharmony_ci * | ipv6_addr_dst, 95 - 64 | 40162306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 40262306a36Sopenharmony_ci * | ipv6_addr_dst, 127 - 96 | 40362306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 40462306a36Sopenharmony_ci */ 40562306a36Sopenharmony_cistruct nfp_flower_ipv6 { 40662306a36Sopenharmony_ci struct nfp_flower_ip_ext ip_ext; 40762306a36Sopenharmony_ci __be32 ipv6_flow_label_exthdr; 40862306a36Sopenharmony_ci struct in6_addr ipv6_src; 40962306a36Sopenharmony_ci struct in6_addr ipv6_dst; 41062306a36Sopenharmony_ci}; 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_cistruct nfp_flower_tun_ipv4 { 41362306a36Sopenharmony_ci __be32 src; 41462306a36Sopenharmony_ci __be32 dst; 41562306a36Sopenharmony_ci}; 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_cistruct nfp_flower_tun_ipv6 { 41862306a36Sopenharmony_ci struct in6_addr src; 41962306a36Sopenharmony_ci struct in6_addr dst; 42062306a36Sopenharmony_ci}; 42162306a36Sopenharmony_ci 42262306a36Sopenharmony_cistruct nfp_flower_tun_ip_ext { 42362306a36Sopenharmony_ci u8 tos; 42462306a36Sopenharmony_ci u8 ttl; 42562306a36Sopenharmony_ci}; 42662306a36Sopenharmony_ci 42762306a36Sopenharmony_ci/* Flow Frame IPv4 UDP TUNNEL --> Tunnel details (4W/16B) 42862306a36Sopenharmony_ci * ----------------------------------------------------------------- 42962306a36Sopenharmony_ci * 3 2 1 43062306a36Sopenharmony_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 43162306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 43262306a36Sopenharmony_ci * | ipv4_addr_src | 43362306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 43462306a36Sopenharmony_ci * | ipv4_addr_dst | 43562306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 43662306a36Sopenharmony_ci * | Reserved | tos | ttl | 43762306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 43862306a36Sopenharmony_ci * | Reserved | 43962306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 44062306a36Sopenharmony_ci * | VNI | Reserved | 44162306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 44262306a36Sopenharmony_ci */ 44362306a36Sopenharmony_cistruct nfp_flower_ipv4_udp_tun { 44462306a36Sopenharmony_ci struct nfp_flower_tun_ipv4 ipv4; 44562306a36Sopenharmony_ci __be16 reserved1; 44662306a36Sopenharmony_ci struct nfp_flower_tun_ip_ext ip_ext; 44762306a36Sopenharmony_ci __be32 reserved2; 44862306a36Sopenharmony_ci __be32 tun_id; 44962306a36Sopenharmony_ci}; 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_ci/* Flow Frame IPv6 UDP TUNNEL --> Tunnel details (11W/44B) 45262306a36Sopenharmony_ci * ----------------------------------------------------------------- 45362306a36Sopenharmony_ci * 3 2 1 45462306a36Sopenharmony_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 45562306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 45662306a36Sopenharmony_ci * | ipv6_addr_src, 31 - 0 | 45762306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 45862306a36Sopenharmony_ci * | ipv6_addr_src, 63 - 32 | 45962306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 46062306a36Sopenharmony_ci * | ipv6_addr_src, 95 - 64 | 46162306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 46262306a36Sopenharmony_ci * | ipv6_addr_src, 127 - 96 | 46362306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 46462306a36Sopenharmony_ci * | ipv6_addr_dst, 31 - 0 | 46562306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 46662306a36Sopenharmony_ci * | ipv6_addr_dst, 63 - 32 | 46762306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 46862306a36Sopenharmony_ci * | ipv6_addr_dst, 95 - 64 | 46962306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 47062306a36Sopenharmony_ci * | ipv6_addr_dst, 127 - 96 | 47162306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 47262306a36Sopenharmony_ci * | Reserved | tos | ttl | 47362306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 47462306a36Sopenharmony_ci * | Reserved | 47562306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 47662306a36Sopenharmony_ci * | VNI | Reserved | 47762306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 47862306a36Sopenharmony_ci */ 47962306a36Sopenharmony_cistruct nfp_flower_ipv6_udp_tun { 48062306a36Sopenharmony_ci struct nfp_flower_tun_ipv6 ipv6; 48162306a36Sopenharmony_ci __be16 reserved1; 48262306a36Sopenharmony_ci struct nfp_flower_tun_ip_ext ip_ext; 48362306a36Sopenharmony_ci __be32 reserved2; 48462306a36Sopenharmony_ci __be32 tun_id; 48562306a36Sopenharmony_ci}; 48662306a36Sopenharmony_ci 48762306a36Sopenharmony_ci/* Flow Frame GRE TUNNEL --> Tunnel details (6W/24B) 48862306a36Sopenharmony_ci * ----------------------------------------------------------------- 48962306a36Sopenharmony_ci * 3 2 1 49062306a36Sopenharmony_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 49162306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 49262306a36Sopenharmony_ci * | ipv4_addr_src | 49362306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 49462306a36Sopenharmony_ci * | ipv4_addr_dst | 49562306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 49662306a36Sopenharmony_ci * | tun_flags | tos | ttl | 49762306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 49862306a36Sopenharmony_ci * | Reserved | Ethertype | 49962306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 50062306a36Sopenharmony_ci * | Key | 50162306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 50262306a36Sopenharmony_ci * | Reserved | 50362306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 50462306a36Sopenharmony_ci */ 50562306a36Sopenharmony_ci 50662306a36Sopenharmony_cistruct nfp_flower_ipv4_gre_tun { 50762306a36Sopenharmony_ci struct nfp_flower_tun_ipv4 ipv4; 50862306a36Sopenharmony_ci __be16 tun_flags; 50962306a36Sopenharmony_ci struct nfp_flower_tun_ip_ext ip_ext; 51062306a36Sopenharmony_ci __be16 reserved1; 51162306a36Sopenharmony_ci __be16 ethertype; 51262306a36Sopenharmony_ci __be32 tun_key; 51362306a36Sopenharmony_ci __be32 reserved2; 51462306a36Sopenharmony_ci}; 51562306a36Sopenharmony_ci 51662306a36Sopenharmony_ci/* Flow Frame GRE TUNNEL V6 --> Tunnel details (12W/48B) 51762306a36Sopenharmony_ci * ----------------------------------------------------------------- 51862306a36Sopenharmony_ci * 3 2 1 51962306a36Sopenharmony_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 52062306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 52162306a36Sopenharmony_ci * | ipv6_addr_src, 31 - 0 | 52262306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 52362306a36Sopenharmony_ci * | ipv6_addr_src, 63 - 32 | 52462306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 52562306a36Sopenharmony_ci * | ipv6_addr_src, 95 - 64 | 52662306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 52762306a36Sopenharmony_ci * | ipv6_addr_src, 127 - 96 | 52862306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 52962306a36Sopenharmony_ci * | ipv6_addr_dst, 31 - 0 | 53062306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 53162306a36Sopenharmony_ci * | ipv6_addr_dst, 63 - 32 | 53262306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 53362306a36Sopenharmony_ci * | ipv6_addr_dst, 95 - 64 | 53462306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 53562306a36Sopenharmony_ci * | ipv6_addr_dst, 127 - 96 | 53662306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 53762306a36Sopenharmony_ci * | tun_flags | tos | ttl | 53862306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 53962306a36Sopenharmony_ci * | Reserved | Ethertype | 54062306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 54162306a36Sopenharmony_ci * | Key | 54262306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 54362306a36Sopenharmony_ci * | Reserved | 54462306a36Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 54562306a36Sopenharmony_ci */ 54662306a36Sopenharmony_cistruct nfp_flower_ipv6_gre_tun { 54762306a36Sopenharmony_ci struct nfp_flower_tun_ipv6 ipv6; 54862306a36Sopenharmony_ci __be16 tun_flags; 54962306a36Sopenharmony_ci struct nfp_flower_tun_ip_ext ip_ext; 55062306a36Sopenharmony_ci __be16 reserved1; 55162306a36Sopenharmony_ci __be16 ethertype; 55262306a36Sopenharmony_ci __be32 tun_key; 55362306a36Sopenharmony_ci __be32 reserved2; 55462306a36Sopenharmony_ci}; 55562306a36Sopenharmony_ci 55662306a36Sopenharmony_cistruct nfp_flower_geneve_options { 55762306a36Sopenharmony_ci u8 data[NFP_FL_MAX_GENEVE_OPT_KEY]; 55862306a36Sopenharmony_ci}; 55962306a36Sopenharmony_ci 56062306a36Sopenharmony_ci#define NFP_FL_TUN_VNI_OFFSET 8 56162306a36Sopenharmony_ci 56262306a36Sopenharmony_ci/* The base header for a control message packet. 56362306a36Sopenharmony_ci * Defines an 8-bit version, and an 8-bit type, padded 56462306a36Sopenharmony_ci * to a 32-bit word. Rest of the packet is type-specific. 56562306a36Sopenharmony_ci */ 56662306a36Sopenharmony_cistruct nfp_flower_cmsg_hdr { 56762306a36Sopenharmony_ci __be16 pad; 56862306a36Sopenharmony_ci u8 type; 56962306a36Sopenharmony_ci u8 version; 57062306a36Sopenharmony_ci}; 57162306a36Sopenharmony_ci 57262306a36Sopenharmony_ci#define NFP_FLOWER_CMSG_HLEN sizeof(struct nfp_flower_cmsg_hdr) 57362306a36Sopenharmony_ci#define NFP_FLOWER_CMSG_VER1 1 57462306a36Sopenharmony_ci 57562306a36Sopenharmony_ci/* Types defined for port related control messages */ 57662306a36Sopenharmony_cienum nfp_flower_cmsg_type_port { 57762306a36Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_FLOW_ADD = 0, 57862306a36Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_FLOW_MOD = 1, 57962306a36Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_FLOW_DEL = 2, 58062306a36Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_LAG_CONFIG = 4, 58162306a36Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_PORT_REIFY = 6, 58262306a36Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_MAC_REPR = 7, 58362306a36Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_PORT_MOD = 8, 58462306a36Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_MERGE_HINT = 9, 58562306a36Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_NO_NEIGH = 10, 58662306a36Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_TUN_MAC = 11, 58762306a36Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_ACTIVE_TUNS = 12, 58862306a36Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_TUN_NEIGH = 13, 58962306a36Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_TUN_IPS = 14, 59062306a36Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_FLOW_STATS = 15, 59162306a36Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_PORT_ECHO = 16, 59262306a36Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_QOS_MOD = 18, 59362306a36Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_QOS_DEL = 19, 59462306a36Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_QOS_STATS = 20, 59562306a36Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_PRE_TUN_RULE = 21, 59662306a36Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_TUN_IPS_V6 = 22, 59762306a36Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_NO_NEIGH_V6 = 23, 59862306a36Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_TUN_NEIGH_V6 = 24, 59962306a36Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_ACTIVE_TUNS_V6 = 25, 60062306a36Sopenharmony_ci NFP_FLOWER_CMSG_TYPE_MAX = 32, 60162306a36Sopenharmony_ci}; 60262306a36Sopenharmony_ci 60362306a36Sopenharmony_ci/* NFP_FLOWER_CMSG_TYPE_MAC_REPR */ 60462306a36Sopenharmony_cistruct nfp_flower_cmsg_mac_repr { 60562306a36Sopenharmony_ci u8 reserved[3]; 60662306a36Sopenharmony_ci u8 num_ports; 60762306a36Sopenharmony_ci struct { 60862306a36Sopenharmony_ci u8 idx; 60962306a36Sopenharmony_ci u8 info; 61062306a36Sopenharmony_ci u8 nbi_port; 61162306a36Sopenharmony_ci u8 phys_port; 61262306a36Sopenharmony_ci } ports[]; 61362306a36Sopenharmony_ci}; 61462306a36Sopenharmony_ci 61562306a36Sopenharmony_ci#define NFP_FLOWER_CMSG_MAC_REPR_NBI GENMASK(1, 0) 61662306a36Sopenharmony_ci 61762306a36Sopenharmony_ci/* NFP_FLOWER_CMSG_TYPE_PORT_MOD */ 61862306a36Sopenharmony_cistruct nfp_flower_cmsg_portmod { 61962306a36Sopenharmony_ci __be32 portnum; 62062306a36Sopenharmony_ci u8 reserved; 62162306a36Sopenharmony_ci u8 info; 62262306a36Sopenharmony_ci __be16 mtu; 62362306a36Sopenharmony_ci}; 62462306a36Sopenharmony_ci 62562306a36Sopenharmony_ci#define NFP_FLOWER_CMSG_PORTMOD_INFO_LINK BIT(0) 62662306a36Sopenharmony_ci#define NFP_FLOWER_CMSG_PORTMOD_MTU_CHANGE_ONLY BIT(1) 62762306a36Sopenharmony_ci 62862306a36Sopenharmony_ci/* NFP_FLOWER_CMSG_TYPE_PORT_REIFY */ 62962306a36Sopenharmony_cistruct nfp_flower_cmsg_portreify { 63062306a36Sopenharmony_ci __be32 portnum; 63162306a36Sopenharmony_ci u16 reserved; 63262306a36Sopenharmony_ci __be16 info; 63362306a36Sopenharmony_ci}; 63462306a36Sopenharmony_ci 63562306a36Sopenharmony_ci#define NFP_FLOWER_CMSG_PORTREIFY_INFO_EXIST BIT(0) 63662306a36Sopenharmony_ci 63762306a36Sopenharmony_ci/* NFP_FLOWER_CMSG_TYPE_FLOW_MERGE_HINT */ 63862306a36Sopenharmony_cistruct nfp_flower_cmsg_merge_hint { 63962306a36Sopenharmony_ci u8 reserved[3]; 64062306a36Sopenharmony_ci u8 count; 64162306a36Sopenharmony_ci struct { 64262306a36Sopenharmony_ci __be32 host_ctx; 64362306a36Sopenharmony_ci __be64 host_cookie; 64462306a36Sopenharmony_ci } __packed flow[]; 64562306a36Sopenharmony_ci}; 64662306a36Sopenharmony_ci 64762306a36Sopenharmony_cienum nfp_flower_cmsg_port_type { 64862306a36Sopenharmony_ci NFP_FLOWER_CMSG_PORT_TYPE_UNSPEC = 0x0, 64962306a36Sopenharmony_ci NFP_FLOWER_CMSG_PORT_TYPE_PHYS_PORT = 0x1, 65062306a36Sopenharmony_ci NFP_FLOWER_CMSG_PORT_TYPE_PCIE_PORT = 0x2, 65162306a36Sopenharmony_ci NFP_FLOWER_CMSG_PORT_TYPE_OTHER_PORT = 0x3, 65262306a36Sopenharmony_ci}; 65362306a36Sopenharmony_ci 65462306a36Sopenharmony_cienum nfp_flower_cmsg_port_vnic_type { 65562306a36Sopenharmony_ci NFP_FLOWER_CMSG_PORT_VNIC_TYPE_VF = 0x0, 65662306a36Sopenharmony_ci NFP_FLOWER_CMSG_PORT_VNIC_TYPE_PF = 0x1, 65762306a36Sopenharmony_ci NFP_FLOWER_CMSG_PORT_VNIC_TYPE_CTRL = 0x2, 65862306a36Sopenharmony_ci}; 65962306a36Sopenharmony_ci 66062306a36Sopenharmony_ci#define NFP_FLOWER_CMSG_PORT_TYPE GENMASK(31, 28) 66162306a36Sopenharmony_ci#define NFP_FLOWER_CMSG_PORT_SYS_ID GENMASK(27, 24) 66262306a36Sopenharmony_ci#define NFP_FLOWER_CMSG_PORT_NFP_ID GENMASK(23, 22) 66362306a36Sopenharmony_ci#define NFP_FLOWER_CMSG_PORT_PCI GENMASK(15, 14) 66462306a36Sopenharmony_ci#define NFP_FLOWER_CMSG_PORT_VNIC_TYPE GENMASK(13, 12) 66562306a36Sopenharmony_ci#define NFP_FLOWER_CMSG_PORT_VNIC GENMASK(11, 6) 66662306a36Sopenharmony_ci#define NFP_FLOWER_CMSG_PORT_PCIE_Q GENMASK(5, 0) 66762306a36Sopenharmony_ci#define NFP_FLOWER_CMSG_PORT_PHYS_PORT_NUM GENMASK(7, 0) 66862306a36Sopenharmony_ci 66962306a36Sopenharmony_cistatic inline u32 nfp_flower_internal_port_get_port_id(u8 internal_port) 67062306a36Sopenharmony_ci{ 67162306a36Sopenharmony_ci return FIELD_PREP(NFP_FLOWER_CMSG_PORT_PHYS_PORT_NUM, internal_port) | 67262306a36Sopenharmony_ci FIELD_PREP(NFP_FLOWER_CMSG_PORT_TYPE, 67362306a36Sopenharmony_ci NFP_FLOWER_CMSG_PORT_TYPE_OTHER_PORT); 67462306a36Sopenharmony_ci} 67562306a36Sopenharmony_ci 67662306a36Sopenharmony_cistatic inline u32 nfp_flower_cmsg_phys_port(u8 phys_port) 67762306a36Sopenharmony_ci{ 67862306a36Sopenharmony_ci return FIELD_PREP(NFP_FLOWER_CMSG_PORT_PHYS_PORT_NUM, phys_port) | 67962306a36Sopenharmony_ci FIELD_PREP(NFP_FLOWER_CMSG_PORT_TYPE, 68062306a36Sopenharmony_ci NFP_FLOWER_CMSG_PORT_TYPE_PHYS_PORT); 68162306a36Sopenharmony_ci} 68262306a36Sopenharmony_ci 68362306a36Sopenharmony_cistatic inline u32 68462306a36Sopenharmony_cinfp_flower_cmsg_pcie_port(u8 nfp_pcie, enum nfp_flower_cmsg_port_vnic_type type, 68562306a36Sopenharmony_ci u8 vnic, u8 q) 68662306a36Sopenharmony_ci{ 68762306a36Sopenharmony_ci return FIELD_PREP(NFP_FLOWER_CMSG_PORT_PCI, nfp_pcie) | 68862306a36Sopenharmony_ci FIELD_PREP(NFP_FLOWER_CMSG_PORT_VNIC_TYPE, type) | 68962306a36Sopenharmony_ci FIELD_PREP(NFP_FLOWER_CMSG_PORT_VNIC, vnic) | 69062306a36Sopenharmony_ci FIELD_PREP(NFP_FLOWER_CMSG_PORT_PCIE_Q, q) | 69162306a36Sopenharmony_ci FIELD_PREP(NFP_FLOWER_CMSG_PORT_TYPE, 69262306a36Sopenharmony_ci NFP_FLOWER_CMSG_PORT_TYPE_PCIE_PORT); 69362306a36Sopenharmony_ci} 69462306a36Sopenharmony_ci 69562306a36Sopenharmony_cistatic inline void *nfp_flower_cmsg_get_data(struct sk_buff *skb) 69662306a36Sopenharmony_ci{ 69762306a36Sopenharmony_ci return (unsigned char *)skb->data + NFP_FLOWER_CMSG_HLEN; 69862306a36Sopenharmony_ci} 69962306a36Sopenharmony_ci 70062306a36Sopenharmony_cistatic inline int nfp_flower_cmsg_get_data_len(struct sk_buff *skb) 70162306a36Sopenharmony_ci{ 70262306a36Sopenharmony_ci return skb->len - NFP_FLOWER_CMSG_HLEN; 70362306a36Sopenharmony_ci} 70462306a36Sopenharmony_ci 70562306a36Sopenharmony_cistatic inline bool 70662306a36Sopenharmony_cinfp_fl_netdev_is_tunnel_type(struct net_device *netdev, 70762306a36Sopenharmony_ci enum nfp_flower_tun_type tun_type) 70862306a36Sopenharmony_ci{ 70962306a36Sopenharmony_ci if (netif_is_vxlan(netdev)) 71062306a36Sopenharmony_ci return tun_type == NFP_FL_TUNNEL_VXLAN; 71162306a36Sopenharmony_ci if (netif_is_gretap(netdev) || netif_is_ip6gretap(netdev)) 71262306a36Sopenharmony_ci return tun_type == NFP_FL_TUNNEL_GRE; 71362306a36Sopenharmony_ci if (netif_is_geneve(netdev)) 71462306a36Sopenharmony_ci return tun_type == NFP_FL_TUNNEL_GENEVE; 71562306a36Sopenharmony_ci 71662306a36Sopenharmony_ci return false; 71762306a36Sopenharmony_ci} 71862306a36Sopenharmony_ci 71962306a36Sopenharmony_cistatic inline bool nfp_fl_is_netdev_to_offload(struct net_device *netdev) 72062306a36Sopenharmony_ci{ 72162306a36Sopenharmony_ci if (!netdev->rtnl_link_ops) 72262306a36Sopenharmony_ci return false; 72362306a36Sopenharmony_ci if (!strcmp(netdev->rtnl_link_ops->kind, "openvswitch")) 72462306a36Sopenharmony_ci return true; 72562306a36Sopenharmony_ci if (netif_is_vxlan(netdev)) 72662306a36Sopenharmony_ci return true; 72762306a36Sopenharmony_ci if (netif_is_geneve(netdev)) 72862306a36Sopenharmony_ci return true; 72962306a36Sopenharmony_ci if (netif_is_gretap(netdev)) 73062306a36Sopenharmony_ci return true; 73162306a36Sopenharmony_ci if (netif_is_ip6gretap(netdev)) 73262306a36Sopenharmony_ci return true; 73362306a36Sopenharmony_ci 73462306a36Sopenharmony_ci return false; 73562306a36Sopenharmony_ci} 73662306a36Sopenharmony_ci 73762306a36Sopenharmony_cistruct sk_buff * 73862306a36Sopenharmony_cinfp_flower_cmsg_mac_repr_start(struct nfp_app *app, unsigned int num_ports); 73962306a36Sopenharmony_civoid 74062306a36Sopenharmony_cinfp_flower_cmsg_mac_repr_add(struct sk_buff *skb, unsigned int idx, 74162306a36Sopenharmony_ci unsigned int nbi, unsigned int nbi_port, 74262306a36Sopenharmony_ci unsigned int phys_port); 74362306a36Sopenharmony_ciint nfp_flower_cmsg_portmod(struct nfp_repr *repr, bool carrier_ok, 74462306a36Sopenharmony_ci unsigned int mtu, bool mtu_only); 74562306a36Sopenharmony_ciint nfp_flower_cmsg_portreify(struct nfp_repr *repr, bool exists); 74662306a36Sopenharmony_civoid nfp_flower_cmsg_process_rx(struct work_struct *work); 74762306a36Sopenharmony_civoid nfp_flower_cmsg_rx(struct nfp_app *app, struct sk_buff *skb); 74862306a36Sopenharmony_cistruct sk_buff * 74962306a36Sopenharmony_cinfp_flower_cmsg_alloc(struct nfp_app *app, unsigned int size, 75062306a36Sopenharmony_ci enum nfp_flower_cmsg_type_port type, gfp_t flag); 75162306a36Sopenharmony_ci 75262306a36Sopenharmony_ci#endif 753