717c2130b899a237a6c1993d620e24cd7c004a22
[dpdk.git] / drivers / net / ice / rte_pmd_ice.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2019 Intel Corporation
3  */
4
5 #ifndef _RTE_PMD_ICE_H_
6 #define _RTE_PMD_ICE_H_
7
8 #include <stdio.h>
9 #include <rte_mbuf.h>
10 #include <rte_mbuf_dyn.h>
11
12 #ifdef __cplusplus
13 extern "C" {
14 #endif
15
16 union rte_net_ice_proto_xtr_metadata {
17         uint32_t metadata;
18
19         struct {
20                 uint16_t data0;
21                 uint16_t data1;
22         } raw;
23
24         struct {
25                 uint16_t stag_vid:12,
26                          stag_dei:1,
27                          stag_pcp:3;
28                 uint16_t ctag_vid:12,
29                          ctag_dei:1,
30                          ctag_pcp:3;
31         } vlan;
32
33         struct {
34                 uint16_t protocol:8,
35                          ttl:8;
36                 uint16_t tos:8,
37                          ihl:4,
38                          version:4;
39         } ipv4;
40
41         struct {
42                 uint16_t hoplimit:8,
43                          nexthdr:8;
44                 uint16_t flowhi4:4,
45                          tc:8,
46                          version:4;
47         } ipv6;
48
49         struct {
50                 uint16_t flowlo16;
51                 uint16_t flowhi4:4,
52                          tc:8,
53                          version:4;
54         } ipv6_flow;
55
56         struct {
57                 uint16_t fin:1,
58                          syn:1,
59                          rst:1,
60                          psh:1,
61                          ack:1,
62                          urg:1,
63                          ece:1,
64                          cwr:1,
65                          res1:4,
66                          doff:4;
67                 uint16_t rsvd;
68         } tcp;
69 };
70
71 /* Offset of mbuf dynamic field for protocol extraction data */
72 extern int rte_net_ice_dynfield_proto_xtr_metadata_offs;
73
74 /* Mask of mbuf dynamic flags for protocol extraction type */
75 extern uint64_t rte_net_ice_dynflag_proto_xtr_vlan_mask;
76 extern uint64_t rte_net_ice_dynflag_proto_xtr_ipv4_mask;
77 extern uint64_t rte_net_ice_dynflag_proto_xtr_ipv6_mask;
78 extern uint64_t rte_net_ice_dynflag_proto_xtr_ipv6_flow_mask;
79 extern uint64_t rte_net_ice_dynflag_proto_xtr_tcp_mask;
80
81 #define RTE_NET_ICE_DYNF_PROTO_XTR_METADATA(m) \
82         RTE_MBUF_DYNFIELD((m), \
83                           rte_net_ice_dynfield_proto_xtr_metadata_offs, \
84                           uint32_t *)
85
86 #define RTE_PKT_RX_DYNF_PROTO_XTR_VLAN \
87         (rte_net_ice_dynflag_proto_xtr_vlan_mask)
88
89 #define RTE_PKT_RX_DYNF_PROTO_XTR_IPV4 \
90         (rte_net_ice_dynflag_proto_xtr_ipv4_mask)
91
92 #define RTE_PKT_RX_DYNF_PROTO_XTR_IPV6 \
93         (rte_net_ice_dynflag_proto_xtr_ipv6_mask)
94
95 #define RTE_PKT_RX_DYNF_PROTO_XTR_IPV6_FLOW \
96         (rte_net_ice_dynflag_proto_xtr_ipv6_flow_mask)
97
98 #define RTE_PKT_RX_DYNF_PROTO_XTR_TCP \
99         (rte_net_ice_dynflag_proto_xtr_tcp_mask)
100
101 __rte_experimental
102 static __rte_always_inline int
103 rte_net_ice_dynf_proto_xtr_metadata_avail(void)
104 {
105         return rte_net_ice_dynfield_proto_xtr_metadata_offs != -1;
106 }
107
108 __rte_experimental
109 static __rte_always_inline uint32_t
110 rte_net_ice_dynf_proto_xtr_metadata_get(struct rte_mbuf *m)
111 {
112         return *RTE_NET_ICE_DYNF_PROTO_XTR_METADATA(m);
113 }
114
115 __rte_experimental
116 static inline void
117 rte_net_ice_dump_proto_xtr_metadata(struct rte_mbuf *m)
118 {
119         union rte_net_ice_proto_xtr_metadata data;
120
121         if (!rte_net_ice_dynf_proto_xtr_metadata_avail())
122                 return;
123
124         data.metadata = rte_net_ice_dynf_proto_xtr_metadata_get(m);
125
126         if (m->ol_flags & RTE_PKT_RX_DYNF_PROTO_XTR_VLAN)
127                 printf(" - Protocol Extraction:[0x%04x:0x%04x],vlan,stag=%u:%u:%u,ctag=%u:%u:%u",
128                        data.raw.data0, data.raw.data1,
129                        data.vlan.stag_pcp,
130                        data.vlan.stag_dei,
131                        data.vlan.stag_vid,
132                        data.vlan.ctag_pcp,
133                        data.vlan.ctag_dei,
134                        data.vlan.ctag_vid);
135         else if (m->ol_flags & RTE_PKT_RX_DYNF_PROTO_XTR_IPV4)
136                 printf(" - Protocol Extraction:[0x%04x:0x%04x],ipv4,ver=%u,hdrlen=%u,tos=%u,ttl=%u,proto=%u",
137                        data.raw.data0, data.raw.data1,
138                        data.ipv4.version,
139                        data.ipv4.ihl,
140                        data.ipv4.tos,
141                        data.ipv4.ttl,
142                        data.ipv4.protocol);
143         else if (m->ol_flags & RTE_PKT_RX_DYNF_PROTO_XTR_IPV6)
144                 printf(" - Protocol Extraction:[0x%04x:0x%04x],ipv6,ver=%u,tc=%u,flow_hi4=0x%x,nexthdr=%u,hoplimit=%u",
145                        data.raw.data0, data.raw.data1,
146                        data.ipv6.version,
147                        data.ipv6.tc,
148                        data.ipv6.flowhi4,
149                        data.ipv6.nexthdr,
150                        data.ipv6.hoplimit);
151         else if (m->ol_flags & RTE_PKT_RX_DYNF_PROTO_XTR_IPV6_FLOW)
152                 printf(" - Protocol Extraction:[0x%04x:0x%04x],ipv6_flow,ver=%u,tc=%u,flow=0x%x%04x",
153                        data.raw.data0, data.raw.data1,
154                        data.ipv6_flow.version,
155                        data.ipv6_flow.tc,
156                        data.ipv6_flow.flowhi4,
157                        data.ipv6_flow.flowlo16);
158         else if (m->ol_flags & RTE_PKT_RX_DYNF_PROTO_XTR_TCP)
159                 printf(" - Protocol Extraction:[0x%04x:0x%04x],tcp,doff=%u,flags=%s%s%s%s%s%s%s%s",
160                        data.raw.data0, data.raw.data1,
161                        data.tcp.doff,
162                        data.tcp.cwr ? "C" : "",
163                        data.tcp.ece ? "E" : "",
164                        data.tcp.urg ? "U" : "",
165                        data.tcp.ack ? "A" : "",
166                        data.tcp.psh ? "P" : "",
167                        data.tcp.rst ? "R" : "",
168                        data.tcp.syn ? "S" : "",
169                        data.tcp.fin ? "F" : "");
170 }
171
172 #ifdef __cplusplus
173 }
174 #endif
175
176 #endif /* _RTE_PMD_ICE_H_ */