[ovs-dev] [PATCH] sparse: Fix conflict between netinet/in.h and linux/in.h

Daniele Di Proietto diproiettod at vmware.com
Thu Jun 2 02:23:29 UTC 2016


linux/in.h (from linux uapi headers) carries many of the same
definitions as netinet/in.h (from glibc).

If linux/in.h is included after netinet/in.h, conflicts are avoided in
two ways:

1) linux/libc-compat.h (included by linux/in.h) detects the include
   guard of netinet/in.h and defines some macros (e.g.
   __UAPI_DEF_IN_IPPROTO) to 0.  linux/in.h avoids exporting the same
   enums if those macros are 0.

2) The two files are allowed to redefine the same macros as long as the
   values are the same.

Our include/sparse/netinet/in.h creates problems, because:

1) It uses a custom include guard
2) It uses dummy values for some macros.

This commit changes include/sparse/netinet/in.h to use the same include
guard as glibc netinet/in.h, and to use the same values for some macros.

I think this problem is present with linux headers after
a263653ed798("netfilter: don't pull include/linux/netfilter.h from netns
headers") which cause our lib/netlink-conntrack.c to include linux/in.h
after netinet/in.h.

sample output from sparse:

/usr/include/linux/in.h:29:9: warning: preprocessor token IPPROTO_IP
redefined
../include/sparse/netinet/in.h:60:9: this was the original definition
/usr/include/linux/in.h:31:9: warning: preprocessor token IPPROTO_ICMP
redefined
../include/sparse/netinet/in.h:63:9: this was the original definition
[...]
/usr/include/linux/in.h:28:3: error: bad enum definition
/usr/include/linux/in.h:28:3: error: Expected } at end of specifier
/usr/include/linux/in.h:28:3: error: got 0
/usr/include/linux/in.h:84:16: error: redefinition of struct in_addr

Signed-off-by: Daniele Di Proietto <diproiettod at vmware.com>
---
 include/sparse/netinet/in.h | 40 ++++++++++++++++++++--------------------
 1 file changed, 20 insertions(+), 20 deletions(-)

diff --git a/include/sparse/netinet/in.h b/include/sparse/netinet/in.h
index 78e5981..8a5b887 100644
--- a/include/sparse/netinet/in.h
+++ b/include/sparse/netinet/in.h
@@ -18,8 +18,8 @@
 #error "Use this header only with sparse.  It is not a correct implementation."
 #endif
 
-#ifndef __NETINET_IN_SPARSE
-#define __NETINET_IN_SPARSE 1
+#ifndef _NETINET_IN_H
+#define _NETINET_IN_H 1
 
 #include "openvswitch/types.h"
 #include <inttypes.h>
@@ -77,25 +77,25 @@ struct sockaddr_in6 {
 #define IPPORT_FTP 21
 
 /* All the IP options documented in Linux ip(7). */
-#define IP_ADD_MEMBERSHIP 0
-#define IP_DROP_MEMBERSHIP 1
-#define IP_HDRINCL 2
-#define IP_MTU 3
-#define IP_MTU_DISCOVER 4
-#define IP_MULTICAST_IF 5
-#define IP_MULTICAST_LOOP 6
-#define IP_MULTICAST_TTL 7
-#define IP_NODEFRAG 8
-#define IP_OPTIONS 9
-#define IP_PKTINFO 10
+#define IP_ADD_MEMBERSHIP 35
+#define IP_DROP_MEMBERSHIP 36
+#define IP_HDRINCL 3
+#define IP_MTU 14
+#define IP_MTU_DISCOVER 10
+#define IP_MULTICAST_IF 32
+#define IP_MULTICAST_LOOP 34
+#define IP_MULTICAST_TTL 33
+#define IP_NODEFRAG 22
+#define IP_OPTIONS 4
+#define IP_PKTINFO 8
 #define IP_RECVERR 11
-#define IP_RECVOPTS 12
+#define IP_RECVOPTS 6
 #define IP_RECVTOS 13
-#define IP_RECVTTL 14
-#define IP_RETOPTS 15
-#define IP_ROUTER_ALERT 16
-#define IP_TOS 17
-#define IP_TTL 18
+#define IP_RECVTTL 12
+#define IP_RETOPTS 7
+#define IP_ROUTER_ALERT 5
+#define IP_TOS 1
+#define IP_TTL 2
 
 #define INADDR_ANY              0x00000000
 #define INADDR_BROADCAST        0xffffffff
@@ -146,4 +146,4 @@ int inet_aton (const char *, 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 */
+#endif /* <netinet/in.h> */
-- 
2.8.1




More information about the dev mailing list