linux/drivers/net/ethernet/intel/ice/ice_protocol_type.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/* Copyright (c) 2019, Intel Corporation. */
   3
   4#ifndef _ICE_PROTOCOL_TYPE_H_
   5#define _ICE_PROTOCOL_TYPE_H_
   6#define ICE_IPV6_ADDR_LENGTH 16
   7
   8/* Each recipe can match up to 5 different fields. Fields to match can be meta-
   9 * data, values extracted from packet headers, or results from other recipes.
  10 * One of the 5 fields is reserved for matching the switch ID. So, up to 4
  11 * recipes can provide intermediate results to another one through chaining,
  12 * e.g. recipes 0, 1, 2, and 3 can provide intermediate results to recipe 4.
  13 */
  14#define ICE_NUM_WORDS_RECIPE 4
  15
  16/* Max recipes that can be chained */
  17#define ICE_MAX_CHAIN_RECIPE 5
  18
  19/* 1 word reserved for switch ID from allowed 5 words.
  20 * So a recipe can have max 4 words. And you can chain 5 such recipes
  21 * together. So maximum words that can be programmed for look up is 5 * 4.
  22 */
  23#define ICE_MAX_CHAIN_WORDS (ICE_NUM_WORDS_RECIPE * ICE_MAX_CHAIN_RECIPE)
  24
  25/* Field vector index corresponding to chaining */
  26#define ICE_CHAIN_FV_INDEX_START 47
  27
  28enum ice_protocol_type {
  29        ICE_MAC_OFOS = 0,
  30        ICE_MAC_IL,
  31        ICE_ETYPE_OL,
  32        ICE_ETYPE_IL,
  33        ICE_VLAN_OFOS,
  34        ICE_IPV4_OFOS,
  35        ICE_IPV4_IL,
  36        ICE_IPV6_OFOS,
  37        ICE_IPV6_IL,
  38        ICE_TCP_IL,
  39        ICE_UDP_OF,
  40        ICE_UDP_ILOS,
  41        ICE_VXLAN,
  42        ICE_GENEVE,
  43        ICE_NVGRE,
  44        ICE_GTP,
  45        ICE_GTP_NO_PAY,
  46        ICE_VXLAN_GPE,
  47        ICE_SCTP_IL,
  48        ICE_PROTOCOL_LAST
  49};
  50
  51enum ice_sw_tunnel_type {
  52        ICE_NON_TUN = 0,
  53        ICE_SW_TUN_AND_NON_TUN,
  54        ICE_SW_TUN_VXLAN,
  55        ICE_SW_TUN_GENEVE,
  56        ICE_SW_TUN_NVGRE,
  57        ICE_SW_TUN_GTPU,
  58        ICE_SW_TUN_GTPC,
  59        ICE_ALL_TUNNELS /* All tunnel types including NVGRE */
  60};
  61
  62/* Decoders for ice_prot_id:
  63 * - F: First
  64 * - I: Inner
  65 * - L: Last
  66 * - O: Outer
  67 * - S: Single
  68 */
  69enum ice_prot_id {
  70        ICE_PROT_ID_INVAL       = 0,
  71        ICE_PROT_MAC_OF_OR_S    = 1,
  72        ICE_PROT_MAC_IL         = 4,
  73        ICE_PROT_ETYPE_OL       = 9,
  74        ICE_PROT_ETYPE_IL       = 10,
  75        ICE_PROT_IPV4_OF_OR_S   = 32,
  76        ICE_PROT_IPV4_IL        = 33,
  77        ICE_PROT_IPV6_OF_OR_S   = 40,
  78        ICE_PROT_IPV6_IL        = 41,
  79        ICE_PROT_TCP_IL         = 49,
  80        ICE_PROT_UDP_OF         = 52,
  81        ICE_PROT_UDP_IL_OR_S    = 53,
  82        ICE_PROT_GRE_OF         = 64,
  83        ICE_PROT_ESP_F          = 88,
  84        ICE_PROT_ESP_2          = 89,
  85        ICE_PROT_SCTP_IL        = 96,
  86        ICE_PROT_ICMP_IL        = 98,
  87        ICE_PROT_ICMPV6_IL      = 100,
  88        ICE_PROT_PPPOE          = 103,
  89        ICE_PROT_L2TPV3         = 104,
  90        ICE_PROT_ARP_OF         = 118,
  91        ICE_PROT_META_ID        = 255, /* when offset == metadata */
  92        ICE_PROT_INVALID        = 255  /* when offset == ICE_FV_OFFSET_INVAL */
  93};
  94
  95#define ICE_VNI_OFFSET          12 /* offset of VNI from ICE_PROT_UDP_OF */
  96
  97#define ICE_MAC_OFOS_HW         1
  98#define ICE_MAC_IL_HW           4
  99#define ICE_ETYPE_OL_HW         9
 100#define ICE_ETYPE_IL_HW         10
 101#define ICE_VLAN_OF_HW          16
 102#define ICE_VLAN_OL_HW          17
 103#define ICE_IPV4_OFOS_HW        32
 104#define ICE_IPV4_IL_HW          33
 105#define ICE_IPV6_OFOS_HW        40
 106#define ICE_IPV6_IL_HW          41
 107#define ICE_TCP_IL_HW           49
 108#define ICE_UDP_ILOS_HW         53
 109#define ICE_GRE_OF_HW           64
 110
 111#define ICE_UDP_OF_HW   52 /* UDP Tunnels */
 112#define ICE_META_DATA_ID_HW 255 /* this is used for tunnel type */
 113
 114#define ICE_MDID_SIZE 2
 115#define ICE_TUN_FLAG_MDID 21
 116#define ICE_TUN_FLAG_MDID_OFF (ICE_MDID_SIZE * ICE_TUN_FLAG_MDID)
 117#define ICE_TUN_FLAG_MASK 0xFF
 118
 119#define ICE_TUN_FLAG_FV_IND 2
 120
 121/* Mapping of software defined protocol ID to hardware defined protocol ID */
 122struct ice_protocol_entry {
 123        enum ice_protocol_type type;
 124        u8 protocol_id;
 125};
 126
 127struct ice_ether_hdr {
 128        u8 dst_addr[ETH_ALEN];
 129        u8 src_addr[ETH_ALEN];
 130};
 131
 132struct ice_ethtype_hdr {
 133        __be16 ethtype_id;
 134};
 135
 136struct ice_ether_vlan_hdr {
 137        u8 dst_addr[ETH_ALEN];
 138        u8 src_addr[ETH_ALEN];
 139        __be32 vlan_id;
 140};
 141
 142struct ice_vlan_hdr {
 143        __be16 type;
 144        __be16 vlan;
 145};
 146
 147struct ice_ipv4_hdr {
 148        u8 version;
 149        u8 tos;
 150        __be16 total_length;
 151        __be16 id;
 152        __be16 frag_off;
 153        u8 time_to_live;
 154        u8 protocol;
 155        __be16 check;
 156        __be32 src_addr;
 157        __be32 dst_addr;
 158};
 159
 160struct ice_ipv6_hdr {
 161        __be32 be_ver_tc_flow;
 162        __be16 payload_len;
 163        u8 next_hdr;
 164        u8 hop_limit;
 165        u8 src_addr[ICE_IPV6_ADDR_LENGTH];
 166        u8 dst_addr[ICE_IPV6_ADDR_LENGTH];
 167};
 168
 169struct ice_sctp_hdr {
 170        __be16 src_port;
 171        __be16 dst_port;
 172        __be32 verification_tag;
 173        __be32 check;
 174};
 175
 176struct ice_l4_hdr {
 177        __be16 src_port;
 178        __be16 dst_port;
 179        __be16 len;
 180        __be16 check;
 181};
 182
 183struct ice_udp_tnl_hdr {
 184        __be16 field;
 185        __be16 proto_type;
 186        __be32 vni;     /* only use lower 24-bits */
 187};
 188
 189struct ice_udp_gtp_hdr {
 190        u8 flags;
 191        u8 msg_type;
 192        __be16 rsrvd_len;
 193        __be32 teid;
 194        __be16 rsrvd_seq_nbr;
 195        u8 rsrvd_n_pdu_nbr;
 196        u8 rsrvd_next_ext;
 197        u8 rsvrd_ext_len;
 198        u8 pdu_type;
 199        u8 qfi;
 200        u8 rsvrd;
 201};
 202
 203struct ice_nvgre_hdr {
 204        __be16 flags;
 205        __be16 protocol;
 206        __be32 tni_flow;
 207};
 208
 209union ice_prot_hdr {
 210        struct ice_ether_hdr eth_hdr;
 211        struct ice_ethtype_hdr ethertype;
 212        struct ice_vlan_hdr vlan_hdr;
 213        struct ice_ipv4_hdr ipv4_hdr;
 214        struct ice_ipv6_hdr ipv6_hdr;
 215        struct ice_l4_hdr l4_hdr;
 216        struct ice_sctp_hdr sctp_hdr;
 217        struct ice_udp_tnl_hdr tnl_hdr;
 218        struct ice_nvgre_hdr nvgre_hdr;
 219        struct ice_udp_gtp_hdr gtp_hdr;
 220};
 221
 222/* This is mapping table entry that maps every word within a given protocol
 223 * structure to the real byte offset as per the specification of that
 224 * protocol header.
 225 * for e.g. dst address is 3 words in ethertype header and corresponding bytes
 226 * are 0, 2, 3 in the actual packet header and src address is at 4, 6, 8
 227 */
 228struct ice_prot_ext_tbl_entry {
 229        enum ice_protocol_type prot_type;
 230        /* Byte offset into header of given protocol type */
 231        u8 offs[sizeof(union ice_prot_hdr)];
 232};
 233
 234/* Extractions to be looked up for a given recipe */
 235struct ice_prot_lkup_ext {
 236        u16 prot_type;
 237        u8 n_val_words;
 238        /* create a buffer to hold max words per recipe */
 239        u16 field_off[ICE_MAX_CHAIN_WORDS];
 240        u16 field_mask[ICE_MAX_CHAIN_WORDS];
 241
 242        struct ice_fv_word fv_words[ICE_MAX_CHAIN_WORDS];
 243
 244        /* Indicate field offsets that have field vector indices assigned */
 245        DECLARE_BITMAP(done, ICE_MAX_CHAIN_WORDS);
 246};
 247
 248struct ice_pref_recipe_group {
 249        u8 n_val_pairs;         /* Number of valid pairs */
 250        struct ice_fv_word pairs[ICE_NUM_WORDS_RECIPE];
 251        u16 mask[ICE_NUM_WORDS_RECIPE];
 252};
 253
 254struct ice_recp_grp_entry {
 255        struct list_head l_entry;
 256
 257#define ICE_INVAL_CHAIN_IND 0xFF
 258        u16 rid;
 259        u8 chain_idx;
 260        u16 fv_idx[ICE_NUM_WORDS_RECIPE];
 261        u16 fv_mask[ICE_NUM_WORDS_RECIPE];
 262        struct ice_pref_recipe_group r_group;
 263};
 264#endif /* _ICE_PROTOCOL_TYPE_H_ */
 265