diff options
author | Ankur Sharma <ankursharma@vmware.com> | 2014-10-11 15:07:36 -0700 |
---|---|---|
committer | Ben Pfaff <blp@nicira.com> | 2014-10-13 14:22:58 -0700 |
commit | 1cf78536901535d20b42e32ba71801998ddfae53 (patch) | |
tree | 6be424448a9d23568fd55c6d87b5389c86390d95 /datapath-windows/ovsext/Flow.c | |
parent | d752e05420405fe97b9861484efc767d4bb114c7 (diff) | |
download | openvswitch-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>
Diffstat (limited to 'datapath-windows/ovsext/Flow.c')
-rw-r--r-- | datapath-windows/ovsext/Flow.c | 66 |
1 files changed, 47 insertions, 19 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; } } |