[ovs-dev] [PATCH 2/3] Do not seemingly #include Linux-specific headers on other platforms.

Ben Pfaff blp at nicira.com
Fri Jun 13 22:28:44 UTC 2014


Until now, the OVS source tree has had a whole maze of header files that
make "#include <linux/openvswitch.h>" work OK regardless of platform, but
this confuses everyone new to the tree, at first glance, and is difficult
to understand at second glance too.

This commit moves the core of the Netlink definitions that were in
include/linux/openvswitch.h into a new header
include/odp-netlink-internal.h, and then adds two wrappers:

    * datapath/linux/compat/include/linux/openvswitch.h: This wrapper
      allows the Linux datapath code to continue using "#include
      <linux/openvswitch.h>".

    * lib/odp-netlink.h: Userspace code uses this wrapper.

This change allows all of the include/linux/* files to be deleted.

Signed-off-by: Ben Pfaff <blp at nicira.com>
---
 datapath/linux/Modules.mk                          |    1 +
 datapath/linux/compat/include/linux/openvswitch.h  |   31 +++
 debian/copyright.in                                |    2 +-
 include/automake.mk                                |    3 +-
 include/linux/automake.mk                          |    4 -
 include/linux/types.h                              |   58 -----
 .../openvswitch.h => odp-netlink-internal.h}       |  246 +++++++++++---------
 include/openvswitch/types.h                        |   15 +-
 lib/automake.mk                                    |    1 +
 lib/dpif-linux.h                                   |    4 +-
 lib/dpif.h                                         |    4 +-
 lib/odp-execute.c                                  |    2 +-
 include/linux/if_ether.h => lib/odp-netlink.h      |   20 +-
 lib/odp-util.h                                     |    4 +-
 14 files changed, 196 insertions(+), 199 deletions(-)
 create mode 100644 datapath/linux/compat/include/linux/openvswitch.h
 delete mode 100644 include/linux/automake.mk
 delete mode 100644 include/linux/types.h
 rename include/{linux/openvswitch.h => odp-netlink-internal.h} (74%)
 rename include/linux/if_ether.h => lib/odp-netlink.h (52%)

diff --git a/datapath/linux/Modules.mk b/datapath/linux/Modules.mk
index 224eb02..26e1006 100644
--- a/datapath/linux/Modules.mk
+++ b/datapath/linux/Modules.mk
@@ -46,6 +46,7 @@ openvswitch_headers += \
 	linux/compat/include/linux/netdevice.h \
 	linux/compat/include/linux/netdev_features.h \
 	linux/compat/include/linux/netlink.h \
+	linux/compat/include/linux/openvswitch.h \
 	linux/compat/include/linux/poison.h \
 	linux/compat/include/linux/rculist.h \
 	linux/compat/include/linux/rcupdate.h \
diff --git a/datapath/linux/compat/include/linux/openvswitch.h b/datapath/linux/compat/include/linux/openvswitch.h
new file mode 100644
index 0000000..d912884
--- /dev/null
+++ b/datapath/linux/compat/include/linux/openvswitch.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2007-2014 Nicira, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA
+ */
+
+#ifndef _LINUX_OPENVSWITCH_H
+#define _LINUX_OPENVSWITCH_H 1
+
+#include <linux/types.h>
+
+typedef __be16 ovs_be16;
+typedef __be32 ovs_be32;
+typedef __be64 ovs_be64;
+
+#define ODP_NETLINK_INTERNAL_OK
+#include "odp-netlink-internal.h"
+
+#endif /* _LINUX_OPENVSWITCH_H */
diff --git a/debian/copyright.in b/debian/copyright.in
index 89cd2d2..ef92b39 100644
--- a/debian/copyright.in
+++ b/debian/copyright.in
@@ -95,7 +95,7 @@ License:
 * The following components are dual-licensed under the
   GNU General Public License version 2 and the Apache License Version 2.0.
 
-	include/linux/openvswitch.h
+	include/odp-netlink-internal.h
 
   On Debian systems, the complete text of the GNU General Public License
   version 2 can be found in `/usr/share/common-licenses/GPL-2'.
diff --git a/include/automake.mk b/include/automake.mk
index 37a6f77..9d6b2ae 100644
--- a/include/automake.mk
+++ b/include/automake.mk
@@ -1,4 +1,5 @@
-include include/linux/automake.mk
+noinst_HEADERS += include/odp-netlink-internal.h
+
 include include/openflow/automake.mk
 include include/openvswitch/automake.mk
 include include/sparse/automake.mk
diff --git a/include/linux/automake.mk b/include/linux/automake.mk
deleted file mode 100644
index 6ca0e40..0000000
--- a/include/linux/automake.mk
+++ /dev/null
@@ -1,4 +0,0 @@
-noinst_HEADERS += \
-	include/linux/if_ether.h \
-	include/linux/openvswitch.h \
-	include/linux/types.h
diff --git a/include/linux/types.h b/include/linux/types.h
deleted file mode 100644
index 5438a43..0000000
--- a/include/linux/types.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (c) 2011, 2014 Nicira, Inc.
- *
- * 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 LINUX_TYPES_H
-#define LINUX_TYPES_H 1
-
-/* On Linux, this header file just includes <linux/types.h>.
- *
- * On other platforms, this header file implements just enough of
- * <linux/types.h> to allow <linux/openvswitch.h> to work, that is, it defines
- * the __u<N> and __be<N> types. */
-
-#ifdef __KERNEL__
-#include_next <linux/types.h>
-#elif defined(HAVE_LINUX_TYPES_H)
-/* With some combinations of kernel and userspace headers, including both
- * <sys/types.h> and <linux/types.h> only works if you do so in that order, so
- * force it.  */
-
-#ifdef __CHECKER__
-#define __CHECK_ENDIAN__
-#endif
-
-#include <sys/types.h>
-#include_next <linux/types.h>
-#else  /* no <linux/types.h> */
-#include <stdint.h>
-
-#ifdef __CHECKER__
-#define __bitwise__ __attribute__((bitwise))
-#else
-#define __bitwise__
-#endif
-
-typedef uint8_t  __u8;
-typedef uint16_t __u16;
-typedef uint32_t __u32;
-typedef uint64_t __u64;
-
-typedef uint16_t __bitwise__ __be16;
-typedef uint32_t __bitwise__ __be32;
-typedef uint64_t __bitwise__ __be64;
-#endif	/* no <linux/types.h> */
-
-#endif /* <linux/types.h> */
diff --git a/include/linux/openvswitch.h b/include/odp-netlink-internal.h
similarity index 74%
rename from include/linux/openvswitch.h
rename to include/odp-netlink-internal.h
index d7f85ff..754ecaf 100644
--- a/include/linux/openvswitch.h
+++ b/include/odp-netlink-internal.h
@@ -3,7 +3,7 @@
  *
  * This file is offered under your choice of two licenses: Apache 2.0 or GNU
  * GPL 2.0 or later.  The permission statements for each of these licenses is
- * given below.  You may license your modifications to this file under either
+ * given below.	 You may license your modifications to this file under either
  * of these licenses or both.  If you wish to license your modifications under
  * only one of these licenses, delete the permission text for the other
  * license.
@@ -37,11 +37,37 @@
  * ----------------------------------------------------------------------
  */
 
-#ifndef _LINUX_OPENVSWITCH_H
-#define _LINUX_OPENVSWITCH_H 1
+/* This header contains Netlink definitions used by the Open vSwitch software
+ * switch:
+ *
+ *     - The match (OVS_KEY_ATTR_*) and action (OVS_ACTION_ATTR_*) definitions
+ *       are particularly important because the OVS software switch make
+ *       extensive internal use of them regardless of the underlying platform.
+ *
+ *     - The other definitions are used mostly to communicate requests and
+ *       replies between Open vSwitch userspace and the Linux kernel datapath.
+ *       Use of these definitions is mainly confined to the Linux datapath and
+ *       the userspace driver for it (lib/dpif-linux.c).  These additional
+ *       definitions are not Linux-specific (and prototypes of non-Linux
+ *       datapaths have been implemented with them), except that Netlink-based
+ *       protocols are not necessarily customary on other operating systems.
+ *
+ * This header is not self-contained.  It must be "#include"d with the
+ * following types already defined:
+ *
+ *     - uint8_t, uint16_t, uint32_t, uint64_t: Unsigned integer types in
+ *       native byte order.
+ *
+ *     - ovs_be16, ovs_be32, ovs_be64: Unsigned integer types in big-endian
+ *       byte order.  (These will ordinarily typedefs to the corresponding
+ *       native types.  Separate type names enable static checkers such as
+ *       "sparse" to report misuses.)
+ */
 
-#include <linux/types.h>
-#include <linux/if_ether.h>
+#ifndef ODP_NETLINK_INTERNAL_OK
+#error "Include this header via <linux/openvswitch.h> or odp-netlink.h."
+#endif
+#undef ODP_NETLINK_INTERNAL_OK
 
 /**
  * struct ovs_header - header for OVS Generic Netlink messages.
@@ -86,7 +112,7 @@ enum ovs_datapath_cmd {
  * %OVS_DP_NEW requests.  May be used as an alternative to specifying
  * dp_ifindex in other requests (with a dp_ifindex of 0).
  * @OVS_DP_ATTR_UPCALL_PID: The Netlink socket in userspace that is initially
- * set on the datapath port (for OVS_ACTION_ATTR_MISS).  Only valid on
+ * set on the datapath port (for OVS_ACTION_ATTR_MISS).	 Only valid on
  * %OVS_DP_CMD_NEW requests. A value of zero indicates that upcalls should
  * not be sent.
  * @OVS_DP_ATTR_STATS: Statistics about packets that have passed through the
@@ -111,29 +137,29 @@ enum ovs_datapath_attr {
 
 /* All 64-bit integers within Netlink messages are 4-byte aligned only. */
 struct ovs_dp_stats {
-	__u64 n_hit;             /* Number of flow table matches. */
-	__u64 n_missed;          /* Number of flow table misses. */
-	__u64 n_lost;            /* Number of misses not sent to userspace. */
-	__u64 n_flows;           /* Number of flows present */
+	uint64_t n_hit;		    /* Number of flow table matches. */
+	uint64_t n_missed;	    /* Number of flow table misses. */
+	uint64_t n_lost;	    /* Number of misses not sent to userspace. */
+	uint64_t n_flows;	    /* Number of flows present */
 };
 
 struct ovs_dp_megaflow_stats {
-	__u64 n_mask_hit;	 /* Number of masks used for flow lookups. */
-	__u32 n_masks;		 /* Number of masks for the datapath. */
-	__u32 pad0;		 /* Pad for future expension. */
-	__u64 pad1;		 /* Pad for future expension. */
-	__u64 pad2;		 /* Pad for future expension. */
+	uint64_t n_mask_hit;	 /* Number of masks used for flow lookups. */
+	uint32_t n_masks;	 /* Number of masks for the datapath. */
+	uint32_t pad0;		 /* Pad for future expension. */
+	uint64_t pad1;		 /* Pad for future expension. */
+	uint64_t pad2;		 /* Pad for future expension. */
 };
 
 struct ovs_vport_stats {
-	__u64   rx_packets;		/* total packets received       */
-	__u64   tx_packets;		/* total packets transmitted    */
-	__u64   rx_bytes;		/* total bytes received         */
-	__u64   tx_bytes;		/* total bytes transmitted      */
-	__u64   rx_errors;		/* bad packets received         */
-	__u64   tx_errors;		/* packet transmit problems     */
-	__u64   rx_dropped;		/* no space in linux buffers    */
-	__u64   tx_dropped;		/* no space available in linux  */
+	uint64_t   rx_packets;		/* total packets received	*/
+	uint64_t   tx_packets;		/* total packets transmitted	*/
+	uint64_t   rx_bytes;		/* total bytes received		*/
+	uint64_t   tx_bytes;		/* total bytes transmitted	*/
+	uint64_t   rx_errors;		/* bad packets received		*/
+	uint64_t   tx_errors;		/* packet transmit problems	*/
+	uint64_t   rx_dropped;		/* no space in linux buffers	*/
+	uint64_t   tx_dropped;		/* no space available in linux	*/
 };
 
 /* Allow last Netlink attribute to be unaligned */
@@ -143,7 +169,7 @@ struct ovs_vport_stats {
 #define OVS_DP_F_VPORT_PIDS	(1 << 1)
 
 /* Fixed logical ports. */
-#define OVSP_LOCAL      ((__u32)0)
+#define OVSP_LOCAL	((uint32_t)0)
 
 /* Packet transfer. */
 
@@ -154,11 +180,11 @@ enum ovs_packet_cmd {
 	OVS_PACKET_CMD_UNSPEC,
 
 	/* Kernel-to-user notifications. */
-	OVS_PACKET_CMD_MISS,    /* Flow table miss. */
-	OVS_PACKET_CMD_ACTION,  /* OVS_ACTION_ATTR_USERSPACE action. */
+	OVS_PACKET_CMD_MISS,	/* Flow table miss. */
+	OVS_PACKET_CMD_ACTION,	/* OVS_ACTION_ATTR_USERSPACE action. */
 
 	/* Userspace commands. */
-	OVS_PACKET_CMD_EXECUTE  /* Apply actions to a packet. */
+	OVS_PACKET_CMD_EXECUTE	/* Apply actions to a packet. */
 };
 
 /**
@@ -168,14 +194,14 @@ enum ovs_packet_cmd {
  * %OVS_PACKET_CMD_ACTION, %OVS_PACKET_ATTR_PACKET reflects changes made by
  * actions preceding %OVS_ACTION_ATTR_USERSPACE, but %OVS_PACKET_ATTR_KEY is
  * the flow key extracted from the packet as originally received.
- * @OVS_PACKET_ATTR_KEY: Present for all notifications.  Contains the flow key
+ * @OVS_PACKET_ATTR_KEY: Present for all notifications.	 Contains the flow key
  * extracted from the packet as nested %OVS_KEY_ATTR_* attributes.  This allows
  * userspace to adapt its flow setup strategy by comparing its notion of the
  * flow key against the kernel's.  When used with %OVS_PACKET_CMD_EXECUTE, only
  * metadata key fields (e.g. priority, skb mark) are honored.  All the packet
  * header fields are parsed from the packet instead.
  * @OVS_PACKET_ATTR_ACTIONS: Contains actions for the packet.  Used
- * for %OVS_PACKET_CMD_EXECUTE.  It has nested %OVS_ACTION_ATTR_* attributes.
+ * for %OVS_PACKET_CMD_EXECUTE.	 It has nested %OVS_ACTION_ATTR_* attributes.
  * @OVS_PACKET_ATTR_USERDATA: Present for an %OVS_PACKET_CMD_ACTION
  * notification if the %OVS_ACTION_ATTR_USERSPACE action specified an
  * %OVS_USERSPACE_ATTR_USERDATA attribute, with the same length and content
@@ -186,8 +212,8 @@ enum ovs_packet_cmd {
  */
 enum ovs_packet_attr {
 	OVS_PACKET_ATTR_UNSPEC,
-	OVS_PACKET_ATTR_PACKET,      /* Packet data. */
-	OVS_PACKET_ATTR_KEY,         /* Nested OVS_KEY_ATTR_* attributes. */
+	OVS_PACKET_ATTR_PACKET,	     /* Packet data. */
+	OVS_PACKET_ATTR_KEY,	     /* Nested OVS_KEY_ATTR_* attributes. */
 	OVS_PACKET_ATTR_ACTIONS,     /* Nested OVS_ACTION_ATTR_* attributes. */
 	OVS_PACKET_ATTR_USERDATA,    /* OVS_ACTION_ATTR_USERSPACE arg. */
 	__OVS_PACKET_ATTR_MAX
@@ -211,10 +237,10 @@ enum ovs_vport_cmd {
 
 enum ovs_vport_type {
 	OVS_VPORT_TYPE_UNSPEC,
-	OVS_VPORT_TYPE_NETDEV,   /* network device */
+	OVS_VPORT_TYPE_NETDEV,	 /* network device */
 	OVS_VPORT_TYPE_INTERNAL, /* network device implemented by datapath */
 	OVS_VPORT_TYPE_GRE,	 /* GRE tunnel. */
-	OVS_VPORT_TYPE_VXLAN,    /* VXLAN tunnel */
+	OVS_VPORT_TYPE_VXLAN,	 /* VXLAN tunnel */
 	OVS_VPORT_TYPE_GRE64 = 104, /* GRE tunnel with 64-bit keys */
 	OVS_VPORT_TYPE_LISP = 105,  /* LISP tunnel */
 	__OVS_VPORT_TYPE_MAX
@@ -227,7 +253,7 @@ enum ovs_vport_type {
  * @OVS_VPORT_ATTR_PORT_NO: 32-bit port number within datapath.
  * @OVS_VPORT_ATTR_TYPE: 32-bit %OVS_VPORT_TYPE_* constant describing the type
  * of vport.
- * @OVS_VPORT_ATTR_NAME: Name of vport.  For a vport based on a network device
+ * @OVS_VPORT_ATTR_NAME: Name of vport.	 For a vport based on a network device
  * this is the name of the network device.  Maximum length %IFNAMSIZ-1 bytes
  * plus a null terminator.
  * @OVS_VPORT_ATTR_OPTIONS: Vport-specific configuration information.
@@ -254,12 +280,12 @@ enum ovs_vport_type {
  */
 enum ovs_vport_attr {
 	OVS_VPORT_ATTR_UNSPEC,
-	OVS_VPORT_ATTR_PORT_NO,	/* u32 port number within datapath */
+	OVS_VPORT_ATTR_PORT_NO, /* u32 port number within datapath */
 	OVS_VPORT_ATTR_TYPE,	/* u32 OVS_VPORT_TYPE_* constant. */
 	OVS_VPORT_ATTR_NAME,	/* string name, up to IFNAMSIZ bytes long */
 	OVS_VPORT_ATTR_OPTIONS, /* nested attributes, varies by vport type */
 	OVS_VPORT_ATTR_UPCALL_PID, /* array of u32 Netlink socket PIDs for */
-				/* receiving upcalls */
+	/* receiving upcalls */
 	OVS_VPORT_ATTR_STATS,	/* struct ovs_vport_stats */
 	__OVS_VPORT_ATTR_MAX
 };
@@ -278,7 +304,7 @@ enum {
 
 /* Flows. */
 
-#define OVS_FLOW_FAMILY  "ovs_flow"
+#define OVS_FLOW_FAMILY	 "ovs_flow"
 #define OVS_FLOW_MCGROUP "ovs_flow"
 #define OVS_FLOW_VERSION 0x1
 
@@ -291,30 +317,30 @@ enum ovs_flow_cmd {
 };
 
 struct ovs_flow_stats {
-	__u64 n_packets;         /* Number of matched packets. */
-	__u64 n_bytes;           /* Number of matched bytes. */
+	uint64_t n_packets;	    /* Number of matched packets. */
+	uint64_t n_bytes;	    /* Number of matched bytes. */
 };
 
 enum ovs_key_attr {
 	OVS_KEY_ATTR_UNSPEC,
 	OVS_KEY_ATTR_ENCAP,	/* Nested set of encapsulated attributes. */
-	OVS_KEY_ATTR_PRIORITY,  /* u32 skb->priority */
-	OVS_KEY_ATTR_IN_PORT,   /* u32 OVS dp port number */
-	OVS_KEY_ATTR_ETHERNET,  /* struct ovs_key_ethernet */
+	OVS_KEY_ATTR_PRIORITY,	/* u32 skb->priority */
+	OVS_KEY_ATTR_IN_PORT,	/* u32 OVS dp port number */
+	OVS_KEY_ATTR_ETHERNET,	/* struct ovs_key_ethernet */
 	OVS_KEY_ATTR_VLAN,	/* be16 VLAN TCI */
-	OVS_KEY_ATTR_ETHERTYPE,	/* be16 Ethernet type */
-	OVS_KEY_ATTR_IPV4,      /* struct ovs_key_ipv4 */
-	OVS_KEY_ATTR_IPV6,      /* struct ovs_key_ipv6 */
-	OVS_KEY_ATTR_TCP,       /* struct ovs_key_tcp */
-	OVS_KEY_ATTR_UDP,       /* struct ovs_key_udp */
-	OVS_KEY_ATTR_ICMP,      /* struct ovs_key_icmp */
-	OVS_KEY_ATTR_ICMPV6,    /* struct ovs_key_icmpv6 */
-	OVS_KEY_ATTR_ARP,       /* struct ovs_key_arp */
-	OVS_KEY_ATTR_ND,        /* struct ovs_key_nd */
-	OVS_KEY_ATTR_SKB_MARK,  /* u32 skb mark */
+	OVS_KEY_ATTR_ETHERTYPE, /* be16 Ethernet type */
+	OVS_KEY_ATTR_IPV4,	/* struct ovs_key_ipv4 */
+	OVS_KEY_ATTR_IPV6,	/* struct ovs_key_ipv6 */
+	OVS_KEY_ATTR_TCP,	/* struct ovs_key_tcp */
+	OVS_KEY_ATTR_UDP,	/* struct ovs_key_udp */
+	OVS_KEY_ATTR_ICMP,	/* struct ovs_key_icmp */
+	OVS_KEY_ATTR_ICMPV6,	/* struct ovs_key_icmpv6 */
+	OVS_KEY_ATTR_ARP,	/* struct ovs_key_arp */
+	OVS_KEY_ATTR_ND,	/* struct ovs_key_nd */
+	OVS_KEY_ATTR_SKB_MARK,	/* u32 skb mark */
 	OVS_KEY_ATTR_TUNNEL,	/* Nested set of ovs_tunnel attributes */
-	OVS_KEY_ATTR_SCTP,      /* struct ovs_key_sctp */
-	OVS_KEY_ATTR_TCP_FLAGS,	/* be16 TCP flags. */
+	OVS_KEY_ATTR_SCTP,	/* struct ovs_key_sctp */
+	OVS_KEY_ATTR_TCP_FLAGS, /* be16 TCP flags. */
 	OVS_KEY_ATTR_DP_HASH,	/* u32 hash value. Value 0 indicates the hash
 				   is not computed by the datapath. */
 	OVS_KEY_ATTR_RECIRC_ID, /* u32 recirc id */
@@ -364,89 +390,89 @@ enum ovs_frag_type {
 #define OVS_FRAG_TYPE_MAX (__OVS_FRAG_TYPE_MAX - 1)
 
 struct ovs_key_ethernet {
-	__u8	 eth_src[ETH_ALEN];
-	__u8	 eth_dst[ETH_ALEN];
+	uint8_t	 eth_src[6];
+	uint8_t	 eth_dst[6];
 };
 
 struct ovs_key_mpls {
-	__be32 mpls_lse;
+	ovs_be32 mpls_lse;
 };
 
 struct ovs_key_ipv4 {
-	__be32 ipv4_src;
-	__be32 ipv4_dst;
-	__u8   ipv4_proto;
-	__u8   ipv4_tos;
-	__u8   ipv4_ttl;
-	__u8   ipv4_frag;	/* One of OVS_FRAG_TYPE_*. */
+	ovs_be32 ipv4_src;
+	ovs_be32 ipv4_dst;
+	uint8_t	  ipv4_proto;
+	uint8_t	  ipv4_tos;
+	uint8_t	  ipv4_ttl;
+	uint8_t	  ipv4_frag;	/* One of OVS_FRAG_TYPE_*. */
 };
 
 struct ovs_key_ipv6 {
-	__be32 ipv6_src[4];
-	__be32 ipv6_dst[4];
-	__be32 ipv6_label;	/* 20-bits in least-significant bits. */
-	__u8   ipv6_proto;
-	__u8   ipv6_tclass;
-	__u8   ipv6_hlimit;
-	__u8   ipv6_frag;	/* One of OVS_FRAG_TYPE_*. */
+	ovs_be32 ipv6_src[4];
+	ovs_be32 ipv6_dst[4];
+	ovs_be32 ipv6_label;	/* 20-bits in least-significant bits. */
+	uint8_t	  ipv6_proto;
+	uint8_t	  ipv6_tclass;
+	uint8_t	  ipv6_hlimit;
+	uint8_t	  ipv6_frag;	/* One of OVS_FRAG_TYPE_*. */
 };
 
 struct ovs_key_tcp {
-	__be16 tcp_src;
-	__be16 tcp_dst;
+	ovs_be16 tcp_src;
+	ovs_be16 tcp_dst;
 };
 
 struct ovs_key_udp {
-	__be16 udp_src;
-	__be16 udp_dst;
+	ovs_be16 udp_src;
+	ovs_be16 udp_dst;
 };
 
 struct ovs_key_sctp {
-	__be16 sctp_src;
-	__be16 sctp_dst;
+	ovs_be16 sctp_src;
+	ovs_be16 sctp_dst;
 };
 
 struct ovs_key_icmp {
-	__u8 icmp_type;
-	__u8 icmp_code;
+	uint8_t icmp_type;
+	uint8_t icmp_code;
 };
 
 struct ovs_key_icmpv6 {
-	__u8 icmpv6_type;
-	__u8 icmpv6_code;
+	uint8_t icmpv6_type;
+	uint8_t icmpv6_code;
 };
 
 struct ovs_key_arp {
-	__be32 arp_sip;
-	__be32 arp_tip;
-	__be16 arp_op;
-	__u8   arp_sha[ETH_ALEN];
-	__u8   arp_tha[ETH_ALEN];
+	ovs_be32 arp_sip;
+	ovs_be32 arp_tip;
+	ovs_be16 arp_op;
+	uint8_t	  arp_sha[6];
+	uint8_t	  arp_tha[6];
 };
 
 struct ovs_key_nd {
-	__u32 nd_target[4];
-	__u8  nd_sll[ETH_ALEN];
-	__u8  nd_tll[ETH_ALEN];
+	uint32_t nd_target[4];
+	uint8_t	 nd_sll[6];
+	uint8_t	 nd_tll[6];
 };
 
 /**
  * enum ovs_flow_attr - attributes for %OVS_FLOW_* commands.
  * @OVS_FLOW_ATTR_KEY: Nested %OVS_KEY_ATTR_* attributes specifying the flow
- * key.  Always present in notifications.  Required for all requests (except
+ * key.	 Always present in notifications.  Required for all requests (except
  * dumps).
  * @OVS_FLOW_ATTR_ACTIONS: Nested %OVS_ACTION_ATTR_* attributes specifying
- * the actions to take for packets that match the key.  Always present in
+ * the actions to take for packets that match the key.	Always present in
  * notifications.  Required for %OVS_FLOW_CMD_NEW requests, optional for
- * %OVS_FLOW_CMD_SET requests.  An %OVS_FLOW_CMD_SET without
- * %OVS_FLOW_ATTR_ACTIONS will not modify the actions.  To clear the actions,
+ * %OVS_FLOW_CMD_SET requests.	An %OVS_FLOW_CMD_SET without
+ * %OVS_FLOW_ATTR_ACTIONS will not modify the actions.	To clear the actions,
  * an %OVS_FLOW_ATTR_ACTIONS without any nested attributes must be given.
  * @OVS_FLOW_ATTR_STATS: &struct ovs_flow_stats giving statistics for this
  * flow.  Present in notifications if the stats would be nonzero.  Ignored in
  * requests.
  * @OVS_FLOW_ATTR_TCP_FLAGS: An 8-bit value giving the OR'd value of all of the
  * TCP flags seen on packets in this flow.  Only present in notifications for
- * TCP flows, and only if it would be nonzero.  Ignored in requests.
+ * TCP flows, and only if it would be nonzero.	Ignored in requests.
  * @OVS_FLOW_ATTR_USED: A 64-bit integer giving the time, in milliseconds on
  * the system monotonic clock, at which a packet was last processed for this
  * flow.  Only present in notifications if a packet has been processed for this
@@ -466,13 +492,13 @@ struct ovs_key_nd {
  */
 enum ovs_flow_attr {
 	OVS_FLOW_ATTR_UNSPEC,
-	OVS_FLOW_ATTR_KEY,       /* Sequence of OVS_KEY_ATTR_* attributes. */
-	OVS_FLOW_ATTR_ACTIONS,   /* Nested OVS_ACTION_ATTR_* attributes. */
-	OVS_FLOW_ATTR_STATS,     /* struct ovs_flow_stats. */
+	OVS_FLOW_ATTR_KEY,	 /* Sequence of OVS_KEY_ATTR_* attributes. */
+	OVS_FLOW_ATTR_ACTIONS,	 /* Nested OVS_ACTION_ATTR_* attributes. */
+	OVS_FLOW_ATTR_STATS,	 /* struct ovs_flow_stats. */
 	OVS_FLOW_ATTR_TCP_FLAGS, /* 8-bit OR'd TCP flags. */
-	OVS_FLOW_ATTR_USED,      /* u64 msecs last used in monotonic time. */
-	OVS_FLOW_ATTR_CLEAR,     /* Flag to clear stats, tcp_flags, used. */
-	OVS_FLOW_ATTR_MASK,      /* Sequence of OVS_KEY_ATTR_* attributes. */
+	OVS_FLOW_ATTR_USED,	 /* u64 msecs last used in monotonic time. */
+	OVS_FLOW_ATTR_CLEAR,	 /* Flag to clear stats, tcp_flags, used. */
+	OVS_FLOW_ATTR_MASK,	 /* Sequence of OVS_KEY_ATTR_* attributes. */
 	__OVS_FLOW_ATTR_MAX
 };
 
@@ -524,8 +550,8 @@ enum ovs_userspace_attr {
  * %ETH_P_MPLS_MC, indicating MPLS unicast or multicast. Other are rejected.
  */
 struct ovs_action_push_mpls {
-	__be32 mpls_lse;
-	__be16 mpls_ethertype; /* Either %ETH_P_MPLS_UC or %ETH_P_MPLS_MC */
+	ovs_be32 mpls_lse;
+	ovs_be16 mpls_ethertype; /* Either %ETH_P_MPLS_UC or %ETH_P_MPLS_MC */
 };
 
 /**
@@ -540,8 +566,8 @@ struct ovs_action_push_mpls {
  * from having surprising results.
  */
 struct ovs_action_push_vlan {
-	__be16 vlan_tpid;	/* 802.1Q TPID. */
-	__be16 vlan_tci;	/* 802.1Q TCI (VLAN ID and priority). */
+	ovs_be16 vlan_tpid;	/* 802.1Q TPID. */
+	ovs_be16 vlan_tci;	/* 802.1Q TCI (VLAN ID and priority). */
 };
 
 /* Data path hash algorithm for computing Datapath hash.
@@ -579,17 +605,17 @@ struct ovs_action_hash {
  * single nested %OVS_KEY_ATTR_* attribute specifies a header to modify and its
  * value.
  * @OVS_ACTION_ATTR_PUSH_MPLS: Push a new MPLS label stack entry onto the
- * top of the packets MPLS label stack.  Set the ethertype of the
+ * top of the packets MPLS label stack.	 Set the ethertype of the
  * encapsulating frame to either %ETH_P_MPLS_UC or %ETH_P_MPLS_MC to
  * indicate the new packet contents.
  * @OVS_ACTION_ATTR_POP_MPLS: Pop an MPLS label stack entry off of the
  * packet's MPLS label stack.  Set the encapsulating frame's ethertype to
  * indicate the new packet contents. This could potentially still be
- * %ETH_P_MPLS if the resulting MPLS label stack is not empty.  If there
+ * %ETH_P_MPLS if the resulting MPLS label stack is not empty.	If there
  * is no MPLS label stack, as determined by ethertype, no action is taken.
  * @OVS_ACTION_RECIRC: Recirculate within the data path.
  *
- * Only a single header can be set with a single %OVS_ACTION_ATTR_SET.  Not all
+ * Only a single header can be set with a single %OVS_ACTION_ATTR_SET.	Not all
  * fields within a header are modifiable, e.g. the IPv4 protocol and fragment
  * type may not be changed.
  */
@@ -598,17 +624,15 @@ enum ovs_action_attr {
 	OVS_ACTION_ATTR_UNSPEC,
 	OVS_ACTION_ATTR_OUTPUT,	      /* u32 port number. */
 	OVS_ACTION_ATTR_USERSPACE,    /* Nested OVS_USERSPACE_ATTR_*. */
-	OVS_ACTION_ATTR_SET,          /* One nested OVS_KEY_ATTR_*. */
+	OVS_ACTION_ATTR_SET,	      /* One nested OVS_KEY_ATTR_*. */
 	OVS_ACTION_ATTR_PUSH_VLAN,    /* struct ovs_action_push_vlan. */
 	OVS_ACTION_ATTR_POP_VLAN,     /* No argument. */
-	OVS_ACTION_ATTR_SAMPLE,       /* Nested OVS_SAMPLE_ATTR_*. */
+	OVS_ACTION_ATTR_SAMPLE,	      /* Nested OVS_SAMPLE_ATTR_*. */
 	OVS_ACTION_ATTR_PUSH_MPLS,    /* struct ovs_action_push_mpls. */
-	OVS_ACTION_ATTR_POP_MPLS,     /* __be16 ethertype. */
+	OVS_ACTION_ATTR_POP_MPLS,     /* ovs_be16 ethertype. */
 	OVS_ACTION_ATTR_RECIRC,	      /* u32 recirc_id. */
 	OVS_ACTION_ATTR_HASH,	      /* struct ovs_action_hash. */
 	__OVS_ACTION_ATTR_MAX
 };
 
 #define OVS_ACTION_ATTR_MAX (__OVS_ACTION_ATTR_MAX - 1)
-
-#endif /* _LINUX_OPENVSWITCH_H */
diff --git a/include/openvswitch/types.h b/include/openvswitch/types.h
index d9a5dc8..315e9f1 100644
--- a/include/openvswitch/types.h
+++ b/include/openvswitch/types.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2011, 2013 Nicira, Inc.
+ * Copyright (c) 2010, 2011, 2013, 2014 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,13 +17,13 @@
 #ifndef OPENVSWITCH_TYPES_H
 #define OPENVSWITCH_TYPES_H 1
 
-#include <linux/types.h>
 #include <sys/types.h>
 #include <stdint.h>
 
 #ifdef __CHECKER__
 #define OVS_BITWISE __attribute__((bitwise))
 #define OVS_FORCE __attribute__((force))
+#define __CHECK_ENDIAN__
 #else
 #define OVS_BITWISE
 #define OVS_FORCE
@@ -32,12 +32,19 @@
 /* The ovs_be<N> types indicate that an object is in big-endian, not
  * native-endian, byte order.  They are otherwise equivalent to uint<N>_t.
  *
- * We bootstrap these from the Linux __be<N> types.  If we instead define our
- * own independently then __be<N> and ovs_be<N> become mutually
+ * On Linux, we bootstrap these from the Linux __be<N> types.  If we instead
+ * define our own independently then __be<N> and ovs_be<N> become mutually
  * incompatible. */
+#ifdef __linux__
+#include <linux/types.h>
 typedef __be16 ovs_be16;
 typedef __be32 ovs_be32;
 typedef __be64 ovs_be64;
+#else
+typedef uint16_t OVS_BITWISE ovs_be16;
+typedef uint32_t OVS_BITWISE ovs_be32;
+typedef uint64_t OVS_BITWISE ovs_be64;
+#endif
 
 #define OVS_BE16_MAX ((OVS_FORCE ovs_be16) 0xffff)
 #define OVS_BE32_MAX ((OVS_FORCE ovs_be32) 0xffffffff)
diff --git a/lib/automake.mk b/lib/automake.mk
index dc2ca0e..4345fca 100644
--- a/lib/automake.mk
+++ b/lib/automake.mk
@@ -122,6 +122,7 @@ lib_libopenvswitch_la_SOURCES = \
 	lib/nx-match.h \
 	lib/odp-execute.c \
 	lib/odp-execute.h \
+	lib/odp-netlink.h \
 	lib/odp-util.c \
 	lib/odp-util.h \
 	lib/ofp-actions.c \
diff --git a/lib/dpif-linux.h b/lib/dpif-linux.h
index 21d0048..aa1f9a0 100644
--- a/lib/dpif-linux.h
+++ b/lib/dpif-linux.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2011 Nicira, Inc.
+ * Copyright (c) 2010, 2011, 2014 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,9 +20,9 @@
 #include <stdbool.h>
 #include <stddef.h>
 #include <stdint.h>
-#include <linux/openvswitch.h>
 
 #include "flow.h"
+#include "odp-netlink.h"
 
 struct ofpbuf;
 
diff --git a/lib/dpif.h b/lib/dpif.h
index f080cde..8a52570 100644
--- a/lib/dpif.h
+++ b/lib/dpif.h
@@ -115,7 +115,7 @@
  *      a flow, but the datapath interface uses a different data format to
  *      allow ABI forward- and backward-compatibility.  datapath/README
  *      describes the rationale and design.  Refer to OVS_KEY_ATTR_* and
- *      "struct ovs_key_*" in include/linux/openvswitch.h for details.
+ *      "struct ovs_key_*" in include/odp-netlink-internal.h for details.
  *      lib/odp-util.h defines several functions for working with these flows.
  *
  *    - A "mask" that, for each bit in the flow, specifies whether the datapath
@@ -154,7 +154,7 @@
  *      within a flow.  Some examples of actions are OVS_ACTION_ATTR_OUTPUT,
  *      which transmits the packet out a port, and OVS_ACTION_ATTR_SET, which
  *      modifies packet headers.  Refer to OVS_ACTION_ATTR_* and "struct
- *      ovs_action_*" in include/linux/openvswitch.h for details.
+ *      ovs_action_*" in include/odp-netlink-internal.h for details.
  *      lib/odp-util.h defines several functions for working with datapath
  *      actions.
  *
diff --git a/lib/odp-execute.c b/lib/odp-execute.c
index cc18536..bc1a78c 100644
--- a/lib/odp-execute.c
+++ b/lib/odp-execute.c
@@ -17,7 +17,6 @@
 
 #include <config.h>
 #include "odp-execute.h"
-#include <linux/openvswitch.h>
 #include <stdlib.h>
 #include <string.h>
 
@@ -27,6 +26,7 @@
 #include "odp-util.h"
 #include "packets.h"
 #include "flow.h"
+#include "odp-netlink.h"
 #include "unaligned.h"
 #include "util.h"
 
diff --git a/include/linux/if_ether.h b/lib/odp-netlink.h
similarity index 52%
rename from include/linux/if_ether.h
rename to lib/odp-netlink.h
index a3cc9bc..d79949f 100644
--- a/include/linux/if_ether.h
+++ b/lib/odp-netlink.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013 Nicira, Inc.
+ * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,18 +14,12 @@
  * limitations under the License.
  */
 
-#ifndef LINUX_IF_ETHER_H
-#define LINUX_IF_ETHER_H 1
+#ifndef ODP_NETLINK_H
+#define ODP_NETLINK_H 1
 
-/* On Linux, this header file just includes <linux/if_ether.h>.
- *
- * On other platforms, this header file implements just enough of
- * <linux/if_ether.h> to allow <linux/openvswitch.h> to work. */
+#include "openvswitch/types.h"
 
-#if defined(HAVE_LINUX_IF_ETHER_H) || defined(__KERNEL__)
-#include_next <linux/if_ether.h>
-#else  /* no <linux/if_ether.h> */
-#define ETH_ALEN        6               /* Octets in one ethernet addr   */
-#endif
+#define ODP_NETLINK_INTERNAL_OK
+#include "odp-netlink-internal.h"
 
-#endif /* <linux/if_ether.h> */
+#endif /* odp-netlink.h */
diff --git a/lib/odp-util.h b/lib/odp-util.h
index 8045e3e..cb4358a 100644
--- a/lib/odp-util.h
+++ b/lib/odp-util.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
+ * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,9 +21,9 @@
 #include <stddef.h>
 #include <stdint.h>
 #include <string.h>
-#include <linux/openvswitch.h>
 #include "hash.h"
 #include "hmap.h"
+#include "odp-netlink.h"
 #include "openflow/openflow.h"
 #include "util.h"
 
-- 
1.7.10.4




More information about the dev mailing list