From d952b66885200627b70b24acde8fe81a7a31c7c1 Mon Sep 17 00:00:00 2001 From: Nithin Raju Date: Mon, 6 Oct 2014 13:07:22 -0700 Subject: [PATCH] datapath-windows: Some fixes in vport get code In this patch, we make some fixes in the vport get code as well as elevating some utility functions from static to non-static. Signed-off-by: Nithin Raju Acked-by: Ankur Sharma Acked-by: Alin Gabriel Serdean Tested-by: Alin Gabriel Serdean Signed-off-by: Ben Pfaff --- datapath-windows/ovsext/Datapath.c | 17 ++++++++++++----- datapath-windows/ovsext/Datapath.h | 9 +++++++++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/datapath-windows/ovsext/Datapath.c b/datapath-windows/ovsext/Datapath.c index b873b38f0ef..071007af3e4 100644 --- a/datapath-windows/ovsext/Datapath.c +++ b/datapath-windows/ovsext/Datapath.c @@ -1261,7 +1261,7 @@ OvsSetupDumpStart(POVS_USER_PARAMS_CONTEXT usrParamsCtx) static VOID BuildMsgOut(POVS_MESSAGE msgIn, POVS_MESSAGE msgOut, UINT16 type, - UINT32 length, UINT16 flags) + UINT32 length, UINT16 flags) { msgOut->nlMsg.nlmsgType = type; msgOut->nlMsg.nlmsgFlags = flags; @@ -1270,18 +1270,23 @@ BuildMsgOut(POVS_MESSAGE msgIn, POVS_MESSAGE msgOut, UINT16 type, msgOut->nlMsg.nlmsgLen = length; msgOut->genlMsg.cmd = msgIn->genlMsg.cmd; - msgOut->genlMsg.version = nlDatapathFamilyOps.version; + msgOut->genlMsg.version = msgIn->genlMsg.version; msgOut->genlMsg.reserved = 0; } -static VOID +/* + * XXX: should move out these functions to a Netlink.c or to a OvsMessage.c + * or even make them inlined functions in Datapath.h. Can be done after the + * first sprint once we have more code to refactor. + */ +VOID BuildReplyMsgFromMsgIn(POVS_MESSAGE msgIn, POVS_MESSAGE msgOut, UINT16 flags) { BuildMsgOut(msgIn, msgOut, msgIn->nlMsg.nlmsgType, sizeof(OVS_MESSAGE), flags); } -static VOID +VOID BuildErrorMsg(POVS_MESSAGE msgIn, POVS_MESSAGE_ERROR msgOut, UINT errorCode) { BuildMsgOut(msgIn, (POVS_MESSAGE)msgOut, NLMSG_ERROR, @@ -1538,6 +1543,7 @@ OvsGetVport(POVS_USER_PARAMS_CONTEXT usrParamsCtx, } OvsReleaseCtrlLock(); + NdisAcquireRWLockRead(gOvsSwitchContext->dispatchLock, &lockState, 0); if (vportAttrs[OVS_VPORT_ATTR_NAME] != NULL) { vport = OvsFindVportByOvsName(gOvsSwitchContext, NlAttrGet(vportAttrs[OVS_VPORT_ATTR_NAME]), @@ -1547,15 +1553,16 @@ OvsGetVport(POVS_USER_PARAMS_CONTEXT usrParamsCtx, NlAttrGetU32(vportAttrs[OVS_VPORT_ATTR_PORT_NO])); } else { nlError = NL_ERROR_INVAL; + NdisReleaseRWLock(gOvsSwitchContext->dispatchLock, &lockState); goto Cleanup; } if (!vport) { nlError = NL_ERROR_NODEV; + NdisReleaseRWLock(gOvsSwitchContext->dispatchLock, &lockState); goto Cleanup; } - NdisAcquireRWLockRead(gOvsSwitchContext->dispatchLock, &lockState, 0); status = OvsCreateMsgFromVport(vport, msgIn, usrParamsCtx->outputBuffer, usrParamsCtx->outputLength, gOvsSwitchContext->dpNo); diff --git a/datapath-windows/ovsext/Datapath.h b/datapath-windows/ovsext/Datapath.h index e3bb638b0e2..b9c74177539 100644 --- a/datapath-windows/ovsext/Datapath.h +++ b/datapath-windows/ovsext/Datapath.h @@ -92,6 +92,15 @@ POVS_OPEN_INSTANCE OvsGetOpenInstance(PFILE_OBJECT fileObject, NTSTATUS OvsCompleteIrpRequest(PIRP irp, ULONG_PTR infoPtr, NTSTATUS status); +VOID OvsAcquireCtrlLock(); +VOID OvsReleaseCtrlLock(); + +/* XXX: Move this to netlink.[ch] eventually. */ +VOID BuildReplyMsgFromMsgIn(POVS_MESSAGE msgIn, POVS_MESSAGE msgOut, + UINT16 flags); +VOID BuildErrorMsg(POVS_MESSAGE msgIn, POVS_MESSAGE_ERROR msgOut, + UINT errorCode); + /* * Utility structure and functions to collect in one place all the parameters * passed during a call from userspace.