[ovs-dev] [PATCH 2/4] datapath-windows: Add OvsDatapath.[ch] and OVS_USE_NL_INTERFACE CPP

Saurabh Shah ssaurabh at vmware.com
Fri Aug 15 00:08:38 UTC 2014


Naming the file OvsIoctl.[ch] seems much clearer to me. I don't know why these files are being renamed. Also, if these are not going to be shared with the userspace, you should drop the Ovs prefix from the file name.

Thanks,
Saurabh

> -----Original Message-----
> From: dev [mailto:dev-bounces at openvswitch.org] On Behalf Of Nithin Raju
> Sent: Wednesday, August 13, 2014 7:12 PM
> To: dev at openvswitch.org
> Subject: [ovs-dev] [PATCH 2/4] datapath-windows: Add OvsDatapath.[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
> OvsDatpath.[ch]. We are not deleting OvsIoctl.[ch] yet. OvsDatapath.[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 OvsDatapath.[ch] are minimal. In the next change, we'll turn it to 1.
> 
> Since OvsDatapath.[ch] containes code copied from OvsIoctl.[ch], acking the
> original author as well.
> 
> Signed-off-by: Nithin Raju <nithin at vmware.com>
> Co-authored-by: Guolin Yang <gyang at vmware.com>
> ---
>  datapath-windows/ovsext/OvsActions.c               |    1 -
>  datapath-windows/ovsext/OvsDatapath.c              |  407
> ++++++++++++++++++++
>  .../ovsext/{OvsIoctl.h => OvsDatapath.h}           |   23 +-
>  datapath-windows/ovsext/OvsDebug.h                 |    2 +-
>  datapath-windows/ovsext/OvsDriver.c                |    2 +-
>  datapath-windows/ovsext/OvsEvent.c                 |    2 +-
>  datapath-windows/ovsext/OvsFlow.c                  |    2 +-
>  datapath-windows/ovsext/OvsIoctl.c                 |   12 +-
>  datapath-windows/ovsext/OvsIoctl.h                 |   10 +
>  datapath-windows/ovsext/OvsOid.c                   |    1 -
>  datapath-windows/ovsext/OvsPacketIO.c              |    1 -
>  datapath-windows/ovsext/OvsSwitch.c                |    3 +-
>  datapath-windows/ovsext/OvsTunnel.c                |    1 -
>  datapath-windows/ovsext/OvsUser.c                  |    2 +-
>  datapath-windows/ovsext/OvsVport.c                 |    1 -
>  datapath-windows/ovsext/OvsVxlan.c                 |    1 -
>  datapath-windows/ovsext/ovsext.vcxproj             |    4 +-
>  datapath-windows/ovsext/precomp.h                  |    3 +
>  18 files changed, 461 insertions(+), 17 deletions(-)  create mode 100644
> datapath-windows/ovsext/OvsDatapath.c
>  copy datapath-windows/ovsext/{OvsIoctl.h => OvsDatapath.h} (66%)
> 
> diff --git a/datapath-windows/ovsext/OvsActions.c b/datapath-
> windows/ovsext/OvsActions.c
> index 635becc..d62f2a7 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/OvsDatapath.c b/datapath-
> windows/ovsext/OvsDatapath.c
> new file mode 100644
> index 0000000..3fa56eb
> --- /dev/null
> +++ b/datapath-windows/ovsext/OvsDatapath.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:
> + *
> + *
> https://urldefense.proofpoint.com/v1/url?u=http://www.apache.org/licens
> es/LICENSE-
> 2.0&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=pEkjsHfytvHEWufeZPp
> gqSOJMdMjuZPbesVsNhCUc0E%3D%0A&m=vLuWiu%2F9knaqn87Gg%2Bpm
> ny7OZOtS1X5oSH9akerUT4U%3D%0A&s=7b8e4c902f0f655168fa553654ce902
> dd3523b085b8d610ea2e616e00720dbee
> + *
> + * 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(gOvsDeviceO
> bject);
> +        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(deviceObje
> ct);
> +
> +    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/OvsIoctl.h b/datapath-
> windows/ovsext/OvsDatapath.h
> similarity index 66%
> copy from datapath-windows/ovsext/OvsIoctl.h
> copy to datapath-windows/ovsext/OvsDatapath.h
> index 9f2bf85..b68010b 100644
> --- a/datapath-windows/ovsext/OvsIoctl.h
> +++ b/datapath-windows/ovsext/OvsDatapath.h
> @@ -14,14 +14,29 @@
>   * limitations under the License.
>   */
> 
> -#ifndef __OVS_IOCTL_H_
> -#define __OVS_IOCTL_H_ 1
> +/*
> + * 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;
> @@ -37,4 +52,6 @@ POVS_OPEN_INSTANCE
> OvsGetOpenInstance(PFILE_OBJECT fileObject,
> 
>  NTSTATUS OvsCompleteIrpRequest(PIRP irp, ULONG_PTR infoPtr,
> NTSTATUS status);
> 
> -#endif /* __OVS_IOCTL_H_ */
> +#endif /* __OVS_DATAPATH_H_ */
> +
> +#endif /* OVS_USE_NL_INTERFACE */
> diff --git a/datapath-windows/ovsext/OvsDebug.h b/datapath-
> windows/ovsext/OvsDebug.h
> index 3705d1e..6941f13 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 7b57fbd..c36f753 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 "OvsDatapath.h"
> 
>  #ifdef OVS_DBG_MOD
>  #undef OVS_DBG_MOD
> diff --git a/datapath-windows/ovsext/OvsEvent.c b/datapath-
> windows/ovsext/OvsEvent.c
> index a75b2bd..328d98a 100644
> --- a/datapath-windows/ovsext/OvsEvent.c
> +++ b/datapath-windows/ovsext/OvsEvent.c
> @@ -16,7 +16,7 @@
> 
>  #include "precomp.h"
> 
> -#include "OvsIoctl.h"
> +#include "OvsDatapath.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 daa64e0..4e31f17 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 893cbf7..ef4864d 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 9f2bf85..5487694 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 487191a..ad66be4 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 39e5703..6017f30 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 97ce2ae..f548599 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 b5a369a..d0288cc 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 5093f20..45d0627 100644
> --- a/datapath-windows/ovsext/OvsUser.c
> +++ b/datapath-windows/ovsext/OvsUser.c
> @@ -22,7 +22,7 @@
> 
>  #include "precomp.h"
> 
> -#include "OvsIoctl.h"
> +#include "OvsDatapath.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 35bdaea..0c00e52 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 63909ae..db1909e 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 4febef6..57c725b 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="OvsDatapath.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;NDIS6
> 30=1;OVS_WIN_DP=1</PreprocessorDefinitions>
> +
> +
> <PreprocessorDefinitions>%(PreprocessorDefinitions);NDIS_WDM=1;NDIS6
> 30
> +
> =1;OVS_WIN_DP=1;OVS_USE_NL_INTERFACE=0</PreprocessorDefinitions>
>      </ClCompile>
>      <Midl>
> 
> <PreprocessorDefinitions>%(PreprocessorDefinitions);NDIS_WDM=1;NDIS6
> 30=1</PreprocessorDefinitions>
> @@ -124,6 +125,7 @@
>      </ClCompile>
>    </ItemDefinitionGroup>
>    <ItemGroup>
> +    <ClCompile Include="OvsDatapath.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 ec4a621..5f23d02 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
> --
> 1.7.4.1
> 
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> https://urldefense.proofpoint.com/v1/url?u=http://openvswitch.org/mailm
> an/listinfo/dev&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=pEkjsHfytv
> HEWufeZPpgqSOJMdMjuZPbesVsNhCUc0E%3D%0A&m=vLuWiu%2F9knaqn8
> 7Gg%2Bpmny7OZOtS1X5oSH9akerUT4U%3D%0A&s=89ff0a4fb03620486c60c6
> 89fd2f4753aa4604f79a618f06b268831c476afd06



More information about the dev mailing list