summaryrefslogtreecommitdiff
path: root/datapath-windows/ovsext/User.c
diff options
context:
space:
mode:
authorAnkur Sharma <ankursharma@vmware.com>2014-10-21 17:24:37 -0700
committerBen Pfaff <blp@nicira.com>2014-10-23 09:14:42 -0700
commit10023cb51bdfce031b33c1cec3953fefb0befb40 (patch)
tree59c708a26a16a6ef5d28410b860148bc36d71b23 /datapath-windows/ovsext/User.c
parent75752ef5e7e3ce70706074cae3ccf06c6871ed7e (diff)
downloadopenvswitch-10023cb51bdfce031b33c1cec3953fefb0befb40.tar.gz
datapath-windows: Calling OvsAddPidInstance and OvsDelPidInstance
Signed-off-by: Ankur Sharma <ankursharma@vmware.com> Acked-by: Sorin Vinturis <svinturis@cloudbasesolutions.com> Acked-by: Nithin Raju <nithin@vmware.com> Signed-off-by: Ben Pfaff <blp@nicira.com>
Diffstat (limited to 'datapath-windows/ovsext/User.c')
-rw-r--r--datapath-windows/ovsext/User.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/datapath-windows/ovsext/User.c b/datapath-windows/ovsext/User.c
index 3e6cda256..6bd702e87 100644
--- a/datapath-windows/ovsext/User.c
+++ b/datapath-windows/ovsext/User.c
@@ -135,9 +135,22 @@ OvsSubscribeDpIoctl(PVOID instanceP,
POVS_USER_PACKET_QUEUE queue;
POVS_OPEN_INSTANCE instance = (POVS_OPEN_INSTANCE)instanceP;
+ OvsAcquireCtrlLock();
+ if (!gOvsSwitchContext) {
+ OvsReleaseCtrlLock();
+ return STATUS_INVALID_PARAMETER;
+ }
+ OvsReleaseCtrlLock();
+
if (instance->packetQueue && !join) {
/* unsubscribe */
OvsCleanupPacketQueue(instance);
+
+ OvsAcquireCtrlLock();
+ /* Remove the instance from pidHashArray */
+ OvsDelPidInstance(gOvsSwitchContext, pid);
+ OvsReleaseCtrlLock();
+
} else if (instance->packetQueue == NULL && join) {
queue = (POVS_USER_PACKET_QUEUE) OvsAllocateMemory(sizeof *queue);
if (queue == NULL) {
@@ -153,10 +166,17 @@ OvsSubscribeDpIoctl(PVOID instanceP,
queue->instance = instance;
instance->packetQueue = queue;
NdisReleaseSpinLock(&queue->queueLock);
+
+ OvsAcquireCtrlLock();
+ /* Insert the instance to pidHashArray */
+ OvsAddPidInstance(gOvsSwitchContext, pid, instance);
+ OvsReleaseCtrlLock();
+
} else {
/* user mode should call only once for subscribe */
return STATUS_INVALID_PARAMETER;
}
+
return STATUS_SUCCESS;
}