xref: /dpdk/drivers/net/nfp/nfp_net_meta.h (revision 000feb4c417c9776236342e524d98e61e43e2f12)
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