1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright (c) 2014, 2015 Netronome Systems, Inc. 3 * All rights reserved. 4 */ 5 6 #ifndef __NFP_NET_META_H__ 7 #define __NFP_NET_META_H__ 8 9 #include "nfp_rxtx.h" 10 11 /* Hash type prepended when a RSS hash was computed */ 12 #define NFP_NET_META_RSS_NONE 0 13 #define NFP_NET_META_RSS_IPV4 1 14 #define NFP_NET_META_RSS_IPV6 2 15 #define NFP_NET_META_RSS_IPV6_EX 3 16 #define NFP_NET_META_RSS_IPV4_TCP 4 17 #define NFP_NET_META_RSS_IPV6_TCP 5 18 #define NFP_NET_META_RSS_IPV6_EX_TCP 6 19 #define NFP_NET_META_RSS_IPV4_UDP 7 20 #define NFP_NET_META_RSS_IPV6_UDP 8 21 #define NFP_NET_META_RSS_IPV6_EX_UDP 9 22 #define NFP_NET_META_RSS_IPV4_SCTP 10 23 #define NFP_NET_META_RSS_IPV6_SCTP 11 24 25 /* Offset in Freelist buffer where packet starts on RX */ 26 #define NFP_NET_RX_OFFSET 32 27 28 /* Working with metadata api (NFD version > 3.0) */ 29 #define NFP_NET_META_FIELD_SIZE 4 30 #define NFP_NET_META_FIELD_MASK ((1 << NFP_NET_META_FIELD_SIZE) - 1) 31 #define NFP_NET_META_HEADER_SIZE 4 32 #define NFP_NET_META_NFDK_LENGTH 8 33 34 /* Working with metadata vlan api (NFD version >= 2.0) */ 35 #define NFP_NET_META_VLAN_INFO 16 36 #define NFP_NET_META_VLAN_OFFLOAD 31 37 #define NFP_NET_META_VLAN_TPID 3 38 #define NFP_NET_META_VLAN_MASK ((1 << NFP_NET_META_VLAN_INFO) - 1) 39 #define NFP_NET_META_VLAN_TPID_MASK ((1 << NFP_NET_META_VLAN_TPID) - 1) 40 #define NFP_NET_META_TPID(d) (((d) >> NFP_NET_META_VLAN_INFO) & \ 41 NFP_NET_META_VLAN_TPID_MASK) 42 43 /* Prepend field types */ 44 #define NFP_NET_META_HASH 1 /* Next field carries hash type */ 45 #define NFP_NET_META_MARK 2 46 #define NFP_NET_META_VLAN 4 47 #define NFP_NET_META_PORTID 5 48 #define NFP_NET_META_IPSEC 9 49 50 #define NFP_NET_META_PORT_ID_CTRL ~0U 51 52 #define NFP_DESC_META_LEN(d) ((d)->rxd.meta_len_dd & PCIE_DESC_RX_META_LEN_MASK) 53 54 /* Maximum number of NFP packet metadata fields. */ 55 #define NFP_NET_META_MAX_FIELDS 8 56 57 /* Maximum number of supported VLANs in parsed form packet metadata. */ 58 #define NFP_NET_META_MAX_VLANS 2 59 60 enum nfp_net_meta_format { 61 NFP_NET_METAFORMAT_SINGLE, 62 NFP_NET_METAFORMAT_CHAINED, 63 }; 64 65 /* Describe the raw metadata format. */ 66 struct nfp_net_meta_raw { 67 uint32_t header; /**< Field type header (see format in nfp.rst) */ 68 uint32_t data[NFP_NET_META_MAX_FIELDS]; /**< Array of each fields data member */ 69 uint8_t length; /**< Number of valid fields in @header */ 70 }; 71 72 /* Record metadata parsed from packet */ 73 struct nfp_net_meta_parsed { 74 uint32_t port_id; /**< Port id value */ 75 uint32_t sa_idx; /**< IPsec SA index */ 76 uint32_t hash; /**< RSS hash value */ 77 uint32_t mark_id; /**< Mark id value */ 78 uint16_t flags; /**< Bitmap to indicate if meta exist */ 79 uint8_t hash_type; /**< RSS hash type */ 80 uint8_t vlan_layer; /**< The valid number of value in @vlan[] */ 81 /** 82 * Holds information parses from NFP_NET_META_VLAN. 83 * The inner most vlan starts at position 0 84 */ 85 struct { 86 uint8_t offload; /**< Flag indicates whether VLAN is offloaded */ 87 uint8_t tpid; /**< Vlan TPID */ 88 uint16_t tci; /**< Vlan TCI (PCP + Priority + VID) */ 89 } vlan[NFP_NET_META_MAX_VLANS]; 90 }; 91 92 struct nfp_pf_dev; 93 94 void nfp_net_meta_init_format(struct nfp_net_hw *hw, 95 struct nfp_pf_dev *pf_dev); 96 void nfp_net_meta_parse(struct nfp_net_rx_desc *rxds, 97 struct nfp_net_rxq *rxq, 98 struct nfp_net_hw *hw, 99 struct rte_mbuf *mb, 100 struct nfp_net_meta_parsed *meta); 101 void nfp_net_meta_set_vlan(struct nfp_net_meta_raw *meta_data, 102 struct rte_mbuf *pkt, 103 uint8_t layer); 104 void nfp_net_meta_set_ipsec(struct nfp_net_meta_raw *meta_data, 105 struct nfp_net_txq *txq, 106 struct rte_mbuf *pkt, 107 uint8_t layer, 108 uint8_t ipsec_layer); 109 110 #endif /* __NFP_NET_META_H__ */ 111