net/ngbe: support basic statistics
[dpdk.git] / drivers / net / ngbe / ngbe_ptypes.c
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
39 static 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
95 u32 *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
120 static inline u8
121 ngbe_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
147 static inline u8
148 ngbe_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
189 static inline u8
190 ngbe_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
277 u32 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
285 u8 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