diff options
author | Jinjun Gao <jinjung@vmware.com> | 2019-12-08 09:28:17 +0000 |
---|---|---|
committer | Alin Gabriel Serdean <aserdean@ovn.org> | 2019-12-09 13:33:44 +0200 |
commit | 40570384bc0670482d38f55717175b55b7f8a533 (patch) | |
tree | 63a43eb20f8f99300229ce9678d0039a2d107833 /datapath-windows | |
parent | 1061dc7c85e780269697f7f8980f3b25cd3b1278 (diff) | |
download | openvswitch-40570384bc0670482d38f55717175b55b7f8a533.tar.gz |
datapath-windows: Do not delete internal port on OID_SWITCH_NIC_DISCONNECT
According to the microsoft doc:
https://docs.microsoft.com/en-us/windows-hardware/drivers/network/hyper-v-extensible-switch-port-and-network-adapter-states
Below OID request sequence is validation:
OID_SWITCH_NIC_CONNECT -> OID_SWITCH_NIC_DISCONNECT
^ |
| V
OID_SWITCH_NIC_CREATE <- OID_SWITCH_NIC_DELETE
In above sequence, the windows extensible switch interface assumes the
OID_SWITCH_PORT_CREATE has issued and the port has been created
successfully. If delete the internal port in HvDisconnectNic(),
HvCreateNic() will fail when received OID_SWITCH_NIC_CREATE late because
there is no corresponding port.
Signed-off-by: Jinjun Gao <jinjung@vmware.com>
Signed-off-by: Alin Gabriel Serdean <aserdean@ovn.org>
Diffstat (limited to 'datapath-windows')
-rw-r--r-- | datapath-windows/ovsext/Vport.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/datapath-windows/ovsext/Vport.c b/datapath-windows/ovsext/Vport.c index 57e75109d..9f1587f44 100644 --- a/datapath-windows/ovsext/Vport.c +++ b/datapath-windows/ovsext/Vport.c @@ -628,6 +628,7 @@ HvDisconnectNic(POVS_SWITCH_CONTEXT switchContext, event.upcallPid = vport->upcallPid; RtlCopyMemory(&event.ovsName, &vport->ovsName, sizeof event.ovsName); event.type = OVS_EVENT_LINK_DOWN; + OvsPostVportEvent(&event); /* * Delete the port from the hash tables accessible to userspace. After this @@ -635,13 +636,18 @@ HvDisconnectNic(POVS_SWITCH_CONTEXT switchContext, */ if (OvsIsRealExternalVport(vport)) { OvsRemoveAndDeleteVport(NULL, switchContext, vport, FALSE, TRUE); - OvsPostVportEvent(&event); } if (isInternalPort) { OvsUnBindVportWithIpHelper(vport, switchContext); - OvsRemoveAndDeleteVport(NULL, switchContext, vport, TRUE, TRUE); - OvsPostVportEvent(&event); + /* + * Don't delete the port from the hash tables here for internal port + * because the internal port cannot be recreated in HvCreateNic(). It + * only can be created in HvCreatePort() by issuing + * OID_SWITCH_PORT_CREATE. We should wait extensible switch interface + * to issue OID_SWITCH_PORT_TEARDOWN and OID_SWITCH_PORT_DELETE to + * delete the internal port. + */ } NdisReleaseRWLock(switchContext->dispatchLock, &lockState); |