Acked-by: Alin Gabriel Serdean <aserd...@cloudbasesolutions.com>
> -----Mesaj original----- > De la: dev [mailto:dev-boun...@openvswitch.org] În numele Nithin Raju > Trimis: Wednesday, November 18, 2015 6:14 PM > Către: dev@openvswitch.org > Subiect: [ovs-dev] [PATCH 5/6 v2] datapath-windows: cleanup > AssignNicNameSpecial() > > AssignNicNameSpecial() needed to be called outside of a lock and was > moved out in a previous change. But, it was accessing vport structure outside > of the lock which isn't safe. In this change, we take care of that. > > I tried to trigger a call to HvUpdateNic() by renaming the interface from the > GUI and didn't see any callback. Other changes are tested. > > Signed-off-by: Nithin Raju <nit...@vmware.com> > --- > datapath-windows/ovsext/Vport.c | 62 ++++++++++++++++++++++--------- > ---------- > 1 file changed, 33 insertions(+), 29 deletions(-) > > diff --git a/datapath-windows/ovsext/Vport.c b/datapath- > windows/ovsext/Vport.c index 388920e..ef21fca 100644 > --- a/datapath-windows/ovsext/Vport.c > +++ b/datapath-windows/ovsext/Vport.c > @@ -94,7 +94,8 @@ static VOID OvsTunnelVportPendingInit(PVOID context, > static VOID OvsTunnelVportPendingRemove(PVOID context, > NTSTATUS status, > UINT32 *replyLen); -static VOID > AssignNicNameSpecial(POVS_VPORT_ENTRY vport); > +static NTSTATUS GetNICAlias(GUID *netCfgInstanceId, > + IF_COUNTED_STRING *portFriendlyName); > > /* > * -------------------------------------------------------------------------- > @@ -311,7 +312,7 @@ HvCreateNic(POVS_SWITCH_CONTEXT > switchContext, { > POVS_VPORT_ENTRY vport; > NDIS_STATUS status = NDIS_STATUS_SUCCESS; > - > + IF_COUNTED_STRING portFriendlyName = {0}; > LOCK_STATE_EX lockState; > > VPORT_NIC_ENTER(nicParam); > @@ -326,6 +327,12 @@ HvCreateNic(POVS_SWITCH_CONTEXT > switchContext, > goto done; > } > > + if (nicParam->NicType == NdisSwitchNicTypeInternal || > + (nicParam->NicType == NdisSwitchNicTypeExternal && > + nicParam->NicIndex != 0)) { > + GetNICAlias(&nicParam->NetCfgInstanceId, &portFriendlyName); > + } > + > NdisAcquireRWLockWrite(switchContext->dispatchLock, &lockState, 0); > /* > * There can be one or more NICs for the external port. We create a vport > @@ -386,17 +393,12 @@ HvCreateNic(POVS_SWITCH_CONTEXT > switchContext, > if (nicParam->NicType == NdisSwitchNicTypeInternal || > (nicParam->NicType == NdisSwitchNicTypeExternal && > nicParam->NicIndex != 0)) { > - AssignNicNameSpecial(vport); > + RtlCopyMemory(&vport->portFriendlyName, &portFriendlyName, > + sizeof portFriendlyName); > } > > add_nic_done: > NdisReleaseRWLock(switchContext->dispatchLock, &lockState); > - if (status == STATUS_SUCCESS && > - (vport->portType == NdisSwitchPortTypeInternal || > - (vport->portType == NdisSwitchPortTypeExternal && > - nicParam->NicIndex != 0))) { > - AssignNicNameSpecial(vport); > - } > > done: > VPORT_NIC_EXIT(nicParam); > @@ -467,6 +469,7 @@ HvUpdateNic(POVS_SWITCH_CONTEXT > switchContext, > POVS_VPORT_ENTRY vport; > LOCK_STATE_EX lockState; > UINT32 event = 0; > + IF_COUNTED_STRING portFriendlyName = {0}; > > VPORT_NIC_ENTER(nicParam); > > @@ -478,6 +481,13 @@ HvUpdateNic(POVS_SWITCH_CONTEXT > switchContext, > goto update_nic_done; > } > > + /* GetNICAlias() must be called outside of a lock. */ > + if (nicParam->NicType == NdisSwitchNicTypeInternal || > + (nicParam->NicType == NdisSwitchNicTypeExternal && > + nicParam->NicIndex != 0)) { > + GetNICAlias(&nicParam->NetCfgInstanceId, &portFriendlyName); > + } > + > NdisAcquireRWLockWrite(switchContext->dispatchLock, &lockState, 0); > vport = OvsFindVportByPortIdAndNicIndex(switchContext, > nicParam->PortId, @@ -492,7 > +502,8 @@ > HvUpdateNic(POVS_SWITCH_CONTEXT switchContext, > case NdisSwitchNicTypeInternal: > RtlCopyMemory(&vport->netCfgInstanceId, &nicParam- > >NetCfgInstanceId, > sizeof (GUID)); > - AssignNicNameSpecial(vport); > + RtlCopyMemory(&vport->portFriendlyName, &portFriendlyName, > + sizeof portFriendlyName); > break; > case NdisSwitchNicTypeSynthetic: > case NdisSwitchNicTypeEmulated: > @@ -1033,18 +1044,16 @@ OvsInitBridgeInternalVport(POVS_VPORT_ENTRY > vport) > * Hyper-V, is overwritten with the interface alias name. > * -------------------------------------------------------------------------- > */ > -static VOID > -AssignNicNameSpecial(POVS_VPORT_ENTRY vport) > +static NTSTATUS > +GetNICAlias(GUID *netCfgInstanceId, > + IF_COUNTED_STRING *portFriendlyName) > { > NTSTATUS status = STATUS_SUCCESS; > WCHAR interfaceName[IF_MAX_STRING_SIZE] = { 0 }; > NET_LUID interfaceLuid = { 0 }; > size_t len = 0; > > - ASSERT(vport->portType == NdisSwitchPortTypeExternal || > - vport->portType == NdisSwitchPortTypeInternal); > - > - status = ConvertInterfaceGuidToLuid(&vport->netCfgInstanceId, > + status = ConvertInterfaceGuidToLuid(netCfgInstanceId, > &interfaceLuid); > if (status == STATUS_SUCCESS) { > /* > @@ -1054,26 +1063,21 @@ AssignNicNameSpecial(POVS_VPORT_ENTRY > vport) > status = ConvertInterfaceLuidToAlias(&interfaceLuid, interfaceName, > IF_MAX_STRING_SIZE + 1); > if (status == STATUS_SUCCESS) { > - if (vport->portType == NdisSwitchPortTypeExternal && > - vport->nicIndex == 0) { > - RtlStringCbPrintfW(vport->portFriendlyName.String, > IF_MAX_STRING_SIZE, > - L"%s.virtualAdapter", interfaceName); > - } else { > - RtlStringCbPrintfW(vport->portFriendlyName.String, > - IF_MAX_STRING_SIZE, L"%s", interfaceName); > - } > - > - RtlStringCbLengthW(vport->portFriendlyName.String, > IF_MAX_STRING_SIZE, > + RtlStringCbPrintfW(portFriendlyName->String, > + IF_MAX_STRING_SIZE, L"%s", interfaceName); > + RtlStringCbLengthW(portFriendlyName->String, > + IF_MAX_STRING_SIZE, > &len); > - vport->portFriendlyName.Length = (USHORT)len; > + portFriendlyName->Length = (USHORT)len; > } else { > - OVS_LOG_INFO("Fail to convert interface LUID to alias, status: > %x", > + OVS_LOG_ERROR("Fail to convert interface LUID to alias, > + status: %x", > status); > } > } else { > - OVS_LOG_INFO("Fail to convert interface GUID to LUID, status: %x", > + OVS_LOG_ERROR("Fail to convert interface GUID to LUID, status: > + %x", > status); > } > + > + return status; > } > > > -- > 1.8.5.6 > > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev