summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnkur Sharma <ankursharma@vmware.com>2014-10-11 15:07:36 -0700
committerBen Pfaff <blp@nicira.com>2014-10-13 14:22:58 -0700
commit1cf78536901535d20b42e32ba71801998ddfae53 (patch)
tree6be424448a9d23568fd55c6d87b5389c86390d95
parentd752e05420405fe97b9861484efc767d4bb114c7 (diff)
downloadopenvswitch-1cf78536901535d20b42e32ba71801998ddfae53.tar.gz
datapath-windows: Transactional error support in Flow commands.
In this patch we added the code to handle transactional errors in flow commands. Signed-off-by: Ankur Sharma <ankursharma@vmware.com> Acked-by: Nithin Raju <nithin@vmware.com Signed-off-by: Ben Pfaff <blp@nicira.com>
-rw-r--r--datapath-windows/ovsext/Flow.c66
-rw-r--r--datapath-windows/ovsext/Netlink/NetlinkError.h2
2 files changed, 48 insertions, 20 deletions
diff --git a/datapath-windows/ovsext/Flow.c b/datapath-windows/ovsext/Flow.c
index 50fa954c1..61a1eda59 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;
@@ -270,13 +271,19 @@ OvsFlowNlCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
*replyLen = 0;
+ if (!(usrParamsCtx->outputBuffer)) {
+ /* No output buffer */
+ rc = STATUS_INVALID_BUFFER_SIZE;
+ goto done;
+ }
+
/* Get all the top level Flow attributes */
if ((NlAttrParse(nlMsgHdr, attrOffset, NlMsgAttrsLen(nlMsgHdr),
nlFlowPolicy, nlAttrs, ARRAY_SIZE(nlAttrs)))
!= TRUE) {
OVS_LOG_ERROR("Attr Parsing failed for msg: %p",
nlMsgHdr);
- rc = STATUS_UNSUCCESSFUL;
+ rc = STATUS_INVALID_PARAMETER;
goto done;
}
@@ -287,7 +294,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) {
@@ -302,12 +309,6 @@ OvsFlowNlCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
goto done;
}
- if (!(usrParamsCtx->outputBuffer)) {
- /* No output buffer */
- OVS_LOG_ERROR("outputBuffer NULL.");
- goto done;
- }
-
replyStats.n_packets = stats.packetCount;
replyStats.n_bytes = stats.byteCount;
@@ -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,6 +335,15 @@ OvsFlowNlCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
*replyLen = msgOut->nlMsg.nlmsgLen;
done:
+
+ 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 rc;
}
@@ -348,14 +358,32 @@ 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->outputBuffer)) {
+ /* No output buffer */
+ rc = STATUS_INVALID_BUFFER_SIZE;
+ goto done;
+ }
+
if (usrParamsCtx->devOp == OVS_TRANSACTION_DEV_OP) {
rc = _FlowNlGetCmdHandler(usrParamsCtx, replyLen);
} else {
rc = _FlowNlDumpCmdHandler(usrParamsCtx, replyLen);
}
+ if ((nlError != NL_ERROR_SUCCESS) &&
+ (usrParamsCtx->outputBuffer)) {
+ POVS_MESSAGE_ERROR msgError = (POVS_MESSAGE_ERROR)
+ usrParamsCtx->outputBuffer;
+ BuildErrorMsg(msgIn, msgError, nlError);
+ *replyLen = msgError->nlMsg.nlmsgLen;
+ }
+
+done:
return rc;
}
@@ -410,7 +438,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 +452,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 +469,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 +685,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 +721,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 +1146,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 +1165,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 6947b7c5b..c41414c05 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,