[ovs-dev] [PATCH 1/4 v4] Add extentions to the standard datapath interface

Nithin Raju nithin at vmware.com
Tue Aug 19 20:51:51 UTC 2014


The datapath interface defined in odp-netlink.h needs some extensions
that are platform dependent. Some examples are the name of the communication
device on Windows and a set of commands that are specific to Windows.

In this change we define a datapath-windows/include/OvsDpInterfaceExt.h
to include any platform specific interface extensions.

OvsDpInterfaceExt.h is in turn included in odp-netlink.h ONLY for _WIN32.
This approach was chosen to avoid including OvsDpInterfaceExt.h directly
although the latter approach is as good as the former.

Also, we define three ioctls in OvsDpInterfaceExt.h:
read:     provides an output buffer (mimics a recv)
write:    provides an input buffer (mimics a send)
transact: provides an input and optionally an output buffer.
          (mimics a send followed by recv)

Signed-off-by: Nithin Raju <nithin at vmware.com>
Co-Authored-by: Ben Pfaff <blp at nicira.com>
Acked-by: Alin Serdean <aserdean at cloudbasesolutions.com>
Acked-by: Ankur Sharma <ankursharma at vmware.com>
Acked-by: Saurabh Shah <ssaurabh at vmware.com>
---
 build-aux/extract-odp-netlink-h              |    7 +++
 datapath-windows/automake.mk                 |    1 +
 datapath-windows/include/OvsDpInterfaceExt.h |   68 ++++++++++++++++++++++++++
 datapath-windows/ovsext/ovsext.vcxproj       |    3 +-
 include/automake.mk                          |    3 +
 5 files changed, 81 insertions(+), 1 deletions(-)
 create mode 100644 datapath-windows/include/OvsDpInterfaceExt.h

diff --git a/build-aux/extract-odp-netlink-h b/build-aux/extract-odp-netlink-h
index 068fde4..9a9d1d5 100755
--- a/build-aux/extract-odp-netlink-h
+++ b/build-aux/extract-odp-netlink-h
@@ -14,6 +14,13 @@
 # Avoid using reserved names in header guards.
 s/_LINUX_OPENVSWITCH_H/ODP_NETLINK_H/
 
+# Include platform extensions header file on Win32.
+$i\
+#ifdef _WIN32\
+#include "OvsDpInterfaceExt.h"\
+#endif\
+
+
 # Transform most Linux-specific __u<N> types into C99 uint<N>_t types,
 # and most Linux-specific __be<N> into Open vSwitch ovs_be<N>,
 # and use the appropriate userspace header.
diff --git a/datapath-windows/automake.mk b/datapath-windows/automake.mk
index 6131de0..3fd6692 100644
--- a/datapath-windows/automake.mk
+++ b/datapath-windows/automake.mk
@@ -3,6 +3,7 @@ EXTRA_DIST += \
 	datapath-windows/DESIGN \
 	datapath-windows/Package/package.VcxProj \
 	datapath-windows/Package/package.VcxProj.user \
+	datapath-windows/include/OvsDpInterfaceExt.h \
 	datapath-windows/include/OvsNetlink.h \
 	datapath-windows/include/OvsPub.h \
 	datapath-windows/misc/install.cmd \
diff --git a/datapath-windows/include/OvsDpInterfaceExt.h b/datapath-windows/include/OvsDpInterfaceExt.h
new file mode 100644
index 0000000..e791952
--- /dev/null
+++ b/datapath-windows/include/OvsDpInterfaceExt.h
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2014 VMware, 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 __OVS_DP_INTERFACE_EXT_H_
+#define __OVS_DP_INTERFACE_EXT_H_ 1
+
+/* Windows kernel datapath extensions to the standard datapath interface. */
+
+/* Name of the device. */
+#define OVS_DEVICE_NAME_NT     L"\\Device\\OpenvSwitchDevice"
+#define OVS_DEVICE_NAME_DOS    L"\\DosDevices\\OpenvSwitchDevice"
+#define OVS_DEVICE_NAME_USER   TEXT("\\\\.\\OpenvSwitchDevice")
+
+#define OVS_IOCTL_DEVICE_TYPE 45000
+
+/* We used Direct I/O (zero copy) for the buffers. */
+#define OVS_IOCTL_START   0x100
+#define OVS_IOCTL_READ \
+    CTL_CODE (OVS_IOCTL_DEVICE_TYPE, OVS_IOCTL_START + 0x0, METHOD_OUT_DIRECT,\
+              FILE_READ_ACCESS)
+#define OVS_IOCTL_WRITE \
+    CTL_CODE (OVS_IOCTL_DEVICE_TYPE, OVS_IOCTL_START + 0x1, METHOD_IN_DIRECT,\
+              FILE_READ_ACCESS)
+#define OVS_IOCTL_TRANSACT \
+    CTL_CODE (OVS_IOCTL_DEVICE_TYPE, OVS_IOCTL_START + 0x2, METHOD_OUT_DIRECT,\
+              FILE_WRITE_ACCESS)
+
+/*
+ * On platforms that support netlink natively, the operating system assigns a
+ * dynamic value to a netlink family when it is registered. In the absense of
+ * such mechanism, defined hard-coded values that are known both to userspace
+ * and kernel.
+ */
+#define OVS_WIN_NL_INVALID_FAMILY_ID         0
+#define OVS_WIN_NL_CTRL_FAMILY_ID            1
+#define OVS_WIN_NL_DATAPATH_FAMILY_ID        2
+#define OVS_WIN_NL_PACKET_FAMILY_ID          3
+#define OVS_WIN_NL_VPORT_FAMILY_ID           4
+#define OVS_WIN_NL_FLOW_FAMILY_ID            5
+
+/*
+ * Define a family of netlink command specific to Windows. This is part of the
+ * extensions.
+ */
+#define OVS_WIN_CONTROL_FAMILY   "ovs_win_control"
+#define OVS_WIN_CONTROL_MCGROUP  "ovs_win_control"
+#define OVS_WIN_CONTROL_VERSION  1
+#define OVS_WIN_CONTROL_ATTR_MAX (__OVS_FLOW_ATTR_MAX - 1)
+
+/* Commands available under the OVS_WIN_CONTROL_FAMILY. */
+enum ovs_win_control_cmd {
+    OVS_CTRL_CMD_WIN_GET_PID,
+};
+
+#endif /* __OVS_DP_INTERFACE_EXT_H_ */
diff --git a/datapath-windows/ovsext/ovsext.vcxproj b/datapath-windows/ovsext/ovsext.vcxproj
index 9728f20..4febef6 100644
--- a/datapath-windows/ovsext/ovsext.vcxproj
+++ b/datapath-windows/ovsext/ovsext.vcxproj
@@ -70,6 +70,7 @@
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
   </ImportGroup>
   <ItemGroup Label="WrappedTaskItems">
+    <ClInclude Include="..\include\OvsDpInterfaceExt.h" />
     <ClInclude Include="OvsAtomic.h" />
     <ClInclude Include="OvsBufferMgmt.h" />
     <ClInclude Include="OvsChecksum.h" />
@@ -161,4 +162,4 @@
     <None Exclude="@(None)" Include="*.def;*.bat;*.hpj;*.asmx" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-</Project>
\ No newline at end of file
+</Project>
diff --git a/include/automake.mk b/include/automake.mk
index 55cb353..19c3b43 100644
--- a/include/automake.mk
+++ b/include/automake.mk
@@ -6,6 +6,9 @@ include/odp-netlink.h: datapath/linux/compat/include/linux/openvswitch.h \
 EXTRA_DIST += build-aux/extract-odp-netlink-h
 CLEANFILES += include/odp-netlink.h
 
+noinst_HEADERS += \
+	include/odp-netlink-ext.h
+
 include include/openflow/automake.mk
 include include/openvswitch/automake.mk
 include include/sparse/automake.mk
-- 
1.7.4.1




More information about the dev mailing list