Message ID | 1446509119-6220-1-git-send-email-vsairam@vmware.com |
---|---|
State | Superseded |
Headers | show |
Just a minor detail, but ConvertInterfaceLuidToAlias() seems to be returning something of type NETIO_STATUS, with NO_ERROR indicating success. We should probably use the appropriate type. Looks good otherwise. Thanks for doing this. Acked-by: Nithin Raju <nithin@vmware.com> -----Original Message----- From: Sairam Venugopal <vsairam@vmware.com> Date: Monday, November 2, 2015 at 5:05 PM To: "dev@openvswitch.org" <dev@openvswitch.org> Subject: [ovs-dev] [PATCH] 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. > >Associated bug - >https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_openvswitc >h_ovs-2Dissues_issues_102&d=BQIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNt >Xt-uEs&r=pNHQcdr7B40b4h6Yb7FIedI1dnBsxdDuTLBYD3JqV80&m=uzGKohGZgRODAcZXf_e >RokVXtUFLDB5d0wjXmf4YDso&s=2qfpFBiaYnXUUwr5rtdDaoA_VofV0qetJrgkiHbXLvQ&e= > >Signed-off-by: Sairam Venugopal <vsairam@vmware.com> >--- > datapath-windows/ovsext/Vport.c | 40 >++++++++++++++++++++++++++++++++++++---- > 1 file changed, 36 insertions(+), 4 deletions(-) > >diff --git a/datapath-windows/ovsext/Vport.c >b/datapath-windows/ovsext/Vport.c >index 4ade842..812e62b 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 == NDIS_STATUS_SUCCESS) { >+ status = ConvertInterfaceLuidToAlias(&interfaceLuid, >+ interfaceName, >+ IF_MAX_STRING_SIZE >+ 1); >+ if (status == NDIS_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; >-- >1.9.5.msysgit.0 > >_______________________________________________ >dev mailing list >dev@openvswitch.org >https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailma >n_listinfo_dev&d=BQIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=pN >HQcdr7B40b4h6Yb7FIedI1dnBsxdDuTLBYD3JqV80&m=uzGKohGZgRODAcZXf_eRokVXtUFLDB >5d0wjXmf4YDso&s=nzNtvc9DhUaN4oQfMh7GTPzwdWw1TMB8xiGsYawULdA&e=
Hey Nithin, Thanks for the review. I will send out a V2 with the fix. Sairam On 11/2/15, 5:10 PM, "Nithin Raju" <nithin@vmware.com> wrote: >Just a minor detail, but ConvertInterfaceLuidToAlias() seems to be >returning something of type NETIO_STATUS, with NO_ERROR indicating >success. We should probably use the appropriate type. > >Looks good otherwise. Thanks for doing this. > >Acked-by: Nithin Raju <nithin@vmware.com> > > >-----Original Message----- >From: Sairam Venugopal <vsairam@vmware.com> >Date: Monday, November 2, 2015 at 5:05 PM >To: "dev@openvswitch.org" <dev@openvswitch.org> >Subject: [ovs-dev] [PATCH] 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. >> >>Associated bug - >>https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_openvswit >>c >>h_ovs-2Dissues_issues_102&d=BQIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMN >>t >>Xt-uEs&r=pNHQcdr7B40b4h6Yb7FIedI1dnBsxdDuTLBYD3JqV80&m=uzGKohGZgRODAcZXf_ >>e >>RokVXtUFLDB5d0wjXmf4YDso&s=2qfpFBiaYnXUUwr5rtdDaoA_VofV0qetJrgkiHbXLvQ&e= >> >>Signed-off-by: Sairam Venugopal <vsairam@vmware.com> >>--- >> datapath-windows/ovsext/Vport.c | 40 >>++++++++++++++++++++++++++++++++++++---- >> 1 file changed, 36 insertions(+), 4 deletions(-) >> >>diff --git a/datapath-windows/ovsext/Vport.c >>b/datapath-windows/ovsext/Vport.c >>index 4ade842..812e62b 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 == NDIS_STATUS_SUCCESS) { >>+ status = ConvertInterfaceLuidToAlias(&interfaceLuid, >>+ interfaceName, >>+ IF_MAX_STRING_SIZE >>+ 1); >>+ if (status == NDIS_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; >>-- >>1.9.5.msysgit.0 >> >>_______________________________________________ >>dev mailing list >>dev@openvswitch.org >>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailm >>a >>n_listinfo_dev&d=BQIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=p >>N >>HQcdr7B40b4h6Yb7FIedI1dnBsxdDuTLBYD3JqV80&m=uzGKohGZgRODAcZXf_eRokVXtUFLD >>B >>5d0wjXmf4YDso&s=nzNtvc9DhUaN4oQfMh7GTPzwdWw1TMB8xiGsYawULdA&e= >
diff --git a/datapath-windows/ovsext/Vport.c b/datapath-windows/ovsext/Vport.c index 4ade842..812e62b 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 == NDIS_STATUS_SUCCESS) { + status = ConvertInterfaceLuidToAlias(&interfaceLuid, + interfaceName, + IF_MAX_STRING_SIZE + 1); + if (status == NDIS_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;
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. Associated bug - https://github.com/openvswitch/ovs-issues/issues/102 Signed-off-by: Sairam Venugopal <vsairam@vmware.com> --- datapath-windows/ovsext/Vport.c | 40 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-)