include include/linux/automake.mk
include include/openflow/automake.mk
include include/openvswitch/automake.mk
+include include/sparse/automake.mk
--- /dev/null
+/*
+ * Copyright (c) 2011 Nicira Networks.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CHECKER__
+#error "Use this header only with sparse. It is not a correct implementation."
+#endif
+
+#include <netinet/in.h>
--- /dev/null
+/*
+ * Copyright (c) 2011 Nicira Networks.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CHECKER__
+#error "Use this header only with sparse. It is not a correct implementation."
+#endif
+
+extern void __ovs_assert(_Bool);
+#define assert(EXPRESSION) __ovs_assert(EXPRESSION)
--- /dev/null
+noinst_HEADERS += \
+ include/sparse/arpa/inet.h \
+ include/sparse/assert.h \
+ include/sparse/math.h \
+ include/sparse/netinet/in.h \
+ include/sparse/netinet/ip6.h \
+ include/sparse/sys/socket.h \
+ include/sparse/sys/wait.h
--- /dev/null
+/*
+ * Copyright (c) 2011 Nicira Networks.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CHECKER__
+#error "Use this header only with sparse. It is not a correct implementation."
+#endif
+
+#ifndef __SYS_MATH_SPARSE
+#define __SYS_MATH_SPARSE 1
+
+double acos(double);
+float acosf(float);
+double acosh(double);
+float acoshf(float);
+long double acoshl(long double);
+long double acosl(long double);
+double asin(double);
+float asinf(float);
+double asinh(double);
+float asinhf(float);
+long double asinhl(long double);
+long double asinl(long double);
+double atan(double);
+double atan2(double, double);
+float atan2f(float, float);
+long double atan2l(long double, long double);
+float atanf(float);
+double atanh(double);
+float atanhf(float);
+long double atanhl(long double);
+long double atanl(long double);
+double cbrt(double);
+float cbrtf(float);
+long double cbrtl(long double);
+double ceil(double);
+float ceilf(float);
+long double ceill(long double);
+double copysign(double, double);
+float copysignf(float, float);
+long double copysignl(long double, long double);
+double cos(double);
+float cosf(float);
+double cosh(double);
+float coshf(float);
+long double coshl(long double);
+long double cosl(long double);
+double erf(double);
+double erfc(double);
+float erfcf(float);
+long double erfcl(long double);
+float erff(float);
+long double erfl(long double);
+double exp(double);
+double exp2(double);
+float exp2f(float);
+long double exp2l(long double);
+float expf(float);
+long double expl(long double);
+double expm1(double);
+float expm1f(float);
+long double expm1l(long double);
+double fabs(double);
+float fabsf(float);
+long double fabsl(long double);
+double fdim(double, double);
+float fdimf(float, float);
+long double fdiml(long double, long double);
+double floor(double);
+float floorf(float);
+long double floorl(long double);
+double fma(double, double, double);
+float fmaf(float, float, float);
+long double fmal(long double, long double, long double);
+double fmax(double, double);
+float fmaxf(float, float);
+long double fmaxl(long double, long double);
+double fmin(double, double);
+float fminf(float, float);
+long double fminl(long double, long double);
+double fmod(double, double);
+float fmodf(float, float);
+long double fmodl(long double, long double);
+double frexp(double, int *);
+float frexpf(float value, int *);
+long double frexpl(long double value, int *);
+double hypot(double, double);
+float hypotf(float, float);
+long double hypotl(long double, long double);
+int ilogb(double);
+int ilogbf(float);
+int ilogbl(long double);
+double j0(double);
+double j1(double);
+double jn(int, double);
+double ldexp(double, int);
+float ldexpf(float, int);
+long double ldexpl(long double, int);
+double lgamma(double);
+float lgammaf(float);
+long double lgammal(long double);
+long long llrint(double);
+long long llrintf(float);
+long long llrintl(long double);
+long long llround(double);
+long long llroundf(float);
+long long llroundl(long double);
+double log(double);
+double log10(double);
+float log10f(float);
+long double log10l(long double);
+double log1p(double);
+float log1pf(float);
+long double log1pl(long double);
+double log2(double);
+float log2f(float);
+long double log2l(long double);
+double logb(double);
+float logbf(float);
+long double logbl(long double);
+float logf(float);
+long double logl(long double);
+long lrint(double);
+long lrintf(float);
+long lrintl(long double);
+long lround(double);
+long lroundf(float);
+long lroundl(long double);
+double modf(double, double *);
+float modff(float, float *);
+long double modfl(long double, long double *);
+double nan(const char *);
+float nanf(const char *);
+long double nanl(const char *);
+double nearbyint(double);
+float nearbyintf(float);
+long double nearbyintl(long double);
+double nextafter(double, double);
+float nextafterf(float, float);
+long double nextafterl(long double, long double);
+double nexttoward(double, long double);
+float nexttowardf(float, long double);
+long double nexttowardl(long double, long double);
+double pow(double, double);
+float powf(float, float);
+long double powl(long double, long double);
+double remainder(double, double);
+float remainderf(float, float);
+long double remainderl(long double, long double);
+double remquo(double, double, int *);
+float remquof(float, float, int *);
+long double remquol(long double, long double, int *);
+double rint(double);
+float rintf(float);
+long double rintl(long double);
+double round(double);
+float roundf(float);
+long double roundl(long double);
+double scalb(double, double);
+double scalbln(double, long);
+float scalblnf(float, long);
+long double scalblnl(long double, long);
+double scalbn(double, int);
+float scalbnf(float, int);
+long double scalbnl(long double, int);
+double sin(double);
+float sinf(float);
+double sinh(double);
+float sinhf(float);
+long double sinhl(long double);
+long double sinl(long double);
+double sqrt(double);
+float sqrtf(float);
+long double sqrtl(long double);
+double tan(double);
+float tanf(float);
+double tanh(double);
+float tanhf(float);
+long double tanhl(long double);
+long double tanl(long double);
+double tgamma(double);
+float tgammaf(float);
+long double tgammal(long double);
+double trunc(double);
+float truncf(float);
+long double truncl(long double);
+double y0(double);
+double y1(double);
+double yn(int, double);
+
+#endif /* <sys/math.h> for sparse */
--- /dev/null
+/*
+ * Copyright (c) 2011 Nicira Networks.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CHECKER__
+#error "Use this header only with sparse. It is not a correct implementation."
+#endif
+
+#ifndef __NETINET_IN_SPARSE
+#define __NETINET_IN_SPARSE 1
+
+#include "openvswitch/types.h"
+#include <inttypes.h>
+#include <sys/socket.h>
+
+typedef ovs_be16 in_port_t;
+typedef ovs_be32 in_addr_t;
+
+struct in_addr {
+ in_addr_t s_addr;
+};
+
+struct sockaddr_in {
+ sa_family_t sin_family;
+ in_port_t sin_port;
+ struct in_addr sin_addr;
+};
+
+struct in6_addr {
+ union {
+ uint8_t u_s6_addr[16];
+ } u;
+};
+
+#define s6_addr u.u_s6_addr
+
+extern const struct in6_addr in6addr_any;
+
+#define IPPROTO_IP 0
+#define IPPROTO_HOPOPTS 0
+#define IPPROTO_ICMP 1
+#define IPPROTO_TCP 6
+#define IPPROTO_UDP 17
+#define IPPROTO_ROUTING 43
+#define IPPROTO_FRAGMENT 44
+#define IPPROTO_AH 51
+#define IPPROTO_ICMPV6 58
+#define IPPROTO_NONE 59
+#define IPPROTO_DSTOPTS 60
+
+#define INADDR_ANY 0x00000000
+#define INADDR_BROADCAST 0xffffffff
+#define INADDR_NONE 0xffffffff
+
+#define INET6_ADDRSTRLEN 46
+
+static inline ovs_be32 htonl(uint32_t x)
+{
+ return (OVS_FORCE ovs_be32) x;
+}
+
+static inline ovs_be16 htons(uint16_t x)
+{
+ return (OVS_FORCE ovs_be16) x;
+}
+
+static inline uint32_t ntohl(ovs_be32 x)
+{
+ return (OVS_FORCE uint32_t) x;
+}
+
+static inline uint16_t ntohs(ovs_be16 x)
+{
+ return (OVS_FORCE uint16_t) x;
+}
+
+in_addr_t inet_addr(const char *);
+int inet_aton (const char *, struct in_addr *);
+char *inet_ntoa(struct in_addr);
+const char *inet_ntop(int, const void *, char *, socklen_t);
+int inet_pton(int, const char *, void *);
+
+#endif /* <netinet/in.h> sparse */
--- /dev/null
+/*
+ * Copyright (c) 2011 Nicira Networks.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CHECKER__
+#error "Use this header only with sparse. It is not a correct implementation."
+#endif
+
+#ifndef __NETINET_IP6_SPARSE
+#define __NETINET_IP6_SPARSE 1
+
+#include <netinet/in.h>
+
+struct ip6_hdr {
+ union {
+ struct ip6_hdrctl {
+ ovs_be32 ip6_un1_flow;
+ ovs_be16 ip6_un1_plen;
+ uint8_t ip6_un1_nxt;
+ uint8_t ip6_un1_hlim;
+ } ip6_un1;
+ uint8_t ip6_un2_vfc;
+ } ip6_ctlun;
+ struct in6_addr ip6_src;
+ struct in6_addr ip6_dst;
+};
+
+#define ip6_vfc ip6_ctlun.ip6_un2_vfc
+#define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow
+#define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen
+#define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt
+#define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim
+#define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim
+
+struct ip6_ext {
+ uint8_t ip6e_nxt;
+ uint8_t ip6e_len;
+};
+
+struct ip6_frag {
+ uint8_t ip6f_nxt;
+ uint8_t ip6f_reserved;
+ ovs_be16 ip6f_offlg;
+ ovs_be32 ip6f_ident;
+};
+
+#define IP6F_OFF_MASK ((OVS_FORCE ovs_be16) 0xfff8)
+
+#endif /* netinet/ip6.h sparse */
--- /dev/null
+/*
+ * Copyright (c) 2011 Nicira Networks.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CHECKER__
+#error "Use this header only with sparse. It is not a correct implementation."
+#endif
+
+#ifndef __SYS_SOCKET_SPARSE
+#define __SYS_SOCKET_SPARSE 1
+
+#include "openvswitch/types.h"
+#include <sys/uio.h>
+
+typedef unsigned short int sa_family_t;
+typedef __socklen_t socklen_t;
+
+struct sockaddr {
+ sa_family_t sa_family;
+ char sa_data[64];
+};
+
+struct sockaddr_storage {
+ sa_family_t ss_family;
+ char sa_data[64];
+};
+
+struct msghdr {
+ void *msg_name;
+ socklen_t msg_namelen;
+ struct iovec *msg_iov;
+ int msg_iovlen;
+ void *msg_control;
+ socklen_t msg_controllen;
+ int msg_flags;
+};
+
+enum {
+ SOCK_DGRAM,
+ SOCK_RAW,
+ SOCK_SEQPACKET,
+ SOCK_STREAM
+};
+
+enum {
+ SOL_SOCKET
+};
+
+enum {
+ SO_ACCEPTCONN,
+ SO_BROADCAST,
+ SO_DEBUG,
+ SO_DONTROUTE,
+ SO_ERROR,
+ SO_KEEPALIVE,
+ SO_LINGER,
+ SO_OOBINLINE,
+ SO_RCVBUF,
+ SO_RCVLOWAT,
+ SO_RCVTIMEO,
+ SO_REUSEADDR,
+ SO_SNDBUF,
+ SO_SNDLOWAT,
+ SO_SNDTIMEO,
+ SO_TYPE
+};
+
+enum {
+ MSG_CTRUNC,
+ MSG_DONTROUTE,
+ MSG_EOR,
+ MSG_OOB,
+ MSG_NOSIGNAL,
+ MSG_PEEK,
+ MSG_TRUNC,
+ MSG_WAITALL,
+ MSG_DONTWAIT
+};
+
+enum {
+ AF_UNSPEC,
+ PF_UNSPEC = AF_UNSPEC,
+ AF_INET,
+ PF_INET = AF_INET,
+ AF_INET6,
+ PF_INET6 = AF_INET6,
+ AF_UNIX,
+ PF_UNIX = AF_UNIX,
+ AF_NETLINK,
+ PF_NETLINK = AF_NETLINK,
+ AF_PACKET,
+ PF_PACKET = AF_PACKET
+};
+
+enum {
+ SHUT_RD,
+ SHUT_RDWR,
+ SHUT_WR
+};
+
+int accept(int, struct sockaddr *, socklen_t *);
+int bind(int, const struct sockaddr *, socklen_t);
+int connect(int, const struct sockaddr *, socklen_t);
+int getpeername(int, struct sockaddr *, socklen_t *);
+int getsockname(int, struct sockaddr *, socklen_t *);
+int getsockopt(int, int, int, void *, socklen_t *);
+int listen(int, int);
+ssize_t recv(int, void *, size_t, int);
+ssize_t recvfrom(int, void *, size_t, int, struct sockaddr *, socklen_t *);
+ssize_t recvmsg(int, struct msghdr *, int);
+ssize_t send(int, const void *, size_t, int);
+ssize_t sendmsg(int, const struct msghdr *, int);
+ssize_t sendto(int, const void *, size_t, int, const struct sockaddr *,
+ socklen_t);
+int setsockopt(int, int, int, const void *, socklen_t);
+int shutdown(int, int);
+int sockatmark(int);
+int socket(int, int, int);
+int socketpair(int, int, int, int[2]);
+
+#endif /* <sys/socket.h> for sparse */
--- /dev/null
+/*
+ * Copyright (c) 2011 Nicira Networks.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CHECKER__
+#error "Use this header only with sparse. It is not a correct implementation."
+#endif
+
+#ifndef __SYS_WAIT_SPARSE
+#define __SYS_WAIT_SPARSE 1
+
+#include_next <sys/wait.h>
+
+#undef wait
+#define wait(a) rpl_wait(a)
+pid_t rpl_wait(int *);
+
+#undef waitpid
+#define waitpid(a, b, c) rpl_waitpid(a, b, c)
+pid_t rpl_waitpid(pid_t, int *, int);
+
+#endif /* <sys/wait.h> for sparse */
#include <inttypes.h>
#include "openvswitch/types.h"
+#ifndef __CHECKER__
static inline ovs_be64
htonll(uint64_t n)
{
{
return htonl(1) == 1 ? n : ((uint64_t) ntohl(n) << 32) | ntohl(n >> 32);
}
+#else
+/* Making sparse happy with these functions also makes them unreadable, so
+ * don't bother to show it their implementations. */
+ovs_be64 htonll(uint64_t);
+uint64_t ntohll(ovs_be64);
+#endif
/* These macros may substitute for htons(), htonl(), and htonll() in contexts
* where function calls are not allowed, such as case labels. They should not
* be used elsewhere because all of them evaluate their argument many times. */
-#ifdef WORDS_BIGENDIAN
-#define CONSTANT_HTONS(VALUE) ((ovs_be16) (VALUE))
-#define CONSTANT_HTONL(VALUE) ((ovs_be32) (VALUE))
-#define CONSTANT_HTONLL(VALUE) ((ovs_be64) (VALUE))
+#if defined(WORDS_BIGENDIAN) || __CHECKER__
+#define CONSTANT_HTONS(VALUE) ((OVS_FORCE ovs_be16) ((VALUE) & 0xffff))
+#define CONSTANT_HTONL(VALUE) ((OVS_FORCE ovs_be32) ((VALUE) & 0xffffffff))
+#define CONSTANT_HTONLL(VALUE) \
+ ((OVS_FORCE ovs_be64) ((VALUE) & UINT64_C(0xffffffffffffffff)))
#else
#define CONSTANT_HTONS(VALUE) \
(((((ovs_be16) (VALUE)) & 0xff00) >> 8) | \
#include "csum.h"
#include "unaligned.h"
+#ifndef __CHECKER__
+
/* Returns the IP checksum of the 'n' bytes in 'data'.
*
* The return value has the same endianness as the data. That is, if 'data'
return recalc_csum16(recalc_csum16(old_csum, old_u32, new_u32),
old_u32 >> 16, new_u32 >> 16);
}
+
+#else /* __CHECKER__ */
+/* Making sparse happy with these functions also makes them unreadable, so
+ * don't bother to show it their implementations. */
+#endif
protocol = (ethertype == NETDEV_ETH_TYPE_ANY ? ETH_P_ALL
: ethertype == NETDEV_ETH_TYPE_802_2 ? ETH_P_802_2
: ethertype);
- netdev->fd = socket(PF_PACKET, SOCK_RAW, htons(protocol));
+ netdev->fd = socket(PF_PACKET, SOCK_RAW,
+ (OVS_FORCE int) htons(protocol));
if (netdev->fd < 0) {
error = errno;
goto error;
/* Copyright (c) 2002-2009 InMon Corp. Licensed under the terms of the InMon sFlow licence: */
/* http://www.inmon.com/technology/sflowlicense.txt */
+#ifndef __CHECKER__ /* Don't run sparse on anything in this file. */
+
#include <assert.h>
#include "sflow_api.h"
sfl_agent_error(receiver->agent, "receiver", msg);
resetSampleCollector(receiver);
}
+
+#endif /* !__CHECKER__ */
x->lo = value;
}
+#ifndef __CHECKER__
/* Returns the value of 'x'. */
static inline ovs_be64
get_32aligned_be64(const ovs_32aligned_be64 *x)
x->lo = value >> 32;
#endif
}
+#else /* __CHECKER__ */
+/* Making sparse happy with these functions also makes them unreadable, so
+ * don't bother to show it their implementations. */
+ovs_be64 get_32aligned_be64(const ovs_32aligned_be64 *);
+void put_32aligned_be64(ovs_32aligned_be64 *, ovs_be64);
+#endif
#endif /* unaligned.h */
return false;
success:
- agent_addr->address.ip_v4.addr = in4.s_addr;
+ agent_addr->address.ip_v4.addr = (OVS_FORCE uint32_t) in4.s_addr;
return true;
}
/*
- * Copyright (c) 2010 Nicira Networks.
+ * Copyright (c) 2010, 2011 Nicira Networks.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
int
main(void)
{
+#ifndef __CHECKER__
/* I picked some random numbers. */
const uint16_t s = 0xc9bd;
const uint32_t l = 0xffe56ae8;
assert(ntohll(htonll(ll)) == ll);
assert(CONSTANT_HTONLL(ntohll(ll)) == ll);
assert(ntohll(CONSTANT_HTONLL(ll)));
+#else /* __CHECKER__ */
+/* Making sparse happy with this code makes it unreadable, so don't bother. */
+#endif
return 0;
}