summaryrefslogtreecommitdiff
path: root/datapath-windows
diff options
context:
space:
mode:
authorNithin Raju <nithin@vmware.com>2014-08-19 13:51:52 -0700
committerBen Pfaff <blp@nicira.com>2014-08-19 14:23:17 -0700
commit4f3988e0f6e3efcb418a3ba9de433970a64bfca4 (patch)
tree72a0e59cc168e9f910a92f50ff3fc35fa3bbceb8 /datapath-windows
parent107331906b32c606eddd3e0fc42b42d0a3bc7372 (diff)
downloadopenvswitch-4f3988e0f6e3efcb418a3ba9de433970a64bfca4.tar.gz
datapath-windows: Add Datapath.[ch] and OVS_USE_NL_INTERFACE CPP
In this change we create peer to OvsIoctl.[ch] that would interface with userspace using the netlink interface. The new files are called Datapath.[ch]. We are not deleting OvsIoctl.[ch] yet. Datapath.[ch] provides bare minimum functionality to register a pseudo device for communication with userspace. We also define a CPP called OVS_USE_NL_INTERFACE in the ovsext project. This defines if the old interface (pre-netlink based) or the new interface (netlink- based) should be enabled in the kernel. By default, the value is 0 since the Datapath.[ch] are minimal. In the next change, we'll turn it to 1. Since Datapath.[ch] containes code copied from OvsIoctl.[ch], acking the original author as well. Signed-off-by: Nithin Raju <nithin@vmware.com> Co-authored-by: Guolin Yang <gyang@vmware.com> Acked-by: Alin Serdean <aserdean@cloudbasesolutions.com> Acked-by: Ankur Sharma <ankursharma@vmware.com> Acked-by: Saurabh Shah <ssaurabh@vmware.com> Signed-off-by: Ben Pfaff <blp@nicira.com>
Diffstat (limited to 'datapath-windows')
-rw-r--r--datapath-windows/automake.mk2
-rw-r--r--datapath-windows/ovsext/Datapath.c407
-rw-r--r--datapath-windows/ovsext/Datapath.h57
-rw-r--r--datapath-windows/ovsext/OvsActions.c1
-rw-r--r--datapath-windows/ovsext/OvsDebug.h2
-rw-r--r--datapath-windows/ovsext/OvsDriver.c2
-rw-r--r--datapath-windows/ovsext/OvsEvent.c2
-rw-r--r--datapath-windows/ovsext/OvsFlow.c2
-rw-r--r--datapath-windows/ovsext/OvsIoctl.c12
-rw-r--r--datapath-windows/ovsext/OvsIoctl.h10
-rw-r--r--datapath-windows/ovsext/OvsOid.c1
-rw-r--r--datapath-windows/ovsext/OvsPacketIO.c1
-rw-r--r--datapath-windows/ovsext/OvsSwitch.c3
-rw-r--r--datapath-windows/ovsext/OvsTunnel.c1
-rw-r--r--datapath-windows/ovsext/OvsUser.c2
-rw-r--r--datapath-windows/ovsext/OvsVport.c1
-rw-r--r--datapath-windows/ovsext/OvsVxlan.c1
-rw-r--r--datapath-windows/ovsext/ovsext.vcxproj4
-rw-r--r--datapath-windows/ovsext/precomp.h3
19 files changed, 500 insertions, 14 deletions
diff --git a/datapath-windows/automake.mk b/datapath-windows/automake.mk
index 3fd669278..47ef22515 100644
--- a/datapath-windows/automake.mk
+++ b/datapath-windows/automake.mk
@@ -9,6 +9,8 @@ EXTRA_DIST += \
datapath-windows/misc/install.cmd \
datapath-windows/misc/uninstall.cmd \
datapath-windows/ovsext.sln \
+ datapath-windows/ovsext/Datapath.c \
+ datapath-windows/ovsext/Datapath.h \
datapath-windows/ovsext/OvsActions.c \
datapath-windows/ovsext/OvsAtomic.h \
datapath-windows/ovsext/OvsBufferMgmt.c \
diff --git a/datapath-windows/ovsext/Datapath.c b/datapath-windows/ovsext/Datapath.c
new file mode 100644
index 000000000..3fa56ebcf
--- /dev/null
+++ b/datapath-windows/ovsext/Datapath.c
@@ -0,0 +1,407 @@
+/*
+ * 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.
+ */
+
+/*
+ * XXX: OVS_USE_NL_INTERFACE is being used to keep the legacy DPIF interface
+ * alive while we transition over to the netlink based interface.
+ * OVS_USE_NL_INTERFACE = 0 => legacy inteface to use with dpif-windows.c
+ * OVS_USE_NL_INTERFACE = 1 => netlink inteface to use with ported dpif-linux.c
+ */
+#if defined OVS_USE_NL_INTERFACE && OVS_USE_NL_INTERFACE == 1
+
+#include "precomp.h"
+#include "OvsDatapath.h"
+#include "OvsJhash.h"
+#include "OvsSwitch.h"
+#include "OvsVport.h"
+#include "OvsEvent.h"
+#include "OvsUser.h"
+#include "OvsPacketIO.h"
+#include "OvsNetProto.h"
+#include "OvsFlow.h"
+#include "OvsUser.h"
+
+#ifdef OVS_DBG_MOD
+#undef OVS_DBG_MOD
+#endif
+#define OVS_DBG_MOD OVS_DBG_DATAPATH
+#include "OvsDebug.h"
+
+#define NETLINK_FAMILY_NAME_LEN 48
+
+/* Handles to the device object for communication with userspace. */
+NDIS_HANDLE gOvsDeviceHandle;
+PDEVICE_OBJECT gOvsDeviceObject;
+
+_Dispatch_type_(IRP_MJ_CREATE)
+_Dispatch_type_(IRP_MJ_CLOSE)
+DRIVER_DISPATCH OvsOpenCloseDevice;
+
+_Dispatch_type_(IRP_MJ_CLEANUP)
+DRIVER_DISPATCH OvsCleanupDevice;
+
+_Dispatch_type_(IRP_MJ_DEVICE_CONTROL)
+DRIVER_DISPATCH OvsDeviceControl;
+
+#ifdef ALLOC_PRAGMA
+#pragma alloc_text(INIT, OvsCreateDeviceObject)
+#pragma alloc_text(PAGE, OvsOpenCloseDevice)
+#pragma alloc_text(PAGE, OvsCleanupDevice)
+#pragma alloc_text(PAGE, OvsDeviceControl)
+#endif // ALLOC_PRAGMA
+
+#define OVS_MAX_OPEN_INSTANCES 128
+
+POVS_OPEN_INSTANCE ovsOpenInstanceArray[OVS_MAX_OPEN_INSTANCES];
+UINT32 ovsNumberOfOpenInstances;
+extern POVS_SWITCH_CONTEXT gOvsSwitchContext;
+
+NDIS_SPIN_LOCK ovsCtrlLockObj;
+PNDIS_SPIN_LOCK gOvsCtrlLock;
+
+
+VOID
+OvsInit()
+{
+ gOvsCtrlLock = &ovsCtrlLockObj;
+ NdisAllocateSpinLock(gOvsCtrlLock);
+ OvsInitEventQueue();
+ OvsUserInit();
+}
+
+VOID
+OvsCleanup()
+{
+ OvsCleanupEventQueue();
+ if (gOvsCtrlLock) {
+ NdisFreeSpinLock(gOvsCtrlLock);
+ gOvsCtrlLock = NULL;
+ }
+ OvsUserCleanup();
+}
+
+VOID
+OvsAcquireCtrlLock()
+{
+ NdisAcquireSpinLock(gOvsCtrlLock);
+}
+
+VOID
+OvsReleaseCtrlLock()
+{
+ NdisReleaseSpinLock(gOvsCtrlLock);
+}
+
+
+/*
+ * --------------------------------------------------------------------------
+ * Creates the communication device between user and kernel, and also
+ * initializes the data associated data structures.
+ * --------------------------------------------------------------------------
+ */
+NDIS_STATUS
+OvsCreateDeviceObject(NDIS_HANDLE ovsExtDriverHandle)
+{
+ NDIS_STATUS status = NDIS_STATUS_SUCCESS;
+ UNICODE_STRING deviceName;
+ UNICODE_STRING symbolicDeviceName;
+ PDRIVER_DISPATCH dispatchTable[IRP_MJ_MAXIMUM_FUNCTION+1];
+ NDIS_DEVICE_OBJECT_ATTRIBUTES deviceAttributes;
+ OVS_LOG_TRACE("ovsExtDriverHandle: %p", ovsExtDriverHandle);
+
+ RtlZeroMemory(dispatchTable,
+ (IRP_MJ_MAXIMUM_FUNCTION + 1) * sizeof (PDRIVER_DISPATCH));
+ dispatchTable[IRP_MJ_CREATE] = OvsOpenCloseDevice;
+ dispatchTable[IRP_MJ_CLOSE] = OvsOpenCloseDevice;
+ dispatchTable[IRP_MJ_CLEANUP] = OvsCleanupDevice;
+ dispatchTable[IRP_MJ_DEVICE_CONTROL] = OvsDeviceControl;
+
+ NdisInitUnicodeString(&deviceName, OVS_DEVICE_NAME_NT);
+ NdisInitUnicodeString(&symbolicDeviceName, OVS_DEVICE_NAME_DOS);
+
+ RtlZeroMemory(&deviceAttributes, sizeof (NDIS_DEVICE_OBJECT_ATTRIBUTES));
+
+ OVS_INIT_OBJECT_HEADER(&deviceAttributes.Header,
+ NDIS_OBJECT_TYPE_DEVICE_OBJECT_ATTRIBUTES,
+ NDIS_DEVICE_OBJECT_ATTRIBUTES_REVISION_1,
+ sizeof (NDIS_DEVICE_OBJECT_ATTRIBUTES));
+
+ deviceAttributes.DeviceName = &deviceName;
+ deviceAttributes.SymbolicName = &symbolicDeviceName;
+ deviceAttributes.MajorFunctions = dispatchTable;
+ deviceAttributes.ExtensionSize = sizeof (OVS_DEVICE_EXTENSION);
+
+ status = NdisRegisterDeviceEx(ovsExtDriverHandle,
+ &deviceAttributes,
+ &gOvsDeviceObject,
+ &gOvsDeviceHandle);
+ if (status != NDIS_STATUS_SUCCESS) {
+ POVS_DEVICE_EXTENSION ovsExt =
+ (POVS_DEVICE_EXTENSION)NdisGetDeviceReservedExtension(gOvsDeviceObject);
+ ASSERT(gOvsDeviceObject != NULL);
+ ASSERT(gOvsDeviceHandle != NULL);
+
+ if (ovsExt) {
+ ovsExt->numberOpenInstance = 0;
+ }
+ } else {
+ /* Initialize the associated data structures. */
+ OvsInit();
+ }
+ OVS_LOG_TRACE("DeviceObject: %p", gOvsDeviceObject);
+ return status;
+}
+
+
+VOID
+OvsDeleteDeviceObject()
+{
+ if (gOvsDeviceHandle) {
+#ifdef DBG
+ POVS_DEVICE_EXTENSION ovsExt = (POVS_DEVICE_EXTENSION)
+ NdisGetDeviceReservedExtension(gOvsDeviceObject);
+ if (ovsExt) {
+ ASSERT(ovsExt->numberOpenInstance == 0);
+ }
+#endif
+
+ ASSERT(gOvsDeviceObject);
+ NdisDeregisterDeviceEx(gOvsDeviceHandle);
+ gOvsDeviceHandle = NULL;
+ gOvsDeviceObject = NULL;
+ }
+ OvsCleanup();
+}
+
+POVS_OPEN_INSTANCE
+OvsGetOpenInstance(PFILE_OBJECT fileObject,
+ UINT32 dpNo)
+{
+ POVS_OPEN_INSTANCE instance = (POVS_OPEN_INSTANCE)fileObject->FsContext;
+ ASSERT(instance);
+ ASSERT(instance->fileObject == fileObject);
+ if (gOvsSwitchContext == NULL ||
+ gOvsSwitchContext->dpNo != dpNo) {
+ return NULL;
+ }
+ return instance;
+}
+
+
+POVS_OPEN_INSTANCE
+OvsFindOpenInstance(PFILE_OBJECT fileObject)
+{
+ UINT32 i, j;
+ for (i = 0, j = 0; i < OVS_MAX_OPEN_INSTANCES &&
+ j < ovsNumberOfOpenInstances; i++) {
+ if (ovsOpenInstanceArray[i]) {
+ if (ovsOpenInstanceArray[i]->fileObject == fileObject) {
+ return ovsOpenInstanceArray[i];
+ }
+ j++;
+ }
+ }
+ return NULL;
+}
+
+NTSTATUS
+OvsAddOpenInstance(PFILE_OBJECT fileObject)
+{
+ POVS_OPEN_INSTANCE instance =
+ (POVS_OPEN_INSTANCE) OvsAllocateMemory(sizeof (OVS_OPEN_INSTANCE));
+ UINT32 i;
+
+ if (instance == NULL) {
+ return STATUS_NO_MEMORY;
+ }
+ OvsAcquireCtrlLock();
+ ASSERT(OvsFindOpenInstance(fileObject) == NULL);
+
+ if (ovsNumberOfOpenInstances >= OVS_MAX_OPEN_INSTANCES) {
+ OvsReleaseCtrlLock();
+ OvsFreeMemory(instance);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+ RtlZeroMemory(instance, sizeof (OVS_OPEN_INSTANCE));
+
+ for (i = 0; i < OVS_MAX_OPEN_INSTANCES; i++) {
+ if (ovsOpenInstanceArray[i] == NULL) {
+ ovsOpenInstanceArray[i] = instance;
+ instance->cookie = i;
+ break;
+ }
+ }
+ ASSERT(i < OVS_MAX_OPEN_INSTANCES);
+ instance->fileObject = fileObject;
+ ASSERT(fileObject->FsContext == NULL);
+ fileObject->FsContext = instance;
+ OvsReleaseCtrlLock();
+ return STATUS_SUCCESS;
+}
+
+static VOID
+OvsCleanupOpenInstance(PFILE_OBJECT fileObject)
+{
+ POVS_OPEN_INSTANCE instance = (POVS_OPEN_INSTANCE)fileObject->FsContext;
+ ASSERT(instance);
+ ASSERT(fileObject == instance->fileObject);
+ OvsCleanupEvent(instance);
+ OvsCleanupPacketQueue(instance);
+}
+
+VOID
+OvsRemoveOpenInstance(PFILE_OBJECT fileObject)
+{
+ POVS_OPEN_INSTANCE instance;
+ ASSERT(fileObject->FsContext);
+ instance = (POVS_OPEN_INSTANCE)fileObject->FsContext;
+ ASSERT(instance->cookie < OVS_MAX_OPEN_INSTANCES);
+
+ OvsAcquireCtrlLock();
+ fileObject->FsContext = NULL;
+ ASSERT(ovsOpenInstanceArray[instance->cookie] == instance);
+ ovsOpenInstanceArray[instance->cookie] = NULL;
+ OvsReleaseCtrlLock();
+ ASSERT(instance->eventQueue == NULL);
+ ASSERT (instance->packetQueue == NULL);
+ OvsFreeMemory(instance);
+}
+
+NTSTATUS
+OvsCompleteIrpRequest(PIRP irp,
+ ULONG_PTR infoPtr,
+ NTSTATUS status)
+{
+ irp->IoStatus.Information = infoPtr;
+ irp->IoStatus.Status = status;
+ IoCompleteRequest(irp, IO_NO_INCREMENT);
+ return status;
+}
+
+
+NTSTATUS
+OvsOpenCloseDevice(PDEVICE_OBJECT deviceObject,
+ PIRP irp)
+{
+ PIO_STACK_LOCATION irpSp;
+ NTSTATUS status = STATUS_SUCCESS;
+ PFILE_OBJECT fileObject;
+ POVS_DEVICE_EXTENSION ovsExt =
+ (POVS_DEVICE_EXTENSION)NdisGetDeviceReservedExtension(deviceObject);
+
+ ASSERT(deviceObject == gOvsDeviceObject);
+ ASSERT(ovsExt != NULL);
+
+ irpSp = IoGetCurrentIrpStackLocation(irp);
+ fileObject = irpSp->FileObject;
+ OVS_LOG_TRACE("DeviceObject: %p, fileObject:%p, instance: %u",
+ deviceObject, fileObject,
+ ovsExt->numberOpenInstance);
+
+ switch (irpSp->MajorFunction) {
+ case IRP_MJ_CREATE:
+ status = OvsAddOpenInstance(fileObject);
+ if (STATUS_SUCCESS == status) {
+ InterlockedIncrement((LONG volatile *)&ovsExt->numberOpenInstance);
+ }
+ break;
+ case IRP_MJ_CLOSE:
+ ASSERT(ovsExt->numberOpenInstance > 0);
+ OvsRemoveOpenInstance(fileObject);
+ InterlockedDecrement((LONG volatile *)&ovsExt->numberOpenInstance);
+ break;
+ default:
+ ASSERT(0);
+ }
+ return OvsCompleteIrpRequest(irp, (ULONG_PTR)0, status);
+}
+
+_Use_decl_annotations_
+NTSTATUS
+OvsCleanupDevice(PDEVICE_OBJECT deviceObject,
+ PIRP irp)
+{
+
+ PIO_STACK_LOCATION irpSp;
+ PFILE_OBJECT fileObject;
+
+ NTSTATUS status = STATUS_SUCCESS;
+#ifdef DBG
+ POVS_DEVICE_EXTENSION ovsExt =
+ (POVS_DEVICE_EXTENSION)NdisGetDeviceReservedExtension(deviceObject);
+ if (ovsExt) {
+ ASSERT(ovsExt->numberOpenInstance > 0);
+ }
+#else
+ UNREFERENCED_PARAMETER(deviceObject);
+#endif
+ ASSERT(deviceObject == gOvsDeviceObject);
+ irpSp = IoGetCurrentIrpStackLocation(irp);
+ fileObject = irpSp->FileObject;
+
+ ASSERT(irpSp->MajorFunction == IRP_MJ_CLEANUP);
+
+ OvsCleanupOpenInstance(fileObject);
+
+ return OvsCompleteIrpRequest(irp, (ULONG_PTR)0, status);
+}
+
+
+/*
+ * --------------------------------------------------------------------------
+ * IOCTL function handler for the device.
+ * --------------------------------------------------------------------------
+ */
+NTSTATUS
+OvsDeviceControl(PDEVICE_OBJECT deviceObject,
+ PIRP irp)
+{
+
+ PIO_STACK_LOCATION irpSp;
+ NTSTATUS status = STATUS_SUCCESS;
+ PFILE_OBJECT fileObject;
+ PVOID inputBuffer;
+ PVOID outputBuffer;
+ UINT32 inputBufferLen, outputBufferLen;
+ UINT32 code, replyLen = 0;
+ POVS_OPEN_INSTANCE instance;
+
+#ifdef DBG
+ POVS_DEVICE_EXTENSION ovsExt =
+ (POVS_DEVICE_EXTENSION)NdisGetDeviceReservedExtension(deviceObject);
+ ASSERT(deviceObject == gOvsDeviceObject);
+ ASSERT(ovsExt);
+ ASSERT(ovsExt->numberOpenInstance > 0);
+#else
+ UNREFERENCED_PARAMETER(deviceObject);
+#endif
+
+ irpSp = IoGetCurrentIrpStackLocation(irp);
+
+ ASSERT(irpSp->MajorFunction == IRP_MJ_DEVICE_CONTROL);
+ ASSERT(irpSp->FileObject != NULL);
+
+ fileObject = irpSp->FileObject;
+ instance = (POVS_OPEN_INSTANCE)fileObject->FsContext;
+ code = irpSp->Parameters.DeviceIoControl.IoControlCode;
+ inputBufferLen = irpSp->Parameters.DeviceIoControl.InputBufferLength;
+ outputBufferLen = irpSp->Parameters.DeviceIoControl.OutputBufferLength;
+ outputBuffer = inputBuffer = irp->AssociatedIrp.SystemBuffer;
+
+ return OvsCompleteIrpRequest(irp, (ULONG_PTR)replyLen, status);
+}
+
+#endif /* OVS_USE_NL_INTERFACE */
diff --git a/datapath-windows/ovsext/Datapath.h b/datapath-windows/ovsext/Datapath.h
new file mode 100644
index 000000000..b68010bcf
--- /dev/null
+++ b/datapath-windows/ovsext/Datapath.h
@@ -0,0 +1,57 @@
+/*
+ * 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.
+ */
+
+/*
+ * XXX: OVS_USE_NL_INTERFACE is being used to keep the legacy DPIF interface
+ * alive while we transition over to the netlink based interface.
+ * OVS_USE_NL_INTERFACE = 0 => legacy inteface to use with dpif-windows.c
+ * OVS_USE_NL_INTERFACE = 1 => netlink inteface to use with ported dpif-linux.c
+ */
+#if defined OVS_USE_NL_INTERFACE && OVS_USE_NL_INTERFACE == 0
+#include "OvsIoctl.h"
+
+#else
+
+#ifndef __OVS_DATAPATH_H_
+#define __OVS_DATAPATH_H_ 1
+
+typedef struct _OVS_DEVICE_EXTENSION {
+ INT numberOpenInstance;
+ INT pidCount;
+} OVS_DEVICE_EXTENSION, *POVS_DEVICE_EXTENSION;
+
+
+/*
+ * Private context for each handle on the device.
+ */
+typedef struct _OVS_OPEN_INSTANCE {
+ UINT32 cookie;
+ PFILE_OBJECT fileObject;
+ PVOID eventQueue;
+ PVOID packetQueue;
+} OVS_OPEN_INSTANCE, *POVS_OPEN_INSTANCE;
+
+NDIS_STATUS OvsCreateDeviceObject(NDIS_HANDLE ovsExtDriverHandle);
+VOID OvsDeleteDeviceObject();
+
+POVS_OPEN_INSTANCE OvsGetOpenInstance(PFILE_OBJECT fileObject,
+ UINT32 dpNo);
+
+NTSTATUS OvsCompleteIrpRequest(PIRP irp, ULONG_PTR infoPtr, NTSTATUS status);
+
+#endif /* __OVS_DATAPATH_H_ */
+
+#endif /* OVS_USE_NL_INTERFACE */
diff --git a/datapath-windows/ovsext/OvsActions.c b/datapath-windows/ovsext/OvsActions.c
index 635becc65..d62f2a72a 100644
--- a/datapath-windows/ovsext/OvsActions.c
+++ b/datapath-windows/ovsext/OvsActions.c
@@ -16,7 +16,6 @@
#include "precomp.h"
-#include "OvsIoctl.h"
#include "OvsSwitch.h"
#include "OvsVport.h"
#include "OvsEvent.h"
diff --git a/datapath-windows/ovsext/OvsDebug.h b/datapath-windows/ovsext/OvsDebug.h
index 3705d1e9b..6941f1372 100644
--- a/datapath-windows/ovsext/OvsDebug.h
+++ b/datapath-windows/ovsext/OvsDebug.h
@@ -33,7 +33,7 @@
#define OVS_DBG_GRE BIT32(13)
#define OVS_DBG_GRE64 BIT32(14)
#define OVS_DBG_ACTION BIT32(15)
-#define OVS_DBG_IOCTL BIT32(16)
+#define OVS_DBG_DATAPATH BIT32(16)
#define OVS_DBG_PROPERTY BIT32(17)
#define OVS_DBG_IPHELPER BIT32(18)
#define OVS_DBG_BUFMGMT BIT32(19)
diff --git a/datapath-windows/ovsext/OvsDriver.c b/datapath-windows/ovsext/OvsDriver.c
index 7b57fbd6a..11632217a 100644
--- a/datapath-windows/ovsext/OvsDriver.c
+++ b/datapath-windows/ovsext/OvsDriver.c
@@ -16,7 +16,7 @@
#include "precomp.h"
#include "OvsSwitch.h"
-#include "OvsIoctl.h"
+#include "Datapath.h"
#ifdef OVS_DBG_MOD
#undef OVS_DBG_MOD
diff --git a/datapath-windows/ovsext/OvsEvent.c b/datapath-windows/ovsext/OvsEvent.c
index a75b2bd2a..d324bc606 100644
--- a/datapath-windows/ovsext/OvsEvent.c
+++ b/datapath-windows/ovsext/OvsEvent.c
@@ -16,7 +16,7 @@
#include "precomp.h"
-#include "OvsIoctl.h"
+#include "Datapath.h"
#include "OvsSwitch.h"
#include "OvsVport.h"
#include "OvsEvent.h"
diff --git a/datapath-windows/ovsext/OvsFlow.c b/datapath-windows/ovsext/OvsFlow.c
index daa64e007..4e31f17c3 100644
--- a/datapath-windows/ovsext/OvsFlow.c
+++ b/datapath-windows/ovsext/OvsFlow.c
@@ -32,6 +32,7 @@
extern PNDIS_SPIN_LOCK gOvsCtrlLock;
extern POVS_SWITCH_CONTEXT gOvsSwitchContext;
+extern UINT64 ovsTimeIncrementPerTick;
static NTSTATUS ReportFlowInfo(OvsFlow *flow, UINT32 getFlags,
UINT32 getActionsLen, OvsFlowInfo *info);
@@ -142,7 +143,6 @@ OvsFlowUsed(OvsFlow *flow,
KeQueryTickCount(&tickCount);
flow->used = tickCount.QuadPart * ovsTimeIncrementPerTick;
- flow->used += ovsUserTimestampDelta;
flow->packetCount++;
flow->byteCount += OvsPacketLenNBL(packet);
flow->tcpFlags |= OvsGetTcpFlags(packet, &flow->key, layers);
diff --git a/datapath-windows/ovsext/OvsIoctl.c b/datapath-windows/ovsext/OvsIoctl.c
index 893cbf744..ef4864dd8 100644
--- a/datapath-windows/ovsext/OvsIoctl.c
+++ b/datapath-windows/ovsext/OvsIoctl.c
@@ -14,6 +14,14 @@
* limitations under the License.
*/
+/*
+ * XXX: OVS_USE_NL_INTERFACE is being used to keep the legacy DPIF interface
+ * alive while we transition over to the netlink based interface.
+ * OVS_USE_NL_INTERFACE = 0 => legacy inteface to use with dpif-windows.c
+ * OVS_USE_NL_INTERFACE = 1 => netlink inteface to use with ported dpif-linux.c
+ */
+#if defined OVS_USE_NL_INTERFACE && OVS_USE_NL_INTERFACE == 0
+
#include "precomp.h"
#include "OvsIoctl.h"
#include "OvsJhash.h"
@@ -29,7 +37,7 @@
#ifdef OVS_DBG_MOD
#undef OVS_DBG_MOD
#endif
-#define OVS_DBG_MOD OVS_DBG_IOCTL
+#define OVS_DBG_MOD OVS_DBG_DATAPATH
#include "OvsDebug.h"
/* Handles to the device object for communication with userspace. */
@@ -756,3 +764,5 @@ OvsDeviceControl(PDEVICE_OBJECT deviceObject,
return OvsCompleteIrpRequest(irp, (ULONG_PTR)replyLen, status);
}
}
+
+#endif /* OVS_USE_NL_INTERFACE */
diff --git a/datapath-windows/ovsext/OvsIoctl.h b/datapath-windows/ovsext/OvsIoctl.h
index 9f2bf8599..5487694c7 100644
--- a/datapath-windows/ovsext/OvsIoctl.h
+++ b/datapath-windows/ovsext/OvsIoctl.h
@@ -14,6 +14,14 @@
* limitations under the License.
*/
+/*
+ * XXX: OVS_USE_NL_INTERFACE is being used to keep the legacy DPIF interface
+ * alive while we transition over to the netlink based interface.
+ * OVS_USE_NL_INTERFACE = 0 => legacy inteface to use with dpif-windows.c
+ * OVS_USE_NL_INTERFACE = 1 => netlink inteface to use with ported dpif-linux.c
+ */
+#if defined OVS_USE_NL_INTERFACE && OVS_USE_NL_INTERFACE == 0
+
#ifndef __OVS_IOCTL_H_
#define __OVS_IOCTL_H_ 1
@@ -38,3 +46,5 @@ POVS_OPEN_INSTANCE OvsGetOpenInstance(PFILE_OBJECT fileObject,
NTSTATUS OvsCompleteIrpRequest(PIRP irp, ULONG_PTR infoPtr, NTSTATUS status);
#endif /* __OVS_IOCTL_H_ */
+
+#endif /* OVS_USE_NL_INTERFACE */
diff --git a/datapath-windows/ovsext/OvsOid.c b/datapath-windows/ovsext/OvsOid.c
index 487191ad1..ad66be4c0 100644
--- a/datapath-windows/ovsext/OvsOid.c
+++ b/datapath-windows/ovsext/OvsOid.c
@@ -15,7 +15,6 @@
*/
#include "precomp.h"
-#include "OvsIoctl.h"
#include "OvsSwitch.h"
#include "OvsVport.h"
#include "OvsNetProto.h"
diff --git a/datapath-windows/ovsext/OvsPacketIO.c b/datapath-windows/ovsext/OvsPacketIO.c
index 39e57036e..6017f3081 100644
--- a/datapath-windows/ovsext/OvsPacketIO.c
+++ b/datapath-windows/ovsext/OvsPacketIO.c
@@ -20,7 +20,6 @@
*/
#include "precomp.h"
-#include "OvsIoctl.h"
#include "OvsSwitch.h"
#include "OvsVport.h"
#include "OvsNetProto.h"
diff --git a/datapath-windows/ovsext/OvsSwitch.c b/datapath-windows/ovsext/OvsSwitch.c
index 97ce2aec9..f548599d3 100644
--- a/datapath-windows/ovsext/OvsSwitch.c
+++ b/datapath-windows/ovsext/OvsSwitch.c
@@ -21,7 +21,6 @@
#include "precomp.h"
-#include "OvsIoctl.h"
#include "OvsSwitch.h"
#include "OvsVport.h"
#include "OvsEvent.h"
@@ -38,6 +37,8 @@
POVS_SWITCH_CONTEXT gOvsSwitchContext;
BOOLEAN gOvsInAttach;
+UINT64 ovsTimeIncrementPerTick;
+
extern PNDIS_SPIN_LOCK gOvsCtrlLock;
extern NDIS_HANDLE gOvsExtDriverHandle;
extern NDIS_HANDLE gOvsExtDriverObject;
diff --git a/datapath-windows/ovsext/OvsTunnel.c b/datapath-windows/ovsext/OvsTunnel.c
index b5a369a9d..d0288cc7f 100644
--- a/datapath-windows/ovsext/OvsTunnel.c
+++ b/datapath-windows/ovsext/OvsTunnel.c
@@ -31,7 +31,6 @@
#include <fwpmk.h>
#include "OvsTunnel.h"
-#include "OvsIoctl.h"
#include "OvsSwitch.h"
#include "OvsVport.h"
#include "OvsEvent.h"
diff --git a/datapath-windows/ovsext/OvsUser.c b/datapath-windows/ovsext/OvsUser.c
index 5093f202a..9fafb1620 100644
--- a/datapath-windows/ovsext/OvsUser.c
+++ b/datapath-windows/ovsext/OvsUser.c
@@ -22,7 +22,7 @@
#include "precomp.h"
-#include "OvsIoctl.h"
+#include "Datapath.h"
#include "OvsSwitch.h"
#include "OvsVport.h"
#include "OvsEvent.h"
diff --git a/datapath-windows/ovsext/OvsVport.c b/datapath-windows/ovsext/OvsVport.c
index 35bdaea7b..0c00e5268 100644
--- a/datapath-windows/ovsext/OvsVport.c
+++ b/datapath-windows/ovsext/OvsVport.c
@@ -15,7 +15,6 @@
*/
#include "precomp.h"
-#include "OvsIoctl.h"
#include "OvsJhash.h"
#include "OvsSwitch.h"
#include "OvsVport.h"
diff --git a/datapath-windows/ovsext/OvsVxlan.c b/datapath-windows/ovsext/OvsVxlan.c
index 63909aeed..db1909e15 100644
--- a/datapath-windows/ovsext/OvsVxlan.c
+++ b/datapath-windows/ovsext/OvsVxlan.c
@@ -16,7 +16,6 @@
#include "precomp.h"
#include "OvsNetProto.h"
-#include "OvsIoctl.h"
#include "OvsSwitch.h"
#include "OvsVport.h"
#include "OvsFlow.h"
diff --git a/datapath-windows/ovsext/ovsext.vcxproj b/datapath-windows/ovsext/ovsext.vcxproj
index 4febef679..5ecc81a24 100644
--- a/datapath-windows/ovsext/ovsext.vcxproj
+++ b/datapath-windows/ovsext/ovsext.vcxproj
@@ -74,6 +74,7 @@
<ClInclude Include="OvsAtomic.h" />
<ClInclude Include="OvsBufferMgmt.h" />
<ClInclude Include="OvsChecksum.h" />
+ <ClInclude Include="Datapath.h" />
<ClInclude Include="OvsDebug.h" />
<ClInclude Include="OvsEth.h" />
<ClInclude Include="OvsEvent.h" />
@@ -99,7 +100,7 @@
</PropertyGroup>
<ItemDefinitionGroup>
<ClCompile>
- <PreprocessorDefinitions>%(PreprocessorDefinitions);NDIS_WDM=1;NDIS630=1;OVS_WIN_DP=1</PreprocessorDefinitions>
+ <PreprocessorDefinitions>%(PreprocessorDefinitions);NDIS_WDM=1;NDIS630=1;OVS_WIN_DP=1;OVS_USE_NL_INTERFACE=0</PreprocessorDefinitions>
</ClCompile>
<Midl>
<PreprocessorDefinitions>%(PreprocessorDefinitions);NDIS_WDM=1;NDIS630=1</PreprocessorDefinitions>
@@ -124,6 +125,7 @@
</ClCompile>
</ItemDefinitionGroup>
<ItemGroup>
+ <ClCompile Include="Datapath.c" />
<ClCompile Include="OvsDriver.c" />
<ClCompile Include="OvsJhash.c" />
<ClCompile Include="OvsOid.c" />
diff --git a/datapath-windows/ovsext/precomp.h b/datapath-windows/ovsext/precomp.h
index ec4a6217f..5f23d02b3 100644
--- a/datapath-windows/ovsext/precomp.h
+++ b/datapath-windows/ovsext/precomp.h
@@ -29,3 +29,6 @@
* include/linux is pending discussion.
*/
#include "..\include\OvsDpInterface.h"
+#if defined OVS_USE_NL_INTERFACE && OVS_USE_NL_INTERFACE == 1
+#include "..\include\OvsDpInterfaceExt.h"
+#endif