#include "precomp.h"
-#include "Datapath.h"
#include "Switch.h"
+#include "User.h"
+#include "Datapath.h"
#include "Vport.h"
#include "Event.h"
#include "Debug.h"
LIST_ENTRY ovsEventQueue;
+static NDIS_SPIN_LOCK eventQueueLock;
UINT32 ovsNumEventQueue;
UINT32 ovsNumPollAll;
-extern PNDIS_SPIN_LOCK gOvsCtrlLock;
-
NTSTATUS
OvsInitEventQueue()
{
InitializeListHead(&ovsEventQueue);
+ NdisAllocateSpinLock(&eventQueueLock);
return STATUS_SUCCESS;
}
{
ASSERT(IsListEmpty(&ovsEventQueue));
ASSERT(ovsNumEventQueue == 0);
+ NdisFreeSpinLock(&eventQueueLock);
}
static __inline VOID
OvsAcquireEventQueueLock()
{
- NdisAcquireSpinLock(gOvsCtrlLock);
+ NdisAcquireSpinLock(&eventQueueLock);
}
static __inline VOID
OvsReleaseEventQueueLock()
{
- NdisReleaseSpinLock(gOvsCtrlLock);
+ NdisReleaseSpinLock(&eventQueueLock);
}
/*
return status;
}
+#if defined OVS_USE_NL_INTERFACE && OVS_USE_NL_INTERFACE == 0
/*
* --------------------------------------------------------------------------
* Poll event queued in the event queue. always synchronous.
OVS_LOG_TRACE("Exit: numEventPolled: %d", numEntry);
return STATUS_SUCCESS;
}
+#endif /* OVS_USE_NL_INTERFACE */
/*
}
queue = (POVS_EVENT_QUEUE)instance->eventQueue;
+ if (queue == NULL) {
+ OvsReleaseEventQueueLock();
+ OVS_LOG_TRACE("Exit: Event queue does not exist");
+ return STATUS_INVALID_PARAMETER;
+ }
if (queue->pendingIrp) {
OvsReleaseEventQueueLock();
OVS_LOG_TRACE("Exit: Event queue already in pending state");
OVS_LOG_TRACE("Exit: return status: %#x", status);
return status;
}
+
+/*
+ *--------------------------------------------------------------------------
+ * Poll event queued in the event queue.always synchronous.
+ *
+ * Results:
+ * STATUS_SUCCESS event was dequeued
+ * STATUS_UNSUCCESSFUL the queue is empty.
+ * --------------------------------------------------------------------------
+ */
+NTSTATUS
+OvsRemoveEventEntry(POVS_OPEN_INSTANCE instance,
+ POVS_EVENT_ENTRY entry)
+{
+ NTSTATUS status = STATUS_UNSUCCESSFUL;
+ POVS_EVENT_QUEUE queue;
+ POVS_EVENT_QUEUE_ELEM elem;
+
+ OvsAcquireEventQueueLock();
+
+ queue = (POVS_EVENT_QUEUE)instance->eventQueue;
+
+ if (queue == NULL) {
+ ASSERT(queue);
+ goto remove_event_done;
+ }
+
+ if (queue->numElems) {
+ elem = (POVS_EVENT_QUEUE_ELEM)RemoveHeadList(&queue->elemList);
+ entry->portNo = elem->portNo;
+ entry->status = elem->status;
+ OvsFreeMemory(elem);
+ queue->numElems--;
+ status = STATUS_SUCCESS;
+ }
+
+remove_event_done:
+ OvsReleaseEventQueueLock();
+ return status;
+}