dpdk/drivers/net/ice/base/ice_protocol_type.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: BSD-3-Clause
   2 * Copyright(c) 2001-2021 Intel Corporation
   3 */
   4
   5#ifndef _ICE_PROTOCOL_TYPE_H_
   6#define _ICE_PROTOCOL_TYPE_H_
   7#include "ice_flex_type.h"
   8#define ICE_IPV6_ADDR_LENGTH 16
   9
  10/* Each recipe can match up to 5 different fields. Fields to match can be meta-
  11 * data, values extracted from packet headers, or results from other recipes.
  12 * One of the 5 fields is reserved for matching the switch ID. So, up to 4
  13 * recipes can provide intermediate results to another one through chaining,
  14 * e.g. recipes 0, 1, 2, and 3 can provide intermediate results to recipe 4.
  15 */
  16#define ICE_NUM_WORDS_RECIPE 4
  17
  18/* Max recipes that can be chained */
  19#define ICE_MAX_CHAIN_RECIPE 5
  20
  21/* 1 word reserved for switch ID from allowed 5 words.
  22 * So a recipe can have max 4 words. And you can chain 5 such recipes
  23 * together. So maximum words that can be programmed for look up is 5 * 4.
  24 */
  25#define ICE_MAX_CHAIN_WORDS (ICE_NUM_WORDS_RECIPE * ICE_MAX_CHAIN_RECIPE)
  26
  27/* Field vector index corresponding to chaining */
  28#define ICE_CHAIN_FV_INDEX_START 47
  29
  30enum ice_protocol_type {
  31        ICE_MAC_OFOS = 0,
  32        ICE_MAC_IL,
  33        ICE_ETYPE_OL,
  34        ICE_VLAN_OFOS,
  35        ICE_IPV4_OFOS,
  36        ICE_IPV4_IL,
  37        ICE_IPV6_OFOS,
  38        ICE_IPV6_IL,
  39        ICE_TCP_IL,
  40        ICE_UDP_OF,
  41        ICE_UDP_ILOS,
  42        ICE_SCTP_IL,
  43        ICE_VXLAN,
  44        ICE_GENEVE,
  45        ICE_VXLAN_GPE,
  46        ICE_NVGRE,
  47        ICE_GTP,
  48        ICE_PPPOE,
  49        ICE_PFCP,
  50        ICE_L2TPV3,
  51        ICE_ESP,
  52        ICE_AH,
  53        ICE_NAT_T,
  54        ICE_GTP_NO_PAY,
  55        ICE_VLAN_EX,
  56        ICE_VLAN_IN,
  57        ICE_FLG_DIR,
  58        ICE_PROTOCOL_LAST
  59};
  60
  61enum ice_sw_tunnel_type {
  62        ICE_NON_TUN = 0,
  63        ICE_SW_TUN_AND_NON_TUN,
  64        ICE_SW_TUN_VXLAN_GPE,
  65        ICE_SW_TUN_GENEVE,      /* GENEVE matches only non-VLAN pkts */
  66        ICE_SW_TUN_GENEVE_VLAN, /* GENEVE matches both VLAN and non-VLAN pkts */
  67        ICE_SW_TUN_VXLAN,       /* VXLAN matches only non-VLAN pkts */
  68        ICE_SW_TUN_VXLAN_VLAN,  /* VXLAN matches both VLAN and non-VLAN pkts */
  69        ICE_SW_TUN_NVGRE,
  70        ICE_SW_TUN_UDP, /* This means all "UDP" tunnel types: VXLAN-GPE, VXLAN
  71                         * and GENEVE
  72                         */
  73        ICE_SW_IPV4_TCP,
  74        ICE_SW_IPV4_UDP,
  75        ICE_SW_IPV6_TCP,
  76        ICE_SW_IPV6_UDP,
  77        ICE_SW_TUN_GTP,
  78        ICE_SW_TUN_IPV4_GTPU_NO_PAY,
  79        ICE_SW_TUN_IPV6_GTPU_NO_PAY,
  80        ICE_SW_TUN_IPV4_GTPU_EH_IPV4,
  81        ICE_SW_TUN_IPV4_GTPU_IPV4_UDP,
  82        ICE_SW_TUN_IPV4_GTPU_EH_IPV4_UDP,
  83        ICE_SW_TUN_IPV4_GTPU_IPV4_TCP,
  84        ICE_SW_TUN_IPV4_GTPU_EH_IPV4_TCP,
  85        ICE_SW_TUN_IPV4_GTPU_EH_IPV6,
  86        ICE_SW_TUN_IPV4_GTPU_IPV6_UDP,
  87        ICE_SW_TUN_IPV4_GTPU_EH_IPV6_UDP,
  88        ICE_SW_TUN_IPV4_GTPU_IPV6_TCP,
  89        ICE_SW_TUN_IPV4_GTPU_EH_IPV6_TCP,
  90        ICE_SW_TUN_IPV6_GTPU_EH_IPV4,
  91        ICE_SW_TUN_IPV6_GTPU_IPV4_UDP,
  92        ICE_SW_TUN_IPV6_GTPU_EH_IPV4_UDP,
  93        ICE_SW_TUN_IPV6_GTPU_IPV4_TCP,
  94        ICE_SW_TUN_IPV6_GTPU_EH_IPV4_TCP,
  95        ICE_SW_TUN_IPV6_GTPU_EH_IPV6,
  96        ICE_SW_TUN_IPV6_GTPU_IPV6_UDP,
  97        ICE_SW_TUN_IPV6_GTPU_EH_IPV6_UDP,
  98        ICE_SW_TUN_IPV6_GTPU_IPV6_TCP,
  99        ICE_SW_TUN_IPV6_GTPU_EH_IPV6_TCP,
 100        ICE_SW_TUN_PPPOE,
 101        ICE_SW_TUN_PPPOE_PAY,
 102        ICE_SW_TUN_PPPOE_IPV4,
 103        ICE_SW_TUN_PPPOE_IPV4_TCP,
 104        ICE_SW_TUN_PPPOE_IPV4_UDP,
 105        ICE_SW_TUN_PPPOE_IPV6,
 106        ICE_SW_TUN_PPPOE_IPV6_TCP,
 107        ICE_SW_TUN_PPPOE_IPV6_UDP,
 108        ICE_SW_TUN_IPV4_ESP,
 109        ICE_SW_TUN_IPV6_ESP,
 110        ICE_SW_TUN_IPV4_AH,
 111        ICE_SW_TUN_IPV6_AH,
 112        ICE_SW_TUN_IPV4_NAT_T,
 113        ICE_SW_TUN_IPV6_NAT_T,
 114        ICE_SW_TUN_IPV4_L2TPV3,
 115        ICE_SW_TUN_IPV6_L2TPV3,
 116        ICE_SW_TUN_PROFID_IPV6_ESP,
 117        ICE_SW_TUN_PROFID_IPV6_AH,
 118        ICE_SW_TUN_PROFID_MAC_IPV6_L2TPV3,
 119        ICE_SW_TUN_PROFID_IPV6_NAT_T,
 120        ICE_SW_TUN_PROFID_IPV4_PFCP_NODE,
 121        ICE_SW_TUN_PROFID_IPV4_PFCP_SESSION,
 122        ICE_SW_TUN_PROFID_IPV6_PFCP_NODE,
 123        ICE_SW_TUN_PROFID_IPV6_PFCP_SESSION,
 124        ICE_SW_TUN_AND_NON_TUN_QINQ,
 125        ICE_NON_TUN_QINQ,
 126        ICE_SW_TUN_PPPOE_QINQ,
 127        ICE_SW_TUN_PPPOE_PAY_QINQ,
 128        ICE_SW_TUN_PPPOE_IPV4_QINQ,
 129        ICE_SW_TUN_PPPOE_IPV6_QINQ,
 130        ICE_SW_TUN_IPV4_GTPU_IPV4,
 131        ICE_SW_TUN_IPV4_GTPU_IPV6,
 132        ICE_SW_TUN_IPV6_GTPU_IPV4,
 133        ICE_SW_TUN_IPV6_GTPU_IPV6,
 134        ICE_SW_TUN_GTP_IPV4,
 135        ICE_SW_TUN_GTP_IPV6,
 136        ICE_ALL_TUNNELS /* All tunnel types including NVGRE */
 137};
 138
 139/* Decoders for ice_prot_id:
 140 * - F: First
 141 * - I: Inner
 142 * - L: Last
 143 * - O: Outer
 144 * - S: Single
 145 */
 146enum ice_prot_id {
 147        ICE_PROT_ID_INVAL       = 0,
 148        ICE_PROT_MAC_OF_OR_S    = 1,
 149        ICE_PROT_MAC_O2         = 2,
 150        ICE_PROT_MAC_IL         = 4,
 151        ICE_PROT_MAC_IN_MAC     = 7,
 152        ICE_PROT_ETYPE_OL       = 9,
 153        ICE_PROT_ETYPE_IL       = 10,
 154        ICE_PROT_PAY            = 15,
 155        ICE_PROT_EVLAN_O        = 16,
 156        ICE_PROT_VLAN_O         = 17,
 157        ICE_PROT_VLAN_IF        = 18,
 158        ICE_PROT_MPLS_OL_MINUS_1 = 27,
 159        ICE_PROT_MPLS_OL_OR_OS  = 28,
 160        ICE_PROT_MPLS_IL        = 29,
 161        ICE_PROT_IPV4_OF_OR_S   = 32,
 162        ICE_PROT_IPV4_IL        = 33,
 163        ICE_PROT_IPV4_IL_IL     = 34,
 164        ICE_PROT_IPV6_OF_OR_S   = 40,
 165        ICE_PROT_IPV6_IL        = 41,
 166        ICE_PROT_IPV6_IL_IL     = 42,
 167        ICE_PROT_IPV6_NEXT_PROTO = 43,
 168        ICE_PROT_IPV6_FRAG      = 47,
 169        ICE_PROT_TCP_IL         = 49,
 170        ICE_PROT_UDP_OF         = 52,
 171        ICE_PROT_UDP_IL_OR_S    = 53,
 172        ICE_PROT_GRE_OF         = 64,
 173        ICE_PROT_NSH_F          = 84,
 174        ICE_PROT_ESP_F          = 88,
 175        ICE_PROT_ESP_2          = 89,
 176        ICE_PROT_SCTP_IL        = 96,
 177        ICE_PROT_ICMP_IL        = 98,
 178        ICE_PROT_ICMPV6_IL      = 100,
 179        ICE_PROT_VRRP_F         = 101,
 180        ICE_PROT_OSPF           = 102,
 181        ICE_PROT_PPPOE          = 103,
 182        ICE_PROT_L2TPV3         = 104,
 183        ICE_PROT_ECPRI          = 105,
 184        ICE_PROT_PPP            = 106,
 185        ICE_PROT_ATAOE_OF       = 114,
 186        ICE_PROT_CTRL_OF        = 116,
 187        ICE_PROT_LLDP_OF        = 117,
 188        ICE_PROT_ARP_OF         = 118,
 189        ICE_PROT_EAPOL_OF       = 120,
 190        ICE_PROT_META_ID        = 255, /* when offset == metaddata */
 191        ICE_PROT_INVALID        = 255  /* when offset == ICE_FV_OFFSET_INVAL */
 192};
 193
 194#define ICE_VNI_OFFSET          12 /* offset of VNI from ICE_PROT_UDP_OF */
 195
 196#define ICE_NAN_OFFSET          511
 197#define ICE_MAC_OFOS_HW         1
 198#define ICE_MAC_IL_HW           4
 199#define ICE_ETYPE_OL_HW         9
 200#define ICE_VLAN_OF_HW          16
 201#define ICE_VLAN_OL_HW          17
 202#define ICE_IPV4_OFOS_HW        32
 203#define ICE_IPV4_IL_HW          33
 204#define ICE_IPV6_OFOS_HW        40
 205#define ICE_IPV6_IL_HW          41
 206#define ICE_TCP_IL_HW           49
 207#define ICE_UDP_ILOS_HW         53
 208#define ICE_ESP_HW                      88
 209#define ICE_AH_HW                       89
 210#define ICE_SCTP_IL_HW          96
 211#define ICE_PPPOE_HW            103
 212#define ICE_L2TPV3_HW           104
 213
 214/* ICE_UDP_OF is used to identify all 3 tunnel types
 215 * VXLAN, GENEVE and VXLAN_GPE. To differentiate further
 216 * need to use flags from the field vector
 217 */
 218#define ICE_UDP_OF_HW   52 /* UDP Tunnels */
 219#define ICE_GRE_OF_HW   64 /* NVGRE */
 220#define ICE_META_DATA_ID_HW 255 /* this is used for tunnel type */
 221
 222#define ICE_MDID_SIZE 2
 223#define ICE_TUN_FLAG_MDID 20
 224#define ICE_TUN_FLAG_MDID_OFF(word)   (ICE_MDID_SIZE * (ICE_TUN_FLAG_MDID + (word)))
 225#define ICE_TUN_FLAG_MASK 0xFF
 226#define ICE_DIR_FLAG_MASK 0x10
 227#define ICE_TUN_FLAG_VLAN_MASK 0x01
 228#define ICE_TUN_FLAG_FV_IND 2
 229
 230#define ICE_PROTOCOL_MAX_ENTRIES 16
 231
 232/* Mapping of software defined protocol ID to hardware defined protocol ID */
 233struct ice_protocol_entry {
 234        enum ice_protocol_type type;
 235        u8 protocol_id;
 236};
 237
 238struct ice_ether_hdr {
 239        u8 dst_addr[ETH_ALEN];
 240        u8 src_addr[ETH_ALEN];
 241};
 242
 243struct ice_ethtype_hdr {
 244        __be16 ethtype_id;
 245};
 246
 247struct ice_ether_vlan_hdr {
 248        u8 dst_addr[ETH_ALEN];
 249        u8 src_addr[ETH_ALEN];
 250        __be32 vlan_id;
 251};
 252
 253struct ice_vlan_hdr {
 254        __be16 type;
 255        __be16 vlan;
 256};
 257
 258struct ice_ipv4_hdr {
 259        u8 version;
 260        u8 tos;
 261        __be16 total_length;
 262        __be16 id;
 263        __be16 frag_off;
 264        u8 time_to_live;
 265        u8 protocol;
 266        __be16 check;
 267        __be32 src_addr;
 268        __be32 dst_addr;
 269};
 270
 271struct ice_le_ver_tc_flow {
 272        union {
 273                struct {
 274                        u32 flow_label : 20;
 275                        u32 tc : 8;
 276                        u32 version : 4;
 277                } fld;
 278                u32 val;
 279        } u;
 280};
 281
 282struct ice_ipv6_hdr {
 283        __be32 be_ver_tc_flow;
 284        __be16 payload_len;
 285        u8 next_hdr;
 286        u8 hop_limit;
 287        u8 src_addr[ICE_IPV6_ADDR_LENGTH];
 288        u8 dst_addr[ICE_IPV6_ADDR_LENGTH];
 289};
 290
 291struct ice_sctp_hdr {
 292        __be16 src_port;
 293        __be16 dst_port;
 294        __be32 verification_tag;
 295        __be32 check;
 296};
 297
 298struct ice_l4_hdr {
 299        __be16 src_port;
 300        __be16 dst_port;
 301        __be16 len;
 302        __be16 check;
 303};
 304
 305struct ice_udp_tnl_hdr {
 306        __be16 field;
 307        __be16 proto_type;
 308        __be32 vni;     /* only use lower 24-bits */
 309};
 310
 311struct ice_udp_gtp_hdr {
 312        u8 flags;
 313        u8 msg_type;
 314        __be16 rsrvd_len;
 315        __be32 teid;
 316        __be16 rsrvd_seq_nbr;
 317        u8 rsrvd_n_pdu_nbr;
 318        u8 rsrvd_next_ext;
 319        u8 rsvrd_ext_len;
 320        u8 pdu_type;
 321        u8 qfi;
 322        u8 rsvrd;
 323};
 324
 325struct ice_pppoe_hdr {
 326        u8 rsrvd_ver_type;
 327        u8 rsrvd_code;
 328        __be16 session_id;
 329        __be16 length;
 330        __be16 ppp_prot_id; /* control and data only */
 331};
 332
 333struct ice_pfcp_hdr {
 334        u8 flags;
 335        u8 msg_type;
 336        __be16 length;
 337        __be64 seid;
 338        __be32 seq;
 339        u8 spare;
 340};
 341
 342struct ice_l2tpv3_sess_hdr {
 343        __be32 session_id;
 344        __be64 cookie;
 345};
 346
 347struct ice_esp_hdr {
 348        __be32 spi;
 349        __be32 seq;
 350};
 351
 352struct ice_ah_hdr {
 353        u8 next_hdr;
 354        u8 paylen;
 355        __be16 rsrvd;
 356        __be32 spi;
 357        __be32 seq;
 358};
 359
 360struct ice_nat_t_hdr {
 361        struct ice_esp_hdr esp;
 362};
 363
 364struct ice_nvgre {
 365        __be16 flags;
 366        __be16 protocol;
 367        __be32 tni_flow;
 368};
 369
 370union ice_prot_hdr {
 371        struct ice_ether_hdr eth_hdr;
 372        struct ice_ethtype_hdr ethertype;
 373        struct ice_vlan_hdr vlan_hdr;
 374        struct ice_ipv4_hdr ipv4_hdr;
 375        struct ice_ipv6_hdr ipv6_hdr;
 376        struct ice_l4_hdr l4_hdr;
 377        struct ice_sctp_hdr sctp_hdr;
 378        struct ice_udp_tnl_hdr tnl_hdr;
 379        struct ice_nvgre nvgre_hdr;
 380        struct ice_udp_gtp_hdr gtp_hdr;
 381        struct ice_pppoe_hdr pppoe_hdr;
 382        struct ice_pfcp_hdr pfcp_hdr;
 383        struct ice_l2tpv3_sess_hdr l2tpv3_sess_hdr;
 384        struct ice_esp_hdr esp_hdr;
 385        struct ice_ah_hdr ah_hdr;
 386        struct ice_nat_t_hdr nat_t_hdr;
 387};
 388
 389/* This is mapping table entry that maps every word within a given protocol
 390 * structure to the real byte offset as per the specification of that
 391 * protocol header.
 392 * for e.g. dst address is 3 words in ethertype header and corresponding bytes
 393 * are 0, 2, 3 in the actual packet header and src address is at 4, 6, 8
 394 */
 395struct ice_prot_ext_tbl_entry {
 396        enum ice_protocol_type prot_type;
 397        /* Byte offset into header of given protocol type */
 398        u8 offs[sizeof(union ice_prot_hdr)];
 399};
 400
 401/* Extractions to be looked up for a given recipe */
 402struct ice_prot_lkup_ext {
 403        u16 prot_type;
 404        u8 n_val_words;
 405        /* create a buffer to hold max words per recipe */
 406        u16 field_off[ICE_MAX_CHAIN_WORDS];
 407        u16 field_mask[ICE_MAX_CHAIN_WORDS];
 408
 409        struct ice_fv_word fv_words[ICE_MAX_CHAIN_WORDS];
 410
 411        /* Indicate field offsets that have field vector indices assigned */
 412        ice_declare_bitmap(done, ICE_MAX_CHAIN_WORDS);
 413};
 414
 415struct ice_pref_recipe_group {
 416        u8 n_val_pairs;         /* Number of valid pairs */
 417        struct ice_fv_word pairs[ICE_NUM_WORDS_RECIPE];
 418        u16 mask[ICE_NUM_WORDS_RECIPE];
 419};
 420
 421struct ice_recp_grp_entry {
 422        struct LIST_ENTRY_TYPE l_entry;
 423
 424#define ICE_INVAL_CHAIN_IND 0xFF
 425        u16 rid;
 426        u8 chain_idx;
 427        u8 fv_idx[ICE_NUM_WORDS_RECIPE];
 428        u16 fv_mask[ICE_NUM_WORDS_RECIPE];
 429        struct ice_pref_recipe_group r_group;
 430};
 431#endif /* _ICE_PROTOCOL_TYPE_H_ */
 432