Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
0002 /* Copyright (C) 2017-2018 Netronome Systems, Inc. */
0003 
0004 #ifndef NFP_FLOWER_CMSG_H
0005 #define NFP_FLOWER_CMSG_H
0006 
0007 #include <linux/bitfield.h>
0008 #include <linux/skbuff.h>
0009 #include <linux/types.h>
0010 #include <net/geneve.h>
0011 #include <net/gre.h>
0012 #include <net/vxlan.h>
0013 
0014 #include "../nfp_app.h"
0015 #include "../nfpcore/nfp_cpp.h"
0016 
0017 #define NFP_FLOWER_LAYER_EXT_META   BIT(0)
0018 #define NFP_FLOWER_LAYER_PORT       BIT(1)
0019 #define NFP_FLOWER_LAYER_MAC        BIT(2)
0020 #define NFP_FLOWER_LAYER_TP     BIT(3)
0021 #define NFP_FLOWER_LAYER_IPV4       BIT(4)
0022 #define NFP_FLOWER_LAYER_IPV6       BIT(5)
0023 #define NFP_FLOWER_LAYER_CT     BIT(6)
0024 #define NFP_FLOWER_LAYER_VXLAN      BIT(7)
0025 
0026 #define NFP_FLOWER_LAYER2_GRE       BIT(0)
0027 #define NFP_FLOWER_LAYER2_QINQ      BIT(4)
0028 #define NFP_FLOWER_LAYER2_GENEVE    BIT(5)
0029 #define NFP_FLOWER_LAYER2_GENEVE_OP BIT(6)
0030 #define NFP_FLOWER_LAYER2_TUN_IPV6  BIT(7)
0031 
0032 #define NFP_FLOWER_MASK_VLAN_PRIO   GENMASK(15, 13)
0033 #define NFP_FLOWER_MASK_VLAN_PRESENT    BIT(12)
0034 #define NFP_FLOWER_MASK_VLAN_VID    GENMASK(11, 0)
0035 
0036 #define NFP_FLOWER_MASK_MPLS_LB     GENMASK(31, 12)
0037 #define NFP_FLOWER_MASK_MPLS_TC     GENMASK(11, 9)
0038 #define NFP_FLOWER_MASK_MPLS_BOS    BIT(8)
0039 #define NFP_FLOWER_MASK_MPLS_Q      BIT(0)
0040 
0041 #define NFP_FL_IP_FRAG_FIRST        BIT(7)
0042 #define NFP_FL_IP_FRAGMENTED        BIT(6)
0043 
0044 /* GRE Tunnel flags */
0045 #define NFP_FL_GRE_FLAG_KEY     BIT(2)
0046 
0047 /* Compressed HW representation of TCP Flags */
0048 #define NFP_FL_TCP_FLAG_URG     BIT(4)
0049 #define NFP_FL_TCP_FLAG_PSH     BIT(3)
0050 #define NFP_FL_TCP_FLAG_RST     BIT(2)
0051 #define NFP_FL_TCP_FLAG_SYN     BIT(1)
0052 #define NFP_FL_TCP_FLAG_FIN     BIT(0)
0053 
0054 #define NFP_FL_SC_ACT_DROP      0x80000000
0055 #define NFP_FL_SC_ACT_USER      0x7D000000
0056 #define NFP_FL_SC_ACT_POPV      0x6A000000
0057 #define NFP_FL_SC_ACT_NULL      0x00000000
0058 
0059 /* The maximum action list size (in bytes) supported by the NFP.
0060  */
0061 #define NFP_FL_MAX_A_SIZ        1216
0062 #define NFP_FL_LW_SIZ           2
0063 
0064 /* Maximum allowed geneve options */
0065 #define NFP_FL_MAX_GENEVE_OPT_ACT   32
0066 #define NFP_FL_MAX_GENEVE_OPT_CNT   64
0067 #define NFP_FL_MAX_GENEVE_OPT_KEY   32
0068 #define NFP_FL_MAX_GENEVE_OPT_KEY_V6    8
0069 
0070 /* Action opcodes */
0071 #define NFP_FL_ACTION_OPCODE_OUTPUT     0
0072 #define NFP_FL_ACTION_OPCODE_PUSH_VLAN      1
0073 #define NFP_FL_ACTION_OPCODE_POP_VLAN       2
0074 #define NFP_FL_ACTION_OPCODE_PUSH_MPLS      3
0075 #define NFP_FL_ACTION_OPCODE_POP_MPLS       4
0076 #define NFP_FL_ACTION_OPCODE_SET_TUNNEL     6
0077 #define NFP_FL_ACTION_OPCODE_SET_ETHERNET   7
0078 #define NFP_FL_ACTION_OPCODE_SET_MPLS       8
0079 #define NFP_FL_ACTION_OPCODE_SET_IPV4_ADDRS 9
0080 #define NFP_FL_ACTION_OPCODE_SET_IPV4_TTL_TOS   10
0081 #define NFP_FL_ACTION_OPCODE_SET_IPV6_SRC   11
0082 #define NFP_FL_ACTION_OPCODE_SET_IPV6_DST   12
0083 #define NFP_FL_ACTION_OPCODE_SET_IPV6_TC_HL_FL  13
0084 #define NFP_FL_ACTION_OPCODE_SET_UDP        14
0085 #define NFP_FL_ACTION_OPCODE_SET_TCP        15
0086 #define NFP_FL_ACTION_OPCODE_PRE_LAG        16
0087 #define NFP_FL_ACTION_OPCODE_PRE_TUNNEL     17
0088 #define NFP_FL_ACTION_OPCODE_METER      24
0089 #define NFP_FL_ACTION_OPCODE_PUSH_GENEVE    26
0090 #define NFP_FL_ACTION_OPCODE_NUM        32
0091 
0092 #define NFP_FL_OUT_FLAGS_LAST       BIT(15)
0093 #define NFP_FL_OUT_FLAGS_USE_TUN    BIT(4)
0094 #define NFP_FL_OUT_FLAGS_TYPE_IDX   GENMASK(2, 0)
0095 
0096 #define NFP_FL_PUSH_VLAN_PRIO       GENMASK(15, 13)
0097 #define NFP_FL_PUSH_VLAN_VID        GENMASK(11, 0)
0098 
0099 /* LAG ports */
0100 #define NFP_FL_LAG_OUT          0xC0DE0000
0101 
0102 /* Tunnel ports */
0103 #define NFP_FL_PORT_TYPE_TUN        0x50000000
0104 #define NFP_FL_TUNNEL_TYPE      GENMASK(7, 4)
0105 #define NFP_FL_PRE_TUN_INDEX        GENMASK(2, 0)
0106 
0107 #define NFP_FLOWER_WORKQ_MAX_SKBS   30000
0108 
0109 /* Cmesg reply (empirical) timeout*/
0110 #define NFP_FL_REPLY_TIMEOUT        msecs_to_jiffies(40)
0111 
0112 #define nfp_flower_cmsg_warn(app, fmt, args...)                         \
0113     do {                                                            \
0114         if (net_ratelimit())                                    \
0115             nfp_warn((app)->cpp, fmt, ## args);             \
0116     } while (0)
0117 
0118 enum nfp_flower_tun_type {
0119     NFP_FL_TUNNEL_NONE =    0,
0120     NFP_FL_TUNNEL_GRE = 1,
0121     NFP_FL_TUNNEL_VXLAN =   2,
0122     NFP_FL_TUNNEL_GENEVE =  4,
0123 };
0124 
0125 struct nfp_fl_act_head {
0126     u8 jump_id;
0127     u8 len_lw;
0128 };
0129 
0130 struct nfp_fl_set_eth {
0131     struct nfp_fl_act_head head;
0132     __be16 reserved;
0133     u8 eth_addr_mask[ETH_ALEN * 2];
0134     u8 eth_addr_val[ETH_ALEN * 2];
0135 };
0136 
0137 struct nfp_fl_set_ip4_addrs {
0138     struct nfp_fl_act_head head;
0139     __be16 reserved;
0140     __be32 ipv4_src_mask;
0141     __be32 ipv4_src;
0142     __be32 ipv4_dst_mask;
0143     __be32 ipv4_dst;
0144 };
0145 
0146 struct nfp_fl_set_ip4_ttl_tos {
0147     struct nfp_fl_act_head head;
0148     u8 ipv4_ttl_mask;
0149     u8 ipv4_tos_mask;
0150     u8 ipv4_ttl;
0151     u8 ipv4_tos;
0152     __be16 reserved;
0153 };
0154 
0155 struct nfp_fl_set_ipv6_tc_hl_fl {
0156     struct nfp_fl_act_head head;
0157     u8 ipv6_tc_mask;
0158     u8 ipv6_hop_limit_mask;
0159     __be16 reserved;
0160     u8 ipv6_tc;
0161     u8 ipv6_hop_limit;
0162     __be32 ipv6_label_mask;
0163     __be32 ipv6_label;
0164 };
0165 
0166 struct nfp_fl_set_ipv6_addr {
0167     struct nfp_fl_act_head head;
0168     __be16 reserved;
0169     struct {
0170         __be32 mask;
0171         __be32 exact;
0172     } ipv6[4];
0173 };
0174 
0175 struct nfp_fl_set_tport {
0176     struct nfp_fl_act_head head;
0177     __be16 reserved;
0178     u8 tp_port_mask[4];
0179     u8 tp_port_val[4];
0180 };
0181 
0182 struct nfp_fl_output {
0183     struct nfp_fl_act_head head;
0184     __be16 flags;
0185     __be32 port;
0186 };
0187 
0188 struct nfp_fl_push_vlan {
0189     struct nfp_fl_act_head head;
0190     __be16 reserved;
0191     __be16 vlan_tpid;
0192     __be16 vlan_tci;
0193 };
0194 
0195 struct nfp_fl_pop_vlan {
0196     struct nfp_fl_act_head head;
0197     __be16 reserved;
0198 };
0199 
0200 struct nfp_fl_pre_lag {
0201     struct nfp_fl_act_head head;
0202     __be16 group_id;
0203     u8 lag_version[3];
0204     u8 instance;
0205 };
0206 
0207 #define NFP_FL_PRE_LAG_VER_OFF  8
0208 
0209 struct nfp_fl_pre_tunnel {
0210     struct nfp_fl_act_head head;
0211     __be16 flags;
0212     union {
0213         __be32 ipv4_dst;
0214         struct in6_addr ipv6_dst;
0215     };
0216 };
0217 
0218 #define NFP_FL_PRE_TUN_IPV6 BIT(0)
0219 
0220 struct nfp_fl_set_tun {
0221     struct nfp_fl_act_head head;
0222     __be16 reserved;
0223     __be64 tun_id __packed;
0224     __be32 tun_type_index;
0225     __be16 tun_flags;
0226     u8 ttl;
0227     u8 tos;
0228     __be16 outer_vlan_tpid;
0229     __be16 outer_vlan_tci;
0230     u8 tun_len;
0231     u8 res2;
0232     __be16 tun_proto;
0233 };
0234 
0235 struct nfp_fl_push_geneve {
0236     struct nfp_fl_act_head head;
0237     __be16 reserved;
0238     __be16 class;
0239     u8 type;
0240     u8 length;
0241     u8 opt_data[];
0242 };
0243 
0244 struct nfp_fl_push_mpls {
0245     struct nfp_fl_act_head head;
0246     __be16 ethtype;
0247     __be32 lse;
0248 };
0249 
0250 struct nfp_fl_pop_mpls {
0251     struct nfp_fl_act_head head;
0252     __be16 ethtype;
0253 };
0254 
0255 struct nfp_fl_set_mpls {
0256     struct nfp_fl_act_head head;
0257     __be16 reserved;
0258     __be32 lse_mask;
0259     __be32 lse;
0260 };
0261 
0262 struct nfp_fl_meter {
0263     struct nfp_fl_act_head head;
0264     __be16 reserved;
0265     __be32 meter_id;
0266 };
0267 
0268 /* Metadata with L2 (1W/4B)
0269  * ----------------------------------------------------------------
0270  *    3                   2                   1
0271  *  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
0272  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0273  * |    key_type   |    mask_id    | PCP |p|   vlan outermost VID  |
0274  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0275  *                                 ^                               ^
0276  *                           NOTE: |             TCI               |
0277  *                                 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0278  */
0279 struct nfp_flower_meta_tci {
0280     u8 nfp_flow_key_layer;
0281     u8 mask_id;
0282     __be16 tci;
0283 };
0284 
0285 /* Extended metadata for additional key_layers (1W/4B)
0286  * ----------------------------------------------------------------
0287  *    3                   2                   1
0288  *  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
0289  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0290  * |                      nfp_flow_key_layer2                      |
0291  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0292  */
0293 struct nfp_flower_ext_meta {
0294     __be32 nfp_flow_key_layer2;
0295 };
0296 
0297 /* Port details (1W/4B)
0298  * ----------------------------------------------------------------
0299  *    3                   2                   1
0300  *  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
0301  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0302  * |                         port_ingress                          |
0303  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0304  */
0305 struct nfp_flower_in_port {
0306     __be32 in_port;
0307 };
0308 
0309 /* L2 details (4W/16B)
0310  *    3                   2                   1
0311  *  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
0312  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0313  * |                     mac_addr_dst, 31 - 0                      |
0314  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0315  * |      mac_addr_dst, 47 - 32    |     mac_addr_src, 15 - 0      |
0316  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0317  * |                     mac_addr_src, 47 - 16                     |
0318  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0319  * |       mpls outermost label            |  TC |B|   reserved  |q|
0320  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0321  */
0322 struct nfp_flower_mac_mpls {
0323     u8 mac_dst[6];
0324     u8 mac_src[6];
0325     __be32 mpls_lse;
0326 };
0327 
0328 /* VLAN details (2W/8B)
0329  *    3                   2                   1
0330  *  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
0331  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0332  * |           outer_tpid          |           outer_tci           |
0333  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0334  * |           inner_tpid          |           inner_tci           |
0335  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0336  */
0337 struct nfp_flower_vlan {
0338     __be16 outer_tpid;
0339     __be16 outer_tci;
0340     __be16 inner_tpid;
0341     __be16 inner_tci;
0342 };
0343 
0344 /* L4 ports (for UDP, TCP, SCTP) (1W/4B)
0345  *    3                   2                   1
0346  *  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
0347  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0348  * |            port_src           |           port_dst            |
0349  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0350  */
0351 struct nfp_flower_tp_ports {
0352     __be16 port_src;
0353     __be16 port_dst;
0354 };
0355 
0356 struct nfp_flower_ip_ext {
0357     u8 tos;
0358     u8 proto;
0359     u8 ttl;
0360     u8 flags;
0361 };
0362 
0363 /* L3 IPv4 details (3W/12B)
0364  *    3                   2                   1
0365  *  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
0366  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0367  * |    DSCP   |ECN|   protocol    |      ttl      |     flags     |
0368  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0369  * |                        ipv4_addr_src                          |
0370  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0371  * |                        ipv4_addr_dst                          |
0372  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0373  */
0374 struct nfp_flower_ipv4 {
0375     struct nfp_flower_ip_ext ip_ext;
0376     __be32 ipv4_src;
0377     __be32 ipv4_dst;
0378 };
0379 
0380 /* L3 IPv6 details (10W/40B)
0381  *    3                   2                   1
0382  *  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
0383  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0384  * |    DSCP   |ECN|   protocol    |      ttl      |     flags     |
0385  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0386  * |   ipv6_exthdr   | res |            ipv6_flow_label            |
0387  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0388  * |                  ipv6_addr_src,   31 - 0                      |
0389  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0390  * |                  ipv6_addr_src,  63 - 32                      |
0391  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0392  * |                  ipv6_addr_src,  95 - 64                      |
0393  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0394  * |                  ipv6_addr_src, 127 - 96                      |
0395  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0396  * |                  ipv6_addr_dst,   31 - 0                      |
0397  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0398  * |                  ipv6_addr_dst,  63 - 32                      |
0399  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0400  * |                  ipv6_addr_dst,  95 - 64                      |
0401  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0402  * |                  ipv6_addr_dst, 127 - 96                      |
0403  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0404  */
0405 struct nfp_flower_ipv6 {
0406     struct nfp_flower_ip_ext ip_ext;
0407     __be32 ipv6_flow_label_exthdr;
0408     struct in6_addr ipv6_src;
0409     struct in6_addr ipv6_dst;
0410 };
0411 
0412 struct nfp_flower_tun_ipv4 {
0413     __be32 src;
0414     __be32 dst;
0415 };
0416 
0417 struct nfp_flower_tun_ipv6 {
0418     struct in6_addr src;
0419     struct in6_addr dst;
0420 };
0421 
0422 struct nfp_flower_tun_ip_ext {
0423     u8 tos;
0424     u8 ttl;
0425 };
0426 
0427 /* Flow Frame IPv4 UDP TUNNEL --> Tunnel details (4W/16B)
0428  * -----------------------------------------------------------------
0429  *    3                   2                   1
0430  *  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
0431  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0432  * |                         ipv4_addr_src                         |
0433  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0434  * |                         ipv4_addr_dst                         |
0435  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0436  * |           Reserved            |      tos      |      ttl      |
0437  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0438  * |                            Reserved                           |
0439  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0440  * |                     VNI                       |   Reserved    |
0441  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0442  */
0443 struct nfp_flower_ipv4_udp_tun {
0444     struct nfp_flower_tun_ipv4 ipv4;
0445     __be16 reserved1;
0446     struct nfp_flower_tun_ip_ext ip_ext;
0447     __be32 reserved2;
0448     __be32 tun_id;
0449 };
0450 
0451 /* Flow Frame IPv6 UDP TUNNEL --> Tunnel details (11W/44B)
0452  * -----------------------------------------------------------------
0453  *    3                   2                   1
0454  *  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
0455  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0456  * |                  ipv6_addr_src,   31 - 0                      |
0457  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0458  * |                  ipv6_addr_src,  63 - 32                      |
0459  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0460  * |                  ipv6_addr_src,  95 - 64                      |
0461  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0462  * |                  ipv6_addr_src, 127 - 96                      |
0463  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0464  * |                  ipv6_addr_dst,   31 - 0                      |
0465  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0466  * |                  ipv6_addr_dst,  63 - 32                      |
0467  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0468  * |                  ipv6_addr_dst,  95 - 64                      |
0469  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0470  * |                  ipv6_addr_dst, 127 - 96                      |
0471  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0472  * |           Reserved            |      tos      |      ttl      |
0473  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0474  * |                            Reserved                           |
0475  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0476  * |                     VNI                       |   Reserved    |
0477  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0478  */
0479 struct nfp_flower_ipv6_udp_tun {
0480     struct nfp_flower_tun_ipv6 ipv6;
0481     __be16 reserved1;
0482     struct nfp_flower_tun_ip_ext ip_ext;
0483     __be32 reserved2;
0484     __be32 tun_id;
0485 };
0486 
0487 /* Flow Frame GRE TUNNEL --> Tunnel details (6W/24B)
0488  * -----------------------------------------------------------------
0489  *    3                   2                   1
0490  *  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
0491  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0492  * |                         ipv4_addr_src                         |
0493  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0494  * |                         ipv4_addr_dst                         |
0495  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0496  * |           tun_flags           |       tos     |       ttl     |
0497  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0498  * |            Reserved           |           Ethertype           |
0499  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0500  * |                              Key                              |
0501  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0502  * |                           Reserved                            |
0503  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0504  */
0505 
0506 struct nfp_flower_ipv4_gre_tun {
0507     struct nfp_flower_tun_ipv4 ipv4;
0508     __be16 tun_flags;
0509     struct nfp_flower_tun_ip_ext ip_ext;
0510     __be16 reserved1;
0511     __be16 ethertype;
0512     __be32 tun_key;
0513     __be32 reserved2;
0514 };
0515 
0516 /* Flow Frame GRE TUNNEL V6 --> Tunnel details (12W/48B)
0517  * -----------------------------------------------------------------
0518  *    3                   2                   1
0519  *  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
0520  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0521  * |                  ipv6_addr_src,   31 - 0                      |
0522  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0523  * |                  ipv6_addr_src,  63 - 32                      |
0524  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0525  * |                  ipv6_addr_src,  95 - 64                      |
0526  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0527  * |                  ipv6_addr_src, 127 - 96                      |
0528  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0529  * |                  ipv6_addr_dst,   31 - 0                      |
0530  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0531  * |                  ipv6_addr_dst,  63 - 32                      |
0532  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0533  * |                  ipv6_addr_dst,  95 - 64                      |
0534  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0535  * |                  ipv6_addr_dst, 127 - 96                      |
0536  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0537  * |           tun_flags           |       tos     |       ttl     |
0538  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0539  * |            Reserved           |           Ethertype           |
0540  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0541  * |                              Key                              |
0542  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0543  * |                           Reserved                            |
0544  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0545  */
0546 struct nfp_flower_ipv6_gre_tun {
0547     struct nfp_flower_tun_ipv6 ipv6;
0548     __be16 tun_flags;
0549     struct nfp_flower_tun_ip_ext ip_ext;
0550     __be16 reserved1;
0551     __be16 ethertype;
0552     __be32 tun_key;
0553     __be32 reserved2;
0554 };
0555 
0556 struct nfp_flower_geneve_options {
0557     u8 data[NFP_FL_MAX_GENEVE_OPT_KEY];
0558 };
0559 
0560 #define NFP_FL_TUN_VNI_OFFSET 8
0561 
0562 /* The base header for a control message packet.
0563  * Defines an 8-bit version, and an 8-bit type, padded
0564  * to a 32-bit word. Rest of the packet is type-specific.
0565  */
0566 struct nfp_flower_cmsg_hdr {
0567     __be16 pad;
0568     u8 type;
0569     u8 version;
0570 };
0571 
0572 #define NFP_FLOWER_CMSG_HLEN        sizeof(struct nfp_flower_cmsg_hdr)
0573 #define NFP_FLOWER_CMSG_VER1        1
0574 
0575 /* Types defined for port related control messages  */
0576 enum nfp_flower_cmsg_type_port {
0577     NFP_FLOWER_CMSG_TYPE_FLOW_ADD =     0,
0578     NFP_FLOWER_CMSG_TYPE_FLOW_MOD =     1,
0579     NFP_FLOWER_CMSG_TYPE_FLOW_DEL =     2,
0580     NFP_FLOWER_CMSG_TYPE_LAG_CONFIG =   4,
0581     NFP_FLOWER_CMSG_TYPE_PORT_REIFY =   6,
0582     NFP_FLOWER_CMSG_TYPE_MAC_REPR =     7,
0583     NFP_FLOWER_CMSG_TYPE_PORT_MOD =     8,
0584     NFP_FLOWER_CMSG_TYPE_MERGE_HINT =   9,
0585     NFP_FLOWER_CMSG_TYPE_NO_NEIGH =     10,
0586     NFP_FLOWER_CMSG_TYPE_TUN_MAC =      11,
0587     NFP_FLOWER_CMSG_TYPE_ACTIVE_TUNS =  12,
0588     NFP_FLOWER_CMSG_TYPE_TUN_NEIGH =    13,
0589     NFP_FLOWER_CMSG_TYPE_TUN_IPS =      14,
0590     NFP_FLOWER_CMSG_TYPE_FLOW_STATS =   15,
0591     NFP_FLOWER_CMSG_TYPE_PORT_ECHO =    16,
0592     NFP_FLOWER_CMSG_TYPE_QOS_MOD =      18,
0593     NFP_FLOWER_CMSG_TYPE_QOS_DEL =      19,
0594     NFP_FLOWER_CMSG_TYPE_QOS_STATS =    20,
0595     NFP_FLOWER_CMSG_TYPE_PRE_TUN_RULE = 21,
0596     NFP_FLOWER_CMSG_TYPE_TUN_IPS_V6 =   22,
0597     NFP_FLOWER_CMSG_TYPE_NO_NEIGH_V6 =  23,
0598     NFP_FLOWER_CMSG_TYPE_TUN_NEIGH_V6 = 24,
0599     NFP_FLOWER_CMSG_TYPE_ACTIVE_TUNS_V6 =   25,
0600     NFP_FLOWER_CMSG_TYPE_MAX =      32,
0601 };
0602 
0603 /* NFP_FLOWER_CMSG_TYPE_MAC_REPR */
0604 struct nfp_flower_cmsg_mac_repr {
0605     u8 reserved[3];
0606     u8 num_ports;
0607     struct {
0608         u8 idx;
0609         u8 info;
0610         u8 nbi_port;
0611         u8 phys_port;
0612     } ports[];
0613 };
0614 
0615 #define NFP_FLOWER_CMSG_MAC_REPR_NBI        GENMASK(1, 0)
0616 
0617 /* NFP_FLOWER_CMSG_TYPE_PORT_MOD */
0618 struct nfp_flower_cmsg_portmod {
0619     __be32 portnum;
0620     u8 reserved;
0621     u8 info;
0622     __be16 mtu;
0623 };
0624 
0625 #define NFP_FLOWER_CMSG_PORTMOD_INFO_LINK   BIT(0)
0626 #define NFP_FLOWER_CMSG_PORTMOD_MTU_CHANGE_ONLY BIT(1)
0627 
0628 /* NFP_FLOWER_CMSG_TYPE_PORT_REIFY */
0629 struct nfp_flower_cmsg_portreify {
0630     __be32 portnum;
0631     u16 reserved;
0632     __be16 info;
0633 };
0634 
0635 #define NFP_FLOWER_CMSG_PORTREIFY_INFO_EXIST    BIT(0)
0636 
0637 /* NFP_FLOWER_CMSG_TYPE_FLOW_MERGE_HINT */
0638 struct nfp_flower_cmsg_merge_hint {
0639     u8 reserved[3];
0640     u8 count;
0641     struct {
0642         __be32 host_ctx;
0643         __be64 host_cookie;
0644     } __packed flow[];
0645 };
0646 
0647 enum nfp_flower_cmsg_port_type {
0648     NFP_FLOWER_CMSG_PORT_TYPE_UNSPEC =  0x0,
0649     NFP_FLOWER_CMSG_PORT_TYPE_PHYS_PORT =   0x1,
0650     NFP_FLOWER_CMSG_PORT_TYPE_PCIE_PORT =   0x2,
0651     NFP_FLOWER_CMSG_PORT_TYPE_OTHER_PORT =  0x3,
0652 };
0653 
0654 enum nfp_flower_cmsg_port_vnic_type {
0655     NFP_FLOWER_CMSG_PORT_VNIC_TYPE_VF = 0x0,
0656     NFP_FLOWER_CMSG_PORT_VNIC_TYPE_PF = 0x1,
0657     NFP_FLOWER_CMSG_PORT_VNIC_TYPE_CTRL =   0x2,
0658 };
0659 
0660 #define NFP_FLOWER_CMSG_PORT_TYPE       GENMASK(31, 28)
0661 #define NFP_FLOWER_CMSG_PORT_SYS_ID     GENMASK(27, 24)
0662 #define NFP_FLOWER_CMSG_PORT_NFP_ID     GENMASK(23, 22)
0663 #define NFP_FLOWER_CMSG_PORT_PCI        GENMASK(15, 14)
0664 #define NFP_FLOWER_CMSG_PORT_VNIC_TYPE      GENMASK(13, 12)
0665 #define NFP_FLOWER_CMSG_PORT_VNIC       GENMASK(11, 6)
0666 #define NFP_FLOWER_CMSG_PORT_PCIE_Q     GENMASK(5, 0)
0667 #define NFP_FLOWER_CMSG_PORT_PHYS_PORT_NUM  GENMASK(7, 0)
0668 
0669 static inline u32 nfp_flower_internal_port_get_port_id(u8 internal_port)
0670 {
0671     return FIELD_PREP(NFP_FLOWER_CMSG_PORT_PHYS_PORT_NUM, internal_port) |
0672         FIELD_PREP(NFP_FLOWER_CMSG_PORT_TYPE,
0673                NFP_FLOWER_CMSG_PORT_TYPE_OTHER_PORT);
0674 }
0675 
0676 static inline u32 nfp_flower_cmsg_phys_port(u8 phys_port)
0677 {
0678     return FIELD_PREP(NFP_FLOWER_CMSG_PORT_PHYS_PORT_NUM, phys_port) |
0679         FIELD_PREP(NFP_FLOWER_CMSG_PORT_TYPE,
0680                NFP_FLOWER_CMSG_PORT_TYPE_PHYS_PORT);
0681 }
0682 
0683 static inline u32
0684 nfp_flower_cmsg_pcie_port(u8 nfp_pcie, enum nfp_flower_cmsg_port_vnic_type type,
0685               u8 vnic, u8 q)
0686 {
0687     return FIELD_PREP(NFP_FLOWER_CMSG_PORT_PCI, nfp_pcie) |
0688         FIELD_PREP(NFP_FLOWER_CMSG_PORT_VNIC_TYPE, type) |
0689         FIELD_PREP(NFP_FLOWER_CMSG_PORT_VNIC, vnic) |
0690         FIELD_PREP(NFP_FLOWER_CMSG_PORT_PCIE_Q, q) |
0691         FIELD_PREP(NFP_FLOWER_CMSG_PORT_TYPE,
0692                NFP_FLOWER_CMSG_PORT_TYPE_PCIE_PORT);
0693 }
0694 
0695 static inline void *nfp_flower_cmsg_get_data(struct sk_buff *skb)
0696 {
0697     return (unsigned char *)skb->data + NFP_FLOWER_CMSG_HLEN;
0698 }
0699 
0700 static inline int nfp_flower_cmsg_get_data_len(struct sk_buff *skb)
0701 {
0702     return skb->len - NFP_FLOWER_CMSG_HLEN;
0703 }
0704 
0705 static inline bool
0706 nfp_fl_netdev_is_tunnel_type(struct net_device *netdev,
0707                  enum nfp_flower_tun_type tun_type)
0708 {
0709     if (netif_is_vxlan(netdev))
0710         return tun_type == NFP_FL_TUNNEL_VXLAN;
0711     if (netif_is_gretap(netdev) || netif_is_ip6gretap(netdev))
0712         return tun_type == NFP_FL_TUNNEL_GRE;
0713     if (netif_is_geneve(netdev))
0714         return tun_type == NFP_FL_TUNNEL_GENEVE;
0715 
0716     return false;
0717 }
0718 
0719 static inline bool nfp_fl_is_netdev_to_offload(struct net_device *netdev)
0720 {
0721     if (!netdev->rtnl_link_ops)
0722         return false;
0723     if (!strcmp(netdev->rtnl_link_ops->kind, "openvswitch"))
0724         return true;
0725     if (netif_is_vxlan(netdev))
0726         return true;
0727     if (netif_is_geneve(netdev))
0728         return true;
0729     if (netif_is_gretap(netdev))
0730         return true;
0731     if (netif_is_ip6gretap(netdev))
0732         return true;
0733 
0734     return false;
0735 }
0736 
0737 struct sk_buff *
0738 nfp_flower_cmsg_mac_repr_start(struct nfp_app *app, unsigned int num_ports);
0739 void
0740 nfp_flower_cmsg_mac_repr_add(struct sk_buff *skb, unsigned int idx,
0741                  unsigned int nbi, unsigned int nbi_port,
0742                  unsigned int phys_port);
0743 int nfp_flower_cmsg_portmod(struct nfp_repr *repr, bool carrier_ok,
0744                 unsigned int mtu, bool mtu_only);
0745 int nfp_flower_cmsg_portreify(struct nfp_repr *repr, bool exists);
0746 void nfp_flower_cmsg_process_rx(struct work_struct *work);
0747 void nfp_flower_cmsg_rx(struct nfp_app *app, struct sk_buff *skb);
0748 struct sk_buff *
0749 nfp_flower_cmsg_alloc(struct nfp_app *app, unsigned int size,
0750               enum nfp_flower_cmsg_type_port type, gfp_t flag);
0751 
0752 #endif