[ovs-dev] [PATCH v1 1/6] datapath-windows: Transactional error support in Flow commands.
Ankur Sharma
ankursharma at vmware.com
Fri Oct 10 06:02:19 UTC 2014
In this patch we added the code to handle transactional errors
in flow commands.
Signed-off-by: Ankur Sharma <ankursharma at vmware.com>
---
datapath-windows/ovsext/Flow.c | 54 +++++++++++++++++++-------
datapath-windows/ovsext/Netlink/NetlinkError.h | 32 ++++++++++++++-
2 files changed, 70 insertions(+), 16 deletions(-)
diff --git a/datapath-windows/ovsext/Flow.c b/datapath-windows/ovsext/Flow.c
index 50fa954..5ed5c18 100644
--- a/datapath-windows/ovsext/Flow.c
+++ b/datapath-windows/ovsext/Flow.c
@@ -261,6 +261,7 @@ OvsFlowNlCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
OvsFlowPut mappedFlow;
OvsFlowStats stats;
struct ovs_flow_stats replyStats;
+ NL_ERROR nlError = NL_ERROR_SUCCESS;
NL_BUFFER nlBuf;
@@ -276,7 +277,7 @@ OvsFlowNlCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
!= TRUE) {
OVS_LOG_ERROR("Attr Parsing failed for msg: %p",
nlMsgHdr);
- rc = STATUS_UNSUCCESSFUL;
+ rc = STATUS_INVALID_PARAMETER;
goto done;
}
@@ -287,7 +288,7 @@ OvsFlowNlCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
goto done;
}
- if ((_MapNlToFlowPut(msgIn, nlAttrs[OVS_FLOW_ATTR_KEY],
+ if ((rc = _MapNlToFlowPut(msgIn, nlAttrs[OVS_FLOW_ATTR_KEY],
nlAttrs[OVS_FLOW_ATTR_ACTIONS], nlAttrs[OVS_FLOW_ATTR_CLEAR],
&mappedFlow))
!= STATUS_SUCCESS) {
@@ -326,7 +327,7 @@ OvsFlowNlCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
if (!NlMsgPutTailUnspec(&nlBuf, OVS_FLOW_ATTR_STATS,
(PCHAR)(&replyStats), sizeof(replyStats))) {
OVS_LOG_ERROR("Adding OVS_FLOW_ATTR_STATS attribute failed.");
- rc = STATUS_UNSUCCESSFUL;
+ rc = STATUS_INVALID_BUFFER_SIZE;
goto done;
}
@@ -334,7 +335,17 @@ OvsFlowNlCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
*replyLen = msgOut->nlMsg.nlmsgLen;
done:
- return rc;
+ nlError = NlErrMapStatus(rc);
+
+ if ((nlError != NL_ERROR_SUCCESS) &&
+ (usrParamsCtx->outputBuffer)) {
+ POVS_MESSAGE_ERROR msgError = (POVS_MESSAGE_ERROR)
+ usrParamsCtx->outputBuffer;
+ BuildErrorMsg(msgIn, msgError, nlError);
+ *replyLen = msgError->nlMsg.nlmsgLen;
+ }
+
+ return STATUS_SUCCESS;
}
/*
@@ -348,6 +359,9 @@ OvsFlowNlGetCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
UINT32 *replyLen)
{
NTSTATUS rc = STATUS_SUCCESS;
+ NL_ERROR nlError = NL_ERROR_SUCCESS;
+ POVS_MESSAGE msgIn = (POVS_MESSAGE)usrParamsCtx->inputBuffer;
+
*replyLen = 0;
if (usrParamsCtx->devOp == OVS_TRANSACTION_DEV_OP) {
@@ -356,7 +370,17 @@ OvsFlowNlGetCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
rc = _FlowNlDumpCmdHandler(usrParamsCtx, replyLen);
}
- return rc;
+ nlError = NlErrMapStatus(rc);
+
+ if ((nlError != NL_ERROR_SUCCESS) &&
+ (usrParamsCtx->outputBuffer)) {
+ POVS_MESSAGE_ERROR msgError = (POVS_MESSAGE_ERROR)
+ usrParamsCtx->outputBuffer;
+ BuildErrorMsg(msgIn, msgError, nlError);
+ *replyLen = msgError->nlMsg.nlmsgLen;
+ }
+
+ return STATUS_SUCCESS;
}
/*
@@ -410,7 +434,7 @@ _FlowNlGetCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
!= TRUE) {
OVS_LOG_ERROR("Attr Parsing failed for msg: %p",
nlMsgHdr);
- rc = STATUS_UNSUCCESSFUL;
+ rc = STATUS_INVALID_PARAMETER;
goto done;
}
@@ -424,7 +448,7 @@ _FlowNlGetCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
!= TRUE) {
OVS_LOG_ERROR("Key Attr Parsing failed for msg: %p",
nlMsgHdr);
- rc = STATUS_UNSUCCESSFUL;
+ rc = STATUS_INVALID_PARAMETER;
goto done;
}
@@ -441,7 +465,7 @@ _FlowNlGetCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
!= TRUE) {
OVS_LOG_ERROR("Tunnel key Attr Parsing failed for msg: %p",
nlMsgHdr);
- rc = STATUS_UNSUCCESSFUL;
+ rc = STATUS_INVALID_PARAMETER;
goto done;
}
}
@@ -657,19 +681,19 @@ _MapFlowStatsToNlStats(PNL_BUFFER nlBuf, OvsFlowStats *flowStats)
replyStats.n_bytes = flowStats->byteCount;
if (!NlMsgPutTailU64(nlBuf, OVS_FLOW_ATTR_USED, flowStats->used)) {
- rc = STATUS_UNSUCCESSFUL;
+ rc = STATUS_INVALID_BUFFER_SIZE;
goto done;
}
if (!NlMsgPutTailUnspec(nlBuf, OVS_FLOW_ATTR_STATS,
(PCHAR)(&replyStats),
sizeof(struct ovs_flow_stats))) {
- rc = STATUS_UNSUCCESSFUL;
+ rc = STATUS_INVALID_BUFFER_SIZE;
goto done;
}
if (!NlMsgPutTailU8(nlBuf, OVS_FLOW_ATTR_TCP_FLAGS, flowStats->tcpFlags)) {
- rc = STATUS_UNSUCCESSFUL;
+ rc = STATUS_INVALID_BUFFER_SIZE;
goto done;
}
@@ -693,13 +717,13 @@ _MapFlowActionToNlAction(PNL_BUFFER nlBuf, uint32_t actionsLen,
offset = NlMsgStartNested(nlBuf, OVS_FLOW_ATTR_ACTIONS);
if (!offset) {
/* Starting the nested attribute failed. */
- rc = STATUS_UNSUCCESSFUL;
+ rc = STATUS_INVALID_BUFFER_SIZE;
goto error_nested_start;
}
if (!NlBufCopyAtTail(nlBuf, (PCHAR)actions, actionsLen)) {
/* Adding a nested attribute failed. */
- rc = STATUS_UNSUCCESSFUL;
+ rc = STATUS_INVALID_BUFFER_SIZE;
goto done;
}
@@ -1118,7 +1142,7 @@ _MapNlToFlowPut(POVS_MESSAGE msgIn, PNL_ATTR keyAttr,
!= TRUE) {
OVS_LOG_ERROR("Key Attr Parsing failed for msg: %p",
nlMsgHdr);
- rc = STATUS_UNSUCCESSFUL;
+ rc = STATUS_INVALID_PARAMETER;
goto done;
}
@@ -1137,7 +1161,7 @@ _MapNlToFlowPut(POVS_MESSAGE msgIn, PNL_ATTR keyAttr,
!= TRUE) {
OVS_LOG_ERROR("Tunnel key Attr Parsing failed for msg: %p",
nlMsgHdr);
- rc = STATUS_UNSUCCESSFUL;
+ rc = STATUS_INVALID_PARAMETER;
goto done;
}
}
diff --git a/datapath-windows/ovsext/Netlink/NetlinkError.h b/datapath-windows/ovsext/Netlink/NetlinkError.h
index 6947b7c..3289184 100644
--- a/datapath-windows/ovsext/Netlink/NetlinkError.h
+++ b/datapath-windows/ovsext/Netlink/NetlinkError.h
@@ -5,7 +5,7 @@
* 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
+* 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,
@@ -197,4 +197,34 @@ typedef enum _NL_ERROR_
NL_ERROR_TXTBSY = ((ULONG)-139),
/*the operation would block */
NL_ERROR_WOULDBLOCK = ((ULONG)-140),
+ /* parsing failed */
+ NL_ERROR_PARSEFAIL = ((ULONG)-141)
} NL_ERROR;
+
+static __inline NL_ERROR
+NlErrMapStatus(NTSTATUS input)
+{
+ NL_ERROR ret = NL_ERROR_SUCCESS;
+
+ switch (input) {
+
+ case STATUS_SUCCESS:
+ ret = NL_ERROR_SUCCESS;
+ break;
+ case STATUS_INVALID_PARAMETER:
+ case STATUS_INFO_LENGTH_MISMATCH:
+ ret = NL_ERROR_INVAL;
+ break;
+ case STATUS_INVALID_BUFFER_SIZE:
+ ret = NL_ERROR_NOBUFS;
+ break;
+ /* We want to make sure that an error case
+ * is not treated as success. Hence default
+ * is NL_ERROR_PARSEFAIL rather then NL_ERROR_SUCCESS. */
+ default:
+ ret = NL_ERROR_PARSEFAIL;
+ break;
+ }
+
+ return ret;
+}
--
1.9.1
More information about the dev
mailing list