[ovs-dev] [PATCH v5 5/5] datapath-windows: Action not supported error handling

Ankur Sharma ankursharma at vmware.com
Wed Oct 15 22:54:54 UTC 2014


Added changes to support error handling for non supported actions.
Added changes in packet execute for sending transactional errors.

Signed-off-by: Ankur Sharma <ankursharma at vmware.com>
Acked-by: Nithin Raju <nithin at vmware.com>
---
 datapath-windows/ovsext/Actions.c              |  4 +--
 datapath-windows/ovsext/Netlink/NetlinkError.h | 17 ++++++++++++
 datapath-windows/ovsext/User.c                 | 38 ++++++++++++++++----------
 3 files changed, 41 insertions(+), 18 deletions(-)

diff --git a/datapath-windows/ovsext/Actions.c b/datapath-windows/ovsext/Actions.c
index 23de67e..408b9be 100644
--- a/datapath-windows/ovsext/Actions.c
+++ b/datapath-windows/ovsext/Actions.c
@@ -1526,10 +1526,8 @@ OvsActionsExecute(POVS_SWITCH_CONTEXT switchContext,
             break;
         }
         case OVS_ACTION_ATTR_SAMPLE:
-            break;
-        case OVS_ACTION_ATTR_UNSPEC:
-        case __OVS_ACTION_ATTR_MAX:
         default:
+            status = NDIS_STATUS_NOT_SUPPORTED;
             break;
         }
     }
diff --git a/datapath-windows/ovsext/Netlink/NetlinkError.h b/datapath-windows/ovsext/Netlink/NetlinkError.h
index c41414c..827fa8c 100644
--- a/datapath-windows/ovsext/Netlink/NetlinkError.h
+++ b/datapath-windows/ovsext/Netlink/NetlinkError.h
@@ -198,3 +198,20 @@ typedef enum _NL_ERROR_
     /*the operation would block */
     NL_ERROR_WOULDBLOCK = ((ULONG)-140),
 } NL_ERROR;
+
+static __inline
+NlMapStatusToNlErr(NTSTATUS status)
+{
+    NL_ERROR ret = NL_ERROR_SUCCESS;
+
+    switch (status)
+    {
+    case STATUS_NOT_SUPPORTED:
+      ret = NL_ERROR_NOTSUPP;
+      break;
+    default:
+      break;
+    }
+
+    return ret;
+}
diff --git a/datapath-windows/ovsext/User.c b/datapath-windows/ovsext/User.c
index 8400b83..f24c4e3 100644
--- a/datapath-windows/ovsext/User.c
+++ b/datapath-windows/ovsext/User.c
@@ -369,6 +369,7 @@ OvsNlExecuteCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
 
     status = OvsExecuteDpIoctl(&execute);
 
+    /* Default reply that we want to send */
     if (status == STATUS_SUCCESS) {
         NlBufInit(&nlBuf, usrParamsCtx->outputBuffer,
                   usrParamsCtx->outputLength);
@@ -382,20 +383,23 @@ OvsNlExecuteCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
         if (status == STATUS_SUCCESS) {
             *replyLen = msgOut->nlMsg.nlmsgLen;
         }
-    }
-
-    /* As of now there are no transactional errors in the implementation.
-     * Once we have them then we need to map status to correct
-     * nlError value, so that below mentioned code gets hit. */
-    if ((nlError != NL_ERROR_SUCCESS) &&
-        (usrParamsCtx->outputBuffer)) {
-
-        POVS_MESSAGE_ERROR msgError = (POVS_MESSAGE_ERROR)
-                                       usrParamsCtx->outputBuffer;
-        BuildErrorMsg(msgIn, msgError, nlError);
-        *replyLen = msgError->nlMsg.nlmsgLen;
-        status = STATUS_SUCCESS;
-        goto done;
+    } else {
+        /* Map NTSTATUS to NL_ERROR */
+        nlError = NlMapStatusToNlErr(status);
+
+        /* As of now there are no transactional errors in the implementation.
+         * Once we have them then we need to map status to correct
+         * nlError value, so that below mentioned code gets hit. */
+        if ((nlError != NL_ERROR_SUCCESS) &&
+            (usrParamsCtx->outputBuffer)) {
+
+            POVS_MESSAGE_ERROR msgError = (POVS_MESSAGE_ERROR)
+                                           usrParamsCtx->outputBuffer;
+            BuildErrorMsg(msgIn, msgError, nlError);
+            *replyLen = msgError->nlMsg.nlmsgLen;
+            status = STATUS_SUCCESS;
+            goto done;
+        }
     }
 
 done:
@@ -487,7 +491,11 @@ OvsExecuteDpIoctl(OvsPacketExecute *execute)
         NdisReleaseRWLock(gOvsSwitchContext->dispatchLock, &lockState);
     }
     if (ndisStatus != NDIS_STATUS_SUCCESS) {
-        status = STATUS_UNSUCCESSFUL;
+        if (ndisStatus == NDIS_STATUS_NOT_SUPPORTED) {
+            status = STATUS_NOT_SUPPORTED;
+        } else {
+            status = STATUS_UNSUCCESSFUL;
+        }
     }
 
     if (pNbl) {
-- 
1.9.1




More information about the dev mailing list