While enumerating the ports on a switch, if adding one of the ports fails, we are not handling that error gracefully. Instead, we fail adding of all the ports. This patch rectifies that.
Signed-off-by: Nithin Raju <nit...@vmware.com> --- datapath-windows/ovsext/Vport.c | 41 +++++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/datapath-windows/ovsext/Vport.c b/datapath-windows/ovsext/Vport.c index 7b0103d..a991d10 100644 --- a/datapath-windows/ovsext/Vport.c +++ b/datapath-windows/ovsext/Vport.c @@ -125,7 +125,7 @@ HvCreatePort(POVS_SWITCH_CONTEXT switchContext, if (vport != NULL) { OVS_LOG_ERROR("Port add failed due to duplicate port name, " "port Id: %u", portParam->PortId); - status = STATUS_DATA_NOT_ACCEPTED; + status = NDIS_STATUS_DATA_NOT_ACCEPTED; goto create_port_done; } @@ -140,7 +140,7 @@ HvCreatePort(POVS_SWITCH_CONTEXT switchContext, OVS_LOG_ERROR("Port add failed since a port already exists on " "the specified port Id: %u, ovsName: %s", portParam->PortId, vport->ovsName); - status = STATUS_DATA_NOT_ACCEPTED; + status = NDIS_STATUS_DATA_NOT_ACCEPTED; goto create_port_done; } @@ -157,7 +157,7 @@ HvCreatePort(POVS_SWITCH_CONTEXT switchContext, OVS_LOG_INFO("Port add failed due to PortType change, port Id: %u" " old: %u, new: %u", portParam->PortId, vport->portType, portParam->PortType); - status = STATUS_DATA_NOT_ACCEPTED; + status = NDIS_STATUS_DATA_NOT_ACCEPTED; goto create_port_done; } vport->isAbsentOnHv = FALSE; @@ -365,7 +365,7 @@ HvCreateNic(POVS_SWITCH_CONTEXT switchContext, OVS_LOG_ERROR("Create NIC without Switch Port," " PortId: %x, NicIndex: %d", nicParam->PortId, nicParam->NicIndex); - status = NDIS_STATUS_INVALID_PARAMETER; + status = NDIS_STATUS_ADAPTER_NOT_FOUND; goto add_nic_done; } OvsInitVportWithNicParam(switchContext, vport, nicParam); @@ -1393,6 +1393,7 @@ OvsAddConfiguredSwitchPorts(POVS_SWITCH_CONTEXT switchContext) ULONG arrIndex; PNDIS_SWITCH_PORT_PARAMETERS portParam; PNDIS_SWITCH_PORT_ARRAY portArray = NULL; + BOOLEAN portAdded = FALSE; OVS_LOG_TRACE("Enter: switchContext:%p", switchContext); @@ -1402,16 +1403,24 @@ OvsAddConfiguredSwitchPorts(POVS_SWITCH_CONTEXT switchContext) } for (arrIndex = 0; arrIndex < portArray->NumElements; arrIndex++) { - portParam = NDIS_SWITCH_PORT_AT_ARRAY_INDEX(portArray, arrIndex); + portParam = NDIS_SWITCH_PORT_AT_ARRAY_INDEX(portArray, arrIndex); - if (portParam->IsValidationPort) { - continue; - } + if (portParam->IsValidationPort) { + continue; + } - status = HvCreatePort(switchContext, portParam, 0); - if (status != STATUS_SUCCESS && status != STATUS_DATA_NOT_ACCEPTED) { - break; - } + status = HvCreatePort(switchContext, portParam, 0); + if (status == NDIS_STATUS_SUCCESS) { + portAdded = TRUE; + } else if (status != NDIS_STATUS_DATA_NOT_ACCEPTED) { + /* Any other error. */ + break; + } + } + + /* If at least one port was added, return success. */ + if (status != NDIS_STATUS_SUCCESS && portAdded == TRUE) { + status = NDIS_STATUS_SUCCESS; } cleanup: @@ -1438,6 +1447,7 @@ OvsInitConfiguredSwitchNics(POVS_SWITCH_CONTEXT switchContext) PNDIS_SWITCH_NIC_ARRAY nicArray = NULL; ULONG arrIndex; PNDIS_SWITCH_NIC_PARAMETERS nicParam; + BOOLEAN nicAdded = FALSE; OVS_LOG_TRACE("Enter: switchContext: %p", switchContext); /* @@ -1459,9 +1469,16 @@ OvsInitConfiguredSwitchNics(POVS_SWITCH_CONTEXT switchContext) status = HvCreateNic(switchContext, nicParam); if (status == NDIS_STATUS_SUCCESS) { + nicAdded = TRUE; HvConnectNic(switchContext, nicParam); } } + + /* If at least one NIC was added, return success. */ + if (status != NDIS_STATUS_SUCCESS && nicAdded == TRUE) { + status = NDIS_STATUS_SUCCESS; + } + cleanup: OvsFreeSwitchNicsArray(nicArray); -- 2.6.2 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev