Skip to content

Commit 7a2ce38

Browse files
blpistokes
authored andcommitted
sparse: Add support for DPDK.
This allows netdev-dpdk.c to compile cleanly with sparse. Signed-off-by: Ben Pfaff <[email protected]> Signed-off-by: Ian Stokes <[email protected]>
1 parent 773c3cb commit 7a2ce38

12 files changed

+2774
-1
lines changed

Makefile.am

+1-1
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ check-endian:
296296
@if test -e $(srcdir)/.git && (git --version) >/dev/null 2>&1 && \
297297
(cd $(srcdir) && git --no-pager grep -l -E \
298298
-e 'BIG_ENDIAN|LITTLE_ENDIAN' --and --not -e 'BYTE_ORDER' | \
299-
$(EGREP) -v '^datapath/'); \
299+
$(EGREP) -v '^datapath/|^include/sparse/rte_'); \
300300
then \
301301
echo "See above for list of files that misuse LITTLE""_ENDIAN"; \
302302
echo "or BIG""_ENDIAN. Please use WORDS_BIGENDIAN instead."; \

build-aux/initial-tab-whitelist

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
\.sln$
66
^datapath/
77
^include/linux/
8+
^include/sparse/rte_
89
^include/windows/
910
^lib/sflow
1011
^lib/getopt_long\.c$

include/sparse/automake.mk

+9
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,13 @@
11
noinst_HEADERS += \
2+
include/sparse/rte_byteorder.h \
3+
include/sparse/rte_esp.h \
4+
include/sparse/rte_flow.h \
5+
include/sparse/rte_icmp.h \
6+
include/sparse/rte_ip.h \
7+
include/sparse/rte_sctp.h \
8+
include/sparse/rte_tcp.h \
9+
include/sparse/rte_udp.h \
10+
include/sparse/xmmintrin.h \
211
include/sparse/arpa/inet.h \
312
include/sparse/bits/floatn.h \
413
include/sparse/assert.h \

include/sparse/rte_byteorder.h

+281
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,281 @@
1+
/*-
2+
* BSD LICENSE
3+
*
4+
* Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
5+
* All rights reserved.
6+
*
7+
* Redistribution and use in source and binary forms, with or without
8+
* modification, are permitted provided that the following conditions
9+
* are met:
10+
*
11+
* * Redistributions of source code must retain the above copyright
12+
* notice, this list of conditions and the following disclaimer.
13+
* * Redistributions in binary form must reproduce the above copyright
14+
* notice, this list of conditions and the following disclaimer in
15+
* the documentation and/or other materials provided with the
16+
* distribution.
17+
* * Neither the name of Intel Corporation nor the names of its
18+
* contributors may be used to endorse or promote products derived
19+
* from this software without specific prior written permission.
20+
*
21+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32+
*/
33+
34+
#ifndef __CHECKER__
35+
#error "Use this header only with sparse. It is not a correct implementation."
36+
#endif
37+
38+
#ifndef _RTE_BYTEORDER_H_
39+
#define _RTE_BYTEORDER_H_
40+
41+
/**
42+
* @file
43+
*
44+
* Byte Swap Operations
45+
*
46+
* This file defines a generic API for byte swap operations. Part of
47+
* the implementation is architecture-specific.
48+
*/
49+
50+
#include "openvswitch/types.h"
51+
#include <stdint.h>
52+
#ifdef RTE_EXEC_ENV_BSDAPP
53+
#include <sys/endian.h>
54+
#else
55+
#include <endian.h>
56+
#endif
57+
58+
#include <rte_common.h>
59+
#include <rte_config.h>
60+
61+
/*
62+
* Compile-time endianness detection
63+
*/
64+
#define RTE_BIG_ENDIAN 1
65+
#define RTE_LITTLE_ENDIAN 2
66+
#if defined __BYTE_ORDER__
67+
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
68+
#define RTE_BYTE_ORDER RTE_BIG_ENDIAN
69+
#elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
70+
#define RTE_BYTE_ORDER RTE_LITTLE_ENDIAN
71+
#endif /* __BYTE_ORDER__ */
72+
#elif defined __BYTE_ORDER
73+
#if __BYTE_ORDER == __BIG_ENDIAN
74+
#define RTE_BYTE_ORDER RTE_BIG_ENDIAN
75+
#elif __BYTE_ORDER == __LITTLE_ENDIAN
76+
#define RTE_BYTE_ORDER RTE_LITTLE_ENDIAN
77+
#endif /* __BYTE_ORDER */
78+
#elif defined __BIG_ENDIAN__
79+
#define RTE_BYTE_ORDER RTE_BIG_ENDIAN
80+
#elif defined __LITTLE_ENDIAN__
81+
#define RTE_BYTE_ORDER RTE_LITTLE_ENDIAN
82+
#endif
83+
#if !defined(RTE_BYTE_ORDER)
84+
#error Unknown endianness.
85+
#endif
86+
87+
#define RTE_STATIC_BSWAP16(v) \
88+
((((uint16_t)(v) & UINT16_C(0x00ff)) << 8) | \
89+
(((uint16_t)(v) & UINT16_C(0xff00)) >> 8))
90+
91+
#define RTE_STATIC_BSWAP32(v) \
92+
((((uint32_t)(v) & UINT32_C(0x000000ff)) << 24) | \
93+
(((uint32_t)(v) & UINT32_C(0x0000ff00)) << 8) | \
94+
(((uint32_t)(v) & UINT32_C(0x00ff0000)) >> 8) | \
95+
(((uint32_t)(v) & UINT32_C(0xff000000)) >> 24))
96+
97+
#define RTE_STATIC_BSWAP64(v) \
98+
((((uint64_t)(v) & UINT64_C(0x00000000000000ff)) << 56) | \
99+
(((uint64_t)(v) & UINT64_C(0x000000000000ff00)) << 40) | \
100+
(((uint64_t)(v) & UINT64_C(0x0000000000ff0000)) << 24) | \
101+
(((uint64_t)(v) & UINT64_C(0x00000000ff000000)) << 8) | \
102+
(((uint64_t)(v) & UINT64_C(0x000000ff00000000)) >> 8) | \
103+
(((uint64_t)(v) & UINT64_C(0x0000ff0000000000)) >> 24) | \
104+
(((uint64_t)(v) & UINT64_C(0x00ff000000000000)) >> 40) | \
105+
(((uint64_t)(v) & UINT64_C(0xff00000000000000)) >> 56))
106+
107+
/*
108+
* These macros are functionally similar to rte_cpu_to_(be|le)(16|32|64)(),
109+
* they take values in host CPU order and return them converted to the
110+
* intended endianness.
111+
*
112+
* They resolve at compilation time to integer constants which can safely be
113+
* used with static initializers, since those cannot involve function calls.
114+
*
115+
* On the other hand, they are not as optimized as their rte_cpu_to_*()
116+
* counterparts, therefore applications should refrain from using them on
117+
* variable values, particularly inside performance-sensitive code.
118+
*/
119+
#if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
120+
#define RTE_BE16(v) (OVS_FORCE rte_be16_t)(v)
121+
#define RTE_BE32(v) (OVS_FORCE rte_be32_t)(v)
122+
#define RTE_BE64(v) (OVS_FORCE rte_be64_t)(v)
123+
#define RTE_LE16(v) (OVS_FORCE rte_le16_t)(RTE_STATIC_BSWAP16(v))
124+
#define RTE_LE32(v) (OVS_FORCE rte_le32_t)(RTE_STATIC_BSWAP32(v))
125+
#define RTE_LE64(v) (OVS_FORCE rte_le64_t)(RTE_STATIC_BSWAP64(v))
126+
#elif RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
127+
#define RTE_BE16(v) (OVS_FORCE rte_be16_t)(RTE_STATIC_BSWAP16(v))
128+
#define RTE_BE32(v) (OVS_FORCE rte_be32_t)(RTE_STATIC_BSWAP32(v))
129+
#define RTE_BE64(v) (OVS_FORCE rte_be64_t)(RTE_STATIC_BSWAP64(v))
130+
#define RTE_LE16(v) (OVS_FORCE rte_be16_t)(v)
131+
#define RTE_LE32(v) (OVS_FORCE rte_be32_t)(v)
132+
#define RTE_LE64(v) (OVS_FORCE rte_be64_t)(v)
133+
#else
134+
#error Unsupported endianness.
135+
#endif
136+
137+
/*
138+
* The following types should be used when handling values according to a
139+
* specific byte ordering, which may differ from that of the host CPU.
140+
*
141+
* Libraries, public APIs and applications are encouraged to use them for
142+
* documentation purposes.
143+
*/
144+
typedef ovs_be16 rte_be16_t; /**< 16-bit big-endian value. */
145+
typedef ovs_be32 rte_be32_t; /**< 32-bit big-endian value. */
146+
typedef ovs_be64 rte_be64_t; /**< 64-bit big-endian value. */
147+
typedef uint16_t rte_le16_t; /**< 16-bit little-endian value. */
148+
typedef uint32_t rte_le32_t; /**< 32-bit little-endian value. */
149+
typedef uint64_t rte_le64_t; /**< 64-bit little-endian value. */
150+
151+
/*
152+
* An internal function to swap bytes in a 16-bit value.
153+
*
154+
* It is used by rte_bswap16() when the value is constant. Do not use
155+
* this function directly; rte_bswap16() is preferred.
156+
*/
157+
static inline uint16_t
158+
rte_constant_bswap16(uint16_t x)
159+
{
160+
return RTE_STATIC_BSWAP16(x);
161+
}
162+
163+
/*
164+
* An internal function to swap bytes in a 32-bit value.
165+
*
166+
* It is used by rte_bswap32() when the value is constant. Do not use
167+
* this function directly; rte_bswap32() is preferred.
168+
*/
169+
static inline uint32_t
170+
rte_constant_bswap32(uint32_t x)
171+
{
172+
return RTE_STATIC_BSWAP32(x);
173+
}
174+
175+
/*
176+
* An internal function to swap bytes of a 64-bit value.
177+
*
178+
* It is used by rte_bswap64() when the value is constant. Do not use
179+
* this function directly; rte_bswap64() is preferred.
180+
*/
181+
static inline uint64_t
182+
rte_constant_bswap64(uint64_t x)
183+
{
184+
return RTE_STATIC_BSWAP64(x);
185+
}
186+
187+
188+
#ifdef __DOXYGEN__
189+
190+
/**
191+
* Swap bytes in a 16-bit value.
192+
*/
193+
static uint16_t rte_bswap16(uint16_t _x);
194+
195+
/**
196+
* Swap bytes in a 32-bit value.
197+
*/
198+
static uint32_t rte_bswap32(uint32_t x);
199+
200+
/**
201+
* Swap bytes in a 64-bit value.
202+
*/
203+
static uint64_t rte_bswap64(uint64_t x);
204+
205+
/**
206+
* Convert a 16-bit value from CPU order to little endian.
207+
*/
208+
static rte_le16_t rte_cpu_to_le_16(uint16_t x);
209+
210+
/**
211+
* Convert a 32-bit value from CPU order to little endian.
212+
*/
213+
static rte_le32_t rte_cpu_to_le_32(uint32_t x);
214+
215+
/**
216+
* Convert a 64-bit value from CPU order to little endian.
217+
*/
218+
static rte_le64_t rte_cpu_to_le_64(uint64_t x);
219+
220+
221+
/**
222+
* Convert a 16-bit value from CPU order to big endian.
223+
*/
224+
static rte_be16_t rte_cpu_to_be_16(uint16_t x);
225+
226+
/**
227+
* Convert a 32-bit value from CPU order to big endian.
228+
*/
229+
static rte_be32_t rte_cpu_to_be_32(uint32_t x);
230+
231+
/**
232+
* Convert a 64-bit value from CPU order to big endian.
233+
*/
234+
static rte_be64_t rte_cpu_to_be_64(uint64_t x);
235+
236+
237+
/**
238+
* Convert a 16-bit value from little endian to CPU order.
239+
*/
240+
static uint16_t rte_le_to_cpu_16(rte_le16_t x);
241+
242+
/**
243+
* Convert a 32-bit value from little endian to CPU order.
244+
*/
245+
static uint32_t rte_le_to_cpu_32(rte_le32_t x);
246+
247+
/**
248+
* Convert a 64-bit value from little endian to CPU order.
249+
*/
250+
static uint64_t rte_le_to_cpu_64(rte_le64_t x);
251+
252+
253+
/**
254+
* Convert a 16-bit value from big endian to CPU order.
255+
*/
256+
static uint16_t rte_be_to_cpu_16(rte_be16_t x);
257+
258+
/**
259+
* Convert a 32-bit value from big endian to CPU order.
260+
*/
261+
static uint32_t rte_be_to_cpu_32(rte_be32_t x);
262+
263+
/**
264+
* Convert a 64-bit value from big endian to CPU order.
265+
*/
266+
static uint64_t rte_be_to_cpu_64(rte_be64_t x);
267+
268+
#endif /* __DOXYGEN__ */
269+
270+
#ifdef RTE_FORCE_INTRINSICS
271+
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
272+
#define rte_bswap16(x) __builtin_bswap16(x)
273+
#endif
274+
275+
#define rte_bswap32(x) __builtin_bswap32(x)
276+
277+
#define rte_bswap64(x) __builtin_bswap64(x)
278+
279+
#endif
280+
281+
#endif /* _RTE_BYTEORDER_H_ */

include/sparse/rte_esp.h

+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/*-
2+
* BSD LICENSE
3+
*
4+
* Copyright (c) 2016-2017, Mellanox Technologies. All rights reserved.
5+
*
6+
* Redistribution and use in source and binary forms, with or without
7+
* modification, are permitted provided that the following conditions
8+
* are met:
9+
*
10+
* * Redistributions of source code must retain the above copyright
11+
* notice, this list of conditions and the following disclaimer.
12+
* * Redistributions in binary form must reproduce the above copyright
13+
* notice, this list of conditions and the following disclaimer in
14+
* the documentation and/or other materials provided with the
15+
* distribution.
16+
* * Neither the name of Intel Corporation nor the names of its
17+
* contributors may be used to endorse or promote products derived
18+
* from this software without specific prior written permission.
19+
*
20+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31+
*/
32+
33+
#ifndef __CHECKER__
34+
#error "Use this header only with sparse. It is not a correct implementation."
35+
#endif
36+
37+
#ifndef _RTE_ESP_H_
38+
#define _RTE_ESP_H_
39+
40+
/**
41+
* @file
42+
*
43+
* ESP-related defines
44+
*/
45+
46+
#include "openvswitch/types.h"
47+
#include <stdint.h>
48+
49+
#ifdef __cplusplus
50+
extern "C" {
51+
#endif
52+
53+
/**
54+
* ESP Header
55+
*/
56+
struct esp_hdr {
57+
ovs_be32 spi; /**< Security Parameters Index */
58+
ovs_be32 seq; /**< packet sequence number */
59+
} __attribute__((__packed__));
60+
61+
#ifdef __cplusplus
62+
}
63+
#endif
64+
65+
#endif /* RTE_ESP_H_ */

0 commit comments

Comments
 (0)