summaryrefslogtreecommitdiff
path: root/datapath-windows/ovsext/Vport.c
diff options
context:
space:
mode:
authorSairam Venugopal <vsairam@vmware.com>2015-11-02 17:17:07 -0800
committerBen Pfaff <blp@nicira.com>2015-11-03 09:45:50 -0800
commitac79a98803dc2e02619bd2cea3241006bb75b03d (patch)
treed5e871608ef956787d1f1b5c60e1b092b0aa5cef /datapath-windows/ovsext/Vport.c
parent6741ca0d5cd8f88264cbedc9e11aea36a18a439a (diff)
downloadopenvswitch-ac79a98803dc2e02619bd2cea3241006bb75b03d.tar.gz
datapath-windows: Updating an External Adapter causes flow lookup failure
This patch fixes an issue with updating the propeties of an external adapter in Windows. The issue causes flow lookups to fail until the kernel is reinstalled. Reported-at: https://github.com/openvswitch/ovs-issues/issues/102 Signed-off-by: Sairam Venugopal <vsairam@vmware.com> Acked-by: Nithin Raju <nithin@vmware.com> Signed-off-by: Ben Pfaff <blp@nicira.com>
Diffstat (limited to 'datapath-windows/ovsext/Vport.c')
-rw-r--r--datapath-windows/ovsext/Vport.c40
1 files changed, 36 insertions, 4 deletions
diff --git a/datapath-windows/ovsext/Vport.c b/datapath-windows/ovsext/Vport.c
index 4ade842a9..7de42d7b7 100644
--- a/datapath-windows/ovsext/Vport.c
+++ b/datapath-windows/ovsext/Vport.c
@@ -322,19 +322,51 @@ HvCreateNic(POVS_SWITCH_CONTEXT switchContext,
POVS_VPORT_ENTRY virtExtVport =
(POVS_VPORT_ENTRY)switchContext->virtualExternalVport;
- vport = (POVS_VPORT_ENTRY)OvsAllocateVport();
+ vport = OvsFindVportByPortIdAndNicIndex(switchContext,
+ nicParam->PortId,
+ nicParam->NicIndex);
if (vport == NULL) {
- status = NDIS_STATUS_RESOURCES;
- goto add_nic_done;
+ /* Find by interface name */
+ WCHAR interfaceName[IF_MAX_STRING_SIZE] = { 0 };
+ NET_LUID interfaceLuid = { 0 };
+ size_t len = 0;
+ status = ConvertInterfaceGuidToLuid(&nicParam->NetCfgInstanceId,
+ &interfaceLuid);
+ if (status == STATUS_SUCCESS) {
+ status = ConvertInterfaceLuidToAlias(&interfaceLuid,
+ interfaceName,
+ IF_MAX_STRING_SIZE + 1);
+ if (status == STATUS_SUCCESS) {
+ RtlStringCbLengthW(interfaceName,
+ IF_MAX_STRING_SIZE,
+ &len);
+ vport = OvsFindVportByHvNameW(switchContext,
+ interfaceName,
+ len);
+ }
+ }
+
+ if (vport == NULL) {
+ /* XXX: Handle this event appropriately */
+ vport = (POVS_VPORT_ENTRY)OvsAllocateVport();
+ if (vport == NULL) {
+ status = NDIS_STATUS_RESOURCES;
+ goto add_nic_done;
+ }
+ }
}
+
OvsInitPhysNicVport(vport, virtExtVport, nicParam->NicIndex);
+ OvsInitVportWithNicParam(switchContext, vport, nicParam);
status = InitHvVportCommon(switchContext, vport, TRUE);
+ vport->isAbsentOnHv = FALSE;
if (status != NDIS_STATUS_SUCCESS) {
OvsFreeMemoryWithTag(vport, OVS_VPORT_POOL_TAG);
goto add_nic_done;
}
+ } else {
+ OvsInitVportWithNicParam(switchContext, vport, nicParam);
}
- OvsInitVportWithNicParam(switchContext, vport, nicParam);
portNo = vport->portNo;
if (vport->ovsState == OVS_STATE_CONNECTED) {
event = OVS_EVENT_CONNECT | OVS_EVENT_LINK_UP;