]> git.openfabrics.org - ~shefty/rdma-win.git/commitdiff
winverbs: pass in SGID index to uvp pre_create_av
authorshefty <shefty@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Fri, 18 Jul 2008 08:49:04 +0000 (08:49 +0000)
committershefty <shefty@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Fri, 18 Jul 2008 08:49:04 +0000 (08:49 +0000)
The SGID index can change dynamically, so look up the correct index when creating an address vector.  The index is passed into the UVP in the resv2 field of the grh.

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
git-svn-id: svn://openib.tc.cornell.edu/gen1@1416 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

branches/winverbs/core/winverbs/user/wv_device.cpp
branches/winverbs/core/winverbs/user/wv_device.h
branches/winverbs/core/winverbs/user/wv_pd.cpp
branches/winverbs/core/winverbs/user/wv_pd.h

index be6f9ba89b56acc4fe75c8f831a23acf68ad95f1..86c4661f7dfecea1ddaf3eb943352426c0257416 100644 (file)
@@ -293,6 +293,28 @@ out:
        return hr;\r
 }\r
 \r
+STDMETHODIMP CWVDevice::\r
+FindGidIndex(UINT8 PortNumber, WV_GID *pGid, UINT8 *pIndex)\r
+{\r
+       WV_GID  gid;\r
+       DWORD   index;\r
+       HRESULT hr;\r
+\r
+       for (index = 0; true; index++) {\r
+               hr = QueryGid(PortNumber, index, &gid);\r
+               if (FAILED(hr)) {\r
+                       break;\r
+               }\r
+\r
+               if (RtlCompareMemory(pGid, &gid, sizeof(gid)) == sizeof(gid)) {\r
+                       *pIndex = (UINT8) index;\r
+                       break;\r
+               }\r
+       }\r
+\r
+       return hr;\r
+}\r
+\r
 // TODO: cache PKey table and update with QueryPort()\r
 STDMETHODIMP CWVDevice::\r
 QueryPkey(UINT8 PortNumber, DWORD Index, NET16* pPkey)\r
index 43a3a5c3bda06bd66f583eefcd6339935c7d5013..72314c3513eb0f454c485f02004c533279b25749 100644 (file)
@@ -94,6 +94,7 @@ public:
                *ppDevice = NULL;\r
                return hr;\r
        }\r
+       STDMETHODIMP FindGidIndex(UINT8 PortNumber, WV_GID *pGid, UINT8 *pIndex);\r
 \r
        CWVProvider             *m_pProvider;\r
        uvp_interface_t m_Verbs;\r
index e34702d0d7186ded5e622c252820c4d29a3e6bb4..258205d7357e2d91ecd563b79cf9e8deee50453d 100644 (file)
@@ -311,25 +311,6 @@ Release(void)
 // Address Handle routines\r
 //------------------------\r
 \r
-void WvVerbsConvertAv(ib_av_attr_t *pVerbsAv, WV_ADDRESS_VECTOR *pAv)\r
-{\r
-       pVerbsAv->grh_valid = pAv->Route.Valid;\r
-       if (pVerbsAv->grh_valid) {\r
-               pVerbsAv->grh.ver_class_flow =\r
-                       _byteswap_ulong(_byteswap_ulong(pAv->Route.FlowLabel) |\r
-                                                        (pAv->Route.TrafficClass << 20));\r
-               pVerbsAv->grh.hop_limit = pAv->Route.HopLimit;\r
-               RtlCopyMemory(&pVerbsAv->grh.src_gid, &pAv->Route.SGid, sizeof(pAv->Route.SGid));\r
-               RtlCopyMemory(&pVerbsAv->grh.dest_gid, &pAv->Route.DGid, sizeof(pAv->Route.DGid));\r
-       }\r
-\r
-       pVerbsAv->port_num = pAv->PortNumber;\r
-       pVerbsAv->sl = pAv->ServiceLevel;\r
-       pVerbsAv->dlid = pAv->DLid;\r
-       pVerbsAv->static_rate = pAv->StaticRate;\r
-       pVerbsAv->path_bits = pAv->SourcePathBits;\r
-}\r
-\r
 CWVAddressHandle::CWVAddressHandle(CWVProtectionDomain *pPd)\r
 {\r
        pPd->AddRef();\r
@@ -350,7 +331,11 @@ Create(WV_ADDRESS_VECTOR* pAddress)
        ib_av_attr_t    av;\r
        CWVBuffer               buf;\r
 \r
-       WvVerbsConvertAv(&av, pAddress);\r
+       hr = ConvertAv(&av, pAddress);\r
+       if (FAILED(hr)) {\r
+               return hr;\r
+       }\r
+\r
        stat = m_pVerbs->pre_create_av(m_pPd->m_hVerbsPd, &av, &verbsData, &m_hVerbsAh);\r
        if (stat != IB_SUCCESS) {\r
                if (stat == IB_VERBS_PROCESSING_DONE) {\r
@@ -435,3 +420,33 @@ Release(void)
 {\r
        return CWVBase::Release();\r
 }\r
+\r
+STDMETHODIMP CWVAddressHandle::\r
+ConvertAv(ib_av_attr_t *pVerbsAv, WV_ADDRESS_VECTOR *pAv)\r
+{\r
+       HRESULT hr;\r
+\r
+       pVerbsAv->grh_valid = pAv->Route.Valid;\r
+       if (pVerbsAv->grh_valid) {\r
+               hr = m_pPd->m_pDevice->FindGidIndex(pAv->PortNumber, &pAv->Route.SGid,\r
+                                                                                       &pVerbsAv->grh.resv2);\r
+               if (FAILED(hr)) {\r
+                       return hr;\r
+               }\r
+\r
+               pVerbsAv->grh.ver_class_flow =\r
+                       _byteswap_ulong(_byteswap_ulong(pAv->Route.FlowLabel) |\r
+                                                        (pAv->Route.TrafficClass << 20));\r
+               pVerbsAv->grh.hop_limit = pAv->Route.HopLimit;\r
+               RtlCopyMemory(&pVerbsAv->grh.src_gid, &pAv->Route.SGid, sizeof(pAv->Route.SGid));\r
+               RtlCopyMemory(&pVerbsAv->grh.dest_gid, &pAv->Route.DGid, sizeof(pAv->Route.DGid));\r
+       }\r
+\r
+       pVerbsAv->port_num = pAv->PortNumber;\r
+       pVerbsAv->sl = pAv->ServiceLevel;\r
+       pVerbsAv->dlid = pAv->DLid;\r
+       pVerbsAv->static_rate = pAv->StaticRate;\r
+       pVerbsAv->path_bits = pAv->SourcePathBits;\r
+\r
+       return WV_SUCCESS;\r
+}
\ No newline at end of file
index 39c912c6594e45905b24fc180770e28c119c3b04..00f46b8ddfe698901e3d36a3bbb18c689b88a049 100644 (file)
@@ -207,8 +207,7 @@ public:
 \r
 protected:\r
        STDMETHODIMP Create(WV_ADDRESS_VECTOR* pAddress);\r
+       STDMETHODIMP ConvertAv(ib_av_attr_t *pVerbsAv, WV_ADDRESS_VECTOR *pAv);\r
 };\r
 \r
-void WvVerbsConvertAv(ib_av_attr_t *pVerbsAv, WV_ADDRESS_VECTOR *pAv);\r
-\r
 #endif // _WV_PD_H_
\ No newline at end of file