dpdk/drivers/net/ngbe/ngbe_ptypes.c
<<
>>
Prefs
   1/* SPDX-License-Identifier: BSD-3-Clause
   2 * Copyright(c) 2018-2021 Beijing WangXun Technology Co., Ltd.
   3 */
   4
   5#include <rte_mbuf.h>
   6#include <rte_memory.h>
   7
   8#include "base/ngbe_type.h"
   9#include "ngbe_ptypes.h"
  10
  11/* The ngbe_ptype_lookup is used to convert from the 8-bit ptid in the
  12 * hardware to a bit-field that can be used by SW to more easily determine the
  13 * packet type.
  14 *
  15 * Macros are used to shorten the table lines and make this table human
  16 * readable.
  17 *
  18 * We store the PTYPE in the top byte of the bit field - this is just so that
  19 * we can check that the table doesn't have a row missing, as the index into
  20 * the table should be the PTYPE.
  21 */
  22#define TPTE(ptid, l2, l3, l4, tun, el2, el3, el4) \
  23        [ptid] = (RTE_PTYPE_L2_##l2 | \
  24                RTE_PTYPE_L3_##l3 | \
  25                RTE_PTYPE_L4_##l4 | \
  26                RTE_PTYPE_TUNNEL_##tun | \
  27                RTE_PTYPE_INNER_L2_##el2 | \
  28                RTE_PTYPE_INNER_L3_##el3 | \
  29                RTE_PTYPE_INNER_L4_##el4)
  30
  31#define RTE_PTYPE_L2_NONE               0
  32#define RTE_PTYPE_L3_NONE               0
  33#define RTE_PTYPE_L4_NONE               0
  34#define RTE_PTYPE_TUNNEL_NONE           0
  35#define RTE_PTYPE_INNER_L2_NONE         0
  36#define RTE_PTYPE_INNER_L3_NONE         0
  37#define RTE_PTYPE_INNER_L4_NONE         0
  38
  39static u32 ngbe_ptype_lookup[NGBE_PTID_MAX] __rte_cache_aligned = {
  40        /* L2:0-3 L3:4-7 L4:8-11 TUN:12-15 EL2:16-19 EL3:20-23 EL2:24-27 */
  41        /* L2: ETH */
  42        TPTE(0x10, ETHER,          NONE, NONE, NONE, NONE, NONE, NONE),
  43        TPTE(0x11, ETHER,          NONE, NONE, NONE, NONE, NONE, NONE),
  44        TPTE(0x12, ETHER_TIMESYNC, NONE, NONE, NONE, NONE, NONE, NONE),
  45        TPTE(0x13, ETHER_FIP,      NONE, NONE, NONE, NONE, NONE, NONE),
  46        TPTE(0x14, ETHER_LLDP,     NONE, NONE, NONE, NONE, NONE, NONE),
  47        TPTE(0x15, ETHER_CNM,      NONE, NONE, NONE, NONE, NONE, NONE),
  48        TPTE(0x16, ETHER_EAPOL,    NONE, NONE, NONE, NONE, NONE, NONE),
  49        TPTE(0x17, ETHER_ARP,      NONE, NONE, NONE, NONE, NONE, NONE),
  50        /* L2: Ethertype Filter */
  51        TPTE(0x18, ETHER_FILTER,   NONE, NONE, NONE, NONE, NONE, NONE),
  52        TPTE(0x19, ETHER_FILTER,   NONE, NONE, NONE, NONE, NONE, NONE),
  53        TPTE(0x1A, ETHER_FILTER,   NONE, NONE, NONE, NONE, NONE, NONE),
  54        TPTE(0x1B, ETHER_FILTER,   NONE, NONE, NONE, NONE, NONE, NONE),
  55        TPTE(0x1C, ETHER_FILTER,   NONE, NONE, NONE, NONE, NONE, NONE),
  56        TPTE(0x1D, ETHER_FILTER,   NONE, NONE, NONE, NONE, NONE, NONE),
  57        TPTE(0x1E, ETHER_FILTER,   NONE, NONE, NONE, NONE, NONE, NONE),
  58        TPTE(0x1F, ETHER_FILTER,   NONE, NONE, NONE, NONE, NONE, NONE),
  59        /* L3: IP */
  60        TPTE(0x20, ETHER, IPV4, NONFRAG, NONE, NONE, NONE, NONE),
  61        TPTE(0x21, ETHER, IPV4, FRAG,    NONE, NONE, NONE, NONE),
  62        TPTE(0x22, ETHER, IPV4, NONFRAG, NONE, NONE, NONE, NONE),
  63        TPTE(0x23, ETHER, IPV4, UDP,     NONE, NONE, NONE, NONE),
  64        TPTE(0x24, ETHER, IPV4, TCP,     NONE, NONE, NONE, NONE),
  65        TPTE(0x25, ETHER, IPV4, SCTP,    NONE, NONE, NONE, NONE),
  66        TPTE(0x29, ETHER, IPV6, FRAG,    NONE, NONE, NONE, NONE),
  67        TPTE(0x2A, ETHER, IPV6, NONFRAG, NONE, NONE, NONE, NONE),
  68        TPTE(0x2B, ETHER, IPV6, UDP,     NONE, NONE, NONE, NONE),
  69        TPTE(0x2C, ETHER, IPV6, TCP,     NONE, NONE, NONE, NONE),
  70        TPTE(0x2D, ETHER, IPV6, SCTP,    NONE, NONE, NONE, NONE),
  71        /* IPv4 -> IPv4/IPv6 */
  72        TPTE(0x81, ETHER, IPV4, NONE, IP, NONE, IPV4, FRAG),
  73        TPTE(0x82, ETHER, IPV4, NONE, IP, NONE, IPV4, NONFRAG),
  74        TPTE(0x83, ETHER, IPV4, NONE, IP, NONE, IPV4, UDP),
  75        TPTE(0x84, ETHER, IPV4, NONE, IP, NONE, IPV4, TCP),
  76        TPTE(0x85, ETHER, IPV4, NONE, IP, NONE, IPV4, SCTP),
  77        TPTE(0x89, ETHER, IPV4, NONE, IP, NONE, IPV6, FRAG),
  78        TPTE(0x8A, ETHER, IPV4, NONE, IP, NONE, IPV6, NONFRAG),
  79        TPTE(0x8B, ETHER, IPV4, NONE, IP, NONE, IPV6, UDP),
  80        TPTE(0x8C, ETHER, IPV4, NONE, IP, NONE, IPV6, TCP),
  81        TPTE(0x8D, ETHER, IPV4, NONE, IP, NONE, IPV6, SCTP),
  82        /* IPv6 -> IPv4/IPv6 */
  83        TPTE(0xC1, ETHER, IPV6, NONE, IP, NONE, IPV4, FRAG),
  84        TPTE(0xC2, ETHER, IPV6, NONE, IP, NONE, IPV4, NONFRAG),
  85        TPTE(0xC3, ETHER, IPV6, NONE, IP, NONE, IPV4, UDP),
  86        TPTE(0xC4, ETHER, IPV6, NONE, IP, NONE, IPV4, TCP),
  87        TPTE(0xC5, ETHER, IPV6, NONE, IP, NONE, IPV4, SCTP),
  88        TPTE(0xC9, ETHER, IPV6, NONE, IP, NONE, IPV6, FRAG),
  89        TPTE(0xCA, ETHER, IPV6, NONE, IP, NONE, IPV6, NONFRAG),
  90        TPTE(0xCB, ETHER, IPV6, NONE, IP, NONE, IPV6, UDP),
  91        TPTE(0xCC, ETHER, IPV6, NONE, IP, NONE, IPV6, TCP),
  92        TPTE(0xCD, ETHER, IPV6, NONE, IP, NONE, IPV6, SCTP),
  93};
  94
  95u32 *ngbe_get_supported_ptypes(void)
  96{
  97        static u32 ptypes[] = {
  98                /* For non-vec functions,
  99                 * refers to ngbe_rxd_pkt_info_to_pkt_type();
 100                 */
 101                RTE_PTYPE_L2_ETHER,
 102                RTE_PTYPE_L3_IPV4,
 103                RTE_PTYPE_L3_IPV4_EXT,
 104                RTE_PTYPE_L3_IPV6,
 105                RTE_PTYPE_L3_IPV6_EXT,
 106                RTE_PTYPE_L4_SCTP,
 107                RTE_PTYPE_L4_TCP,
 108                RTE_PTYPE_L4_UDP,
 109                RTE_PTYPE_TUNNEL_IP,
 110                RTE_PTYPE_INNER_L3_IPV6,
 111                RTE_PTYPE_INNER_L3_IPV6_EXT,
 112                RTE_PTYPE_INNER_L4_TCP,
 113                RTE_PTYPE_INNER_L4_UDP,
 114                RTE_PTYPE_UNKNOWN
 115        };
 116
 117        return ptypes;
 118}
 119
 120static inline u8
 121ngbe_encode_ptype_mac(u32 ptype)
 122{
 123        u8 ptid;
 124
 125        ptid = NGBE_PTID_PKT_MAC;
 126
 127        switch (ptype & RTE_PTYPE_L2_MASK) {
 128        case RTE_PTYPE_UNKNOWN:
 129                break;
 130        case RTE_PTYPE_L2_ETHER_TIMESYNC:
 131                ptid |= NGBE_PTID_TYP_TS;
 132                break;
 133        case RTE_PTYPE_L2_ETHER_ARP:
 134                ptid |= NGBE_PTID_TYP_ARP;
 135                break;
 136        case RTE_PTYPE_L2_ETHER_LLDP:
 137                ptid |= NGBE_PTID_TYP_LLDP;
 138                break;
 139        default:
 140                ptid |= NGBE_PTID_TYP_MAC;
 141                break;
 142        }
 143
 144        return ptid;
 145}
 146
 147static inline u8
 148ngbe_encode_ptype_ip(u32 ptype)
 149{
 150        u8 ptid;
 151
 152        ptid = NGBE_PTID_PKT_IP;
 153
 154        switch (ptype & RTE_PTYPE_L3_MASK) {
 155        case RTE_PTYPE_L3_IPV4:
 156        case RTE_PTYPE_L3_IPV4_EXT:
 157        case RTE_PTYPE_L3_IPV4_EXT_UNKNOWN:
 158                break;
 159        case RTE_PTYPE_L3_IPV6:
 160        case RTE_PTYPE_L3_IPV6_EXT:
 161        case RTE_PTYPE_L3_IPV6_EXT_UNKNOWN:
 162                ptid |= NGBE_PTID_PKT_IPV6;
 163                break;
 164        default:
 165                return ngbe_encode_ptype_mac(ptype);
 166        }
 167
 168        switch (ptype & RTE_PTYPE_L4_MASK) {
 169        case RTE_PTYPE_L4_TCP:
 170                ptid |= NGBE_PTID_TYP_TCP;
 171                break;
 172        case RTE_PTYPE_L4_UDP:
 173                ptid |= NGBE_PTID_TYP_UDP;
 174                break;
 175        case RTE_PTYPE_L4_SCTP:
 176                ptid |= NGBE_PTID_TYP_SCTP;
 177                break;
 178        case RTE_PTYPE_L4_FRAG:
 179                ptid |= NGBE_PTID_TYP_IPFRAG;
 180                break;
 181        default:
 182                ptid |= NGBE_PTID_TYP_IPDATA;
 183                break;
 184        }
 185
 186        return ptid;
 187}
 188
 189static inline u8
 190ngbe_encode_ptype_tunnel(u32 ptype)
 191{
 192        u8 ptid;
 193
 194        ptid = NGBE_PTID_PKT_TUN;
 195
 196        switch (ptype & RTE_PTYPE_L3_MASK) {
 197        case RTE_PTYPE_L3_IPV4:
 198        case RTE_PTYPE_L3_IPV4_EXT:
 199        case RTE_PTYPE_L3_IPV4_EXT_UNKNOWN:
 200                break;
 201        case RTE_PTYPE_L3_IPV6:
 202        case RTE_PTYPE_L3_IPV6_EXT:
 203        case RTE_PTYPE_L3_IPV6_EXT_UNKNOWN:
 204                ptid |= NGBE_PTID_TUN_IPV6;
 205                break;
 206        default:
 207                return ngbe_encode_ptype_ip(ptype);
 208        }
 209
 210        /* VXLAN/GRE/Teredo/VXLAN-GPE are not supported in EM */
 211        switch (ptype & RTE_PTYPE_TUNNEL_MASK) {
 212        case RTE_PTYPE_TUNNEL_IP:
 213                ptid |= NGBE_PTID_TUN_EI;
 214                break;
 215        case RTE_PTYPE_TUNNEL_GRE:
 216        case RTE_PTYPE_TUNNEL_VXLAN_GPE:
 217                ptid |= NGBE_PTID_TUN_EIG;
 218                break;
 219        case RTE_PTYPE_TUNNEL_VXLAN:
 220        case RTE_PTYPE_TUNNEL_NVGRE:
 221        case RTE_PTYPE_TUNNEL_GENEVE:
 222        case RTE_PTYPE_TUNNEL_GRENAT:
 223                break;
 224        default:
 225                return ptid;
 226        }
 227
 228        switch (ptype & RTE_PTYPE_INNER_L2_MASK) {
 229        case RTE_PTYPE_INNER_L2_ETHER:
 230                ptid |= NGBE_PTID_TUN_EIGM;
 231                break;
 232        case RTE_PTYPE_INNER_L2_ETHER_VLAN:
 233                ptid |= NGBE_PTID_TUN_EIGMV;
 234                break;
 235        case RTE_PTYPE_INNER_L2_ETHER_QINQ:
 236                ptid |= NGBE_PTID_TUN_EIGMV;
 237                break;
 238        default:
 239                break;
 240        }
 241
 242        switch (ptype & RTE_PTYPE_INNER_L3_MASK) {
 243        case RTE_PTYPE_INNER_L3_IPV4:
 244        case RTE_PTYPE_INNER_L3_IPV4_EXT:
 245        case RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN:
 246                break;
 247        case RTE_PTYPE_INNER_L3_IPV6:
 248        case RTE_PTYPE_INNER_L3_IPV6_EXT:
 249        case RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN:
 250                ptid |= NGBE_PTID_PKT_IPV6;
 251                break;
 252        default:
 253                return ptid;
 254        }
 255
 256        switch (ptype & RTE_PTYPE_INNER_L4_MASK) {
 257        case RTE_PTYPE_INNER_L4_TCP:
 258                ptid |= NGBE_PTID_TYP_TCP;
 259                break;
 260        case RTE_PTYPE_INNER_L4_UDP:
 261                ptid |= NGBE_PTID_TYP_UDP;
 262                break;
 263        case RTE_PTYPE_INNER_L4_SCTP:
 264                ptid |= NGBE_PTID_TYP_SCTP;
 265                break;
 266        case RTE_PTYPE_INNER_L4_FRAG:
 267                ptid |= NGBE_PTID_TYP_IPFRAG;
 268                break;
 269        default:
 270                ptid |= NGBE_PTID_TYP_IPDATA;
 271                break;
 272        }
 273
 274        return ptid;
 275}
 276
 277u32 ngbe_decode_ptype(u8 ptid)
 278{
 279        if (-1 != ngbe_etflt_id(ptid))
 280                return RTE_PTYPE_UNKNOWN;
 281
 282        return ngbe_ptype_lookup[ptid];
 283}
 284
 285u8 ngbe_encode_ptype(u32 ptype)
 286{
 287        u8 ptid = 0;
 288
 289        if (ptype & RTE_PTYPE_TUNNEL_MASK)
 290                ptid = ngbe_encode_ptype_tunnel(ptype);
 291        else if (ptype & RTE_PTYPE_L3_MASK)
 292                ptid = ngbe_encode_ptype_ip(ptype);
 293        else if (ptype & RTE_PTYPE_L2_MASK)
 294                ptid = ngbe_encode_ptype_mac(ptype);
 295        else
 296                ptid = NGBE_PTID_NULL;
 297
 298        return ptid;
 299}
 300