netlink: Make netlink-protocol.h compatible with <linux/netlink.h>.
authorBen Pfaff <blp@nicira.com>
Tue, 7 Dec 2010 17:33:27 +0000 (09:33 -0800)
committerBen Pfaff <blp@nicira.com>
Fri, 10 Dec 2010 19:12:53 +0000 (11:12 -0800)
Until now, netlink-protocol.h and <linux/netlink.h> could not both be
included by a single source file, because they contained conflicting
definitions.  This commit fixes the problem, by having netlink-protocol.h
delegate to <linux/netlink.h> where it is available.

Here's an example of the problem: odp-util.c includes both
datapath-protocol.h and will need netlink-protocol.h also so that it can
look through actions defined as struct nlattr.  datapath-protocol.h
includes <linux/if_link.h> for the definition of rtnl_link_stats64, and
<linux/if_link.h> includes <linux/netlink.h>.

Acked-by: Jesse Gross <jesse@nicira.com>
lib/netlink-protocol.h

index 486e6a088dc2668d8b78f2356a410238b1266096..77f5c8965f796fd229135e41aefb897514956c2f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008 Nicira Networks.
+ * Copyright (c) 2008, 2010 Nicira Networks.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 
 /* Netlink protocol definitions.
  *
- * These definitions are equivalent to those in the Linux 2.6 kernel headers,
- * without requiring those headers to be available. */
+ * Netlink is a message framing format described in RFC 3549 and used heavily
+ * in Linux to access the network stack.  Open vSwitch uses AF_NETLINK sockets
+ * for this purpose on Linux.  But on all platforms, Open vSwitch uses Netlink
+ * message framing internally for certain purposes.
+ *
+ * This header provides access to the Netlink message framing definitions
+ * regardless of platform.  On Linux, it includes the proper headers directly;
+ * on other platforms it directly defines the structures and macros itself.
+ */
 
 #include <stdint.h>
 #include <sys/socket.h>
 #include "util.h"
 
+#ifdef HAVE_NETLINK
+#include <linux/netlink.h>
+#include <linux/genetlink.h>
+#else
 #define NETLINK_GENERIC         16
 
 struct sockaddr_nl {
@@ -137,5 +148,6 @@ enum {
 };
 
 #define CTRL_ATTR_OP_MAX (__CTRL_ATTR_OP_MAX - 1)
+#endif  /* !HAVE_NETLINK */
 
 #endif /* netlink-protocol.h */