[ovs-dev] [PATCH v2] datapath-windows: Fixed vport search functions

Sorin Vinturis svinturis at cloudbasesolutions.com
Fri Oct 24 08:33:20 UTC 2014


In OvsStartNBLIngress() function the vport is searched using the
OvsFindVportByPortIdAndNicIndex(), which browse the vports list to
find the appropriate vport, but also checks the externalVport and
internalVport vports from the switchContext. The searched vport
matches with the externalVport from the switch context. Later in the
code, the OvsCreateAndAddPackets() is called, which in turn calls
OvsCreateQueueNlPacket(), passing along the portNo on the stack, and
the vport is identified using the OvsFindVportByPortNo().

The problem I have found is that the OvsFindVportByPortNo() browse
through the vports list to find the searched vport, but does not check
the internalVport and externalVport vports from the switchContext.
Thus, the vport, identified by the OvsFindVportByPortIdAndNicIndex()
as being the externalVport, is not correctly identified using the
OvsFindVportByPortNo().

This patch adds the check against the externalVport and internalVport
also in the OvsFindVportByPortNo().

Signed-off-by: Sorin Vinturis <svinturis at cloudbasesolutions.com>
---
 datapath-windows/ovsext/Vport.c | 65 ++++++++++++++++++++++++-----------------
 1 file changed, 39 insertions(+), 26 deletions(-)

diff --git a/datapath-windows/ovsext/Vport.c b/datapath-windows/ovsext/Vport.c
index 0522cfd..9c9355a 100644
--- a/datapath-windows/ovsext/Vport.c
+++ b/datapath-windows/ovsext/Vport.c
@@ -465,18 +465,29 @@ POVS_VPORT_ENTRY
 OvsFindVportByPortNo(POVS_SWITCH_CONTEXT switchContext,
                      UINT32 portNo)
 {
-    POVS_VPORT_ENTRY vport;
-    PLIST_ENTRY head, link;
-    UINT32 hash = OvsJhashBytes((const VOID *)&portNo, sizeof(portNo),
-                                OVS_HASH_BASIS);
-    head = &(switchContext->portNoHashArray[hash & OVS_VPORT_MASK]);
-    LIST_FORALL(head, link) {
-        vport = CONTAINING_RECORD(link, OVS_VPORT_ENTRY, portNoLink);
-        if (vport->portNo == portNo) {
-            return vport;
+    POVS_VPORT_ENTRY vport = NULL;
+
+    if (portNo == switchContext->externalVport->portNo) {
+        vport = switchContext->externalVport;
+    }
+    else if (portNo == switchContext->internalVport->portNo) {
+        vport = switchContext->internalVport;
+    }
+    else {
+        PLIST_ENTRY head = NULL, link = NULL;
+        UINT32 hash = OvsJhashBytes((const VOID *)&portNo, sizeof(portNo),
+                                    OVS_HASH_BASIS);
+        head = &(switchContext->portNoHashArray[hash & OVS_VPORT_MASK]);
+        LIST_FORALL(head, link) {
+            vport = CONTAINING_RECORD(link, OVS_VPORT_ENTRY, portNoLink);
+            if (vport->portNo == portNo) {
+                break;
+            }
+            vport = NULL;
         }
     }
-    return NULL;
+
+    return vport;
 }
 
 
@@ -484,22 +495,22 @@ POVS_VPORT_ENTRY
 OvsFindVportByOvsName(POVS_SWITCH_CONTEXT switchContext,
                       PSTR name)
 {
-    POVS_VPORT_ENTRY vport;
-    PLIST_ENTRY head, link;
+    POVS_VPORT_ENTRY vport = NULL;
+    PLIST_ENTRY head = NULL, link = NULL;
     UINT32 hash;
     SIZE_T length = strlen(name) + 1;
 
     hash = OvsJhashBytes((const VOID *)name, length, OVS_HASH_BASIS);
     head = &(switchContext->ovsPortNameHashArray[hash & OVS_VPORT_MASK]);
-
-    LIST_FORALL(head, link) {
+    LIST_FORALL(head, link) {
         vport = CONTAINING_RECORD(link, OVS_VPORT_ENTRY, ovsNameLink);
         if (!strcmp(name, vport->ovsName)) {
-            return vport;
+            break;
         }
+        vport = NULL;
     }
 
-    return NULL;
+    return vport;
 }
 
 /* OvsFindVportByHvName: "name" is assumed to be null-terminated */
@@ -508,7 +519,7 @@ OvsFindVportByHvName(POVS_SWITCH_CONTEXT switchContext,
                      PSTR name)
 {
     POVS_VPORT_ENTRY vport = NULL;
-    PLIST_ENTRY head, link;
+    PLIST_ENTRY head = NULL, link = NULL;
     /* 'portFriendlyName' is not NUL-terminated. */
     SIZE_T length = strlen(name);
     SIZE_T wstrSize = length * sizeof(WCHAR);
@@ -524,7 +535,7 @@ OvsFindVportByHvName(POVS_SWITCH_CONTEXT switchContext,
 
     for (i = 0; i < OVS_MAX_VPORT_ARRAY_SIZE; i++) {
         head = &(switchContext->portIdHashArray[i]);
-        LIST_FORALL(head, link) {
+        LIST_FORALL(head, link) {
             vport = CONTAINING_RECORD(link, OVS_VPORT_ENTRY, portIdLink);
 
             /*
@@ -535,14 +546,13 @@ OvsFindVportByHvName(POVS_SWITCH_CONTEXT switchContext,
             if (vport->portFriendlyName.Length == wstrSize &&
                 RtlEqualMemory(wsName, vport->portFriendlyName.String,
                                vport->portFriendlyName.Length)) {
-                goto Cleanup;
+                break;
             }
 
             vport = NULL;
         }
     }
 
-Cleanup:
     OvsFreeMemory(wsName);
 
     return vport;
@@ -553,24 +563,27 @@ OvsFindVportByPortIdAndNicIndex(POVS_SWITCH_CONTEXT switchContext,
                                 NDIS_SWITCH_PORT_ID portId,
                                 NDIS_SWITCH_NIC_INDEX index)
 {
+    POVS_VPORT_ENTRY vport = NULL;
+
     if (portId == switchContext->externalPortId) {
-        return (POVS_VPORT_ENTRY)switchContext->externalVport;
+        vport = switchContext->externalVport;
     } else if (switchContext->internalPortId == portId) {
-        return (POVS_VPORT_ENTRY)switchContext->internalVport;
+        vport = switchContext->internalVport;
     } else {
         PLIST_ENTRY head, link;
-        POVS_VPORT_ENTRY vport;
         UINT32 hash;
         hash = OvsJhashWords((UINT32 *)&portId, 1, OVS_HASH_BASIS);
         head = &(switchContext->portIdHashArray[hash & OVS_VPORT_MASK]);
-        LIST_FORALL(head, link) {
+        LIST_FORALL(head, link) {
             vport = CONTAINING_RECORD(link, OVS_VPORT_ENTRY, portIdLink);
             if (portId == vport->portId && index == vport->nicIndex) {
-                return vport;
+                break;
             }
+            vport = NULL;
         }
-        return NULL;
     }
+
+    return vport;
 }
 
 POVS_VPORT_ENTRY
-- 
1.9.0.msysgit.0



More information about the dev mailing list