]> git.openfabrics.org - ~shefty/rdma-win.git/commitdiff
winverbs branch: update to trunk 2284
authorshefty <shefty@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Fri, 10 Jul 2009 18:07:16 +0000 (18:07 +0000)
committershefty <shefty@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Fri, 10 Jul 2009 18:07:16 +0000 (18:07 +0000)
Signed-off-by: Sean Hefty <sean.hefty@intel.com>
git-svn-id: svn://openib.tc.cornell.edu/gen1@2285 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

96 files changed:
branches/winverbs/WinOF/WIX/CustomActions.vbs
branches/winverbs/WinOF/WIX/common/IBcore.inc
branches/winverbs/WinOF/WIX/common/InstallExecuteSeq.inc
branches/winverbs/WinOF/WIX/common/OpenSM_service.inc
branches/winverbs/WinOF/WIX/common/dapl_rt.inc
branches/winverbs/WinOF/WIX/common/std_features.inc [new file with mode: 0644]
branches/winverbs/WinOF/WIX/win7/ia64/wof.wxs
branches/winverbs/WinOF/WIX/win7/x64/wof.wxs
branches/winverbs/WinOF/WIX/win7/x86/wof.wxs
branches/winverbs/WinOF/WIX/wlh/ia64/wof.wxs
branches/winverbs/WinOF/WIX/wlh/x64/wof.wxs
branches/winverbs/WinOF/WIX/wlh/x86/wof.wxs
branches/winverbs/WinOF/WIX/wnet/ia64/wof.wxs
branches/winverbs/WinOF/WIX/wnet/x64/wof.wxs
branches/winverbs/WinOF/WIX/wnet/x86/wof.wxs
branches/winverbs/WinOF/WIX/wxp/x86/wof.wxs
branches/winverbs/core/al/al_common.c
branches/winverbs/core/al/al_qp.c
branches/winverbs/core/al/al_verbs.h
branches/winverbs/core/complib/kernel/cl_driver.c
branches/winverbs/etc/user/gtod.c [new file with mode: 0644]
branches/winverbs/inc/kernel/complib/cl_debug_osd.h
branches/winverbs/inc/kernel/ip_packet.h
branches/winverbs/inc/user/linux/sys/time.h [new file with mode: 0644]
branches/winverbs/ulp/dapl2/ChangeLog
branches/winverbs/ulp/dapl2/Makefile.am
branches/winverbs/ulp/dapl2/configure.in
branches/winverbs/ulp/dapl2/dapl.spec.in
branches/winverbs/ulp/dapl2/dapl/common/dapl_cr_accept.c
branches/winverbs/ulp/dapl2/dapl/common/dapl_debug.c
branches/winverbs/ulp/dapl2/dapl/dirs
branches/winverbs/ulp/dapl2/dapl/include/dapl_debug.h
branches/winverbs/ulp/dapl2/dapl/openib_cma/SOURCES
branches/winverbs/ulp/dapl2/dapl/openib_cma/cm.c [new file with mode: 0644]
branches/winverbs/ulp/dapl2/dapl/openib_cma/dapl_ib_cm.c [deleted file]
branches/winverbs/ulp/dapl2/dapl/openib_cma/dapl_ib_cq.c [deleted file]
branches/winverbs/ulp/dapl2/dapl/openib_cma/dapl_ib_dto.h [deleted file]
branches/winverbs/ulp/dapl2/dapl/openib_cma/dapl_ib_extensions.c [deleted file]
branches/winverbs/ulp/dapl2/dapl/openib_cma/dapl_ib_mem.c [deleted file]
branches/winverbs/ulp/dapl2/dapl/openib_cma/dapl_ib_qp.c [deleted file]
branches/winverbs/ulp/dapl2/dapl/openib_cma/dapl_ib_util.c [deleted file]
branches/winverbs/ulp/dapl2/dapl/openib_cma/dapl_ib_util.h
branches/winverbs/ulp/dapl2/dapl/openib_cma/device.c [new file with mode: 0644]
branches/winverbs/ulp/dapl2/dapl/openib_common.c [new file with mode: 0644]
branches/winverbs/ulp/dapl2/dapl/openib_common/cq.c [new file with mode: 0644]
branches/winverbs/ulp/dapl2/dapl/openib_common/dapl_ib_common.h [new file with mode: 0644]
branches/winverbs/ulp/dapl2/dapl/openib_common/dapl_ib_dto.h [new file with mode: 0644]
branches/winverbs/ulp/dapl2/dapl/openib_common/ib_extensions.c [new file with mode: 0644]
branches/winverbs/ulp/dapl2/dapl/openib_common/mem.c [new file with mode: 0644]
branches/winverbs/ulp/dapl2/dapl/openib_common/qp.c [new file with mode: 0644]
branches/winverbs/ulp/dapl2/dapl/openib_common/util.c [new file with mode: 0644]
branches/winverbs/ulp/dapl2/dapl/openib_scm/SOURCES
branches/winverbs/ulp/dapl2/dapl/openib_scm/cm.c [new file with mode: 0644]
branches/winverbs/ulp/dapl2/dapl/openib_scm/dapl_ib_cm.c [deleted file]
branches/winverbs/ulp/dapl2/dapl/openib_scm/dapl_ib_cq.c [deleted file]
branches/winverbs/ulp/dapl2/dapl/openib_scm/dapl_ib_dto.h [deleted file]
branches/winverbs/ulp/dapl2/dapl/openib_scm/dapl_ib_extensions.c [deleted file]
branches/winverbs/ulp/dapl2/dapl/openib_scm/dapl_ib_mem.c [deleted file]
branches/winverbs/ulp/dapl2/dapl/openib_scm/dapl_ib_qp.c [deleted file]
branches/winverbs/ulp/dapl2/dapl/openib_scm/dapl_ib_util.c [deleted file]
branches/winverbs/ulp/dapl2/dapl/openib_scm/dapl_ib_util.h
branches/winverbs/ulp/dapl2/dapl/openib_scm/device.c [new file with mode: 0644]
branches/winverbs/ulp/dapl2/dapl/openib_scm/linux/openib_osd.h
branches/winverbs/ulp/dapl2/dapl/openib_scm/windows/openib_osd.h
branches/winverbs/ulp/dapl2/dat/include/dat2/dat_ib_extensions.h
branches/winverbs/ulp/dapl2/dat/udat/udat_exports.src
branches/winverbs/ulp/dapl2/test/dapltest/scripts/dt-cli.bat
branches/winverbs/ulp/dapl2/test/dapltest/scripts/dt-svr.bat
branches/winverbs/ulp/dapl2/test/dtest/Makefile.am
branches/winverbs/ulp/dapl2/test/dtest/dtest.c
branches/winverbs/ulp/dapl2/test/dtest/dtestcm.c [new file with mode: 0644]
branches/winverbs/ulp/dapl2/test/dtest/dtestx.c
branches/winverbs/ulp/dapl2/test/dtest/windows/dirs
branches/winverbs/ulp/dapl2/test/dtest/windows/dtest/SOURCES
branches/winverbs/ulp/dapl2/test/dtest/windows/dtest/dtest.c
branches/winverbs/ulp/dapl2/test/dtest/windows/dtestcm/SOURCES [new file with mode: 0644]
branches/winverbs/ulp/dapl2/test/dtest/windows/dtestcm/dtestcm.c [new file with mode: 0644]
branches/winverbs/ulp/dapl2/test/dtest/windows/dtestcm/dtestcm.rc [new file with mode: 0644]
branches/winverbs/ulp/dapl2/test/dtest/windows/dtestcm/makefile [new file with mode: 0644]
branches/winverbs/ulp/dapl2/test/dtest/windows/dtestx/SOURCES
branches/winverbs/ulp/ipoib/kernel/ipoib_port.c
branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/SOURCES
branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.c [deleted file]
branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.cpp [new file with mode: 0644]
branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.h
branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.c [deleted file]
branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp [new file with mode: 0644]
branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_endpoint.c [deleted file]
branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_endpoint.cpp [new file with mode: 0644]
branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_ibat.c [deleted file]
branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_ibat.cpp [new file with mode: 0644]
branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.c [deleted file]
branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp [new file with mode: 0644]
branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.h
branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_xfr_mgr.c [deleted file]
branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_xfr_mgr.cpp [new file with mode: 0644]

index c973131be9e68674ee09ae07e5492a2223f60be4..749debc60fc430a10d42243295f211bb730ad0a2 100644 (file)
@@ -123,7 +123,6 @@ Sub WinOF_setup
                Session.Property("REMOVE")                      & ";" & _\r
                Session.Property("NODRV")                       & ";" & _\r
                Session.Property("DBG")\r
-\r
 End Sub\r
 \r
 \r
@@ -1366,8 +1365,10 @@ Sub DriverUninstall()
        Set WshShell = CreateObject("WScript.Shell")\r
        Set fso = CreateObject("Scripting.FileSystemObject")\r
 \r
-       ' WSD is not supported on XP and should NOT have been installed.\r
-       ' otherwise, remove the service: ND (Network Direct) then WinSock Direct.\r
+       ' Check if install was done with NODRV=1, if so then nothing to do, exit\r
+       If Session.Property("NODRV") = "1" Then\r
+               Exit Sub\r
+       End If\r
 \r
        sDBG = Session.Property("DBG")\r
        sVersionNT = Session.Property("VersionNT")\r
@@ -1382,6 +1383,9 @@ Sub DriverUninstall()
                                   "Drivers\net & ndinstall.exe -r", 0, true)\r
        End If\r
        \r
+       ' WSD is not supported on XP and should NOT have been installed.\r
+       ' otherwise, remove the service: ND (Network Direct) then WinSock Direct.\r
+\r
        If sVersionNT <> WindowsXP AND fso.FileExists(sInstalldir & "installsp.exe") Then\r
                Return = WshShell.Run ("cmd.exe /c cd /d " & sInstalldir & _\r
                                   " & installsp.exe -r", 0, true)\r
@@ -1480,19 +1484,24 @@ End Sub
 ' supported on XP.\r
 \r
 Sub WSDEnable()\r
-      Dim sInstalldir, WshShell, fso\r
+       Dim sInstalldir, WshShell, fso\r
 \r
-      sInstalldir = Session.Property("INSTALLDIR")\r
+       sInstalldir = Session.Property("INSTALLDIR")\r
 \r
-      Set WshShell = CreateObject("WScript.Shell")\r
-      Set fso = CreateObject("Scripting.FileSystemObject")\r
+       Set WshShell = CreateObject("WScript.Shell")\r
+       Set fso = CreateObject("Scripting.FileSystemObject")\r
+\r
+       ' Check if install was done with NODRV=1, if so then nothing to do, exit\r
+       If Session.Property("NODRV") = "1" Then\r
+               Exit Sub\r
+       End If\r
 \r
-      If fso.FileExists(sInstalldir & "installsp.exe") Then\r
-          ' install the WinSockdirect service\r
-         Return = WshShell.Run ("cmd.exe /c cd /d " & sInstalldir _\r
+       If fso.FileExists(sInstalldir & "installsp.exe") Then\r
+               ' install the WinSockdirect service\r
+               Return = WshShell.Run ("cmd.exe /c cd /d " & sInstalldir _\r
                                  & " & installsp.exe -i", 0, true)\r
-      End If\r
-      If Err Then ShowError\r
+       End If\r
+       If Err Then ShowError\r
 \r
 End Sub\r
 \r
@@ -1510,9 +1519,9 @@ Sub ND_StartMeUp()
 \r
     ' Start the Network Direct Service if installed\r
 \r
-    If fso.FileExists(sInstalldir & "net\ndinstall.exe") Then\r
+    If fso.FileExists(sInstalldir & "Drivers\net\ndinstall.exe") Then\r
         Return = WshShell.Run ("cmd.exe /c cd /d " & sInstalldir _\r
-                               & " & net\ndinstall.exe -i", 0, true)\r
+                               & " & Drivers\net\ndinstall.exe -i", 0, true)\r
         If Err Then ShowErr2("ND service install failed")\r
     End If\r
 \r
@@ -1598,6 +1607,11 @@ Function ChkInstallAndReboot()
     Set fso = CreateObject("Scripting.FileSystemObject")    \r
     Set WshShell = CreateObject("WScript.Shell")\r
 \r
+       ' Check if install was done with NODRV=1, if so then nothing to do, exit\r
+       If Session.Property("NODRV") = "1" Then\r
+               Exit Function\r
+       End If\r
+\r
        VersionNT = Session.Property("VersionNT")\r
 \r
        ' remove any lingering driver installed files\r
index 5b93f015824d6e6680144dda725e1fb6151e28bb..18a8fbe2cacb6230bce9c5c64ebd33265be3a5e4 100644 (file)
@@ -1,6 +1,6 @@
 <Include>\r
 \r
-    <Component Id="cIBcore"\r
+    <Component Id="cDriverTools"\r
                Guid="4B4EA649-65ED-4B0D-8717-D60481412211">\r
       <CreateFolder />\r
       <File Id="dpinst.exe" Compressed="yes" DiskId="1"\r
index 5e325038adf2416da5e784eeb485fac8306711a2..f8bb552f1afd1e59d90026b5ad9a0b4bd4ea0d27 100644 (file)
@@ -37,7 +37,7 @@
 \r
        <!--> Install ONLY </!-->\r
        <Custom Action="ChkPreviousInstall" After='WinOF_setup'>\r
-               NOT Installed</Custom>\r
+               NOT Installed AND Not NODRV </Custom>\r
 \r
        <ScheduleReboot After='ChkPreviousInstall'>\r
                REBOOT="FORCE"</ScheduleReboot>\r
@@ -60,7 +60,7 @@
 \r
        <!--> REMOVE ONLY </!-->\r
        <Custom Action="DriverUninstall" After="PublishProduct">\r
-               REMOVE="ALL" </Custom>\r
+               REMOVE="ALL" AND Not NODRV </Custom>\r
 \r
        <Custom Action="HammerTime" After="InstallFinalize">REMOVE="ALL"</Custom>\r
 \r
index d7087ef56ba80a1bed64e29e601d1e1408b9aca2..9717c558fcd6bf6dcb6aa766113100fa7e144d37 100644 (file)
@@ -6,25 +6,25 @@
                Permanent='no' Transitive='no' Win64='no'\r
                Location='either'>\r
 \r
-        <File Id="opensm.exe" Compressed="yes" DiskId="1"\r
-              LongName="opensm.exe" Name="OPENSM.EXE"\r
-              Source="..\bin\tools\$(var.ARCH)\release\opensm.exe"\r
-              Vital='yes' KeyPath='yes' Hidden='no' System='no' \r
-              Checksum='no' ReadOnly='no' />\r
+         <File Id="opensm.exe" Compressed="yes" DiskId="1"\r
+               LongName="opensm.exe" Name="OPENSM.EXE"\r
+               Source="..\bin\tools\$(var.ARCH)\release\opensm.exe"\r
+               Vital='yes' KeyPath='yes' Hidden='no' System='no' \r
+               Checksum='no' ReadOnly='no' />\r
 \r
-        <ServiceInstall Id='osmSvcInstall' Vital='yes' Name='OpenSM'\r
-            Description='InfiniBand Subnet Configuration and Management'\r
-            DisplayName='InfiniBand Subnet Manager'\r
-            Arguments='-e --service'\r
-            ErrorControl='normal'\r
-            Start='disabled'\r
-            Interactive='no'\r
-            Type='ownProcess' />\r
+         <ServiceInstall Id='osmSvcInstall' Vital='yes' Name='OpenSM'\r
+               Description='InfiniBand Subnet Configuration and Management'\r
+               DisplayName='InfiniBand Subnet Manager'\r
+               Arguments='-e --service'\r
+               ErrorControl='normal'\r
+               Start='disabled'\r
+               Interactive='no'\r
+               Type='ownProcess' />\r
 \r
-        <ServiceControl Id='osmSvcControl' Name='OpenSM'\r
-                        Stop='uninstall'\r
-                        Wait='no'\r
-                        Remove='uninstall' />\r
+         <ServiceControl Id='osmSvcControl' Name='OpenSM'\r
+               Stop='uninstall'\r
+               Wait='no'\r
+               Remove='uninstall' />\r
     </Component>\r
 \r
     <Component Id="OpenSM_Service_enabled"\r
index a6ba84bec26004228eaf5f33d6297ccc8263ca71..31da5cafaa2a4ae80ef8649d3363e4d068afd6eb 100644 (file)
           <File Id="dtestx.exe" Compressed="yes" DiskId="1"\r
                  LongName="dtestx.exe" Name="dtestx.exe"\r
                  Source="..\bin\tools\$(var.ARCH)\release\dtestx.exe" />\r
+          <File Id="dtestcm.exe" Compressed="yes" DiskId="1"\r
+                 LongName="dtestcm.exe" Name="dtestcm.exe"\r
+                 Source="..\bin\tools\$(var.ARCH)\release\dtestcm.exe" />\r
 \r
           <File Id="dapl2.pdb" Compressed="yes" DiskId="1"\r
                 LongName="dapl2.pdb" Name="dapl2.pdb"\r
diff --git a/branches/winverbs/WinOF/WIX/common/std_features.inc b/branches/winverbs/WinOF/WIX/common/std_features.inc
new file mode 100644 (file)
index 0000000..70602e3
--- /dev/null
@@ -0,0 +1,175 @@
+<Include>\r
+\r
+    <Feature Id="IBcore" Title="InfiniBand Core Modules" Level="1"\r
+        Description="Drivers, Libraries, Subnet Management, Tools, Diags, Docs"\r
+        Display="collapse" ConfigurableDirectory="INSTALLDIR"\r
+        AllowAdvertise="no" InstallDefault="local" Absent="disallow">\r
+\r
+      <ComponentRef Id="cDriverTools" />\r
+      <ComponentRef Id="Docs" />\r
+      <ComponentRef Id="Tools" />\r
+      <ComponentRef Id="OpenSMservice" />\r
+\r
+      <?if $(var.OS) = "wlh" AND $(var.ARCHP) = "x64" ?>\r
+         <ComponentRef Id="cCertPush" />\r
+      <?endif?>\r
+\r
+      <Feature Id="fMxDrivers" Title="Mellanox HCA Drivers" Level="1"\r
+           Description="Mellanox InfiniBand Host Channel Adapter Drivers"\r
+           Display="expand" ConfigurableDirectory="INSTALLDIR"\r
+           AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
+        <Condition Level="200"><![CDATA[NODRV=1]]></Condition>\r
+        <ComponentRef Id="cMthcaDriver" />\r
+        <ComponentRef Id="cMLX4BusDriver" />\r
+        <ComponentRef Id="cMLX4HcaDriver" />\r
+      </Feature>\r
+\r
+      <Feature Id="fWV" Title="WinVerbs"\r
+          Description="OFED verbs - Libraries + utilities"\r
+          Display="expand" Level="1" ConfigurableDirectory="INSTALLDIR"\r
+          AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
+          <ComponentRef Id="cWinVerbsOFED" />\r
+          <ComponentRef Id="cWinVerbsUApps" />\r
+      </Feature>\r
+\r
+      <Feature Id="fIOU" Title="I/O Unit Driver"\r
+         Description="InfiniBand I/O Unit Driver"\r
+         Display="expand" Level="1" \r
+         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
+        <Condition Level="200"><![CDATA[NODRV=1]]></Condition>\r
+        <ComponentRef Id="cIOUdriver" />\r
+      </Feature>\r
+\r
+    </Feature>\r
+\r
+    <Feature Id="fIPoIB" Title="IPoIB" Level="1"\r
+        Description="Internet Protocols over InfiniBand" Display="expand"\r
+        ConfigurableDirectory="INSTALLDIR" AllowAdvertise="no"\r
+        InstallDefault="local" Absent="allow">\r
+      <Condition Level="200"><![CDATA[NODRV=1]]></Condition>\r
+      <ComponentRef Id="cIPoIB" />\r
+    </Feature>\r
+\r
+    <?if $(var.OS) != "XP" ?>\r
+\r
+        <Feature Id="fWSD" Title="WSD" Description="Winsock Direct Enabled"\r
+               Display="expand" Level="1" ConfigurableDirectory="INSTALLDIR"\r
+            AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
+          <!-- skip WSD on Windows XP, IPoIB is required for WSD. -->\r
+          <Condition Level="300"><![CDATA[NODRV=1]]></Condition>\r
+          <Condition Level="400"><![CDATA[VersionNT=501]]></Condition>\r
+          <Condition Level="201"> IPOIB_EXISTS </Condition>\r
+          <ComponentRef Id="WinsockDirect" />\r
+        </Feature>\r
+\r
+    <?endif?>\r
+\r
+    <?if $(var.ARCHP) != "ia64" ?>\r
+\r
+        <!-- when ND builds/works for ia64. -->\r
+        <Feature Id="fND" Title="Network Direct"\r
+            Description="Network Direct Enabled"\r
+            Display="expand" Level="1" ConfigurableDirectory="INSTALLDIR"\r
+            AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
+            <ComponentRef Id="cNetworkDirect" />\r
+            <Condition Level="201"> IPOIB_EXISTS </Condition>\r
+        </Feature>\r
+\r
+    <?endif?>\r
+\r
+    <Feature Id="fOSMS" Title="OpenSM Service Started" Level="5"\r
+        Description="Open Subnet Management started as a local Windows Service"\r
+        Display="expand" ConfigurableDirectory="INSTALLDIR" AllowAdvertise="no"\r
+        InstallDefault="local" Absent="allow">\r
+      <ComponentRef Id="OpenSM_Service_enabled" />\r
+    </Feature>\r
+\r
+    <Feature Id="fDAPL" Title="DAPL" Description="DAT+DAPL over InfiniBand"\r
+        Display="collapse" Level="1" ConfigurableDirectory="INSTALLDIR"\r
+        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
+      <Condition Level="201"> IPOIB_EXISTS </Condition>\r
+\r
+      <Feature Id="fDatConf" Title="DAT-DAPL Config File"\r
+         Description="DAPL runtime configuration file; installed if %SystemDrive%\DAT\dat.conf does not exist."\r
+         Display="expand" Level="1" \r
+         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
+        <Condition Level="0"> DAT_CONF_EXISTS AND Not Installed </Condition>\r
+        <ComponentRef Id="cDatCfg" />\r
+      </Feature>\r
+\r
+      <Feature Id="fDatBASIC1" Title="DAT 1.1 Runtime"\r
+         Description="DAT 1.1 runtime libraries"\r
+         Display="expand" Level="1" \r
+         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
+        <ComponentRef Id="cDAPL1RT" />\r
+      </Feature>\r
+\r
+      <Feature Id="fDatBldKit1" Title="DAT 1.1 Build Kit"\r
+         Description="DAT 1.1 Application Build Kit - Headers and Libraries"\r
+         Display="expand" Level="2" \r
+         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
+         <Condition Level="201"> DAT1_INSTALLED </Condition>\r
+         <ComponentRef Id="cDATV1" />\r
+         <ComponentRef Id="cDatBldV1Hdrs" />\r
+         <ComponentRef Id="cDatBldV1Libs" />\r
+      </Feature>\r
+\r
+      <Feature Id="fDatBASIC2" Title="DAT 2.0 Runtime"\r
+         Description="DAT 2.0 runtime libraries"\r
+         Display="expand" Level="1" \r
+         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
+        <ComponentRef Id="cDAPL2RT" />\r
+      </Feature>\r
+\r
+      <Feature Id="fDatBldKit2" Title="DAT 2.0 Build Kit"\r
+         Description="DAT 2.0 Application Build Kit - Headers and Libraries"\r
+         Display="expand" Level="2" \r
+         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
+         <Condition Level="201"> DAT2_INSTALLED </Condition>\r
+         <ComponentRef Id="cDATV2" />\r
+         <ComponentRef Id="cDatBldV2Hdrs" />\r
+         <ComponentRef Id="cDatBldV2Libs" />\r
+      </Feature>\r
+    </Feature>\r
+\r
+    <?if $(var.OS) != "XP" ?>\r
+\r
+        <!-- Skip SRP on XP 32bit -->\r
+        <Feature Id="fSRP" Title="SRP" Level="5" Description="SCSI over RDMA"\r
+            Display="expand" ConfigurableDirectory="INSTALLDIR"\r
+            AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
+          <Condition Level="200"><![CDATA[NODRV=1]]></Condition>\r
+          <ComponentRef Id="cSRP_driver_installed" />\r
+        </Feature>\r
+\r
+    <?endif?>\r
+\r
+    <Feature Id="fVNIC" Title="QLogic-VNIC"\r
+        Description="QLogic - Virtual NIC over InfiniBand"\r
+        Display="expand" Level="5" ConfigurableDirectory="INSTALLDIR"\r
+        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
+      <Condition Level="200"><![CDATA[NODRV=1]]></Condition>\r
+      <ComponentRef Id="cQLVNIC_driver_installed" />\r
+    </Feature>\r
+\r
+    <Feature Id="fIBsdk" Title="InfiniBand SDK" Level="2"\r
+         Description="InfiniBand Software Development Kit (Headers + Libs)"\r
+         Display="expand" ConfigurableDirectory="INSTALLDIR"\r
+         AllowAdvertise='no' InstallDefault='local' Absent='disallow'>\r
+      <ComponentRef Id="cIBAL_Libs" />\r
+      <ComponentRef Id="cIBAL_Incs" />\r
+      <ComponentRef Id="cIBAL_Complib" />\r
+      <ComponentRef Id="cIBAL_IBA" />\r
+      <ComponentRef Id="cDDK_example" />\r
+      <ComponentRef Id="cVS_example" />\r
+    </Feature>\r
+\r
+    <Feature Id="fCHECKED" Title="Debug/Checked Modules"\r
+         Description="Checked versions: Not installed; see %ProgramFiles%\WinOF\Checked."\r
+         Display="expand" Level="5" ConfigurableDirectory="INSTALLDIR"\r
+         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
+      <ComponentRef Id="cCHK_kernel" />\r
+      <ComponentRef Id="cCHK_user" />\r
+    </Feature>\r
+\r
+</Include>\r
index df8faa4d0967fbc6db41584ef4b988516283c841..886ed36ce5ea92f1089549ddce5d93bf563d79cb 100644 (file)
        Features - Level=1 == Typical, no WSD on XP or SRP on 32-bit XP\r
      -->\r
 \r
-    <Feature Id="fMxDrivers" Title="Mellanox HCA Drivers" Level="1"\r
-         Description="Mellanox InfiniBand Host Channel Adapter Drivers"\r
-         Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-      <ComponentRef Id="cMthcaDriver" />\r
-      <ComponentRef Id="cMLX4BusDriver" />\r
-      <ComponentRef Id="cMLX4HcaDriver" />\r
-    </Feature>\r
-\r
-    <Feature Id="IBcore" Title="InfiniBand Core Modules" Level="1"\r
-        Description="InfiniBand: Core, Tools, Docs"\r
-        Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="disallow">\r
-      <ComponentRef Id="cIBcore" />\r
-      <ComponentRef Id="cIOUdriver" />\r
-      <ComponentRef Id="Docs" />\r
-      <ComponentRef Id="Tools" />\r
-      <ComponentRef Id="OpenSMservice" />\r
-    </Feature>\r
-\r
-    <Feature Id="fWV" Title="WinVerbs"\r
-        Description="OFED verbs - Libraries + utilities"\r
-        Display="expand" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-        <ComponentRef Id="cWinVerbsOFED" />\r
-        <ComponentRef Id="cWinVerbsUApps" />\r
-    </Feature>\r
-\r
-    <Feature Id="fIPoIB" Title="IPoIB" Level="1"\r
-        Description="Internet Protocols over InfiniBand" Display="expand"\r
-        ConfigurableDirectory="INSTALLDIR" AllowAdvertise="no"\r
-        InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="cIPoIB" />\r
-    </Feature>\r
-\r
-    <Feature Id="fWSD" Title="WSD" Description="Winsock Direct Enabled"\r
-           Display="expand" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-      <!-- skip WSD on Windows XP, IPoIB is required for WSD. -->\r
-      <Condition Level="200"><![CDATA[VersionNT=501]]></Condition>\r
-      <Condition Level="201"> IPOIB_EXISTS </Condition>\r
-      <ComponentRef Id="WinsockDirect" />\r
-    </Feature>\r
-\r
-<!-- when ND on ia64 works.\r
-    <Feature Id="fND" Title="Network Direct"\r
-        Description="Network Direct Enabled"\r
-        Display="expand" Level="2" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-        <ComponentRef Id="cNetworkDirect" />\r
-        <Condition Level="201"> IPOIB_EXISTS </Condition>\r
-    </Feature>\r
--->\r
-    <Feature Id="fOSMS" Title="OpenSM Service Started" Level="5"\r
-        Description="Open Subnet Management started as a local Windows Service"\r
-        Display="expand" ConfigurableDirectory="INSTALLDIR" AllowAdvertise="no"\r
-        InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="OpenSM_Service_enabled" />\r
-    </Feature>\r
-\r
-    <Feature Id="fDAPL" Title="DAPL" Description="DAT+DAPL over InfiniBand"\r
-        Display="collapse" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-      <Condition Level="201"> IPOIB_EXISTS </Condition>\r
-\r
-      <Feature Id="fDatConf" Title="DAT-DAPL Config File"\r
-         Description="DAPL runtime configuration file; installed if %SystemDrive%\DAT\dat.conf does not exist."\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <Condition Level="0"> DAT_CONF_EXISTS AND Not Installed </Condition>\r
-        <ComponentRef Id="cDatCfg" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBASIC1" Title="DAT 1.1 Runtime"\r
-         Description="DAT 1.1 runtime libraries"\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <ComponentRef Id="cDAPL1RT" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBldKit1" Title="DAT 1.1 Build Kit"\r
-         Description="DAT 1.1 Application Build Kit - Headers and Libraries"\r
-         Display="expand" Level="2" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-         <Condition Level="201"> DAT1_INSTALLED </Condition>\r
-         <ComponentRef Id="cDATV1" />\r
-         <ComponentRef Id="cDatBldV1Hdrs" />\r
-         <ComponentRef Id="cDatBldV1Libs" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBASIC2" Title="DAT 2.0 Runtime"\r
-         Description="DAT 2.0 runtime libraries"\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <ComponentRef Id="cDAPL2RT" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBldKit2" Title="DAT 2.0 Build Kit"\r
-         Description="DAT 2.0 Application Build Kit - Headers and Libraries"\r
-         Display="expand" Level="2" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-         <Condition Level="201"> DAT2_INSTALLED </Condition>\r
-         <ComponentRef Id="cDATV2" />\r
-         <ComponentRef Id="cDatBldV2Hdrs" />\r
-         <ComponentRef Id="cDatBldV2Libs" />\r
-      </Feature>\r
-    </Feature>\r
-\r
-    <Feature Id="fSRP" Title="SRP" Level="5" Description="SCSI over RDMA"\r
-        Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="cSRP_driver_installed" />\r
-    </Feature>\r
-\r
-    <Feature Id="fVNIC" Title="QLogic-VNIC"\r
-        Description="QLogic - Virtual NIC over InfiniBand"\r
-        Display="expand" Level="5" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="cQLVNIC_driver_installed" />\r
-    </Feature>\r
-\r
-    <Feature Id="fIBsdk" Title="InfiniBand SDK" Level="2"\r
-         Description="InfiniBand Software Development Kit (Headers + Libs)"\r
-         Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='disallow'>\r
-      <ComponentRef Id="cIBAL_Libs" />\r
-      <ComponentRef Id="cIBAL_Incs" />\r
-      <ComponentRef Id="cIBAL_Complib" />\r
-      <ComponentRef Id="cIBAL_IBA" />\r
-      <ComponentRef Id="cDDK_example" />\r
-      <ComponentRef Id="cVS_example" />\r
-    </Feature>\r
-\r
-    <Feature Id="fCHECKED" Title="Debug/Checked Modules"\r
-         Description="Checked versions: Not installed; see %ProgramFiles%\WinOF\Checked."\r
-         Display="expand" Level="5" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-      <ComponentRef Id="cCHK_kernel" />\r
-      <ComponentRef Id="cCHK_user" />\r
-    </Feature>\r
+    <?include ..\..\common\std_features.inc ?>\r
 \r
     <?include ..\..\common\InstallExecuteSeq.inc ?>\r
 \r
index 52eebf116ab78a959d4ee50152b44b28e922b1c4..5fb61d87dc6ea9485e7506d1445f65695471cae0 100644 (file)
        Features - Level=1 == Typical, no WSD on XP or SRP on 32-bit XP\r
      -->\r
 \r
-    <Feature Id="fMxDrivers" Title="Mellanox HCA Drivers" Level="1"\r
-         Description="Mellanox InfiniBand Host Channel Adapter Drivers"\r
-         Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-      <ComponentRef Id="cMthcaDriver" />\r
-      <ComponentRef Id="cMLX4BusDriver" />\r
-      <ComponentRef Id="cMLX4HcaDriver" />\r
-    </Feature>\r
-\r
-    <Feature Id="IBcore" Title="InfiniBand Core Modules" Level="1"\r
-        Description="InfiniBand: Core, Tools, Docs"\r
-        Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="disallow">\r
-      <ComponentRef Id="cIBcore" />\r
-      <ComponentRef Id="cIOUdriver" />\r
-      <ComponentRef Id="Docs" />\r
-      <ComponentRef Id="Tools" />\r
-      <ComponentRef Id="OpenSMservice" />\r
-      <ComponentRef Id="cCertPush" />\r
-    </Feature>\r
-\r
-    <Feature Id="fWV" Title="WinVerbs"\r
-        Description="OFED verbs - Libraries + utilities"\r
-        Display="expand" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-        <ComponentRef Id="cWinVerbsOFED" />\r
-        <ComponentRef Id="cWinVerbsUApps" />\r
-    </Feature>\r
-\r
-    <Feature Id="fIPoIB" Title="IPoIB" Level="1"\r
-        Description="Internet Protocols over InfiniBand" Display="expand"\r
-        ConfigurableDirectory="INSTALLDIR" AllowAdvertise="no"\r
-        InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="cIPoIB" />\r
-    </Feature>\r
-\r
-    <Feature Id="fWSD" Title="WSD" Description="Winsock Direct Enabled"\r
-           Display="expand" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-      <!-- skip WSD on Windows XP, IPoIB is required for WSD. -->\r
-      <Condition Level="200"><![CDATA[VersionNT=501]]></Condition>\r
-      <Condition Level="201"> IPOIB_EXISTS </Condition>\r
-      <ComponentRef Id="WinsockDirect" />\r
-    </Feature>\r
-\r
-    <Feature Id="fND" Title="Network Direct"\r
-        Description="Network Direct Enabled"\r
-        Display="expand" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-        <ComponentRef Id="cNetworkDirect" />\r
-        <Condition Level="201"> IPOIB_EXISTS </Condition>\r
-    </Feature>\r
-\r
-    <Feature Id="fOSMS" Title="OpenSM Service Started" Level="5"\r
-        Description="Open Subnet Management started as a local Windows Service"\r
-        Display="expand" ConfigurableDirectory="INSTALLDIR" AllowAdvertise="no"\r
-        InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="OpenSM_Service_enabled" />\r
-    </Feature>\r
-\r
-    <Feature Id="fDAPL" Title="DAPL" Description="DAT+DAPL over InfiniBand"\r
-        Display="collapse" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-      <Condition Level="201"> IPOIB_EXISTS </Condition>\r
-\r
-      <Feature Id="fDatConf" Title="DAT-DAPL Config File"\r
-         Description="DAPL runtime configuration file; installed if %SystemDrive%\DAT\dat.conf does not exist."\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <Condition Level="0"> DAT_CONF_EXISTS AND Not Installed </Condition>\r
-        <ComponentRef Id="cDatCfg" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBASIC1" Title="DAT 1.1 Runtime"\r
-         Description="DAT 1.1 runtime libraries"\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <ComponentRef Id="cDAPL1RT" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBldKit1" Title="DAT 1.1 Build Kit"\r
-         Description="DAT 1.1 Application Build Kit - Headers and Libraries"\r
-         Display="expand" Level="2" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-         <Condition Level="201"> DAT1_INSTALLED </Condition>\r
-         <ComponentRef Id="cDATV1" />\r
-         <ComponentRef Id="cDatBldV1Hdrs" />\r
-         <ComponentRef Id="cDatBldV1Libs" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBASIC2" Title="DAT 2.0 Runtime"\r
-         Description="DAT 2.0 runtime libraries"\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <ComponentRef Id="cDAPL2RT" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBldKit2" Title="DAT 2.0 Build Kit"\r
-         Description="DAT 2.0 Application Build Kit - Headers and Libraries"\r
-         Display="expand" Level="2" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-         <Condition Level="201"> DAT2_INSTALLED </Condition>\r
-         <ComponentRef Id="cDATV2" />\r
-         <ComponentRef Id="cDatBldV2Hdrs" />\r
-         <ComponentRef Id="cDatBldV2Libs" />\r
-      </Feature>\r
-    </Feature>\r
-\r
-    <Feature Id="fSRP" Title="SRP" Level="5" Description="SCSI over RDMA"\r
-        Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="cSRP_driver_installed" />\r
-    </Feature>\r
-\r
-    <Feature Id="fVNIC" Title="QLogic-VNIC"\r
-        Description="QLogic - Virtual NIC over InfiniBand"\r
-        Display="expand" Level="5" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="cQLVNIC_driver_installed" />\r
-    </Feature>\r
-\r
-    <Feature Id="fIBsdk" Title="InfiniBand SDK" Level="2"\r
-         Description="InfiniBand Software Development Kit (Headers + Libs)"\r
-         Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='disallow'>\r
-      <ComponentRef Id="cIBAL_Libs" />\r
-      <ComponentRef Id="cIBAL_Incs" />\r
-      <ComponentRef Id="cIBAL_Complib" />\r
-      <ComponentRef Id="cIBAL_IBA" />\r
-      <ComponentRef Id="cDDK_example" />\r
-      <ComponentRef Id="cVS_example" />\r
-    </Feature>\r
-\r
-    <Feature Id="fCHECKED" Title="Debug/Checked Modules"\r
-         Description="Checked versions: Not installed; see %ProgramFiles%\WinOF\Checked."\r
-         Display="expand" Level="5" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-      <ComponentRef Id="cCHK_kernel" />\r
-      <ComponentRef Id="cCHK_user" />\r
-    </Feature>\r
+    <?include ..\..\common\std_features.inc ?>\r
 \r
     <?include ..\..\common\InstallExecuteSeq.inc ?>\r
 \r
index 23ac09b14a21d40e29a3666d45773098c7d1e676..0bf3c94964049873b17bec975408cb747efe12be 100644 (file)
        Features - Level=1 == Typical, no WSD on XP or SRP on 32-bit XP\r
      -->\r
 \r
-    <Feature Id="fMxDrivers" Title="Mellanox HCA Drivers" Level="1"\r
-         Description="Mellanox InfiniBand Host Channel Adapter Drivers"\r
-         Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-      <ComponentRef Id="cMthcaDriver" />\r
-      <ComponentRef Id="cMLX4BusDriver" />\r
-      <ComponentRef Id="cMLX4HcaDriver" />\r
-    </Feature>\r
-\r
-    <Feature Id="IBcore" Title="InfiniBand Core Modules" Level="1"\r
-        Description="InfiniBand: Core, Tools, Docs"\r
-        Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="disallow">\r
-      <ComponentRef Id="cIBcore" />\r
-      <ComponentRef Id="cIOUdriver" />\r
-      <ComponentRef Id="Docs" />\r
-      <ComponentRef Id="Tools" />\r
-      <ComponentRef Id="OpenSMservice" />\r
-    </Feature>\r
-\r
-    <Feature Id="fWV" Title="WinVerbs"\r
-        Description="OFED verbs - Libraries + utilities"\r
-        Display="expand" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-        <ComponentRef Id="cWinVerbsOFED" />\r
-        <ComponentRef Id="cWinVerbsUApps" />\r
-    </Feature>\r
-\r
-    <Feature Id="fIPoIB" Title="IPoIB" Level="1"\r
-        Description="Internet Protocols over InfiniBand" Display="expand"\r
-        ConfigurableDirectory="INSTALLDIR" AllowAdvertise="no"\r
-        InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="cIPoIB" />\r
-    </Feature>\r
-\r
-    <Feature Id="fWSD" Title="WSD" Description="Winsock Direct Enabled"\r
-        Display="expand" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-        <!-- skip WSD on Windows XP -->\r
-        <Condition Level="0"><![CDATA[VersionNT=501]]></Condition>\r
-        <ComponentRef Id="WinsockDirect" />\r
-    </Feature>\r
-\r
-    <Feature Id="fND" Title="Network Direct"\r
-        Description="Network Direct Enabled"\r
-        Display="expand" Level="2" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-        <ComponentRef Id="cNetworkDirect" />\r
-    </Feature>\r
-\r
-    <Feature Id="fOSMS" Title="OpenSM Service Started" Level="5"\r
-        Description="Open Subnet Management started as a local Windows Service"\r
-        Display="expand" ConfigurableDirectory="INSTALLDIR" AllowAdvertise="no"\r
-        InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="OpenSM_Service_enabled" />\r
-    </Feature>\r
-\r
-    <Feature Id="fDAPL" Title="DAPL" Description="DAT+DAPL over InfiniBand"\r
-        Display="collapse" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-      <Condition Level="201"> IPOIB_EXISTS </Condition>\r
-\r
-      <Feature Id="fDatConf" Title="DAT-DAPL Config File"\r
-         Description="DAPL runtime configuration file; installed if %SystemDrive%\DAT\dat.conf does not exist."\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <Condition Level="0"> DAT_CONF_EXISTS AND Not Installed </Condition>\r
-        <ComponentRef Id="cDatCfg" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBASIC1" Title="DAT 1.1 Runtime"\r
-         Description="DAT 1.1 runtime libraries"\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <ComponentRef Id="cDAPL1RT" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBldKit1" Title="DAT 1.1 Build Kit"\r
-         Description="DAT 1.1 Application Build Kit - Headers and Libraries"\r
-         Display="expand" Level="2" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-         <Condition Level="201"> DAT1_INSTALLED </Condition>\r
-         <ComponentRef Id="cDATV1" />\r
-         <ComponentRef Id="cDatBldV1Hdrs" />\r
-         <ComponentRef Id="cDatBldV1Libs" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBASIC2" Title="DAT 2.0 Runtime"\r
-         Description="DAT 2.0 runtime libraries"\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <ComponentRef Id="cDAPL2RT" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBldKit2" Title="DAT 2.0 Build Kit"\r
-         Description="DAT 2.0 Application Build Kit - Headers and Libraries"\r
-         Display="expand" Level="2" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-         <Condition Level="201"> DAT2_INSTALLED </Condition>\r
-         <ComponentRef Id="cDATV2" />\r
-         <ComponentRef Id="cDatBldV2Hdrs" />\r
-         <ComponentRef Id="cDatBldV2Libs" />\r
-      </Feature>\r
-    </Feature>\r
-\r
-    <Feature Id="fSRP" Title="SRP" Level="5" Description="SCSI over RDMA"\r
-        Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-        <!-- skip SRP on 32-bit Windows XP -->\r
-        <Condition Level="0">\r
-          <![CDATA[VersionNT=501 AND (Not Intel64 AND Not Msix64)]]>\r
-        </Condition>\r
-      <ComponentRef Id="cSRP_driver_installed" />\r
-    </Feature>\r
-\r
-    <Feature Id="fVNIC" Title="QLogic-VNIC"\r
-        Description="QLogic - Virtual NIC over InfiniBand"\r
-        Display="expand" Level="5" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="cQLVNIC_driver_installed" />\r
-    </Feature>\r
-\r
-    <Feature Id="fIBsdk" Title="InfiniBand SDK" Level="2"\r
-         Description="InfiniBand Software Development Kit (Headers + Libs)"\r
-         Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='disallow'>\r
-      <ComponentRef Id="cIBAL_Libs" />\r
-      <ComponentRef Id="cIBAL_Incs" />\r
-      <ComponentRef Id="cIBAL_Complib" />\r
-      <ComponentRef Id="cIBAL_IBA" />\r
-      <ComponentRef Id="cDDK_example" />\r
-      <ComponentRef Id="cVS_example" />\r
-    </Feature>\r
-\r
-    <Feature Id="fCHECKED" Title="Debug/Checked Modules"\r
-         Description="Checked versions: Not installed; see %ProgramFiles%\WinOF\Checked."\r
-         Display="expand" Level="5" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-      <ComponentRef Id="cCHK_kernel" />\r
-      <ComponentRef Id="cCHK_user" />\r
-    </Feature>\r
+    <?include ..\..\common\std_features.inc ?>\r
 \r
     <?include ..\..\common\InstallExecuteSeq.inc ?>\r
 \r
index b90ae9f117e51f4ad63e021865d98ed7324410e6..3089a99c95ee52ba216209b15d5c9bb95f8247e9 100644 (file)
        Features - Level=1 == Typical, no WSD on XP or SRP on 32-bit XP\r
      -->\r
 \r
-    <Feature Id="fMxDrivers" Title="Mellanox HCA Drivers" Level="1"\r
-         Description="Mellanox InfiniBand Host Channel Adapter Drivers"\r
-         Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-      <ComponentRef Id="cMthcaDriver" />\r
-      <ComponentRef Id="cMLX4BusDriver" />\r
-      <ComponentRef Id="cMLX4HcaDriver" />\r
-    </Feature>\r
-\r
-    <Feature Id="IBcore" Title="InfiniBand Core Modules" Level="1"\r
-        Description="InfiniBand: Core, Tools, Docs"\r
-        Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="disallow">\r
-      <ComponentRef Id="cIBcore" />\r
-      <ComponentRef Id="cIOUdriver" />\r
-      <ComponentRef Id="Docs" />\r
-      <ComponentRef Id="Tools" />\r
-      <ComponentRef Id="OpenSMservice" />\r
-    </Feature>\r
-\r
-    <Feature Id="fWV" Title="WinVerbs"\r
-        Description="OFED verbs - Libraries + utilities"\r
-        Display="expand" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-        <ComponentRef Id="cWinVerbsOFED" />\r
-        <ComponentRef Id="cWinVerbsUApps" />\r
-    </Feature>\r
-\r
-    <Feature Id="fIPoIB" Title="IPoIB" Level="1"\r
-        Description="Internet Protocols over InfiniBand" Display="expand"\r
-        ConfigurableDirectory="INSTALLDIR" AllowAdvertise="no"\r
-        InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="cIPoIB" />\r
-    </Feature>\r
-\r
-    <Feature Id="fWSD" Title="WSD" Description="Winsock Direct Enabled"\r
-           Display="expand" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-      <!-- skip WSD on Windows XP, IPoIB is required for WSD. -->\r
-      <Condition Level="200"><![CDATA[VersionNT=501]]></Condition>\r
-      <Condition Level="201"> IPOIB_EXISTS </Condition>\r
-      <ComponentRef Id="WinsockDirect" />\r
-    </Feature>\r
-\r
-<!-- when ND on ia64 works.\r
-    <Feature Id="fND" Title="Network Direct"\r
-        Description="Network Direct Enabled"\r
-        Display="expand" Level="2" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-        <ComponentRef Id="cNetworkDirect" />\r
-        <Condition Level="201"> IPOIB_EXISTS </Condition>\r
-    </Feature>\r
--->\r
-    <Feature Id="fOSMS" Title="OpenSM Service Started" Level="5"\r
-        Description="Open Subnet Management started as a local Windows Service"\r
-        Display="expand" ConfigurableDirectory="INSTALLDIR" AllowAdvertise="no"\r
-        InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="OpenSM_Service_enabled" />\r
-    </Feature>\r
-\r
-    <Feature Id="fDAPL" Title="DAPL" Description="DAT+DAPL over InfiniBand"\r
-        Display="collapse" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-      <Condition Level="201"> IPOIB_EXISTS </Condition>\r
-\r
-      <Feature Id="fDatConf" Title="DAT-DAPL Config File"\r
-         Description="DAPL runtime configuration file; installed if %SystemDrive%\DAT\dat.conf does not exist."\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <Condition Level="0"> DAT_CONF_EXISTS AND Not Installed </Condition>\r
-        <ComponentRef Id="cDatCfg" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBASIC1" Title="DAT 1.1 Runtime"\r
-         Description="DAT 1.1 runtime libraries"\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <ComponentRef Id="cDAPL1RT" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBldKit1" Title="DAT 1.1 Build Kit"\r
-         Description="DAT 1.1 Application Build Kit - Headers and Libraries"\r
-         Display="expand" Level="2" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-         <Condition Level="201"> DAT1_INSTALLED </Condition>\r
-         <ComponentRef Id="cDATV1" />\r
-         <ComponentRef Id="cDatBldV1Hdrs" />\r
-         <ComponentRef Id="cDatBldV1Libs" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBASIC2" Title="DAT 2.0 Runtime"\r
-         Description="DAT 2.0 runtime libraries"\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <ComponentRef Id="cDAPL2RT" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBldKit2" Title="DAT 2.0 Build Kit"\r
-         Description="DAT 2.0 Application Build Kit - Headers and Libraries"\r
-         Display="expand" Level="2" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-         <Condition Level="201"> DAT2_INSTALLED </Condition>\r
-         <ComponentRef Id="cDATV2" />\r
-         <ComponentRef Id="cDatBldV2Hdrs" />\r
-         <ComponentRef Id="cDatBldV2Libs" />\r
-      </Feature>\r
-    </Feature>\r
-\r
-    <Feature Id="fSRP" Title="SRP" Level="5" Description="SCSI over RDMA"\r
-        Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="cSRP_driver_installed" />\r
-    </Feature>\r
-\r
-    <Feature Id="fVNIC" Title="QLogic-VNIC"\r
-        Description="QLogic - Virtual NIC over InfiniBand"\r
-        Display="expand" Level="5" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="cQLVNIC_driver_installed" />\r
-    </Feature>\r
-\r
-    <Feature Id="fIBsdk" Title="InfiniBand SDK" Level="2"\r
-         Description="InfiniBand Software Development Kit (Headers + Libs)"\r
-         Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='disallow'>\r
-      <ComponentRef Id="cIBAL_Libs" />\r
-      <ComponentRef Id="cIBAL_Incs" />\r
-      <ComponentRef Id="cIBAL_Complib" />\r
-      <ComponentRef Id="cIBAL_IBA" />\r
-      <ComponentRef Id="cDDK_example" />\r
-      <ComponentRef Id="cVS_example" />\r
-    </Feature>\r
-\r
-    <Feature Id="fCHECKED" Title="Debug/Checked Modules"\r
-         Description="Checked versions: Not installed; see %ProgramFiles%\WinOF\Checked."\r
-         Display="expand" Level="5" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-      <ComponentRef Id="cCHK_kernel" />\r
-      <ComponentRef Id="cCHK_user" />\r
-    </Feature>\r
+    <?include ..\..\common\std_features.inc ?>\r
 \r
     <?include ..\..\common\InstallExecuteSeq.inc ?>\r
 \r
index e5e5cf479f12121280eb44046e22455b5918ca18..ff172aeb0f6c1cce5ffa0593957d97de84acdb2d 100644 (file)
        Features - Level=1 == Typical, no WSD on XP or SRP on 32-bit XP\r
      -->\r
 \r
-    <Feature Id="fMxDrivers" Title="Mellanox HCA Drivers" Level="1"\r
-         Description="Mellanox InfiniBand Host Channel Adapter Drivers"\r
-         Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-      <ComponentRef Id="cMthcaDriver" />\r
-      <ComponentRef Id="cMLX4BusDriver" />\r
-      <ComponentRef Id="cMLX4HcaDriver" />\r
-    </Feature>\r
-\r
-    <Feature Id="IBcore" Title="InfiniBand Core Modules" Level="1"\r
-        Description="InfiniBand: Core, Tools, Docs"\r
-        Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="disallow">\r
-      <ComponentRef Id="cIBcore" />\r
-      <ComponentRef Id="cIOUdriver" />\r
-      <ComponentRef Id="Docs" />\r
-      <ComponentRef Id="Tools" />\r
-      <ComponentRef Id="OpenSMservice" />\r
-      <ComponentRef Id="cCertPush" />\r
-    </Feature>\r
-\r
-    <Feature Id="fWV" Title="WinVerbs"\r
-        Description="OFED verbs - Libraries + utilities"\r
-        Display="expand" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-        <ComponentRef Id="cWinVerbsOFED" />\r
-        <ComponentRef Id="cWinVerbsUApps" />\r
-    </Feature>\r
-\r
-    <Feature Id="fIPoIB" Title="IPoIB" Level="1"\r
-        Description="Internet Protocols over InfiniBand" Display="expand"\r
-        ConfigurableDirectory="INSTALLDIR" AllowAdvertise="no"\r
-        InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="cIPoIB" />\r
-    </Feature>\r
-\r
-    <Feature Id="fWSD" Title="WSD" Description="Winsock Direct Enabled"\r
-           Display="expand" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-      <!-- skip WSD on Windows XP, IPoIB is required for WSD. -->\r
-      <Condition Level="200"><![CDATA[VersionNT=501]]></Condition>\r
-      <Condition Level="201"> IPOIB_EXISTS </Condition>\r
-      <ComponentRef Id="WinsockDirect" />\r
-    </Feature>\r
-\r
-    <Feature Id="fND" Title="Network Direct"\r
-        Description="Network Direct Enabled"\r
-        Display="expand" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-        <ComponentRef Id="cNetworkDirect" />\r
-        <Condition Level="201"> IPOIB_EXISTS </Condition>\r
-    </Feature>\r
-\r
-    <Feature Id="fOSMS" Title="OpenSM Service Started" Level="5"\r
-        Description="Open Subnet Management started as a local Windows Service"\r
-        Display="expand" ConfigurableDirectory="INSTALLDIR" AllowAdvertise="no"\r
-        InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="OpenSM_Service_enabled" />\r
-    </Feature>\r
-\r
-    <Feature Id="fDAPL" Title="DAPL" Description="DAT+DAPL over InfiniBand"\r
-        Display="collapse" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-      <Condition Level="201"> IPOIB_EXISTS </Condition>\r
-\r
-      <Feature Id="fDatConf" Title="DAT-DAPL Config File"\r
-         Description="DAPL runtime configuration file; installed if %SystemDrive%\DAT\dat.conf does not exist."\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <Condition Level="0"> DAT_CONF_EXISTS AND Not Installed </Condition>\r
-        <ComponentRef Id="cDatCfg" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBASIC1" Title="DAT 1.1 Runtime"\r
-         Description="DAT 1.1 runtime libraries"\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <ComponentRef Id="cDAPL1RT" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBldKit1" Title="DAT 1.1 Build Kit"\r
-         Description="DAT 1.1 Application Build Kit - Headers and Libraries"\r
-         Display="expand" Level="2" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-         <Condition Level="201"> DAT1_INSTALLED </Condition>\r
-         <ComponentRef Id="cDATV1" />\r
-         <ComponentRef Id="cDatBldV1Hdrs" />\r
-         <ComponentRef Id="cDatBldV1Libs" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBASIC2" Title="DAT 2.0 Runtime"\r
-         Description="DAT 2.0 runtime libraries"\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <ComponentRef Id="cDAPL2RT" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBldKit2" Title="DAT 2.0 Build Kit"\r
-         Description="DAT 2.0 Application Build Kit - Headers and Libraries"\r
-         Display="expand" Level="2" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-         <Condition Level="201"> DAT2_INSTALLED </Condition>\r
-         <ComponentRef Id="cDATV2" />\r
-         <ComponentRef Id="cDatBldV2Hdrs" />\r
-         <ComponentRef Id="cDatBldV2Libs" />\r
-      </Feature>\r
-    </Feature>\r
-\r
-    <Feature Id="fSRP" Title="SRP" Level="5" Description="SCSI over RDMA"\r
-        Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="cSRP_driver_installed" />\r
-    </Feature>\r
-\r
-    <Feature Id="fVNIC" Title="QLogic-VNIC"\r
-        Description="QLogic - Virtual NIC over InfiniBand"\r
-        Display="expand" Level="5" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="cQLVNIC_driver_installed" />\r
-    </Feature>\r
-\r
-    <Feature Id="fIBsdk" Title="InfiniBand SDK" Level="2"\r
-         Description="InfiniBand Software Development Kit (Headers + Libs)"\r
-         Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='disallow'>\r
-      <ComponentRef Id="cIBAL_Libs" />\r
-      <ComponentRef Id="cIBAL_Incs" />\r
-      <ComponentRef Id="cIBAL_Complib" />\r
-      <ComponentRef Id="cIBAL_IBA" />\r
-      <ComponentRef Id="cDDK_example" />\r
-      <ComponentRef Id="cVS_example" />\r
-    </Feature>\r
-\r
-    <Feature Id="fCHECKED" Title="Debug/Checked Modules"\r
-         Description="Checked versions: Not installed; see %ProgramFiles%\WinOF\Checked."\r
-         Display="expand" Level="5" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-      <ComponentRef Id="cCHK_kernel" />\r
-      <ComponentRef Id="cCHK_user" />\r
-    </Feature>\r
+    <?include ..\..\common\std_features.inc ?>\r
 \r
     <?include ..\..\common\InstallExecuteSeq.inc ?>\r
 \r
index 2dcbfed957bfaba9f72f4b183eb3ad87a6db1224..c9aa20c80567dc21286d25ace54d5328c5e0854b 100644 (file)
        Features - Level=1 == Typical, no WSD on XP or SRP on 32-bit XP\r
      -->\r
 \r
-    <Feature Id="fMxDrivers" Title="Mellanox HCA Drivers" Level="1"\r
-         Description="Mellanox InfiniBand Host Channel Adapter Drivers"\r
-         Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-      <ComponentRef Id="cMthcaDriver" />\r
-      <ComponentRef Id="cMLX4BusDriver" />\r
-      <ComponentRef Id="cMLX4HcaDriver" />\r
-    </Feature>\r
-\r
-    <Feature Id="IBcore" Title="InfiniBand Core Modules" Level="1"\r
-        Description="InfiniBand: Core, Tools, Docs"\r
-        Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="disallow">\r
-      <ComponentRef Id="cIBcore" />\r
-      <ComponentRef Id="cIOUdriver" />\r
-      <ComponentRef Id="Docs" />\r
-      <ComponentRef Id="Tools" />\r
-      <ComponentRef Id="OpenSMservice" />\r
-    </Feature>\r
-\r
-    <Feature Id="fWV" Title="WinVerbs"\r
-        Description="OFED verbs - Libraries + utilities"\r
-        Display="expand" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-        <ComponentRef Id="cWinVerbsOFED" />\r
-        <ComponentRef Id="cWinVerbsUApps" />\r
-    </Feature>\r
-\r
-    <Feature Id="fIPoIB" Title="IPoIB" Level="1"\r
-        Description="Internet Protocols over InfiniBand" Display="expand"\r
-        ConfigurableDirectory="INSTALLDIR" AllowAdvertise="no"\r
-        InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="cIPoIB" />\r
-    </Feature>\r
-\r
-    <Feature Id="fWSD" Title="WSD" Description="Winsock Direct Enabled"\r
-        Display="expand" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-        <!-- skip WSD on Windows XP -->\r
-        <Condition Level="0"><![CDATA[VersionNT=501]]></Condition>\r
-        <ComponentRef Id="WinsockDirect" />\r
-    </Feature>\r
-\r
-    <Feature Id="fND" Title="Network Direct"\r
-        Description="Network Direct Enabled"\r
-        Display="expand" Level="2" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-        <ComponentRef Id="cNetworkDirect" />\r
-    </Feature>\r
-\r
-    <Feature Id="fOSMS" Title="OpenSM Service Started" Level="5"\r
-        Description="Open Subnet Management started as a local Windows Service"\r
-        Display="expand" ConfigurableDirectory="INSTALLDIR" AllowAdvertise="no"\r
-        InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="OpenSM_Service_enabled" />\r
-    </Feature>\r
-\r
-    <Feature Id="fDAPL" Title="DAPL" Description="DAT+DAPL over InfiniBand"\r
-        Display="collapse" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-      <Condition Level="201"> IPOIB_EXISTS </Condition>\r
-\r
-      <Feature Id="fDatConf" Title="DAT-DAPL Config File"\r
-         Description="DAPL runtime configuration file; installed if %SystemDrive%\DAT\dat.conf does not exist."\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <Condition Level="0"> DAT_CONF_EXISTS AND Not Installed </Condition>\r
-        <ComponentRef Id="cDatCfg" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBASIC1" Title="DAT 1.1 Runtime"\r
-         Description="DAT 1.1 runtime libraries"\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <ComponentRef Id="cDAPL1RT" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBldKit1" Title="DAT 1.1 Build Kit"\r
-         Description="DAT 1.1 Application Build Kit - Headers and Libraries"\r
-         Display="expand" Level="2" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-         <Condition Level="201"> DAT1_INSTALLED </Condition>\r
-         <ComponentRef Id="cDATV1" />\r
-         <ComponentRef Id="cDatBldV1Hdrs" />\r
-         <ComponentRef Id="cDatBldV1Libs" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBASIC2" Title="DAT 2.0 Runtime"\r
-         Description="DAT 2.0 runtime libraries"\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <ComponentRef Id="cDAPL2RT" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBldKit2" Title="DAT 2.0 Build Kit"\r
-         Description="DAT 2.0 Application Build Kit - Headers and Libraries"\r
-         Display="expand" Level="2" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-         <Condition Level="201"> DAT2_INSTALLED </Condition>\r
-         <ComponentRef Id="cDATV2" />\r
-         <ComponentRef Id="cDatBldV2Hdrs" />\r
-         <ComponentRef Id="cDatBldV2Libs" />\r
-      </Feature>\r
-    </Feature>\r
-\r
-    <Feature Id="fSRP" Title="SRP" Level="5" Description="SCSI over RDMA"\r
-        Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-        <!-- skip SRP on 32-bit Windows XP -->\r
-        <Condition Level="0">\r
-          <![CDATA[VersionNT=501 AND (Not Intel64 AND Not Msix64)]]>\r
-        </Condition>\r
-      <ComponentRef Id="cSRP_driver_installed" />\r
-    </Feature>\r
-\r
-    <Feature Id="fVNIC" Title="QLogic-VNIC"\r
-        Description="QLogic - Virtual NIC over InfiniBand"\r
-        Display="expand" Level="5" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="cQLVNIC_driver_installed" />\r
-    </Feature>\r
-\r
-    <Feature Id="fIBsdk" Title="InfiniBand SDK" Level="2"\r
-         Description="InfiniBand Software Development Kit (Headers + Libs)"\r
-         Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='disallow'>\r
-      <ComponentRef Id="cIBAL_Libs" />\r
-      <ComponentRef Id="cIBAL_Incs" />\r
-      <ComponentRef Id="cIBAL_Complib" />\r
-      <ComponentRef Id="cIBAL_IBA" />\r
-      <ComponentRef Id="cDDK_example" />\r
-      <ComponentRef Id="cVS_example" />\r
-    </Feature>\r
-\r
-    <Feature Id="fCHECKED" Title="Debug/Checked Modules"\r
-         Description="Checked versions: Not installed; see %ProgramFiles%\WinOF\Checked."\r
-         Display="expand" Level="5" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-      <ComponentRef Id="cCHK_kernel" />\r
-      <ComponentRef Id="cCHK_user" />\r
-    </Feature>\r
+    <?include ..\..\common\std_features.inc ?>\r
 \r
     <?include ..\..\common\InstallExecuteSeq.inc ?>\r
 \r
index 291a6efa2be81d3d21f5ef251b953a5d163dbccf..f51da3d154e511c01d46d582c605abb5c2ab7b3e 100644 (file)
     <?include ..\..\common\arp.inc ?>\r
 \r
     <!--\r
-       Features - Level=1 == Typical, no WSD on XP\r
+       Features - Level=1 == Typical, no WSD on XP or SRP on 32-bit XP\r
      -->\r
 \r
-    <Feature Id="fMxDrivers" Title="Mellanox HCA Drivers" Level="1"\r
-         Description="Mellanox InfiniBand Host Channel Adapter Drivers"\r
-         Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-      <ComponentRef Id="cMthcaDriver" />\r
-      <ComponentRef Id="cMLX4BusDriver" />\r
-      <ComponentRef Id="cMLX4HcaDriver" />\r
-    </Feature>\r
-\r
-    <Feature Id="IBcore" Title="InfiniBand Core Modules" Level="1"\r
-        Description="InfiniBand: Core, Tools, Docs"\r
-        Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="disallow">\r
-      <ComponentRef Id="cIBcore" />\r
-      <ComponentRef Id="cIOUdriver" />\r
-      <ComponentRef Id="Docs" />\r
-      <ComponentRef Id="Tools" />\r
-      <ComponentRef Id="OpenSMservice" />\r
-    </Feature>\r
-\r
-    <Feature Id="fWV" Title="WinVerbs"\r
-        Description="OFED verbs - Libraries + utilities"\r
-        Display="expand" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-        <ComponentRef Id="cWinVerbsOFED" />\r
-        <ComponentRef Id="cWinVerbsUApps" />\r
-    </Feature>\r
-\r
-    <Feature Id="fIPoIB" Title="IPoIB" Level="1"\r
-        Description="Internet Protocols over InfiniBand" Display="expand"\r
-        ConfigurableDirectory="INSTALLDIR" AllowAdvertise="no"\r
-        InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="cIPoIB" />\r
-    </Feature>\r
-\r
-    <Feature Id="fWSD" Title="WSD" Description="Winsock Direct Enabled"\r
-            Display="expand" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-      <!-- skip WSD on Windows XP, IPoIB is required for WSD. -->\r
-      <Condition Level="200"><![CDATA[VersionNT=501]]></Condition>\r
-      <Condition Level="201"> IPOIB_EXISTS </Condition>\r
-      <ComponentRef Id="WinsockDirect" />\r
-    </Feature>\r
-\r
-<!-- when ND on ia64 works.\r
-    <Feature Id="fND" Title="Network Direct"\r
-        Description="Network Direct Enabled"\r
-        Display="expand" Level="2" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-        <ComponentRef Id="cNetworkDirect" />\r
-        <Condition Level="201"> IPOIB_EXISTS </Condition> \r
-    </Feature>\r
--->\r
-    <Feature Id="fOSMS" Title="OpenSM Service Started" Level="5"\r
-        Description="Open Subnet Management started as a local Windows Service"\r
-        Display="expand" ConfigurableDirectory="INSTALLDIR" AllowAdvertise="no"\r
-        InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="OpenSM_Service_enabled" />\r
-    </Feature>\r
-\r
-    <Feature Id="fDAPL" Title="DAPL" Description="DAT+DAPL over InfiniBand"\r
-        Display="collapse" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-      <Condition Level="201"> IPOIB_EXISTS </Condition>\r
-\r
-      <Feature Id="fDatConf" Title="DAT-DAPL Config File"\r
-         Description="DAPL runtime configuration file; installed if %SystemDrive%\DAT\dat.conf does not exist."\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <Condition Level="0"> DAT_CONF_EXISTS AND Not Installed </Condition>\r
-        <ComponentRef Id="cDatCfg" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBASIC1" Title="DAT 1.1 Runtime"\r
-         Description="DAT 1.1 runtime libraries"\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <ComponentRef Id="cDAPL1RT" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBldKit1" Title="DAT 1.1 Build Kit"\r
-         Description="DAT 1.1 Application Build Kit - Headers and Libraries"\r
-         Display="expand" Level="2" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-         <Condition Level="201"> DAT1_INSTALLED </Condition>\r
-         <ComponentRef Id="cDATV1" />\r
-         <ComponentRef Id="cDatBldV1Hdrs" />\r
-         <ComponentRef Id="cDatBldV1Libs" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBASIC2" Title="DAT 2.0 Runtime"\r
-         Description="DAT 2.0 runtime libraries"\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <ComponentRef Id="cDAPL2RT" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBldKit2" Title="DAT 2.0 Build Kit"\r
-         Description="DAT 2.0 Application Build Kit - Headers and Libraries"\r
-         Display="expand" Level="2" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-         <Condition Level="201"> DAT2_INSTALLED </Condition>\r
-         <ComponentRef Id="cDATV2" />\r
-         <ComponentRef Id="cDatBldV2Hdrs" />\r
-         <ComponentRef Id="cDatBldV2Libs" />\r
-      </Feature>\r
-    </Feature>\r
-\r
-    <Feature Id="fSRP" Title="SRP" Level="5" Description="SCSI over RDMA"\r
-         Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-      <ComponentRef Id="cSRP_driver_installed" />\r
-    </Feature>\r
-\r
-    <Feature Id="fVNIC" Title="QLogic-VNIC"\r
-        Description="QLogic - Virtual NIC over InfiniBand"\r
-        Display="expand" Level="5" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="cQLVNIC_driver_installed" />\r
-    </Feature>\r
-\r
-    <Feature Id="fIBsdk" Title="InfiniBand SDK" Level="2"\r
-         Description="InfiniBand Software Development Kit (Headers + Libs)"\r
-         Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='disallow'>\r
-      <ComponentRef Id="cIBAL_Libs" />\r
-      <ComponentRef Id="cIBAL_Incs" />\r
-      <ComponentRef Id="cIBAL_Complib" />\r
-      <ComponentRef Id="cIBAL_IBA" />\r
-      <ComponentRef Id="cDDK_example" />\r
-      <ComponentRef Id="cVS_example" />\r
-    </Feature>\r
-\r
-    <Feature Id="fCHECKED" Title="Debug/Checked Modules"\r
-         Description="Checked versions: Not installed; see %ProgramFiles%\WinOF\Checked."\r
-         Display="expand" Level="5" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-      <ComponentRef Id="cCHK_kernel" />\r
-      <ComponentRef Id="cCHK_user" />\r
-    </Feature>\r
+    <?include ..\..\common\std_features.inc ?>\r
 \r
     <?include ..\..\common\InstallExecuteSeq.inc ?>\r
 \r
index ac6746653a38010a1f4203bdd06a9e7987b027ab..093773caafc727f2fe74924e18165dab9c12b8aa 100644 (file)
        Features - Level=1 == Typical, no WSD on XP or SRP on 32-bit XP\r
      -->\r
 \r
-    <Feature Id="fMxDrivers" Title="Mellanox HCA Drivers" Level="1"\r
-         Description="Mellanox InfiniBand Host Channel Adapter Drivers"\r
-         Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-      <ComponentRef Id="cMthcaDriver" />\r
-      <ComponentRef Id="cMLX4BusDriver" />\r
-      <ComponentRef Id="cMLX4HcaDriver" />\r
-    </Feature>\r
-\r
-    <Feature Id="IBcore" Title="InfiniBand Core Modules" Level="1"\r
-        Description="InfiniBand: Core, Tools, Docs"\r
-        Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="disallow">\r
-      <ComponentRef Id="cIBcore" />\r
-      <ComponentRef Id="cIOUdriver" />\r
-      <ComponentRef Id="Docs" />\r
-      <ComponentRef Id="Tools" />\r
-      <ComponentRef Id="OpenSMservice" />\r
-    </Feature>\r
-\r
-    <Feature Id="fWV" Title="WinVerbs"\r
-        Description="OFED verbs - Libraries + utilities"\r
-        Display="expand" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-        <ComponentRef Id="cWinVerbsOFED" />\r
-        <ComponentRef Id="cWinVerbsUApps" />\r
-    </Feature>\r
-\r
-    <Feature Id="fIPoIB" Title="IPoIB" Level="1"\r
-        Description="Internet Protocols over InfiniBand" Display="expand"\r
-        ConfigurableDirectory="INSTALLDIR" AllowAdvertise="no"\r
-        InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="cIPoIB" />\r
-    </Feature>\r
-\r
-    <Feature Id="fWSD" Title="WSD" Description="Winsock Direct Enabled"\r
-            Display="expand" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-      <!-- skip WSD on Windows XP, IPoIB is required for WSD. -->\r
-      <Condition Level="200"><![CDATA[VersionNT=501]]></Condition>\r
-      <Condition Level="201"> IPOIB_EXISTS </Condition>\r
-      <ComponentRef Id="WinsockDirect" />\r
-    </Feature>\r
-\r
-    <Feature Id="fND" Title="Network Direct"\r
-        Description="Network Direct Enabled"\r
-        Display="expand" Level="2" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-        <ComponentRef Id="cNetworkDirect" />\r
-    </Feature>\r
-\r
-    <Feature Id="fOSMS" Title="OpenSM Service Started" Level="5"\r
-        Description="Open Subnet Management started as a local Windows Service"\r
-        Display="expand" ConfigurableDirectory="INSTALLDIR" AllowAdvertise="no"\r
-        InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="OpenSM_Service_enabled" />\r
-    </Feature>\r
-\r
-    <Feature Id="fDAPL" Title="DAPL" Description="DAT+DAPL over InfiniBand"\r
-        Display="collapse" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-      <Condition Level="201"> IPOIB_EXISTS </Condition>\r
-\r
-      <Feature Id="fDatConf" Title="DAT-DAPL Config File"\r
-         Description="DAPL runtime configuration file; installed if %SystemDrive%\DAT\dat.conf does not exist."\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <Condition Level="0"> DAT_CONF_EXISTS AND Not Installed </Condition>\r
-        <ComponentRef Id="cDatCfg" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBASIC1" Title="DAT 1.1 Runtime"\r
-         Description="DAT 1.1 runtime libraries"\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <ComponentRef Id="cDAPL1RT" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBldKit1" Title="DAT 1.1 Build Kit"\r
-         Description="DAT 1.1 Application Build Kit - Headers and Libraries"\r
-         Display="expand" Level="2" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-         <Condition Level="201"> DAT1_INSTALLED </Condition>\r
-         <ComponentRef Id="cDATV1" />\r
-         <ComponentRef Id="cDatBldV1Hdrs" />\r
-         <ComponentRef Id="cDatBldV1Libs" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBASIC2" Title="DAT 2.0 Runtime"\r
-         Description="DAT 2.0 runtime libraries"\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <ComponentRef Id="cDAPL2RT" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBldKit2" Title="DAT 2.0 Build Kit"\r
-         Description="DAT 2.0 Application Build Kit - Headers and Libraries"\r
-         Display="expand" Level="2" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-         <Condition Level="201"> DAT2_INSTALLED </Condition>\r
-         <ComponentRef Id="cDATV2" />\r
-         <ComponentRef Id="cDatBldV2Hdrs" />\r
-         <ComponentRef Id="cDatBldV2Libs" />\r
-      </Feature>\r
-    </Feature>\r
-\r
-    <Feature Id="fSRP" Title="SRP" Level="5" Description="SCSI over RDMA"\r
-         Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-      <ComponentRef Id="cSRP_driver_installed" />\r
-    </Feature>\r
-\r
-    <Feature Id="fVNIC" Title="QLogic-VNIC"\r
-        Description="QLogic - Virtual NIC over InfiniBand"\r
-        Display="expand" Level="5" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="cQLVNIC_driver_installed" />\r
-    </Feature>\r
-\r
-    <Feature Id="fIBsdk" Title="InfiniBand SDK" Level="2"\r
-         Description="InfiniBand Software Development Kit (Headers + Libs)"\r
-         Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='disallow'>\r
-      <ComponentRef Id="cIBAL_Libs" />\r
-      <ComponentRef Id="cIBAL_Incs" />\r
-      <ComponentRef Id="cIBAL_Complib" />\r
-      <ComponentRef Id="cIBAL_IBA" />\r
-      <ComponentRef Id="cDDK_example" />\r
-      <ComponentRef Id="cVS_example" />\r
-    </Feature>\r
-\r
-    <Feature Id="fCHECKED" Title="Debug/Checked Modules"\r
-         Description="Checked versions: Not installed; see %ProgramFiles%\WinOF\Checked."\r
-         Display="expand" Level="5" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-      <ComponentRef Id="cCHK_kernel" />\r
-      <ComponentRef Id="cCHK_user" />\r
-    </Feature>\r
+    <?include ..\..\common\std_features.inc ?>\r
 \r
     <?include ..\..\common\InstallExecuteSeq.inc ?>\r
 \r
index f05d95992e015c7bb62ead3ced16a6501156d056..02b69928bcf49bbb5ab9b540c5bb08a8ce098a14 100644 (file)
        Features - Level=1 == Typical, no WSD on XP or SRP on 32-bit XP\r
      -->\r
 \r
-    <Feature Id="fMxDrivers" Title="Mellanox HCA Drivers" Level="1"\r
-         Description="Mellanox InfiniBand Host Channel Adapter Drivers"\r
-         Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-      <ComponentRef Id="cMthcaDriver" />\r
-      <ComponentRef Id="cMLX4BusDriver" />\r
-      <ComponentRef Id="cMLX4HcaDriver" />\r
-    </Feature>\r
-\r
-    <Feature Id="IBcore" Title="InfiniBand Core Modules" Level="1"\r
-        Description="InfiniBand: Core, Tools, Docs"\r
-        Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="disallow">\r
-      <ComponentRef Id="cIBcore" />\r
-      <ComponentRef Id="cIOUdriver" />\r
-      <ComponentRef Id="Docs" />\r
-      <ComponentRef Id="Tools" />\r
-      <ComponentRef Id="OpenSMservice" />\r
-    </Feature>\r
-\r
-    <Feature Id="fWV" Title="WinVerbs"\r
-        Description="OFED verbs - Libraries + utilities"\r
-        Display="expand" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-        <ComponentRef Id="cWinVerbsOFED" />\r
-        <ComponentRef Id="cWinVerbsUApps" />\r
-    </Feature>\r
-\r
-    <Feature Id="fIPoIB" Title="IPoIB" Level="1"\r
-        Description="Internet Protocols over InfiniBand" Display="expand"\r
-        ConfigurableDirectory="INSTALLDIR" AllowAdvertise="no"\r
-        InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="cIPoIB" />\r
-    </Feature>\r
-\r
-    <Feature Id="fWSD" Title="WSD" Description="Winsock Direct Enabled"\r
-        Display="expand" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-        <!-- skip WSD on Windows XP -->\r
-        <Condition Level="0"><![CDATA[VersionNT=501]]></Condition>\r
-        <ComponentRef Id="WinsockDirect" />\r
-    </Feature>\r
-\r
-    <Feature Id="fND" Title="Network Direct"\r
-        Description="Network Direct Enabled"\r
-        Display="expand" Level="2" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-        <ComponentRef Id="cNetworkDirect" />\r
-    </Feature>\r
-\r
-    <Feature Id="fOSMS" Title="OpenSM Service Started" Level="5"\r
-        Description="Open Subnet Management started as a local Windows Service"\r
-        Display="expand" ConfigurableDirectory="INSTALLDIR" AllowAdvertise="no"\r
-        InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="OpenSM_Service_enabled" />\r
-    </Feature>\r
-\r
-    <Feature Id="fDAPL" Title="DAPL" Description="DAT+DAPL over InfiniBand"\r
-        Display="collapse" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-      <Condition Level="201"> IPOIB_EXISTS </Condition>\r
-\r
-      <Feature Id="fDatConf" Title="DAT-DAPL Config File"\r
-         Description="DAPL runtime configuration file; installed if %SystemDrive%\DAT\dat.conf does not exist."\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <Condition Level="0"> DAT_CONF_EXISTS AND Not Installed </Condition>\r
-        <ComponentRef Id="cDatCfg" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBASIC1" Title="DAT 1.1 Runtime"\r
-         Description="DAT 1.1 runtime libraries"\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <ComponentRef Id="cDAPL1RT" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBldKit1" Title="DAT 1.1 Build Kit"\r
-         Description="DAT 1.1 Application Build Kit - Headers and Libraries"\r
-         Display="expand" Level="2" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-         <Condition Level="201"> DAT1_INSTALLED </Condition>\r
-         <ComponentRef Id="cDATV1" />\r
-         <ComponentRef Id="cDatBldV1Hdrs" />\r
-         <ComponentRef Id="cDatBldV1Libs" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBASIC2" Title="DAT 2.0 Runtime"\r
-         Description="DAT 2.0 runtime libraries"\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <ComponentRef Id="cDAPL2RT" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBldKit2" Title="DAT 2.0 Build Kit"\r
-         Description="DAT 2.0 Application Build Kit - Headers and Libraries"\r
-         Display="expand" Level="2" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-         <Condition Level="201"> DAT2_INSTALLED </Condition>\r
-         <ComponentRef Id="cDATV2" />\r
-         <ComponentRef Id="cDatBldV2Hdrs" />\r
-         <ComponentRef Id="cDatBldV2Libs" />\r
-      </Feature>\r
-    </Feature>\r
-\r
-    <Feature Id="fSRP" Title="SRP" Level="5" Description="SCSI over RDMA"\r
-        Display="expand" ConfigurableDirectory="INSTALLDIR" AllowAdvertise="no"\r
-        InstallDefault="local" Absent="allow">\r
-        <!-- skip SRP on 32-bit Windows XP -->\r
-        <Condition Level="0">\r
-          <![CDATA[VersionNT=501 AND (Not Intel64 AND Not Msix64)]]>\r
-        </Condition>\r
-        <ComponentRef Id="cSRP_driver_installed" />\r
-    </Feature>\r
-\r
-    <Feature Id="fVNIC" Title="QLogic-VNIC"\r
-        Description="QLogic - Virtual NIC over InfiniBand"\r
-        Display="expand" Level="5" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="cQLVNIC_driver_installed" />\r
-    </Feature>\r
-\r
-    <Feature Id="fIBsdk" Title="InfiniBand SDK" Level="2"\r
-         Description="InfiniBand Software Development Kit (Headers + Libs)"\r
-         Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='disallow'>\r
-      <ComponentRef Id="cIBAL_Libs" />\r
-      <ComponentRef Id="cIBAL_Incs" />\r
-      <ComponentRef Id="cIBAL_Complib" />\r
-      <ComponentRef Id="cIBAL_IBA" />\r
-      <ComponentRef Id="cDDK_example" />\r
-      <ComponentRef Id="cVS_example" />\r
-    </Feature>\r
-\r
-    <Feature Id="fCHECKED" Title="Debug/Checked Modules"\r
-         Description="Checked versions: Not installed; see %ProgramFiles%\WinOF\Checked."\r
-         Display="expand" Level="5" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-      <ComponentRef Id="cCHK_kernel" />\r
-      <ComponentRef Id="cCHK_user" />\r
-    </Feature>\r
+    <?include ..\..\common\std_features.inc ?>\r
 \r
     <?include ..\..\common\InstallExecuteSeq.inc ?>\r
 \r
index 05b2ef3abdb4ce5ee6ed850f56e59f23dca40400..82a3b1ed6a60a457d7aa2f32a5da8a30fd32ccb1 100644 (file)
        Features - Level=1 == Typical, no WSD on XP or SRP on 32-bit XP\r
      -->\r
 \r
-    <Feature Id="fMxDrivers" Title="Mellanox HCA Drivers" Level="1"\r
-         Description="Mellanox InfiniBand Host Channel Adapter Drivers"\r
-         Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-      <ComponentRef Id="cMthcaDriver" />\r
-      <ComponentRef Id="cMLX4BusDriver" />\r
-      <ComponentRef Id="cMLX4HcaDriver" />\r
-    </Feature>\r
-\r
-    <Feature Id="IBcore" Title="InfiniBand Core Modules" Level="1"\r
-        Description="InfiniBand: Core, Tools, Docs"\r
-        Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="disallow">\r
-      <ComponentRef Id="cIBcore" />\r
-      <ComponentRef Id="cIOUdriver" />\r
-      <ComponentRef Id="Docs" />\r
-      <ComponentRef Id="Tools" />\r
-      <ComponentRef Id="OpenSMservice" />\r
-    </Feature>\r
-\r
-    <Feature Id="fWV" Title="WinVerbs"\r
-        Description="OFED verbs - Libraries + utilities"\r
-        Display="expand" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-        <ComponentRef Id="cWinVerbsOFED" />\r
-        <ComponentRef Id="cWinVerbsUApps" />\r
-    </Feature>\r
-\r
-    <Feature Id="fIPoIB" Title="IPoIB" Level="1"\r
-        Description="Internet Protocols over InfiniBand" Display="expand"\r
-        ConfigurableDirectory="INSTALLDIR" AllowAdvertise="no"\r
-        InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="cIPoIB" />\r
-    </Feature>\r
-\r
-<!-- No WSD on XP\r
-    <Feature Id="fWSD" Title="WSD" Description="Winsock Direct Enabled"\r
-        Display="expand" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-        <Condition Level="0"><![CDATA[VersionNT=501]]></Condition>\r
-        <ComponentRef Id="WinsockDirect" />\r
-    </Feature>\r
--->\r
-    <Feature Id="fND" Title="Network Direct"\r
-        Description="Network Direct Enabled"\r
-        Display="expand" Level="2" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-        <ComponentRef Id="cNetworkDirect" />\r
-    </Feature>\r
-\r
-    <Feature Id="fOSMS" Title="OpenSM Service Started" Level="5"\r
-        Description="Open Subnet Management started as a local Windows Service"\r
-        Display="expand" ConfigurableDirectory="INSTALLDIR" AllowAdvertise="no"\r
-        InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="OpenSM_Service_enabled" />\r
-    </Feature>\r
-\r
-    <Feature Id="fDAPL" Title="DAPL" Description="DAT+DAPL over InfiniBand"\r
-        Display="collapse" Level="1" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-      <Condition Level="201"> IPOIB_EXISTS </Condition>\r
-\r
-      <Feature Id="fDatConf" Title="DAT-DAPL Config File"\r
-         Description="DAPL runtime configuration file; installed if %SystemDrive%\DAT\dat.conf does not exist."\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <Condition Level="0"> DAT_CONF_EXISTS AND Not Installed </Condition>\r
-        <ComponentRef Id="cDatCfg" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBASIC1" Title="DAT 1.1 Runtime"\r
-         Description="DAT 1.1 runtime libraries"\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <ComponentRef Id="cDAPL1RT" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBldKit1" Title="DAT 1.1 Build Kit"\r
-         Description="DAT 1.1 Application Build Kit - Headers and Libraries"\r
-         Display="expand" Level="2" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-         <Condition Level="201"> DAT1_INSTALLED </Condition>\r
-         <ComponentRef Id="cDATV1" />\r
-         <ComponentRef Id="cDatBldV1Hdrs" />\r
-         <ComponentRef Id="cDatBldV1Libs" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBASIC2" Title="DAT 2.0 Runtime"\r
-         Description="DAT 2.0 runtime libraries"\r
-         Display="expand" Level="1" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-        <ComponentRef Id="cDAPL2RT" />\r
-      </Feature>\r
-\r
-      <Feature Id="fDatBldKit2" Title="DAT 2.0 Build Kit"\r
-         Description="DAT 2.0 Application Build Kit - Headers and Libraries"\r
-         Display="expand" Level="2" \r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-         <Condition Level="201"> DAT2_INSTALLED </Condition>\r
-         <ComponentRef Id="cDATV2" />\r
-         <ComponentRef Id="cDatBldV2Hdrs" />\r
-         <ComponentRef Id="cDatBldV2Libs" />\r
-      </Feature>\r
-    </Feature>\r
-\r
-<!-- Skip SRP on XP/32\r
-    <Feature Id="fSRP" Title="SRP" Level="5" Description="SCSI over RDMA"\r
-        Display="expand" ConfigurableDirectory="INSTALLDIR" AllowAdvertise="no"\r
-        InstallDefault="local" Absent="allow">\r
--->\r
-        <!-- skip SRP on 32-bit Windows XP -->\r
-<!-- Skip SRP on XP/32\r
-        <Condition Level="0">\r
-          <![CDATA[VersionNT=501 AND (Not Intel64 AND Not Msix64)]]>\r
-        </Condition>\r
-        <ComponentRef Id="cSRP_driver_installed" />\r
-    </Feature>\r
--->\r
-\r
-    <Feature Id="fVNIC" Title="QLogic-VNIC"\r
-        Description="QLogic - Virtual NIC over InfiniBand"\r
-        Display="expand" Level="5" ConfigurableDirectory="INSTALLDIR"\r
-        AllowAdvertise="no" InstallDefault="local" Absent="allow">\r
-      <ComponentRef Id="cQLVNIC_driver_installed" />\r
-    </Feature>\r
-\r
-    <Feature Id="fIBsdk" Title="InfiniBand SDK" Level="2"\r
-         Description="InfiniBand Software Development Kit (Headers + Libs)"\r
-         Display="expand" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='disallow'>\r
-      <ComponentRef Id="cIBAL_Libs" />\r
-      <ComponentRef Id="cIBAL_Incs" />\r
-      <ComponentRef Id="cIBAL_Complib" />\r
-      <ComponentRef Id="cIBAL_IBA" />\r
-      <ComponentRef Id="cDDK_example" />\r
-      <ComponentRef Id="cVS_example" />\r
-    </Feature>\r
-\r
-    <Feature Id="fCHECKED" Title="Debug/Checked Modules"\r
-         Description="Checked versions: Not installed; see %ProgramFiles%\WinOF\Checked."\r
-         Display="expand" Level="5" ConfigurableDirectory="INSTALLDIR"\r
-         AllowAdvertise='no' InstallDefault='local' Absent='allow'>\r
-      <ComponentRef Id="cCHK_kernel" />\r
-      <ComponentRef Id="cCHK_user" />\r
-    </Feature>\r
+    <?include ..\..\common\std_features.inc ?>\r
 \r
     <?include ..\..\common\InstallExecuteSeq.inc ?>\r
 \r
index 3e8e2ef4091ed9dcaf1b5c3c5a999929414fa90c..d9dbd50c800d8903806d674c927207924ab6bdbf 100644 (file)
@@ -529,11 +529,12 @@ sync_destroy_obj(
                                cl_status = cl_event_wait_on(\r
                                        &p_obj->event, AL_MAX_TIMEOUT_US, AL_WAIT_ALERTABLE );\r
                        } while( cl_status == CL_NOT_DONE );\r
+\r
+                       if ( p_obj->p_ci_ca && p_obj->p_ci_ca->h_ca )\r
+                               CL_PRINT_TO_EVENT_LOG( p_obj->p_ci_ca->h_ca->p_fdo, EVENT_IBBUS_ANY_ERROR,\r
+                                       ("IBAL stuck: AL object %s, ref_cnt: %d. Forcing object destruction.\n",\r
+                                       ib_get_obj_type( p_obj ), p_obj->ref_cnt));\r
                }\r
-               if ( p_obj->p_ci_ca && p_obj->p_ci_ca )\r
-                       CL_PRINT_TO_EVENT_LOG( p_obj->p_ci_ca->h_ca->p_fdo, EVENT_IBBUS_ANY_ERROR,\r
-                               ("IBAL stuck: AL object %s, ref_cnt: %d. Forcing object destruction.\n",\r
-                               ib_get_obj_type( p_obj ), p_obj->ref_cnt));\r
 \r
                CL_ASSERT( cl_status == CL_SUCCESS );\r
                if( cl_status != CL_SUCCESS )\r
index a3313011c06bae0d9e84b938bffc25e81edceef2..e785a6fac8fe1c18ac84e49e6cec2d83b24168e5 100644 (file)
@@ -1332,7 +1332,6 @@ al_modify_qp(
        IN      OUT                     ci_umv_buf_t* const                     p_umv_buf )\r
 {\r
        ib_api_status_t                 status;\r
-       ib_qp_attr_t                    qp_attr;\r
 \r
        CL_ASSERT( h_qp );\r
 \r
@@ -1350,7 +1349,7 @@ al_modify_qp(
 #endif /* CL_KERNEL */\r
 \r
        /* Modify the actual QP attributes. */\r
-       status = verbs_modify_qp( h_qp, p_qp_mod, qp_attr );\r
+       status = verbs_modify_qp( h_qp, p_qp_mod, NULL );\r
 \r
        /* Record the QP state if the modify was successful. */\r
        if( status == IB_SUCCESS )\r
index 2b9ec41db08d9cee82a507b1b71dc91abd4e083f..98c1e677df0744a603855f037fdb006f75f09dda 100644 (file)
@@ -333,9 +333,9 @@ verbs_create_qp(
        h_qp->obj.p_ci_ca->verbs.query_qp( h_qp->h_ci_qp,\\r
                p_qp_attr, p_umv_buf )\r
 \r
-#define verbs_modify_qp(h_qp, p_qp_mod, qp_attr) \\r
+#define verbs_modify_qp(h_qp, p_qp_mod, p_qp_attr) \\r
        h_qp->obj.p_ci_ca->verbs.modify_qp( h_qp->h_ci_qp,\\r
-               p_qp_mod, &qp_attr, p_umv_buf )\r
+               p_qp_mod, p_qp_attr, p_umv_buf )\r
 \r
 #define verbs_ndi_modify_qp(h_qp, p_qp_mod, qp_attr, buf_size, p_buf) \\r
                h_qp->obj.p_ci_ca->verbs.ndi_modify_qp( h_qp->h_ci_qp,\\r
@@ -593,8 +593,8 @@ allocate_pd_alias(
        ual_query_qp(h_qp, p_qp_attr); \\r
        UNUSED_PARAM( p_umv_buf );\r
 \r
-#define verbs_modify_qp(h_qp, p_qp_mod, qp_attr) \\r
-       ual_modify_qp(h_qp, p_qp_mod, &qp_attr); \\r
+#define verbs_modify_qp(h_qp, p_qp_mod, p_qp_attr) \\r
+       ual_modify_qp(h_qp, p_qp_mod, p_qp_attr); \\r
        UNUSED_PARAM( p_umv_buf );\r
 \r
 #define verbs_post_send(h_qp, p_send_wr, pp_send_failure) \\r
index 0087ee1cb7fbed70c726b2bdd331a868dc3f58d4..452df77af5c1cacd8c8df2b2e456f6b7fa0bcd0e 100644 (file)
@@ -69,7 +69,8 @@ cl_from_ntstatus(
 \r
 #if defined( _DEBUG_ )\r
 \r
-VOID cl_dbg_out( IN PCCH  format, ...)\r
+VOID cl_dbg_out( IN const char* const format, ...)\r
+\r
 {\r
        va_list  list;\r
        va_start(list, format);\r
diff --git a/branches/winverbs/etc/user/gtod.c b/branches/winverbs/etc/user/gtod.c
new file mode 100644 (file)
index 0000000..b6ea6a9
--- /dev/null
@@ -0,0 +1,138 @@
+/*\r
+ * This software is available to you under the OpenFabrics.org BSD license\r
+ * below:\r
+ *\r
+ *     Redistribution and use in source and binary forms, with or\r
+ *     without modification, are permitted provided that the following\r
+ *     conditions are met:\r
+ *\r
+ *      - Redistributions of source code must retain the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer.\r
+ *\r
+ *      - Redistributions in binary form must reproduce the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer in the documentation and/or other materials\r
+ *        provided with the distribution.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
+ * SOFTWARE.\r
+ */\r
+\r
+#ifndef _GTOD_C_\r
+#define _GTOD_C_\r
+\r
+/*\r
+ * int gettimeofday(struct timeval *ptv, void *ignored)\r
+ */\r
+\r
+#include <windows.h>\r
+#include <winsock2.h>\r
+\r
+\r
+static __inline\r
+void FileTimeToTimeval(LPFILETIME pft, struct timeval * ptv)\r
+{ /* Note that LONGLONG is a 64-bit value */\r
+       LONGLONG ll;\r
+\r
+       if(!pft || !ptv) {\r
+               ptv->tv_sec = 0;\r
+               ptv->tv_usec = 0;\r
+               return;\r
+       }\r
+\r
+       ll = ((LONGLONG) pft->dwHighDateTime << 32);\r
+       ll += (LONGLONG) pft->dwLowDateTime;\r
+       ll -= 116444736000000000;\r
+\r
+       ptv->tv_sec = (long) (ll / 10000000);\r
+       ptv->tv_usec = (long) (ll - ((LONGLONG)(ptv->tv_sec) * 10000000)) / 10;\r
+}\r
+\r
+\r
+// static __inline\r
+int gettimeofday(struct timeval *ptv, void *ignored)\r
+{\r
+       static int QueryCounter = 2;\r
+       FILETIME CurrentTime;\r
+       UNREFERENCED_PARAMETER(ignored);     \r
+\r
+       if(!ptv) return -1;\r
+\r
+       if(QueryCounter)\r
+       {\r
+               static LARGE_INTEGER Frequency;\r
+               static LARGE_INTEGER Offset; /* counter offset for right time*/\r
+               static LARGE_INTEGER LastCounter;\r
+               LARGE_INTEGER Time;\r
+               LARGE_INTEGER Counter;\r
+       \r
+               GetSystemTimeAsFileTime(&CurrentTime);\r
+               QueryPerformanceCounter(&Counter);\r
+       \r
+               if(QueryCounter == 2)\r
+               {\r
+                       QueryCounter = 1;\r
+                       if(!QueryPerformanceFrequency(&Frequency))\r
+                       {\r
+                               QueryCounter = 0;\r
+                               Frequency.QuadPart = 10000000; /* prevent division by 0 */\r
+                       }\r
+       \r
+                       /* get time as a large integer */\r
+                       Counter.HighPart &= 0x7FL; /* Clear high bits to prevent overflow */\r
+                       Offset.LowPart = CurrentTime.dwLowDateTime;\r
+                       Offset.HighPart = (LONG) CurrentTime.dwHighDateTime;\r
+                       Offset.QuadPart -= Counter.QuadPart * 10000000 / Frequency.QuadPart;\r
+               }\r
+       \r
+               /* Convert counter to a 100 nanoseconds resolution timer value. */\r
+       \r
+               Counter.HighPart &= 0x7FL; /* Clear high bits to prevent overflows */\r
+               Counter.QuadPart *= 10000000; /* need time stamp in 100 ns units */\r
+               Counter.QuadPart /= Frequency.QuadPart;/* counter of 0.1 microseconds */\r
+       \r
+               if(LastCounter.QuadPart > Counter.QuadPart)\r
+               { /* Counter value wrapped */\r
+                       Offset.QuadPart += (0x7F00000000*10000000) / Frequency.QuadPart;\r
+               }\r
+               LastCounter = Counter;\r
+       \r
+               /* Add the in previous call calculated offset */\r
+               Counter.QuadPart += Offset.QuadPart;\r
+       \r
+               /* get time as a large integer */\r
+               Time.LowPart = CurrentTime.dwLowDateTime;\r
+               Time.HighPart = (LONG) CurrentTime.dwHighDateTime;\r
+       \r
+               /* keep time difference within an interval of +- 0.1 seconds\r
+               relative to the time function by adjusting the counters offset */\r
+       \r
+               if( ((Time.QuadPart + 1000000) < Counter.QuadPart) ||\r
+                               ((Time.QuadPart - 1000000) > Counter.QuadPart) )\r
+               { /* Adjust the offset */\r
+                       Offset.QuadPart += Time.QuadPart - Counter.QuadPart;\r
+                       Counter.QuadPart = Time.QuadPart;\r
+               }\r
+       \r
+               /* use the adjusted performance counter time for the time stamp */\r
+               CurrentTime.dwLowDateTime = Counter.LowPart;\r
+               CurrentTime.dwHighDateTime = Counter.HighPart;\r
+       }\r
+       else\r
+       {\r
+               GetSystemTimeAsFileTime(&CurrentTime);\r
+       }\r
+\r
+       FileTimeToTimeval(&CurrentTime,ptv);\r
+\r
+       return(0);\r
+}\r
+\r
+#endif /* _GTOD_C_ */\r
index 092ef93518b0c9e06986a85a9673b564c7f02cfe..f72585a11b3f07cbaea442e8a4a29024628ef73b 100644 (file)
 \r
 \r
 #if defined( _DEBUG_ )\r
-//#define cl_dbg_out DbgPrintHelper\r
-VOID cl_dbg_out( IN PCCH  Format, ...);\r
+\r
+#ifdef __cplusplus\r
+extern "C"\r
+{\r
+#endif\r
+\r
+VOID cl_dbg_out( IN const char * const  Format, ...);\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
 #else\r
 #define cl_dbg_out     __noop\r
 #endif /* defined( _DEBUG_ ) */\r
index a71293804eeda30253cd284f53c996648c51ef12..12fdb351eec1444103b63606a0f2ca7cae9f78b6 100644 (file)
@@ -432,6 +432,7 @@ typedef struct _igmp_v2_hdr
 \r
 #define DHCP_PORT_SERVER               CL_HTON16(67)\r
 #define DHCP_PORT_CLIENT               CL_HTON16(68)\r
+#define DHCP_PORT_PROXY_SERVER CL_HTON16(4011)\r
 \r
 #define DHCP_REQUEST                   1\r
 #define DHCP_REPLY                             2\r
diff --git a/branches/winverbs/inc/user/linux/sys/time.h b/branches/winverbs/inc/user/linux/sys/time.h
new file mode 100644 (file)
index 0000000..36df6ab
--- /dev/null
@@ -0,0 +1,41 @@
+/*\r
+ * This software is available to you under the OpenFabrics.org BSD license\r
+ * below:\r
+ *\r
+ *     Redistribution and use in source and binary forms, with or\r
+ *     without modification, are permitted provided that the following\r
+ *     conditions are met:\r
+ *\r
+ *      - Redistributions of source code must retain the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer.\r
+ *\r
+ *      - Redistributions in binary form must reproduce the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer in the documentation and/or other materials\r
+ *        provided with the distribution.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
+ * SOFTWARE.\r
+ */\r
+\r
+#ifndef _SYS_TIME_H_\r
+#define _SYS_TIME_H_\r
+\r
+#include <winsock2.h>\r
+\r
+struct timezone {\r
+        int     tz_minuteswest; /* minutes west of Greenwich */\r
+        int     tz_dsttime;     /* type of dst correction */\r
+};\r
+\r
+\r
+extern int gettimeofday(struct timeval *ptv, void *ignored);\r
+\r
+#endif\r
index 7b86f8efde6e92ae7e6a6d286e0d2b9843aeaa53..f23b9bf677e9083d08e9e8ebd58ec348ad4142d1 100644 (file)
-commit 0ef94459e0a0175233b43b3fcbaaac2596e1042d
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Apr 29 14:33:28 2009 -0700
-
-    scm, cma: dat max_lmr_block_size is 32 bit, verbs max_mr_size is 64 bit
-    
-    mismatch of device attribute size restricts max_lmr_block_size to 32 bit
-    value. Add check, if larger then limit to 4G-1 until DAT v2 spec changes.
-    
-    Consumers should use max_lmr_virtual_address for actual max
-    registration block size until attribute interface changes.
-    
-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-
-commit f91f27eaaab28b13a631adf75b933b7be3afbc0f
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Apr 29 10:51:03 2009 -0700
-
-    scm: increase default MTU size from 1024 to 2048
-    
-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-
-commit 8d6846056f4c86b6a06346147df55d37c4ba9933
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Apr 29 10:49:09 2009 -0700
-
-    openib_scm, cma: use direct SGE mappings from dat_lmr_triplet to ibv_sge
-    
-    no need to rebuild scatter gather list given that DAT v2.0
-    is now aligned with verbs ibv_sge. Fix ib_send_op_type_t typedef.
-    
-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-
-commit c61f75b3412935e7d4a7a1acc9c495dcb4ac7e24
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Apr 29 08:39:37 2009 -0700
-
-    dtest: add flush EVD call after data transfer errors
-    
-    Flush and print entries on async, request, and receive
-    queues after any data transfer error. Will help
-    identify failing operation during operations
-    without completion events requested.
-    Fix -B0 so burst size of 0 works.
-    
-    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
-
-commit c88a191c7a408b0fb3dfb418a77a5b3b5afc778e
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Apr 22 13:16:19 2009 -0700
-
-    dtest/dapltest: Cleanup code with Lindent
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 8699a9f1bd2bb45b04b87f887698707ba7b62d0a
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Apr 21 15:51:24 2009 -0700
-
-    ibal-scm: remove, obsolete
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 67ddd6bfba46f1f7a61b772257132f1257d05c96
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Apr 21 15:44:15 2009 -0700
-
-    scm, cma provider: Cleanup code with Lindent
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit d0898091090ff19be7929fed0d14f1ca696d5e53
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Apr 21 15:39:01 2009 -0700
-
-    udapl: Cleanup code with Lindent
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit a688d1cfb52fde256c5bfd95a27f940dd17e7ced
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Apr 21 15:31:20 2009 -0700
-
-    dapl common: Cleanup code with Lindent
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 2bded73c7f68cfb870e432ab3ebae7427d595cbe
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Apr 21 12:52:29 2009 -0700
-
-    dat: Cleanup code with Lindent
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 31e7b9210fc5334ff3be62558e74e3fdf01d6cbd
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Apr 20 12:28:08 2009 -0700
-
-    Release 2.0.18
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 29bf0a24f54c45d2742026756f31f1a1f26fb6f3
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Thu Apr 16 14:35:18 2009 -0700
-
-    dapltest: reset server listen ports to avoid collisions during long runs
-    
-    If server is running continuously the port number increments
-    from base without reseting between tests. This will
-    eventually cause collisions in port space.
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit c27af8de0501d132b8152ec8546023cdba212de5
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   Thu Apr 16 10:21:51 2009 -0700
-
-    To avoid duplicating port numbers between different tests, the next port
-    number to use must increment based on the number of endpoints per thread *
-    the number of threads.
-    
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit 3084310197c20aaa50abe82260fc835786f591f5
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   Thu Apr 16 10:21:45 2009 -0700
-
-    dapltest assumes that events across multiple endpoints occur in a specific
-    order.  Since this is a false assumption, avoid this by directing events to
-    per endpoint EVDs, rather than using shared EVDs.
-    
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit ef87a0a462f4fa07ac252e28d3aeb44af73cc202
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   Thu Apr 16 10:21:41 2009 -0700
-
-    Synchronization is missing between removing items from an EVD and queuing
-    them.  Since the removal thread is the user's, but the queuing thread is
-    not, the synchronization must be provided by DAPL.  Hold the evd lock
-    around any calls to dapls_rbuf_*.
-    
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit f5e86d28f803162ffdf94b41ec7435dec92f728d
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   Thu Apr 16 10:21:26 2009 -0700
-
-    Communication to the CR thread is done using an internal socket.  When a
-    new connection request is ready for processing, an object is placed on
-    the CR list, and data is written to the internal socket.  The write causes
-    the CR thread to wake-up and process anything on its cr list.
-    
-    If multiple objects are placed on the CR list around the same time, then
-    the CR thread will read in a single character, but process the entire list.
-    This results in additional data being left on the internal socket.  When
-    the CR does a select(), it will find more data to read, read the data, but
-    not have any real work to do.  The result is that the thread spins in a
-    loop checking for changes when none have occurred until all data on the
-    internal socket has been read.
-    
-    Avoid this overhead by reading all data off the internal socket before
-    processing the CR list.
-    
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit 2ab52e9b1ab37c6eb44206c135e0568a8c2d01fa
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   Thu Apr 16 10:21:13 2009 -0700
-
-    The dapl connect call takes as input an address (sockaddr) and a port number
-    as separate input parameters.  It modifies the sockaddr address to set the
-    port number before trying to connect.  This leads to a situation in
-    dapltest with multiple threads that reference the same buffer for their
-    address, but specify different port numbers, where the different threads
-    end up trying to connect to the same remote port.
-    
-    To solve this, do not modify the caller's address buffer and instead use
-    a local buffer.  This fixes an issue seen running multithreaded tests with
-    dapltest.
-    
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit 7947026ede478f08b4a7b8cb607f457765bf2afa
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   Thu Apr 16 10:21:03 2009 -0700
-
-    Windows socket calls should check return values against SOCKET_ERROR to
-    determine if an error occurred.
-    
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit e66e42fc44c50c8202f7c98f76d799a69aa3f1b6
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Fri Apr 10 08:33:41 2009 -0700
-
-    Build: add new file dapl/openib_cma/linux/openib_osd.h to EXTRA_DIST
-    
-    Fix rpmbuild problem with new cma osd include file.
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit acb213adb3268e9bf6999e2bf040d4a71212b701
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Fri Apr 10 08:32:24 2009 -0700
-
-    dapl scm: reduce wait time for thread startup.
-    
-    thread startup wait reduce to 2ms to reduce open times.
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 55459699fa9c0e5fb7e2b17822f0916412c64b35
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Fri Apr 10 08:31:22 2009 -0700
-
-    dapl-scm: getsockopt optlen needs initialized to size of optval
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit d710c5327e05a40796341d16b45a2b098b03f588
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   Fri Apr 10 08:17:32 2009 -0700
-
-    The connection request thread adds sockets to a select list unless
-    the cr->socket is invalid and the cr request state is set to destroy.  If the
-    cr->socket is invalid, but the cr->state is not destroy, then the cr->socket
-    is added to an FD set for select/poll.  This results in select/poll
-    returning an error when select is called.  As a result, the cr thread never
-    actually blocks during this state.
-    
-    Fix this by only destroying a cr based on its state being set to destroy
-    and skip adding cr->sockets to the FD set when they are invalid.
-    
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit 0be961c432f897d4f92d9a24dcb7c42ad30ea160
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   Fri Apr 10 08:08:16 2009 -0700
-
-    Make sure all locks are initialized properly and don't zero their memory
-    once they are.
-    
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit 9abdc26cd6154aa55588759ba54c9ca69e3fe2b5
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   Fri Apr 10 08:08:13 2009 -0700
-
-    The lock functions are defined just a few lines beneath the prototypes
-    as inline.  Remove the duplicate prototypes.
-    
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit 9578c4aeb9878d98374e4b7abc02db182aef82c6
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   Fri Apr 10 08:08:07 2009 -0700
-
-    Make sure all locks are initialized and don't zero out their memory once
-    they are.
-    
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit 97edcbb662b489303ef68c0da02831efaddeed91
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   Fri Apr 10 08:08:03 2009 -0700
-
-    The IBAL library allocates a small number of threads for callbacks to the
-    user.  If the user blocks all of the callback threads, no additional
-    callbacks can be invoked.  The DAPL IBAL provider cancels listen requests
-    from within an IBAL callback, then waits for a second callback to confirm
-    that the listen has been canceled.  If there is a single IBAL callback
-    thread, or multiple listens are canceled simultaneously, then the provider
-    can deadlock waiting for a cancel callback that never occurs.
-    
-    This problem is seen when running dapltest with multiple threads.
-    
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit 3e56e63bcb68de352edadafdcfcc4cb222c08c7b
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   Fri Apr 10 08:07:57 2009 -0700
-
-    We need to check the return value from select for errors before checking
-    the FD sets.  An item may be in an FD set but select could have returned
-    an error.
-    
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit a8a977becaeefe0d7f8e01e01631a11988d2d54e
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   Fri Apr 10 08:07:53 2009 -0700
-
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit ecc79cc0a1ae2bdbb3dfd19e15b3b562ac9a2957
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   Fri Apr 10 08:07:49 2009 -0700
-
-    Enable building with CQ_WAIT_OBJECTS support to directly wait on CQ
-    completion channels in the Windows version of the openib_scm provider.
-    Also minor fixup to use DAPL_DBG_TYPE_UTIL for debug log messages
-    instead of DAPL_DBG_TYPE_CM.
-    
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit 73728763666a46df5789af93b50db53cdf64afd6
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   Fri Apr 10 08:07:44 2009 -0700
-
-    The IBAL-SCM provider will run into an inifinite loop if the check for
-    cr->socket > SCM_MAX_CONN - 1 fails.  The code continues back to the start
-    of the while loop without moving to the next connection request entry
-    in the list.
-    
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit 9b1b396539926d36ffacfff04fbe7c081e436b45
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   Fri Apr 10 08:07:40 2009 -0700
-
-    next_cr is set just before and inside the check
-    if ((cr->socket == DAPL_INVALID_SOCKET && cr->state == SCM_DESTROY)
-    Remove setting it inside the if statement.
-    
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit 7b49a9850f62276bb7bfccb2d85a1e94e311813c
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   Fri Apr 10 08:07:35 2009 -0700
-
-    Some errors on windows are more easily interpretted in hex than decimal.
-    
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit 08ee072a1396ac2c28983878dbc6b02feb035787
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   Fri Apr 10 08:07:32 2009 -0700
-
-    The WinOF HCA driver cannot handle transitioning from RTS -> RESET ->
-    INIT -> ERROR.  Simply delete the QP and re-create it to reinitialize
-    the endpoint until the bug is fixed.
-    
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit 51ef5d96ce67d6141ec02b2a318f1b6e12be1bcf
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   Fri Apr 10 08:07:23 2009 -0700
-
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit a8582be0e1fc89e856f1d0b43a3c1b271295a352
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   Fri Apr 10 08:07:18 2009 -0700
-
-    Convert the openib_cma provider to common code between linux and windows.
-    
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit cc2a71dfe0c35a70f6b1ba66070a3a06059a8bb5
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   Fri Apr 10 08:06:53 2009 -0700
-
-    Move from using pipes to sockets for internal communication.  This
-    avoids issues with windows only supporting select() on sockets.
-    
-    Remove windows specific definition of dapl_dbg_log.
-    
-    Update to latest windows libibverbs implementation using completion
-    channel abstraction to improve windows scalability and simplify
-    porting where FD's are accessed directly in Linux.
-    
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit b3ad2ed97399a24a869841e17d1314e11c379aae
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Mar 31 05:41:50 2009 -0800
-
-    Release 2.0.17
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 5d732929f8a90a490994e8e35a3666c3647ad4fe
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Mar 31 05:22:11 2009 -0800
-
-    dapl: ia64 build problem on SuSE 11, atomic.h no longer exists.
-    
-    Add autotools check for SuSE 11 and include intrinsics.h
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit d7b8654db3a1f4ead16cb2e6d15f0902a322a188
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Mar 16 13:23:50 2009 -0800
-
-    Release 2.0.16
-    
-    Fix changelog year in spec file.
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 08d9e26a85911f99d47cbb92ec8bccfc7f073be0
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Mar 16 13:15:22 2009 -0800
-
-    Release 2.0.16
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 42c97b2a11d63ac6ba8a15fe8c82061e7da6e136
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Fri Mar 13 12:39:12 2009 -0800
-
-    uDAPL: scm provider, remove query gid/lid from connection setup phase
-    
-    move lid/gid queries from the connection setup phase
-    and put them in the open call to avoid overhead
-    of more fd's during connections. No need
-    to query during connection setup since uDAPL
-    binds to specific hca/ports via dat_ia_open.
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 775394b73980a7bc0af018a33d2a5bb795469c78
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Thu Mar 12 12:44:43 2009 -0800
-
-    Build: missing new linux/osd include file in EXTRA_DIST
-    
-    Add dapl/openib_scm/linux/openib_osd.h to EXTRA_DIST
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 647e288c1c9af5261495a5ed88e6ecbe1daf6d6e
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Thu Mar 12 12:11:21 2009 -0800
-
-    Build: spec files missing Requires(post) statements for sed/coreutils
-    
-    needed for anaconda install
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 1f5b3b7cab0785b64e8dab035dd4cd27111497d3
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Mar 4 10:04:13 2009 -0800
-
-    dapl scm: remove unecessary thread when using direct objects
-    
-    A thread is created for processing events on devices without
-    direct event objecti support. Since all openfabrics devices support
-    direct events there is no need to start a thread. Move this under
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 66e4236e2c57dbaf860b7c20809b65a4fbbafa6f
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Mar 3 11:08:12 2009 -0800
-
-    dtestx: add missing F64u definition for windows
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit d9e771da16ec2b360a222ceccbbca5d088e20ee5
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Mar 3 09:25:26 2009 -0800
-
-    uDAPL common: add 64 bit counters for IA, EP, and EVD's.
-    
-     -DDAPL_COUNTERS to build-in counters for cma and scm providers.
-     New extension calls in dat_ib_extensions.h for counters
-       dat_print_counters, dat_query_counters
-     Counters for operations, async errors, and data
-     Update dtestx (-p) with print and query counter examples
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 5e6ad3cdaa1d72523ad6b38d8306e0a2d0f1ada6
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   Tue Feb 17 07:24:27 2009 -0800
-
-    Modify the openib_scm provider to support both OFED and WinOF releases.
-    This takes advantage of having a libibverbs compatibility library.
-    
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit 0425c24c3b66e672bba346a1d0946b11c7b8b11e
-Author: Stan Smith <stan.smith@intel.com>
-Date:   Fri Jan 30 09:52:33 2009 -0800
-
-    Update the dapl.git tree with the latest SVN version of the
-    ibal-scm provider.
-    
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit 83543b6cca342e25fd6408454f1261ec6835a172
-Author: Stan Smith <stan.smith@intel.com>
-Date:   Fri Jan 30 09:52:25 2009 -0800
-
-    Merge SVN IBAL provider code back into the main git tree.
-    
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit be0b6122d0fe4f93afc8cf3ec961702faf82fb44
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   Fri Jan 30 09:52:11 2009 -0800
-
-    Changes to dtest to support building on Windows.
-    
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit 9f87610c4b37e4db4d74205c14028582a2f6a79e
-Author: Stan Smith <stan.smith@intel.com>
-Date:   Fri Jan 30 09:48:26 2009 -0800
-
-    Add return codes to various functions.
-    Add script (batch file) for Windows testing.
-    
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit 723067550265defdcfe6e00460a4f89f7a81fbf1
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   Fri Jan 30 09:46:40 2009 -0800
-
-    Merge OFED and WinOF trees for common dapl code.
-    
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit 5b37e080e1ecc6903b3ab1ac9b0d4c9f8a18b790
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Fri Jan 16 08:16:13 2009 -0800
-
-    dtest/dapltest: use $(top_builddir) for .la files during test builds
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit bd655d4fdd7e63e7fdeed3979926da5582f71e4b
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Nov 26 07:12:30 2008 -0800
-
-    Release 2.0.15
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 5d5dec42717c963d1644ee3e716459dc5d58e930
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Oct 27 08:48:53 2008 -0800
-
-    dapltest: transaction test moves to cleanup stage before rdma_read processing is complete
-    
-    With multiple treads, the transaction server tread can move to cleanup
-    stage and unregister memory before the remote client process has
-    completed the rdma read. In lieu of a rewrite to add sync messages
-    at the end of transaction test phase, just add a delay before cleanup.
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 101a843e59b881bc131dfd5c2aec7e54d44f35c0
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Oct 14 11:56:35 2008 -0700
-
-    Current static registration (SR) assumes DAT_OVERRIDE or /etc/dat.conf.
-    Change SR to include sysconfdir. SR file access in the following order:
-    
-    - DAT_OVERRIDE
-    - sysconfdir
-    - /etc
-    
-    if DAT_OVERRIDE is set, assume administration override
-    and do not failover to other locations. Add debug
-    messages for each failure and retries.
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-    Acked-by: Doug Ledford <dledford@redhat.com>
-
-commit c98d2169b839a73d76691acf510dd8976ddc850a
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Fri Oct 3 08:00:56 2008 -0700
-
-    Release 2.0.14
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit c26d0bb065f3734f09058e1e6d26dde4a3738e55
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Fri Oct 3 05:40:04 2008 -0700
-
-    dat.conf: add ofa-v2-iwarp entry for iwarp devices
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit d54c35c8a9ba33a464ca15f4a65b914688e5194d
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Fri Oct 3 05:30:10 2008 -0700
-
-    dapl: adjust max_rdma_read_iov to 1 for query on iWARP devices
-    
-    iWarp spec allows only one iov on rdma reads
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 9584df22d0cb3aa5a2a2a04bf427524d17650ef7
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Oct 1 08:17:49 2008 -0700
-
-    dtest: reduce default IOV's during dat_ep_create for iWARP devices
-    
-    iWarp adapters tend to have less IOV resources then IB adapters.
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 8ca9898621acf5b9769d46ea34ee8ca1eecaf2ff
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Fri Sep 26 12:43:13 2008 -0700
-
-    dtest: fix 32-bit build issues in dtest and dtestx examples.
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 42a3a4edf30115a35d9d599b51f8756814e62368
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Fri Sep 26 08:48:31 2008 -0700
-
-    Revert "Release 2.0.14"
-    
-    This reverts commit 816d1c3acfb4a457c6b1cc07d657f018312f2a63.
-    
-    missed some fixes for package release.
-
-commit 816d1c3acfb4a457c6b1cc07d657f018312f2a63
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Sep 24 12:13:37 2008 -0700
-
-    Release 2.0.14
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit c00d858da3113ce5463d408ab5e13e17cc9529e4
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Sep 24 08:33:32 2008 -0700
-
-    build: $(DESTDIR) prepend needed on install hooks for dat.conf
-    
-    All install directives that automake creates automatically
-    have $(DESTDIR) prepended to them so that a make
-    DESTDIR=<some_path> install will work. The hand written
-    install hooks for dat.conf was missing DESTDIR.
-    
-    Signed-off-by: Doug Ledford <dledford@redhat.com>
-
-commit 860db3be4907c8ff290ce7c6b631b2117f5080bd
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Sep 24 08:26:28 2008 -0700
-
-    dapl scm: UD shares EP's which requires serialization
-    
-    add locking around the modify_qp state changes to avoid
-    unnecessary modify_qp calls during multiple resolve
-    remote AH connection events on a single EP.
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit f2c214647b5ce53e52052d6b6bea3fbace7cc20a
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Sat Sep 20 16:02:00 2008 -0700
-
-    dtestx: Add new options to test UD.
-    
-    - many to one/many EP remote AH resolution, data flow
-    - bi-directional EP remote AH resolution, data flow
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 3c218b5ed65d0b7349a86eb0fe6f6bf57e3eccd6
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Sat Sep 20 15:58:59 2008 -0700
-
-    dapl: fixes for IB UD extensions in common code and socket cm provider.
-    
-     - Manage EP states base on attribute service type.
-     - Allow multiple connections (remote_ah resolution)
-       and accepts on UD type endpoints.
-     - Supply private data on CR conn establishment
-     - Add UD extension conn event type - DAT_IB_UD_PASSIVE_REMOTE_AH
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 01cdd688ddebec8df6f17f92c3b72a410f50dd6f
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Sat Sep 20 15:49:40 2008 -0700
-
-    dapl: add provider specific attribute query option for IB UD MTU size
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit ee3d9ce2389a14c85405dfdff67f04a5f5679e32
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Sep 1 15:52:37 2008 -0700
-
-    Release 2.0.13
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit f37589927fabf0feb3a09c4c7c03e18df5749fef
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Sep 1 12:24:49 2008 -0700
-
-    dapl build: add correct CFLAGS, set non-debug build by default for v2
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 280f3aec6d0fa9d7e36f75711471e35333ee34cf
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Sep 1 12:22:19 2008 -0700
-
-    dapl providers: fix compiler warnings in cma and scm providers
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 60c0589a2aba520ae67b1c8eaad5a167edb6fba3
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Sep 1 12:20:08 2008 -0700
-
-    dat: fix compiler warnings in dat common code
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit fb3e368db07d02a3daa1d12d71f62ac4e7a5ef23
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Sep 1 12:18:48 2008 -0700
-
-    dapl: fix compiler warnings in common code
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 38a53ae75bce5059a84262fe1b40eacf92b22287
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Sep 1 12:16:58 2008 -0700
-
-    dtest/dapltest: fix compiler warnings
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 45900087764917b354411fdd2b3880473d553ab8
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Fri Aug 22 14:51:22 2008 -0700
-
-    dapl cma: debug message during query needs definition for inet_ntoa
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 99d46313a03af18771966cf86fcc934d179627b5
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Thu Aug 21 12:54:58 2008 -0700
-
-    Release 2.0.12
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 0b2a3fac8d28d5b3c2e1416fa696fe4cbc672f00
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Aug 20 18:51:00 2008 -0700
-
-    dapl scm: fix corner case that delivers duplicate disconnect events
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 96f6822b90fa880a6c6a64b1e183064a449f7237
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Aug 20 18:47:19 2008 -0700
-
-    dat: include stddef.h for NULL definition in dat_platform_specific.h
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 283e37c09ad072d69d29e28225e9a6e8bf3f75f0
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Aug 20 18:27:08 2008 -0700
-
-    dapl: add debug messages during async and overflow events
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 4a7965ac07b7f2ee1deb5b144ed50b30c1749d38
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Aug 20 18:24:33 2008 -0700
-
-    dapltest: add check for duplicate disconnect events in transaction test
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 7e8986f2c6496851b724a007458881c3248ac998
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Aug 20 18:22:42 2008 -0700
-
-    dtestx: fix stack corruption problem with hostname strcpy
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit ee2a553762abd6ebede99db5d26d1ba1d74ba3cb
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Thu Aug 14 09:42:57 2008 -0700
-
-    dapl scm: use correct device attribute for max_rdma_read_out, max_qp_init_rd_atom
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 142a8e4a99259fa6fe31f74ce6d0dac1017f381b
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Thu Aug 14 09:19:53 2008 -0700
-
-    dapl scm: change IB RC qp inline and timer defaults.
-    
-    rnr nak can be the result of any operation not just
-    message send recevier not ready. Timer is much too
-    large given this case.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 36088a92d87e833bae535fcea0c45417dec34e65
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Thu Aug 14 09:12:38 2008 -0700
-
-    dapl scm: add mtu adjustments via environment, default = 1024.
-    
-    DAPL_IB_MTU adjusts path mtu setting for RC qp's. Default setting
-    is min of 1024 and active mtu on IB device.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit a7dabdc4c1ddc62cc0384d60e8157ee829f12898
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Aug 13 14:17:40 2008 -0700
-
-    dapl scm: change connect and accept to non-blocking to avoid blocking user thread.
-    
-    The connect socket that is used to exchange QP information is now non-blocking
-    and the data exchange is done via the cr thread. New state RTU_PENDING added.
-    On the passive side there is a new state ACCEPT_DATA used to avoid read blocking
-    on the user accept call.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 7e25c0f21d755cce3aa7aff993fb0baddaafc0e8
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Jul 29 08:18:25 2008 -0700
-
-    dapl scm: update max_rdma_read_iov, max_rdma_write_iov EP attributes during query
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit fd9909618fdfff0eb2c8ce97bff61ea98ec44a8e
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Sun Jul 20 13:20:45 2008 -0700
-
-    Release 2.0.11
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 0003bb7866af3ba73cc79c703b565a8012439bb1
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Sun Jul 20 13:17:22 2008 -0700
-
-    dtestx: add -d option to test new IB UD extension.
-    
-    modify dtestx to connect peer UD QP's and exchange/verify messages as an example for new extension.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 9816ac15f98f6e73cf7b371ac6e1e312d4171c0b
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Sun Jul 20 13:13:09 2008 -0700
-
-    dapl scm: add support for UD extensions in Openfabrics socket cm provider
-    
-    add qp_type in connection information exchange
-    add new post_send_ud call
-    changes to connection manager to support qp types beyond RC.
-    changes to connection events to use new extended event calls.
-    exchange address handle information during connection phase.
-    changes to modify_qp to handle both RC and UD types.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 927dac5b61e64868089acd49d468b98327e14a1a
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Sun Jul 20 13:07:34 2008 -0700
-
-    dapl: add support for UD extensions in common code.
-    
-    allow EP create for extended service types.
-    extend connection event types to include UD AH resolution/exchange.
-    add new extended connect and connect request upcalls for providers.
-    - dapls_evd_post_cr_event_ext
-    - dapls_evd_post_connection_event_ext
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit be3d6a53f3340294697706ce50a05faf151aacc7
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Sun Jul 20 12:57:49 2008 -0700
-
-    dat: New definitions for IB unreliable datagram extension
-    
-    Extend EP dat_service_type, with DAT_IB_SERVICE_TYPE_UD
-    Add IB extension call dat_ib_post_send_ud().
-    Add address handle definition for UD calls.
-    Add IB event definitions to provide remote AH via connect and connect requests
-    Roll IB extension version to 2.0.2
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 8f65d4c96a7e13f7092d82f2f5aad477a61a57c1
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Fri Jul 18 07:46:20 2008 -0700
-
-    dat: allow TYPE_ERR messages to be turned off with DAT_DBG_TYPE
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 4fefc6bca4e21c9d757923bf13bc93c62dbff17d
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Jun 25 08:02:11 2008 -0700
-
-    dapltest: manpage - rdma write example incorrect
-    
-    parameter for rdma write should be RW and not WR
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 68638bde71b529a142c13ac332cd44435cabc896
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Jun 23 15:26:30 2008 -0700
-
-    dapl: remove needless terminating 0 in dto_op_str functions.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit cb1f2a144ecd375d2143d6e176a6a92a18556d7e
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Jun 23 10:52:46 2008 -0700
-
-    Release 2.0.10
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit d9b3c06ae98ac4d3b264384f6510137166d78cb0
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Jun 23 10:35:17 2008 -0700
-
-    remove reference to doc/dat.conf in makefile.am
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit b052d402e09ac78281a25af2c8fe902fa71f5c6f
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Thu Jun 19 13:34:49 2008 -0700
-
-    dapl scm: fix ibv_destroy_cq busy error condition during dat_evd_free.
-    
-    Problem surfaced while running Intel MPI 3.1 and mpich2-test suite.
-    dapli_destroy_cm was incorrectly removing reference to qp_handle in endpoint
-    and destroy_cq and destroy_pd code was ignoring verbs errors.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit e466d8e330c45176c5f00efda79ad745bf3f71a4
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Jun 18 14:21:28 2008 -0700
-
-    dapl scm: add stdout logging for uname and gethostbyname errors during open.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 8e1f4db702cacdd2b9b95083db54ec38c9d2f5e5
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Jun 18 14:19:51 2008 -0700
-
-    dapl scm: support global routing and set mtu based on active_mtu
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit fc65a08727c59c304dad20337a8bff803f2302c0
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Jun 18 13:59:44 2008 -0700
-
-    dapl scm: Adding socket cm provider for better scalability on large homogeneous clusters.
-    
-    Bring socket cm provider back to life with some changes:
-    
-    better threading support for exchanging QP information.
-    Avoid blocking during connect to support dynamic connection
-    model with MPI implementations.
-    
-    consumer control of ack timeout/retries.
-    
-    disconnect/reject capabilities via socket exchange.
-    
-    version support for wire protocol to insure compatibility
-    with peer scm provider. Add gids to exchange.
-    
-    validated with Intel MPI on a 14,000+ core fabric using IB DDR.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 0855af175fec2f1bec8391ebae2a2cdff26a3359
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Jun 11 10:43:24 2008 -0700
-
-    dapl: add opcode to string function to report opcode during failures.
-    
-    Need to use cookie opcode during failures in lieu of cqe opcode.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit ec6296e7f0a843c69231f8284ae780014fa26fbe
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Jun 16 14:59:43 2008 -0700
-
-    dapl: remove unused iov buffer allocation on the endpoint
-    
-    provider's manage iov space on stack during posting.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit c678414ced8bc9cbe21b2fc1d54aa2af73ba6528
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Jun 16 13:59:11 2008 -0700
-
-    dapl: endpoint pending request count is wrong
-    
-    The code assumes every cookie allocated during posting of
-    requests gets completed. This incorrect assumption results in
-    wrong pending count. Remove request_pending field and replace
-    with direct call, dapl_cb_pending, to provide accurate
-    data to consumer.
-    
-    Add debug print if consumer overruns request queue.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit c446a3a3f3ecbd91ab583fee35bf613ab10defcd
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Jun 2 12:40:45 2008 -0700
-
-    dapl extension: dapli_post_ext should always allocate cookie for requests.
-    
-    extension didn't allocate cookie if completion was suppressed which resulted
-    segfault during provider post call. Provider's expect cookie for wr_id,
-    even with surpressed completions, to handle events during errors.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 2583f07d9d0f55eee14e0b0e6074bc6fd0712177
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue May 20 14:35:43 2008 -0700
-
-    Release 2.0.9
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 9b38e7b792c48ea63c2078fc6c10bb843d96bd06
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue May 20 21:56:06 2008 -0700
-
-    dtest,dtestx,dapltest: fix build issues with Redhat EL5.1
-    
-    need include files/definitions for sleep, getpid, gettimeofday
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 8084ebf39729bac310447467b518df4248e9e2b6
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue May 20 14:31:09 2008 -0700
-
-    dapl: Fix long delays with the cma provider open call when DNS is not configure on server.
-    
-    Open call should default to netdev names when resolving local IP address for cma binding to match dat.conf settings. The open code attempts to resolve with IP or Hostname first and if there is no DNS services setup the failover to netdev name resolution is delayed for as much as 20 seconds.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 2f603b03f4cebe7c414cbaeecb7155f7bf1fb115
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue May 20 14:30:05 2008 -0700
-
-    dapl: change cma provider to use max_rdma_read_in,out from ep_attr instead of HCA max values when connecting.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 7a0e5fad6de7c6affc4ba3c608b0c56f4206c48c
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Apr 30 14:48:21 2008 -0700
-
-    Release 2.0.8
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 561f09ab6f9fd46a6075ecb54ca7693f2b12f311
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Apr 30 13:51:41 2008 -0700
-
-    dapl: fix post_send, post_recv to handle 0 byte's and NULL iov handles
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 0289daa3fcc4451bace8cc6b6e20ddb7bbade07e
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Apr 30 13:25:53 2008 -0700
-
-    dat: udat_sr_parser ia_name will fail on comments, turn down debug message
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit b93b91d48186d100c48f1a479776d56476847607
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Apr 29 16:15:44 2008 -0700
-
-    dat: cleanup error handling with static registry parsing of dat.conf
-    
-    change asserts to return codes, add log messages, and
-    report errors via open instead of asserts during dat
-    library load.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit b6b1f152efabe064ab8bdcdeecbd1edd30eb732f
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Apr 28 10:14:20 2008 -0700
-
-    dapl: cma provider needs to support lower inline send default for iWARP
-    
-    IB and iWARP work best with different defaults. Add transport check
-    and set default accordingly. 64 for iWARP, 200 for IB.
-    
-    DAPL_MAX_INLINE environment variable is still used to override.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit be32d7d5beeeceac5dbb1974d3217265dc4d5461
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Apr 28 09:44:12 2008 -0700
-
-    dtestx: need to include string.h for memset/strcpy declarations
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit a192465714e7607529303a80d8f9a312e0c7aec6
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Apr 28 08:41:05 2008 -0700
-
-    dapl: add vendor_err with DTO error logging
-    
-    DAPL_GET_CQE_VENDOR_ERR added to get vendor_err via cq entry.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 6ac657a4e7e5e27254a024fca7fdead569043f9a
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Fri Apr 25 15:12:34 2008 -0700
-
-    dapl: add check before destroying cm event channel in release
-    
-    library may be loaded and unloaded without calling open
-    in which case the cm event channel is not created.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit c1eb23352f44aec6faeef37d8f0c3180f6259cf8
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Apr 22 12:55:13 2008 -0700
-
-    dapl: evd_alloc doesn't check for direct_object_create errors.
-    
-    Fix error check in dapls_ib_wait_object_create() and dat_evd_alloc.
-    When attempting to create large number of evd's that exceed
-    open files limit the error was not propagated up causing
-    a segfault. Note: there are 3 FD's required for each EVD
-    2 for pipe, and one for cq event_channel.
-    
-    Change the error reporting to indicate correct return
-    code and send to log with non-debug builds.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit c5c6229b3e7744782cace0ca1f5f1fa89198bd3a
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Apr 14 13:10:13 2008 -0700
-
-    dapl: change packaging to modify OFA provider contents of dat.conf instead of file replacement.
-    
-    Change the packaging to update only the OFA provider contents in dat.conf. This allows other
-    dapl providers, other then OFA, to co-exist and configure properly. Adding manpage to explain
-    syntax of this static configuration file.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit d32b27d991bc1314eea055ce3f55bb585b11aaac
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Fri Apr 11 11:37:48 2008 -0700
-
-    dapl openib_cma: fix hca query to use correct max_rd_atom values
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit ac4ccfd144c01b7f4285b0cecc6218c58d0482a8
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Apr 9 17:26:06 2008 -0700
-
-    dat: add logging by default during library load failures.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 1794e94754a1e58fcf214c2802e950124bbd1316
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Apr 8 17:32:03 2008 -0700
-
-    dtest: add private data validation with connect and accept.
-    
-    Include code, with build option, to validate private data with
-    consumer rejects.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 46f21284bc05e76e82b9ad6cd9f1dbc9bcde0a28
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Apr 8 17:25:11 2008 -0700
-
-    dapl: add hooks in evd connection callback code to deliver private data with consumer reject.
-    
-    PEER rejects can include private data. The common code didn't support delivery
-    via the connect event data structure. Add the necessary hooks in
-    dapl_evd_connection_callback function and include checks in openib_cma
-    provider to check and delivery properly. Also, fix the private data size
-    check in dapls_ib_reject_connection function.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 90e04c6f76dd5cfebd2f2867bfe22e85b0c2f461
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Apr 7 15:47:57 2008 -0700
-
-    dapl: increase reject private data size to avoid odd byte offets.
-    
-    remove reject type checking on passive side since it will
-    always be non-consumer from active side.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 353a1c8a00bb2a1380fd7a372973a5a70828da35
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Fri Apr 4 16:04:11 2008 -0800
-
-    dapl: update vendor information for OFA v2 provider.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit dbf1ea37f43caec61911dea06af801c2f906db0a
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Fri Apr 4 16:03:03 2008 -0800
-
-    dapl: add provider vendor revision data in private data with reject
-    
-    Add 1 byte header containing provider/vendor major revision
-    to distinguish between consumer and non-consumer rejects.
-    Validate size of consumer reject privated data.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 0f71b9be594739a1fba7d74929eacd42a8cee392
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Thu Apr 3 17:06:27 2008 -0800
-
-    dapl: add support for logging errors in non-debug build.
-    
-    Add debug logging (stdout, syslog) for error cases during
-    device open, cm, async, and dto operations. Default settings
-    are ERR for DAPL_DBG_TYPE, and stdout for DAPL_DBG_DEST.
-    
-    Change default configuration to build non-debug.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit bea882ad9b11ac7188628a939f5227e22c914169
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Thu Apr 3 16:23:29 2008 -0800
-
-    dapl: add support for private data in CR reject.
-    
-    Private data support via dat_cr_reject was added to
-    the v2 DAT specification but dapl was never extended
-    to support at the provider level.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit b5b096b6b6949fcb9fa711ab4784f41f1bb87525
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Apr 1 11:02:37 2008 -0800
-
-    dapl: calculate private data size based on transport type and cma_hdr overhead
-    
-    Need to adjust CM private date size based on different transport types.
-    Add hca_ptr to dapls_ib_private_data_size call for transport type
-    validation via verbs device. Add definitions to include iWARP size
-    of 512 and subtract 36 bytes for cma_hdr overhead.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 632af34f0ea15e12b572c656fe2ef561a0ad62b7
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Mar 26 17:58:17 2008 -0800
-
-    Remove improperly licensed GETOPT code from dtest source tree.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 88069fdd21f92923388dec7adbde0d1bc334e7c4
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Mar 18 15:04:34 2008 -0800
-
-    remove unnecessary assert from dapl_ep_free.
-    
-    dat_ep_free must handle the case where a consumer calls
-    free in CONNECTED or DISCONNECT_PENDING states. After
-    free calls disconnect, there may be a pending event,
-    in which case the providers dapls_ib_qp_free will block
-    accordingly and handle pending events.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit b3f020e5cba765077049a8cf61c4ce5009fa1031
-Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-Date:   Fri Mar 14 14:31:40 2008 -0700
-
-    fix openib_scm compiler warning
-    
-    Cast to socklen_t since accept(2) expects an unsigned argument.
-    
-    Makes the openib_scm provider now build successfully when using
-    make VERBS=<provider> (the -Werror flag was causing the build
-    failure)
-    
-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-
-commit 441996f05d3cc8b09c94c166ef736bc50c24de7e
-Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-Date:   Fri Mar 14 14:31:34 2008 -0700
-
-    fix provider-specific compiler warnings
-    
-    Initialize ds_array_start_p otherwise the compiler would claim
-    that this variable could be used with an uninitialized value.
-    
-    Makes the uDAPL providers now build successfully when using make
-    VERBS=<provider> (the -Werror flag was causing the build failure)
-    
-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-
-commit 5a710fc43ad004ecb4603db1359abb4a4fcd77e3
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Mar 11 09:25:07 2008 -0800
-
-    uDAPL: fix query to adjust max sge for default inline of 64 bytes
-           and include missing max_rdma_write_iov ep_attr field
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit e2c6bf57f78dfebc21e168df01e5876202053e08
-Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-Date:   Fri Mar 7 09:39:22 2008 -0800
-
-    uDAT: fix reuse of va_list in debugging mode
-    
-    Make sure we reinitialize the va_list since va_list is undefined
-    if a function traverses the va_list with va_arg.
-    
-    This patch fixes the uDAT debugging case when both stdout and
-    syslog output is wanted.
-    
-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-
-commit 4c9cd7a7268c0d8afb5b4d9b31537bc50cac18fe
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Thu Mar 6 15:40:35 2008 -0800
-
-    Add hostname and process id to debug output to aid
-    scale-up and out debug.
-    
-    Signed-off by: Arlin Davis ardavis@ichips.intel.com
-
-commit 460aa6f089fcdb34d78af1c8391cbecbcc6b0db3
-Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-Date:   Sat Feb 23 21:03:21 2008 -0800
-
-    fix reuse of va_list in debugging mode
-    
-    Make sure we reinitialize the va_list since va_list is undefined
-    if a function traverses the va_list with va_arg.
-    
-    This patch fixes the debugging case when both stdout and syslog
-    output is wanted.
-    
-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-
-commit da80af8c76f220508407a2e171c8b28b43b35bf9
-Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-Date:   Tue Feb 19 16:54:45 2008 -0800
-
-    Fix memory leak in provider specific post send/recv if there's
-    more than DEFAULT_DS_ENTRIES iovecs.
-    
-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-
-commit d78ee9f95fbe48f71eb247b01c598994edfa4d17
-Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-Date:   Tue Feb 19 03:19:42 2008 -0800
-
-    Guarantee NUL termination if hostname gets truncated.
-    
-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-
-commit 3484fa0d2b1a5549d83ecc82d89b72bb86f8fe4e
-Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-Date:   Tue Feb 19 03:19:37 2008 -0800
-
-    Make sure we don't leak the hash table if dapl_hca_alloc fails.
-    
-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-
-commit e4ed56be6bd64684564169d89df7ca30faffdb53
-Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-Date:   Tue Feb 19 03:19:32 2008 -0800
-
-    Fix memory leak.
-    
-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-
-commit 9efd005b185cfd970d2f8c58f05cf2eaae0dcdc8
-Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-Date:   Tue Feb 19 03:19:27 2008 -0800
-
-    Fix memory leak in error path.
-    
-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-
-commit d971e799bb5385a8c847cf3f863f19854e95c1b2
-Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-Date:   Tue Feb 19 03:19:22 2008 -0800
-
-    Fix memory leak
-    
-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-
-commit c21f2f455af7934675a58ff825bed6cf54d457c9
-Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-Date:   Tue Feb 19 03:19:17 2008 -0800
-
-    Fix memory leak.
-    
-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-
-commit ee46aa47e2a4deeded347fe18bd6321db61c6594
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Fri Feb 15 10:10:01 2008 -0800
-
-    Release 2.0.7
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit f0ca504bc2639cb7a48528d45e9026b54dab3e57
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Thu Feb 14 09:46:56 2008 -0800
-
-    uDAT: Make sure we initialize the dictionary entry early enough so that
-    we can base our cleanup decisions on that variable being
-    initialized.
-    
-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-
-commit 6b11838043a6012668c7e1a22a869e9e84dc40d6
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Thu Feb 14 09:46:18 2008 -0800
-
-    uDAT: Make sure we stay within bounds when manipulating the ia_name.
-    
-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 3eab70b4d34f850661b51dc1b856cd8d672a5cc9
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Thu Feb 14 09:44:56 2008 -0800
-
-    uDAT: Make sure we stay within bounds when manipulating the ia handle.
-    Fix typo in comment.
-    
-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-
-commit 7fe64f10874667062e067efb7ea8c3d385ae90b7
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Thu Feb 14 09:43:39 2008 -0800
-
-    uDAT: Zero-out memory otherwise we might base our cleanup decisions on
-    uninitialized memory.
-    
-    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
-
-commit f510e7e8f5b72a6262a7f8b255926cf96c65b654
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Feb 13 20:39:26 2008 -0800
-
-    Modify default configure options to match rpm spec file
-     --enable-debug, --enable-ext-type=ib
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 75273f1a5c599777bb43add93f30563689fdbc10
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Feb 11 15:43:03 2008 -0800
-
-    udapl OFA provider: set listen backlog to default cma backlog max.
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 7f173ecd7e18f25bc21a42651603922e7d71f7c7
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Feb 11 14:50:33 2008 -0800
-
-    The OFA dapl provider is checking for incorrect return code
-    from rdma_bind_addr and rdma_listen calls. This causes an error
-    to be returned back to the consumer instead of correctly
-    incrementing the seed port and re-calling the OFA provider
-    until a valid port is issued. The seed value (1000) is also
-    incorrect and should start a non-privledged port (1024) to
-    avoid EPERM errors when seeding the starting port value.
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 7bcb67ba7c9b37d7c122773f542c7f7f718d4a49
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Feb 4 16:16:10 2008 -0800
-
-    Release 2.0.6 - ChangeLog
-
-commit bead5f36542a8a4c790bda8ecc8dde3e630c15e6
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Feb 4 16:14:02 2008 -0800
-
-    Release 2.0.6
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 8c5beb870048aca286f7396549771ccb075c5c1b
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Feb 4 16:12:47 2008 -0800
-
-    Fix OFED v2 package to build against and target /dat2/include directory.
-    
-    Prevous patch missed dat_osd.h, dapltest/dtest incorrect.
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 42a63bb0271f91541e7b3c3967a9a977ef6660ae
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Feb 4 13:00:45 2008 -0800
-
-    uDAT/DAPL: Fix package to build against and target /dat2/include directory.
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit b3294c738d61f44ae4d0888662bdd6b64f6d6b1f
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Jan 29 16:34:49 2008 -0800
-
-    Release 2.0.5 - ChangeLog updated
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 356cf91905d39ade06d76ab9ace6203cd7907d93
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Jan 29 16:33:10 2008 -0800
-
-    libdat: rename libdat.so to libdat2.so to coexist with v1 devel
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit d9a9f46ee220ec9c479756acc306ed68060a662f
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Jan 28 13:55:35 2008 -0800
-
-    Release 2.0.4 - README
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 533983cec914a7ecc6829934a56f867d7870e301
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Jan 28 12:06:03 2008 -0800
-
-    Release 2.0.4 Changelog
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit bfc5bd4b4190c7302b08c3922c17e2131bfbe605
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Jan 28 12:04:18 2008 -0800
-
-    Relase package 2.0.4
-
-commit 95935648f81ac5177ae7120b35e55483902b8c64
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Jan 23 16:40:48 2008 -0800
-
-    dapltest does not include definitions for inet_ntoa.
-    At load time the symbol was resolved but with the
-    default definition of int, instead of char*, it caused
-    segfault. Add correct include files in dapl_mdep_user.h
-    for linux.
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 3c1bb0e56c14c5ad50876820e25933c1f4c3dde4
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Jan 23 14:46:30 2008 -0800
-
-    Add freeaddrinfo to deallocate getaddrinfo buffer.
-    Cleanup a few printf messages.
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit a4a8ad5eb1b15be19b3a343dee71ad3013d3f4bd
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Jan 23 14:25:21 2008 -0800
-
-    Fix for uDAPL v2 using extended operation. After extension completion,
-    the DTO cookie must be checked for type before deallocating to handle
-    inbound immediate data in receive. The sample dtestx client will fail
-    when running loopback if the rdma immediate is received from remote
-    before the rdma immediate request completion fires.
-    
-    Bug causes following dtestx client error:
-    dat_ib_post_rdma_write_immed
-       returned DAT_INSUFFICIENT_RESOURCES : DAT_RESOURCE_MEMORY
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 6dcf1763c153c27c29ba76bac35be4f6935ddd96
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Thu Jan 17 11:30:27 2008 -0800
-
-    WinOF: update dapltest,dtest directories for windows build
-    WinOF: add README.windows
-    
-    Signed-off by: Stan Smith <stan.smith@intel.com>
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 9bececbb32dd31d4a3528e8f000a773e5c593430
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Thu Jan 17 11:24:46 2008 -0800
-
-    WinOF: update dtestx for windows build
-    
-    Signed-off by: Stan Smith <stan.smith@intel.com>
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 4dc8c5defef0f52da751a1eca4d4f35de911c3c0
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Thu Jan 17 11:23:21 2008 -0800
-
-    WinOF: add build enviroment, cleanup old makefiles
-    
-    Signed-off by: Stan Smith <stan.smith@intel.com>
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 5a9e035fa33a6307b3d2b370f64639b14dfca87e
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Jan 15 16:59:34 2008 -0800
-
-    WinOF: name collision with ibal verbs ib_cm_handle_t
-    
-    Signed-off by: Stan Smith <stan.smith@intel.com>
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 7c5418a781c1dfdb37b09450b5df40363dce84b4
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Jan 15 16:06:10 2008 -0800
-
-    dtest: dat_evd_query for correct size
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 6de5e635c01e78bde6e153b727926da900677d52
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Jan 15 16:03:27 2008 -0800
-
-    dapltest: WinOF support.
-    
-    Signed-off by: Stan Smith <stan.smith@intel.com>
-
-commit c680e95b96e57bd8b69b1c73e95730854fcea028
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Jan 15 14:54:57 2008 -0800
-
-    openib_cma: fix cleanup issues in destroy_cm_id
-                add macros to convert SID and PORT
-                fix init/responder settings in accept
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit f8f867e52ffc36a31830dd4003eb2a4b4d265c93
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Jan 15 14:49:54 2008 -0800
-
-    Modifications for WinOF build and endian support for RMR info
-    
-    Signed-off by: Stan Smith <stan.smith@intel.com>
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 4c1fc48d2825efcffaa8cdf7efbdd2d41aeb56ab
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Jan 15 14:39:18 2008 -0800
-
-    WinOF: DAT_API changes, white space and tab cleanup
-           IBAL provider code added
-    
-    Common code: initialize cookie pool buffer
-                 add dapl extension DTO counter
-                 add get_cqe_op_str debug call
-                 remove excess dbg in evd_dequeue
-                 add dbg assert to sp_search_cr
-                 IBAL provider support _VENDOR_IBAL_
-    
-    Signed-off by: Stan Smith <stan.smith@intel.com>
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 68f2ad0af3623dec27b1223aeaca6357348eef4b
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Fri Jan 4 08:32:39 2008 -0800
-
-    Windows specific -
-       IBAL support in evd_create
-       Build IB extensions by default
-    Common code -
-       check return status, evd_free, evd_wait
-       add dapl_event_str function
-       definitions for dat_os_library_error, dat_os_ungetc
-    
-    Signed-off by: Stan Smith <stan.smith@intel.com>
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit d21f36406408245ac979f0b9594e7d1d0b9a3852
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Fri Jan 4 08:32:19 2008 -0800
-
-    Common code -
-       Missing DAT_API defs
-       casting to fix build issues
-       bitmaps for extension debug
-       DAPL_BAD_PTR macro
-    
-    Signed-off by: Stan Smith <stan.smith@intel.com>
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 258678a381c6a0170020c48b0ba627e820abd3e7
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Fri Jan 4 08:31:59 2008 -0800
-
-    Common code -
-       Add DAT_API definitions for dat_redirection.h, udat_redirection.h
-    
-    Signed-off by: Stan Smith <stan.smith@intel.com>
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 87d0b46a0c0f25e8828d7425e0173a0304a23f8b
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Fri Jan 4 08:31:27 2008 -0800
-
-    Windows specific -
-       Add dapl_ep fields ibal_cm_handle, recv_disc, sent_disc for IBAL provider
-       Support for direct object on CQ
-       INIT and FINI changes
-       setup dat.conf default path, fix sr parsing
-    Common code -
-       Add Stan Smith as contributor
-       O/S independent dat_os_library_error()
-    
-    Signed-off by: Stan Smith <stan.smith@intel.com>
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit b3ba3dc9743baf3bff243e8969edf3395d1118dd
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Dec 11 14:44:24 2007 -0800
-
-    2/2 uDAPL changes to sync common code base with WinOF
-     - add DAT_API to specify calling conventions (windows=__stdcall, linux= )
-     - cleanup platform specific definitions for windows
-     - c++ support
-     - add handle check macros DAT_IA_HANDLE_TO_UL and DAT_UL_TO_IA_HANDLE
-
-commit 92d7eef38877ad472a91e5e9f88e4e49657716bf
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Dec 11 14:43:05 2007 -0800
-
-    1/2 uDAT changes to sync common code base with WinOF
-     - add DAT_API to specify calling conventions (windows=__stdcall, linux= )
-     - cleanup platform specific definitions for windows
-     - c++ support
-     - add handle check macros DAT_IA_HANDLE_TO_UL and DAT_UL_TO_IA_HANDLE
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off by: Stan Smith <stan.smith@intel.com>
-
-commit 95764c6da28284d29071cf01d1a09bdcb967a971
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Dec 4 13:19:27 2007 -0800
-
-    - Fix size of evd request queue on creation
-    - Add query and checking of DTO request queue
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 9bc97e65c1240224d7dc9d6ac9a48e7aed199ee6
-Merge: 11a165a... abb4356...
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Nov 27 13:31:32 2007 -0800
-
-    master_dat2.0_merge
-
-commit abb4356cd765d38cf5cff2dfbdb610b380f944a2
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Nov 20 12:10:39 2007 -0800
-
-    Release 2.0.3
-
-commit d2c66eb7363234c5a9fb82aa92df1c132e46477e
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Nov 20 12:07:58 2007 -0800
-
-    - Lower default settings (rdma ops, inline sends) for latest iWARP/IB devices
-    - Add missing ia_query for max_iov_segments_per_rdma_write
-    - Cleanup CMA code no longer supported by rdma_cm
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 3a3519167bd65bd999424788f139b930b099b405
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Nov 19 15:26:44 2007 -0800
-
-    Change dapltest timers to use gettimeofday instead of get_cycles for better portability.
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 11a165a1868b1748fe476e08fc40af620f961cd2
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Oct 31 10:58:51 2007 -0800
-
-    - DAT/DAPL Version 1.2.3 Release 1
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit bc2d39a78e31c5e9463c8fa16f0ecaf49f75a15f
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Oct 31 10:55:48 2007 -0800
-
-    ChangeLog update
-
-commit 7d3ec3d68a756f895a6c6ba8ed3d7a1d602468e9
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Oct 31 10:55:05 2007 -0800
-
-    - DAT/DAPL Version 2.0.2 Release 1
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 43931378b9d4f5f721da828623f1e391f32f446b
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Oct 30 09:06:24 2007 -0800
-
-    - Add ChangeLog
-    - update cma provider to report remote and local ports via dat_ep_query.
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit a65da8a86ed637bacc32e3518d6c37eeb3b496bf
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Thu Oct 25 14:37:14 2007 -0700
-
-    Fix dapltest endian issue with mem_handle, mem_address.
-    
-    Signed-off-by: Shirley Ma <xma@us.ibm.com>
-
-commit 8196f1655fe6088c66dafa6ad8e4474ea8ebe1d9
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Thu Oct 25 14:36:12 2007 -0700
-
-    Fix dapltest endian issue with mem_handle, mem_address.
-    
-    Signed-off-by: Shirley Ma <xma@us.ibm.com>
-
-commit 39667dbb0160d395fb20eb53a1b4e995e2e623dd
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Oct 16 14:23:17 2007 -0700
-
-     Fix dtest to build properly with extensions.
-    
-     Modify dat.h dat_event to include event_extension_data[8].
-     Extend struct dat_event outside of extension build
-     switch to enable non-extended applications to work
-     with extended libraries. Otherwise, there is a potential
-     for the event callee to write back too much event data
-     and exceed callers non-extended event buffer.
-    
-     Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit d7134fb2bcad6f4f68410af997f8791edd788cfb
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Oct 16 14:10:52 2007 -0700
-
-        Use inet_ntoa instead of open coding it. IP addresses were being
-        reversed on PowerPC.
-    
-        On PowerPC the timebase ticks at a different frequency to the CPU.
-        dapltest currently assumes a 1:1 relationship, and gives bogus values
-        when scaling timebase to real time.
-    
-        To fix this, look at the timebase field in /proc/cpuinfo instead. To
-        keep things consistent with x86, scale that value to MHz.
-    
-        Signed-off-by: Anton Blanchard <anton@samba.org>
-
-commit c6710c291a4f7c0845a4535767d41d66f092fabf
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Oct 16 14:09:56 2007 -0700
-
-    Use inet_ntoa instead of open coding it. IP addresses were being
-    reversed on PowerPC.
-    
-    On PowerPC the timebase ticks at a different frequency to the CPU.
-    dapltest currently assumes a 1:1 relationship, and gives bogus values
-    when scaling timebase to real time.
-    
-    To fix this, look at the timebase field in /proc/cpuinfo instead. To
-    keep things consistent with x86, scale that value to MHz.
-    
-    Signed-off-by: Anton Blanchard <anton@samba.org>
-
-commit 9446029979a55e6e477fb31cfdf9ce0dc77ffa8f
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Oct 16 14:02:36 2007 -0700
-
-     Minor clean-up of cr/lf
-    
-     Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 33fd0628497911df11dea640aea4660e54989ed6
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Oct 2 16:01:37 2007 -0700
-
-    Final changes for 2.0.1-1 package, OFED 1.3 ALPHA
-    Fix build issue with SLES 10, gcc++ compiler
-    
-     Signed-off-by: Jimmy Hill <jimmy.hill@us.ibm.com>
-     Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit bc5f16991d75ff9d09e3e3a3cc8c2d6801a9d61f
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Oct 2 14:50:02 2007 -0700
-
-    Final changes for package 1.2.2-1, OFED 1.3 ALPHA
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 52bc16939e87587f8208e775dd061f54196a9acb
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Oct 2 11:58:46 2007 -0700
-
-    Change v2 dat.conf provider names to associate with ib net devices
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit d22e62f989dd16d503d5430ffe6f55075139e057
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Oct 2 11:43:34 2007 -0700
-
-    Change DT_Mdep_GetTime to use gettimeofday() which has more resolution
-    than times().
-    
-    Signed-off-by: Anton Blanchard <anton@samba.org>
-
-commit a64eae5bd36598a5c93010e07869e95599aa8ceb
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Oct 2 11:41:40 2007 -0700
-
-    Change v2 dat.conf provider names to associate with ib net devices
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 870764dfad8df0ffe6d3d449e7a8e296cfee8ef5
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Oct 2 11:35:21 2007 -0700
-
-    Change DT_Mdep_GetTime to use gettimeofday() which has more resolution
-    than times().
-    
-    Signed-off-by: Anton Blanchard <anton@samba.org>
-
-commit 66bf23e3e53f370c92803f162144947f29ce06d8
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Oct 2 11:30:15 2007 -0700
-
-    Change DT_Mdep_GetTime to use gettimeofday() which has more resolution
-    than times().
-    
-    Signed-off-by: Anton Blanchard <anton@samba.org>
-
-commit c220760bbb1f6357b6e187ff6c5e576dd74fd504
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Oct 2 10:39:09 2007 -0700
-
-    Fix dapl to compile as both 32bit and 64bit on PowerPC. Instead of using
-    the kernel atomic routines, code them explicitely like x86 does.
-    
-    Signed-off-by: Anton Blanchard <anton@samba.org>
-
-commit 9ffdf3722e5a9cde3fd6add5d7b3940a7ea9f71f
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Fri Sep 28 17:04:54 2007 -0700
-
-    Clean up packaging, modify dat.conf for v2.0 cma provider name change to ofa
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 493e65b5b47f47e4824f775959fd98e56aeaccc4
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Fri Sep 28 17:03:41 2007 -0700
-
-    Clean up packaging, modify dat.conf for cma provider name change to ofa
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 99f0a0bf0a0d99fee0729fba0fcdf6f3e89e2ec4
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Thu Sep 20 12:25:55 2007 -0700
-
-      Modifications to coexist with 2.0 libraries
-         - fix RPM specfile, configure.in,  1.2.2 package
-         - modify dat.conf
-    
-        Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 7ff4a8a8e861b0701b5b2a6fc95e6aa8b36d2662
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Thu Sep 20 10:55:19 2007 -0700
-
-    Modifications to coexist with 1.2 libraries
-     - cleanup CR-LF in dtestx
-     - fix RPM specfile, 2.0.1 package
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 230767742b8287490373c09d1bd346337b375b48
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Fri Jun 22 11:48:20 2007 -0700
-
-    Update copyright in specfile
-
-commit 5294cbe5e58f67d0a98862edea3684fff6e773bb
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Fri Jun 22 11:47:14 2007 -0700
-
-    Update Copyright in specfile
-
-commit 3654c6ef425f94b9f27a593b0b8c1f3d7cc39029
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Jun 6 13:20:38 2007 -0700
-
-    Update specfile to reflect DAT/DAPL 1.2.1 release
-
-commit babb95eff1bcef88bed46e92c323193d8f039eff
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Jun 6 11:48:07 2007 -0700
-
-    More changes to the release notes
-
-commit 0f299bf1deb9198b2f008c3ffa717bef252b6097
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Jun 5 15:56:17 2007 -0700
-
-    Update release notes
-
-commit ad70f98a228ade4a863ca349990eaa7ab1e82ec2
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Jun 5 15:52:18 2007 -0700
-
-    Add release notes updated for OFED 1.2 release
-
-commit f332badb80f0b1d88bf2d70dba0c90afc40f088f
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Thu May 31 12:43:28 2007 -0700
-
-    Add provider specific interface to uDAPL for extensions support.
-    Fix memory leak with extensions, missing cookie deallocation when processing extended DTO events
-    Remove unnecessary check on dats_set_ia_handle in dat_ia_openv
-    Clean up specfile and some extra LF's
-
-commit 4d7e30586402149228a30bea3036466395577ec4
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed May 16 12:56:39 2007 -0700
-
-    add iwarp extension include file
-
-commit d9963cc9984c06f147b92877945e847f657cd512
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed May 16 12:52:38 2007 -0700
-
-    clean up some CR's in include files
-
-commit 80f4e8c4be02bac5d472e1e6c4937079882a0388
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed May 9 16:21:16 2007 -0700
-
-    Take out references to specific 1.1 verbs definitions (ibv_comp_channel).
-
-commit 544fbb873d5320e9606f176c4b71bcba0e257d7d
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed May 9 12:51:53 2007 -0700
-
-    Bug Fixes:
-       - 606: Return local and remote ports with dat_ep_query
-       - 585: Add bonding example to dat.conf
-
-commit e64079f7b961aa9a672711f0e933a77f3999d302
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon May 7 15:54:59 2007 -0700
-
-    Update dapltest to use default device OpenIB-cma
-    Fix dapltest manpage, example for performance test wrong
-
-commit 7cda2304a6880371ec2d9451a4f83a7a254bc474
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon May 7 12:49:18 2007 -0700
-
-    Fix issues with IB DTO extensions
-     - debug print_cqe updated for latest IBV definitions
-     - dapli_evd_cq_to_event modified to handle both post and receive extensions
-     - dtestx example tested with rdma_write_imm, fetch_add, and cmp_swap
-     - modify cookie DTO types to support extensions properly
-
-commit 82a6750d31cd432c7e09298fc98c0e7e74abd012
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Fri May 4 17:17:41 2007 -0700
-
-    Add new dapl functions for 2.0 (stubs for now)
-    - dapl_ep_post_send_invalidate
-    - dapl_ep_post_rdma_read_to_rmr
-    - dapl_ia_ha
-    - dapl_csp_create, query, free
-    - dapl_cno_trigger
-    - dapl_cno_fd_create
-    - dapl_extensions
-    
-    Add new 2.0 parameters to existing API's
-    - dapl_cr_reject
-    - dapl_rmr_bind
-
-commit 8679aaf56c781715adc132a38a731e36194570f1
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Thu May 3 09:44:43 2007 -0700
-
-    update dtestx.c, default provider OpenIB-cma
-
-commit 527f6d19125e9eec7ecef03a8633626b0043a2f4
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed May 2 17:27:44 2007 -0700
-
-    Added IB extensions and dtestx as an example program using
-    rdma write with immediate and atomic operations
-
-commit 83ac961b505346708f12d59152146f3b04c8306f
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Apr 30 10:55:59 2007 -0700
-
-    Fixes atomic operation build problem with ia64 and RHEL5.
-
-commit 04da88bb70ee33b249a4cf2f5a92122eeec83e3c
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Thu Apr 26 17:29:37 2007 -0700
-
-    Update README and dapltest manpage
-
-commit 9a951d0a8713657da90568c0613eb48f5010cf1e
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Apr 3 16:35:17 2007 -0700
-
-    Cleanup RPM specfile for the dapl package, move to 1.2-1 release.
-
-commit a93f0ffcd6a46735c97ec34de564a7a91f9fc5c2
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Apr 3 14:38:31 2007 -0700
-
-    Add support for multiple IB devices to dat.conf to support IPoIB HA failover.
-
-commit 5434b720b36de2f262a02ff9dfccd99953c09e59
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Thu Mar 15 10:46:33 2007 -0800
-
-    Fix ia64 builds on SUSE
-
-commit b0f9eef1aa7f279802da233480cf6c495e16565b
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Mar 14 13:29:08 2007 -0800
-
-    DAT 2.0 support for new DAT_VA_TYPE added to uDAPL and openib-cma provider
-
-commit 61858b925f4c1a6f9edba6389a5bd601daf936e9
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Mar 14 11:08:19 2007 -0800
-
-    change DAT_VERSION major and minor numbers to 2.0
-
-commit 6dcb2e083bda8f2521bd3515b329c5465e1ac724
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Mar 14 10:43:56 2007 -0800
-
-    add provider support to dtest, set default to OpenIB-cma
-
-commit ff8eb667c1000be6c68ca291e7ed7bd080cb73f4
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Tue Mar 13 16:20:20 2007 -0800
-
-    add provider option to dtest, set default to OpenIB-cma
-
-commit 76a43cace54567135bac7ae54e336c6595b65fd9
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Fri Mar 9 13:09:14 2007 -0800
-
-    Initial build with DAT 2.0 definitions and IB extensions. IB extensions configurable with --enable-ext-type=ib
-
-commit 921687efed992e6ab72dfb731687b6816324a024
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Thu Mar 8 16:01:29 2007 -0800
-
-    Update the README
-
-commit 52ed210ae99b291f72441e71459006b5f2c851ce
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Mar 7 15:34:41 2007 -0800
-
-    - Fix bug 408, dapltest compilation failure on 32 bit arch
-    - Update libdat.spec.in file to build uDAPL RPMs correctly
-
-commit e3f6aca57a8fa5cbaaf872bf6844feb7d5e1e66c
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Mar 5 14:15:49 2007 -0800
-
-    Fix build issues with dtest and dapltest. Define build tree path to dat/include.
-
-commit f1f829a28e645831c3bcd1eb2d465fcb7a1fd5d8
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Feb 28 17:14:55 2007 -0800
-
-    Add dapltest headers to EXTRA_DIST
-    Modify dtest to delay before accepting
-    
-    Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.co.il>
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-
-commit 46b830a4664d5fee2daf1ebdc4e95ecb7c580e80
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Feb 26 13:54:15 2007 -0800
-
-    Adding dtest and dapltest to the build. Manual pages created.
-
-commit d245664e27148e54469268ad81f41b2a894a131a
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Fri Jan 19 16:21:30 2007 -0800
-
-    uDAPL changes to support exchanging and validation of the device responder_resources and the
-    initiator_depth during connection establishment
-
-commit 2280f833090aa9f750d5be8f9b06e7e08e642da5
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Wed Dec 6 11:49:27 2006 -0800
-
-    Update cma provider to sync with rdma_ucm changes
-
-commit 89448545b415b6dff57e3314b020619f6b979ef8
-Author: Arlin Davis <arlin.r.davis@intel.com>
-Date:   Mon Dec 4 13:54:20 2006 -0800
-
-    Update autogen to create config directory
-
-commit 0a917b104eba0aae6c6ef49c7990a2dc7efc759d
-Author: Arlin Davis <ardavis@ichips.intel.com>
-Date:   Tue Nov 7 20:22:05 2006 +0000
-
-    r10074: Added support for new ib verbs client register event. No extra processing required at the uDAPL
-    level.
-    
-    Fix some issues supporting create qp without recv cq handle or recv qp resources. IB verbs assume a
-    recv_cq handle and uDAPL dapl_ep_create assumes there is always recv_sge resources specified.
-    
-    Fix some timeout and long disconnect delay issues discovered during scale-out testing. Added support
-    to retry rdma_cm address and route resolution with configuration options. Provide a disconnect call
-    when receiving the disconnect request to guarantee a disconnect reply and event on the remote side.
-    The rdma_disconnect was not being called from dat_ep_disconnect() as a result of the state changing
-    to DISCONNECTED in the event callback.
-    
-    Here are the new options (environment variables) with the default setting:
-    
-    DAPL_CM_ARP_TIMEOUT_MS   4000
-    DAPL_CM_ARP_RETRY_COUNT  15
-    DAPL_CM_ROUTE_TIMEOUT_MS  4000
-    DAPL_CM_ROUTE_RETRY_COUNT 15
-
-commit c73aeb904504a0bc6cce0fb1248af9ba39521395
-Author: Arlin Davis <ardavis@ichips.intel.com>
-Date:   Thu Oct 12 22:41:33 2006 +0000
-
-    r9802: Remove Socket CM provider from build and dat.conf configuration. No longer needed nor supported.
-
-commit b1d94b26610f682cdd43bde2aecf5004e0865422
-Author: Steve Wise <swise@opengridcomputing.com>
-Date:   Tue Sep 12 18:15:39 2006 +0000
-
-    r9442: Update obsolete CLK_TCK to CLOCKS_PER_SEC
-    Signed-off-by: Steve Wise <swise@opengridcomputing.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 99a5dddd07d4c271ebb075b5b0f800101f850a56
-Author: Arlin Davis <ardavis@ichips.intel.com>
-Date:   Thu Sep 7 18:09:11 2006 +0000
-
-    r9346:
-    inadvertently added evdtest to makefile when testing dat_evd_set_unwaitable fix with openib_cma provider
-
-commit b53a87c856d9754313da9543a1dac5c6f1307085
-Author: Arlin Davis <ardavis@ichips.intel.com>
-Date:   Wed Sep 6 20:36:09 2006 +0000
-
-    r9315:
-    Fill out some unitialized fields in the ia_attr structure
-    returned by dat_ia_query().
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off by: Robert Walsh <robert.walsh@qlogic.com>
-
-commit b6c4e84399d0aa44c72c6ca870409c3666d7e79b
-Author: Arlin Davis <ardavis@ichips.intel.com>
-Date:   Fri Aug 11 20:44:23 2006 +0000
-
-    r8895: Update dtest to support multiple segments on rdma write and change makefile to use OpenIB-cma by default.
-
-commit 4737c63d79b23c3aff329e864dd50e3cffb6a17f
-Author: Arlin Davis <ardavis@ichips.intel.com>
-Date:   Wed Jul 19 17:15:06 2006 +0000
-
-    r8592: Add support for dat_evd_set_unwaitable on a DTO evd in openib_cma provider
-
-commit 25fb8c376547de895a170194c09b2d72dfea789d
-Author: Arlin Davis <ardavis@ichips.intel.com>
-Date:   Mon Jul 17 22:59:17 2006 +0000
-
-    r8565: Added errno reporting (message and return codes) during open to help diagnose create thread issues.
-
-commit f3a1ed6232ccdee7d193e8e3b9b0013b2bd222af
-Author: Anton Blanchard <anton@samba.org>
-Date:   Mon Jul 17 21:26:03 2006 +0000
-
-    r8562: Fix some suspicious inline assembly:
-    - EIEIO_ON_SMP and ISYNC_ON_SMP are in kernel UP build optimisations, we
-      shouldnt export them to userspace. Replace it with lwsync and isync.
-    - The comment says its implemenenting cmpxchg64 but in fact its
-      implementing cmpxchg32. Fix the comment.
-    
-    Signed-off-by: Anton Blanchard <anton@samba.org>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 63759108a1376b6e45a4491551f71d8cafdcddc1
-Author: James Lentini <jlentini@netapp.com>
-Date:   Wed Jul 12 14:56:26 2006 +0000
-
-    r8503: Fix IA64 build problems reported by John Partridge <johnip@sgi.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 51362c9781cb65fd8f9a3cb5b7c12c88e4c8527a
-Author: Arlin Davis <ardavis@ichips.intel.com>
-Date:   Thu Jun 22 22:02:56 2006 +0000
-
-    r8182: Lower the reject debug message level so we don't see warnings
-    when consumers reject.
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit f14889bb0cd22e897148ea2f6931a6b4f23143b0
-Author: Arlin Davis <ardavis@ichips.intel.com>
-Date:   Thu Jun 22 21:13:37 2006 +0000
-
-    r8181: Added support for active side TIMED_OUT event from a provider.
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 14fc704ae20b6a3ad0d433d7de9c02ce99e095b3
-Author: Arlin Davis <ardavis@ichips.intel.com>
-Date:   Thu Jun 22 20:58:06 2006 +0000
-
-    r8180: Fix bug in dapls_ib_get_dat_event() call after adding new unreachable event.
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 893698c31a0d8e60227806d992485a44375840cb
-Author: James Lentini <jlentini@netapp.com>
-Date:   Mon Jun 19 17:20:45 2006 +0000
-
-    r8112: Update for new rdma_create_id() function signature.
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 53483d84b0d02c432d9435d2f8e840cab3ded320
-Author: Arlin Davis <ardavis@ichips.intel.com>
-Date:   Wed Jun 14 16:17:39 2006 +0000
-
-    r8008: Set max rdma read per EP attributes
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 6cb854cd72d9492ddc1c5da01dbfb24b3f30af83
-Author: Arlin Davis <ardavis@ichips.intel.com>
-Date:   Mon Jun 12 15:42:50 2006 +0000
-
-    r7931: Report the proper error and timeout events.
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 44a97ff1f599f4bf882a801ead7aa495ea9ba936
-Author: Arlin Davis <ardavis@ichips.intel.com>
-Date:   Mon Jun 12 14:51:14 2006 +0000
-
-    r7928: Socket CM fix to guard against using a loopback address
-    as the local device address.
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 152219cf83c61e459fdf3de03d4e83ddba045230
-Author: Arlin Davis <ardavis@ichips.intel.com>
-Date:   Tue Jun 6 21:46:44 2006 +0000
-
-    r7755: Use the uCM set_option feature to adjust connect request timeout
-    and retry values. Also, a fix to disallow any event after a disconnect
-    event.
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 3a0686a2624ed28c7ea37b650415801f1cedbd10
-Author: James Lentini <jlentini@netapp.com>
-Date:   Wed May 31 19:55:57 2006 +0000
-
-    r7608: Correct comment.
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit eb760157c90f59183b424ac8e71474fe0b46094c
-Author: James Lentini <jlentini@netapp.com>
-Date:   Thu May 18 21:54:12 2006 +0000
-
-    r7347: Undo inadvertent change.
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 27256222b42fecfac8a44b3f82fe2524ecc72de2
-Author: James Lentini <jlentini@netapp.com>
-Date:   Thu May 18 21:50:27 2006 +0000
-
-    r7346: Fix for uCMA provider to return the correct event as a result of
-    rejects. Also, ran into a segv bug with dapl_ep_create when
-    creating without a conn_evd.
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit b1b6e16f3e41e123cd347bc78b01e3272076362b
-Author: Arlin Davis <ardavis@ichips.intel.com>
-Date:   Fri May 12 19:50:19 2006 +0000
-
-    r7141: Update the uDAPL openib_cma provider to work with the new
-    uCMA event channel interface.
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 27f9f0c106662cc7b41bcb747495860a1b6c7133
-Author: Steve Wise <swise@opengridcomputing.com>
-Date:   Tue May 2 21:33:35 2006 +0000
-
-    r6873: Transaction test change to comply with the iWARP MPA protocol's
-    "Connection Startup Rules".
-    Signed-off-by: Steve Wise <swise@opengridcomputing.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 060d09f974ffbe73672e17641b2f18d3821d31a7
-Author: Arlin Davis <ardavis@ichips.intel.com>
-Date:   Fri Apr 28 13:44:17 2006 +0000
-
-    r6736: getaddrinfo() fix for debug builds and some additional debug messages for
-    connect errors and rejects.
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 4e8b95bbeaf6e5c27de59ef347ec2ef0aa2e5e6b
-Author: James Lentini <jlentini@netapp.com>
-Date:   Wed Apr 19 16:49:34 2006 +0000
-
-    r6520: Fix compilation warning.
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 115fcc396164066326f9447d71af798a381d063f
-Author: Steve Wise <swise@opengridcomputing.com>
-Date:   Wed Apr 19 16:32:01 2006 +0000
-
-    r6518: Do not always generate an event for an abrupt disconnect.
-    Signed-off-by: Steve Wise <swise@opengridcomputing.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit f959bb786cd884bf4d2a5da4d299da6297d65293
-Author: James Lentini <jlentini@netapp.com>
-Date:   Wed Apr 19 16:30:37 2006 +0000
-
-    r6517: Generate a disconnect event for providers that do not generate
-    one automatically.
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit bb467511cf6e217147817ba12bbe800aae97cab5
-Author: James Lentini <jlentini@netapp.com>
-Date:   Wed Apr 19 16:25:33 2006 +0000
-
-    r6516: Fix compilation error.
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 117a9856c269bf08b738a1923c92f5a1949f6cc1
-Author: James Lentini <jlentini@netapp.com>
-Date:   Mon Apr 10 20:16:44 2006 +0000
-
-    r6392: Fix for RDMA cm id destruction and debug builds.
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 5f56b2b7339c17276188464dfff12b1be9e1dbb7
-Author: James Lentini <jlentini@netapp.com>
-Date:   Thu Apr 6 15:32:47 2006 +0000
-
-    r6289: Set max_iov_segments_per_rdma_read and max_rdma_read_iov using the correct
-    attribute.
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 304f48370adcaa12463c1a7d99e513164b83810c
-Author: Steve Wise <swise@opengridcomputing.com>
-Date:   Thu Apr 6 15:16:10 2006 +0000
-
-    r6286: Set the IA attribute max_iov_segments_per_rdma_read and the EP attribute
-    max_rdma_read_iov based on the openib max_sge_rd device attribute.
-    Signed-off-by: Steve Wise <swise@opengridcomputing.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit fe27222d2a00d7c5c4d98f39d2926fe14c7f32bc
-Author: James Lentini <jlentini@netapp.com>
-Date:   Tue Apr 4 18:29:00 2006 +0000
-
-    r6221: Change the mechanism by which library init and fini functions are specified
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 5a0598b90ab021cb2115e3791cb38dcfc0347948
-Author: James Lentini <jlentini@netapp.com>
-Date:   Mon Apr 3 17:29:55 2006 +0000
-
-    r6182: Remove unused variables.
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit b8084c4edc21b5ac2191ec654a882b65bad0c77d
-Author: James Lentini <jlentini@netapp.com>
-Date:   Mon Apr 3 15:29:30 2006 +0000
-
-    r6179: Fix dapltest compiler warnings.
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit abdbec194670d72012d481b98b2e6f728e9c5b48
-Author: James Lentini <jlentini@netapp.com>
-Date:   Mon Apr 3 14:08:48 2006 +0000
-
-    r6168: Fixed debug prints of 64-bit values and removed compile warnings.
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 52de2a35e02ddeb15887d0d690b52a4e02812e57
-Author: James Lentini <jlentini@netapp.com>
-Date:   Tue Mar 21 22:28:10 2006 +0000
-
-    r5939: Move libdat.spec to libdat.spec.in
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 6b1a6356a1757ae9b9d1557bd2ae67e0913d04c2
-Author: Arlin Davis <ardavis@ichips.intel.com>
-Date:   Fri Mar 17 22:02:18 2006 +0000
-
-    r5879: Add GNU Autotools support and an RPM spec file
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 9d00582b8be33add8d3e4173e8311b1a222b0b34
-Author: Arlin Davis <ardavis@ichips.intel.com>
-Date:   Thu Mar 16 22:40:18 2006 +0000
-
-    r5871: Fixes a corner case where a CMA event was not acknowledged during
-    disconnect processing.
-    
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit ede1d714a8e7ae99246eb382c1c1165f238cf7c3
-Author: James Lentini <jlentini@netapp.com>
-Date:   Mon Mar 13 18:15:49 2006 +0000
-
-    r5789: Reduces some debug output in the async thread and fixes listen
-    processing of EBUSY.
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off by: James Lentini <jlentini@netapp.com>
-
-commit afd558cbdada66e01aa553364b9a126da00dbe65
-Author: Arlin Davis <ardavis@ichips.intel.com>
-Date:   Wed Mar 8 14:24:26 2006 +0000
-
-    r5684: Remove unused NO_EP_STATE.
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 4c36aca16b9b492a91c0b05002af5fc954f3b44e
-Author: James Lentini <jlentini@netapp.com>
-Date:   Tue Feb 28 15:41:03 2006 +0000
-
-    r5529: Fix to destroy QPs in all cases and close the HCA.
-    
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off by: James Lentini <jlentini@netapp.com>
-
-commit 5874fdb26436c58365a7096b9b68c8e45a51d7a3
-Author: James Lentini <jlentini@netapp.com>
-Date:   Mon Jan 9 20:17:33 2006 +0000
-
-    r4855: Make use of dat_evd_wait the default.
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 254bd0e349bafbd970d6475efcafd7e52f05415e
-Author: Arlin Davis <ardavis@ichips.intel.com>
-Date:   Mon Jan 9 16:59:38 2006 +0000
-
-    r4852: Fix disconnect event processing and update dtest to validate.
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit f69d737ee51f6b00a1e6cf8531695a61a322651b
-Author: Arlin Davis <ardavis@ichips.intel.com>
-Date:   Fri Dec 16 02:03:05 2005 +0000
-
-    r4502: Query for rd_atomic values.
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 86566b556920a51f1e538d245674058682012668
-Author: James Lentini <jlentini@netapp.com>
-Date:   Fri Dec 16 01:57:30 2005 +0000
-
-    r4501: Allow a network name, network address, or device name in the dat.conf file.
-    Singed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 9e0ca3d4ccb92b9c0337efbadce405076a365f0f
-Author: Roland Dreier <rolandd@cisco.com>
-Date:   Wed Dec 14 20:44:36 2005 +0000
-
-    r4466: Change libibverbs API for listing all known devices from
-    ibv_get_devices() to ibv_get_device_list(), and update all
-    in-tree uses of this API.
-    
-    Signed-off-by: Roland Dreier <rolandd@cisco.com>
-
-commit 73a80143ab7b3f9aad19f84f904f99b489dca6cf
-Author: James Lentini <jlentini@netapp.com>
-Date:   Mon Dec 5 16:37:46 2005 +0000
-
-    r4308: Fix a gcc 4.0 warning
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit aa8b16b7e83f321eaaa18b38e6c165c2f120bcec
-Author: Arlin Davis <ardavis@ichips.intel.com>
-Date:   Thu Dec 1 15:03:10 2005 +0000
-
-    r4279: Added CMA API support.
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 74d3c32e42ab54f3d6f2eec3d0a66d08f800e075
-Author: James Lentini <jlentini@netapp.com>
-Date:   Thu Nov 10 21:39:34 2005 +0000
-
-    r4018: Fixed some problems with the free build openib_scm version and turned
-    down some debugging and added some debug prints for uAT path records.
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off by: James Lentini <jlentini@netapp.com>
-
-commit 70a2f23c5604e55f8f76672f78b4bf92f6a79b98
-Author: James Lentini <jlentini@netapp.com>
-Date:   Mon Oct 31 18:27:13 2005 +0000
-
-    r3917: Fix printing of debug statements.
-    Signed off by: Aniruddha Bohra <bohra@cs.rutgers.edu>
-    Signed off by: James Lentini <jlentini@netapp.com
-
-commit 4306debe3118948fca72a68ec20ef0d73b399fd1
-Author: James Lentini <jlentini@netapp.com>
-Date:   Wed Oct 26 21:10:26 2005 +0000
-
-    r3882: uDAPL provider for OpenIB socket CM.
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off by: James Lentini <jlentini@netapp.com>
-
-commit 42a64ec2ec1d8ec71492bfebba077b006684ce97
-Author: James Lentini <jlentini@netapp.com>
-Date:   Thu Oct 13 20:45:22 2005 +0000
-
-    r3774: Fix the async error handling and callback mappings.
-    Updated TODO list.
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off by: James Lentini <jlentini@netapp.com>
-
-commit fea8ed1188fbeef8291cfd7e681cd48c06ff5bde
-Author: Robert Walsh <rjwalsh@pathscale.com>
-Date:   Fri Oct 7 21:15:00 2005 +0000
-
-    r3693: Update some more ignores.
-
-commit 303147143afa9aa72906246a9f1973e4172f75b8
-Author: Todd Bowman <twbowman@gmail.com>
-Date:   Thu Oct 6 21:13:32 2005 +0000
-
-    r3687: Add PPC64 support for udapl
-    Signed-off-by: Todd Bowman <twbowman@gmail.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 103c7db321e24a7b5b06c7c26b0e0a65d1dd11ce
-Author: Todd Bowman <twbowman@gmail.com>
-Date:   Thu Oct 6 15:22:08 2005 +0000
-
-    r3683: Remove the dtest qualifier from the sdp range.
-    Signed-off-by: Todd Bowman <twbowman@gmail.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 33fbf9c81ac29492394e419588d856533e7fffb8
-Author: James Lentini <jlentini@netapp.com>
-Date:   Mon Oct 3 14:59:22 2005 +0000
-
-    r3637: Support CQ_WAIT_OBJECT with channels and sync with latest verbs.
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off by: James Lentini <jlentini@netapp.com>
-
-commit f01dac62b08d8f4fd417c336be48fb3bc8cd15c5
-Author: James Lentini <jlentini@netapp.com>
-Date:   Thu Sep 29 18:13:25 2005 +0000
-
-    r3619: Makefile fix.
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 634b199218b775a8ed071c1faea519c4cc4ee4e3
-Author: James Lentini <jlentini@netapp.com>
-Date:   Wed Sep 28 21:50:13 2005 +0000
-
-    r3606: Fixes IA64 build problems (atomics) with the latest Redhat EL4.0 update and
-    adds support for SuSe.
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off by: James Lentini <jlentini@netapp.com>
-
-commit 3a23c7135905666ff969b86dab3e90f90ac73008
-Author: Robert Walsh <rjwalsh@pathscale.com>
-Date:   Tue Sep 27 16:59:14 2005 +0000
-
-    r3567: Setup svn:ignore on a bunch of directories.
-
-commit d41ea62125636a58e8748871e372810c09865b0a
-Author: James Lentini <jlentini@netapp.com>
-Date:   Thu Sep 22 21:24:38 2005 +0000
-
-    r3525: Improve dtest and measure RDMA reads
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 32258d13af6aaf76078ec6ba187d8129a0f70397
-Author: James Lentini <jlentini@netapp.com>
-Date:   Wed Sep 21 19:54:07 2005 +0000
-
-    r3513: Temporary workaround for the RDMA read performance anomaly
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off by: James Lentini <jlentini@netapp.com>
-
-commit 990bdc4320809e0b989c90c24bef361c1bc91c7f
-Author: James Lentini <jlentini@netapp.com>
-Date:   Tue Sep 20 17:00:37 2005 +0000
-
-    r3494: Moved dapl_evd_modify_cno.c to match SourceForge
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 4509fb64fdbf99db7bdcaad4d8e3884718184d86
-Author: James Lentini <jlentini@netapp.com>
-Date:   Tue Sep 20 16:17:59 2005 +0000
-
-    r3493: Support ib_cm_init_qp_attr(), add cm event processing on a per
-    device basis, and add copyrights for kDAPL cm work that was
-    used in uDAPL.
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off by: James Lentini <jlentini@netapp.com>
-
-commit c1d45137c2e26024142f24207344e3e48a577b83
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   Thu Sep 15 21:43:21 2005 +0000
-
-    r3453: Bind communication identifiers to a device to support device removal.
-    Export per HCA CM devices to userspace.
-    
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit 5146689f1dbbce01cc46e23d749c28828e7e3ca8
-Author: James Lentini <jlentini@netapp.com>
-Date:   Wed Sep 14 17:44:44 2005 +0000
-
-    r3432: Request address resolution using ATS.
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 780b8237f2bf6884cf1abcc11190f97ed5c0a343
-Author: James Lentini <jlentini@netapp.com>
-Date:   Mon Sep 12 19:14:43 2005 +0000
-
-    r3378: Added DAPL documentation.
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 8911b60eb16770d28907c14e45556444317dd276
-Author: James Lentini <jlentini@netapp.com>
-Date:   Mon Sep 12 19:10:13 2005 +0000
-
-    r3377: Removed executable premission.
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit dec4d2eafebdfe7e6b495a36dd16bd5a98417e04
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   Fri Sep 9 21:51:58 2005 +0000
-
-    r3349: Update DAPL to match the verbs and CM event processing APIs.
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit d06dcfd25e5d37310d089bcb7f3d3d75fcece75a
-Author: Arlin Davis <ardavis@ichips.intel.com>
-Date:   Tue Sep 6 19:34:46 2005 +0000
-
-    r3326: Changes to support async events. Also consolidated the uAT,uCM,uCQ threads into one processing thread.
-    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 1dd8c28ce515675ee8df37cc1596bca17587eaf6
-Author: James Lentini <jlentini@netapp.com>
-Date:   Mon Aug 29 15:07:44 2005 +0000
-
-    r3232: validate default settings so they don't exceed device maximums
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off by: James Lentini <jlentini@netapp.com>
-
-commit ac5308b4aac7de79a356439dfec2312faf7705ae
-Author: James Lentini <jlentini@netapp.com>
-Date:   Mon Aug 29 14:15:23 2005 +0000
-
-    r3227: Support for ibv_query_port, device, and gid.
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off by: James Lentini <jlentini@netapp.com>
-
-commit ef8c7a3a4896487ff0d37a7d7234746c15fe5cf7
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   Sun Aug 21 22:30:08 2005 +0000
-
-    r3143: - Add user specified context to all uCM events.  Users will not retrieve
-      any events associated with the context after destroying the corresponding
-      cm_id.
-    - Provide the ib_cm_init_qp_attr() call to userspace clients of the CM.
-      This call may be used to set QP attributes properly before modifying the QP.
-    - Fixes some error handling syncrhonization and cleanup issues.
-    - Performs some minor code cleanup.
-    - Replaces the ucm_simple test program with a userspace version of cmpost.
-    - Updates DAPL to the new API.
-    
-    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
-
-commit ec0f86d7c55830c6dffded585c04754cc6ac2a83
-Author: James Lentini <jlentini@netapp.com>
-Date:   Tue Aug 16 14:10:13 2005 +0000
-
-    r3107: Removed unused debug counter macros
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 49087ba27bd93769bb64d7ac5c454de1b94005bc
-Author: James Lentini <jlentini@netapp.com>
-Date:   Tue Aug 16 14:07:42 2005 +0000
-
-    r3106: Implemented debug counters
-    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
-    Signed-off by: James Lentini <jlentini@netapp.com>
-
-commit f98e3af7dfc56b288cc77a9103b90f8d6a927fc5
-Author: James Lentini <jlentini@netapp.com>
-Date:   Thu Aug 11 20:23:56 2005 +0000
-
-    r3072: Update from SourceForge DAPL: use the LMR context in calls to
-    dapls_hash_remove()
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 878e524c5cc63a62802d28fdc215a2b69ceb1141
-Author: James Lentini <jlentini@netapp.com>
-Date:   Thu Aug 11 20:07:06 2005 +0000
-
-    r3071: Updates from SourceForge DAPL: EVD updates
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 8dc70f7d972615f40e624d8f1272e5e7c16ba34f
-Author: James Lentini <jlentini@netapp.com>
-Date:   Thu Aug 11 19:57:40 2005 +0000
-
-    r3070: Update from SourceForge DAPL: set async evd to null in dapli_ia_release_hca
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit f2801ae6caf010d660fe302970dabddc8948e1bf
-Author: James Lentini <jlentini@netapp.com>
-Date:   Thu Aug 11 19:46:39 2005 +0000
-
-    r3069: Updates from SourceForge DAPL: size EP IOV correctly
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit c87fd235eaf0b3a30e005422f7d347c406c14f2c
-Author: James Lentini <jlentini@netapp.com>
-Date:   Thu Aug 11 19:35:05 2005 +0000
-
-    r3068: Update from SourceForge DAPL: removed duplicate ia pointer in SP structure and
-    fixed the spelling of ib_hca_transport_t.
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit a88bebc09a9655e462b3d32dfddec823024eab59
-Author: James Lentin <jlentini@netapp.com>
-Date:   Thu Aug 11 19:24:56 2005 +0000
-
-    r3067: Update from SourceForge DAPL: use include guard
-    Signed-off-by: James Lentin <jlentini@netapp.com>
-
-commit d2da08920de882a9a266f0606b81150c625fa003
-Author: James Lentini <jlentini@netapp.com>
-Date:   Thu Aug 11 19:21:56 2005 +0000
-
-    r3066: Update from SourceForge DAPL: optimization to dapl_ep_query
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 4ca3b0cbc59227a90b5450eea1ffeeb91826dd6d
-Author: James Lentini <jlentini@netapp.com>
-Date:   Thu Aug 11 18:39:34 2005 +0000
-
-    r3065: Update from DAPL SourceForge: indicate which handle is invalid
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 6d8f34137776c32149251bdec493c017b399cd10
-Author: James Lentini <jlentini@netapp.com>
-Date:   Thu Aug 11 18:35:58 2005 +0000
-
-    r3064: Update from DAPL SourceForge: set ep param values.
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 0f35002a1942303ff46cb9a2b70056f9a38aebdb
-Author: James Lentini <jlentini@netapp.com>
-Date:   Thu Aug 11 18:33:47 2005 +0000
-
-    r3063: Updates from DAPL SourceForge: QP state and connection event fix.
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 3fc876339693c6f0eed5e57780e5342f301bd95c
-Author: James Lentini <jlentini@netapp.com>
-Date:   Thu Aug 11 18:23:33 2005 +0000
-
-    r3062: Update from DAPL SourceForge: remove unused DAPL_CNO_PROXY_CALL
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 70f8e7a2e6bde4e757ddc8c7f59d3a5c6a13adf9
-Author: Hal Rosenstock <halr@voltaire.com>
-Date:   Fri Aug 5 17:59:38 2005 +0000
-
-    r2989: Fix dtest makefile
-    Signed-off-by: Hal Rosenstock <halr@voltaire.com>
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 864695cfef37d84359ada8838ab4cd4f4dafc6bb
-Author: James Lentini <jlentini@netapp.com>
-Date:   Fri Aug 5 17:57:31 2005 +0000
-
-    r2988: Remove kernel directory.
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 9c4e246a5baf43cadc6380e91fd5a6e319777278
-Author: James Lentini <jlentini@netapp.com>
-Date:   Fri Aug 5 17:56:56 2005 +0000
-
-    r2987: Remove kernel code directory.
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 26706cb0de471ba47279de0cb949ba5a41de82cc
-Author: James Lentini <jlentini@netapp.com>
-Date:   Fri Aug 5 16:41:12 2005 +0000
-
-    r2986: Add uDAPL to the trunk
-    Signed-off-by: James Lentini <jlentini@netapp.com>
-
-commit 76aa2de7fe38a8595d88669842450084cfa88316
-Author: Roland Dreier <roland@topspin.com>
-Date:   Thu Nov 4 17:54:50 2004 +0000
-
-    r1139: Copy roland-merge branch to trunk
-
-commit 3bd72a559dfe22685aae33599c99d021d2ae4aca
-Author: Roland Dreier <roland@topspin.com>
-Date:   Tue Jul 20 21:34:32 2004 +0000
-
-    r502: Move 2.6-only source away from trunk
-
-commit 4f05b6ed3fd1d14161664c677264846eeb51dba5
-Author: Roland Dreier <roland@topspin.com>
-Date:   Tue Jul 20 21:34:32 2004 +0000
-
-    r502: Move 2.6-only source away from trunk
-
-commit 6da8b951c069072a2afc6aba03a3dca2c44db022
-Author: Roland Dreier <roland@topspin.com>
-Date:   Tue Jul 20 01:41:16 2004 +0000
-
-    r497: Move 2.6-only tree to gen2
+commit beebe0066b47d7bf476925ff280bad2a3db38324\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri Jun 19 20:52:51 2009 -0700\r
+\r
+    common,scm: add debug capabilities to print in-process CM lists\r
+    \r
+    Add a new debug bit DAPL_DBG_TYPE_CM_LIST.\r
+    If set, the pending CM requests will be\r
+    dumped when dat_print_counters is called.\r
+    Only provided when built with -DDAPL_COUNTERS\r
+    \r
+    Add new dapl_cm_state_str() call for state\r
+    to string conversion for debug prints.\r
+    \r
+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+\r
+commit b1c51f1e68993d9306e3ebd48bd3a1f0e9878fa3\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Jun 16 09:22:31 2009 -0700\r
+\r
+    scm: disconnect EP before cleaning up orphaned CR's during dat_ep_free\r
+    \r
+    There is the possibility of dat_ep_free being called\r
+    with RC CR's still in connected state. Call disconnect\r
+    on the CR before marking for destroy.\r
+    \r
+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+\r
+commit 531d223455a88c885d6c5f7b1d7e158c1079fbce\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Jun 10 12:05:17 2009 -0700\r
+\r
+    dapltest: windows scripts updated\r
+    \r
+    Support added for provider specification and general simplification of internal workings.\r
+    \r
+    Signed-off-by: Stan Smith <stan.smith@intel.com>\r
+\r
+commit 049d1ea08643d4c4eff761741641d37bb3f01fc1\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Jun 10 09:18:09 2009 -0700\r
+\r
+    scm: private data is not handled properly via CR rejects.\r
+    \r
+    For both RC and UD connect requests, the private\r
+    data is not being received on socket and passed\r
+    back via the active side REJECT event.\r
+    \r
+    UD requires new extended reject event type of\r
+    DAT_IB_UD_CONNECTION_REJECT_EVENT to distiquish\r
+    between RC and UD type rejects.\r
+    \r
+    cr_thread exit/cleanup processing fixed to insure\r
+    all items are off the list before exiting.\r
+    \r
+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+\r
+commit 3c26870e276a934e2009090e0fca8bdc36c1be67\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Jun 10 09:09:56 2009 -0700\r
+\r
+    scm: cleanup orphaned UD CR's when destroying the EP\r
+    \r
+    UD CR objects are kept active because of direct private data references\r
+    from CONN events. The cr->socket is closed and marked inactive but the\r
+    object remains allocated and queued on the CR resource list. There can\r
+    be multiple CR's associated with a given EP and there is no way to\r
+    determine when consumer is finished with event until the dat_ep_free.\r
+    Schedule destruction for all CR's associated with this EP during\r
+    free call. cr_thread will complete cleanup with state of SCM_DESTROY.\r
+    \r
+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+\r
+commit 73abd3f58fa7b14241fad98912ef27c7b4fdb47e\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Jun 10 09:05:32 2009 -0700\r
+\r
+    scm: provider specific query for default UD MTU is wrong.\r
+    \r
+    Change the provider specific query DAT_IB_TRANSPORT_MTU\r
+    to report 2048 for new default MTU size.\r
+    \r
+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+\r
+commit 27c0d7edc4c931b808a7c5a24bd5aa2625b48aa1\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Jun 10 10:06:59 2009 -0700\r
+\r
+    scm: update CM code to shutdown before closing socket\r
+    \r
+    data could be lost without calling shutdown on the socket\r
+    before closing. Update to shutdown and then close. Add\r
+    definition for SHUT_RW to SD_BOTH for windows.\r
+    \r
+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+    ---\r
+\r
+commit 536ec3103c15c1fed4367326c9117660345e0eab\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu Jun 4 13:48:18 2009 -0700\r
+\r
+    dapltest: windows script dt-cli.bat updated\r
+    \r
+    scn should be scm\r
+    \r
+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+\r
+commit e8991b8f0877b0e2e857717e1140c679e9266abe\r
+Author: Sean Hefty <sean.hefty@intel.com>\r
+Date:   Thu Jun 4 08:19:12 2009 -0700\r
+\r
+    dapl/windows cma provider: add support for network devices based on index\r
+    \r
+    The linux cma provider provides support for named network devices, such\r
+    as 'ib0' or 'eth0'.  This allows the same dapl configuration file to\r
+    be used easily across a cluster.\r
+    \r
+    To allow similar support on Windows, allow users to specify the device\r
+    name 'rdma_devN' in the dapl.conf file.  The given index, N, is map to a\r
+    corresponding IP address that is associated with an RDMA device.\r
+    \r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit 79fa3e7d241f740bc886dd075f24fcbc611306de\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu Jun 4 08:00:29 2009 -0700\r
+\r
+    openib: remove 1st gen provider, replaced with openib_cma and openib_scm\r
+    \r
+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+\r
+commit 624039247cdc0db7aa040dfbb4dced00f2cf9006\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri May 29 08:21:10 2009 -0700\r
+\r
+    dapltest: update windows script files\r
+    \r
+    Enhancement to take DAPL provider name as cmd-line arguement.\r
+    \r
+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+\r
+commit b93baa07b7bbaeb7a55fa817c354d0c94783d61f\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu May 28 15:30:05 2009 -0700\r
+\r
+    dapltest: update windows batch files in sripts directory\r
+    \r
+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+\r
+commit 2f185c6b5e464c4fc9e84ad3e90cc2b86aebf9aa\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon May 18 14:00:02 2009 -0700\r
+\r
+    windows_osd/linux_osd: new dapl_os_gettid macro to return thread id\r
+    \r
+    Change dapl_os_getpid inline to macro on windows and add dapl_os_gettid\r
+    macros on linux and windows to return thread id.\r
+    \r
+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+\r
+commit 984303824cd0c3e248a789066cf665ced8e1ae5b\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon May 18 13:53:59 2009 -0700\r
+\r
+    windows: missing build files for common and udapl sub-directories\r
+    \r
+    Add dapl/dapl_common_src.c and dapl/dapl_udapl_src.c\r
+    \r
+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+\r
+commit 3be4ccf9681a975e74a5aa05e3f7912477f342a7\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon May 18 09:06:19 2009 -0700\r
+\r
+    windows: add build files for openib_scm, remove /Wp64 build option.\r
+    \r
+    Add build files for windows socket cm and change build\r
+    option on windows providers. The new Win7 WDK issues a\r
+    depreciated compiler option warning for /Wp64\r
+    (Enable 64-bit porting warnings)\r
+    \r
+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+\r
+commit 163112cfeb6e409886b3cb7f85da7ce003300d5c\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon May 18 08:50:35 2009 -0700\r
+\r
+    scm: multi-hca CM processing broken. Need cr thread wakeup mechanism per HCA.\r
+    \r
+    Currently there is only one pipe across all\r
+    device opens. This results in some posted CR work\r
+    getting delayed or not processed at all. Provide\r
+    pipe for each device open and cr thread created\r
+    and manage on a per device level.\r
+    \r
+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+\r
+commit e6e799f623df6ef136ffc5388251d3f3a38c8a91\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri May 15 11:06:19 2009 -0700\r
+\r
+    dtest: add connection timers on client side\r
+    \r
+    Add timers for active connections and print\r
+    results. Allow polling or wait on conn event.\r
+    \r
+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+\r
+commit d656bbf619123deaed6e8985e52207e5415f359f\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri May 15 09:48:38 2009 -0700\r
+\r
+    linux_osd: use pthread_self instead of getpid for debug messages\r
+    \r
+    getpid provides process ids which are not unique. Use unique thread\r
+    id's in debug messages to help isolate issues across many device\r
+    opens with multiple CM threads.\r
+    \r
+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+\r
+commit 92bb0d2933d3d1546e18f0479475f3daf5b92052\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri May 1 10:18:05 2009 -0700\r
+\r
+    windows ibal-scm: dapl/dirs file needs updated to remove ibal-scm\r
+    \r
+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+\r
+commit 9c37d9d667fb7e8f21841bbec4a84b2c652fffe1\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Apr 29 23:13:36 2009 -0700\r
+\r
+    Release 2.0.19\r
+    \r
+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+\r
+commit 0ef94459e0a0175233b43b3fcbaaac2596e1042d\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Apr 29 14:33:28 2009 -0700\r
+\r
+    scm, cma: dat max_lmr_block_size is 32 bit, verbs max_mr_size is 64 bit\r
+    \r
+    mismatch of device attribute size restricts max_lmr_block_size to 32 bit\r
+    value. Add check, if larger then limit to 4G-1 until DAT v2 spec changes.\r
+    \r
+    Consumers should use max_lmr_virtual_address for actual max\r
+    registration block size until attribute interface changes.\r
+    \r
+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+\r
+commit f91f27eaaab28b13a631adf75b933b7be3afbc0f\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Apr 29 10:51:03 2009 -0700\r
+\r
+    scm: increase default MTU size from 1024 to 2048\r
+    \r
+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+\r
+commit 8d6846056f4c86b6a06346147df55d37c4ba9933\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Apr 29 10:49:09 2009 -0700\r
+\r
+    openib_scm, cma: use direct SGE mappings from dat_lmr_triplet to ibv_sge\r
+    \r
+    no need to rebuild scatter gather list given that DAT v2.0\r
+    is now aligned with verbs ibv_sge. Fix ib_send_op_type_t typedef.\r
+    \r
+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+\r
+commit c61f75b3412935e7d4a7a1acc9c495dcb4ac7e24\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Apr 29 08:39:37 2009 -0700\r
+\r
+    dtest: add flush EVD call after data transfer errors\r
+    \r
+    Flush and print entries on async, request, and receive\r
+    queues after any data transfer error. Will help\r
+    identify failing operation during operations\r
+    without completion events requested.\r
+    Fix -B0 so burst size of 0 works.\r
+    \r
+    Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>\r
+\r
+commit c88a191c7a408b0fb3dfb418a77a5b3b5afc778e\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Apr 22 13:16:19 2009 -0700\r
+\r
+    dtest/dapltest: Cleanup code with Lindent\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 8699a9f1bd2bb45b04b87f887698707ba7b62d0a\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Apr 21 15:51:24 2009 -0700\r
+\r
+    ibal-scm: remove, obsolete\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 67ddd6bfba46f1f7a61b772257132f1257d05c96\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Apr 21 15:44:15 2009 -0700\r
+\r
+    scm, cma provider: Cleanup code with Lindent\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit d0898091090ff19be7929fed0d14f1ca696d5e53\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Apr 21 15:39:01 2009 -0700\r
+\r
+    udapl: Cleanup code with Lindent\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit a688d1cfb52fde256c5bfd95a27f940dd17e7ced\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Apr 21 15:31:20 2009 -0700\r
+\r
+    dapl common: Cleanup code with Lindent\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 2bded73c7f68cfb870e432ab3ebae7427d595cbe\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Apr 21 12:52:29 2009 -0700\r
+\r
+    dat: Cleanup code with Lindent\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 31e7b9210fc5334ff3be62558e74e3fdf01d6cbd\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Apr 20 12:28:08 2009 -0700\r
+\r
+    Release 2.0.18\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 29bf0a24f54c45d2742026756f31f1a1f26fb6f3\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu Apr 16 14:35:18 2009 -0700\r
+\r
+    dapltest: reset server listen ports to avoid collisions during long runs\r
+    \r
+    If server is running continuously the port number increments\r
+    from base without reseting between tests. This will\r
+    eventually cause collisions in port space.\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit c27af8de0501d132b8152ec8546023cdba212de5\r
+Author: Sean Hefty <sean.hefty@intel.com>\r
+Date:   Thu Apr 16 10:21:51 2009 -0700\r
+\r
+    To avoid duplicating port numbers between different tests, the next port\r
+    number to use must increment based on the number of endpoints per thread *\r
+    the number of threads.\r
+    \r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit 3084310197c20aaa50abe82260fc835786f591f5\r
+Author: Sean Hefty <sean.hefty@intel.com>\r
+Date:   Thu Apr 16 10:21:45 2009 -0700\r
+\r
+    dapltest assumes that events across multiple endpoints occur in a specific\r
+    order.  Since this is a false assumption, avoid this by directing events to\r
+    per endpoint EVDs, rather than using shared EVDs.\r
+    \r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit ef87a0a462f4fa07ac252e28d3aeb44af73cc202\r
+Author: Sean Hefty <sean.hefty@intel.com>\r
+Date:   Thu Apr 16 10:21:41 2009 -0700\r
+\r
+    Synchronization is missing between removing items from an EVD and queuing\r
+    them.  Since the removal thread is the user's, but the queuing thread is\r
+    not, the synchronization must be provided by DAPL.  Hold the evd lock\r
+    around any calls to dapls_rbuf_*.\r
+    \r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit f5e86d28f803162ffdf94b41ec7435dec92f728d\r
+Author: Sean Hefty <sean.hefty@intel.com>\r
+Date:   Thu Apr 16 10:21:26 2009 -0700\r
+\r
+    Communication to the CR thread is done using an internal socket.  When a\r
+    new connection request is ready for processing, an object is placed on\r
+    the CR list, and data is written to the internal socket.  The write causes\r
+    the CR thread to wake-up and process anything on its cr list.\r
+    \r
+    If multiple objects are placed on the CR list around the same time, then\r
+    the CR thread will read in a single character, but process the entire list.\r
+    This results in additional data being left on the internal socket.  When\r
+    the CR does a select(), it will find more data to read, read the data, but\r
+    not have any real work to do.  The result is that the thread spins in a\r
+    loop checking for changes when none have occurred until all data on the\r
+    internal socket has been read.\r
+    \r
+    Avoid this overhead by reading all data off the internal socket before\r
+    processing the CR list.\r
+    \r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit 2ab52e9b1ab37c6eb44206c135e0568a8c2d01fa\r
+Author: Sean Hefty <sean.hefty@intel.com>\r
+Date:   Thu Apr 16 10:21:13 2009 -0700\r
+\r
+    The dapl connect call takes as input an address (sockaddr) and a port number\r
+    as separate input parameters.  It modifies the sockaddr address to set the\r
+    port number before trying to connect.  This leads to a situation in\r
+    dapltest with multiple threads that reference the same buffer for their\r
+    address, but specify different port numbers, where the different threads\r
+    end up trying to connect to the same remote port.\r
+    \r
+    To solve this, do not modify the caller's address buffer and instead use\r
+    a local buffer.  This fixes an issue seen running multithreaded tests with\r
+    dapltest.\r
+    \r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit 7947026ede478f08b4a7b8cb607f457765bf2afa\r
+Author: Sean Hefty <sean.hefty@intel.com>\r
+Date:   Thu Apr 16 10:21:03 2009 -0700\r
+\r
+    Windows socket calls should check return values against SOCKET_ERROR to\r
+    determine if an error occurred.\r
+    \r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit e66e42fc44c50c8202f7c98f76d799a69aa3f1b6\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri Apr 10 08:33:41 2009 -0700\r
+\r
+    Build: add new file dapl/openib_cma/linux/openib_osd.h to EXTRA_DIST\r
+    \r
+    Fix rpmbuild problem with new cma osd include file.\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit acb213adb3268e9bf6999e2bf040d4a71212b701\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri Apr 10 08:32:24 2009 -0700\r
+\r
+    dapl scm: reduce wait time for thread startup.\r
+    \r
+    thread startup wait reduce to 2ms to reduce open times.\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 55459699fa9c0e5fb7e2b17822f0916412c64b35\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri Apr 10 08:31:22 2009 -0700\r
+\r
+    dapl-scm: getsockopt optlen needs initialized to size of optval\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit d710c5327e05a40796341d16b45a2b098b03f588\r
+Author: Sean Hefty <sean.hefty@intel.com>\r
+Date:   Fri Apr 10 08:17:32 2009 -0700\r
+\r
+    The connection request thread adds sockets to a select list unless\r
+    the cr->socket is invalid and the cr request state is set to destroy.  If the\r
+    cr->socket is invalid, but the cr->state is not destroy, then the cr->socket\r
+    is added to an FD set for select/poll.  This results in select/poll\r
+    returning an error when select is called.  As a result, the cr thread never\r
+    actually blocks during this state.\r
+    \r
+    Fix this by only destroying a cr based on its state being set to destroy\r
+    and skip adding cr->sockets to the FD set when they are invalid.\r
+    \r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit 0be961c432f897d4f92d9a24dcb7c42ad30ea160\r
+Author: Sean Hefty <sean.hefty@intel.com>\r
+Date:   Fri Apr 10 08:08:16 2009 -0700\r
+\r
+    Make sure all locks are initialized properly and don't zero their memory\r
+    once they are.\r
+    \r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit 9abdc26cd6154aa55588759ba54c9ca69e3fe2b5\r
+Author: Sean Hefty <sean.hefty@intel.com>\r
+Date:   Fri Apr 10 08:08:13 2009 -0700\r
+\r
+    The lock functions are defined just a few lines beneath the prototypes\r
+    as inline.  Remove the duplicate prototypes.\r
+    \r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit 9578c4aeb9878d98374e4b7abc02db182aef82c6\r
+Author: Sean Hefty <sean.hefty@intel.com>\r
+Date:   Fri Apr 10 08:08:07 2009 -0700\r
+\r
+    Make sure all locks are initialized and don't zero out their memory once\r
+    they are.\r
+    \r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit 97edcbb662b489303ef68c0da02831efaddeed91\r
+Author: Sean Hefty <sean.hefty@intel.com>\r
+Date:   Fri Apr 10 08:08:03 2009 -0700\r
+\r
+    The IBAL library allocates a small number of threads for callbacks to the\r
+    user.  If the user blocks all of the callback threads, no additional\r
+    callbacks can be invoked.  The DAPL IBAL provider cancels listen requests\r
+    from within an IBAL callback, then waits for a second callback to confirm\r
+    that the listen has been canceled.  If there is a single IBAL callback\r
+    thread, or multiple listens are canceled simultaneously, then the provider\r
+    can deadlock waiting for a cancel callback that never occurs.\r
+    \r
+    This problem is seen when running dapltest with multiple threads.\r
+    \r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit 3e56e63bcb68de352edadafdcfcc4cb222c08c7b\r
+Author: Sean Hefty <sean.hefty@intel.com>\r
+Date:   Fri Apr 10 08:07:57 2009 -0700\r
+\r
+    We need to check the return value from select for errors before checking\r
+    the FD sets.  An item may be in an FD set but select could have returned\r
+    an error.\r
+    \r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit a8a977becaeefe0d7f8e01e01631a11988d2d54e\r
+Author: Sean Hefty <sean.hefty@intel.com>\r
+Date:   Fri Apr 10 08:07:53 2009 -0700\r
+\r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit ecc79cc0a1ae2bdbb3dfd19e15b3b562ac9a2957\r
+Author: Sean Hefty <sean.hefty@intel.com>\r
+Date:   Fri Apr 10 08:07:49 2009 -0700\r
+\r
+    Enable building with CQ_WAIT_OBJECTS support to directly wait on CQ\r
+    completion channels in the Windows version of the openib_scm provider.\r
+    Also minor fixup to use DAPL_DBG_TYPE_UTIL for debug log messages\r
+    instead of DAPL_DBG_TYPE_CM.\r
+    \r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit 73728763666a46df5789af93b50db53cdf64afd6\r
+Author: Sean Hefty <sean.hefty@intel.com>\r
+Date:   Fri Apr 10 08:07:44 2009 -0700\r
+\r
+    The IBAL-SCM provider will run into an inifinite loop if the check for\r
+    cr->socket > SCM_MAX_CONN - 1 fails.  The code continues back to the start\r
+    of the while loop without moving to the next connection request entry\r
+    in the list.\r
+    \r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit 9b1b396539926d36ffacfff04fbe7c081e436b45\r
+Author: Sean Hefty <sean.hefty@intel.com>\r
+Date:   Fri Apr 10 08:07:40 2009 -0700\r
+\r
+    next_cr is set just before and inside the check\r
+    if ((cr->socket == DAPL_INVALID_SOCKET && cr->state == SCM_DESTROY)\r
+    Remove setting it inside the if statement.\r
+    \r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit 7b49a9850f62276bb7bfccb2d85a1e94e311813c\r
+Author: Sean Hefty <sean.hefty@intel.com>\r
+Date:   Fri Apr 10 08:07:35 2009 -0700\r
+\r
+    Some errors on windows are more easily interpretted in hex than decimal.\r
+    \r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit 08ee072a1396ac2c28983878dbc6b02feb035787\r
+Author: Sean Hefty <sean.hefty@intel.com>\r
+Date:   Fri Apr 10 08:07:32 2009 -0700\r
+\r
+    The WinOF HCA driver cannot handle transitioning from RTS -> RESET ->\r
+    INIT -> ERROR.  Simply delete the QP and re-create it to reinitialize\r
+    the endpoint until the bug is fixed.\r
+    \r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit 51ef5d96ce67d6141ec02b2a318f1b6e12be1bcf\r
+Author: Sean Hefty <sean.hefty@intel.com>\r
+Date:   Fri Apr 10 08:07:23 2009 -0700\r
+\r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit a8582be0e1fc89e856f1d0b43a3c1b271295a352\r
+Author: Sean Hefty <sean.hefty@intel.com>\r
+Date:   Fri Apr 10 08:07:18 2009 -0700\r
+\r
+    Convert the openib_cma provider to common code between linux and windows.\r
+    \r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit cc2a71dfe0c35a70f6b1ba66070a3a06059a8bb5\r
+Author: Sean Hefty <sean.hefty@intel.com>\r
+Date:   Fri Apr 10 08:06:53 2009 -0700\r
+\r
+    Move from using pipes to sockets for internal communication.  This\r
+    avoids issues with windows only supporting select() on sockets.\r
+    \r
+    Remove windows specific definition of dapl_dbg_log.\r
+    \r
+    Update to latest windows libibverbs implementation using completion\r
+    channel abstraction to improve windows scalability and simplify\r
+    porting where FD's are accessed directly in Linux.\r
+    \r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit b3ad2ed97399a24a869841e17d1314e11c379aae\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Mar 31 05:41:50 2009 -0800\r
+\r
+    Release 2.0.17\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 5d732929f8a90a490994e8e35a3666c3647ad4fe\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Mar 31 05:22:11 2009 -0800\r
+\r
+    dapl: ia64 build problem on SuSE 11, atomic.h no longer exists.\r
+    \r
+    Add autotools check for SuSE 11 and include intrinsics.h\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit d7b8654db3a1f4ead16cb2e6d15f0902a322a188\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Mar 16 13:23:50 2009 -0800\r
+\r
+    Release 2.0.16\r
+    \r
+    Fix changelog year in spec file.\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 08d9e26a85911f99d47cbb92ec8bccfc7f073be0\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Mar 16 13:15:22 2009 -0800\r
+\r
+    Release 2.0.16\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 42c97b2a11d63ac6ba8a15fe8c82061e7da6e136\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri Mar 13 12:39:12 2009 -0800\r
+\r
+    uDAPL: scm provider, remove query gid/lid from connection setup phase\r
+    \r
+    move lid/gid queries from the connection setup phase\r
+    and put them in the open call to avoid overhead\r
+    of more fd's during connections. No need\r
+    to query during connection setup since uDAPL\r
+    binds to specific hca/ports via dat_ia_open.\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 775394b73980a7bc0af018a33d2a5bb795469c78\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu Mar 12 12:44:43 2009 -0800\r
+\r
+    Build: missing new linux/osd include file in EXTRA_DIST\r
+    \r
+    Add dapl/openib_scm/linux/openib_osd.h to EXTRA_DIST\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 647e288c1c9af5261495a5ed88e6ecbe1daf6d6e\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu Mar 12 12:11:21 2009 -0800\r
+\r
+    Build: spec files missing Requires(post) statements for sed/coreutils\r
+    \r
+    needed for anaconda install\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 1f5b3b7cab0785b64e8dab035dd4cd27111497d3\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Mar 4 10:04:13 2009 -0800\r
+\r
+    dapl scm: remove unecessary thread when using direct objects\r
+    \r
+    A thread is created for processing events on devices without\r
+    direct event objecti support. Since all openfabrics devices support\r
+    direct events there is no need to start a thread. Move this under\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 66e4236e2c57dbaf860b7c20809b65a4fbbafa6f\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Mar 3 11:08:12 2009 -0800\r
+\r
+    dtestx: add missing F64u definition for windows\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit d9e771da16ec2b360a222ceccbbca5d088e20ee5\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Mar 3 09:25:26 2009 -0800\r
+\r
+    uDAPL common: add 64 bit counters for IA, EP, and EVD's.\r
+    \r
+     -DDAPL_COUNTERS to build-in counters for cma and scm providers.\r
+     New extension calls in dat_ib_extensions.h for counters\r
+       dat_print_counters, dat_query_counters\r
+     Counters for operations, async errors, and data\r
+     Update dtestx (-p) with print and query counter examples\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 5e6ad3cdaa1d72523ad6b38d8306e0a2d0f1ada6\r
+Author: Sean Hefty <sean.hefty@intel.com>\r
+Date:   Tue Feb 17 07:24:27 2009 -0800\r
+\r
+    Modify the openib_scm provider to support both OFED and WinOF releases.\r
+    This takes advantage of having a libibverbs compatibility library.\r
+    \r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit 0425c24c3b66e672bba346a1d0946b11c7b8b11e\r
+Author: Stan Smith <stan.smith@intel.com>\r
+Date:   Fri Jan 30 09:52:33 2009 -0800\r
+\r
+    Update the dapl.git tree with the latest SVN version of the\r
+    ibal-scm provider.\r
+    \r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit 83543b6cca342e25fd6408454f1261ec6835a172\r
+Author: Stan Smith <stan.smith@intel.com>\r
+Date:   Fri Jan 30 09:52:25 2009 -0800\r
+\r
+    Merge SVN IBAL provider code back into the main git tree.\r
+    \r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit be0b6122d0fe4f93afc8cf3ec961702faf82fb44\r
+Author: Sean Hefty <sean.hefty@intel.com>\r
+Date:   Fri Jan 30 09:52:11 2009 -0800\r
+\r
+    Changes to dtest to support building on Windows.\r
+    \r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit 9f87610c4b37e4db4d74205c14028582a2f6a79e\r
+Author: Stan Smith <stan.smith@intel.com>\r
+Date:   Fri Jan 30 09:48:26 2009 -0800\r
+\r
+    Add return codes to various functions.\r
+    Add script (batch file) for Windows testing.\r
+    \r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit 723067550265defdcfe6e00460a4f89f7a81fbf1\r
+Author: Sean Hefty <sean.hefty@intel.com>\r
+Date:   Fri Jan 30 09:46:40 2009 -0800\r
+\r
+    Merge OFED and WinOF trees for common dapl code.\r
+    \r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit 5b37e080e1ecc6903b3ab1ac9b0d4c9f8a18b790\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri Jan 16 08:16:13 2009 -0800\r
+\r
+    dtest/dapltest: use $(top_builddir) for .la files during test builds\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit bd655d4fdd7e63e7fdeed3979926da5582f71e4b\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Nov 26 07:12:30 2008 -0800\r
+\r
+    Release 2.0.15\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 5d5dec42717c963d1644ee3e716459dc5d58e930\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Oct 27 08:48:53 2008 -0800\r
+\r
+    dapltest: transaction test moves to cleanup stage before rdma_read processing is complete\r
+    \r
+    With multiple treads, the transaction server tread can move to cleanup\r
+    stage and unregister memory before the remote client process has\r
+    completed the rdma read. In lieu of a rewrite to add sync messages\r
+    at the end of transaction test phase, just add a delay before cleanup.\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 101a843e59b881bc131dfd5c2aec7e54d44f35c0\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Oct 14 11:56:35 2008 -0700\r
+\r
+    Current static registration (SR) assumes DAT_OVERRIDE or /etc/dat.conf.\r
+    Change SR to include sysconfdir. SR file access in the following order:\r
+    \r
+    - DAT_OVERRIDE\r
+    - sysconfdir\r
+    - /etc\r
+    \r
+    if DAT_OVERRIDE is set, assume administration override\r
+    and do not failover to other locations. Add debug\r
+    messages for each failure and retries.\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Acked-by: Doug Ledford <dledford@redhat.com>\r
+\r
+commit c98d2169b839a73d76691acf510dd8976ddc850a\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri Oct 3 08:00:56 2008 -0700\r
+\r
+    Release 2.0.14\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit c26d0bb065f3734f09058e1e6d26dde4a3738e55\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri Oct 3 05:40:04 2008 -0700\r
+\r
+    dat.conf: add ofa-v2-iwarp entry for iwarp devices\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit d54c35c8a9ba33a464ca15f4a65b914688e5194d\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri Oct 3 05:30:10 2008 -0700\r
+\r
+    dapl: adjust max_rdma_read_iov to 1 for query on iWARP devices\r
+    \r
+    iWarp spec allows only one iov on rdma reads\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 9584df22d0cb3aa5a2a2a04bf427524d17650ef7\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Oct 1 08:17:49 2008 -0700\r
+\r
+    dtest: reduce default IOV's during dat_ep_create for iWARP devices\r
+    \r
+    iWarp adapters tend to have less IOV resources then IB adapters.\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 8ca9898621acf5b9769d46ea34ee8ca1eecaf2ff\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri Sep 26 12:43:13 2008 -0700\r
+\r
+    dtest: fix 32-bit build issues in dtest and dtestx examples.\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 42a3a4edf30115a35d9d599b51f8756814e62368\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri Sep 26 08:48:31 2008 -0700\r
+\r
+    Revert "Release 2.0.14"\r
+    \r
+    This reverts commit 816d1c3acfb4a457c6b1cc07d657f018312f2a63.\r
+    \r
+    missed some fixes for package release.\r
+\r
+commit 816d1c3acfb4a457c6b1cc07d657f018312f2a63\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Sep 24 12:13:37 2008 -0700\r
+\r
+    Release 2.0.14\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit c00d858da3113ce5463d408ab5e13e17cc9529e4\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Sep 24 08:33:32 2008 -0700\r
+\r
+    build: $(DESTDIR) prepend needed on install hooks for dat.conf\r
+    \r
+    All install directives that automake creates automatically\r
+    have $(DESTDIR) prepended to them so that a make\r
+    DESTDIR=<some_path> install will work. The hand written\r
+    install hooks for dat.conf was missing DESTDIR.\r
+    \r
+    Signed-off-by: Doug Ledford <dledford@redhat.com>\r
+\r
+commit 860db3be4907c8ff290ce7c6b631b2117f5080bd\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Sep 24 08:26:28 2008 -0700\r
+\r
+    dapl scm: UD shares EP's which requires serialization\r
+    \r
+    add locking around the modify_qp state changes to avoid\r
+    unnecessary modify_qp calls during multiple resolve\r
+    remote AH connection events on a single EP.\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit f2c214647b5ce53e52052d6b6bea3fbace7cc20a\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Sat Sep 20 16:02:00 2008 -0700\r
+\r
+    dtestx: Add new options to test UD.\r
+    \r
+    - many to one/many EP remote AH resolution, data flow\r
+    - bi-directional EP remote AH resolution, data flow\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 3c218b5ed65d0b7349a86eb0fe6f6bf57e3eccd6\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Sat Sep 20 15:58:59 2008 -0700\r
+\r
+    dapl: fixes for IB UD extensions in common code and socket cm provider.\r
+    \r
+     - Manage EP states base on attribute service type.\r
+     - Allow multiple connections (remote_ah resolution)\r
+       and accepts on UD type endpoints.\r
+     - Supply private data on CR conn establishment\r
+     - Add UD extension conn event type - DAT_IB_UD_PASSIVE_REMOTE_AH\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 01cdd688ddebec8df6f17f92c3b72a410f50dd6f\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Sat Sep 20 15:49:40 2008 -0700\r
+\r
+    dapl: add provider specific attribute query option for IB UD MTU size\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit ee3d9ce2389a14c85405dfdff67f04a5f5679e32\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Sep 1 15:52:37 2008 -0700\r
+\r
+    Release 2.0.13\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit f37589927fabf0feb3a09c4c7c03e18df5749fef\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Sep 1 12:24:49 2008 -0700\r
+\r
+    dapl build: add correct CFLAGS, set non-debug build by default for v2\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 280f3aec6d0fa9d7e36f75711471e35333ee34cf\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Sep 1 12:22:19 2008 -0700\r
+\r
+    dapl providers: fix compiler warnings in cma and scm providers\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 60c0589a2aba520ae67b1c8eaad5a167edb6fba3\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Sep 1 12:20:08 2008 -0700\r
+\r
+    dat: fix compiler warnings in dat common code\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit fb3e368db07d02a3daa1d12d71f62ac4e7a5ef23\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Sep 1 12:18:48 2008 -0700\r
+\r
+    dapl: fix compiler warnings in common code\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 38a53ae75bce5059a84262fe1b40eacf92b22287\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Sep 1 12:16:58 2008 -0700\r
+\r
+    dtest/dapltest: fix compiler warnings\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 45900087764917b354411fdd2b3880473d553ab8\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri Aug 22 14:51:22 2008 -0700\r
+\r
+    dapl cma: debug message during query needs definition for inet_ntoa\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 99d46313a03af18771966cf86fcc934d179627b5\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu Aug 21 12:54:58 2008 -0700\r
+\r
+    Release 2.0.12\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 0b2a3fac8d28d5b3c2e1416fa696fe4cbc672f00\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Aug 20 18:51:00 2008 -0700\r
+\r
+    dapl scm: fix corner case that delivers duplicate disconnect events\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 96f6822b90fa880a6c6a64b1e183064a449f7237\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Aug 20 18:47:19 2008 -0700\r
+\r
+    dat: include stddef.h for NULL definition in dat_platform_specific.h\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 283e37c09ad072d69d29e28225e9a6e8bf3f75f0\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Aug 20 18:27:08 2008 -0700\r
+\r
+    dapl: add debug messages during async and overflow events\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 4a7965ac07b7f2ee1deb5b144ed50b30c1749d38\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Aug 20 18:24:33 2008 -0700\r
+\r
+    dapltest: add check for duplicate disconnect events in transaction test\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 7e8986f2c6496851b724a007458881c3248ac998\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Aug 20 18:22:42 2008 -0700\r
+\r
+    dtestx: fix stack corruption problem with hostname strcpy\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit ee2a553762abd6ebede99db5d26d1ba1d74ba3cb\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu Aug 14 09:42:57 2008 -0700\r
+\r
+    dapl scm: use correct device attribute for max_rdma_read_out, max_qp_init_rd_atom\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 142a8e4a99259fa6fe31f74ce6d0dac1017f381b\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu Aug 14 09:19:53 2008 -0700\r
+\r
+    dapl scm: change IB RC qp inline and timer defaults.\r
+    \r
+    rnr nak can be the result of any operation not just\r
+    message send recevier not ready. Timer is much too\r
+    large given this case.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 36088a92d87e833bae535fcea0c45417dec34e65\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu Aug 14 09:12:38 2008 -0700\r
+\r
+    dapl scm: add mtu adjustments via environment, default = 1024.\r
+    \r
+    DAPL_IB_MTU adjusts path mtu setting for RC qp's. Default setting\r
+    is min of 1024 and active mtu on IB device.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit a7dabdc4c1ddc62cc0384d60e8157ee829f12898\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Aug 13 14:17:40 2008 -0700\r
+\r
+    dapl scm: change connect and accept to non-blocking to avoid blocking user thread.\r
+    \r
+    The connect socket that is used to exchange QP information is now non-blocking\r
+    and the data exchange is done via the cr thread. New state RTU_PENDING added.\r
+    On the passive side there is a new state ACCEPT_DATA used to avoid read blocking\r
+    on the user accept call.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 7e25c0f21d755cce3aa7aff993fb0baddaafc0e8\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Jul 29 08:18:25 2008 -0700\r
+\r
+    dapl scm: update max_rdma_read_iov, max_rdma_write_iov EP attributes during query\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit fd9909618fdfff0eb2c8ce97bff61ea98ec44a8e\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Sun Jul 20 13:20:45 2008 -0700\r
+\r
+    Release 2.0.11\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 0003bb7866af3ba73cc79c703b565a8012439bb1\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Sun Jul 20 13:17:22 2008 -0700\r
+\r
+    dtestx: add -d option to test new IB UD extension.\r
+    \r
+    modify dtestx to connect peer UD QP's and exchange/verify messages as an example for new extension.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 9816ac15f98f6e73cf7b371ac6e1e312d4171c0b\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Sun Jul 20 13:13:09 2008 -0700\r
+\r
+    dapl scm: add support for UD extensions in Openfabrics socket cm provider\r
+    \r
+    add qp_type in connection information exchange\r
+    add new post_send_ud call\r
+    changes to connection manager to support qp types beyond RC.\r
+    changes to connection events to use new extended event calls.\r
+    exchange address handle information during connection phase.\r
+    changes to modify_qp to handle both RC and UD types.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 927dac5b61e64868089acd49d468b98327e14a1a\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Sun Jul 20 13:07:34 2008 -0700\r
+\r
+    dapl: add support for UD extensions in common code.\r
+    \r
+    allow EP create for extended service types.\r
+    extend connection event types to include UD AH resolution/exchange.\r
+    add new extended connect and connect request upcalls for providers.\r
+    - dapls_evd_post_cr_event_ext\r
+    - dapls_evd_post_connection_event_ext\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit be3d6a53f3340294697706ce50a05faf151aacc7\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Sun Jul 20 12:57:49 2008 -0700\r
+\r
+    dat: New definitions for IB unreliable datagram extension\r
+    \r
+    Extend EP dat_service_type, with DAT_IB_SERVICE_TYPE_UD\r
+    Add IB extension call dat_ib_post_send_ud().\r
+    Add address handle definition for UD calls.\r
+    Add IB event definitions to provide remote AH via connect and connect requests\r
+    Roll IB extension version to 2.0.2\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 8f65d4c96a7e13f7092d82f2f5aad477a61a57c1\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri Jul 18 07:46:20 2008 -0700\r
+\r
+    dat: allow TYPE_ERR messages to be turned off with DAT_DBG_TYPE\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 4fefc6bca4e21c9d757923bf13bc93c62dbff17d\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Jun 25 08:02:11 2008 -0700\r
+\r
+    dapltest: manpage - rdma write example incorrect\r
+    \r
+    parameter for rdma write should be RW and not WR\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 68638bde71b529a142c13ac332cd44435cabc896\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Jun 23 15:26:30 2008 -0700\r
+\r
+    dapl: remove needless terminating 0 in dto_op_str functions.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit cb1f2a144ecd375d2143d6e176a6a92a18556d7e\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Jun 23 10:52:46 2008 -0700\r
+\r
+    Release 2.0.10\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit d9b3c06ae98ac4d3b264384f6510137166d78cb0\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Jun 23 10:35:17 2008 -0700\r
+\r
+    remove reference to doc/dat.conf in makefile.am\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit b052d402e09ac78281a25af2c8fe902fa71f5c6f\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu Jun 19 13:34:49 2008 -0700\r
+\r
+    dapl scm: fix ibv_destroy_cq busy error condition during dat_evd_free.\r
+    \r
+    Problem surfaced while running Intel MPI 3.1 and mpich2-test suite.\r
+    dapli_destroy_cm was incorrectly removing reference to qp_handle in endpoint\r
+    and destroy_cq and destroy_pd code was ignoring verbs errors.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit e466d8e330c45176c5f00efda79ad745bf3f71a4\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Jun 18 14:21:28 2008 -0700\r
+\r
+    dapl scm: add stdout logging for uname and gethostbyname errors during open.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 8e1f4db702cacdd2b9b95083db54ec38c9d2f5e5\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Jun 18 14:19:51 2008 -0700\r
+\r
+    dapl scm: support global routing and set mtu based on active_mtu\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit fc65a08727c59c304dad20337a8bff803f2302c0\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Jun 18 13:59:44 2008 -0700\r
+\r
+    dapl scm: Adding socket cm provider for better scalability on large homogeneous clusters.\r
+    \r
+    Bring socket cm provider back to life with some changes:\r
+    \r
+    better threading support for exchanging QP information.\r
+    Avoid blocking during connect to support dynamic connection\r
+    model with MPI implementations.\r
+    \r
+    consumer control of ack timeout/retries.\r
+    \r
+    disconnect/reject capabilities via socket exchange.\r
+    \r
+    version support for wire protocol to insure compatibility\r
+    with peer scm provider. Add gids to exchange.\r
+    \r
+    validated with Intel MPI on a 14,000+ core fabric using IB DDR.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 0855af175fec2f1bec8391ebae2a2cdff26a3359\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Jun 11 10:43:24 2008 -0700\r
+\r
+    dapl: add opcode to string function to report opcode during failures.\r
+    \r
+    Need to use cookie opcode during failures in lieu of cqe opcode.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit ec6296e7f0a843c69231f8284ae780014fa26fbe\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Jun 16 14:59:43 2008 -0700\r
+\r
+    dapl: remove unused iov buffer allocation on the endpoint\r
+    \r
+    provider's manage iov space on stack during posting.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit c678414ced8bc9cbe21b2fc1d54aa2af73ba6528\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Jun 16 13:59:11 2008 -0700\r
+\r
+    dapl: endpoint pending request count is wrong\r
+    \r
+    The code assumes every cookie allocated during posting of\r
+    requests gets completed. This incorrect assumption results in\r
+    wrong pending count. Remove request_pending field and replace\r
+    with direct call, dapl_cb_pending, to provide accurate\r
+    data to consumer.\r
+    \r
+    Add debug print if consumer overruns request queue.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit c446a3a3f3ecbd91ab583fee35bf613ab10defcd\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Jun 2 12:40:45 2008 -0700\r
+\r
+    dapl extension: dapli_post_ext should always allocate cookie for requests.\r
+    \r
+    extension didn't allocate cookie if completion was suppressed which resulted\r
+    segfault during provider post call. Provider's expect cookie for wr_id,\r
+    even with surpressed completions, to handle events during errors.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 2583f07d9d0f55eee14e0b0e6074bc6fd0712177\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue May 20 14:35:43 2008 -0700\r
+\r
+    Release 2.0.9\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 9b38e7b792c48ea63c2078fc6c10bb843d96bd06\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue May 20 21:56:06 2008 -0700\r
+\r
+    dtest,dtestx,dapltest: fix build issues with Redhat EL5.1\r
+    \r
+    need include files/definitions for sleep, getpid, gettimeofday\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 8084ebf39729bac310447467b518df4248e9e2b6\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue May 20 14:31:09 2008 -0700\r
+\r
+    dapl: Fix long delays with the cma provider open call when DNS is not configure on server.\r
+    \r
+    Open call should default to netdev names when resolving local IP address for cma binding to match dat.conf settings. The open code attempts to resolve with IP or Hostname first and if there is no DNS services setup the failover to netdev name resolution is delayed for as much as 20 seconds.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 2f603b03f4cebe7c414cbaeecb7155f7bf1fb115\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue May 20 14:30:05 2008 -0700\r
+\r
+    dapl: change cma provider to use max_rdma_read_in,out from ep_attr instead of HCA max values when connecting.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 7a0e5fad6de7c6affc4ba3c608b0c56f4206c48c\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Apr 30 14:48:21 2008 -0700\r
+\r
+    Release 2.0.8\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 561f09ab6f9fd46a6075ecb54ca7693f2b12f311\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Apr 30 13:51:41 2008 -0700\r
+\r
+    dapl: fix post_send, post_recv to handle 0 byte's and NULL iov handles\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 0289daa3fcc4451bace8cc6b6e20ddb7bbade07e\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Apr 30 13:25:53 2008 -0700\r
+\r
+    dat: udat_sr_parser ia_name will fail on comments, turn down debug message\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit b93b91d48186d100c48f1a479776d56476847607\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Apr 29 16:15:44 2008 -0700\r
+\r
+    dat: cleanup error handling with static registry parsing of dat.conf\r
+    \r
+    change asserts to return codes, add log messages, and\r
+    report errors via open instead of asserts during dat\r
+    library load.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit b6b1f152efabe064ab8bdcdeecbd1edd30eb732f\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Apr 28 10:14:20 2008 -0700\r
+\r
+    dapl: cma provider needs to support lower inline send default for iWARP\r
+    \r
+    IB and iWARP work best with different defaults. Add transport check\r
+    and set default accordingly. 64 for iWARP, 200 for IB.\r
+    \r
+    DAPL_MAX_INLINE environment variable is still used to override.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit be32d7d5beeeceac5dbb1974d3217265dc4d5461\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Apr 28 09:44:12 2008 -0700\r
+\r
+    dtestx: need to include string.h for memset/strcpy declarations\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit a192465714e7607529303a80d8f9a312e0c7aec6\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Apr 28 08:41:05 2008 -0700\r
+\r
+    dapl: add vendor_err with DTO error logging\r
+    \r
+    DAPL_GET_CQE_VENDOR_ERR added to get vendor_err via cq entry.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 6ac657a4e7e5e27254a024fca7fdead569043f9a\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri Apr 25 15:12:34 2008 -0700\r
+\r
+    dapl: add check before destroying cm event channel in release\r
+    \r
+    library may be loaded and unloaded without calling open\r
+    in which case the cm event channel is not created.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit c1eb23352f44aec6faeef37d8f0c3180f6259cf8\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Apr 22 12:55:13 2008 -0700\r
+\r
+    dapl: evd_alloc doesn't check for direct_object_create errors.\r
+    \r
+    Fix error check in dapls_ib_wait_object_create() and dat_evd_alloc.\r
+    When attempting to create large number of evd's that exceed\r
+    open files limit the error was not propagated up causing\r
+    a segfault. Note: there are 3 FD's required for each EVD\r
+    2 for pipe, and one for cq event_channel.\r
+    \r
+    Change the error reporting to indicate correct return\r
+    code and send to log with non-debug builds.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit c5c6229b3e7744782cace0ca1f5f1fa89198bd3a\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Apr 14 13:10:13 2008 -0700\r
+\r
+    dapl: change packaging to modify OFA provider contents of dat.conf instead of file replacement.\r
+    \r
+    Change the packaging to update only the OFA provider contents in dat.conf. This allows other\r
+    dapl providers, other then OFA, to co-exist and configure properly. Adding manpage to explain\r
+    syntax of this static configuration file.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit d32b27d991bc1314eea055ce3f55bb585b11aaac\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri Apr 11 11:37:48 2008 -0700\r
+\r
+    dapl openib_cma: fix hca query to use correct max_rd_atom values\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit ac4ccfd144c01b7f4285b0cecc6218c58d0482a8\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Apr 9 17:26:06 2008 -0700\r
+\r
+    dat: add logging by default during library load failures.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 1794e94754a1e58fcf214c2802e950124bbd1316\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Apr 8 17:32:03 2008 -0700\r
+\r
+    dtest: add private data validation with connect and accept.\r
+    \r
+    Include code, with build option, to validate private data with\r
+    consumer rejects.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 46f21284bc05e76e82b9ad6cd9f1dbc9bcde0a28\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Apr 8 17:25:11 2008 -0700\r
+\r
+    dapl: add hooks in evd connection callback code to deliver private data with consumer reject.\r
+    \r
+    PEER rejects can include private data. The common code didn't support delivery\r
+    via the connect event data structure. Add the necessary hooks in\r
+    dapl_evd_connection_callback function and include checks in openib_cma\r
+    provider to check and delivery properly. Also, fix the private data size\r
+    check in dapls_ib_reject_connection function.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 90e04c6f76dd5cfebd2f2867bfe22e85b0c2f461\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Apr 7 15:47:57 2008 -0700\r
+\r
+    dapl: increase reject private data size to avoid odd byte offets.\r
+    \r
+    remove reject type checking on passive side since it will\r
+    always be non-consumer from active side.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 353a1c8a00bb2a1380fd7a372973a5a70828da35\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri Apr 4 16:04:11 2008 -0800\r
+\r
+    dapl: update vendor information for OFA v2 provider.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit dbf1ea37f43caec61911dea06af801c2f906db0a\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri Apr 4 16:03:03 2008 -0800\r
+\r
+    dapl: add provider vendor revision data in private data with reject\r
+    \r
+    Add 1 byte header containing provider/vendor major revision\r
+    to distinguish between consumer and non-consumer rejects.\r
+    Validate size of consumer reject privated data.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 0f71b9be594739a1fba7d74929eacd42a8cee392\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu Apr 3 17:06:27 2008 -0800\r
+\r
+    dapl: add support for logging errors in non-debug build.\r
+    \r
+    Add debug logging (stdout, syslog) for error cases during\r
+    device open, cm, async, and dto operations. Default settings\r
+    are ERR for DAPL_DBG_TYPE, and stdout for DAPL_DBG_DEST.\r
+    \r
+    Change default configuration to build non-debug.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit bea882ad9b11ac7188628a939f5227e22c914169\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu Apr 3 16:23:29 2008 -0800\r
+\r
+    dapl: add support for private data in CR reject.\r
+    \r
+    Private data support via dat_cr_reject was added to\r
+    the v2 DAT specification but dapl was never extended\r
+    to support at the provider level.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit b5b096b6b6949fcb9fa711ab4784f41f1bb87525\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Apr 1 11:02:37 2008 -0800\r
+\r
+    dapl: calculate private data size based on transport type and cma_hdr overhead\r
+    \r
+    Need to adjust CM private date size based on different transport types.\r
+    Add hca_ptr to dapls_ib_private_data_size call for transport type\r
+    validation via verbs device. Add definitions to include iWARP size\r
+    of 512 and subtract 36 bytes for cma_hdr overhead.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 632af34f0ea15e12b572c656fe2ef561a0ad62b7\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Mar 26 17:58:17 2008 -0800\r
+\r
+    Remove improperly licensed GETOPT code from dtest source tree.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 88069fdd21f92923388dec7adbde0d1bc334e7c4\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Mar 18 15:04:34 2008 -0800\r
+\r
+    remove unnecessary assert from dapl_ep_free.\r
+    \r
+    dat_ep_free must handle the case where a consumer calls\r
+    free in CONNECTED or DISCONNECT_PENDING states. After\r
+    free calls disconnect, there may be a pending event,\r
+    in which case the providers dapls_ib_qp_free will block\r
+    accordingly and handle pending events.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit b3f020e5cba765077049a8cf61c4ce5009fa1031\r
+Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+Date:   Fri Mar 14 14:31:40 2008 -0700\r
+\r
+    fix openib_scm compiler warning\r
+    \r
+    Cast to socklen_t since accept(2) expects an unsigned argument.\r
+    \r
+    Makes the openib_scm provider now build successfully when using\r
+    make VERBS=<provider> (the -Werror flag was causing the build\r
+    failure)\r
+    \r
+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+\r
+commit 441996f05d3cc8b09c94c166ef736bc50c24de7e\r
+Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+Date:   Fri Mar 14 14:31:34 2008 -0700\r
+\r
+    fix provider-specific compiler warnings\r
+    \r
+    Initialize ds_array_start_p otherwise the compiler would claim\r
+    that this variable could be used with an uninitialized value.\r
+    \r
+    Makes the uDAPL providers now build successfully when using make\r
+    VERBS=<provider> (the -Werror flag was causing the build failure)\r
+    \r
+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+\r
+commit 5a710fc43ad004ecb4603db1359abb4a4fcd77e3\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Mar 11 09:25:07 2008 -0800\r
+\r
+    uDAPL: fix query to adjust max sge for default inline of 64 bytes\r
+           and include missing max_rdma_write_iov ep_attr field\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit e2c6bf57f78dfebc21e168df01e5876202053e08\r
+Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+Date:   Fri Mar 7 09:39:22 2008 -0800\r
+\r
+    uDAT: fix reuse of va_list in debugging mode\r
+    \r
+    Make sure we reinitialize the va_list since va_list is undefined\r
+    if a function traverses the va_list with va_arg.\r
+    \r
+    This patch fixes the uDAT debugging case when both stdout and\r
+    syslog output is wanted.\r
+    \r
+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+\r
+commit 4c9cd7a7268c0d8afb5b4d9b31537bc50cac18fe\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu Mar 6 15:40:35 2008 -0800\r
+\r
+    Add hostname and process id to debug output to aid\r
+    scale-up and out debug.\r
+    \r
+    Signed-off by: Arlin Davis ardavis@ichips.intel.com\r
+\r
+commit 460aa6f089fcdb34d78af1c8391cbecbcc6b0db3\r
+Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+Date:   Sat Feb 23 21:03:21 2008 -0800\r
+\r
+    fix reuse of va_list in debugging mode\r
+    \r
+    Make sure we reinitialize the va_list since va_list is undefined\r
+    if a function traverses the va_list with va_arg.\r
+    \r
+    This patch fixes the debugging case when both stdout and syslog\r
+    output is wanted.\r
+    \r
+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+\r
+commit da80af8c76f220508407a2e171c8b28b43b35bf9\r
+Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+Date:   Tue Feb 19 16:54:45 2008 -0800\r
+\r
+    Fix memory leak in provider specific post send/recv if there's\r
+    more than DEFAULT_DS_ENTRIES iovecs.\r
+    \r
+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+\r
+commit d78ee9f95fbe48f71eb247b01c598994edfa4d17\r
+Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+Date:   Tue Feb 19 03:19:42 2008 -0800\r
+\r
+    Guarantee NUL termination if hostname gets truncated.\r
+    \r
+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+\r
+commit 3484fa0d2b1a5549d83ecc82d89b72bb86f8fe4e\r
+Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+Date:   Tue Feb 19 03:19:37 2008 -0800\r
+\r
+    Make sure we don't leak the hash table if dapl_hca_alloc fails.\r
+    \r
+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+\r
+commit e4ed56be6bd64684564169d89df7ca30faffdb53\r
+Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+Date:   Tue Feb 19 03:19:32 2008 -0800\r
+\r
+    Fix memory leak.\r
+    \r
+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+\r
+commit 9efd005b185cfd970d2f8c58f05cf2eaae0dcdc8\r
+Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+Date:   Tue Feb 19 03:19:27 2008 -0800\r
+\r
+    Fix memory leak in error path.\r
+    \r
+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+\r
+commit d971e799bb5385a8c847cf3f863f19854e95c1b2\r
+Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+Date:   Tue Feb 19 03:19:22 2008 -0800\r
+\r
+    Fix memory leak\r
+    \r
+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+\r
+commit c21f2f455af7934675a58ff825bed6cf54d457c9\r
+Author: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+Date:   Tue Feb 19 03:19:17 2008 -0800\r
+\r
+    Fix memory leak.\r
+    \r
+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+\r
+commit ee46aa47e2a4deeded347fe18bd6321db61c6594\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri Feb 15 10:10:01 2008 -0800\r
+\r
+    Release 2.0.7\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit f0ca504bc2639cb7a48528d45e9026b54dab3e57\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu Feb 14 09:46:56 2008 -0800\r
+\r
+    uDAT: Make sure we initialize the dictionary entry early enough so that\r
+    we can base our cleanup decisions on that variable being\r
+    initialized.\r
+    \r
+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+\r
+commit 6b11838043a6012668c7e1a22a869e9e84dc40d6\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu Feb 14 09:46:18 2008 -0800\r
+\r
+    uDAT: Make sure we stay within bounds when manipulating the ia_name.\r
+    \r
+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 3eab70b4d34f850661b51dc1b856cd8d672a5cc9\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu Feb 14 09:44:56 2008 -0800\r
+\r
+    uDAT: Make sure we stay within bounds when manipulating the ia handle.\r
+    Fix typo in comment.\r
+    \r
+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+\r
+commit 7fe64f10874667062e067efb7ea8c3d385ae90b7\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu Feb 14 09:43:39 2008 -0800\r
+\r
+    uDAT: Zero-out memory otherwise we might base our cleanup decisions on\r
+    uninitialized memory.\r
+    \r
+    Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>\r
+\r
+commit f510e7e8f5b72a6262a7f8b255926cf96c65b654\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Feb 13 20:39:26 2008 -0800\r
+\r
+    Modify default configure options to match rpm spec file\r
+     --enable-debug, --enable-ext-type=ib\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 75273f1a5c599777bb43add93f30563689fdbc10\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Feb 11 15:43:03 2008 -0800\r
+\r
+    udapl OFA provider: set listen backlog to default cma backlog max.\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 7f173ecd7e18f25bc21a42651603922e7d71f7c7\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Feb 11 14:50:33 2008 -0800\r
+\r
+    The OFA dapl provider is checking for incorrect return code\r
+    from rdma_bind_addr and rdma_listen calls. This causes an error\r
+    to be returned back to the consumer instead of correctly\r
+    incrementing the seed port and re-calling the OFA provider\r
+    until a valid port is issued. The seed value (1000) is also\r
+    incorrect and should start a non-privledged port (1024) to\r
+    avoid EPERM errors when seeding the starting port value.\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 7bcb67ba7c9b37d7c122773f542c7f7f718d4a49\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Feb 4 16:16:10 2008 -0800\r
+\r
+    Release 2.0.6 - ChangeLog\r
+\r
+commit bead5f36542a8a4c790bda8ecc8dde3e630c15e6\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Feb 4 16:14:02 2008 -0800\r
+\r
+    Release 2.0.6\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 8c5beb870048aca286f7396549771ccb075c5c1b\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Feb 4 16:12:47 2008 -0800\r
+\r
+    Fix OFED v2 package to build against and target /dat2/include directory.\r
+    \r
+    Prevous patch missed dat_osd.h, dapltest/dtest incorrect.\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 42a63bb0271f91541e7b3c3967a9a977ef6660ae\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Feb 4 13:00:45 2008 -0800\r
+\r
+    uDAT/DAPL: Fix package to build against and target /dat2/include directory.\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit b3294c738d61f44ae4d0888662bdd6b64f6d6b1f\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Jan 29 16:34:49 2008 -0800\r
+\r
+    Release 2.0.5 - ChangeLog updated\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 356cf91905d39ade06d76ab9ace6203cd7907d93\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Jan 29 16:33:10 2008 -0800\r
+\r
+    libdat: rename libdat.so to libdat2.so to coexist with v1 devel\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit d9a9f46ee220ec9c479756acc306ed68060a662f\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Jan 28 13:55:35 2008 -0800\r
+\r
+    Release 2.0.4 - README\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 533983cec914a7ecc6829934a56f867d7870e301\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Jan 28 12:06:03 2008 -0800\r
+\r
+    Release 2.0.4 Changelog\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit bfc5bd4b4190c7302b08c3922c17e2131bfbe605\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Jan 28 12:04:18 2008 -0800\r
+\r
+    Relase package 2.0.4\r
+\r
+commit 95935648f81ac5177ae7120b35e55483902b8c64\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Jan 23 16:40:48 2008 -0800\r
+\r
+    dapltest does not include definitions for inet_ntoa.\r
+    At load time the symbol was resolved but with the\r
+    default definition of int, instead of char*, it caused\r
+    segfault. Add correct include files in dapl_mdep_user.h\r
+    for linux.\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 3c1bb0e56c14c5ad50876820e25933c1f4c3dde4\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Jan 23 14:46:30 2008 -0800\r
+\r
+    Add freeaddrinfo to deallocate getaddrinfo buffer.\r
+    Cleanup a few printf messages.\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit a4a8ad5eb1b15be19b3a343dee71ad3013d3f4bd\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Jan 23 14:25:21 2008 -0800\r
+\r
+    Fix for uDAPL v2 using extended operation. After extension completion,\r
+    the DTO cookie must be checked for type before deallocating to handle\r
+    inbound immediate data in receive. The sample dtestx client will fail\r
+    when running loopback if the rdma immediate is received from remote\r
+    before the rdma immediate request completion fires.\r
+    \r
+    Bug causes following dtestx client error:\r
+    dat_ib_post_rdma_write_immed\r
+       returned DAT_INSUFFICIENT_RESOURCES : DAT_RESOURCE_MEMORY\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 6dcf1763c153c27c29ba76bac35be4f6935ddd96\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu Jan 17 11:30:27 2008 -0800\r
+\r
+    WinOF: update dapltest,dtest directories for windows build\r
+    WinOF: add README.windows\r
+    \r
+    Signed-off by: Stan Smith <stan.smith@intel.com>\r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 9bececbb32dd31d4a3528e8f000a773e5c593430\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu Jan 17 11:24:46 2008 -0800\r
+\r
+    WinOF: update dtestx for windows build\r
+    \r
+    Signed-off by: Stan Smith <stan.smith@intel.com>\r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 4dc8c5defef0f52da751a1eca4d4f35de911c3c0\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu Jan 17 11:23:21 2008 -0800\r
+\r
+    WinOF: add build enviroment, cleanup old makefiles\r
+    \r
+    Signed-off by: Stan Smith <stan.smith@intel.com>\r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 5a9e035fa33a6307b3d2b370f64639b14dfca87e\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Jan 15 16:59:34 2008 -0800\r
+\r
+    WinOF: name collision with ibal verbs ib_cm_handle_t\r
+    \r
+    Signed-off by: Stan Smith <stan.smith@intel.com>\r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 7c5418a781c1dfdb37b09450b5df40363dce84b4\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Jan 15 16:06:10 2008 -0800\r
+\r
+    dtest: dat_evd_query for correct size\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 6de5e635c01e78bde6e153b727926da900677d52\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Jan 15 16:03:27 2008 -0800\r
+\r
+    dapltest: WinOF support.\r
+    \r
+    Signed-off by: Stan Smith <stan.smith@intel.com>\r
+\r
+commit c680e95b96e57bd8b69b1c73e95730854fcea028\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Jan 15 14:54:57 2008 -0800\r
+\r
+    openib_cma: fix cleanup issues in destroy_cm_id\r
+                add macros to convert SID and PORT\r
+                fix init/responder settings in accept\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit f8f867e52ffc36a31830dd4003eb2a4b4d265c93\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Jan 15 14:49:54 2008 -0800\r
+\r
+    Modifications for WinOF build and endian support for RMR info\r
+    \r
+    Signed-off by: Stan Smith <stan.smith@intel.com>\r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 4c1fc48d2825efcffaa8cdf7efbdd2d41aeb56ab\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Jan 15 14:39:18 2008 -0800\r
+\r
+    WinOF: DAT_API changes, white space and tab cleanup\r
+           IBAL provider code added\r
+    \r
+    Common code: initialize cookie pool buffer\r
+                 add dapl extension DTO counter\r
+                 add get_cqe_op_str debug call\r
+                 remove excess dbg in evd_dequeue\r
+                 add dbg assert to sp_search_cr\r
+                 IBAL provider support _VENDOR_IBAL_\r
+    \r
+    Signed-off by: Stan Smith <stan.smith@intel.com>\r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 68f2ad0af3623dec27b1223aeaca6357348eef4b\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri Jan 4 08:32:39 2008 -0800\r
+\r
+    Windows specific -\r
+       IBAL support in evd_create\r
+       Build IB extensions by default\r
+    Common code -\r
+       check return status, evd_free, evd_wait\r
+       add dapl_event_str function\r
+       definitions for dat_os_library_error, dat_os_ungetc\r
+    \r
+    Signed-off by: Stan Smith <stan.smith@intel.com>\r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit d21f36406408245ac979f0b9594e7d1d0b9a3852\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri Jan 4 08:32:19 2008 -0800\r
+\r
+    Common code -\r
+       Missing DAT_API defs\r
+       casting to fix build issues\r
+       bitmaps for extension debug\r
+       DAPL_BAD_PTR macro\r
+    \r
+    Signed-off by: Stan Smith <stan.smith@intel.com>\r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 258678a381c6a0170020c48b0ba627e820abd3e7\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri Jan 4 08:31:59 2008 -0800\r
+\r
+    Common code -\r
+       Add DAT_API definitions for dat_redirection.h, udat_redirection.h\r
+    \r
+    Signed-off by: Stan Smith <stan.smith@intel.com>\r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 87d0b46a0c0f25e8828d7425e0173a0304a23f8b\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri Jan 4 08:31:27 2008 -0800\r
+\r
+    Windows specific -\r
+       Add dapl_ep fields ibal_cm_handle, recv_disc, sent_disc for IBAL provider\r
+       Support for direct object on CQ\r
+       INIT and FINI changes\r
+       setup dat.conf default path, fix sr parsing\r
+    Common code -\r
+       Add Stan Smith as contributor\r
+       O/S independent dat_os_library_error()\r
+    \r
+    Signed-off by: Stan Smith <stan.smith@intel.com>\r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit b3ba3dc9743baf3bff243e8969edf3395d1118dd\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Dec 11 14:44:24 2007 -0800\r
+\r
+    2/2 uDAPL changes to sync common code base with WinOF\r
+     - add DAT_API to specify calling conventions (windows=__stdcall, linux= )\r
+     - cleanup platform specific definitions for windows\r
+     - c++ support\r
+     - add handle check macros DAT_IA_HANDLE_TO_UL and DAT_UL_TO_IA_HANDLE\r
+\r
+commit 92d7eef38877ad472a91e5e9f88e4e49657716bf\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Dec 11 14:43:05 2007 -0800\r
+\r
+    1/2 uDAT changes to sync common code base with WinOF\r
+     - add DAT_API to specify calling conventions (windows=__stdcall, linux= )\r
+     - cleanup platform specific definitions for windows\r
+     - c++ support\r
+     - add handle check macros DAT_IA_HANDLE_TO_UL and DAT_UL_TO_IA_HANDLE\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off by: Stan Smith <stan.smith@intel.com>\r
+\r
+commit 95764c6da28284d29071cf01d1a09bdcb967a971\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Dec 4 13:19:27 2007 -0800\r
+\r
+    - Fix size of evd request queue on creation\r
+    - Add query and checking of DTO request queue\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 9bc97e65c1240224d7dc9d6ac9a48e7aed199ee6\r
+Merge: 11a165a... abb4356...\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Nov 27 13:31:32 2007 -0800\r
+\r
+    master_dat2.0_merge\r
+\r
+commit abb4356cd765d38cf5cff2dfbdb610b380f944a2\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Nov 20 12:10:39 2007 -0800\r
+\r
+    Release 2.0.3\r
+\r
+commit d2c66eb7363234c5a9fb82aa92df1c132e46477e\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Nov 20 12:07:58 2007 -0800\r
+\r
+    - Lower default settings (rdma ops, inline sends) for latest iWARP/IB devices\r
+    - Add missing ia_query for max_iov_segments_per_rdma_write\r
+    - Cleanup CMA code no longer supported by rdma_cm\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 3a3519167bd65bd999424788f139b930b099b405\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Nov 19 15:26:44 2007 -0800\r
+\r
+    Change dapltest timers to use gettimeofday instead of get_cycles for better portability.\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 11a165a1868b1748fe476e08fc40af620f961cd2\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Oct 31 10:58:51 2007 -0800\r
+\r
+    - DAT/DAPL Version 1.2.3 Release 1\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit bc2d39a78e31c5e9463c8fa16f0ecaf49f75a15f\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Oct 31 10:55:48 2007 -0800\r
+\r
+    ChangeLog update\r
+\r
+commit 7d3ec3d68a756f895a6c6ba8ed3d7a1d602468e9\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Oct 31 10:55:05 2007 -0800\r
+\r
+    - DAT/DAPL Version 2.0.2 Release 1\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 43931378b9d4f5f721da828623f1e391f32f446b\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Oct 30 09:06:24 2007 -0800\r
+\r
+    - Add ChangeLog\r
+    - update cma provider to report remote and local ports via dat_ep_query.\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit a65da8a86ed637bacc32e3518d6c37eeb3b496bf\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu Oct 25 14:37:14 2007 -0700\r
+\r
+    Fix dapltest endian issue with mem_handle, mem_address.\r
+    \r
+    Signed-off-by: Shirley Ma <xma@us.ibm.com>\r
+\r
+commit 8196f1655fe6088c66dafa6ad8e4474ea8ebe1d9\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu Oct 25 14:36:12 2007 -0700\r
+\r
+    Fix dapltest endian issue with mem_handle, mem_address.\r
+    \r
+    Signed-off-by: Shirley Ma <xma@us.ibm.com>\r
+\r
+commit 39667dbb0160d395fb20eb53a1b4e995e2e623dd\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Oct 16 14:23:17 2007 -0700\r
+\r
+     Fix dtest to build properly with extensions.\r
+    \r
+     Modify dat.h dat_event to include event_extension_data[8].\r
+     Extend struct dat_event outside of extension build\r
+     switch to enable non-extended applications to work\r
+     with extended libraries. Otherwise, there is a potential\r
+     for the event callee to write back too much event data\r
+     and exceed callers non-extended event buffer.\r
+    \r
+     Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit d7134fb2bcad6f4f68410af997f8791edd788cfb\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Oct 16 14:10:52 2007 -0700\r
+\r
+        Use inet_ntoa instead of open coding it. IP addresses were being\r
+        reversed on PowerPC.\r
+    \r
+        On PowerPC the timebase ticks at a different frequency to the CPU.\r
+        dapltest currently assumes a 1:1 relationship, and gives bogus values\r
+        when scaling timebase to real time.\r
+    \r
+        To fix this, look at the timebase field in /proc/cpuinfo instead. To\r
+        keep things consistent with x86, scale that value to MHz.\r
+    \r
+        Signed-off-by: Anton Blanchard <anton@samba.org>\r
+\r
+commit c6710c291a4f7c0845a4535767d41d66f092fabf\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Oct 16 14:09:56 2007 -0700\r
+\r
+    Use inet_ntoa instead of open coding it. IP addresses were being\r
+    reversed on PowerPC.\r
+    \r
+    On PowerPC the timebase ticks at a different frequency to the CPU.\r
+    dapltest currently assumes a 1:1 relationship, and gives bogus values\r
+    when scaling timebase to real time.\r
+    \r
+    To fix this, look at the timebase field in /proc/cpuinfo instead. To\r
+    keep things consistent with x86, scale that value to MHz.\r
+    \r
+    Signed-off-by: Anton Blanchard <anton@samba.org>\r
+\r
+commit 9446029979a55e6e477fb31cfdf9ce0dc77ffa8f\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Oct 16 14:02:36 2007 -0700\r
+\r
+     Minor clean-up of cr/lf\r
+    \r
+     Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 33fd0628497911df11dea640aea4660e54989ed6\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Oct 2 16:01:37 2007 -0700\r
+\r
+    Final changes for 2.0.1-1 package, OFED 1.3 ALPHA\r
+    Fix build issue with SLES 10, gcc++ compiler\r
+    \r
+     Signed-off-by: Jimmy Hill <jimmy.hill@us.ibm.com>\r
+     Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit bc5f16991d75ff9d09e3e3a3cc8c2d6801a9d61f\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Oct 2 14:50:02 2007 -0700\r
+\r
+    Final changes for package 1.2.2-1, OFED 1.3 ALPHA\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 52bc16939e87587f8208e775dd061f54196a9acb\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Oct 2 11:58:46 2007 -0700\r
+\r
+    Change v2 dat.conf provider names to associate with ib net devices\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit d22e62f989dd16d503d5430ffe6f55075139e057\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Oct 2 11:43:34 2007 -0700\r
+\r
+    Change DT_Mdep_GetTime to use gettimeofday() which has more resolution\r
+    than times().\r
+    \r
+    Signed-off-by: Anton Blanchard <anton@samba.org>\r
+\r
+commit a64eae5bd36598a5c93010e07869e95599aa8ceb\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Oct 2 11:41:40 2007 -0700\r
+\r
+    Change v2 dat.conf provider names to associate with ib net devices\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 870764dfad8df0ffe6d3d449e7a8e296cfee8ef5\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Oct 2 11:35:21 2007 -0700\r
+\r
+    Change DT_Mdep_GetTime to use gettimeofday() which has more resolution\r
+    than times().\r
+    \r
+    Signed-off-by: Anton Blanchard <anton@samba.org>\r
+\r
+commit 66bf23e3e53f370c92803f162144947f29ce06d8\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Oct 2 11:30:15 2007 -0700\r
+\r
+    Change DT_Mdep_GetTime to use gettimeofday() which has more resolution\r
+    than times().\r
+    \r
+    Signed-off-by: Anton Blanchard <anton@samba.org>\r
+\r
+commit c220760bbb1f6357b6e187ff6c5e576dd74fd504\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Oct 2 10:39:09 2007 -0700\r
+\r
+    Fix dapl to compile as both 32bit and 64bit on PowerPC. Instead of using\r
+    the kernel atomic routines, code them explicitely like x86 does.\r
+    \r
+    Signed-off-by: Anton Blanchard <anton@samba.org>\r
+\r
+commit 9ffdf3722e5a9cde3fd6add5d7b3940a7ea9f71f\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri Sep 28 17:04:54 2007 -0700\r
+\r
+    Clean up packaging, modify dat.conf for v2.0 cma provider name change to ofa\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 493e65b5b47f47e4824f775959fd98e56aeaccc4\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri Sep 28 17:03:41 2007 -0700\r
+\r
+    Clean up packaging, modify dat.conf for cma provider name change to ofa\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 99f0a0bf0a0d99fee0729fba0fcdf6f3e89e2ec4\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu Sep 20 12:25:55 2007 -0700\r
+\r
+      Modifications to coexist with 2.0 libraries\r
+         - fix RPM specfile, configure.in,  1.2.2 package\r
+         - modify dat.conf\r
+    \r
+        Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 7ff4a8a8e861b0701b5b2a6fc95e6aa8b36d2662\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu Sep 20 10:55:19 2007 -0700\r
+\r
+    Modifications to coexist with 1.2 libraries\r
+     - cleanup CR-LF in dtestx\r
+     - fix RPM specfile, 2.0.1 package\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 230767742b8287490373c09d1bd346337b375b48\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri Jun 22 11:48:20 2007 -0700\r
+\r
+    Update copyright in specfile\r
+\r
+commit 5294cbe5e58f67d0a98862edea3684fff6e773bb\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri Jun 22 11:47:14 2007 -0700\r
+\r
+    Update Copyright in specfile\r
+\r
+commit 3654c6ef425f94b9f27a593b0b8c1f3d7cc39029\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Jun 6 13:20:38 2007 -0700\r
+\r
+    Update specfile to reflect DAT/DAPL 1.2.1 release\r
+\r
+commit babb95eff1bcef88bed46e92c323193d8f039eff\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Jun 6 11:48:07 2007 -0700\r
+\r
+    More changes to the release notes\r
+\r
+commit 0f299bf1deb9198b2f008c3ffa717bef252b6097\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Jun 5 15:56:17 2007 -0700\r
+\r
+    Update release notes\r
+\r
+commit ad70f98a228ade4a863ca349990eaa7ab1e82ec2\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Jun 5 15:52:18 2007 -0700\r
+\r
+    Add release notes updated for OFED 1.2 release\r
+\r
+commit f332badb80f0b1d88bf2d70dba0c90afc40f088f\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu May 31 12:43:28 2007 -0700\r
+\r
+    Add provider specific interface to uDAPL for extensions support.\r
+    Fix memory leak with extensions, missing cookie deallocation when processing extended DTO events\r
+    Remove unnecessary check on dats_set_ia_handle in dat_ia_openv\r
+    Clean up specfile and some extra LF's\r
+\r
+commit 4d7e30586402149228a30bea3036466395577ec4\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed May 16 12:56:39 2007 -0700\r
+\r
+    add iwarp extension include file\r
+\r
+commit d9963cc9984c06f147b92877945e847f657cd512\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed May 16 12:52:38 2007 -0700\r
+\r
+    clean up some CR's in include files\r
+\r
+commit 80f4e8c4be02bac5d472e1e6c4937079882a0388\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed May 9 16:21:16 2007 -0700\r
+\r
+    Take out references to specific 1.1 verbs definitions (ibv_comp_channel).\r
+\r
+commit 544fbb873d5320e9606f176c4b71bcba0e257d7d\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed May 9 12:51:53 2007 -0700\r
+\r
+    Bug Fixes:\r
+       - 606: Return local and remote ports with dat_ep_query\r
+       - 585: Add bonding example to dat.conf\r
+\r
+commit e64079f7b961aa9a672711f0e933a77f3999d302\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon May 7 15:54:59 2007 -0700\r
+\r
+    Update dapltest to use default device OpenIB-cma\r
+    Fix dapltest manpage, example for performance test wrong\r
+\r
+commit 7cda2304a6880371ec2d9451a4f83a7a254bc474\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon May 7 12:49:18 2007 -0700\r
+\r
+    Fix issues with IB DTO extensions\r
+     - debug print_cqe updated for latest IBV definitions\r
+     - dapli_evd_cq_to_event modified to handle both post and receive extensions\r
+     - dtestx example tested with rdma_write_imm, fetch_add, and cmp_swap\r
+     - modify cookie DTO types to support extensions properly\r
+\r
+commit 82a6750d31cd432c7e09298fc98c0e7e74abd012\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri May 4 17:17:41 2007 -0700\r
+\r
+    Add new dapl functions for 2.0 (stubs for now)\r
+    - dapl_ep_post_send_invalidate\r
+    - dapl_ep_post_rdma_read_to_rmr\r
+    - dapl_ia_ha\r
+    - dapl_csp_create, query, free\r
+    - dapl_cno_trigger\r
+    - dapl_cno_fd_create\r
+    - dapl_extensions\r
+    \r
+    Add new 2.0 parameters to existing API's\r
+    - dapl_cr_reject\r
+    - dapl_rmr_bind\r
+\r
+commit 8679aaf56c781715adc132a38a731e36194570f1\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu May 3 09:44:43 2007 -0700\r
+\r
+    update dtestx.c, default provider OpenIB-cma\r
+\r
+commit 527f6d19125e9eec7ecef03a8633626b0043a2f4\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed May 2 17:27:44 2007 -0700\r
+\r
+    Added IB extensions and dtestx as an example program using\r
+    rdma write with immediate and atomic operations\r
+\r
+commit 83ac961b505346708f12d59152146f3b04c8306f\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Apr 30 10:55:59 2007 -0700\r
+\r
+    Fixes atomic operation build problem with ia64 and RHEL5.\r
+\r
+commit 04da88bb70ee33b249a4cf2f5a92122eeec83e3c\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu Apr 26 17:29:37 2007 -0700\r
+\r
+    Update README and dapltest manpage\r
+\r
+commit 9a951d0a8713657da90568c0613eb48f5010cf1e\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Apr 3 16:35:17 2007 -0700\r
+\r
+    Cleanup RPM specfile for the dapl package, move to 1.2-1 release.\r
+\r
+commit a93f0ffcd6a46735c97ec34de564a7a91f9fc5c2\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Apr 3 14:38:31 2007 -0700\r
+\r
+    Add support for multiple IB devices to dat.conf to support IPoIB HA failover.\r
+\r
+commit 5434b720b36de2f262a02ff9dfccd99953c09e59\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu Mar 15 10:46:33 2007 -0800\r
+\r
+    Fix ia64 builds on SUSE\r
+\r
+commit b0f9eef1aa7f279802da233480cf6c495e16565b\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Mar 14 13:29:08 2007 -0800\r
+\r
+    DAT 2.0 support for new DAT_VA_TYPE added to uDAPL and openib-cma provider\r
+\r
+commit 61858b925f4c1a6f9edba6389a5bd601daf936e9\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Mar 14 11:08:19 2007 -0800\r
+\r
+    change DAT_VERSION major and minor numbers to 2.0\r
+\r
+commit 6dcb2e083bda8f2521bd3515b329c5465e1ac724\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Mar 14 10:43:56 2007 -0800\r
+\r
+    add provider support to dtest, set default to OpenIB-cma\r
+\r
+commit ff8eb667c1000be6c68ca291e7ed7bd080cb73f4\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Tue Mar 13 16:20:20 2007 -0800\r
+\r
+    add provider option to dtest, set default to OpenIB-cma\r
+\r
+commit 76a43cace54567135bac7ae54e336c6595b65fd9\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri Mar 9 13:09:14 2007 -0800\r
+\r
+    Initial build with DAT 2.0 definitions and IB extensions. IB extensions configurable with --enable-ext-type=ib\r
+\r
+commit 921687efed992e6ab72dfb731687b6816324a024\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Thu Mar 8 16:01:29 2007 -0800\r
+\r
+    Update the README\r
+\r
+commit 52ed210ae99b291f72441e71459006b5f2c851ce\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Mar 7 15:34:41 2007 -0800\r
+\r
+    - Fix bug 408, dapltest compilation failure on 32 bit arch\r
+    - Update libdat.spec.in file to build uDAPL RPMs correctly\r
+\r
+commit e3f6aca57a8fa5cbaaf872bf6844feb7d5e1e66c\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Mar 5 14:15:49 2007 -0800\r
+\r
+    Fix build issues with dtest and dapltest. Define build tree path to dat/include.\r
+\r
+commit f1f829a28e645831c3bcd1eb2d465fcb7a1fd5d8\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Feb 28 17:14:55 2007 -0800\r
+\r
+    Add dapltest headers to EXTRA_DIST\r
+    Modify dtest to delay before accepting\r
+    \r
+    Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.co.il>\r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+\r
+commit 46b830a4664d5fee2daf1ebdc4e95ecb7c580e80\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Feb 26 13:54:15 2007 -0800\r
+\r
+    Adding dtest and dapltest to the build. Manual pages created.\r
+\r
+commit d245664e27148e54469268ad81f41b2a894a131a\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Fri Jan 19 16:21:30 2007 -0800\r
+\r
+    uDAPL changes to support exchanging and validation of the device responder_resources and the\r
+    initiator_depth during connection establishment\r
+\r
+commit 2280f833090aa9f750d5be8f9b06e7e08e642da5\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Wed Dec 6 11:49:27 2006 -0800\r
+\r
+    Update cma provider to sync with rdma_ucm changes\r
+\r
+commit 89448545b415b6dff57e3314b020619f6b979ef8\r
+Author: Arlin Davis <arlin.r.davis@intel.com>\r
+Date:   Mon Dec 4 13:54:20 2006 -0800\r
+\r
+    Update autogen to create config directory\r
+\r
+commit 0a917b104eba0aae6c6ef49c7990a2dc7efc759d\r
+Author: Arlin Davis <ardavis@ichips.intel.com>\r
+Date:   Tue Nov 7 20:22:05 2006 +0000\r
+\r
+    r10074: Added support for new ib verbs client register event. No extra processing required at the uDAPL\r
+    level.\r
+    \r
+    Fix some issues supporting create qp without recv cq handle or recv qp resources. IB verbs assume a\r
+    recv_cq handle and uDAPL dapl_ep_create assumes there is always recv_sge resources specified.\r
+    \r
+    Fix some timeout and long disconnect delay issues discovered during scale-out testing. Added support\r
+    to retry rdma_cm address and route resolution with configuration options. Provide a disconnect call\r
+    when receiving the disconnect request to guarantee a disconnect reply and event on the remote side.\r
+    The rdma_disconnect was not being called from dat_ep_disconnect() as a result of the state changing\r
+    to DISCONNECTED in the event callback.\r
+    \r
+    Here are the new options (environment variables) with the default setting:\r
+    \r
+    DAPL_CM_ARP_TIMEOUT_MS   4000\r
+    DAPL_CM_ARP_RETRY_COUNT  15\r
+    DAPL_CM_ROUTE_TIMEOUT_MS  4000\r
+    DAPL_CM_ROUTE_RETRY_COUNT 15\r
+\r
+commit c73aeb904504a0bc6cce0fb1248af9ba39521395\r
+Author: Arlin Davis <ardavis@ichips.intel.com>\r
+Date:   Thu Oct 12 22:41:33 2006 +0000\r
+\r
+    r9802: Remove Socket CM provider from build and dat.conf configuration. No longer needed nor supported.\r
+\r
+commit b1d94b26610f682cdd43bde2aecf5004e0865422\r
+Author: Steve Wise <swise@opengridcomputing.com>\r
+Date:   Tue Sep 12 18:15:39 2006 +0000\r
+\r
+    r9442: Update obsolete CLK_TCK to CLOCKS_PER_SEC\r
+    Signed-off-by: Steve Wise <swise@opengridcomputing.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 99a5dddd07d4c271ebb075b5b0f800101f850a56\r
+Author: Arlin Davis <ardavis@ichips.intel.com>\r
+Date:   Thu Sep 7 18:09:11 2006 +0000\r
+\r
+    r9346:\r
+    inadvertently added evdtest to makefile when testing dat_evd_set_unwaitable fix with openib_cma provider\r
+\r
+commit b53a87c856d9754313da9543a1dac5c6f1307085\r
+Author: Arlin Davis <ardavis@ichips.intel.com>\r
+Date:   Wed Sep 6 20:36:09 2006 +0000\r
+\r
+    r9315:\r
+    Fill out some unitialized fields in the ia_attr structure\r
+    returned by dat_ia_query().\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off by: Robert Walsh <robert.walsh@qlogic.com>\r
+\r
+commit b6c4e84399d0aa44c72c6ca870409c3666d7e79b\r
+Author: Arlin Davis <ardavis@ichips.intel.com>\r
+Date:   Fri Aug 11 20:44:23 2006 +0000\r
+\r
+    r8895: Update dtest to support multiple segments on rdma write and change makefile to use OpenIB-cma by default.\r
+\r
+commit 4737c63d79b23c3aff329e864dd50e3cffb6a17f\r
+Author: Arlin Davis <ardavis@ichips.intel.com>\r
+Date:   Wed Jul 19 17:15:06 2006 +0000\r
+\r
+    r8592: Add support for dat_evd_set_unwaitable on a DTO evd in openib_cma provider\r
+\r
+commit 25fb8c376547de895a170194c09b2d72dfea789d\r
+Author: Arlin Davis <ardavis@ichips.intel.com>\r
+Date:   Mon Jul 17 22:59:17 2006 +0000\r
+\r
+    r8565: Added errno reporting (message and return codes) during open to help diagnose create thread issues.\r
+\r
+commit f3a1ed6232ccdee7d193e8e3b9b0013b2bd222af\r
+Author: Anton Blanchard <anton@samba.org>\r
+Date:   Mon Jul 17 21:26:03 2006 +0000\r
+\r
+    r8562: Fix some suspicious inline assembly:\r
+    - EIEIO_ON_SMP and ISYNC_ON_SMP are in kernel UP build optimisations, we\r
+      shouldnt export them to userspace. Replace it with lwsync and isync.\r
+    - The comment says its implemenenting cmpxchg64 but in fact its\r
+      implementing cmpxchg32. Fix the comment.\r
+    \r
+    Signed-off-by: Anton Blanchard <anton@samba.org>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 63759108a1376b6e45a4491551f71d8cafdcddc1\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Wed Jul 12 14:56:26 2006 +0000\r
+\r
+    r8503: Fix IA64 build problems reported by John Partridge <johnip@sgi.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 51362c9781cb65fd8f9a3cb5b7c12c88e4c8527a\r
+Author: Arlin Davis <ardavis@ichips.intel.com>\r
+Date:   Thu Jun 22 22:02:56 2006 +0000\r
+\r
+    r8182: Lower the reject debug message level so we don't see warnings\r
+    when consumers reject.\r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit f14889bb0cd22e897148ea2f6931a6b4f23143b0\r
+Author: Arlin Davis <ardavis@ichips.intel.com>\r
+Date:   Thu Jun 22 21:13:37 2006 +0000\r
+\r
+    r8181: Added support for active side TIMED_OUT event from a provider.\r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 14fc704ae20b6a3ad0d433d7de9c02ce99e095b3\r
+Author: Arlin Davis <ardavis@ichips.intel.com>\r
+Date:   Thu Jun 22 20:58:06 2006 +0000\r
+\r
+    r8180: Fix bug in dapls_ib_get_dat_event() call after adding new unreachable event.\r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 893698c31a0d8e60227806d992485a44375840cb\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Mon Jun 19 17:20:45 2006 +0000\r
+\r
+    r8112: Update for new rdma_create_id() function signature.\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 53483d84b0d02c432d9435d2f8e840cab3ded320\r
+Author: Arlin Davis <ardavis@ichips.intel.com>\r
+Date:   Wed Jun 14 16:17:39 2006 +0000\r
+\r
+    r8008: Set max rdma read per EP attributes\r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 6cb854cd72d9492ddc1c5da01dbfb24b3f30af83\r
+Author: Arlin Davis <ardavis@ichips.intel.com>\r
+Date:   Mon Jun 12 15:42:50 2006 +0000\r
+\r
+    r7931: Report the proper error and timeout events.\r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 44a97ff1f599f4bf882a801ead7aa495ea9ba936\r
+Author: Arlin Davis <ardavis@ichips.intel.com>\r
+Date:   Mon Jun 12 14:51:14 2006 +0000\r
+\r
+    r7928: Socket CM fix to guard against using a loopback address\r
+    as the local device address.\r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 152219cf83c61e459fdf3de03d4e83ddba045230\r
+Author: Arlin Davis <ardavis@ichips.intel.com>\r
+Date:   Tue Jun 6 21:46:44 2006 +0000\r
+\r
+    r7755: Use the uCM set_option feature to adjust connect request timeout\r
+    and retry values. Also, a fix to disallow any event after a disconnect\r
+    event.\r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 3a0686a2624ed28c7ea37b650415801f1cedbd10\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Wed May 31 19:55:57 2006 +0000\r
+\r
+    r7608: Correct comment.\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit eb760157c90f59183b424ac8e71474fe0b46094c\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Thu May 18 21:54:12 2006 +0000\r
+\r
+    r7347: Undo inadvertent change.\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 27256222b42fecfac8a44b3f82fe2524ecc72de2\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Thu May 18 21:50:27 2006 +0000\r
+\r
+    r7346: Fix for uCMA provider to return the correct event as a result of\r
+    rejects. Also, ran into a segv bug with dapl_ep_create when\r
+    creating without a conn_evd.\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit b1b6e16f3e41e123cd347bc78b01e3272076362b\r
+Author: Arlin Davis <ardavis@ichips.intel.com>\r
+Date:   Fri May 12 19:50:19 2006 +0000\r
+\r
+    r7141: Update the uDAPL openib_cma provider to work with the new\r
+    uCMA event channel interface.\r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 27f9f0c106662cc7b41bcb747495860a1b6c7133\r
+Author: Steve Wise <swise@opengridcomputing.com>\r
+Date:   Tue May 2 21:33:35 2006 +0000\r
+\r
+    r6873: Transaction test change to comply with the iWARP MPA protocol's\r
+    "Connection Startup Rules".\r
+    Signed-off-by: Steve Wise <swise@opengridcomputing.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 060d09f974ffbe73672e17641b2f18d3821d31a7\r
+Author: Arlin Davis <ardavis@ichips.intel.com>\r
+Date:   Fri Apr 28 13:44:17 2006 +0000\r
+\r
+    r6736: getaddrinfo() fix for debug builds and some additional debug messages for\r
+    connect errors and rejects.\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 4e8b95bbeaf6e5c27de59ef347ec2ef0aa2e5e6b\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Wed Apr 19 16:49:34 2006 +0000\r
+\r
+    r6520: Fix compilation warning.\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 115fcc396164066326f9447d71af798a381d063f\r
+Author: Steve Wise <swise@opengridcomputing.com>\r
+Date:   Wed Apr 19 16:32:01 2006 +0000\r
+\r
+    r6518: Do not always generate an event for an abrupt disconnect.\r
+    Signed-off-by: Steve Wise <swise@opengridcomputing.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit f959bb786cd884bf4d2a5da4d299da6297d65293\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Wed Apr 19 16:30:37 2006 +0000\r
+\r
+    r6517: Generate a disconnect event for providers that do not generate\r
+    one automatically.\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit bb467511cf6e217147817ba12bbe800aae97cab5\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Wed Apr 19 16:25:33 2006 +0000\r
+\r
+    r6516: Fix compilation error.\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 117a9856c269bf08b738a1923c92f5a1949f6cc1\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Mon Apr 10 20:16:44 2006 +0000\r
+\r
+    r6392: Fix for RDMA cm id destruction and debug builds.\r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 5f56b2b7339c17276188464dfff12b1be9e1dbb7\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Thu Apr 6 15:32:47 2006 +0000\r
+\r
+    r6289: Set max_iov_segments_per_rdma_read and max_rdma_read_iov using the correct\r
+    attribute.\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 304f48370adcaa12463c1a7d99e513164b83810c\r
+Author: Steve Wise <swise@opengridcomputing.com>\r
+Date:   Thu Apr 6 15:16:10 2006 +0000\r
+\r
+    r6286: Set the IA attribute max_iov_segments_per_rdma_read and the EP attribute\r
+    max_rdma_read_iov based on the openib max_sge_rd device attribute.\r
+    Signed-off-by: Steve Wise <swise@opengridcomputing.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit fe27222d2a00d7c5c4d98f39d2926fe14c7f32bc\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Tue Apr 4 18:29:00 2006 +0000\r
+\r
+    r6221: Change the mechanism by which library init and fini functions are specified\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 5a0598b90ab021cb2115e3791cb38dcfc0347948\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Mon Apr 3 17:29:55 2006 +0000\r
+\r
+    r6182: Remove unused variables.\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit b8084c4edc21b5ac2191ec654a882b65bad0c77d\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Mon Apr 3 15:29:30 2006 +0000\r
+\r
+    r6179: Fix dapltest compiler warnings.\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit abdbec194670d72012d481b98b2e6f728e9c5b48\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Mon Apr 3 14:08:48 2006 +0000\r
+\r
+    r6168: Fixed debug prints of 64-bit values and removed compile warnings.\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 52de2a35e02ddeb15887d0d690b52a4e02812e57\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Tue Mar 21 22:28:10 2006 +0000\r
+\r
+    r5939: Move libdat.spec to libdat.spec.in\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 6b1a6356a1757ae9b9d1557bd2ae67e0913d04c2\r
+Author: Arlin Davis <ardavis@ichips.intel.com>\r
+Date:   Fri Mar 17 22:02:18 2006 +0000\r
+\r
+    r5879: Add GNU Autotools support and an RPM spec file\r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 9d00582b8be33add8d3e4173e8311b1a222b0b34\r
+Author: Arlin Davis <ardavis@ichips.intel.com>\r
+Date:   Thu Mar 16 22:40:18 2006 +0000\r
+\r
+    r5871: Fixes a corner case where a CMA event was not acknowledged during\r
+    disconnect processing.\r
+    \r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit ede1d714a8e7ae99246eb382c1c1165f238cf7c3\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Mon Mar 13 18:15:49 2006 +0000\r
+\r
+    r5789: Reduces some debug output in the async thread and fixes listen\r
+    processing of EBUSY.\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off by: James Lentini <jlentini@netapp.com>\r
+\r
+commit afd558cbdada66e01aa553364b9a126da00dbe65\r
+Author: Arlin Davis <ardavis@ichips.intel.com>\r
+Date:   Wed Mar 8 14:24:26 2006 +0000\r
+\r
+    r5684: Remove unused NO_EP_STATE.\r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 4c36aca16b9b492a91c0b05002af5fc954f3b44e\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Tue Feb 28 15:41:03 2006 +0000\r
+\r
+    r5529: Fix to destroy QPs in all cases and close the HCA.\r
+    \r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 5874fdb26436c58365a7096b9b68c8e45a51d7a3\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Mon Jan 9 20:17:33 2006 +0000\r
+\r
+    r4855: Make use of dat_evd_wait the default.\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 254bd0e349bafbd970d6475efcafd7e52f05415e\r
+Author: Arlin Davis <ardavis@ichips.intel.com>\r
+Date:   Mon Jan 9 16:59:38 2006 +0000\r
+\r
+    r4852: Fix disconnect event processing and update dtest to validate.\r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit f69d737ee51f6b00a1e6cf8531695a61a322651b\r
+Author: Arlin Davis <ardavis@ichips.intel.com>\r
+Date:   Fri Dec 16 02:03:05 2005 +0000\r
+\r
+    r4502: Query for rd_atomic values.\r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 86566b556920a51f1e538d245674058682012668\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Fri Dec 16 01:57:30 2005 +0000\r
+\r
+    r4501: Allow a network name, network address, or device name in the dat.conf file.\r
+    Singed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 9e0ca3d4ccb92b9c0337efbadce405076a365f0f\r
+Author: Roland Dreier <rolandd@cisco.com>\r
+Date:   Wed Dec 14 20:44:36 2005 +0000\r
+\r
+    r4466: Change libibverbs API for listing all known devices from\r
+    ibv_get_devices() to ibv_get_device_list(), and update all\r
+    in-tree uses of this API.\r
+    \r
+    Signed-off-by: Roland Dreier <rolandd@cisco.com>\r
+\r
+commit 73a80143ab7b3f9aad19f84f904f99b489dca6cf\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Mon Dec 5 16:37:46 2005 +0000\r
+\r
+    r4308: Fix a gcc 4.0 warning\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit aa8b16b7e83f321eaaa18b38e6c165c2f120bcec\r
+Author: Arlin Davis <ardavis@ichips.intel.com>\r
+Date:   Thu Dec 1 15:03:10 2005 +0000\r
+\r
+    r4279: Added CMA API support.\r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 74d3c32e42ab54f3d6f2eec3d0a66d08f800e075\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Thu Nov 10 21:39:34 2005 +0000\r
+\r
+    r4018: Fixed some problems with the free build openib_scm version and turned\r
+    down some debugging and added some debug prints for uAT path records.\r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 70a2f23c5604e55f8f76672f78b4bf92f6a79b98\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Mon Oct 31 18:27:13 2005 +0000\r
+\r
+    r3917: Fix printing of debug statements.\r
+    Signed off by: Aniruddha Bohra <bohra@cs.rutgers.edu>\r
+    Signed off by: James Lentini <jlentini@netapp.com\r
+\r
+commit 4306debe3118948fca72a68ec20ef0d73b399fd1\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Wed Oct 26 21:10:26 2005 +0000\r
+\r
+    r3882: uDAPL provider for OpenIB socket CM.\r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 42a64ec2ec1d8ec71492bfebba077b006684ce97\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Thu Oct 13 20:45:22 2005 +0000\r
+\r
+    r3774: Fix the async error handling and callback mappings.\r
+    Updated TODO list.\r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off by: James Lentini <jlentini@netapp.com>\r
+\r
+commit fea8ed1188fbeef8291cfd7e681cd48c06ff5bde\r
+Author: Robert Walsh <rjwalsh@pathscale.com>\r
+Date:   Fri Oct 7 21:15:00 2005 +0000\r
+\r
+    r3693: Update some more ignores.\r
+\r
+commit 303147143afa9aa72906246a9f1973e4172f75b8\r
+Author: Todd Bowman <twbowman@gmail.com>\r
+Date:   Thu Oct 6 21:13:32 2005 +0000\r
+\r
+    r3687: Add PPC64 support for udapl\r
+    Signed-off-by: Todd Bowman <twbowman@gmail.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 103c7db321e24a7b5b06c7c26b0e0a65d1dd11ce\r
+Author: Todd Bowman <twbowman@gmail.com>\r
+Date:   Thu Oct 6 15:22:08 2005 +0000\r
+\r
+    r3683: Remove the dtest qualifier from the sdp range.\r
+    Signed-off-by: Todd Bowman <twbowman@gmail.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 33fbf9c81ac29492394e419588d856533e7fffb8\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Mon Oct 3 14:59:22 2005 +0000\r
+\r
+    r3637: Support CQ_WAIT_OBJECT with channels and sync with latest verbs.\r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off by: James Lentini <jlentini@netapp.com>\r
+\r
+commit f01dac62b08d8f4fd417c336be48fb3bc8cd15c5\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Thu Sep 29 18:13:25 2005 +0000\r
+\r
+    r3619: Makefile fix.\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 634b199218b775a8ed071c1faea519c4cc4ee4e3\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Wed Sep 28 21:50:13 2005 +0000\r
+\r
+    r3606: Fixes IA64 build problems (atomics) with the latest Redhat EL4.0 update and\r
+    adds support for SuSe.\r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 3a23c7135905666ff969b86dab3e90f90ac73008\r
+Author: Robert Walsh <rjwalsh@pathscale.com>\r
+Date:   Tue Sep 27 16:59:14 2005 +0000\r
+\r
+    r3567: Setup svn:ignore on a bunch of directories.\r
+\r
+commit d41ea62125636a58e8748871e372810c09865b0a\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Thu Sep 22 21:24:38 2005 +0000\r
+\r
+    r3525: Improve dtest and measure RDMA reads\r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 32258d13af6aaf76078ec6ba187d8129a0f70397\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Wed Sep 21 19:54:07 2005 +0000\r
+\r
+    r3513: Temporary workaround for the RDMA read performance anomaly\r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 990bdc4320809e0b989c90c24bef361c1bc91c7f\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Tue Sep 20 17:00:37 2005 +0000\r
+\r
+    r3494: Moved dapl_evd_modify_cno.c to match SourceForge\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 4509fb64fdbf99db7bdcaad4d8e3884718184d86\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Tue Sep 20 16:17:59 2005 +0000\r
+\r
+    r3493: Support ib_cm_init_qp_attr(), add cm event processing on a per\r
+    device basis, and add copyrights for kDAPL cm work that was\r
+    used in uDAPL.\r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off by: James Lentini <jlentini@netapp.com>\r
+\r
+commit c1d45137c2e26024142f24207344e3e48a577b83\r
+Author: Sean Hefty <sean.hefty@intel.com>\r
+Date:   Thu Sep 15 21:43:21 2005 +0000\r
+\r
+    r3453: Bind communication identifiers to a device to support device removal.\r
+    Export per HCA CM devices to userspace.\r
+    \r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit 5146689f1dbbce01cc46e23d749c28828e7e3ca8\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Wed Sep 14 17:44:44 2005 +0000\r
+\r
+    r3432: Request address resolution using ATS.\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 780b8237f2bf6884cf1abcc11190f97ed5c0a343\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Mon Sep 12 19:14:43 2005 +0000\r
+\r
+    r3378: Added DAPL documentation.\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 8911b60eb16770d28907c14e45556444317dd276\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Mon Sep 12 19:10:13 2005 +0000\r
+\r
+    r3377: Removed executable premission.\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit dec4d2eafebdfe7e6b495a36dd16bd5a98417e04\r
+Author: Sean Hefty <sean.hefty@intel.com>\r
+Date:   Fri Sep 9 21:51:58 2005 +0000\r
+\r
+    r3349: Update DAPL to match the verbs and CM event processing APIs.\r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit d06dcfd25e5d37310d089bcb7f3d3d75fcece75a\r
+Author: Arlin Davis <ardavis@ichips.intel.com>\r
+Date:   Tue Sep 6 19:34:46 2005 +0000\r
+\r
+    r3326: Changes to support async events. Also consolidated the uAT,uCM,uCQ threads into one processing thread.\r
+    Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 1dd8c28ce515675ee8df37cc1596bca17587eaf6\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Mon Aug 29 15:07:44 2005 +0000\r
+\r
+    r3232: validate default settings so they don't exceed device maximums\r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off by: James Lentini <jlentini@netapp.com>\r
+\r
+commit ac5308b4aac7de79a356439dfec2312faf7705ae\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Mon Aug 29 14:15:23 2005 +0000\r
+\r
+    r3227: Support for ibv_query_port, device, and gid.\r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off by: James Lentini <jlentini@netapp.com>\r
+\r
+commit ef8c7a3a4896487ff0d37a7d7234746c15fe5cf7\r
+Author: Sean Hefty <sean.hefty@intel.com>\r
+Date:   Sun Aug 21 22:30:08 2005 +0000\r
+\r
+    r3143: - Add user specified context to all uCM events.  Users will not retrieve\r
+      any events associated with the context after destroying the corresponding\r
+      cm_id.\r
+    - Provide the ib_cm_init_qp_attr() call to userspace clients of the CM.\r
+      This call may be used to set QP attributes properly before modifying the QP.\r
+    - Fixes some error handling syncrhonization and cleanup issues.\r
+    - Performs some minor code cleanup.\r
+    - Replaces the ucm_simple test program with a userspace version of cmpost.\r
+    - Updates DAPL to the new API.\r
+    \r
+    Signed-off-by: Sean Hefty <sean.hefty@intel.com>\r
+\r
+commit ec0f86d7c55830c6dffded585c04754cc6ac2a83\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Tue Aug 16 14:10:13 2005 +0000\r
+\r
+    r3107: Removed unused debug counter macros\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 49087ba27bd93769bb64d7ac5c454de1b94005bc\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Tue Aug 16 14:07:42 2005 +0000\r
+\r
+    r3106: Implemented debug counters\r
+    Signed-off by: Arlin Davis <ardavis@ichips.intel.com>\r
+    Signed-off by: James Lentini <jlentini@netapp.com>\r
+\r
+commit f98e3af7dfc56b288cc77a9103b90f8d6a927fc5\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Thu Aug 11 20:23:56 2005 +0000\r
+\r
+    r3072: Update from SourceForge DAPL: use the LMR context in calls to\r
+    dapls_hash_remove()\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 878e524c5cc63a62802d28fdc215a2b69ceb1141\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Thu Aug 11 20:07:06 2005 +0000\r
+\r
+    r3071: Updates from SourceForge DAPL: EVD updates\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 8dc70f7d972615f40e624d8f1272e5e7c16ba34f\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Thu Aug 11 19:57:40 2005 +0000\r
+\r
+    r3070: Update from SourceForge DAPL: set async evd to null in dapli_ia_release_hca\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit f2801ae6caf010d660fe302970dabddc8948e1bf\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Thu Aug 11 19:46:39 2005 +0000\r
+\r
+    r3069: Updates from SourceForge DAPL: size EP IOV correctly\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit c87fd235eaf0b3a30e005422f7d347c406c14f2c\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Thu Aug 11 19:35:05 2005 +0000\r
+\r
+    r3068: Update from SourceForge DAPL: removed duplicate ia pointer in SP structure and\r
+    fixed the spelling of ib_hca_transport_t.\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit a88bebc09a9655e462b3d32dfddec823024eab59\r
+Author: James Lentin <jlentini@netapp.com>\r
+Date:   Thu Aug 11 19:24:56 2005 +0000\r
+\r
+    r3067: Update from SourceForge DAPL: use include guard\r
+    Signed-off-by: James Lentin <jlentini@netapp.com>\r
+\r
+commit d2da08920de882a9a266f0606b81150c625fa003\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Thu Aug 11 19:21:56 2005 +0000\r
+\r
+    r3066: Update from SourceForge DAPL: optimization to dapl_ep_query\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 4ca3b0cbc59227a90b5450eea1ffeeb91826dd6d\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Thu Aug 11 18:39:34 2005 +0000\r
+\r
+    r3065: Update from DAPL SourceForge: indicate which handle is invalid\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 6d8f34137776c32149251bdec493c017b399cd10\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Thu Aug 11 18:35:58 2005 +0000\r
+\r
+    r3064: Update from DAPL SourceForge: set ep param values.\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 0f35002a1942303ff46cb9a2b70056f9a38aebdb\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Thu Aug 11 18:33:47 2005 +0000\r
+\r
+    r3063: Updates from DAPL SourceForge: QP state and connection event fix.\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 3fc876339693c6f0eed5e57780e5342f301bd95c\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Thu Aug 11 18:23:33 2005 +0000\r
+\r
+    r3062: Update from DAPL SourceForge: remove unused DAPL_CNO_PROXY_CALL\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 70f8e7a2e6bde4e757ddc8c7f59d3a5c6a13adf9\r
+Author: Hal Rosenstock <halr@voltaire.com>\r
+Date:   Fri Aug 5 17:59:38 2005 +0000\r
+\r
+    r2989: Fix dtest makefile\r
+    Signed-off-by: Hal Rosenstock <halr@voltaire.com>\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 864695cfef37d84359ada8838ab4cd4f4dafc6bb\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Fri Aug 5 17:57:31 2005 +0000\r
+\r
+    r2988: Remove kernel directory.\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 9c4e246a5baf43cadc6380e91fd5a6e319777278\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Fri Aug 5 17:56:56 2005 +0000\r
+\r
+    r2987: Remove kernel code directory.\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 26706cb0de471ba47279de0cb949ba5a41de82cc\r
+Author: James Lentini <jlentini@netapp.com>\r
+Date:   Fri Aug 5 16:41:12 2005 +0000\r
+\r
+    r2986: Add uDAPL to the trunk\r
+    Signed-off-by: James Lentini <jlentini@netapp.com>\r
+\r
+commit 76aa2de7fe38a8595d88669842450084cfa88316\r
+Author: Roland Dreier <roland@topspin.com>\r
+Date:   Thu Nov 4 17:54:50 2004 +0000\r
+\r
+    r1139: Copy roland-merge branch to trunk\r
+\r
+commit 3bd72a559dfe22685aae33599c99d021d2ae4aca\r
+Author: Roland Dreier <roland@topspin.com>\r
+Date:   Tue Jul 20 21:34:32 2004 +0000\r
+\r
+    r502: Move 2.6-only source away from trunk\r
+\r
+commit 4f05b6ed3fd1d14161664c677264846eeb51dba5\r
+Author: Roland Dreier <roland@topspin.com>\r
+Date:   Tue Jul 20 21:34:32 2004 +0000\r
+\r
+    r502: Move 2.6-only source away from trunk\r
+\r
+commit 6da8b951c069072a2afc6aba03a3dca2c44db022\r
+Author: Roland Dreier <roland@topspin.com>\r
+Date:   Tue Jul 20 01:41:16 2004 +0000\r
+\r
+    r497: Move 2.6-only tree to gen2\r
index fa47165533a96ab6a73ae619c437625b095e4d9d..15ef52e15af46fe810ac9a8615b96557fa00faac 100644 (file)
-# $Id: $
-
-OSFLAGS = -DOS_RELEASE=$(shell expr `uname -r | cut -f1 -d.` \* 65536 + `uname -r | cut -f2 -d.`)
-# Check for RedHat, needed for ia64 udapl atomic operations (IA64_FETCHADD syntax)
-# and built-in atomics for RedHat EL5
-if OS_RHEL4
-OSFLAGS += -DREDHAT_EL4
-endif
-
-if OS_RHEL5
-OSFLAGS += -DREDHAT_EL5
-endif
-
-if OS_SUSE11
-OSFLAGS += -DSUSE_11
-endif
-
-if EXT_TYPE_IB
-XFLAGS = -DDAT_EXTENSIONS
-XPROGRAMS_CMA = dapl/openib_cma/dapl_ib_extensions.c
-XPROGRAMS_SCM = dapl/openib_scm/dapl_ib_extensions.c
-else
-XFLAGS =
-XPROGRAMS_CMA =
-XPROGRAMS_SCM =
-endif
-
-if DEBUG
-AM_CFLAGS = -g -Wall -D_GNU_SOURCE -DDAPL_DBG -DDAT_CONF="\"$(sysconfdir)/dat.conf\""
-else
-AM_CFLAGS = -g -Wall -D_GNU_SOURCE -DDAT_CONF="\"$(sysconfdir)/dat.conf\""
-endif
-
-datlibdir = $(libdir)
-dapllibofadir = $(libdir)
-daplliboscmdir = $(libdir)
-
-datlib_LTLIBRARIES = dat/udat/libdat2.la
-dapllibofa_LTLIBRARIES = dapl/udapl/libdaplofa.la
-daplliboscm_LTLIBRARIES = dapl/udapl/libdaploscm.la
-
-dat_udat_libdat2_la_CFLAGS = $(AM_CFLAGS) -D_GNU_SOURCE $(OSFLAGS) $(XFLAGS) \
-                               -I$(srcdir)/dat/include/ -I$(srcdir)/dat/udat/ \
-                               -I$(srcdir)/dat/udat/linux -I$(srcdir)/dat/common/ 
-
-dapl_udapl_libdaplofa_la_CFLAGS = $(AM_CFLAGS) -D_GNU_SOURCE $(OSFLAGS) $(XFLAGS) \
-                               -DOPENIB -DCQ_WAIT_OBJECT \
-                               -I$(srcdir)/dat/include/ -I$(srcdir)/dapl/include/ \
-                               -I$(srcdir)/dapl/common -I$(srcdir)/dapl/udapl/linux \
-                               -I$(srcdir)/dapl/openib_cma \
-                               -I$(srcdir)/dapl/openib_cma/linux
-               
-dapl_udapl_libdaploscm_la_CFLAGS = $(AM_CFLAGS) -D_GNU_SOURCE $(OSFLAGS) $(XFLAGS) \
-                                -DOPENIB -DCQ_WAIT_OBJECT \
-                                -I$(srcdir)/dat/include/ -I$(srcdir)/dapl/include/ \
-                                -I$(srcdir)/dapl/common -I$(srcdir)/dapl/udapl/linux \
-                                -I$(srcdir)/dapl/openib_scm \
-                               -I$(srcdir)/dapl/openib_scm/linux
-
-if HAVE_LD_VERSION_SCRIPT
-    dat_version_script = -Wl,--version-script=$(srcdir)/dat/udat/libdat2.map
-    daplofa_version_script = -Wl,--version-script=$(srcdir)/dapl/udapl/libdaplofa.map
-    daploscm_version_script = -Wl,--version-script=$(srcdir)/dapl/udapl/libdaploscm.map
-else
-    dat_version_script = 
-    daplofa_version_script = 
-    daploscm_version_script =
-endif
-
-#
-# uDAT: libdat2.so
-#
-dat_udat_libdat2_la_SOURCES = dat/udat/udat.c \
-                       dat/udat/udat_api.c \
-                       dat/udat/udat_sr_parser.c \
-                       dat/udat/linux/dat_osd.c \
-                       dat/common/dat_api.c \
-                       dat/common/dat_dictionary.c \
-                       dat/common/dat_strerror.c \
-                       dat/common/dat_init.c \
-                       dat/common/dat_dr.c \
-                       dat/common/dat_sr.c
-dat_udat_libdat2_la_LDFLAGS = -version-info 2:0:0 $(dat_version_script) -ldl 
-
-#
-# uDAPL OpenFabrics rdma_cm version: libdaplofa.so
-#
-dapl_udapl_libdaplofa_la_SOURCES = dapl/udapl/dapl_init.c \
-        dapl/udapl/dapl_evd_create.c               \
-        dapl/udapl/dapl_evd_query.c                \
-        dapl/udapl/dapl_cno_create.c               \
-        dapl/udapl/dapl_cno_modify_agent.c         \
-        dapl/udapl/dapl_cno_free.c                 \
-        dapl/udapl/dapl_cno_wait.c                 \
-        dapl/udapl/dapl_cno_query.c                \
-        dapl/udapl/dapl_lmr_create.c               \
-        dapl/udapl/dapl_evd_wait.c                 \
-        dapl/udapl/dapl_evd_disable.c              \
-        dapl/udapl/dapl_evd_enable.c               \
-        dapl/udapl/dapl_evd_modify_cno.c           \
-        dapl/udapl/dapl_evd_set_unwaitable.c       \
-        dapl/udapl/dapl_evd_clear_unwaitable.c     \
-        dapl/udapl/linux/dapl_osd.c                \
-        dapl/common/dapl_cookie.c                   \
-        dapl/common/dapl_cr_accept.c                \
-        dapl/common/dapl_cr_query.c                 \
-        dapl/common/dapl_cr_reject.c                \
-        dapl/common/dapl_cr_util.c                  \
-        dapl/common/dapl_cr_callback.c              \
-        dapl/common/dapl_cr_handoff.c               \
-        dapl/common/dapl_ep_connect.c               \
-        dapl/common/dapl_ep_create.c                \
-        dapl/common/dapl_ep_disconnect.c            \
-        dapl/common/dapl_ep_dup_connect.c           \
-        dapl/common/dapl_ep_free.c                  \
-        dapl/common/dapl_ep_reset.c                 \
-        dapl/common/dapl_ep_get_status.c            \
-        dapl/common/dapl_ep_modify.c                \
-        dapl/common/dapl_ep_post_rdma_read.c        \
-        dapl/common/dapl_ep_post_rdma_write.c       \
-        dapl/common/dapl_ep_post_recv.c             \
-        dapl/common/dapl_ep_post_send.c             \
-        dapl/common/dapl_ep_query.c                 \
-        dapl/common/dapl_ep_util.c                  \
-        dapl/common/dapl_evd_dequeue.c              \
-        dapl/common/dapl_evd_free.c                 \
-        dapl/common/dapl_evd_post_se.c              \
-        dapl/common/dapl_evd_resize.c               \
-        dapl/common/dapl_evd_util.c                 \
-        dapl/common/dapl_evd_cq_async_error_callb.c \
-        dapl/common/dapl_evd_qp_async_error_callb.c \
-        dapl/common/dapl_evd_un_async_error_callb.c \
-        dapl/common/dapl_evd_connection_callb.c     \
-        dapl/common/dapl_evd_dto_callb.c            \
-        dapl/common/dapl_get_consumer_context.c     \
-        dapl/common/dapl_get_handle_type.c          \
-        dapl/common/dapl_hash.c                     \
-        dapl/common/dapl_hca_util.c                 \
-        dapl/common/dapl_ia_close.c                 \
-        dapl/common/dapl_ia_open.c                  \
-        dapl/common/dapl_ia_query.c                 \
-        dapl/common/dapl_ia_util.c                  \
-        dapl/common/dapl_llist.c                    \
-        dapl/common/dapl_lmr_free.c                 \
-        dapl/common/dapl_lmr_query.c                \
-        dapl/common/dapl_lmr_util.c                 \
-        dapl/common/dapl_lmr_sync_rdma_read.c       \
-        dapl/common/dapl_lmr_sync_rdma_write.c      \
-        dapl/common/dapl_mr_util.c                  \
-        dapl/common/dapl_provider.c                 \
-        dapl/common/dapl_sp_util.c                  \
-        dapl/common/dapl_psp_create.c               \
-        dapl/common/dapl_psp_create_any.c           \
-        dapl/common/dapl_psp_free.c                 \
-        dapl/common/dapl_psp_query.c                \
-        dapl/common/dapl_pz_create.c                \
-        dapl/common/dapl_pz_free.c                  \
-        dapl/common/dapl_pz_query.c                 \
-        dapl/common/dapl_pz_util.c                  \
-        dapl/common/dapl_rmr_create.c               \
-        dapl/common/dapl_rmr_free.c                 \
-        dapl/common/dapl_rmr_bind.c                 \
-        dapl/common/dapl_rmr_query.c                \
-        dapl/common/dapl_rmr_util.c                 \
-        dapl/common/dapl_rsp_create.c               \
-        dapl/common/dapl_rsp_free.c                 \
-        dapl/common/dapl_rsp_query.c                \
-        dapl/common/dapl_cno_util.c                 \
-        dapl/common/dapl_set_consumer_context.c     \
-        dapl/common/dapl_ring_buffer_util.c         \
-        dapl/common/dapl_name_service.c             \
-        dapl/common/dapl_timer_util.c               \
-        dapl/common/dapl_ep_create_with_srq.c       \
-        dapl/common/dapl_ep_recv_query.c            \
-        dapl/common/dapl_ep_set_watermark.c         \
-        dapl/common/dapl_srq_create.c               \
-        dapl/common/dapl_srq_free.c                 \
-        dapl/common/dapl_srq_query.c                \
-        dapl/common/dapl_srq_resize.c               \
-        dapl/common/dapl_srq_post_recv.c            \
-        dapl/common/dapl_srq_set_lw.c               \
-        dapl/common/dapl_srq_util.c                 \
-        dapl/common/dapl_debug.c                    \
-        dapl/common/dapl_ia_ha.c                    \
-        dapl/common/dapl_csp.c                      \
-        dapl/common/dapl_ep_post_send_invalidate.c  \
-        dapl/common/dapl_ep_post_rdma_read_to_rmr.c \
-        dapl/openib_cma/dapl_ib_util.c              \
-        dapl/openib_cma/dapl_ib_cq.c                \
-        dapl/openib_cma/dapl_ib_qp.c                \
-        dapl/openib_cma/dapl_ib_cm.c                \
-        dapl/openib_cma/dapl_ib_mem.c $(XPROGRAMS_CMA)
-
-dapl_udapl_libdaplofa_la_LDFLAGS = -version-info 2:0:0 $(daplofa_version_script) \
-                                  -Wl,-init,dapl_init -Wl,-fini,dapl_fini \
-                                  -lpthread -libverbs -lrdmacm 
-                               
-#
-# uDAPL OpenFabrics Socket CM version: libdaplscm.so
-#
-dapl_udapl_libdaploscm_la_SOURCES = dapl/udapl/dapl_init.c \
-        dapl/udapl/dapl_evd_create.c               \
-        dapl/udapl/dapl_evd_query.c                \
-        dapl/udapl/dapl_cno_create.c               \
-        dapl/udapl/dapl_cno_modify_agent.c         \
-        dapl/udapl/dapl_cno_free.c                 \
-        dapl/udapl/dapl_cno_wait.c                 \
-        dapl/udapl/dapl_cno_query.c                \
-        dapl/udapl/dapl_lmr_create.c               \
-        dapl/udapl/dapl_evd_wait.c                 \
-        dapl/udapl/dapl_evd_disable.c              \
-        dapl/udapl/dapl_evd_enable.c               \
-        dapl/udapl/dapl_evd_modify_cno.c           \
-        dapl/udapl/dapl_evd_set_unwaitable.c       \
-        dapl/udapl/dapl_evd_clear_unwaitable.c     \
-        dapl/udapl/linux/dapl_osd.c                \
-        dapl/common/dapl_cookie.c                   \
-        dapl/common/dapl_cr_accept.c                \
-        dapl/common/dapl_cr_query.c                 \
-        dapl/common/dapl_cr_reject.c                \
-        dapl/common/dapl_cr_util.c                  \
-        dapl/common/dapl_cr_callback.c              \
-        dapl/common/dapl_cr_handoff.c               \
-        dapl/common/dapl_ep_connect.c               \
-        dapl/common/dapl_ep_create.c                \
-        dapl/common/dapl_ep_disconnect.c            \
-        dapl/common/dapl_ep_dup_connect.c           \
-        dapl/common/dapl_ep_free.c                  \
-        dapl/common/dapl_ep_reset.c                 \
-        dapl/common/dapl_ep_get_status.c            \
-        dapl/common/dapl_ep_modify.c                \
-        dapl/common/dapl_ep_post_rdma_read.c        \
-        dapl/common/dapl_ep_post_rdma_write.c       \
-        dapl/common/dapl_ep_post_recv.c             \
-        dapl/common/dapl_ep_post_send.c             \
-        dapl/common/dapl_ep_query.c                 \
-        dapl/common/dapl_ep_util.c                  \
-        dapl/common/dapl_evd_dequeue.c              \
-        dapl/common/dapl_evd_free.c                 \
-        dapl/common/dapl_evd_post_se.c              \
-        dapl/common/dapl_evd_resize.c               \
-        dapl/common/dapl_evd_util.c                 \
-        dapl/common/dapl_evd_cq_async_error_callb.c \
-        dapl/common/dapl_evd_qp_async_error_callb.c \
-        dapl/common/dapl_evd_un_async_error_callb.c \
-        dapl/common/dapl_evd_connection_callb.c     \
-        dapl/common/dapl_evd_dto_callb.c            \
-        dapl/common/dapl_get_consumer_context.c     \
-        dapl/common/dapl_get_handle_type.c          \
-        dapl/common/dapl_hash.c                     \
-        dapl/common/dapl_hca_util.c                 \
-        dapl/common/dapl_ia_close.c                 \
-        dapl/common/dapl_ia_open.c                  \
-        dapl/common/dapl_ia_query.c                 \
-        dapl/common/dapl_ia_util.c                  \
-        dapl/common/dapl_llist.c                    \
-        dapl/common/dapl_lmr_free.c                 \
-        dapl/common/dapl_lmr_query.c                \
-        dapl/common/dapl_lmr_util.c                 \
-        dapl/common/dapl_lmr_sync_rdma_read.c       \
-        dapl/common/dapl_lmr_sync_rdma_write.c      \
-        dapl/common/dapl_mr_util.c                  \
-        dapl/common/dapl_provider.c                 \
-        dapl/common/dapl_sp_util.c                  \
-        dapl/common/dapl_psp_create.c               \
-        dapl/common/dapl_psp_create_any.c           \
-        dapl/common/dapl_psp_free.c                 \
-        dapl/common/dapl_psp_query.c                \
-        dapl/common/dapl_pz_create.c                \
-        dapl/common/dapl_pz_free.c                  \
-        dapl/common/dapl_pz_query.c                 \
-        dapl/common/dapl_pz_util.c                  \
-        dapl/common/dapl_rmr_create.c               \
-        dapl/common/dapl_rmr_free.c                 \
-        dapl/common/dapl_rmr_bind.c                 \
-        dapl/common/dapl_rmr_query.c                \
-        dapl/common/dapl_rmr_util.c                 \
-        dapl/common/dapl_rsp_create.c               \
-        dapl/common/dapl_rsp_free.c                 \
-        dapl/common/dapl_rsp_query.c                \
-        dapl/common/dapl_cno_util.c                 \
-        dapl/common/dapl_set_consumer_context.c     \
-        dapl/common/dapl_ring_buffer_util.c         \
-        dapl/common/dapl_name_service.c             \
-        dapl/common/dapl_timer_util.c               \
-        dapl/common/dapl_ep_create_with_srq.c       \
-        dapl/common/dapl_ep_recv_query.c            \
-        dapl/common/dapl_ep_set_watermark.c         \
-        dapl/common/dapl_srq_create.c               \
-        dapl/common/dapl_srq_free.c                 \
-        dapl/common/dapl_srq_query.c                \
-        dapl/common/dapl_srq_resize.c               \
-        dapl/common/dapl_srq_post_recv.c            \
-        dapl/common/dapl_srq_set_lw.c               \
-        dapl/common/dapl_srq_util.c                 \
-        dapl/common/dapl_debug.c                    \
-        dapl/common/dapl_ia_ha.c                    \
-        dapl/common/dapl_csp.c                      \
-        dapl/common/dapl_ep_post_send_invalidate.c  \
-        dapl/common/dapl_ep_post_rdma_read_to_rmr.c \
-        dapl/openib_scm/dapl_ib_util.c              \
-        dapl/openib_scm/dapl_ib_cq.c                \
-        dapl/openib_scm/dapl_ib_qp.c                \
-        dapl/openib_scm/dapl_ib_cm.c                \
-        dapl/openib_scm/dapl_ib_mem.c $(XPROGRAMS_SCM)
-
-dapl_udapl_libdaploscm_la_LDFLAGS = -version-info 2:0:0 $(daploscm_version_script) \
-                                   -Wl,-init,dapl_init -Wl,-fini,dapl_fini \
-                                   -lpthread -libverbs
-
-libdatincludedir = $(includedir)/dat2
-
-libdatinclude_HEADERS = dat/include/dat2/dat.h \
-                       dat/include/dat2/dat_error.h \
-                       dat/include/dat2/dat_platform_specific.h \
-                       dat/include/dat2/dat_redirection.h \
-                       dat/include/dat2/dat_registry.h \
-                       dat/include/dat2/dat_vendor_specific.h \
-                       dat/include/dat2/udat_config.h \
-                       dat/include/dat2/udat.h \
-                       dat/include/dat2/udat_redirection.h \
-                       dat/include/dat2/udat_vendor_specific.h \
-                       dat/include/dat2/dat_ib_extensions.h 
-               
-man_MANS = man/dtest.1 man/dapltest.1 man/dat.conf.5 
-       
-EXTRA_DIST = dat/common/dat_dictionary.h \
-            dat/common/dat_dr.h \
-            dat/common/dat_init.h \
-            dat/common/dat_sr.h \
-            dat/udat/udat_sr_parser.h \
-            dat/udat/linux/dat_osd.h \
-            dat/include/dat2/dat.h \
-            dat/include/dat2/dat_error.h \
-            dat/include/dat2/dat_platform_specific.h \
-            dat/include/dat2/dat_redirection.h \
-            dat/include/dat2/dat_registry.h \
-            dat/include/dat2/dat_vendor_specific.h \
-            dat/include/dat2/udat_config.h \
-            dat/include/dat2/udat.h \
-            dat/include/dat2/udat_redirection.h \
-            dat/include/dat2/udat_vendor_specific.h \
-            dapl/common/dapl_adapter_util.h \
-            dapl/common/dapl_cno_util.h \
-            dapl/common/dapl_cookie.h \
-            dapl/common/dapl_cr_util.h \
-            dapl/common/dapl_ep_util.h \
-            dapl/common/dapl_evd_util.h \
-            dapl/common/dapl_hash.h \
-            dapl/common/dapl_hca_util.h \
-            dapl/common/dapl_ia_util.h \
-            dapl/common/dapl_init.h \
-            dapl/common/dapl_lmr_util.h \
-            dapl/common/dapl_mr_util.h \
-            dapl/common/dapl_name_service.h \
-            dapl/common/dapl_provider.h \
-            dapl/common/dapl_pz_util.h \
-            dapl/common/dapl_ring_buffer_util.h \
-            dapl/common/dapl_rmr_util.h \
-            dapl/common/dapl_sp_util.h \
-            dapl/common/dapl_srq_util.h \
-            dapl/common/dapl_timer_util.h \
-            dapl/udapl/linux/dapl_osd.h \
-            dapl/include/dapl.h \
-            dapl/include/dapl_debug.h \
-            dapl/include/dapl_ipoib_names.h \
-            dapl/include/dapl_vendor.h \
-            dapl/openib_cma/dapl_ib_dto.h \
-            dapl/openib_cma/dapl_ib_util.h \
-            dapl/openib_cma/linux/openib_osd.h \
-            dapl/openib_scm/dapl_ib_dto.h \
-            dapl/openib_scm/dapl_ib_util.h \
-            dapl/openib_scm/linux/openib_osd.h \
-            dat/udat/libdat2.map \
-            dapl/udapl/libdaplofa.map \
-            dapl/udapl/libdaploscm.map \
-            dapl.spec.in \
-            $(man_MANS) \
-            test/dapltest/include/dapl_bpool.h \
-            test/dapltest/include/dapl_client_info.h \
-            test/dapltest/include/dapl_common.h \
-            test/dapltest/include/dapl_execute.h \
-            test/dapltest/include/dapl_fft_cmd.h \
-            test/dapltest/include/dapl_fft_util.h \
-            test/dapltest/include/dapl_getopt.h \
-            test/dapltest/include/dapl_global.h \
-            test/dapltest/include/dapl_limit_cmd.h \
-            test/dapltest/include/dapl_mdep.h \
-            test/dapltest/include/dapl_memlist.h \
-            test/dapltest/include/dapl_params.h \
-            test/dapltest/include/dapl_performance_cmd.h \
-            test/dapltest/include/dapl_performance_stats.h \
-            test/dapltest/include/dapl_performance_test.h \
-            test/dapltest/include/dapl_proto.h \
-            test/dapltest/include/dapl_quit_cmd.h \
-            test/dapltest/include/dapl_server_cmd.h \
-            test/dapltest/include/dapl_server_info.h \
-            test/dapltest/include/dapl_tdep.h \
-            test/dapltest/include/dapl_tdep_print.h \
-            test/dapltest/include/dapl_test_data.h \
-            test/dapltest/include/dapl_transaction_cmd.h \
-            test/dapltest/include/dapl_transaction_stats.h \
-            test/dapltest/include/dapl_transaction_test.h \
-            test/dapltest/include/dapl_version.h \
-            test/dapltest/mdep/linux/dapl_mdep_user.h
-        
-dist-hook: dapl.spec 
-       cp dapl.spec $(distdir)
-       
-install-exec-hook:
-       if ! test -d $(DESTDIR)$(sysconfdir); then \
-               mkdir -p $(DESTDIR)$(sysconfdir); \
-       fi; \
-       if test -e $(DESTDIR)$(sysconfdir)/dat.conf; then \
-               sed -e '/ofa-v2-.* u2/d' < $(DESTDIR)$(sysconfdir)/dat.conf > /tmp/$$$$ofadapl; \
-               cp /tmp/$$$$ofadapl $(DESTDIR)$(sysconfdir)/dat.conf; \
-       fi; \
-       echo ofa-v2-ib0 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"ib0 0" ""' >> $(DESTDIR)$(sysconfdir)/dat.conf; \
-       echo ofa-v2-ib1 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"ib1 0" ""' >> $(DESTDIR)$(sysconfdir)/dat.conf; \
-       echo ofa-v2-mthca0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mthca0 1" ""' >> $(DESTDIR)$(sysconfdir)/dat.conf; \
-       echo ofa-v2-mthca0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mthca0 2" ""' >> $(DESTDIR)$(sysconfdir)/dat.conf; \
-       echo ofa-v2-mlx4_0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mlx4_0 1" ""' >> $(DESTDIR)$(sysconfdir)/dat.conf; \
-       echo ofa-v2-mlx4_0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mlx4_0 2" ""' >> $(DESTDIR)$(sysconfdir)/dat.conf; \
-       echo ofa-v2-ipath0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"ipath0 1" ""' >> $(DESTDIR)$(sysconfdir)/dat.conf; \
-       echo ofa-v2-ipath0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"ipath0 2" ""' >> $(DESTDIR)$(sysconfdir)/dat.conf; \
-       echo ofa-v2-ehca0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"ehca0 1" ""' >> $(DESTDIR)$(sysconfdir)/dat.conf; \
-       echo ofa-v2-iwarp u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"eth2 0" ""' >> $(DESTDIR)$(sysconfdir)/dat.conf;
-
-uninstall-hook:
-       if test -e $(DESTDIR)$(sysconfdir)/dat.conf; then \
-               sed -e '/ofa-v2-.* u2/d' < $(DESTDIR)$(sysconfdir)/dat.conf > /tmp/$$$$ofadapl; \
-               cp /tmp/$$$$ofadapl $(DESTDIR)$(sysconfdir)/dat.conf; \
-       fi;
-
-SUBDIRS = . test/dtest test/dapltest
+# $Id: $\r
+\r
+OSFLAGS = -DOS_RELEASE=$(shell expr `uname -r | cut -f1 -d.` \* 65536 + `uname -r | cut -f2 -d.`)\r
+# Check for RedHat, needed for ia64 udapl atomic operations (IA64_FETCHADD syntax)\r
+# and built-in atomics for RedHat EL5\r
+if OS_RHEL4\r
+OSFLAGS += -DREDHAT_EL4\r
+endif\r
+\r
+if OS_RHEL5\r
+OSFLAGS += -DREDHAT_EL5\r
+endif\r
+\r
+if OS_SUSE11\r
+OSFLAGS += -DSUSE_11\r
+endif\r
+\r
+if EXT_TYPE_IB\r
+XFLAGS = -DDAT_EXTENSIONS\r
+XPROGRAMS_CMA = dapl/openib_common/ib_extensions.c\r
+XPROGRAMS_SCM = dapl/openib_common/ib_extensions.c\r
+else\r
+XFLAGS =\r
+XPROGRAMS_CMA =\r
+XPROGRAMS_SCM =\r
+endif\r
+\r
+if DEBUG\r
+AM_CFLAGS = -g -Wall -D_GNU_SOURCE -DDAPL_DBG -DDAT_CONF="\"$(sysconfdir)/dat.conf\""\r
+else\r
+AM_CFLAGS = -g -Wall -D_GNU_SOURCE -DDAT_CONF="\"$(sysconfdir)/dat.conf\""\r
+endif\r
+\r
+datlibdir = $(libdir)\r
+dapllibofadir = $(libdir)\r
+daplliboscmdir = $(libdir)\r
+\r
+datlib_LTLIBRARIES = dat/udat/libdat2.la\r
+dapllibofa_LTLIBRARIES = dapl/udapl/libdaplofa.la\r
+daplliboscm_LTLIBRARIES = dapl/udapl/libdaploscm.la\r
+\r
+dat_udat_libdat2_la_CFLAGS = $(AM_CFLAGS) -D_GNU_SOURCE $(OSFLAGS) $(XFLAGS) \\r
+                               -I$(srcdir)/dat/include/ -I$(srcdir)/dat/udat/ \\r
+                               -I$(srcdir)/dat/udat/linux -I$(srcdir)/dat/common/ \r
+\r
+dapl_udapl_libdaplofa_la_CFLAGS = $(AM_CFLAGS) -D_GNU_SOURCE $(OSFLAGS) $(XFLAGS) \\r
+                               -DOPENIB -DCQ_WAIT_OBJECT \\r
+                               -I$(srcdir)/dat/include/ -I$(srcdir)/dapl/include/ \\r
+                               -I$(srcdir)/dapl/common -I$(srcdir)/dapl/udapl/linux \\r
+                               -I$(srcdir)/dapl/openib_common \\r
+                               -I$(srcdir)/dapl/openib_cma \\r
+                               -I$(srcdir)/dapl/openib_cma/linux\r
+               \r
+dapl_udapl_libdaploscm_la_CFLAGS = $(AM_CFLAGS) -D_GNU_SOURCE $(OSFLAGS) $(XFLAGS) \\r
+                                -DOPENIB -DCQ_WAIT_OBJECT \\r
+                                -I$(srcdir)/dat/include/ -I$(srcdir)/dapl/include/ \\r
+                                -I$(srcdir)/dapl/common -I$(srcdir)/dapl/udapl/linux \\r
+                               -I$(srcdir)/dapl/openib_common \\r
+                                -I$(srcdir)/dapl/openib_scm \\r
+                               -I$(srcdir)/dapl/openib_scm/linux\r
+\r
+if HAVE_LD_VERSION_SCRIPT\r
+    dat_version_script = -Wl,--version-script=$(srcdir)/dat/udat/libdat2.map\r
+    daplofa_version_script = -Wl,--version-script=$(srcdir)/dapl/udapl/libdaplofa.map\r
+    daploscm_version_script = -Wl,--version-script=$(srcdir)/dapl/udapl/libdaploscm.map\r
+else\r
+    dat_version_script = \r
+    daplofa_version_script = \r
+    daploscm_version_script =\r
+endif\r
+\r
+#\r
+# uDAT: libdat2.so\r
+#\r
+dat_udat_libdat2_la_SOURCES = dat/udat/udat.c \\r
+                       dat/udat/udat_api.c \\r
+                       dat/udat/udat_sr_parser.c \\r
+                       dat/udat/linux/dat_osd.c \\r
+                       dat/common/dat_api.c \\r
+                       dat/common/dat_dictionary.c \\r
+                       dat/common/dat_strerror.c \\r
+                       dat/common/dat_init.c \\r
+                       dat/common/dat_dr.c \\r
+                       dat/common/dat_sr.c\r
+dat_udat_libdat2_la_LDFLAGS = -version-info 2:0:0 $(dat_version_script) -ldl \r
+\r
+#\r
+# uDAPL OpenFabrics rdma_cm version: libdaplofa.so\r
+#\r
+dapl_udapl_libdaplofa_la_SOURCES = dapl/udapl/dapl_init.c \\r
+        dapl/udapl/dapl_evd_create.c               \\r
+        dapl/udapl/dapl_evd_query.c                \\r
+        dapl/udapl/dapl_cno_create.c               \\r
+        dapl/udapl/dapl_cno_modify_agent.c         \\r
+        dapl/udapl/dapl_cno_free.c                 \\r
+        dapl/udapl/dapl_cno_wait.c                 \\r
+        dapl/udapl/dapl_cno_query.c                \\r
+        dapl/udapl/dapl_lmr_create.c               \\r
+        dapl/udapl/dapl_evd_wait.c                 \\r
+        dapl/udapl/dapl_evd_disable.c              \\r
+        dapl/udapl/dapl_evd_enable.c               \\r
+        dapl/udapl/dapl_evd_modify_cno.c           \\r
+        dapl/udapl/dapl_evd_set_unwaitable.c       \\r
+        dapl/udapl/dapl_evd_clear_unwaitable.c     \\r
+        dapl/udapl/linux/dapl_osd.c                \\r
+        dapl/common/dapl_cookie.c                   \\r
+        dapl/common/dapl_cr_accept.c                \\r
+        dapl/common/dapl_cr_query.c                 \\r
+        dapl/common/dapl_cr_reject.c                \\r
+        dapl/common/dapl_cr_util.c                  \\r
+        dapl/common/dapl_cr_callback.c              \\r
+        dapl/common/dapl_cr_handoff.c               \\r
+        dapl/common/dapl_ep_connect.c               \\r
+        dapl/common/dapl_ep_create.c                \\r
+        dapl/common/dapl_ep_disconnect.c            \\r
+        dapl/common/dapl_ep_dup_connect.c           \\r
+        dapl/common/dapl_ep_free.c                  \\r
+        dapl/common/dapl_ep_reset.c                 \\r
+        dapl/common/dapl_ep_get_status.c            \\r
+        dapl/common/dapl_ep_modify.c                \\r
+        dapl/common/dapl_ep_post_rdma_read.c        \\r
+        dapl/common/dapl_ep_post_rdma_write.c       \\r
+        dapl/common/dapl_ep_post_recv.c             \\r
+        dapl/common/dapl_ep_post_send.c             \\r
+        dapl/common/dapl_ep_query.c                 \\r
+        dapl/common/dapl_ep_util.c                  \\r
+        dapl/common/dapl_evd_dequeue.c              \\r
+        dapl/common/dapl_evd_free.c                 \\r
+        dapl/common/dapl_evd_post_se.c              \\r
+        dapl/common/dapl_evd_resize.c               \\r
+        dapl/common/dapl_evd_util.c                 \\r
+        dapl/common/dapl_evd_cq_async_error_callb.c \\r
+        dapl/common/dapl_evd_qp_async_error_callb.c \\r
+        dapl/common/dapl_evd_un_async_error_callb.c \\r
+        dapl/common/dapl_evd_connection_callb.c     \\r
+        dapl/common/dapl_evd_dto_callb.c            \\r
+        dapl/common/dapl_get_consumer_context.c     \\r
+        dapl/common/dapl_get_handle_type.c          \\r
+        dapl/common/dapl_hash.c                     \\r
+        dapl/common/dapl_hca_util.c                 \\r
+        dapl/common/dapl_ia_close.c                 \\r
+        dapl/common/dapl_ia_open.c                  \\r
+        dapl/common/dapl_ia_query.c                 \\r
+        dapl/common/dapl_ia_util.c                  \\r
+        dapl/common/dapl_llist.c                    \\r
+        dapl/common/dapl_lmr_free.c                 \\r
+        dapl/common/dapl_lmr_query.c                \\r
+        dapl/common/dapl_lmr_util.c                 \\r
+        dapl/common/dapl_lmr_sync_rdma_read.c       \\r
+        dapl/common/dapl_lmr_sync_rdma_write.c      \\r
+        dapl/common/dapl_mr_util.c                  \\r
+        dapl/common/dapl_provider.c                 \\r
+        dapl/common/dapl_sp_util.c                  \\r
+        dapl/common/dapl_psp_create.c               \\r
+        dapl/common/dapl_psp_create_any.c           \\r
+        dapl/common/dapl_psp_free.c                 \\r
+        dapl/common/dapl_psp_query.c                \\r
+        dapl/common/dapl_pz_create.c                \\r
+        dapl/common/dapl_pz_free.c                  \\r
+        dapl/common/dapl_pz_query.c                 \\r
+        dapl/common/dapl_pz_util.c                  \\r
+        dapl/common/dapl_rmr_create.c               \\r
+        dapl/common/dapl_rmr_free.c                 \\r
+        dapl/common/dapl_rmr_bind.c                 \\r
+        dapl/common/dapl_rmr_query.c                \\r
+        dapl/common/dapl_rmr_util.c                 \\r
+        dapl/common/dapl_rsp_create.c               \\r
+        dapl/common/dapl_rsp_free.c                 \\r
+        dapl/common/dapl_rsp_query.c                \\r
+        dapl/common/dapl_cno_util.c                 \\r
+        dapl/common/dapl_set_consumer_context.c     \\r
+        dapl/common/dapl_ring_buffer_util.c         \\r
+        dapl/common/dapl_name_service.c             \\r
+        dapl/common/dapl_timer_util.c               \\r
+        dapl/common/dapl_ep_create_with_srq.c       \\r
+        dapl/common/dapl_ep_recv_query.c            \\r
+        dapl/common/dapl_ep_set_watermark.c         \\r
+        dapl/common/dapl_srq_create.c               \\r
+        dapl/common/dapl_srq_free.c                 \\r
+        dapl/common/dapl_srq_query.c                \\r
+        dapl/common/dapl_srq_resize.c               \\r
+        dapl/common/dapl_srq_post_recv.c            \\r
+        dapl/common/dapl_srq_set_lw.c               \\r
+        dapl/common/dapl_srq_util.c                 \\r
+        dapl/common/dapl_debug.c                    \\r
+        dapl/common/dapl_ia_ha.c                    \\r
+        dapl/common/dapl_csp.c                      \\r
+        dapl/common/dapl_ep_post_send_invalidate.c  \\r
+        dapl/common/dapl_ep_post_rdma_read_to_rmr.c \\r
+        dapl/openib_common/mem.c                    \\r
+        dapl/openib_common/cq.c                     \\r
+        dapl/openib_common/qp.c                     \\r
+        dapl/openib_common/util.c                   \\r
+        dapl/openib_cma/cm.c                        \\r
+        dapl/openib_cma/device.c $(XPROGRAMS_CMA)\r
+\r
+dapl_udapl_libdaplofa_la_LDFLAGS = -version-info 2:0:0 $(daplofa_version_script) \\r
+                                  -Wl,-init,dapl_init -Wl,-fini,dapl_fini \\r
+                                  -lpthread -libverbs -lrdmacm \r
+                               \r
+#\r
+# uDAPL OpenFabrics Socket CM version: libdaplscm.so\r
+#\r
+dapl_udapl_libdaploscm_la_SOURCES = dapl/udapl/dapl_init.c \\r
+        dapl/udapl/dapl_evd_create.c               \\r
+        dapl/udapl/dapl_evd_query.c                \\r
+        dapl/udapl/dapl_cno_create.c               \\r
+        dapl/udapl/dapl_cno_modify_agent.c         \\r
+        dapl/udapl/dapl_cno_free.c                 \\r
+        dapl/udapl/dapl_cno_wait.c                 \\r
+        dapl/udapl/dapl_cno_query.c                \\r
+        dapl/udapl/dapl_lmr_create.c               \\r
+        dapl/udapl/dapl_evd_wait.c                 \\r
+        dapl/udapl/dapl_evd_disable.c              \\r
+        dapl/udapl/dapl_evd_enable.c               \\r
+        dapl/udapl/dapl_evd_modify_cno.c           \\r
+        dapl/udapl/dapl_evd_set_unwaitable.c       \\r
+        dapl/udapl/dapl_evd_clear_unwaitable.c     \\r
+        dapl/udapl/linux/dapl_osd.c                \\r
+        dapl/common/dapl_cookie.c                   \\r
+        dapl/common/dapl_cr_accept.c                \\r
+        dapl/common/dapl_cr_query.c                 \\r
+        dapl/common/dapl_cr_reject.c                \\r
+        dapl/common/dapl_cr_util.c                  \\r
+        dapl/common/dapl_cr_callback.c              \\r
+        dapl/common/dapl_cr_handoff.c               \\r
+        dapl/common/dapl_ep_connect.c               \\r
+        dapl/common/dapl_ep_create.c                \\r
+        dapl/common/dapl_ep_disconnect.c            \\r
+        dapl/common/dapl_ep_dup_connect.c           \\r
+        dapl/common/dapl_ep_free.c                  \\r
+        dapl/common/dapl_ep_reset.c                 \\r
+        dapl/common/dapl_ep_get_status.c            \\r
+        dapl/common/dapl_ep_modify.c                \\r
+        dapl/common/dapl_ep_post_rdma_read.c        \\r
+        dapl/common/dapl_ep_post_rdma_write.c       \\r
+        dapl/common/dapl_ep_post_recv.c             \\r
+        dapl/common/dapl_ep_post_send.c             \\r
+        dapl/common/dapl_ep_query.c                 \\r
+        dapl/common/dapl_ep_util.c                  \\r
+        dapl/common/dapl_evd_dequeue.c              \\r
+        dapl/common/dapl_evd_free.c                 \\r
+        dapl/common/dapl_evd_post_se.c              \\r
+        dapl/common/dapl_evd_resize.c               \\r
+        dapl/common/dapl_evd_util.c                 \\r
+        dapl/common/dapl_evd_cq_async_error_callb.c \\r
+        dapl/common/dapl_evd_qp_async_error_callb.c \\r
+        dapl/common/dapl_evd_un_async_error_callb.c \\r
+        dapl/common/dapl_evd_connection_callb.c     \\r
+        dapl/common/dapl_evd_dto_callb.c            \\r
+        dapl/common/dapl_get_consumer_context.c     \\r
+        dapl/common/dapl_get_handle_type.c          \\r
+        dapl/common/dapl_hash.c                     \\r
+        dapl/common/dapl_hca_util.c                 \\r
+        dapl/common/dapl_ia_close.c                 \\r
+        dapl/common/dapl_ia_open.c                  \\r
+        dapl/common/dapl_ia_query.c                 \\r
+        dapl/common/dapl_ia_util.c                  \\r
+        dapl/common/dapl_llist.c                    \\r
+        dapl/common/dapl_lmr_free.c                 \\r
+        dapl/common/dapl_lmr_query.c                \\r
+        dapl/common/dapl_lmr_util.c                 \\r
+        dapl/common/dapl_lmr_sync_rdma_read.c       \\r
+        dapl/common/dapl_lmr_sync_rdma_write.c      \\r
+        dapl/common/dapl_mr_util.c                  \\r
+        dapl/common/dapl_provider.c                 \\r
+        dapl/common/dapl_sp_util.c                  \\r
+        dapl/common/dapl_psp_create.c               \\r
+        dapl/common/dapl_psp_create_any.c           \\r
+        dapl/common/dapl_psp_free.c                 \\r
+        dapl/common/dapl_psp_query.c                \\r
+        dapl/common/dapl_pz_create.c                \\r
+        dapl/common/dapl_pz_free.c                  \\r
+        dapl/common/dapl_pz_query.c                 \\r
+        dapl/common/dapl_pz_util.c                  \\r
+        dapl/common/dapl_rmr_create.c               \\r
+        dapl/common/dapl_rmr_free.c                 \\r
+        dapl/common/dapl_rmr_bind.c                 \\r
+        dapl/common/dapl_rmr_query.c                \\r
+        dapl/common/dapl_rmr_util.c                 \\r
+        dapl/common/dapl_rsp_create.c               \\r
+        dapl/common/dapl_rsp_free.c                 \\r
+        dapl/common/dapl_rsp_query.c                \\r
+        dapl/common/dapl_cno_util.c                 \\r
+        dapl/common/dapl_set_consumer_context.c     \\r
+        dapl/common/dapl_ring_buffer_util.c         \\r
+        dapl/common/dapl_name_service.c             \\r
+        dapl/common/dapl_timer_util.c               \\r
+        dapl/common/dapl_ep_create_with_srq.c       \\r
+        dapl/common/dapl_ep_recv_query.c            \\r
+        dapl/common/dapl_ep_set_watermark.c         \\r
+        dapl/common/dapl_srq_create.c               \\r
+        dapl/common/dapl_srq_free.c                 \\r
+        dapl/common/dapl_srq_query.c                \\r
+        dapl/common/dapl_srq_resize.c               \\r
+        dapl/common/dapl_srq_post_recv.c            \\r
+        dapl/common/dapl_srq_set_lw.c               \\r
+        dapl/common/dapl_srq_util.c                 \\r
+        dapl/common/dapl_debug.c                    \\r
+        dapl/common/dapl_ia_ha.c                    \\r
+        dapl/common/dapl_csp.c                      \\r
+        dapl/common/dapl_ep_post_send_invalidate.c  \\r
+        dapl/common/dapl_ep_post_rdma_read_to_rmr.c \\r
+        dapl/openib_common/mem.c                    \\r
+        dapl/openib_common/cq.c                     \\r
+        dapl/openib_common/qp.c                     \\r
+        dapl/openib_common/util.c                   \\r
+        dapl/openib_scm/cm.c                        \\r
+        dapl/openib_scm/device.c $(XPROGRAMS_SCM)\r
+\r
+dapl_udapl_libdaploscm_la_LDFLAGS = -version-info 2:0:0 $(daploscm_version_script) \\r
+                                   -Wl,-init,dapl_init -Wl,-fini,dapl_fini \\r
+                                   -lpthread -libverbs\r
+\r
+libdatincludedir = $(includedir)/dat2\r
+\r
+libdatinclude_HEADERS = dat/include/dat2/dat.h \\r
+                       dat/include/dat2/dat_error.h \\r
+                       dat/include/dat2/dat_platform_specific.h \\r
+                       dat/include/dat2/dat_redirection.h \\r
+                       dat/include/dat2/dat_registry.h \\r
+                       dat/include/dat2/dat_vendor_specific.h \\r
+                       dat/include/dat2/udat_config.h \\r
+                       dat/include/dat2/udat.h \\r
+                       dat/include/dat2/udat_redirection.h \\r
+                       dat/include/dat2/udat_vendor_specific.h \\r
+                       dat/include/dat2/dat_ib_extensions.h \r
+               \r
+man_MANS = man/dtest.1 man/dapltest.1 man/dat.conf.5 \r
+       \r
+EXTRA_DIST = dat/common/dat_dictionary.h \\r
+            dat/common/dat_dr.h \\r
+            dat/common/dat_init.h \\r
+            dat/common/dat_sr.h \\r
+            dat/udat/udat_sr_parser.h \\r
+            dat/udat/linux/dat_osd.h \\r
+            dat/include/dat2/dat.h \\r
+            dat/include/dat2/dat_error.h \\r
+            dat/include/dat2/dat_platform_specific.h \\r
+            dat/include/dat2/dat_redirection.h \\r
+            dat/include/dat2/dat_registry.h \\r
+            dat/include/dat2/dat_vendor_specific.h \\r
+            dat/include/dat2/udat_config.h \\r
+            dat/include/dat2/udat.h \\r
+            dat/include/dat2/udat_redirection.h \\r
+            dat/include/dat2/udat_vendor_specific.h \\r
+            dapl/common/dapl_adapter_util.h \\r
+            dapl/common/dapl_cno_util.h \\r
+            dapl/common/dapl_cookie.h \\r
+            dapl/common/dapl_cr_util.h \\r
+            dapl/common/dapl_ep_util.h \\r
+            dapl/common/dapl_evd_util.h \\r
+            dapl/common/dapl_hash.h \\r
+            dapl/common/dapl_hca_util.h \\r
+            dapl/common/dapl_ia_util.h \\r
+            dapl/common/dapl_init.h \\r
+            dapl/common/dapl_lmr_util.h \\r
+            dapl/common/dapl_mr_util.h \\r
+            dapl/common/dapl_name_service.h \\r
+            dapl/common/dapl_provider.h \\r
+            dapl/common/dapl_pz_util.h \\r
+            dapl/common/dapl_ring_buffer_util.h \\r
+            dapl/common/dapl_rmr_util.h \\r
+            dapl/common/dapl_sp_util.h \\r
+            dapl/common/dapl_srq_util.h \\r
+            dapl/common/dapl_timer_util.h \\r
+            dapl/udapl/linux/dapl_osd.h \\r
+            dapl/include/dapl.h \\r
+            dapl/include/dapl_debug.h \\r
+            dapl/include/dapl_ipoib_names.h \\r
+            dapl/include/dapl_vendor.h \\r
+            dapl/openib_common/dapl_ib_dto.h \\r
+            dapl/openib_common/dapl_ib_common.h \\r
+            dapl/openib_cma/dapl_ib_util.h \\r
+            dapl/openib_cma/linux/openib_osd.h \\r
+            dapl/openib_scm/dapl_ib_util.h \\r
+            dapl/openib_scm/linux/openib_osd.h \\r
+            dat/udat/libdat2.map \\r
+            dapl/udapl/libdaplofa.map \\r
+            dapl/udapl/libdaploscm.map \\r
+            dapl.spec.in \\r
+            $(man_MANS) \\r
+            test/dapltest/include/dapl_bpool.h \\r
+            test/dapltest/include/dapl_client_info.h \\r
+            test/dapltest/include/dapl_common.h \\r
+            test/dapltest/include/dapl_execute.h \\r
+            test/dapltest/include/dapl_fft_cmd.h \\r
+            test/dapltest/include/dapl_fft_util.h \\r
+            test/dapltest/include/dapl_getopt.h \\r
+            test/dapltest/include/dapl_global.h \\r
+            test/dapltest/include/dapl_limit_cmd.h \\r
+            test/dapltest/include/dapl_mdep.h \\r
+            test/dapltest/include/dapl_memlist.h \\r
+            test/dapltest/include/dapl_params.h \\r
+            test/dapltest/include/dapl_performance_cmd.h \\r
+            test/dapltest/include/dapl_performance_stats.h \\r
+            test/dapltest/include/dapl_performance_test.h \\r
+            test/dapltest/include/dapl_proto.h \\r
+            test/dapltest/include/dapl_quit_cmd.h \\r
+            test/dapltest/include/dapl_server_cmd.h \\r
+            test/dapltest/include/dapl_server_info.h \\r
+            test/dapltest/include/dapl_tdep.h \\r
+            test/dapltest/include/dapl_tdep_print.h \\r
+            test/dapltest/include/dapl_test_data.h \\r
+            test/dapltest/include/dapl_transaction_cmd.h \\r
+            test/dapltest/include/dapl_transaction_stats.h \\r
+            test/dapltest/include/dapl_transaction_test.h \\r
+            test/dapltest/include/dapl_version.h \\r
+            test/dapltest/mdep/linux/dapl_mdep_user.h\r
+        \r
+dist-hook: dapl.spec \r
+       cp dapl.spec $(distdir)\r
+       \r
+install-exec-hook:\r
+       if ! test -d $(DESTDIR)$(sysconfdir); then \\r
+               mkdir -p $(DESTDIR)$(sysconfdir); \\r
+       fi; \\r
+       if test -e $(DESTDIR)$(sysconfdir)/dat.conf; then \\r
+               sed -e '/ofa-v2-.* u2/d' < $(DESTDIR)$(sysconfdir)/dat.conf > /tmp/$$$$ofadapl; \\r
+               cp /tmp/$$$$ofadapl $(DESTDIR)$(sysconfdir)/dat.conf; \\r
+       fi; \\r
+       echo ofa-v2-ib0 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"ib0 0" ""' >> $(DESTDIR)$(sysconfdir)/dat.conf; \\r
+       echo ofa-v2-ib1 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"ib1 0" ""' >> $(DESTDIR)$(sysconfdir)/dat.conf; \\r
+       echo ofa-v2-mthca0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mthca0 1" ""' >> $(DESTDIR)$(sysconfdir)/dat.conf; \\r
+       echo ofa-v2-mthca0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mthca0 2" ""' >> $(DESTDIR)$(sysconfdir)/dat.conf; \\r
+       echo ofa-v2-mlx4_0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mlx4_0 1" ""' >> $(DESTDIR)$(sysconfdir)/dat.conf; \\r
+       echo ofa-v2-mlx4_0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mlx4_0 2" ""' >> $(DESTDIR)$(sysconfdir)/dat.conf; \\r
+       echo ofa-v2-ipath0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"ipath0 1" ""' >> $(DESTDIR)$(sysconfdir)/dat.conf; \\r
+       echo ofa-v2-ipath0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"ipath0 2" ""' >> $(DESTDIR)$(sysconfdir)/dat.conf; \\r
+       echo ofa-v2-ehca0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"ehca0 1" ""' >> $(DESTDIR)$(sysconfdir)/dat.conf; \\r
+       echo ofa-v2-iwarp u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"eth2 0" ""' >> $(DESTDIR)$(sysconfdir)/dat.conf;\r
+\r
+uninstall-hook:\r
+       if test -e $(DESTDIR)$(sysconfdir)/dat.conf; then \\r
+               sed -e '/ofa-v2-.* u2/d' < $(DESTDIR)$(sysconfdir)/dat.conf > /tmp/$$$$ofadapl; \\r
+               cp /tmp/$$$$ofadapl $(DESTDIR)$(sysconfdir)/dat.conf; \\r
+       fi;\r
+\r
+SUBDIRS = . test/dtest test/dapltest\r
index 930d67b60da43beb72ab907ebea50fbd14615082..3283dbc932321f7f4acedf502bbbda6a3f3c513a 100644 (file)
-dnl Process this file with autoconf to produce a configure script.
-
-AC_PREREQ(2.57)
-AC_INIT(dapl, 2.0.19, general@lists.openfabrics.org)
-AC_CONFIG_SRCDIR([dat/udat/udat.c])
-AC_CONFIG_AUX_DIR(config)
-AM_CONFIG_HEADER(config.h)
-AM_INIT_AUTOMAKE(dapl, 2.0.19)
-
-AM_PROG_LIBTOOL
-
-AC_ARG_ENABLE(libcheck, [  --disable-libcheck      do not test for presence of ib libraries],
-[       if test x$enableval = xno ; then
-                disable_libcheck=yes
-        fi
-])
-
-dnl Checks for programs
-AC_PROG_CC
-
-dnl Checks for libraries
-if test "$disable_libcheck" != "yes"
-then
-AC_CHECK_LIB(ibverbs, ibv_get_device_list, [],
-    AC_MSG_ERROR([ibv_get_device_list() not found.  libdapl requires libibverbs.]))
-fi
-
-dnl Checks for header files.
-if test "$disable_libcheck" != "yes"
-then
-AC_CHECK_HEADER(infiniband/verbs.h, [],
-    AC_MSG_ERROR([<infiniband/verbs.h> not found.  Is libibverbs installed?]))
-fi
-
-AC_CACHE_CHECK(whether ld accepts --version-script, ac_cv_version_script,
-    if test -n "`$LD --help < /dev/null 2>/dev/null | grep version-script`"; then
-        ac_cv_version_script=yes
-    else
-        ac_cv_version_script=no
-    fi)
-AM_CONDITIONAL(HAVE_LD_VERSION_SCRIPT, test "$ac_cv_version_script" = "yes")
-
-dnl Support debug mode build - if enable-debug provided the DEBUG variable is set 
-AC_ARG_ENABLE(debug,
-[  --enable-debug Turn on debug mode, default=off],
-[case "${enableval}" in
-  yes) debug=true ;;
-  no)  debug=false ;;
-  *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;;
-esac],[debug=false])
-AM_CONDITIONAL(DEBUG, test x$debug = xtrue)
-
-dnl Support ib_extension build - if enable-ext-type == ib 
-AC_ARG_ENABLE(ext-type,
-[  --enable-ext-type Enable extensions support for library: ib, none, default=ib],
- [ if   test "x$enableval" = "xib" ; then
-      ext_type=ib
-   elif test "x$enableval" = "xnone" ; then
-      ext_type=none
-   else
-      echo
-      echo "Error!"
-      echo "Unknown extension type' type"
-      exit -1
-   fi
- ],[ext_type=ib])
-AM_CONDITIONAL(EXT_TYPE_IB, test "$ext_type" = "ib")
-
-dnl Check for Redhat EL release 4
-AC_CACHE_CHECK(Check for RHEL4 system, ac_cv_rhel4,
-    if test -f /etc/redhat-release &&
-       test -n "`grep -e "release 4" /etc/redhat-release`"; then
-        ac_cv_rhel4=yes
-    else
-        ac_cv_rhel4=no
-    fi)
-AM_CONDITIONAL(OS_RHEL4, test "$ac_cv_rhel4" = "yes")
-
-dnl Check for Redhat EL release 5
-AC_CACHE_CHECK(Check for RHEL5 system, ac_cv_rhel5,
-    if test -f /etc/redhat-release &&
-       test -n "`grep -e "release 5" /etc/redhat-release`"; then
-        ac_cv_rhel5=yes
-    else
-        ac_cv_rhel5=no
-    fi)
-AM_CONDITIONAL(OS_RHEL5, test "$ac_cv_rhel5" = "yes")
-
-dnl Check for SuSE release 11
-AC_CACHE_CHECK(Check for SUSE_11 system, ac_cv_suse11,
-    if test -f /etc/SuSE-release &&
-       test -n "`grep -e "VERSION = 11" /etc/SuSE-release`"; then
-        ac_cv_suse11=yes
-    else
-        ac_cv_suse11=no
-    fi)
-AM_CONDITIONAL(OS_SUSE11, test "$ac_cv_suse11" = "yes")
-
-AC_CONFIG_FILES([Makefile test/dtest/Makefile test/dapltest/Makefile dapl.spec])
-
-AC_OUTPUT
+dnl Process this file with autoconf to produce a configure script.\r
+\r
+AC_PREREQ(2.57)\r
+AC_INIT(dapl, 2.0.20, general@lists.openfabrics.org)\r
+AC_CONFIG_SRCDIR([dat/udat/udat.c])\r
+AC_CONFIG_AUX_DIR(config)\r
+AM_CONFIG_HEADER(config.h)\r
+AM_INIT_AUTOMAKE(dapl, 2.0.20)\r
+\r
+AM_PROG_LIBTOOL\r
+\r
+AC_ARG_ENABLE(libcheck, [  --disable-libcheck      do not test for presence of ib libraries],\r
+[       if test x$enableval = xno ; then\r
+                disable_libcheck=yes\r
+        fi\r
+])\r
+\r
+dnl Checks for programs\r
+AC_PROG_CC\r
+\r
+dnl Checks for libraries\r
+if test "$disable_libcheck" != "yes"\r
+then\r
+AC_CHECK_LIB(ibverbs, ibv_get_device_list, [],\r
+    AC_MSG_ERROR([ibv_get_device_list() not found.  libdapl requires libibverbs.]))\r
+fi\r
+\r
+dnl Checks for header files.\r
+if test "$disable_libcheck" != "yes"\r
+then\r
+AC_CHECK_HEADER(infiniband/verbs.h, [],\r
+    AC_MSG_ERROR([<infiniband/verbs.h> not found.  Is libibverbs installed?]))\r
+fi\r
+\r
+AC_CACHE_CHECK(whether ld accepts --version-script, ac_cv_version_script,\r
+    if test -n "`$LD --help < /dev/null 2>/dev/null | grep version-script`"; then\r
+        ac_cv_version_script=yes\r
+    else\r
+        ac_cv_version_script=no\r
+    fi)\r
+AM_CONDITIONAL(HAVE_LD_VERSION_SCRIPT, test "$ac_cv_version_script" = "yes")\r
+\r
+dnl Support debug mode build - if enable-debug provided the DEBUG variable is set \r
+AC_ARG_ENABLE(debug,\r
+[  --enable-debug Turn on debug mode, default=off],\r
+[case "${enableval}" in\r
+  yes) debug=true ;;\r
+  no)  debug=false ;;\r
+  *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;;\r
+esac],[debug=false])\r
+AM_CONDITIONAL(DEBUG, test x$debug = xtrue)\r
+\r
+dnl Support ib_extension build - if enable-ext-type == ib \r
+AC_ARG_ENABLE(ext-type,\r
+[  --enable-ext-type Enable extensions support for library: ib, none, default=ib],\r
+ [ if   test "x$enableval" = "xib" ; then\r
+      ext_type=ib\r
+   elif test "x$enableval" = "xnone" ; then\r
+      ext_type=none\r
+   else\r
+      echo\r
+      echo "Error!"\r
+      echo "Unknown extension type' type"\r
+      exit -1\r
+   fi\r
+ ],[ext_type=ib])\r
+AM_CONDITIONAL(EXT_TYPE_IB, test "$ext_type" = "ib")\r
+\r
+dnl Check for Redhat EL release 4\r
+AC_CACHE_CHECK(Check for RHEL4 system, ac_cv_rhel4,\r
+    if test -f /etc/redhat-release &&\r
+       test -n "`grep -e "release 4" /etc/redhat-release`"; then\r
+        ac_cv_rhel4=yes\r
+    else\r
+        ac_cv_rhel4=no\r
+    fi)\r
+AM_CONDITIONAL(OS_RHEL4, test "$ac_cv_rhel4" = "yes")\r
+\r
+dnl Check for Redhat EL release 5\r
+AC_CACHE_CHECK(Check for RHEL5 system, ac_cv_rhel5,\r
+    if test -f /etc/redhat-release &&\r
+       test -n "`grep -e "release 5" /etc/redhat-release`"; then\r
+        ac_cv_rhel5=yes\r
+    else\r
+        ac_cv_rhel5=no\r
+    fi)\r
+AM_CONDITIONAL(OS_RHEL5, test "$ac_cv_rhel5" = "yes")\r
+\r
+dnl Check for SuSE release 11\r
+AC_CACHE_CHECK(Check for SUSE_11 system, ac_cv_suse11,\r
+    if test -f /etc/SuSE-release &&\r
+       test -n "`grep -e "VERSION = 11" /etc/SuSE-release`"; then\r
+        ac_cv_suse11=yes\r
+    else\r
+        ac_cv_suse11=no\r
+    fi)\r
+AM_CONDITIONAL(OS_SUSE11, test "$ac_cv_suse11" = "yes")\r
+\r
+AC_CONFIG_FILES([Makefile test/dtest/Makefile test/dapltest/Makefile dapl.spec])\r
+\r
+AC_OUTPUT\r
index 432785b222eaa99f65fab772c220ce3f2e67874c..2b74a22bde3abbbd092fa03348443f068c404684 100644 (file)
-# Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
-# Copyright (c) 2007, Intel Corporation. All rights reserved.
-#
-# This Software is licensed under one of the following licenses:
-#
-# 1) under the terms of the "Common Public License 1.0" a copy of which is
-#    in the file LICENSE.txt in the root directory. The license is also
-#    available from the Open Source Initiative, see
-#    http://www.opensource.org/licenses/cpl.php.
-#
-# 2) under the terms of the "The BSD License" a copy of which is in the file
-#    LICENSE2.txt in the root directory. The license is also available from
-#    the Open Source Initiative, see
-#    http://www.opensource.org/licenses/bsd-license.php.
-#
-# 3) under the terms of the "GNU General Public License (GPL) Version 2" a 
-#    copy of which is in the file LICENSE3.txt in the root directory. The 
-#    license is also available from the Open Source Initiative, see
-#    http://www.opensource.org/licenses/gpl-license.php.
-#
-# Licensee has the right to choose one of the above licenses.
-#
-# Redistributions of source code must retain the above copyright
-# notice and one of the license notices.
-#
-# Redistributions in binary form must reproduce both the above copyright
-# notice, one of the license notices in the documentation
-# and/or other materials provided with the distribution.
-#
-#
-# uDAT and uDAPL 2.0 Registry RPM SPEC file
-#
-# $Id: $
-Name: dapl
-Version: @VERSION@
-Release: 1%{?dist}
-Summary: A Library for userspace access to RDMA devices using OS Agnostic DAT APIs.
-
-Group: System Environment/Libraries
-License: Dual GPL/BSD/CPL
-Url: http://openfabrics.org/
-Source: http://www.openfabrics.org/downloads/%{name}/%{name}-%{version}.tar.gz
-BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
-Requires(post): /sbin/ldconfig
-Requires(postun): /sbin/ldconfig
-Requires(post): sed
-Requires(post): coreutils
-
-%description
-Along with the OpenFabrics kernel drivers, libdat and libdapl provides a userspace
-RDMA API that supports DAT 2.0 specification and IB transport extensions for
-atomic operations and rdma write with immediate data.
-
-%package devel
-Summary: Development files for the libdat and libdapl libraries
-Group: System Environment/Libraries
-
-%description devel
-Header files for libdat and libdapl library.
-
-%package devel-static
-Summary: Static development files for libdat and libdapl library
-Group: System Environment/Libraries
-%description devel-static
-Static libraries for libdat and libdapl library.
-
-%package utils
-Summary: Test suites for uDAPL library
-Group: System Environment/Libraries
-Requires: %{name} = %{version}-%{release}
-
-%description utils
-Useful test suites to validate uDAPL library API's.
-
-%prep
-%setup -q
-
-%build
-%configure --enable-ext-type=ib 
-make %{?_smp_mflags}
-
-%install
-rm -rf %{buildroot}
-make DESTDIR=%{buildroot} install
-# remove unpackaged files from the buildroot
-rm -f %{buildroot}%{_libdir}/*.la
-rm -f %{buildroot}%{_sysconfdir}/*.conf
-
-%clean
-rm -rf %{buildroot}
-
-%post 
-/sbin/ldconfig
-if [ -e %{_sysconfdir}/dat.conf ]; then
-    sed -e '/ofa-v2-.* u2/d' < %{_sysconfdir}/dat.conf > /tmp/$$ofadapl
-    mv /tmp/$$ofadapl %{_sysconfdir}/dat.conf
-fi
-echo ofa-v2-ib0 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"ib0 0" ""' >> %{_sysconfdir}/dat.conf
-echo ofa-v2-ib1 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"ib1 0" ""' >> %{_sysconfdir}/dat.conf
-echo ofa-v2-mthca0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mthca0 1" ""' >> %{_sysconfdir}/dat.conf
-echo ofa-v2-mthca0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mthca0 2" ""' >> %{_sysconfdir}/dat.conf
-echo ofa-v2-mlx4_0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mlx4_0 1" ""' >> %{_sysconfdir}/dat.conf
-echo ofa-v2-mlx4_0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mlx4_0 2" ""' >> %{_sysconfdir}/dat.conf
-echo ofa-v2-ipath0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"ipath0 1" ""' >> %{_sysconfdir}/dat.conf
-echo ofa-v2-ipath0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"ipath0 2" ""' >> %{_sysconfdir}/dat.conf
-echo ofa-v2-ehca0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"ehca0 1" ""' >> %{_sysconfdir}/dat.conf
-echo ofa-v2-iwarp u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"eth2 0" ""' >> %{_sysconfdir}/dat.conf
-
-%postun 
-/sbin/ldconfig
-if [ -e %{_sysconfdir}/dat.conf ]; then
-    sed -e '/ofa-v2-.* u2/d' < %{_sysconfdir}/dat.conf > /tmp/$$ofadapl
-    mv /tmp/$$ofadapl %{_sysconfdir}/dat.conf
-fi
-
-%files
-%defattr(-,root,root,-)
-%{_libdir}/libda*.so.*
-%doc AUTHORS README ChangeLog
-
-%files devel
-%defattr(-,root,root,-)
-%{_libdir}/*.so
-%dir %{_includedir}/dat2
-%{_includedir}/dat2/*
-
-%files devel-static
-%defattr(-,root,root,-)
-%{_libdir}/*.a
-
-%files utils
-%defattr(-,root,root,-)
-%{_bindir}/*
-%{_mandir}/man1/*.1*
-%{_mandir}/man5/*.5*
-
-%changelog
-* Thu Apr 30 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.19
-- DAT/DAPL Version 2.0.19 Release 1, OFED 1.4.1 GA Final 
-
-* Fri Apr 17 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.18
-- DAT/DAPL Version 2.0.18 Release 1, OFED 1.4.1 GA 
-
-* Tue Mar 31 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.17
-- DAT/DAPL Version 2.0.17 Release 1, OFED 1.4.1 GA
-
-* Mon Mar 16 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.16
-- DAT/DAPL Version 2.0.16 Release 1, OFED 1.4.1 
-
-* Fri Nov 07 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.15
-- DAT/DAPL Version 2.0.15 Release 1, OFED 1.4 GA
-
-* Fri Oct 03 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.14
-- DAT/DAPL Version 2.0.14 Release 1, OFED 1.4 rc3
-
-* Mon Sep 01 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.13
-- DAT/DAPL Version 2.0.13 Release 1, OFED 1.4 rc1
-
-* Thu Aug 21 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.12
-- DAT/DAPL Version 2.0.12 Release 1, OFED 1.4 beta
-
-* Sun Jul 20 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.11
-- DAT/DAPL Version 2.0.11 Release 1, IB UD extensions in SCM provider 
-
-* Tue Jun 23 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.10
-- DAT/DAPL Version 2.0.10 Release 1, socket CM provider 
-
-* Tue May 20 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.9
-- DAT/DAPL Version 2.0.9 Release 1, OFED 1.3.1 GA  
-
-* Thu May 1 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.8
-- DAT/DAPL Version 2.0.8 Release 1, OFED 1.3.1  
-
-* Thu Feb 14 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.7
-- DAT/DAPL Version 2.0.7 Release 1, OFED 1.3 GA 
-
-* Mon Feb 04 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.6
-- DAT/DAPL Version 2.0.6 Release 1, OFED 1.3 RC4
-
-* Tue Jan 29 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.5
-- DAT/DAPL Version 2.0.5 Release 1, OFED 1.3 RC3
-
-* Thu Jan 17 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.4
-- DAT/DAPL Version 2.0.4 Release 1, OFED 1.3 RC2
-
-* Tue Nov 20 2007 Arlin Davis <ardavis@ichips.intel.com> - 2.0.3
-- DAT/DAPL Version 2.0.3 Release 1
-
-* Tue Oct 30 2007 Arlin Davis <ardavis@ichips.intel.com> - 2.0.2
-- DAT/DAPL Version 2.0.2 Release 1
-
-* Tue Sep 18 2007 Arlin Davis <ardavis@ichips.intel.com> - 2.0.1-1
-- OFED 1.3-alpha, co-exist with DAT 1.2 library package.  
-
-* Wed Mar 7 2007 Arlin Davis <ardavis@ichips.intel.com> - 2.0.0.pre
-- Initial release of DAT 2.0 APIs, includes IB extensions 
+# Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.\r
+# Copyright (c) 2007, Intel Corporation. All rights reserved.\r
+#\r
+# This Software is licensed under one of the following licenses:\r
+#\r
+# 1) under the terms of the "Common Public License 1.0" a copy of which is\r
+#    in the file LICENSE.txt in the root directory. The license is also\r
+#    available from the Open Source Initiative, see\r
+#    http://www.opensource.org/licenses/cpl.php.\r
+#\r
+# 2) under the terms of the "The BSD License" a copy of which is in the file\r
+#    LICENSE2.txt in the root directory. The license is also available from\r
+#    the Open Source Initiative, see\r
+#    http://www.opensource.org/licenses/bsd-license.php.\r
+#\r
+# 3) under the terms of the "GNU General Public License (GPL) Version 2" a \r
+#    copy of which is in the file LICENSE3.txt in the root directory. The \r
+#    license is also available from the Open Source Initiative, see\r
+#    http://www.opensource.org/licenses/gpl-license.php.\r
+#\r
+# Licensee has the right to choose one of the above licenses.\r
+#\r
+# Redistributions of source code must retain the above copyright\r
+# notice and one of the license notices.\r
+#\r
+# Redistributions in binary form must reproduce both the above copyright\r
+# notice, one of the license notices in the documentation\r
+# and/or other materials provided with the distribution.\r
+#\r
+#\r
+# uDAT and uDAPL 2.0 Registry RPM SPEC file\r
+#\r
+# $Id: $\r
+Name: dapl\r
+Version: @VERSION@\r
+Release: 1%{?dist}\r
+Summary: A Library for userspace access to RDMA devices using OS Agnostic DAT APIs.\r
+\r
+Group: System Environment/Libraries\r
+License: Dual GPL/BSD/CPL\r
+Url: http://openfabrics.org/\r
+Source: http://www.openfabrics.org/downloads/%{name}/%{name}-%{version}.tar.gz\r
+BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)\r
+Requires(post): /sbin/ldconfig\r
+Requires(postun): /sbin/ldconfig\r
+Requires(post): sed\r
+Requires(post): coreutils\r
+\r
+%description\r
+Along with the OpenFabrics kernel drivers, libdat and libdapl provides a userspace\r
+RDMA API that supports DAT 2.0 specification and IB transport extensions for\r
+atomic operations and rdma write with immediate data.\r
+\r
+%package devel\r
+Summary: Development files for the libdat and libdapl libraries\r
+Group: System Environment/Libraries\r
+\r
+%description devel\r
+Header files for libdat and libdapl library.\r
+\r
+%package devel-static\r
+Summary: Static development files for libdat and libdapl library\r
+Group: System Environment/Libraries\r
\r
+%description devel-static\r
+Static libraries for libdat and libdapl library.\r
+\r
+%package utils\r
+Summary: Test suites for uDAPL library\r
+Group: System Environment/Libraries\r
+Requires: %{name} = %{version}-%{release}\r
+\r
+%description utils\r
+Useful test suites to validate uDAPL library API's.\r
+\r
+%prep\r
+%setup -q\r
+\r
+%build\r
+%configure --enable-ext-type=ib \r
+make %{?_smp_mflags}\r
+\r
+%install\r
+rm -rf %{buildroot}\r
+make DESTDIR=%{buildroot} install\r
+# remove unpackaged files from the buildroot\r
+rm -f %{buildroot}%{_libdir}/*.la\r
+rm -f %{buildroot}%{_sysconfdir}/*.conf\r
+\r
+%clean\r
+rm -rf %{buildroot}\r
+\r
+%post \r
+/sbin/ldconfig\r
+if [ -e %{_sysconfdir}/dat.conf ]; then\r
+    sed -e '/ofa-v2-.* u2/d' < %{_sysconfdir}/dat.conf > /tmp/$$ofadapl\r
+    mv /tmp/$$ofadapl %{_sysconfdir}/dat.conf\r
+fi\r
+echo ofa-v2-ib0 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"ib0 0" ""' >> %{_sysconfdir}/dat.conf\r
+echo ofa-v2-ib1 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"ib1 0" ""' >> %{_sysconfdir}/dat.conf\r
+echo ofa-v2-mthca0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mthca0 1" ""' >> %{_sysconfdir}/dat.conf\r
+echo ofa-v2-mthca0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mthca0 2" ""' >> %{_sysconfdir}/dat.conf\r
+echo ofa-v2-mlx4_0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mlx4_0 1" ""' >> %{_sysconfdir}/dat.conf\r
+echo ofa-v2-mlx4_0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"mlx4_0 2" ""' >> %{_sysconfdir}/dat.conf\r
+echo ofa-v2-ipath0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"ipath0 1" ""' >> %{_sysconfdir}/dat.conf\r
+echo ofa-v2-ipath0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"ipath0 2" ""' >> %{_sysconfdir}/dat.conf\r
+echo ofa-v2-ehca0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 '"ehca0 1" ""' >> %{_sysconfdir}/dat.conf\r
+echo ofa-v2-iwarp u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 '"eth2 0" ""' >> %{_sysconfdir}/dat.conf\r
+\r
+%postun \r
+/sbin/ldconfig\r
+if [ -e %{_sysconfdir}/dat.conf ]; then\r
+    sed -e '/ofa-v2-.* u2/d' < %{_sysconfdir}/dat.conf > /tmp/$$ofadapl\r
+    mv /tmp/$$ofadapl %{_sysconfdir}/dat.conf\r
+fi\r
+\r
+%files\r
+%defattr(-,root,root,-)\r
+%{_libdir}/libda*.so.*\r
+%doc AUTHORS README ChangeLog\r
+\r
+%files devel\r
+%defattr(-,root,root,-)\r
+%{_libdir}/*.so\r
+%dir %{_includedir}/dat2\r
+%{_includedir}/dat2/*\r
+\r
+%files devel-static\r
+%defattr(-,root,root,-)\r
+%{_libdir}/*.a\r
+\r
+%files utils\r
+%defattr(-,root,root,-)\r
+%{_bindir}/*\r
+%{_mandir}/man1/*.1*\r
+%{_mandir}/man5/*.5*\r
+\r
+%changelog\r
+* Fri Jun 19 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.20\r
+- DAT/DAPL Version 2.0.20 Release 1, OFED 1.4.1 + UD reject/scaling fixes \r
+\r
+* Thu Apr 30 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.19\r
+- DAT/DAPL Version 2.0.19 Release 1, OFED 1.4.1 GA Final \r
+\r
+* Fri Apr 17 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.18\r
+- DAT/DAPL Version 2.0.18 Release 1, OFED 1.4.1 GA \r
+\r
+* Tue Mar 31 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.17\r
+- DAT/DAPL Version 2.0.17 Release 1, OFED 1.4.1 GA\r
+\r
+* Mon Mar 16 2009 Arlin Davis <ardavis@ichips.intel.com> - 2.0.16\r
+- DAT/DAPL Version 2.0.16 Release 1, OFED 1.4.1 \r
+\r
+* Fri Nov 07 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.15\r
+- DAT/DAPL Version 2.0.15 Release 1, OFED 1.4 GA\r
+\r
+* Fri Oct 03 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.14\r
+- DAT/DAPL Version 2.0.14 Release 1, OFED 1.4 rc3\r
+\r
+* Mon Sep 01 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.13\r
+- DAT/DAPL Version 2.0.13 Release 1, OFED 1.4 rc1\r
+\r
+* Thu Aug 21 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.12\r
+- DAT/DAPL Version 2.0.12 Release 1, OFED 1.4 beta\r
+\r
+* Sun Jul 20 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.11\r
+- DAT/DAPL Version 2.0.11 Release 1, IB UD extensions in SCM provider \r
+\r
+* Tue Jun 23 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.10\r
+- DAT/DAPL Version 2.0.10 Release 1, socket CM provider \r
+\r
+* Tue May 20 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.9\r
+- DAT/DAPL Version 2.0.9 Release 1, OFED 1.3.1 GA  \r
+\r
+* Thu May 1 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.8\r
+- DAT/DAPL Version 2.0.8 Release 1, OFED 1.3.1  \r
+\r
+* Thu Feb 14 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.7\r
+- DAT/DAPL Version 2.0.7 Release 1, OFED 1.3 GA \r
+\r
+* Mon Feb 04 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.6\r
+- DAT/DAPL Version 2.0.6 Release 1, OFED 1.3 RC4\r
+\r
+* Tue Jan 29 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.5\r
+- DAT/DAPL Version 2.0.5 Release 1, OFED 1.3 RC3\r
+\r
+* Thu Jan 17 2008 Arlin Davis <ardavis@ichips.intel.com> - 2.0.4\r
+- DAT/DAPL Version 2.0.4 Release 1, OFED 1.3 RC2\r
+\r
+* Tue Nov 20 2007 Arlin Davis <ardavis@ichips.intel.com> - 2.0.3\r
+- DAT/DAPL Version 2.0.3 Release 1\r
+\r
+* Tue Oct 30 2007 Arlin Davis <ardavis@ichips.intel.com> - 2.0.2\r
+- DAT/DAPL Version 2.0.2 Release 1\r
+\r
+* Tue Sep 18 2007 Arlin Davis <ardavis@ichips.intel.com> - 2.0.1-1\r
+- OFED 1.3-alpha, co-exist with DAT 1.2 library package.  \r
+\r
+* Wed Mar 7 2007 Arlin Davis <ardavis@ichips.intel.com> - 2.0.0.pre\r
+- Initial release of DAT 2.0 APIs, includes IB extensions \r
index 76a841eaee45f549c73e78c9c641c82725bd148b..74ebd6ae2934f006d2a45541386838c235282b46 100644 (file)
-/*
- * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.
- *
- * This Software is licensed under one of the following licenses:
- *
- * 1) under the terms of the "Common Public License 1.0" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/cpl.php.
- *
- * 2) under the terms of the "The BSD License" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/bsd-license.php.
- *
- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
- *    copy of which is available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/gpl-license.php.
- *
- * Licensee has the right to choose one of the above licenses.
- *
- * Redistributions of source code must retain the above copyright
- * notice and one of the license notices.
- *
- * Redistributions in binary form must reproduce both the above copyright
- * notice, one of the license notices in the documentation
- * and/or other materials provided with the distribution.
- */
-
-/**********************************************************************
- * 
- * MODULE: dapl_cr_accept.c
- *
- * PURPOSE: Connection management
- * Description: Interfaces in this file are completely described in
- *             the DAPL 1.1 API, Chapter 6, section 4
- *
- * $Id:$
- **********************************************************************/
-
-#include "dapl.h"
-#include "dapl_adapter_util.h"
-#include "dapl_evd_util.h"
-
-/*
- * dapl_cr_accept
- *
- * DAPL Requirements Version xxx, 6.4.2.1
- *
- * Establish a connection between active remote side requesting Endpoint
- * and passic side local Endpoint.
- *
- * Input:
- *     cr_handle
- *     ep_handle
- *     private_data_size
- *     private_data
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INVALID_PARAMETER
- *     DAT_INVALID_ATTRIBUTE
- */
-DAT_RETURN DAT_API
-dapl_cr_accept(IN DAT_CR_HANDLE cr_handle,
-              IN DAT_EP_HANDLE ep_handle,
-              IN DAT_COUNT private_data_size, IN const DAT_PVOID private_data)
-{
-       DAPL_EP *ep_ptr;
-       DAT_RETURN dat_status;
-       DAPL_CR *cr_ptr;
-       DAT_EP_STATE entry_ep_state;
-       DAT_EP_HANDLE entry_ep_handle;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_API,
-                    "dapl_cr_accept (CR %p EP %p, PDsz %d PD %p)\n",
-                    cr_handle, ep_handle, private_data_size, private_data);
-
-       if (DAPL_BAD_HANDLE(cr_handle, DAPL_MAGIC_CR)) {
-               dat_status =
-                   DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_CR);
-               goto bail;
-       }
-
-       cr_ptr = (DAPL_CR *) cr_handle;
-
-       /*
-        * Return an error if we have an ep_handle and the CR already has an
-        * EP, indicating this is an RSP connection or PSP_PROVIDER_FLAG was
-        * specified.
-        */
-       if (ep_handle != NULL &&
-           (DAPL_BAD_HANDLE(ep_handle, DAPL_MAGIC_EP) ||
-            cr_ptr->param.local_ep_handle != NULL)) {
-               dat_status =
-                   DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP);
-               goto bail;
-       }
-
-       /* Make sure we have an EP handle in one place or another */
-       if (ep_handle == NULL && cr_ptr->param.local_ep_handle == NULL) {
-               dat_status =
-                   DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP);
-               goto bail;
-       }
-
-       if ((0 != private_data_size) && (NULL == private_data)) {
-               dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4);
-               goto bail;
-       }
-
-       /*
-        * ep_handle is NULL if the user specified DAT_PSP_PROVIDER_FLAG
-        * OR this is an RSP connection; retrieve it from the cr.
-        */
-       if (ep_handle == NULL) {
-               ep_handle = cr_ptr->param.local_ep_handle;
-               if (((((DAPL_EP *) ep_handle)->param.ep_state !=
-                     DAT_EP_STATE_TENTATIVE_CONNECTION_PENDING)
-                    && (((DAPL_EP *) ep_handle)->param.ep_state !=
-                        DAT_EP_STATE_PASSIVE_CONNECTION_PENDING))
-                   && (((DAPL_EP *) ep_handle)->param.ep_attr.service_type ==
-                       DAT_SERVICE_TYPE_RC)) {
-                       return DAT_INVALID_STATE;
-               }
-       } else {
-               /* ensure this EP isn't connected or in use */
-               if ((((DAPL_EP *) ep_handle)->param.ep_state !=
-                    DAT_EP_STATE_UNCONNECTED)
-                   && (((DAPL_EP *) ep_handle)->param.ep_attr.service_type ==
-                       DAT_SERVICE_TYPE_RC)) {
-                       return DAT_INVALID_STATE;
-               }
-       }
-
-       ep_ptr = (DAPL_EP *) ep_handle;
-
-       /*
-        * Verify the attributes of the EP handle before we connect it. Test
-        * all of the handles to make sure they are currently valid.
-        * Specifically:
-        *   pz_handle              required
-        *   recv_evd_handle        optional, but must be valid
-        *   request_evd_handle     optional, but must be valid
-        *   connect_evd_handle     required
-        * We do all verification and state change under lock, at which
-        * point the EP state should protect us from most races.
-        */
-       dapl_os_lock(&ep_ptr->header.lock);
-       if (ep_ptr->param.pz_handle == NULL
-           || DAPL_BAD_HANDLE(ep_ptr->param.pz_handle, DAPL_MAGIC_PZ)
-           /* test connect handle */
-           || ep_ptr->param.connect_evd_handle == NULL
-           || DAPL_BAD_HANDLE(ep_ptr->param.connect_evd_handle, DAPL_MAGIC_EVD)
-           || !(((DAPL_EVD *) ep_ptr->param.connect_evd_handle)->
-                evd_flags & DAT_EVD_CONNECTION_FLAG)
-           /* test optional completion handles */
-           || (ep_ptr->param.recv_evd_handle != DAT_HANDLE_NULL &&
-               (DAPL_BAD_HANDLE
-                (ep_ptr->param.recv_evd_handle, DAPL_MAGIC_EVD)))
-
-           || (ep_ptr->param.request_evd_handle != DAT_HANDLE_NULL &&
-               (DAPL_BAD_HANDLE
-                (ep_ptr->param.request_evd_handle, DAPL_MAGIC_EVD)))) {
-               dapl_os_unlock(&ep_ptr->header.lock);
-               dat_status =
-                   DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP);
-               goto bail;
-       }
-
-       /* The qp must be attached by this point! */
-       if (ep_ptr->qp_state == DAPL_QP_STATE_UNATTACHED) {
-               dapl_os_unlock(&ep_ptr->header.lock);
-               dat_status =
-                   DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP);
-               goto bail;
-       }
-
-       entry_ep_state = ep_ptr->param.ep_state;
-       entry_ep_handle = cr_ptr->param.local_ep_handle;
-       ep_ptr->param.ep_state = DAT_EP_STATE_COMPLETION_PENDING;
-       ep_ptr->cm_handle = cr_ptr->ib_cm_handle;
-       ep_ptr->cr_ptr = cr_ptr;
-       ep_ptr->param.remote_ia_address_ptr =
-           cr_ptr->param.remote_ia_address_ptr;
-       cr_ptr->param.local_ep_handle = ep_handle;
-
-       dapl_os_unlock(&ep_ptr->header.lock);
-
-       dat_status = dapls_ib_accept_connection(cr_handle,
-                                               ep_handle,
-                                               private_data_size,
-                                               private_data);
-
-       /*
-        * If the provider failed, unwind the damage so we are back at
-        * the initial state.
-        */
-       if (dat_status != DAT_SUCCESS) {
-               if (DAT_GET_TYPE(dat_status) == DAT_INVALID_ADDRESS) {
-                       /* The remote connection request has disappeared; timeout,
-                        * system error, app termination, perhaps other reasons.
-                        */
-                       dat_status =
-                           dapls_evd_post_connection_event(ep_ptr->param.
-                                                           connect_evd_handle,
-                                                           DAT_CONNECTION_EVENT_ACCEPT_COMPLETION_ERROR,
-                                                           (DAT_HANDLE) ep_ptr,
-                                                           0, 0);
-
-                       cr_ptr->header.magic = DAPL_MAGIC_CR_DESTROYED;
-               } else {
-                       ep_ptr->param.ep_state = entry_ep_state;
-                       cr_ptr->param.local_ep_handle = entry_ep_handle;
-                       ep_ptr->cr_ptr = NULL;
-                       ep_ptr->param.remote_ia_address_ptr = NULL;
-               }
-
-               /*
-                * After restoring values above, we now check if we need
-                * to translate the error
-                */
-               if (DAT_GET_TYPE(dat_status) == DAT_LENGTH_ERROR) {
-                       dat_status =
-                           DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3);
-               }
-
-       } else {
-               /* Make this CR invalid. We need to hang on to it until
-                * the connection terminates, but it's destroyed from
-                * the app point of view.
-                */
-               cr_ptr->header.magic = DAPL_MAGIC_CR_DESTROYED;
-       }
-
-      bail:
-       return dat_status;
-}
-
-/*
- * Local variables:
- *  c-indent-level: 4
- *  c-basic-offset: 4
- *  tab-width: 8
- * End:
- */
+/*\r
+ * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.\r
+ *\r
+ * This Software is licensed under one of the following licenses:\r
+ *\r
+ * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
+ *    available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/cpl.php.\r
+ *\r
+ * 2) under the terms of the "The BSD License" a copy of which is\r
+ *    available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/bsd-license.php.\r
+ *\r
+ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
+ *    copy of which is available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/gpl-license.php.\r
+ *\r
+ * Licensee has the right to choose one of the above licenses.\r
+ *\r
+ * Redistributions of source code must retain the above copyright\r
+ * notice and one of the license notices.\r
+ *\r
+ * Redistributions in binary form must reproduce both the above copyright\r
+ * notice, one of the license notices in the documentation\r
+ * and/or other materials provided with the distribution.\r
+ */\r
+\r
+/**********************************************************************\r
+ * \r
+ * MODULE: dapl_cr_accept.c\r
+ *\r
+ * PURPOSE: Connection management\r
+ * Description: Interfaces in this file are completely described in\r
+ *             the DAPL 1.1 API, Chapter 6, section 4\r
+ *\r
+ * $Id:$\r
+ **********************************************************************/\r
+\r
+#include "dapl.h"\r
+#include "dapl_adapter_util.h"\r
+#include "dapl_evd_util.h"\r
+\r
+/*\r
+ * dapl_cr_accept\r
+ *\r
+ * DAPL Requirements Version xxx, 6.4.2.1\r
+ *\r
+ * Establish a connection between active remote side requesting Endpoint\r
+ * and passic side local Endpoint.\r
+ *\r
+ * Input:\r
+ *     cr_handle\r
+ *     ep_handle\r
+ *     private_data_size\r
+ *     private_data\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_INVALID_PARAMETER\r
+ *     DAT_INVALID_ATTRIBUTE\r
+ */\r
+DAT_RETURN DAT_API\r
+dapl_cr_accept(IN DAT_CR_HANDLE cr_handle,\r
+              IN DAT_EP_HANDLE ep_handle,\r
+              IN DAT_COUNT private_data_size, IN const DAT_PVOID private_data)\r
+{\r
+       DAPL_EP *ep_ptr;\r
+       DAT_RETURN dat_status;\r
+       DAPL_CR *cr_ptr;\r
+       DAT_EP_STATE entry_ep_state;\r
+       DAT_EP_HANDLE entry_ep_handle;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_API,\r
+                    "dapl_cr_accept (CR %p EP %p, PDsz %d PD %p)\n",\r
+                    cr_handle, ep_handle, private_data_size, private_data);\r
+\r
+       if (DAPL_BAD_HANDLE(cr_handle, DAPL_MAGIC_CR)) {\r
+               dat_status =\r
+                   DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_CR);\r
+               goto bail;\r
+       }\r
+\r
+       cr_ptr = (DAPL_CR *) cr_handle;\r
+\r
+       /*\r
+        * Return an error if we have an ep_handle and the CR already has an\r
+        * EP, indicating this is an RSP connection or PSP_PROVIDER_FLAG was\r
+        * specified.\r
+        */\r
+       if (ep_handle != NULL &&\r
+           (DAPL_BAD_HANDLE(ep_handle, DAPL_MAGIC_EP) ||\r
+            cr_ptr->param.local_ep_handle != NULL)) {\r
+               dat_status =\r
+                   DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP);\r
+               goto bail;\r
+       }\r
+\r
+       /* Make sure we have an EP handle in one place or another */\r
+       if (ep_handle == NULL && cr_ptr->param.local_ep_handle == NULL) {\r
+               dat_status =\r
+                   DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP);\r
+               goto bail;\r
+       }\r
+\r
+       if ((0 != private_data_size) && (NULL == private_data)) {\r
+               dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4);\r
+               goto bail;\r
+       }\r
+\r
+       /*\r
+        * ep_handle is NULL if the user specified DAT_PSP_PROVIDER_FLAG\r
+        * OR this is an RSP connection; retrieve it from the cr.\r
+        */\r
+       if (ep_handle == NULL) {\r
+               ep_handle = cr_ptr->param.local_ep_handle;\r
+               if (((((DAPL_EP *) ep_handle)->param.ep_state !=\r
+                     DAT_EP_STATE_TENTATIVE_CONNECTION_PENDING)\r
+                    && (((DAPL_EP *) ep_handle)->param.ep_state !=\r
+                        DAT_EP_STATE_PASSIVE_CONNECTION_PENDING))\r
+                   && (((DAPL_EP *) ep_handle)->param.ep_attr.service_type ==\r
+                       DAT_SERVICE_TYPE_RC)) {\r
+                       return DAT_INVALID_STATE;\r
+               }\r
+       } else {\r
+               /* ensure this EP isn't connected or in use */\r
+               if ((((DAPL_EP *) ep_handle)->param.ep_state !=\r
+                    DAT_EP_STATE_UNCONNECTED)\r
+                   && (((DAPL_EP *) ep_handle)->param.ep_attr.service_type ==\r
+                       DAT_SERVICE_TYPE_RC)) {\r
+                       return DAT_INVALID_STATE;\r
+               }\r
+       }\r
+\r
+       ep_ptr = (DAPL_EP *) ep_handle;\r
+\r
+       /*\r
+        * Verify the attributes of the EP handle before we connect it. Test\r
+        * all of the handles to make sure they are currently valid.\r
+        * Specifically:\r
+        *   pz_handle              required\r
+        *   recv_evd_handle        optional, but must be valid\r
+        *   request_evd_handle     optional, but must be valid\r
+        *   connect_evd_handle     required\r
+        * We do all verification and state change under lock, at which\r
+        * point the EP state should protect us from most races.\r
+        */\r
+       dapl_os_lock(&ep_ptr->header.lock);\r
+       if (ep_ptr->param.pz_handle == NULL\r
+           || DAPL_BAD_HANDLE(ep_ptr->param.pz_handle, DAPL_MAGIC_PZ)\r
+           /* test connect handle */\r
+           || ep_ptr->param.connect_evd_handle == NULL\r
+           || DAPL_BAD_HANDLE(ep_ptr->param.connect_evd_handle, DAPL_MAGIC_EVD)\r
+           || !(((DAPL_EVD *) ep_ptr->param.connect_evd_handle)->\r
+                evd_flags & DAT_EVD_CONNECTION_FLAG)\r
+           /* test optional completion handles */\r
+           || (ep_ptr->param.recv_evd_handle != DAT_HANDLE_NULL &&\r
+               (DAPL_BAD_HANDLE\r
+                (ep_ptr->param.recv_evd_handle, DAPL_MAGIC_EVD)))\r
+\r
+           || (ep_ptr->param.request_evd_handle != DAT_HANDLE_NULL &&\r
+               (DAPL_BAD_HANDLE\r
+                (ep_ptr->param.request_evd_handle, DAPL_MAGIC_EVD)))) {\r
+               dapl_os_unlock(&ep_ptr->header.lock);\r
+               dat_status =\r
+                   DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP);\r
+               goto bail;\r
+       }\r
+\r
+       /* The qp must be attached by this point! */\r
+       if (ep_ptr->qp_state == DAPL_QP_STATE_UNATTACHED) {\r
+               dapl_os_unlock(&ep_ptr->header.lock);\r
+               dat_status =\r
+                   DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP);\r
+               goto bail;\r
+       }\r
+\r
+       entry_ep_state = ep_ptr->param.ep_state;\r
+       entry_ep_handle = cr_ptr->param.local_ep_handle;\r
+       ep_ptr->param.ep_state = DAT_EP_STATE_COMPLETION_PENDING;\r
+       ep_ptr->cr_ptr = cr_ptr;\r
+       ep_ptr->param.remote_ia_address_ptr =\r
+           cr_ptr->param.remote_ia_address_ptr;\r
+       cr_ptr->param.local_ep_handle = ep_handle;\r
+\r
+       dapl_os_unlock(&ep_ptr->header.lock);\r
+\r
+       dat_status = dapls_ib_accept_connection(cr_handle,\r
+                                               ep_handle,\r
+                                               private_data_size,\r
+                                               private_data);\r
+\r
+       /*\r
+        * If the provider failed, unwind the damage so we are back at\r
+        * the initial state.\r
+        */\r
+       if (dat_status != DAT_SUCCESS) {\r
+               if (DAT_GET_TYPE(dat_status) == DAT_INVALID_ADDRESS) {\r
+                       /* The remote connection request has disappeared; timeout,\r
+                        * system error, app termination, perhaps other reasons.\r
+                        */\r
+                       dat_status =\r
+                           dapls_evd_post_connection_event(ep_ptr->param.\r
+                                                           connect_evd_handle,\r
+                                                           DAT_CONNECTION_EVENT_ACCEPT_COMPLETION_ERROR,\r
+                                                           (DAT_HANDLE) ep_ptr,\r
+                                                           0, 0);\r
+\r
+                       cr_ptr->header.magic = DAPL_MAGIC_CR_DESTROYED;\r
+               } else {\r
+                       ep_ptr->param.ep_state = entry_ep_state;\r
+                       cr_ptr->param.local_ep_handle = entry_ep_handle;\r
+                       ep_ptr->cr_ptr = NULL;\r
+                       ep_ptr->param.remote_ia_address_ptr = NULL;\r
+               }\r
+\r
+               /*\r
+                * After restoring values above, we now check if we need\r
+                * to translate the error\r
+                */\r
+               if (DAT_GET_TYPE(dat_status) == DAT_LENGTH_ERROR) {\r
+                       dat_status =\r
+                           DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3);\r
+               }\r
+\r
+       } else {\r
+               /* Make this CR invalid. We need to hang on to it until\r
+                * the connection terminates, but it's destroyed from\r
+                * the app point of view.\r
+                */\r
+               cr_ptr->header.magic = DAPL_MAGIC_CR_DESTROYED;\r
+       }\r
+\r
+      bail:\r
+       return dat_status;\r
+}\r
+\r
+/*\r
+ * Local variables:\r
+ *  c-indent-level: 4\r
+ *  c-basic-offset: 4\r
+ *  tab-width: 8\r
+ * End:\r
+ */\r
index 672321789279262c3d50489580d5ace3caa379d3..960bc0085c26701b0adae065ba14e32e8631fe3f 100644 (file)
@@ -198,7 +198,6 @@ char *dapl_query_counter_name(DAT_HANDLE dh, int counter)
        return NULL;
 }
 
-#include <inttypes.h>
 void dapl_print_counter(DAT_HANDLE dh, int counter, int reset)
 {
        int i, max;
@@ -232,6 +231,12 @@ void dapl_print_counter(DAT_HANDLE dh, int counter, int reset)
                                p_cntrs[i] = 0;
                }
        }
+
+       /* Print in process CR's for this IA, if debug type set */
+       if ((type == DAT_HANDLE_TYPE_IA) && 
+           (g_dapl_dbg_type & DAPL_DBG_TYPE_CM_LIST)) {
+               dapls_print_cm_list((DAPL_IA*)dh);
+       }
        return;
 }
 
index e865dfbd40daeb74cfebdc9272ab313f3f1141a2..e721ef5c9b2d3150460ef9ef21e9468ac8fa1161 100644 (file)
@@ -1 +1 @@
-DIRS = ibal openib_scm openib_cma
+DIRS = ibal openib_common openib_scm openib_cma 
index bb823d96110525e2e8a35408f45f913eae8f39f2..37edf90d0efff87add4a13cee8e6f2ed26efab07 100644 (file)
@@ -65,7 +65,9 @@ typedef enum
     DAPL_DBG_TYPE_RTN          = 0x0200,
     DAPL_DBG_TYPE_EXCEPTION    = 0x0400,
     DAPL_DBG_TYPE_SRQ          = 0x0800,
-    DAPL_DBG_TYPE_CNTR         = 0x1000
+    DAPL_DBG_TYPE_CNTR         = 0x1000,
+    DAPL_DBG_TYPE_CM_LIST      = 0x2000,
+    DAPL_DBG_TYPE_THREAD       = 0x4000
 
 } DAPL_DBG_TYPE;
 
index fd67d07591ebb2b5ec2be80e623bd36db98e70b0..d6b97a2d1c05463361871c212df9f1ec0838a2e7 100644 (file)
@@ -18,21 +18,18 @@ USE_MSVCRT = 1
 \r
 SOURCES = \\r
        udapl.rc \\r
-       ..\dapl_common_src.c    \\r
-       ..\dapl_udapl_src.c             \\r
-       dapl_ib_cq.c                    \\r
-       dapl_ib_extensions.c    \\r
-       dapl_ib_mem.c                   \\r
-       dapl_ib_qp.c                    \\r
-       dapl_ib_util.c                  \\r
-       dapl_ib_cm.c\r
-\r
-INCLUDES = ..\include;..\common;windows;..\..\dat\include;\\r
+       ..\dapl_common_src.c                    \\r
+       ..\dapl_udapl_src.c                     \\r
+       ..\openib_common.c                      \\r
+       device.c                                \\r
+       cm.c\r
+\r
+INCLUDES = ..\include;..\openib_common;..\common;windows;..\..\dat\include;\\r
                   ..\..\dat\udat\windows;..\udapl\windows;\\r
                   ..\..\..\..\inc;..\..\..\..\inc\user;..\..\..\libibverbs\include;\\r
                   ..\..\..\librdmacm\include\r
 \r
-DAPL_OPTS = -DEXPORT_DAPL_SYMBOLS -DDAT_EXTENSIONS -DOPENIB\r
+DAPL_OPTS = -DEXPORT_DAPL_SYMBOLS -DDAT_EXTENSIONS -DOPENIB -DCQ_WAIT_OBJECT #-DDAPL_COUNTERS\r
 \r
 USER_C_FLAGS = $(USER_C_FLAGS) $(DAPL_OPTS)\r
 \r
diff --git a/branches/winverbs/ulp/dapl2/dapl/openib_cma/cm.c b/branches/winverbs/ulp/dapl2/dapl/openib_cma/cm.c
new file mode 100644 (file)
index 0000000..5631fe7
--- /dev/null
@@ -0,0 +1,1340 @@
+/*\r
+ * Copyright (c) 2005 Voltaire Inc.  All rights reserved.\r
+ * Copyright (c) 2005-2007 Intel Corporation. All rights reserved.\r
+ * Copyright (c) 2004-2005, Mellanox Technologies, Inc. All rights reserved. \r
+ * Copyright (c) 2003 Topspin Corporation.  All rights reserved. \r
+ * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.\r
+ *\r
+ * This Software is licensed under one of the following licenses:\r
+ *\r
+ * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
+ *    available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/cpl.php.\r
+ *\r
+ * 2) under the terms of the "The BSD License" a copy of which is\r
+ *    available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/bsd-license.php.\r
+ *\r
+ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
+ *    copy of which is available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/gpl-license.php.\r
+ *\r
+ * Licensee has the right to choose one of the above licenses.\r
+ *\r
+ * Redistributions of source code must retain the above copyright\r
+ * notice and one of the license notices.\r
+ *\r
+ * Redistributions in binary form must reproduce both the above copyright\r
+ * notice, one of the license notices in the documentation\r
+ * and/or other materials provided with the distribution.\r
+ */\r
+\r
+/**********************************************************************\r
+ *\r
+ * MODULE: dapl_ib_cm.c\r
+ *\r
+ * PURPOSE: The OFED provider - uCMA, name and route resolution\r
+ *\r
+ * $Id: $\r
+ *\r
+ **********************************************************************/\r
+\r
+#include "dapl.h"\r
+#include "dapl_adapter_util.h"\r
+#include "dapl_evd_util.h"\r
+#include "dapl_cr_util.h"\r
+#include "dapl_name_service.h"\r
+#include "dapl_ib_util.h"\r
+#include "dapl_vendor.h"\r
+#include "dapl_osd.h"\r
+\r
+extern struct rdma_event_channel *g_cm_events;\r
+\r
+/* local prototypes */\r
+static struct dapl_cm_id *dapli_req_recv(struct dapl_cm_id *conn,\r
+                                        struct rdma_cm_event *event);\r
+static void dapli_cm_active_cb(struct dapl_cm_id *conn,\r
+                              struct rdma_cm_event *event);\r
+static void dapli_cm_passive_cb(struct dapl_cm_id *conn,\r
+                               struct rdma_cm_event *event);\r
+static void dapli_addr_resolve(struct dapl_cm_id *conn);\r
+static void dapli_route_resolve(struct dapl_cm_id *conn);\r
+\r
+/* cma requires 16 bit SID, in network order */\r
+#define IB_PORT_MOD 32001\r
+#define IB_PORT_BASE (65535 - IB_PORT_MOD)\r
+#define SID_TO_PORT(SID) \\r
+    (SID > 0xffff ? \\r
+    htons((unsigned short)((SID % IB_PORT_MOD) + IB_PORT_BASE)) :\\r
+    htons((unsigned short)SID))\r
+\r
+#define PORT_TO_SID(p) ntohs(p)\r
+\r
+/* private data header to validate consumer rejects versus abnormal events */\r
+struct dapl_pdata_hdr {\r
+       DAT_UINT32 version;\r
+};\r
+\r
+static void dapli_addr_resolve(struct dapl_cm_id *conn)\r
+{\r
+       int ret;\r
+#ifdef DAPL_DBG\r
+       struct rdma_addr *ipaddr = &conn->cm_id->route.addr;\r
+#endif\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                    " addr_resolve: cm_id %p SRC %x DST %x\n",\r
+                    conn->cm_id, ntohl(((struct sockaddr_in *)\r
+                                        &ipaddr->src_addr)->sin_addr.s_addr),\r
+                    ntohl(((struct sockaddr_in *)\r
+                           &ipaddr->dst_addr)->sin_addr.s_addr));\r
+\r
+       ret = rdma_resolve_route(conn->cm_id, conn->route_timeout);\r
+       if (ret) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " dapl_cma_connect: rdma_resolve_route ERR 0x%x %s\n",\r
+                        ret, strerror(errno));\r
+               dapl_evd_connection_callback(conn,\r
+                                            IB_CME_LOCAL_FAILURE,\r
+                                            NULL, conn->ep);\r
+       }\r
+}\r
+\r
+static void dapli_route_resolve(struct dapl_cm_id *conn)\r
+{\r
+       int ret;\r
+#ifdef DAPL_DBG\r
+       struct rdma_addr *ipaddr = &conn->cm_id->route.addr;\r
+       struct ib_addr *ibaddr = &conn->cm_id->route.addr.addr.ibaddr;\r
+#endif\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                    " route_resolve: cm_id %p SRC %x DST %x PORT %d\n",\r
+                    conn->cm_id, ntohl(((struct sockaddr_in *)\r
+                                        &ipaddr->src_addr)->sin_addr.s_addr),\r
+                    ntohl(((struct sockaddr_in *)\r
+                           &ipaddr->dst_addr)->sin_addr.s_addr),\r
+                    ntohs(((struct sockaddr_in *)\r
+                           &ipaddr->dst_addr)->sin_port));\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                    " route_resolve: SRC GID subnet %016llx id %016llx\n",\r
+                    (unsigned long long)\r
+                    ntohll(ibaddr->sgid.global.subnet_prefix),\r
+                    (unsigned long long)\r
+                    ntohll(ibaddr->sgid.global.interface_id));\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                    " route_resolve: DST GID subnet %016llx id %016llx\n",\r
+                    (unsigned long long)\r
+                    ntohll(ibaddr->dgid.global.subnet_prefix),\r
+                    (unsigned long long)\r
+                    ntohll(ibaddr->dgid.global.interface_id));\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                    " route_resolve: cm_id %p pdata %p plen %d rr %d ind %d\n",\r
+                    conn->cm_id,\r
+                    conn->params.private_data,\r
+                    conn->params.private_data_len,\r
+                    conn->params.responder_resources,\r
+                    conn->params.initiator_depth);\r
+\r
+       ret = rdma_connect(conn->cm_id, &conn->params);\r
+       if (ret) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " dapl_cma_connect: rdma_connect ERR %d %s\n",\r
+                        ret, strerror(errno));\r
+               goto bail;\r
+       }\r
+       return;\r
+\r
+      bail:\r
+       dapl_evd_connection_callback(conn,\r
+                                    IB_CME_LOCAL_FAILURE, NULL, conn->ep);\r
+}\r
+\r
+dp_ib_cm_handle_t dapls_ib_cm_create(DAPL_EP *ep)\r
+{\r
+       dp_ib_cm_handle_t conn;\r
+       struct rdma_cm_id *cm_id;\r
+\r
+       /* Allocate CM and initialize lock */\r
+       if ((conn = dapl_os_alloc(sizeof(*conn))) == NULL)\r
+               return NULL;\r
+\r
+       dapl_os_memzero(conn, sizeof(*conn));\r
+       dapl_os_lock_init(&conn->lock);\r
+\r
+       /* create CM_ID, bind to local device, create QP */\r
+       if (rdma_create_id(g_cm_events, &cm_id, (void *)conn, RDMA_PS_TCP)) {\r
+               dapl_os_free(conn, sizeof(*conn));\r
+               return NULL;\r
+       }\r
+       conn->cm_id = cm_id;\r
+\r
+       /* setup timers for address and route resolution */\r
+       conn->arp_timeout = dapl_os_get_env_val("DAPL_CM_ARP_TIMEOUT_MS",\r
+                                               IB_ARP_TIMEOUT);\r
+       conn->arp_retries = dapl_os_get_env_val("DAPL_CM_ARP_RETRY_COUNT",\r
+                                               IB_ARP_RETRY_COUNT);\r
+       conn->route_timeout = dapl_os_get_env_val("DAPL_CM_ROUTE_TIMEOUT_MS",\r
+                                                 IB_ROUTE_TIMEOUT);\r
+       conn->route_retries = dapl_os_get_env_val("DAPL_CM_ROUTE_RETRY_COUNT",\r
+                                                 IB_ROUTE_RETRY_COUNT);\r
+       if (ep != NULL) {\r
+               conn->ep = ep;\r
+               conn->hca = ((DAPL_IA *)ep->param.ia_handle)->hca_ptr;\r
+       }\r
+\r
+       return conn;\r
+}\r
+\r
+/* \r
+ * Called from consumer thread via dat_ep_free().\r
+ * CANNOT be called from the async event processing thread\r
+ * dapli_cma_event_cb() since a cm_id reference is held and\r
+ * a deadlock will occur.\r
+ */\r
+\r
+void dapls_ib_cm_free(dp_ib_cm_handle_t conn, DAPL_EP *ep)\r
+{\r
+       struct rdma_cm_id *cm_id;\r
+\r
+       if (conn == NULL)\r
+               return;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                    " destroy_conn: conn %p id %d\n", conn, conn->cm_id);\r
+\r
+       dapl_os_lock(&conn->lock);\r
+       conn->destroy = 1;\r
+\r
+       if (ep != NULL) {\r
+               ep->cm_handle = NULL;\r
+               ep->qp_handle = NULL;\r
+               ep->qp_state = IB_QP_STATE_ERROR;\r
+       }\r
+\r
+       cm_id = conn->cm_id;\r
+       conn->cm_id = NULL;\r
+       dapl_os_unlock(&conn->lock);\r
+\r
+       /* \r
+        * rdma_destroy_id will force synchronization with async CM event \r
+        * thread since it blocks until the in-process event reference\r
+        * is cleared during our event processing call exit.\r
+        */\r
+       if (cm_id) {\r
+               if (cm_id->qp)\r
+                       rdma_destroy_qp(cm_id);\r
+\r
+               rdma_destroy_id(cm_id);\r
+       }\r
+       dapl_os_free(conn, sizeof(*conn));\r
+}\r
+\r
+static struct dapl_cm_id *dapli_req_recv(struct dapl_cm_id *conn,\r
+                                        struct rdma_cm_event *event)\r
+{\r
+       struct dapl_cm_id *new_conn;\r
+#ifdef DAPL_DBG\r
+       struct rdma_addr *ipaddr = &event->id->route.addr;\r
+#endif\r
+\r
+       if (conn->sp == NULL) {\r
+               dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
+                            " dapli_rep_recv: on invalid listen " "handle\n");\r
+               return NULL;\r
+       }\r
+\r
+       /* allocate new cm_id and merge listen parameters */\r
+       new_conn = dapl_os_alloc(sizeof(*new_conn));\r
+       if (new_conn) {\r
+               (void)dapl_os_memzero(new_conn, sizeof(*new_conn));\r
+               dapl_os_lock_init(&new_conn->lock);\r
+               new_conn->cm_id = event->id;    /* provided by uCMA */\r
+               event->id->context = new_conn;  /* update CM_ID context */\r
+               new_conn->sp = conn->sp;\r
+               new_conn->hca = conn->hca;\r
+\r
+               /* Get requesters connect data, setup for accept */\r
+               new_conn->params.responder_resources =\r
+                   DAPL_MIN(event->param.conn.responder_resources,\r
+                            conn->hca->ib_trans.rd_atom_in);\r
+               new_conn->params.initiator_depth =\r
+                   DAPL_MIN(event->param.conn.initiator_depth,\r
+                            conn->hca->ib_trans.rd_atom_out);\r
+\r
+               new_conn->params.flow_control = event->param.conn.flow_control;\r
+               new_conn->params.rnr_retry_count =\r
+                   event->param.conn.rnr_retry_count;\r
+               new_conn->params.retry_count = event->param.conn.retry_count;\r
+\r
+               /* save private data */\r
+               if (event->param.conn.private_data_len) {\r
+                       dapl_os_memcpy(new_conn->p_data,\r
+                                      event->param.conn.private_data,\r
+                                      event->param.conn.private_data_len);\r
+                       new_conn->params.private_data = new_conn->p_data;\r
+                       new_conn->params.private_data_len =\r
+                           event->param.conn.private_data_len;\r
+               }\r
+\r
+               dapl_dbg_log(DAPL_DBG_TYPE_CM, " passive_cb: "\r
+                            "REQ: SP %p PORT %d LID %d "\r
+                            "NEW CONN %p ID %p pdata %p,%d\n",\r
+                            new_conn->sp, ntohs(((struct sockaddr_in *)\r
+                                                 &ipaddr->src_addr)->sin_port),\r
+                            event->listen_id, new_conn, event->id,\r
+                            event->param.conn.private_data,\r
+                            event->param.conn.private_data_len);\r
+\r
+               dapl_dbg_log(DAPL_DBG_TYPE_CM, " passive_cb: "\r
+                            "REQ: IP SRC %x PORT %d DST %x PORT %d "\r
+                            "rr %d init %d\n", ntohl(((struct sockaddr_in *)\r
+                                                      &ipaddr->src_addr)->\r
+                                                     sin_addr.s_addr),\r
+                            ntohs(((struct sockaddr_in *)\r
+                                   &ipaddr->src_addr)->sin_port),\r
+                            ntohl(((struct sockaddr_in *)\r
+                                   &ipaddr->dst_addr)->sin_addr.s_addr),\r
+                            ntohs(((struct sockaddr_in *)\r
+                                   &ipaddr->dst_addr)->sin_port),\r
+                            new_conn->params.responder_resources,\r
+                            new_conn->params.initiator_depth);\r
+       }\r
+       return new_conn;\r
+}\r
+\r
+static void dapli_cm_active_cb(struct dapl_cm_id *conn,\r
+                              struct rdma_cm_event *event)\r
+{\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                    " active_cb: conn %p id %d event %d\n",\r
+                    conn, conn->cm_id, event->event);\r
+\r
+       dapl_os_lock(&conn->lock);\r
+       if (conn->destroy) {\r
+               dapl_os_unlock(&conn->lock);\r
+               return;\r
+       }\r
+       dapl_os_unlock(&conn->lock);\r
+\r
+       /* There is a chance that we can get events after\r
+        * the consumer calls disconnect in a pending state\r
+        * since the IB CM and uDAPL states are not shared.\r
+        * In some cases, IB CM could generate either a DCONN\r
+        * or CONN_ERR after the consumer returned from\r
+        * dapl_ep_disconnect with a DISCONNECTED event\r
+        * already queued. Check state here and bail to\r
+        * avoid any events after a disconnect.\r
+        */\r
+       if (DAPL_BAD_HANDLE(conn->ep, DAPL_MAGIC_EP))\r
+               return;\r
+\r
+       dapl_os_lock(&conn->ep->header.lock);\r
+       if (conn->ep->param.ep_state == DAT_EP_STATE_DISCONNECTED) {\r
+               dapl_os_unlock(&conn->ep->header.lock);\r
+               return;\r
+       }\r
+       if (event->event == RDMA_CM_EVENT_DISCONNECTED)\r
+               conn->ep->param.ep_state = DAT_EP_STATE_DISCONNECTED;\r
+\r
+       dapl_os_unlock(&conn->ep->header.lock);\r
+\r
+       switch (event->event) {\r
+       case RDMA_CM_EVENT_UNREACHABLE:\r
+       case RDMA_CM_EVENT_CONNECT_ERROR:\r
+               {\r
+                       dapl_log(DAPL_DBG_TYPE_WARN,\r
+                                "dapl_cma_active: CONN_ERR event=0x%x"\r
+                                " status=%d %s DST %s, %d\n",\r
+                                event->event, event->status,\r
+                                (event->status == -ETIMEDOUT) ? "TIMEOUT" : "",\r
+                                inet_ntoa(((struct sockaddr_in *)\r
+                                           &conn->cm_id->route.addr.dst_addr)->\r
+                                          sin_addr),\r
+                                ntohs(((struct sockaddr_in *)\r
+                                       &conn->cm_id->route.addr.dst_addr)->\r
+                                      sin_port));\r
+\r
+                       /* per DAT SPEC provider always returns UNREACHABLE */\r
+                       dapl_evd_connection_callback(conn,\r
+                                                    IB_CME_DESTINATION_UNREACHABLE,\r
+                                                    NULL, conn->ep);\r
+                       break;\r
+               }\r
+       case RDMA_CM_EVENT_REJECTED:\r
+               {\r
+                       ib_cm_events_t cm_event;\r
+                       unsigned char *pdata = NULL;\r
+\r
+                       dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                                    " dapli_cm_active_handler: REJECTED reason=%d\n",\r
+                                    event->status);\r
+\r
+                       /* valid REJ from consumer will always contain private data */\r
+                       if (event->status == 28 &&\r
+                           event->param.conn.private_data_len) {\r
+                               cm_event =\r
+                                   IB_CME_DESTINATION_REJECT_PRIVATE_DATA;\r
+                               pdata =\r
+                                   (unsigned char *)event->param.conn.\r
+                                   private_data +\r
+                                   sizeof(struct dapl_pdata_hdr);\r
+                       } else {\r
+                               cm_event = IB_CME_DESTINATION_REJECT;\r
+                               dapl_log(DAPL_DBG_TYPE_WARN,\r
+                                        "dapl_cma_active: non-consumer REJ,"\r
+                                        " reason=%d, DST %s, %d\n",\r
+                                        event->status,\r
+                                        inet_ntoa(((struct sockaddr_in *)\r
+                                                   &conn->cm_id->route.addr.\r
+                                                   dst_addr)->sin_addr),\r
+                                        ntohs(((struct sockaddr_in *)\r
+                                               &conn->cm_id->route.addr.\r
+                                               dst_addr)->sin_port));\r
+                       }\r
+                       dapl_evd_connection_callback(conn, cm_event, pdata,\r
+                                                    conn->ep);\r
+                       break;\r
+               }\r
+       case RDMA_CM_EVENT_ESTABLISHED:\r
+               dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                            " active_cb: cm_id %d PORT %d CONNECTED to %s!\n",\r
+                            conn->cm_id, ntohs(((struct sockaddr_in *)\r
+                                                &conn->cm_id->route.addr.\r
+                                                dst_addr)->sin_port),\r
+                            inet_ntoa(((struct sockaddr_in *)\r
+                                       &conn->cm_id->route.addr.dst_addr)->\r
+                                      sin_addr));\r
+\r
+               /* setup local and remote ports for ep query */\r
+               conn->ep->param.remote_port_qual =\r
+                   PORT_TO_SID(rdma_get_dst_port(conn->cm_id));\r
+               conn->ep->param.local_port_qual =\r
+                   PORT_TO_SID(rdma_get_src_port(conn->cm_id));\r
+\r
+               dapl_evd_connection_callback(conn, IB_CME_CONNECTED,\r
+                                            event->param.conn.private_data,\r
+                                            conn->ep);\r
+               break;\r
+\r
+       case RDMA_CM_EVENT_DISCONNECTED:\r
+               dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                            " active_cb: DISC EVENT - EP %p\n",conn->ep);\r
+               rdma_disconnect(conn->cm_id);   /* required for DREP */\r
+               /* validate EP handle */\r
+               if (!DAPL_BAD_HANDLE(conn->ep, DAPL_MAGIC_EP))\r
+                       dapl_evd_connection_callback(conn,\r
+                                                    IB_CME_DISCONNECTED,\r
+                                                    NULL, conn->ep);\r
+               break;\r
+       default:\r
+               dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
+                            " dapli_cm_active_cb_handler: Unexpected CM "\r
+                            "event %d on ID 0x%p\n", event->event,\r
+                            conn->cm_id);\r
+               break;\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+static void dapli_cm_passive_cb(struct dapl_cm_id *conn,\r
+                               struct rdma_cm_event *event)\r
+{\r
+       struct dapl_cm_id *new_conn;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                    " passive_cb: conn %p id %d event %d\n",\r
+                    conn, event->id, event->event);\r
+\r
+       dapl_os_lock(&conn->lock);\r
+       if (conn->destroy) {\r
+               dapl_os_unlock(&conn->lock);\r
+               return;\r
+       }\r
+       dapl_os_unlock(&conn->lock);\r
+\r
+       switch (event->event) {\r
+       case RDMA_CM_EVENT_CONNECT_REQUEST:\r
+               /* create new conn object with new conn_id from event */\r
+               new_conn = dapli_req_recv(conn, event);\r
+\r
+               if (new_conn)\r
+                       dapls_cr_callback(new_conn,\r
+                                         IB_CME_CONNECTION_REQUEST_PENDING,\r
+                                         event->param.conn.private_data,\r
+                                         new_conn->sp);\r
+               break;\r
+       case RDMA_CM_EVENT_UNREACHABLE:\r
+       case RDMA_CM_EVENT_CONNECT_ERROR:\r
+               dapl_log(DAPL_DBG_TYPE_WARN,\r
+                        "dapl_cm_passive: CONN_ERR event=0x%x status=%d %s,"\r
+                        " DST %s,%d\n",\r
+                        event->event, event->status,\r
+                        (event->status == -ETIMEDOUT) ? "TIMEOUT" : "",\r
+                        inet_ntoa(((struct sockaddr_in *)\r
+                                   &conn->cm_id->route.addr.dst_addr)->\r
+                                  sin_addr), ntohs(((struct sockaddr_in *)\r
+                                                    &conn->cm_id->route.addr.\r
+                                                    dst_addr)->sin_port));\r
+\r
+               dapls_cr_callback(conn, IB_CME_DESTINATION_UNREACHABLE,\r
+                                 NULL, conn->sp);\r
+               break;\r
+\r
+       case RDMA_CM_EVENT_REJECTED:\r
+               {\r
+                       /* will alwasys be abnormal NON-consumer from active side */\r
+                       dapl_log(DAPL_DBG_TYPE_WARN,\r
+                                "dapl_cm_passive: non-consumer REJ, reason=%d,"\r
+                                " DST %s, %d\n",\r
+                                event->status,\r
+                                inet_ntoa(((struct sockaddr_in *)\r
+                                           &conn->cm_id->route.addr.dst_addr)->\r
+                                          sin_addr),\r
+                                ntohs(((struct sockaddr_in *)\r
+                                       &conn->cm_id->route.addr.dst_addr)->\r
+                                      sin_port));\r
+\r
+                       dapls_cr_callback(conn, IB_CME_DESTINATION_REJECT,\r
+                                         NULL, conn->sp);\r
+                       break;\r
+               }\r
+       case RDMA_CM_EVENT_ESTABLISHED:\r
+               dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                            " passive_cb: cm_id %p PORT %d CONNECTED from 0x%x!\n",\r
+                            conn->cm_id, ntohs(((struct sockaddr_in *)\r
+                                                &conn->cm_id->route.addr.\r
+                                                src_addr)->sin_port),\r
+                            ntohl(((struct sockaddr_in *)\r
+                                   &conn->cm_id->route.addr.dst_addr)->\r
+                                  sin_addr.s_addr));\r
+\r
+               dapls_cr_callback(conn, IB_CME_CONNECTED, NULL, conn->sp);\r
+\r
+               break;\r
+       case RDMA_CM_EVENT_DISCONNECTED:\r
+               rdma_disconnect(conn->cm_id);   /* required for DREP */\r
+               /* validate SP handle context */\r
+               if (!DAPL_BAD_HANDLE(conn->sp, DAPL_MAGIC_PSP) ||\r
+                   !DAPL_BAD_HANDLE(conn->sp, DAPL_MAGIC_RSP))\r
+                       dapls_cr_callback(conn,\r
+                                         IB_CME_DISCONNECTED, NULL, conn->sp);\r
+               break;\r
+       default:\r
+               dapl_dbg_log(DAPL_DBG_TYPE_ERR, " passive_cb: "\r
+                            "Unexpected CM event %d on ID 0x%p\n",\r
+                            event->event, conn->cm_id);\r
+               break;\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+/************************ DAPL provider entry points **********************/\r
+\r
+/*\r
+ * dapls_ib_connect\r
+ *\r
+ * Initiate a connection with the passive listener on another node\r
+ *\r
+ * Input:\r
+ *     ep_handle,\r
+ *     remote_ia_address,\r
+ *     remote_conn_qual,\r
+ *     prd_size                size of private data and structure\r
+ *     prd_prt                 pointer to private data structure\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_INSUFFICIENT_RESOURCES\r
+ *     DAT_INVALID_PARAMETER\r
+ *\r
+ */\r
+DAT_RETURN dapls_ib_connect(IN DAT_EP_HANDLE ep_handle,\r
+                           IN DAT_IA_ADDRESS_PTR r_addr,\r
+                           IN DAT_CONN_QUAL r_qual,\r
+                           IN DAT_COUNT p_size, IN void *p_data)\r
+{\r
+       struct dapl_ep *ep_ptr = ep_handle;\r
+       struct dapl_cm_id *conn = ep_ptr->cm_handle;\r
+       int ret;\r
+\r
+       /* Sanity check */\r
+       if (NULL == ep_ptr)\r
+               return DAT_SUCCESS;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                    " connect: rSID 0x%llx rPort %d, pdata %p, ln %d\n",\r
+                    r_qual, ntohs(SID_TO_PORT(r_qual)), p_data, p_size);\r
+\r
+       /* rdma conn and cm_id pre-bound; reference via ep_ptr->cm_handle */\r
+\r
+       /* Setup QP/CM parameters and private data in cm_id */\r
+       (void)dapl_os_memzero(&conn->params, sizeof(conn->params));\r
+       conn->params.responder_resources =\r
+           ep_ptr->param.ep_attr.max_rdma_read_in;\r
+       conn->params.initiator_depth = ep_ptr->param.ep_attr.max_rdma_read_out;\r
+       conn->params.flow_control = 1;\r
+       conn->params.rnr_retry_count = IB_RNR_RETRY_COUNT;\r
+       conn->params.retry_count = IB_RC_RETRY_COUNT;\r
+       if (p_size) {\r
+               dapl_os_memcpy(conn->p_data, p_data, p_size);\r
+               conn->params.private_data = conn->p_data;\r
+               conn->params.private_data_len = p_size;\r
+       }\r
+\r
+       /* copy in remote address, need a copy for retry attempts */\r
+       dapl_os_memcpy(&conn->r_addr, r_addr, sizeof(*r_addr));\r
+\r
+       /* Resolve remote address, src already bound during QP create */\r
+       ((struct sockaddr_in *)&conn->r_addr)->sin_port = SID_TO_PORT(r_qual);\r
+       ((struct sockaddr_in *)&conn->r_addr)->sin_family = AF_INET;\r
+\r
+       ret = rdma_resolve_addr(conn->cm_id, NULL,\r
+                               (struct sockaddr *)&conn->r_addr,\r
+                               conn->arp_timeout);\r
+       if (ret) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " dapl_cma_connect: rdma_resolve_addr ERR 0x%x %s\n",\r
+                        ret, strerror(errno));\r
+               return dapl_convert_errno(errno, "ib_connect");\r
+       }\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                    " connect: resolve_addr: cm_id %p -> %s port %d\n",\r
+                    conn->cm_id,\r
+                    inet_ntoa(((struct sockaddr_in *)&conn->r_addr)->sin_addr),\r
+                    ((struct sockaddr_in *)&conn->r_addr)->sin_port);\r
+\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+/*\r
+ * dapls_ib_disconnect\r
+ *\r
+ * Disconnect an EP\r
+ *\r
+ * Input:\r
+ *     ep_handle,\r
+ *     disconnect_flags\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *\r
+ */\r
+DAT_RETURN\r
+dapls_ib_disconnect(IN DAPL_EP * ep_ptr, IN DAT_CLOSE_FLAGS close_flags)\r
+{\r
+       dp_ib_cm_handle_t conn = ep_ptr->cm_handle;\r
+       int ret;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                    " disconnect(ep %p, conn %p, id %d flags %x)\n",\r
+                    ep_ptr, conn, (conn ? conn->cm_id : 0), close_flags);\r
+\r
+       if ((conn == IB_INVALID_HANDLE) || (conn->cm_id == NULL))\r
+               return DAT_SUCCESS;\r
+\r
+       /* no graceful half-pipe disconnect option */\r
+       ret = rdma_disconnect(conn->cm_id);\r
+       if (ret)\r
+               dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
+                            " disconnect: ID %p ret 0x%x\n",\r
+                            ep_ptr->cm_handle, ret);\r
+\r
+       /* \r
+        * DAT event notification occurs from the callback\r
+        * Note: will fire even if DREQ goes unanswered on timeout \r
+        */\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+/*\r
+ * dapls_ib_disconnect_clean\r
+ *\r
+ * Clean up outstanding connection data. This routine is invoked\r
+ * after the final disconnect callback has occurred. Only on the\r
+ * ACTIVE side of a connection.\r
+ *\r
+ * Input:\r
+ *     ep_ptr          DAPL_EP\r
+ *     active          Indicates active side of connection\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     void\r
+ *\r
+ */\r
+void\r
+dapls_ib_disconnect_clean(IN DAPL_EP * ep_ptr,\r
+                         IN DAT_BOOLEAN active,\r
+                         IN const ib_cm_events_t ib_cm_event)\r
+{\r
+       /* nothing to do */\r
+       return;\r
+}\r
+\r
+/*\r
+ * dapl_ib_setup_conn_listener\r
+ *\r
+ * Have the CM set up a connection listener.\r
+ *\r
+ * Input:\r
+ *     ibm_hca_handle          HCA handle\r
+ *     qp_handle                       QP handle\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_INSUFFICIENT_RESOURCES\r
+ *     DAT_INTERNAL_ERROR\r
+ *     DAT_CONN_QUAL_UNAVAILBLE\r
+ *     DAT_CONN_QUAL_IN_USE\r
+ *\r
+ */\r
+DAT_RETURN\r
+dapls_ib_setup_conn_listener(IN DAPL_IA * ia_ptr,\r
+                            IN DAT_UINT64 ServiceID, IN DAPL_SP * sp_ptr)\r
+{\r
+       DAT_RETURN dat_status = DAT_SUCCESS;\r
+       ib_cm_srvc_handle_t conn;\r
+       DAT_SOCK_ADDR6 addr;    /* local binding address */\r
+\r
+       /* Allocate CM and initialize lock */\r
+       if ((conn = dapl_os_alloc(sizeof(*conn))) == NULL)\r
+               return DAT_INSUFFICIENT_RESOURCES;\r
+\r
+       dapl_os_memzero(conn, sizeof(*conn));\r
+       dapl_os_lock_init(&conn->lock);\r
+\r
+       /* create CM_ID, bind to local device, create QP */\r
+       if (rdma_create_id\r
+           (g_cm_events, &conn->cm_id, (void *)conn, RDMA_PS_TCP)) {\r
+               dapl_os_free(conn, sizeof(*conn));\r
+               return (dapl_convert_errno(errno, "setup_listener"));\r
+       }\r
+\r
+       /* open identifies the local device; per DAT specification */\r
+       /* Get family and address then set port to consumer's ServiceID */\r
+       dapl_os_memcpy(&addr, &ia_ptr->hca_ptr->hca_address, sizeof(addr));\r
+       ((struct sockaddr_in *)&addr)->sin_port = SID_TO_PORT(ServiceID);\r
+\r
+       if (rdma_bind_addr(conn->cm_id, (struct sockaddr *)&addr)) {\r
+               if ((errno == EBUSY) || (errno == EADDRINUSE))\r
+                       dat_status = DAT_CONN_QUAL_IN_USE;\r
+               else\r
+                       dat_status =\r
+                           dapl_convert_errno(errno, "setup_listener");\r
+               goto bail;\r
+       }\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                    " listen(ia_ptr %p SID 0x%llx Port %d sp %p conn %p id %d)\n",\r
+                    ia_ptr, ServiceID, ntohs(SID_TO_PORT(ServiceID)),\r
+                    sp_ptr, conn, conn->cm_id);\r
+\r
+       sp_ptr->cm_srvc_handle = conn;\r
+       conn->sp = sp_ptr;\r
+       conn->hca = ia_ptr->hca_ptr;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+                    " listen(conn=%p cm_id=%d)\n",\r
+                    sp_ptr->cm_srvc_handle, conn->cm_id);\r
+\r
+       if (rdma_listen(conn->cm_id, 0)) {      /* max cma backlog */\r
+\r
+               if ((errno == EBUSY) || (errno == EADDRINUSE))\r
+                       dat_status = DAT_CONN_QUAL_IN_USE;\r
+               else\r
+                       dat_status =\r
+                           dapl_convert_errno(errno, "setup_listener");\r
+               goto bail;\r
+       }\r
+\r
+       /* success */\r
+       return DAT_SUCCESS;\r
+\r
+      bail:\r
+       rdma_destroy_id(conn->cm_id);\r
+       dapl_os_free(conn, sizeof(*conn));\r
+       return dat_status;\r
+}\r
+\r
+/*\r
+ * dapl_ib_remove_conn_listener\r
+ *\r
+ * Have the CM remove a connection listener.\r
+ *\r
+ * Input:\r
+ *     ia_handle               IA handle\r
+ *     ServiceID               IB Channel Service ID\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_INVALID_STATE\r
+ *\r
+ */\r
+DAT_RETURN\r
+dapls_ib_remove_conn_listener(IN DAPL_IA * ia_ptr, IN DAPL_SP * sp_ptr)\r
+{\r
+       ib_cm_srvc_handle_t conn = sp_ptr->cm_srvc_handle;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                    " remove_listen(ia_ptr %p sp_ptr %p cm_ptr %p)\n",\r
+                    ia_ptr, sp_ptr, conn);\r
+\r
+       if (conn != IB_INVALID_HANDLE) {\r
+               sp_ptr->cm_srvc_handle = NULL;\r
+               dapls_ib_cm_free(conn, NULL);\r
+       }\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+/*\r
+ * dapls_ib_accept_connection\r
+ *\r
+ * Perform necessary steps to accept a connection\r
+ *\r
+ * Input:\r
+ *     cr_handle\r
+ *     ep_handle\r
+ *     private_data_size\r
+ *     private_data\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_INSUFFICIENT_RESOURCES\r
+ *     DAT_INTERNAL_ERROR\r
+ *\r
+ */\r
+DAT_RETURN\r
+dapls_ib_accept_connection(IN DAT_CR_HANDLE cr_handle,\r
+                          IN DAT_EP_HANDLE ep_handle,\r
+                          IN DAT_COUNT p_size, IN const DAT_PVOID p_data)\r
+{\r
+       DAPL_CR *cr_ptr = (DAPL_CR *) cr_handle;\r
+       DAPL_EP *ep_ptr = (DAPL_EP *) ep_handle;\r
+       DAPL_IA *ia_ptr = ep_ptr->header.owner_ia;\r
+       struct dapl_cm_id *cr_conn = cr_ptr->ib_cm_handle;\r
+       int ret;\r
+       DAT_RETURN dat_status;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                    " accept(cr %p conn %p, id %p, p_data %p, p_sz=%d)\n",\r
+                    cr_ptr, cr_conn, cr_conn->cm_id, p_data, p_size);\r
+\r
+       /* Obtain size of private data structure & contents */\r
+       if (p_size > IB_MAX_REP_PDATA_SIZE) {\r
+               dat_status = DAT_ERROR(DAT_LENGTH_ERROR, DAT_NO_SUBTYPE);\r
+               goto bail;\r
+       }\r
+\r
+       if (ep_ptr->qp_state == DAPL_QP_STATE_UNATTACHED) {\r
+               /* \r
+                * If we are lazy attaching the QP then we may need to\r
+                * hook it up here. Typically, we run this code only for\r
+                * DAT_PSP_PROVIDER_FLAG\r
+                */\r
+               dat_status = dapls_ib_qp_alloc(ia_ptr, ep_ptr, NULL);\r
+               if (dat_status != DAT_SUCCESS) {\r
+                       dapl_log(DAPL_DBG_TYPE_ERR,\r
+                                " dapl_cma_accept: qp_alloc ERR %d\n",\r
+                                dat_status);\r
+                       goto bail;\r
+               }\r
+       }\r
+\r
+       /* \r
+        * Validate device and port in EP cm_id against inbound \r
+        * CR cm_id. The pre-allocated EP cm_id is already bound to \r
+        * a local device (cm_id and QP) when created. Move the QP\r
+        * to the new cm_id only if device and port numbers match.\r
+        */\r
+       if (ep_ptr->cm_handle->cm_id->verbs == cr_conn->cm_id->verbs &&\r
+           ep_ptr->cm_handle->cm_id->port_num == cr_conn->cm_id->port_num) {\r
+               /* move QP to new cr_conn, remove QP ref in EP cm_id */\r
+               cr_conn->cm_id->qp = ep_ptr->cm_handle->cm_id->qp;\r
+               ep_ptr->cm_handle->cm_id->qp = NULL;\r
+               dapls_ib_cm_free(ep_ptr->cm_handle, NULL);\r
+       } else {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " dapl_cma_accept: ERR dev(%p!=%p) or"\r
+                        " port mismatch(%d!=%d)\n",\r
+                        ep_ptr->cm_handle->cm_id->verbs, cr_conn->cm_id->verbs,\r
+                        ntohs(ep_ptr->cm_handle->cm_id->port_num),\r
+                        ntohs(cr_conn->cm_id->port_num));\r
+               dat_status = DAT_INTERNAL_ERROR;\r
+               goto bail;\r
+       }\r
+\r
+       cr_ptr->param.local_ep_handle = ep_handle;\r
+       cr_conn->params.private_data = p_data;\r
+       cr_conn->params.private_data_len = p_size;\r
+\r
+       ret = rdma_accept(cr_conn->cm_id, &cr_conn->params);\r
+       if (ret) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR, " dapl_cma_accept: ERR %d %s\n",\r
+                        ret, strerror(errno));\r
+               dat_status = dapl_convert_errno(ret, "accept");\r
+               goto bail;\r
+       }\r
+\r
+       /* save accepted conn and EP reference, qp_handle unchanged */\r
+       ep_ptr->cm_handle = cr_conn;\r
+       cr_conn->ep = ep_ptr;\r
+\r
+       /* setup local and remote ports for ep query */\r
+       /* Note: port qual in network order */\r
+       ep_ptr->param.remote_port_qual =\r
+           PORT_TO_SID(rdma_get_dst_port(cr_conn->cm_id));\r
+       ep_ptr->param.local_port_qual =\r
+           PORT_TO_SID(rdma_get_src_port(cr_conn->cm_id));\r
+\r
+       return DAT_SUCCESS;\r
+      bail:\r
+       rdma_reject(cr_conn->cm_id, NULL, 0);\r
+       dapls_ib_cm_free(cr_conn, NULL);\r
+       return dat_status;\r
+}\r
+\r
+/*\r
+ * dapls_ib_reject_connection\r
+ *\r
+ * Reject a connection\r
+ *\r
+ * Input:\r
+ *     cr_handle\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_INTERNAL_ERROR\r
+ *\r
+ */\r
+DAT_RETURN\r
+dapls_ib_reject_connection(IN dp_ib_cm_handle_t cm_handle,\r
+                          IN int reason,\r
+                          IN DAT_COUNT private_data_size,\r
+                          IN const DAT_PVOID private_data)\r
+{\r
+       int ret;\r
+       int offset = sizeof(struct dapl_pdata_hdr);\r
+       struct dapl_pdata_hdr pdata_hdr;\r
+\r
+       memset(&pdata_hdr, 0, sizeof pdata_hdr);\r
+       pdata_hdr.version = htonl((DAT_VERSION_MAJOR << 24) |\r
+                                 (DAT_VERSION_MINOR << 16) |\r
+                                 (VN_PROVIDER_MAJOR << 8) |\r
+                                 (VN_PROVIDER_MINOR));\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                    " reject: handle %p reason %x, ver=%x, data %p, sz=%d\n",\r
+                    cm_handle, reason, ntohl(pdata_hdr.version),\r
+                    private_data, private_data_size);\r
+\r
+       if (cm_handle == IB_INVALID_HANDLE) {\r
+               dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
+                            " reject: invalid handle: reason %d\n", reason);\r
+               return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_CR);\r
+       }\r
+\r
+       if (private_data_size >\r
+           dapls_ib_private_data_size(NULL, DAPL_PDATA_CONN_REJ,\r
+                                      cm_handle->hca))\r
+               return DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3);\r
+\r
+       /* setup pdata_hdr and users data, in CR pdata buffer */\r
+       dapl_os_memcpy(cm_handle->p_data, &pdata_hdr, offset);\r
+       if (private_data_size)\r
+               dapl_os_memcpy(cm_handle->p_data + offset,\r
+                              private_data, private_data_size);\r
+\r
+       /*\r
+        * Always some private data with reject so active peer can\r
+        * determine real application reject from an abnormal \r
+        * application termination\r
+        */\r
+       ret = rdma_reject(cm_handle->cm_id,\r
+                         cm_handle->p_data, offset + private_data_size);\r
+\r
+       dapls_ib_cm_free(cm_handle, NULL);\r
+       return dapl_convert_errno(ret, "reject");\r
+}\r
+\r
+/*\r
+ * dapls_ib_cm_remote_addr\r
+ *\r
+ * Obtain the remote IP address given a connection\r
+ *\r
+ * Input:\r
+ *     cr_handle\r
+ *\r
+ * Output:\r
+ *     remote_ia_address: where to place the remote address\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_INVALID_HANDLE\r
+ *\r
+ */\r
+DAT_RETURN\r
+dapls_ib_cm_remote_addr(IN DAT_HANDLE dat_handle, OUT DAT_SOCK_ADDR6 * raddr)\r
+{\r
+       DAPL_HEADER *header;\r
+       dp_ib_cm_handle_t ib_cm_handle;\r
+       struct rdma_addr *ipaddr;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+                    " remote_addr(cm_handle=%p, r_addr=%p)\n",\r
+                    dat_handle, raddr);\r
+\r
+       header = (DAPL_HEADER *) dat_handle;\r
+\r
+       if (header->magic == DAPL_MAGIC_EP)\r
+               ib_cm_handle = ((DAPL_EP *) dat_handle)->cm_handle;\r
+       else if (header->magic == DAPL_MAGIC_CR)\r
+               ib_cm_handle = ((DAPL_CR *) dat_handle)->ib_cm_handle;\r
+       else\r
+               return DAT_INVALID_HANDLE;\r
+\r
+       /* get remote IP address from cm_id route */\r
+       ipaddr = &ib_cm_handle->cm_id->route.addr;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                    " remote_addr: conn %p id %p SRC %x DST %x PORT %d\n",\r
+                    ib_cm_handle, ib_cm_handle->cm_id,\r
+                    ntohl(((struct sockaddr_in *)\r
+                           &ipaddr->src_addr)->sin_addr.s_addr),\r
+                    ntohl(((struct sockaddr_in *)\r
+                           &ipaddr->dst_addr)->sin_addr.s_addr),\r
+                    ntohs(((struct sockaddr_in *)\r
+                           &ipaddr->dst_addr)->sin_port));\r
+\r
+       dapl_os_memcpy(raddr, &ipaddr->dst_addr, sizeof(DAT_SOCK_ADDR));\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+/*\r
+ * dapls_ib_private_data_size\r
+ *\r
+ * Return the size of private data given a connection op type\r
+ *\r
+ * Input:\r
+ *     prd_ptr         private data pointer\r
+ *     conn_op         connection operation type\r
+ *      hca_ptr         hca pointer, needed for transport type\r
+ *\r
+ * If prd_ptr is NULL, this is a query for the max size supported by\r
+ * the provider, otherwise it is the actual size of the private data\r
+ * contained in prd_ptr.\r
+ *\r
+ *\r
+ * Output:\r
+ *     None\r
+ *\r
+ * Returns:\r
+ *     length of private data\r
+ *\r
+ */\r
+int dapls_ib_private_data_size(IN DAPL_PRIVATE * prd_ptr,\r
+                              IN DAPL_PDATA_OP conn_op, IN DAPL_HCA * hca_ptr)\r
+{\r
+       int size;\r
+\r
+       if (hca_ptr->ib_hca_handle->device->transport_type\r
+           == IBV_TRANSPORT_IWARP)\r
+               return (IWARP_MAX_PDATA_SIZE - sizeof(struct dapl_pdata_hdr));\r
+\r
+       switch (conn_op) {\r
+\r
+       case DAPL_PDATA_CONN_REQ:\r
+               size = IB_MAX_REQ_PDATA_SIZE;\r
+               break;\r
+       case DAPL_PDATA_CONN_REP:\r
+               size = IB_MAX_REP_PDATA_SIZE;\r
+               break;\r
+       case DAPL_PDATA_CONN_REJ:\r
+               size = IB_MAX_REJ_PDATA_SIZE - sizeof(struct dapl_pdata_hdr);\r
+               break;\r
+       case DAPL_PDATA_CONN_DREQ:\r
+               size = IB_MAX_DREQ_PDATA_SIZE;\r
+               break;\r
+       case DAPL_PDATA_CONN_DREP:\r
+               size = IB_MAX_DREP_PDATA_SIZE;\r
+               break;\r
+       default:\r
+               size = 0;\r
+\r
+       }                       /* end case */\r
+\r
+       return size;\r
+}\r
+\r
+/*\r
+ * Map all CMA event codes to the DAT equivelent.\r
+ */\r
+#define DAPL_IB_EVENT_CNT      13\r
+\r
+static struct ib_cm_event_map {\r
+       const ib_cm_events_t ib_cm_event;\r
+       DAT_EVENT_NUMBER dat_event_num;\r
+} ib_cm_event_map[DAPL_IB_EVENT_CNT] = {\r
+       /* 00 */  {\r
+       IB_CME_CONNECTED, DAT_CONNECTION_EVENT_ESTABLISHED},\r
+           /* 01 */  {\r
+       IB_CME_DISCONNECTED, DAT_CONNECTION_EVENT_DISCONNECTED},\r
+           /* 02 */  {\r
+       IB_CME_DISCONNECTED_ON_LINK_DOWN,\r
+                   DAT_CONNECTION_EVENT_DISCONNECTED},\r
+           /* 03 */  {\r
+       IB_CME_CONNECTION_REQUEST_PENDING, DAT_CONNECTION_REQUEST_EVENT},\r
+           /* 04 */  {\r
+       IB_CME_CONNECTION_REQUEST_PENDING_PRIVATE_DATA,\r
+                   DAT_CONNECTION_REQUEST_EVENT},\r
+           /* 05 */  {\r
+       IB_CME_CONNECTION_REQUEST_ACKED, DAT_CONNECTION_REQUEST_EVENT},\r
+           /* 06 */  {\r
+       IB_CME_DESTINATION_REJECT,\r
+                   DAT_CONNECTION_EVENT_NON_PEER_REJECTED},\r
+           /* 07 */  {\r
+       IB_CME_DESTINATION_REJECT_PRIVATE_DATA,\r
+                   DAT_CONNECTION_EVENT_PEER_REJECTED},\r
+           /* 08 */  {\r
+       IB_CME_DESTINATION_UNREACHABLE, DAT_CONNECTION_EVENT_UNREACHABLE},\r
+           /* 09 */  {\r
+       IB_CME_TOO_MANY_CONNECTION_REQUESTS,\r
+                   DAT_CONNECTION_EVENT_NON_PEER_REJECTED},\r
+           /* 10 */  {\r
+       IB_CME_LOCAL_FAILURE, DAT_CONNECTION_EVENT_BROKEN},\r
+           /* 11 */  {\r
+       IB_CME_BROKEN, DAT_CONNECTION_EVENT_BROKEN},\r
+           /* 12 */  {\r
+IB_CME_TIMEOUT, DAT_CONNECTION_EVENT_TIMED_OUT},};\r
+\r
+/*\r
+ * dapls_ib_get_cm_event\r
+ *\r
+ * Return a DAT connection event given a provider CM event.\r
+ *\r
+ * Input:\r
+ *     dat_event_num   DAT event we need an equivelent CM event for\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     ib_cm_event of translated DAPL value\r
+ */\r
+DAT_EVENT_NUMBER\r
+dapls_ib_get_dat_event(IN const ib_cm_events_t ib_cm_event,\r
+                      IN DAT_BOOLEAN active)\r
+{\r
+       DAT_EVENT_NUMBER dat_event_num;\r
+       int i;\r
+\r
+       active = active;\r
+\r
+       dat_event_num = 0;\r
+       for (i = 0; i < DAPL_IB_EVENT_CNT; i++) {\r
+               if (ib_cm_event == ib_cm_event_map[i].ib_cm_event) {\r
+                       dat_event_num = ib_cm_event_map[i].dat_event_num;\r
+                       break;\r
+               }\r
+       }\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,\r
+                    "dapls_ib_get_dat_event: event(%s) ib=0x%x dat=0x%x\n",\r
+                    active ? "active" : "passive", ib_cm_event, dat_event_num);\r
+\r
+       return dat_event_num;\r
+}\r
+\r
+/*\r
+ * dapls_ib_get_dat_event\r
+ *\r
+ * Return a DAT connection event given a provider CM event.\r
+ * \r
+ * Input:\r
+ *     ib_cm_event     event provided to the dapl callback routine\r
+ *     active          switch indicating active or passive connection\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_EVENT_NUMBER of translated provider value\r
+ */\r
+ib_cm_events_t dapls_ib_get_cm_event(IN DAT_EVENT_NUMBER dat_event_num)\r
+{\r
+       ib_cm_events_t ib_cm_event;\r
+       int i;\r
+\r
+       ib_cm_event = 0;\r
+       for (i = 0; i < DAPL_IB_EVENT_CNT; i++) {\r
+               if (dat_event_num == ib_cm_event_map[i].dat_event_num) {\r
+                       ib_cm_event = ib_cm_event_map[i].ib_cm_event;\r
+                       break;\r
+               }\r
+       }\r
+       return ib_cm_event;\r
+}\r
+\r
+void dapli_cma_event_cb(void)\r
+{\r
+       struct rdma_cm_event *event;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cm_event()\n");\r
+\r
+       /* process one CM event, fairness */\r
+       if (!rdma_get_cm_event(g_cm_events, &event)) {\r
+               struct dapl_cm_id *conn;\r
+\r
+               /* set proper conn from cm_id context */\r
+               if (event->event == RDMA_CM_EVENT_CONNECT_REQUEST)\r
+                       conn = (struct dapl_cm_id *)event->listen_id->context;\r
+               else\r
+                       conn = (struct dapl_cm_id *)event->id->context;\r
+\r
+               dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                            " cm_event: EVENT=%d ID=%p LID=%p CTX=%p\n",\r
+                            event->event, event->id, event->listen_id, conn);\r
+\r
+               switch (event->event) {\r
+               case RDMA_CM_EVENT_ADDR_RESOLVED:\r
+                       dapli_addr_resolve(conn);\r
+                       break;\r
+\r
+               case RDMA_CM_EVENT_ROUTE_RESOLVED:\r
+                       dapli_route_resolve(conn);\r
+                       break;\r
+\r
+               case RDMA_CM_EVENT_ADDR_ERROR:\r
+                       dapl_log(DAPL_DBG_TYPE_WARN,\r
+                                "dapl_cma_active: CM ADDR ERROR: ->"\r
+                                " DST %s retry (%d)..\n",\r
+                                inet_ntoa(((struct sockaddr_in *)\r
+                                           &conn->r_addr)->sin_addr),\r
+                                conn->arp_retries);\r
+\r
+                       /* retry address resolution */\r
+                       if ((--conn->arp_retries) &&\r
+                           (event->status == -ETIMEDOUT)) {\r
+                               int ret;\r
+                               ret = rdma_resolve_addr(conn->cm_id, NULL,\r
+                                                       (struct sockaddr *)\r
+                                                       &conn->r_addr,\r
+                                                       conn->arp_timeout);\r
+                               if (!ret)\r
+                                       break;\r
+                               else {\r
+                                       dapl_dbg_log(DAPL_DBG_TYPE_WARN,\r
+                                                    " ERROR: rdma_resolve_addr = "\r
+                                                    "%d %s\n",\r
+                                                    ret, strerror(errno));\r
+                               }\r
+                       }\r
+                       /* retries exhausted or resolve_addr failed */\r
+                       dapl_log(DAPL_DBG_TYPE_ERR,\r
+                                "dapl_cma_active: ARP_ERR, retries(%d)"\r
+                                " exhausted -> DST %s,%d\n",\r
+                                IB_ARP_RETRY_COUNT,\r
+                                inet_ntoa(((struct sockaddr_in *)\r
+                                           &conn->cm_id->route.addr.dst_addr)->\r
+                                          sin_addr),\r
+                                ntohs(((struct sockaddr_in *)\r
+                                       &conn->cm_id->route.addr.dst_addr)->\r
+                                      sin_port));\r
+\r
+                       dapl_evd_connection_callback(conn,\r
+                                                    IB_CME_DESTINATION_UNREACHABLE,\r
+                                                    NULL, conn->ep);\r
+                       break;\r
+\r
+               case RDMA_CM_EVENT_ROUTE_ERROR:\r
+                       dapl_log(DAPL_DBG_TYPE_WARN,\r
+                                "dapl_cma_active: CM ROUTE ERROR: ->"\r
+                                " DST %s retry (%d)..\n",\r
+                                inet_ntoa(((struct sockaddr_in *)\r
+                                           &conn->r_addr)->sin_addr),\r
+                                conn->route_retries);\r
+\r
+                       /* retry route resolution */\r
+                       if ((--conn->route_retries) &&\r
+                           (event->status == -ETIMEDOUT))\r
+                               dapli_addr_resolve(conn);\r
+                       else {\r
+                               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                                        "dapl_cma_active: PATH_RECORD_ERR,"\r
+                                        " retries(%d) exhausted, DST %s,%d\n",\r
+                                        IB_ROUTE_RETRY_COUNT,\r
+                                        inet_ntoa(((struct sockaddr_in *)\r
+                                                   &conn->cm_id->route.addr.\r
+                                                   dst_addr)->sin_addr),\r
+                                        ntohs(((struct sockaddr_in *)\r
+                                               &conn->cm_id->route.addr.\r
+                                               dst_addr)->sin_port));\r
+\r
+                               dapl_evd_connection_callback(conn,\r
+                                                            IB_CME_DESTINATION_UNREACHABLE,\r
+                                                            NULL, conn->ep);\r
+                       }\r
+                       break;\r
+\r
+               case RDMA_CM_EVENT_DEVICE_REMOVAL:\r
+                       dapl_evd_connection_callback(conn,\r
+                                                    IB_CME_LOCAL_FAILURE,\r
+                                                    NULL, conn->ep);\r
+                       break;\r
+               case RDMA_CM_EVENT_CONNECT_REQUEST:\r
+               case RDMA_CM_EVENT_CONNECT_ERROR:\r
+               case RDMA_CM_EVENT_UNREACHABLE:\r
+               case RDMA_CM_EVENT_REJECTED:\r
+               case RDMA_CM_EVENT_ESTABLISHED:\r
+               case RDMA_CM_EVENT_DISCONNECTED:\r
+                       /* passive or active */\r
+                       if (conn->sp)\r
+                               dapli_cm_passive_cb(conn, event);\r
+                       else\r
+                               dapli_cm_active_cb(conn, event);\r
+                       break;\r
+               case RDMA_CM_EVENT_CONNECT_RESPONSE:\r
+               case RDMA_CM_EVENT_TIMEWAIT_EXIT:\r
+                       break;\r
+               default:\r
+                       dapl_dbg_log(DAPL_DBG_TYPE_WARN,\r
+                                    " cm_event: UNEXPECTED EVENT=%p ID=%p CTX=%p\n",\r
+                                    event->event, event->id,\r
+                                    event->id->context);\r
+                       break;\r
+               }\r
+               /* ack event, unblocks destroy_cm_id in consumer threads */\r
+               rdma_ack_cm_event(event);\r
+       }\r
+}\r
+\r
+/*\r
+ * Local variables:\r
+ *  c-indent-level: 4\r
+ *  c-basic-offset: 4\r
+ *  tab-width: 8\r
+ * End:\r
+ */\r
diff --git a/branches/winverbs/ulp/dapl2/dapl/openib_cma/dapl_ib_cm.c b/branches/winverbs/ulp/dapl2/dapl/openib_cma/dapl_ib_cm.c
deleted file mode 100644 (file)
index 946cfbd..0000000
+++ /dev/null
@@ -1,1297 +0,0 @@
-/*
- * Copyright (c) 2005 Voltaire Inc.  All rights reserved.
- * Copyright (c) 2005-2007 Intel Corporation. All rights reserved.
- * Copyright (c) 2004-2005, Mellanox Technologies, Inc. All rights reserved. 
- * Copyright (c) 2003 Topspin Corporation.  All rights reserved. 
- * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.
- *
- * This Software is licensed under one of the following licenses:
- *
- * 1) under the terms of the "Common Public License 1.0" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/cpl.php.
- *
- * 2) under the terms of the "The BSD License" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/bsd-license.php.
- *
- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
- *    copy of which is available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/gpl-license.php.
- *
- * Licensee has the right to choose one of the above licenses.
- *
- * Redistributions of source code must retain the above copyright
- * notice and one of the license notices.
- *
- * Redistributions in binary form must reproduce both the above copyright
- * notice, one of the license notices in the documentation
- * and/or other materials provided with the distribution.
- */
-
-/**********************************************************************
- *
- * MODULE: dapl_ib_cm.c
- *
- * PURPOSE: The OFED provider - uCMA, name and route resolution
- *
- * $Id: $
- *
- **********************************************************************/
-
-#include "dapl.h"
-#include "dapl_adapter_util.h"
-#include "dapl_evd_util.h"
-#include "dapl_cr_util.h"
-#include "dapl_name_service.h"
-#include "dapl_ib_util.h"
-#include "dapl_vendor.h"
-#include "dapl_osd.h"
-
-extern struct rdma_event_channel *g_cm_events;
-
-/* local prototypes */
-static struct dapl_cm_id *dapli_req_recv(struct dapl_cm_id *conn,
-                                        struct rdma_cm_event *event);
-static void dapli_cm_active_cb(struct dapl_cm_id *conn,
-                              struct rdma_cm_event *event);
-static void dapli_cm_passive_cb(struct dapl_cm_id *conn,
-                               struct rdma_cm_event *event);
-static void dapli_addr_resolve(struct dapl_cm_id *conn);
-static void dapli_route_resolve(struct dapl_cm_id *conn);
-
-/* cma requires 16 bit SID, in network order */
-#define IB_PORT_MOD 32001
-#define IB_PORT_BASE (65535 - IB_PORT_MOD)
-#define SID_TO_PORT(SID) \
-    (SID > 0xffff ? \
-    htons((unsigned short)((SID % IB_PORT_MOD) + IB_PORT_BASE)) :\
-    htons((unsigned short)SID))
-
-#define PORT_TO_SID(p) ntohs(p)
-
-/* private data header to validate consumer rejects versus abnormal events */
-struct dapl_pdata_hdr {
-       DAT_UINT32 version;
-};
-
-static void dapli_addr_resolve(struct dapl_cm_id *conn)
-{
-       int ret;
-#ifdef DAPL_DBG
-       struct rdma_addr *ipaddr = &conn->cm_id->route.addr;
-#endif
-       dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                    " addr_resolve: cm_id %p SRC %x DST %x\n",
-                    conn->cm_id, ntohl(((struct sockaddr_in *)
-                                        &ipaddr->src_addr)->sin_addr.s_addr),
-                    ntohl(((struct sockaddr_in *)
-                           &ipaddr->dst_addr)->sin_addr.s_addr));
-
-       ret = rdma_resolve_route(conn->cm_id, conn->route_timeout);
-       if (ret) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " dapl_cma_connect: rdma_resolve_route ERR 0x%x %s\n",
-                        ret, strerror(errno));
-               dapl_evd_connection_callback(conn,
-                                            IB_CME_LOCAL_FAILURE,
-                                            NULL, conn->ep);
-       }
-}
-
-static void dapli_route_resolve(struct dapl_cm_id *conn)
-{
-       int ret;
-#ifdef DAPL_DBG
-       struct rdma_addr *ipaddr = &conn->cm_id->route.addr;
-       struct ib_addr *ibaddr = &conn->cm_id->route.addr.addr.ibaddr;
-#endif
-
-       dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                    " route_resolve: cm_id %p SRC %x DST %x PORT %d\n",
-                    conn->cm_id, ntohl(((struct sockaddr_in *)
-                                        &ipaddr->src_addr)->sin_addr.s_addr),
-                    ntohl(((struct sockaddr_in *)
-                           &ipaddr->dst_addr)->sin_addr.s_addr),
-                    ntohs(((struct sockaddr_in *)
-                           &ipaddr->dst_addr)->sin_port));
-
-       dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                    " route_resolve: SRC GID subnet %016llx id %016llx\n",
-                    (unsigned long long)
-                    ntohll(ibaddr->sgid.global.subnet_prefix),
-                    (unsigned long long)
-                    ntohll(ibaddr->sgid.global.interface_id));
-
-       dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                    " route_resolve: DST GID subnet %016llx id %016llx\n",
-                    (unsigned long long)
-                    ntohll(ibaddr->dgid.global.subnet_prefix),
-                    (unsigned long long)
-                    ntohll(ibaddr->dgid.global.interface_id));
-
-       dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                    " route_resolve: cm_id %p pdata %p plen %d rr %d ind %d\n",
-                    conn->cm_id,
-                    conn->params.private_data,
-                    conn->params.private_data_len,
-                    conn->params.responder_resources,
-                    conn->params.initiator_depth);
-
-       ret = rdma_connect(conn->cm_id, &conn->params);
-       if (ret) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " dapl_cma_connect: rdma_connect ERR %d %s\n",
-                        ret, strerror(errno));
-               goto bail;
-       }
-       return;
-
-      bail:
-       dapl_evd_connection_callback(conn,
-                                    IB_CME_LOCAL_FAILURE, NULL, conn->ep);
-}
-
-/* 
- * Called from consumer thread via dat_ep_free().
- * CANNOT be called from the async event processing thread
- * dapli_cma_event_cb() since a cm_id reference is held and
- * a deadlock will occur.
- */
-void dapli_destroy_conn(struct dapl_cm_id *conn)
-{
-       struct rdma_cm_id *cm_id;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                    " destroy_conn: conn %p id %d\n", conn, conn->cm_id);
-
-       dapl_os_lock(&conn->lock);
-       conn->destroy = 1;
-
-       if (conn->ep) {
-               conn->ep->cm_handle = IB_INVALID_HANDLE;
-               conn->ep->qp_handle = IB_INVALID_HANDLE;
-       }
-
-       cm_id = conn->cm_id;
-       conn->cm_id = NULL;
-       dapl_os_unlock(&conn->lock);
-
-       /* 
-        * rdma_destroy_id will force synchronization with async CM event 
-        * thread since it blocks until the in-process event reference
-        * is cleared during our event processing call exit.
-        */
-       if (cm_id) {
-               if (cm_id->qp)
-                       rdma_destroy_qp(cm_id);
-
-               rdma_destroy_id(cm_id);
-       }
-       dapl_os_free(conn, sizeof(*conn));
-}
-
-static struct dapl_cm_id *dapli_req_recv(struct dapl_cm_id *conn,
-                                        struct rdma_cm_event *event)
-{
-       struct dapl_cm_id *new_conn;
-#ifdef DAPL_DBG
-       struct rdma_addr *ipaddr = &event->id->route.addr;
-#endif
-
-       if (conn->sp == NULL) {
-               dapl_dbg_log(DAPL_DBG_TYPE_ERR,
-                            " dapli_rep_recv: on invalid listen " "handle\n");
-               return NULL;
-       }
-
-       /* allocate new cm_id and merge listen parameters */
-       new_conn = dapl_os_alloc(sizeof(*new_conn));
-       if (new_conn) {
-               (void)dapl_os_memzero(new_conn, sizeof(*new_conn));
-               dapl_os_lock_init(&new_conn->lock);
-               new_conn->cm_id = event->id;    /* provided by uCMA */
-               event->id->context = new_conn;  /* update CM_ID context */
-               new_conn->sp = conn->sp;
-               new_conn->hca = conn->hca;
-
-               /* Get requesters connect data, setup for accept */
-               new_conn->params.responder_resources =
-                   DAPL_MIN(event->param.conn.responder_resources,
-                            conn->hca->ib_trans.max_rdma_rd_in);
-               new_conn->params.initiator_depth =
-                   DAPL_MIN(event->param.conn.initiator_depth,
-                            conn->hca->ib_trans.max_rdma_rd_out);
-
-               new_conn->params.flow_control = event->param.conn.flow_control;
-               new_conn->params.rnr_retry_count =
-                   event->param.conn.rnr_retry_count;
-               new_conn->params.retry_count = event->param.conn.retry_count;
-
-               /* save private data */
-               if (event->param.conn.private_data_len) {
-                       dapl_os_memcpy(new_conn->p_data,
-                                      event->param.conn.private_data,
-                                      event->param.conn.private_data_len);
-                       new_conn->params.private_data = new_conn->p_data;
-                       new_conn->params.private_data_len =
-                           event->param.conn.private_data_len;
-               }
-
-               dapl_dbg_log(DAPL_DBG_TYPE_CM, " passive_cb: "
-                            "REQ: SP %p PORT %d LID %d "
-                            "NEW CONN %p ID %p pD %p,%d\n",
-                            new_conn->sp, ntohs(((struct sockaddr_in *)
-                                                 &ipaddr->src_addr)->sin_port),
-                            event->listen_id, new_conn, event->id,
-                            event->param.conn.private_data,
-                            event->param.conn.private_data_len);
-
-               dapl_dbg_log(DAPL_DBG_TYPE_CM, " passive_cb: "
-                            "REQ: IP SRC %x PORT %d DST %x PORT %d "
-                            "rr %d init %d\n", ntohl(((struct sockaddr_in *)
-                                                      &ipaddr->src_addr)->
-                                                     sin_addr.s_addr),
-                            ntohs(((struct sockaddr_in *)
-                                   &ipaddr->src_addr)->sin_port),
-                            ntohl(((struct sockaddr_in *)
-                                   &ipaddr->dst_addr)->sin_addr.s_addr),
-                            ntohs(((struct sockaddr_in *)
-                                   &ipaddr->dst_addr)->sin_port),
-                            new_conn->params.responder_resources,
-                            new_conn->params.initiator_depth);
-       }
-       return new_conn;
-}
-
-static void dapli_cm_active_cb(struct dapl_cm_id *conn,
-                              struct rdma_cm_event *event)
-{
-       dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                    " active_cb: conn %p id %d event %d\n",
-                    conn, conn->cm_id, event->event);
-
-       dapl_os_lock(&conn->lock);
-       if (conn->destroy) {
-               dapl_os_unlock(&conn->lock);
-               return;
-       }
-       dapl_os_unlock(&conn->lock);
-
-       /* There is a chance that we can get events after
-        * the consumer calls disconnect in a pending state
-        * since the IB CM and uDAPL states are not shared.
-        * In some cases, IB CM could generate either a DCONN
-        * or CONN_ERR after the consumer returned from
-        * dapl_ep_disconnect with a DISCONNECTED event
-        * already queued. Check state here and bail to
-        * avoid any events after a disconnect.
-        */
-       if (DAPL_BAD_HANDLE(conn->ep, DAPL_MAGIC_EP))
-               return;
-
-       dapl_os_lock(&conn->ep->header.lock);
-       if (conn->ep->param.ep_state == DAT_EP_STATE_DISCONNECTED) {
-               dapl_os_unlock(&conn->ep->header.lock);
-               return;
-       }
-       if (event->event == RDMA_CM_EVENT_DISCONNECTED)
-               conn->ep->param.ep_state = DAT_EP_STATE_DISCONNECTED;
-
-       dapl_os_unlock(&conn->ep->header.lock);
-
-       switch (event->event) {
-       case RDMA_CM_EVENT_UNREACHABLE:
-       case RDMA_CM_EVENT_CONNECT_ERROR:
-               {
-                       dapl_log(DAPL_DBG_TYPE_WARN,
-                                "dapl_cma_active: CONN_ERR event=0x%x"
-                                " status=%d %s DST %s, %d\n",
-                                event->event, event->status,
-                                (event->status == -ETIMEDOUT) ? "TIMEOUT" : "",
-                                inet_ntoa(((struct sockaddr_in *)
-                                           &conn->cm_id->route.addr.dst_addr)->
-                                          sin_addr),
-                                ntohs(((struct sockaddr_in *)
-                                       &conn->cm_id->route.addr.dst_addr)->
-                                      sin_port));
-
-                       /* per DAT SPEC provider always returns UNREACHABLE */
-                       dapl_evd_connection_callback(conn,
-                                                    IB_CME_DESTINATION_UNREACHABLE,
-                                                    NULL, conn->ep);
-                       break;
-               }
-       case RDMA_CM_EVENT_REJECTED:
-               {
-                       ib_cm_events_t cm_event;
-                       unsigned char *pdata = NULL;
-
-                       dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                                    " dapli_cm_active_handler: REJECTED reason=%d\n",
-                                    event->status);
-
-                       /* valid REJ from consumer will always contain private data */
-                       if (event->status == 28 &&
-                           event->param.conn.private_data_len) {
-                               cm_event =
-                                   IB_CME_DESTINATION_REJECT_PRIVATE_DATA;
-                               pdata =
-                                   (unsigned char *)event->param.conn.
-                                   private_data +
-                                   sizeof(struct dapl_pdata_hdr);
-                       } else {
-                               cm_event = IB_CME_DESTINATION_REJECT;
-                               dapl_log(DAPL_DBG_TYPE_WARN,
-                                        "dapl_cma_active: non-consumer REJ,"
-                                        " reason=%d, DST %s, %d\n",
-                                        event->status,
-                                        inet_ntoa(((struct sockaddr_in *)
-                                                   &conn->cm_id->route.addr.
-                                                   dst_addr)->sin_addr),
-                                        ntohs(((struct sockaddr_in *)
-                                               &conn->cm_id->route.addr.
-                                               dst_addr)->sin_port));
-                       }
-                       dapl_evd_connection_callback(conn, cm_event, pdata,
-                                                    conn->ep);
-                       break;
-               }
-       case RDMA_CM_EVENT_ESTABLISHED:
-               dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                            " active_cb: cm_id %d PORT %d CONNECTED to %s!\n",
-                            conn->cm_id, ntohs(((struct sockaddr_in *)
-                                                &conn->cm_id->route.addr.
-                                                dst_addr)->sin_port),
-                            inet_ntoa(((struct sockaddr_in *)
-                                       &conn->cm_id->route.addr.dst_addr)->
-                                      sin_addr));
-
-               /* setup local and remote ports for ep query */
-               conn->ep->param.remote_port_qual =
-                   PORT_TO_SID(rdma_get_dst_port(conn->cm_id));
-               conn->ep->param.local_port_qual =
-                   PORT_TO_SID(rdma_get_src_port(conn->cm_id));
-
-               dapl_evd_connection_callback(conn, IB_CME_CONNECTED,
-                                            event->param.conn.private_data,
-                                            conn->ep);
-               break;
-
-       case RDMA_CM_EVENT_DISCONNECTED:
-               rdma_disconnect(conn->cm_id);   /* required for DREP */
-               /* validate EP handle */
-               if (!DAPL_BAD_HANDLE(conn->ep, DAPL_MAGIC_EP))
-                       dapl_evd_connection_callback(conn,
-                                                    IB_CME_DISCONNECTED,
-                                                    NULL, conn->ep);
-               break;
-       default:
-               dapl_dbg_log(DAPL_DBG_TYPE_ERR,
-                            " dapli_cm_active_cb_handler: Unexpected CM "
-                            "event %d on ID 0x%p\n", event->event,
-                            conn->cm_id);
-               break;
-       }
-
-       return;
-}
-
-static void dapli_cm_passive_cb(struct dapl_cm_id *conn,
-                               struct rdma_cm_event *event)
-{
-       struct dapl_cm_id *new_conn;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                    " passive_cb: conn %p id %d event %d\n",
-                    conn, event->id, event->event);
-
-       dapl_os_lock(&conn->lock);
-       if (conn->destroy) {
-               dapl_os_unlock(&conn->lock);
-               return;
-       }
-       dapl_os_unlock(&conn->lock);
-
-       switch (event->event) {
-       case RDMA_CM_EVENT_CONNECT_REQUEST:
-               /* create new conn object with new conn_id from event */
-               new_conn = dapli_req_recv(conn, event);
-
-               if (new_conn)
-                       dapls_cr_callback(new_conn,
-                                         IB_CME_CONNECTION_REQUEST_PENDING,
-                                         event->param.conn.private_data,
-                                         new_conn->sp);
-               break;
-       case RDMA_CM_EVENT_UNREACHABLE:
-       case RDMA_CM_EVENT_CONNECT_ERROR:
-               dapl_log(DAPL_DBG_TYPE_WARN,
-                        "dapl_cm_passive: CONN_ERR event=0x%x status=%d %s,"
-                        " DST %s,%d\n",
-                        event->event, event->status,
-                        (event->status == -ETIMEDOUT) ? "TIMEOUT" : "",
-                        inet_ntoa(((struct sockaddr_in *)
-                                   &conn->cm_id->route.addr.dst_addr)->
-                                  sin_addr), ntohs(((struct sockaddr_in *)
-                                                    &conn->cm_id->route.addr.
-                                                    dst_addr)->sin_port));
-
-               dapls_cr_callback(conn, IB_CME_DESTINATION_UNREACHABLE,
-                                 NULL, conn->sp);
-               break;
-
-       case RDMA_CM_EVENT_REJECTED:
-               {
-                       /* will alwasys be abnormal NON-consumer from active side */
-                       dapl_log(DAPL_DBG_TYPE_WARN,
-                                "dapl_cm_passive: non-consumer REJ, reason=%d,"
-                                " DST %s, %d\n",
-                                event->status,
-                                inet_ntoa(((struct sockaddr_in *)
-                                           &conn->cm_id->route.addr.dst_addr)->
-                                          sin_addr),
-                                ntohs(((struct sockaddr_in *)
-                                       &conn->cm_id->route.addr.dst_addr)->
-                                      sin_port));
-
-                       dapls_cr_callback(conn, IB_CME_DESTINATION_REJECT,
-                                         NULL, conn->sp);
-                       break;
-               }
-       case RDMA_CM_EVENT_ESTABLISHED:
-               dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                            " passive_cb: cm_id %p PORT %d CONNECTED from 0x%x!\n",
-                            conn->cm_id, ntohs(((struct sockaddr_in *)
-                                                &conn->cm_id->route.addr.
-                                                src_addr)->sin_port),
-                            ntohl(((struct sockaddr_in *)
-                                   &conn->cm_id->route.addr.dst_addr)->
-                                  sin_addr.s_addr));
-
-               dapls_cr_callback(conn, IB_CME_CONNECTED, NULL, conn->sp);
-
-               break;
-       case RDMA_CM_EVENT_DISCONNECTED:
-               rdma_disconnect(conn->cm_id);   /* required for DREP */
-               /* validate SP handle context */
-               if (!DAPL_BAD_HANDLE(conn->sp, DAPL_MAGIC_PSP) ||
-                   !DAPL_BAD_HANDLE(conn->sp, DAPL_MAGIC_RSP))
-                       dapls_cr_callback(conn,
-                                         IB_CME_DISCONNECTED, NULL, conn->sp);
-               break;
-       default:
-               dapl_dbg_log(DAPL_DBG_TYPE_ERR, " passive_cb: "
-                            "Unexpected CM event %d on ID 0x%p\n",
-                            event->event, conn->cm_id);
-               break;
-       }
-
-       return;
-}
-
-/************************ DAPL provider entry points **********************/
-
-/*
- * dapls_ib_connect
- *
- * Initiate a connection with the passive listener on another node
- *
- * Input:
- *     ep_handle,
- *     remote_ia_address,
- *     remote_conn_qual,
- *     prd_size                size of private data and structure
- *     prd_prt                 pointer to private data structure
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INSUFFICIENT_RESOURCES
- *     DAT_INVALID_PARAMETER
- *
- */
-DAT_RETURN dapls_ib_connect(IN DAT_EP_HANDLE ep_handle,
-                           IN DAT_IA_ADDRESS_PTR r_addr,
-                           IN DAT_CONN_QUAL r_qual,
-                           IN DAT_COUNT p_size, IN void *p_data)
-{
-       struct dapl_ep *ep_ptr = ep_handle;
-       struct dapl_cm_id *conn;
-       int ret;
-
-       /* Sanity check */
-       if (NULL == ep_ptr)
-               return DAT_SUCCESS;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                    " connect: rSID 0x%llx rPort %d, pdata %p, ln %d\n",
-                    r_qual, ntohs(SID_TO_PORT(r_qual)), p_data, p_size);
-
-       /* rdma conn and cm_id pre-bound; reference via qp_handle */
-       conn = ep_ptr->cm_handle = ep_ptr->qp_handle;
-
-       /* Setup QP/CM parameters and private data in cm_id */
-       (void)dapl_os_memzero(&conn->params, sizeof(conn->params));
-       conn->params.responder_resources =
-           ep_ptr->param.ep_attr.max_rdma_read_in;
-       conn->params.initiator_depth = ep_ptr->param.ep_attr.max_rdma_read_out;
-       conn->params.flow_control = 1;
-       conn->params.rnr_retry_count = IB_RNR_RETRY_COUNT;
-       conn->params.retry_count = IB_RC_RETRY_COUNT;
-       if (p_size) {
-               dapl_os_memcpy(conn->p_data, p_data, p_size);
-               conn->params.private_data = conn->p_data;
-               conn->params.private_data_len = p_size;
-       }
-
-       /* copy in remote address, need a copy for retry attempts */
-       dapl_os_memcpy(&conn->r_addr, r_addr, sizeof(*r_addr));
-
-       /* Resolve remote address, src already bound during QP create */
-       ((struct sockaddr_in *)&conn->r_addr)->sin_port = SID_TO_PORT(r_qual);
-       ((struct sockaddr_in *)&conn->r_addr)->sin_family = AF_INET;
-
-       ret = rdma_resolve_addr(conn->cm_id, NULL,
-                               (struct sockaddr *)&conn->r_addr,
-                               conn->arp_timeout);
-       if (ret) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " dapl_cma_connect: rdma_resolve_addr ERR 0x%x %s\n",
-                        ret, strerror(errno));
-               return dapl_convert_errno(errno, "ib_connect");
-       }
-       dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                    " connect: resolve_addr: cm_id %p -> %s port %d\n",
-                    conn->cm_id,
-                    inet_ntoa(((struct sockaddr_in *)&conn->r_addr)->sin_addr),
-                    ((struct sockaddr_in *)&conn->r_addr)->sin_port);
-
-       return DAT_SUCCESS;
-}
-
-/*
- * dapls_ib_disconnect
- *
- * Disconnect an EP
- *
- * Input:
- *     ep_handle,
- *     disconnect_flags
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *
- */
-DAT_RETURN
-dapls_ib_disconnect(IN DAPL_EP * ep_ptr, IN DAT_CLOSE_FLAGS close_flags)
-{
-       dp_ib_cm_handle_t conn = ep_ptr->cm_handle;
-       int ret;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                    " disconnect(ep %p, conn %p, id %d flags %x)\n",
-                    ep_ptr, conn, (conn ? conn->cm_id : 0), close_flags);
-
-       if ((conn == IB_INVALID_HANDLE) || (conn->cm_id == NULL))
-               return DAT_SUCCESS;
-
-       /* no graceful half-pipe disconnect option */
-       ret = rdma_disconnect(conn->cm_id);
-       if (ret)
-               dapl_dbg_log(DAPL_DBG_TYPE_ERR,
-                            " disconnect: ID %p ret 0x%x\n",
-                            ep_ptr->cm_handle, ret);
-
-       /* 
-        * DAT event notification occurs from the callback
-        * Note: will fire even if DREQ goes unanswered on timeout 
-        */
-       return DAT_SUCCESS;
-}
-
-/*
- * dapls_ib_disconnect_clean
- *
- * Clean up outstanding connection data. This routine is invoked
- * after the final disconnect callback has occurred. Only on the
- * ACTIVE side of a connection.
- *
- * Input:
- *     ep_ptr          DAPL_EP
- *     active          Indicates active side of connection
- *
- * Output:
- *     none
- *
- * Returns:
- *     void
- *
- */
-void
-dapls_ib_disconnect_clean(IN DAPL_EP * ep_ptr,
-                         IN DAT_BOOLEAN active,
-                         IN const ib_cm_events_t ib_cm_event)
-{
-       /* nothing to do */
-       return;
-}
-
-/*
- * dapl_ib_setup_conn_listener
- *
- * Have the CM set up a connection listener.
- *
- * Input:
- *     ibm_hca_handle          HCA handle
- *     qp_handle                       QP handle
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INSUFFICIENT_RESOURCES
- *     DAT_INTERNAL_ERROR
- *     DAT_CONN_QUAL_UNAVAILBLE
- *     DAT_CONN_QUAL_IN_USE
- *
- */
-DAT_RETURN
-dapls_ib_setup_conn_listener(IN DAPL_IA * ia_ptr,
-                            IN DAT_UINT64 ServiceID, IN DAPL_SP * sp_ptr)
-{
-       DAT_RETURN dat_status = DAT_SUCCESS;
-       ib_cm_srvc_handle_t conn;
-       DAT_SOCK_ADDR6 addr;    /* local binding address */
-
-       /* Allocate CM and initialize lock */
-       if ((conn = dapl_os_alloc(sizeof(*conn))) == NULL)
-               return DAT_INSUFFICIENT_RESOURCES;
-
-       dapl_os_memzero(conn, sizeof(*conn));
-       dapl_os_lock_init(&conn->lock);
-
-       /* create CM_ID, bind to local device, create QP */
-       if (rdma_create_id
-           (g_cm_events, &conn->cm_id, (void *)conn, RDMA_PS_TCP)) {
-               dapl_os_free(conn, sizeof(*conn));
-               return (dapl_convert_errno(errno, "setup_listener"));
-       }
-
-       /* open identifies the local device; per DAT specification */
-       /* Get family and address then set port to consumer's ServiceID */
-       dapl_os_memcpy(&addr, &ia_ptr->hca_ptr->hca_address, sizeof(addr));
-       ((struct sockaddr_in *)&addr)->sin_port = SID_TO_PORT(ServiceID);
-
-       if (rdma_bind_addr(conn->cm_id, (struct sockaddr *)&addr)) {
-               if ((errno == EBUSY) || (errno == EADDRINUSE))
-                       dat_status = DAT_CONN_QUAL_IN_USE;
-               else
-                       dat_status =
-                           dapl_convert_errno(errno, "setup_listener");
-               goto bail;
-       }
-
-       dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                    " listen(ia_ptr %p SID 0x%llx Port %d sp %p conn %p id %d)\n",
-                    ia_ptr, ServiceID, ntohs(SID_TO_PORT(ServiceID)),
-                    sp_ptr, conn, conn->cm_id);
-
-       sp_ptr->cm_srvc_handle = conn;
-       conn->sp = sp_ptr;
-       conn->hca = ia_ptr->hca_ptr;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    " listen(conn=%p cm_id=%d)\n",
-                    sp_ptr->cm_srvc_handle, conn->cm_id);
-
-       if (rdma_listen(conn->cm_id, 0)) {      /* max cma backlog */
-
-               if ((errno == EBUSY) || (errno == EADDRINUSE))
-                       dat_status = DAT_CONN_QUAL_IN_USE;
-               else
-                       dat_status =
-                           dapl_convert_errno(errno, "setup_listener");
-               goto bail;
-       }
-
-       /* success */
-       return DAT_SUCCESS;
-
-      bail:
-       rdma_destroy_id(conn->cm_id);
-       dapl_os_free(conn, sizeof(*conn));
-       return dat_status;
-}
-
-/*
- * dapl_ib_remove_conn_listener
- *
- * Have the CM remove a connection listener.
- *
- * Input:
- *     ia_handle               IA handle
- *     ServiceID               IB Channel Service ID
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INVALID_STATE
- *
- */
-DAT_RETURN
-dapls_ib_remove_conn_listener(IN DAPL_IA * ia_ptr, IN DAPL_SP * sp_ptr)
-{
-       ib_cm_srvc_handle_t conn = sp_ptr->cm_srvc_handle;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                    " remove_listen(ia_ptr %p sp_ptr %p cm_ptr %p)\n",
-                    ia_ptr, sp_ptr, conn);
-
-       if (conn != IB_INVALID_HANDLE) {
-               sp_ptr->cm_srvc_handle = NULL;
-               dapli_destroy_conn(conn);
-       }
-       return DAT_SUCCESS;
-}
-
-/*
- * dapls_ib_accept_connection
- *
- * Perform necessary steps to accept a connection
- *
- * Input:
- *     cr_handle
- *     ep_handle
- *     private_data_size
- *     private_data
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INSUFFICIENT_RESOURCES
- *     DAT_INTERNAL_ERROR
- *
- */
-DAT_RETURN
-dapls_ib_accept_connection(IN DAT_CR_HANDLE cr_handle,
-                          IN DAT_EP_HANDLE ep_handle,
-                          IN DAT_COUNT p_size, IN const DAT_PVOID p_data)
-{
-       DAPL_CR *cr_ptr = (DAPL_CR *) cr_handle;
-       DAPL_EP *ep_ptr = (DAPL_EP *) ep_handle;
-       DAPL_IA *ia_ptr = ep_ptr->header.owner_ia;
-       struct dapl_cm_id *cr_conn = cr_ptr->ib_cm_handle;
-       int ret;
-       DAT_RETURN dat_status;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                    " accept(cr %p conn %p, id %p, p_data %p, p_sz=%d)\n",
-                    cr_ptr, cr_conn, cr_conn->cm_id, p_data, p_size);
-
-       /* Obtain size of private data structure & contents */
-       if (p_size > IB_MAX_REP_PDATA_SIZE) {
-               dat_status = DAT_ERROR(DAT_LENGTH_ERROR, DAT_NO_SUBTYPE);
-               goto bail;
-       }
-
-       if (ep_ptr->qp_state == DAPL_QP_STATE_UNATTACHED) {
-               /* 
-                * If we are lazy attaching the QP then we may need to
-                * hook it up here. Typically, we run this code only for
-                * DAT_PSP_PROVIDER_FLAG
-                */
-               dat_status = dapls_ib_qp_alloc(ia_ptr, ep_ptr, NULL);
-               if (dat_status != DAT_SUCCESS) {
-                       dapl_log(DAPL_DBG_TYPE_ERR,
-                                " dapl_cma_accept: qp_alloc ERR %d\n",
-                                dat_status);
-                       goto bail;
-               }
-       }
-
-       /* 
-        * Validate device and port in EP cm_id against inbound 
-        * CR cm_id. The pre-allocated EP cm_id is already bound to 
-        * a local device (cm_id and QP) when created. Move the QP
-        * to the new cm_id only if device and port numbers match.
-        */
-       if (ep_ptr->qp_handle->cm_id->verbs == cr_conn->cm_id->verbs &&
-           ep_ptr->qp_handle->cm_id->port_num == cr_conn->cm_id->port_num) {
-               /* move QP to new cr_conn, remove QP ref in EP cm_id */
-               cr_conn->cm_id->qp = ep_ptr->qp_handle->cm_id->qp;
-               ep_ptr->qp_handle->cm_id->qp = NULL;
-               dapli_destroy_conn(ep_ptr->qp_handle);
-       } else {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " dapl_cma_accept: ERR dev(%p!=%p) or"
-                        " port mismatch(%d!=%d)\n",
-                        ep_ptr->qp_handle->cm_id->verbs, cr_conn->cm_id->verbs,
-                        ntohs(ep_ptr->qp_handle->cm_id->port_num),
-                        ntohs(cr_conn->cm_id->port_num));
-               dat_status = DAT_INTERNAL_ERROR;
-               goto bail;
-       }
-
-       cr_ptr->param.local_ep_handle = ep_handle;
-       cr_conn->params.private_data = p_data;
-       cr_conn->params.private_data_len = p_size;
-
-       ret = rdma_accept(cr_conn->cm_id, &cr_conn->params);
-       if (ret) {
-               dapl_log(DAPL_DBG_TYPE_ERR, " dapl_cma_accept: ERR %d %s\n",
-                        ret, strerror(errno));
-               dat_status = dapl_convert_errno(ret, "accept");
-               goto bail;
-       }
-
-       /* save accepted conn and EP reference */
-       ep_ptr->qp_handle = cr_conn;
-       ep_ptr->cm_handle = cr_conn;
-       cr_conn->ep = ep_ptr;
-
-       /* setup local and remote ports for ep query */
-       /* Note: port qual in network order */
-       ep_ptr->param.remote_port_qual =
-           PORT_TO_SID(rdma_get_dst_port(cr_conn->cm_id));
-       ep_ptr->param.local_port_qual =
-           PORT_TO_SID(rdma_get_src_port(cr_conn->cm_id));
-
-       return DAT_SUCCESS;
-      bail:
-       rdma_reject(cr_conn->cm_id, NULL, 0);
-       dapli_destroy_conn(cr_conn);
-       return dat_status;
-}
-
-/*
- * dapls_ib_reject_connection
- *
- * Reject a connection
- *
- * Input:
- *     cr_handle
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INTERNAL_ERROR
- *
- */
-DAT_RETURN
-dapls_ib_reject_connection(IN dp_ib_cm_handle_t cm_handle,
-                          IN int reason,
-                          IN DAT_COUNT private_data_size,
-                          IN const DAT_PVOID private_data)
-{
-       int ret;
-       int offset = sizeof(struct dapl_pdata_hdr);
-       struct dapl_pdata_hdr pdata_hdr;
-
-       memset(&pdata_hdr, 0, sizeof pdata_hdr);
-       pdata_hdr.version = htonl((DAT_VERSION_MAJOR << 24) |
-                                 (DAT_VERSION_MINOR << 16) |
-                                 (VN_PROVIDER_MAJOR << 8) |
-                                 (VN_PROVIDER_MINOR));
-
-       dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                    " reject: handle %p reason %x, ver=%x, data %p, sz=%d\n",
-                    cm_handle, reason, ntohl(pdata_hdr.version),
-                    private_data, private_data_size);
-
-       if (cm_handle == IB_INVALID_HANDLE) {
-               dapl_dbg_log(DAPL_DBG_TYPE_ERR,
-                            " reject: invalid handle: reason %d\n", reason);
-               return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_CR);
-       }
-
-       if (private_data_size >
-           dapls_ib_private_data_size(NULL, DAPL_PDATA_CONN_REJ,
-                                      cm_handle->hca))
-               return DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3);
-
-       /* setup pdata_hdr and users data, in CR pdata buffer */
-       dapl_os_memcpy(cm_handle->p_data, &pdata_hdr, offset);
-       if (private_data_size)
-               dapl_os_memcpy(cm_handle->p_data + offset,
-                              private_data, private_data_size);
-
-       /*
-        * Always some private data with reject so active peer can
-        * determine real application reject from an abnormal 
-        * application termination
-        */
-       ret = rdma_reject(cm_handle->cm_id,
-                         cm_handle->p_data, offset + private_data_size);
-
-       dapli_destroy_conn(cm_handle);
-       return dapl_convert_errno(ret, "reject");
-}
-
-/*
- * dapls_ib_cm_remote_addr
- *
- * Obtain the remote IP address given a connection
- *
- * Input:
- *     cr_handle
- *
- * Output:
- *     remote_ia_address: where to place the remote address
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INVALID_HANDLE
- *
- */
-DAT_RETURN
-dapls_ib_cm_remote_addr(IN DAT_HANDLE dat_handle, OUT DAT_SOCK_ADDR6 * raddr)
-{
-       DAPL_HEADER *header;
-       dp_ib_cm_handle_t ib_cm_handle;
-       struct rdma_addr *ipaddr;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    " remote_addr(cm_handle=%p, r_addr=%p)\n",
-                    dat_handle, raddr);
-
-       header = (DAPL_HEADER *) dat_handle;
-
-       if (header->magic == DAPL_MAGIC_EP)
-               ib_cm_handle = ((DAPL_EP *) dat_handle)->cm_handle;
-       else if (header->magic == DAPL_MAGIC_CR)
-               ib_cm_handle = ((DAPL_CR *) dat_handle)->ib_cm_handle;
-       else
-               return DAT_INVALID_HANDLE;
-
-       /* get remote IP address from cm_id route */
-       ipaddr = &ib_cm_handle->cm_id->route.addr;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                    " remote_addr: conn %p id %p SRC %x DST %x PORT %d\n",
-                    ib_cm_handle, ib_cm_handle->cm_id,
-                    ntohl(((struct sockaddr_in *)
-                           &ipaddr->src_addr)->sin_addr.s_addr),
-                    ntohl(((struct sockaddr_in *)
-                           &ipaddr->dst_addr)->sin_addr.s_addr),
-                    ntohs(((struct sockaddr_in *)
-                           &ipaddr->dst_addr)->sin_port));
-
-       dapl_os_memcpy(raddr, &ipaddr->dst_addr, sizeof(DAT_SOCK_ADDR));
-       return DAT_SUCCESS;
-}
-
-/*
- * dapls_ib_private_data_size
- *
- * Return the size of private data given a connection op type
- *
- * Input:
- *     prd_ptr         private data pointer
- *     conn_op         connection operation type
- *      hca_ptr         hca pointer, needed for transport type
- *
- * If prd_ptr is NULL, this is a query for the max size supported by
- * the provider, otherwise it is the actual size of the private data
- * contained in prd_ptr.
- *
- *
- * Output:
- *     None
- *
- * Returns:
- *     length of private data
- *
- */
-int dapls_ib_private_data_size(IN DAPL_PRIVATE * prd_ptr,
-                              IN DAPL_PDATA_OP conn_op, IN DAPL_HCA * hca_ptr)
-{
-       int size;
-
-       if (hca_ptr->ib_hca_handle->device->transport_type
-           == IBV_TRANSPORT_IWARP)
-               return (IWARP_MAX_PDATA_SIZE - sizeof(struct dapl_pdata_hdr));
-
-       switch (conn_op) {
-
-       case DAPL_PDATA_CONN_REQ:
-               size = IB_MAX_REQ_PDATA_SIZE;
-               break;
-       case DAPL_PDATA_CONN_REP:
-               size = IB_MAX_REP_PDATA_SIZE;
-               break;
-       case DAPL_PDATA_CONN_REJ:
-               size = IB_MAX_REJ_PDATA_SIZE - sizeof(struct dapl_pdata_hdr);
-               break;
-       case DAPL_PDATA_CONN_DREQ:
-               size = IB_MAX_DREQ_PDATA_SIZE;
-               break;
-       case DAPL_PDATA_CONN_DREP:
-               size = IB_MAX_DREP_PDATA_SIZE;
-               break;
-       default:
-               size = 0;
-
-       }                       /* end case */
-
-       return size;
-}
-
-/*
- * Map all CMA event codes to the DAT equivelent.
- */
-#define DAPL_IB_EVENT_CNT      13
-
-static struct ib_cm_event_map {
-       const ib_cm_events_t ib_cm_event;
-       DAT_EVENT_NUMBER dat_event_num;
-} ib_cm_event_map[DAPL_IB_EVENT_CNT] = {
-       /* 00 */  {
-       IB_CME_CONNECTED, DAT_CONNECTION_EVENT_ESTABLISHED},
-           /* 01 */  {
-       IB_CME_DISCONNECTED, DAT_CONNECTION_EVENT_DISCONNECTED},
-           /* 02 */  {
-       IB_CME_DISCONNECTED_ON_LINK_DOWN,
-                   DAT_CONNECTION_EVENT_DISCONNECTED},
-           /* 03 */  {
-       IB_CME_CONNECTION_REQUEST_PENDING, DAT_CONNECTION_REQUEST_EVENT},
-           /* 04 */  {
-       IB_CME_CONNECTION_REQUEST_PENDING_PRIVATE_DATA,
-                   DAT_CONNECTION_REQUEST_EVENT},
-           /* 05 */  {
-       IB_CME_CONNECTION_REQUEST_ACKED, DAT_CONNECTION_REQUEST_EVENT},
-           /* 06 */  {
-       IB_CME_DESTINATION_REJECT,
-                   DAT_CONNECTION_EVENT_NON_PEER_REJECTED},
-           /* 07 */  {
-       IB_CME_DESTINATION_REJECT_PRIVATE_DATA,
-                   DAT_CONNECTION_EVENT_PEER_REJECTED},
-           /* 08 */  {
-       IB_CME_DESTINATION_UNREACHABLE, DAT_CONNECTION_EVENT_UNREACHABLE},
-           /* 09 */  {
-       IB_CME_TOO_MANY_CONNECTION_REQUESTS,
-                   DAT_CONNECTION_EVENT_NON_PEER_REJECTED},
-           /* 10 */  {
-       IB_CME_LOCAL_FAILURE, DAT_CONNECTION_EVENT_BROKEN},
-           /* 11 */  {
-       IB_CME_BROKEN, DAT_CONNECTION_EVENT_BROKEN},
-           /* 12 */  {
-IB_CME_TIMEOUT, DAT_CONNECTION_EVENT_TIMED_OUT},};
-
-/*
- * dapls_ib_get_cm_event
- *
- * Return a DAT connection event given a provider CM event.
- *
- * Input:
- *     dat_event_num   DAT event we need an equivelent CM event for
- *
- * Output:
- *     none
- *
- * Returns:
- *     ib_cm_event of translated DAPL value
- */
-DAT_EVENT_NUMBER
-dapls_ib_get_dat_event(IN const ib_cm_events_t ib_cm_event,
-                      IN DAT_BOOLEAN active)
-{
-       DAT_EVENT_NUMBER dat_event_num;
-       int i;
-
-       active = active;
-
-       dat_event_num = 0;
-       for (i = 0; i < DAPL_IB_EVENT_CNT; i++) {
-               if (ib_cm_event == ib_cm_event_map[i].ib_cm_event) {
-                       dat_event_num = ib_cm_event_map[i].dat_event_num;
-                       break;
-               }
-       }
-       dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,
-                    "dapls_ib_get_dat_event: event(%s) ib=0x%x dat=0x%x\n",
-                    active ? "active" : "passive", ib_cm_event, dat_event_num);
-
-       return dat_event_num;
-}
-
-/*
- * dapls_ib_get_dat_event
- *
- * Return a DAT connection event given a provider CM event.
- * 
- * Input:
- *     ib_cm_event     event provided to the dapl callback routine
- *     active          switch indicating active or passive connection
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_EVENT_NUMBER of translated provider value
- */
-ib_cm_events_t dapls_ib_get_cm_event(IN DAT_EVENT_NUMBER dat_event_num)
-{
-       ib_cm_events_t ib_cm_event;
-       int i;
-
-       ib_cm_event = 0;
-       for (i = 0; i < DAPL_IB_EVENT_CNT; i++) {
-               if (dat_event_num == ib_cm_event_map[i].dat_event_num) {
-                       ib_cm_event = ib_cm_event_map[i].ib_cm_event;
-                       break;
-               }
-       }
-       return ib_cm_event;
-}
-
-void dapli_cma_event_cb(void)
-{
-       struct rdma_cm_event *event;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cm_event()\n");
-
-       /* process one CM event, fairness */
-       if (!rdma_get_cm_event(g_cm_events, &event)) {
-               struct dapl_cm_id *conn;
-
-               /* set proper conn from cm_id context */
-               if (event->event == RDMA_CM_EVENT_CONNECT_REQUEST)
-                       conn = (struct dapl_cm_id *)event->listen_id->context;
-               else
-                       conn = (struct dapl_cm_id *)event->id->context;
-
-               dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                            " cm_event: EVENT=%d ID=%p LID=%p CTX=%p\n",
-                            event->event, event->id, event->listen_id, conn);
-
-               switch (event->event) {
-               case RDMA_CM_EVENT_ADDR_RESOLVED:
-                       dapli_addr_resolve(conn);
-                       break;
-
-               case RDMA_CM_EVENT_ROUTE_RESOLVED:
-                       dapli_route_resolve(conn);
-                       break;
-
-               case RDMA_CM_EVENT_ADDR_ERROR:
-                       dapl_log(DAPL_DBG_TYPE_WARN,
-                                "dapl_cma_active: CM ADDR ERROR: ->"
-                                " DST %s retry (%d)..\n",
-                                inet_ntoa(((struct sockaddr_in *)
-                                           &conn->r_addr)->sin_addr),
-                                conn->arp_retries);
-
-                       /* retry address resolution */
-                       if ((--conn->arp_retries) &&
-                           (event->status == -ETIMEDOUT)) {
-                               int ret;
-                               ret = rdma_resolve_addr(conn->cm_id, NULL,
-                                                       (struct sockaddr *)
-                                                       &conn->r_addr,
-                                                       conn->arp_timeout);
-                               if (!ret)
-                                       break;
-                               else {
-                                       dapl_dbg_log(DAPL_DBG_TYPE_WARN,
-                                                    " ERROR: rdma_resolve_addr = "
-                                                    "%d %s\n",
-                                                    ret, strerror(errno));
-                               }
-                       }
-                       /* retries exhausted or resolve_addr failed */
-                       dapl_log(DAPL_DBG_TYPE_ERR,
-                                "dapl_cma_active: ARP_ERR, retries(%d)"
-                                " exhausted -> DST %s,%d\n",
-                                IB_ARP_RETRY_COUNT,
-                                inet_ntoa(((struct sockaddr_in *)
-                                           &conn->cm_id->route.addr.dst_addr)->
-                                          sin_addr),
-                                ntohs(((struct sockaddr_in *)
-                                       &conn->cm_id->route.addr.dst_addr)->
-                                      sin_port));
-
-                       dapl_evd_connection_callback(conn,
-                                                    IB_CME_DESTINATION_UNREACHABLE,
-                                                    NULL, conn->ep);
-                       break;
-
-               case RDMA_CM_EVENT_ROUTE_ERROR:
-                       dapl_log(DAPL_DBG_TYPE_WARN,
-                                "dapl_cma_active: CM ROUTE ERROR: ->"
-                                " DST %s retry (%d)..\n",
-                                inet_ntoa(((struct sockaddr_in *)
-                                           &conn->r_addr)->sin_addr),
-                                conn->route_retries);
-
-                       /* retry route resolution */
-                       if ((--conn->route_retries) &&
-                           (event->status == -ETIMEDOUT))
-                               dapli_addr_resolve(conn);
-                       else {
-                               dapl_log(DAPL_DBG_TYPE_ERR,
-                                        "dapl_cma_active: PATH_RECORD_ERR,"
-                                        " retries(%d) exhausted, DST %s,%d\n",
-                                        IB_ROUTE_RETRY_COUNT,
-                                        inet_ntoa(((struct sockaddr_in *)
-                                                   &conn->cm_id->route.addr.
-                                                   dst_addr)->sin_addr),
-                                        ntohs(((struct sockaddr_in *)
-                                               &conn->cm_id->route.addr.
-                                               dst_addr)->sin_port));
-
-                               dapl_evd_connection_callback(conn,
-                                                            IB_CME_DESTINATION_UNREACHABLE,
-                                                            NULL, conn->ep);
-                       }
-                       break;
-
-               case RDMA_CM_EVENT_DEVICE_REMOVAL:
-                       dapl_evd_connection_callback(conn,
-                                                    IB_CME_LOCAL_FAILURE,
-                                                    NULL, conn->ep);
-                       break;
-               case RDMA_CM_EVENT_CONNECT_REQUEST:
-               case RDMA_CM_EVENT_CONNECT_ERROR:
-               case RDMA_CM_EVENT_UNREACHABLE:
-               case RDMA_CM_EVENT_REJECTED:
-               case RDMA_CM_EVENT_ESTABLISHED:
-               case RDMA_CM_EVENT_DISCONNECTED:
-                       /* passive or active */
-                       if (conn->sp)
-                               dapli_cm_passive_cb(conn, event);
-                       else
-                               dapli_cm_active_cb(conn, event);
-                       break;
-               case RDMA_CM_EVENT_CONNECT_RESPONSE:
-               default:
-                       dapl_dbg_log(DAPL_DBG_TYPE_WARN,
-                                    " cm_event: UNEXPECTED EVENT=%p ID=%p CTX=%p\n",
-                                    event->event, event->id,
-                                    event->id->context);
-                       break;
-               }
-               /* ack event, unblocks destroy_cm_id in consumer threads */
-               rdma_ack_cm_event(event);
-       }
-}
-
-/*
- * Local variables:
- *  c-indent-level: 4
- *  c-basic-offset: 4
- *  tab-width: 8
- * End:
- */
diff --git a/branches/winverbs/ulp/dapl2/dapl/openib_cma/dapl_ib_cq.c b/branches/winverbs/ulp/dapl2/dapl/openib_cma/dapl_ib_cq.c
deleted file mode 100644 (file)
index 7f67982..0000000
+++ /dev/null
@@ -1,559 +0,0 @@
-/*
- * Copyright (c) 2005-2007 Intel Corporation.  All rights reserved.
- *
- * This Software is licensed under one of the following licenses:
- *
- * 1) under the terms of the "Common Public License 1.0" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/cpl.php.
- *
- * 2) under the terms of the "The BSD License" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/bsd-license.php.
- *
- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
- *    copy of which is available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/gpl-license.php.
- *
- * Licensee has the right to choose one of the above licenses.
- *
- * Redistributions of source code must retain the above copyright
- * notice and one of the license notices.
- *
- * Redistributions in binary form must reproduce both the above copyright
- * notice, one of the license notices in the documentation
- * and/or other materials provided with the distribution.
- */
-
-/**********************************************************************
- *
- * MODULE: dapl_ib_cq.c
- *
- * PURPOSE: completion queues for OFED IB Verbs
- *
- * $Id: $
- *
- **********************************************************************/
-
-#include "openib_osd.h"
-#include "dapl.h"
-#include "dapl_adapter_util.h"
-#include "dapl_lmr_util.h"
-#include "dapl_evd_util.h"
-#include "dapl_ring_buffer_util.h"
-
-/* One CQ event channel per HCA */
-void dapli_cq_event_cb(struct _ib_hca_transport *hca)
-{
-       /* check all comp events on this device */
-       struct dapl_evd *evd_ptr = NULL;
-       struct ibv_cq *ibv_cq = NULL;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " dapli_cq_event_cb(%p)\n", hca);
-
-       if (!ibv_get_cq_event(hca->ib_cq, &ibv_cq, (void *)&evd_ptr)) {
-
-               if (DAPL_BAD_HANDLE(evd_ptr, DAPL_MAGIC_EVD)) {
-                       ibv_ack_cq_events(ibv_cq, 1);
-                       return;
-               }
-
-               /* process DTO event via callback */
-               dapl_evd_dto_callback(hca->cm_id->verbs,
-                                     evd_ptr->ib_cq_handle, (void *)evd_ptr);
-
-               ibv_ack_cq_events(ibv_cq, 1);
-       }
-}
-
-/*
- * Map all verbs DTO completion codes to the DAT equivelent.
- *
- * Not returned by verbs:     DAT_DTO_ERR_PARTIAL_PACKET
- */
-static struct ib_status_map {
-       int ib_status;
-       DAT_DTO_COMPLETION_STATUS dat_status;
-} ib_status_map[] = {
-/* 00 */  {
-       IBV_WC_SUCCESS, DAT_DTO_SUCCESS},
-/* 01 */  {
-       IBV_WC_LOC_LEN_ERR, DAT_DTO_ERR_LOCAL_LENGTH},
-/* 02 */  {
-       IBV_WC_LOC_QP_OP_ERR, DAT_DTO_ERR_LOCAL_EP},
-/* 03 */  {
-       IBV_WC_LOC_EEC_OP_ERR, DAT_DTO_ERR_TRANSPORT},
-/* 04 */  {
-       IBV_WC_LOC_PROT_ERR, DAT_DTO_ERR_LOCAL_PROTECTION},
-/* 05 */  {
-       IBV_WC_WR_FLUSH_ERR, DAT_DTO_ERR_FLUSHED},
-/* 06 */  {
-       IBV_WC_MW_BIND_ERR, DAT_RMR_OPERATION_FAILED},
-/* 07 */  {
-       IBV_WC_BAD_RESP_ERR, DAT_DTO_ERR_BAD_RESPONSE},
-/* 08 */  {
-       IBV_WC_LOC_ACCESS_ERR, DAT_DTO_ERR_LOCAL_PROTECTION},
-/* 09 */  {
-       IBV_WC_REM_INV_REQ_ERR, DAT_DTO_ERR_REMOTE_RESPONDER},
-/* 10 */  {
-       IBV_WC_REM_ACCESS_ERR, DAT_DTO_ERR_REMOTE_ACCESS},
-/* 11 */  {
-       IBV_WC_REM_OP_ERR, DAT_DTO_ERR_REMOTE_RESPONDER},
-/* 12 */  {
-       IBV_WC_RETRY_EXC_ERR, DAT_DTO_ERR_TRANSPORT},
-/* 13 */  {
-       IBV_WC_RNR_RETRY_EXC_ERR, DAT_DTO_ERR_RECEIVER_NOT_READY},
-/* 14 */  {
-       IBV_WC_LOC_RDD_VIOL_ERR, DAT_DTO_ERR_LOCAL_PROTECTION},
-/* 15 */  {
-       IBV_WC_REM_INV_RD_REQ_ERR, DAT_DTO_ERR_REMOTE_RESPONDER},
-/* 16 */  {
-       IBV_WC_REM_ABORT_ERR, DAT_DTO_ERR_REMOTE_RESPONDER},
-/* 17 */  {
-       IBV_WC_INV_EECN_ERR, DAT_DTO_ERR_TRANSPORT},
-/* 18 */  {
-       IBV_WC_INV_EEC_STATE_ERR, DAT_DTO_ERR_TRANSPORT},
-/* 19 */  {
-       IBV_WC_FATAL_ERR, DAT_DTO_ERR_TRANSPORT},
-/* 20 */  {
-       IBV_WC_RESP_TIMEOUT_ERR, DAT_DTO_ERR_RECEIVER_NOT_READY},
-/* 21 */  {
-IBV_WC_GENERAL_ERR, DAT_DTO_ERR_TRANSPORT},};
-
-/*
- * dapls_ib_get_dto_status
- *
- * Return the DAT status of a DTO operation
- *
- * Input:
- *     cqe_ptr         pointer to completion queue entry
- *
- * Output:
- *     none
- *
- * Returns:
- *     Value from ib_status_map table above
- */
-
-DAT_DTO_COMPLETION_STATUS
-dapls_ib_get_dto_status(IN ib_work_completion_t * cqe_ptr)
-{
-       uint32_t ib_status;
-       int i;
-
-       ib_status = DAPL_GET_CQE_STATUS(cqe_ptr);
-
-       /*
-        * Due to the implementation of verbs completion code, we need to
-        * search the table for the correct value rather than assuming
-        * linear distribution.
-        */
-       for (i = 0; i <= IBV_WC_GENERAL_ERR; i++) {
-               if (ib_status == ib_status_map[i].ib_status) {
-                       if (ib_status != IBV_WC_SUCCESS) {
-                               dapl_dbg_log(DAPL_DBG_TYPE_DTO_COMP_ERR,
-                                            " DTO completion ERROR: %d: op %#x\n",
-                                            ib_status,
-                                            DAPL_GET_CQE_OPTYPE(cqe_ptr));
-                       }
-                       return ib_status_map[i].dat_status;
-               }
-       }
-
-       dapl_dbg_log(DAPL_DBG_TYPE_DTO_COMP_ERR,
-                    " DTO completion ERROR: %d: op %#x\n",
-                    ib_status, DAPL_GET_CQE_OPTYPE(cqe_ptr));
-
-       return DAT_DTO_FAILURE;
-}
-
-DAT_RETURN dapls_ib_get_async_event(IN ib_error_record_t * err_record,
-                                   OUT DAT_EVENT_NUMBER * async_event)
-{
-       DAT_RETURN dat_status = DAT_SUCCESS;
-       int err_code = err_record->event_type;
-
-       switch (err_code) {
-               /* OVERFLOW error */
-       case IBV_EVENT_CQ_ERR:
-               *async_event = DAT_ASYNC_ERROR_EVD_OVERFLOW;
-               break;
-               /* INTERNAL errors */
-       case IBV_EVENT_DEVICE_FATAL:
-               *async_event = DAT_ASYNC_ERROR_PROVIDER_INTERNAL_ERROR;
-               break;
-               /* CATASTROPHIC errors */
-       case IBV_EVENT_PORT_ERR:
-               *async_event = DAT_ASYNC_ERROR_IA_CATASTROPHIC;
-               break;
-               /* BROKEN QP error */
-       case IBV_EVENT_SQ_DRAINED:
-       case IBV_EVENT_QP_FATAL:
-       case IBV_EVENT_QP_REQ_ERR:
-       case IBV_EVENT_QP_ACCESS_ERR:
-               *async_event = DAT_ASYNC_ERROR_EP_BROKEN;
-               break;
-               /* connection completion */
-       case IBV_EVENT_COMM_EST:
-               *async_event = DAT_CONNECTION_EVENT_ESTABLISHED;
-               break;
-               /* TODO: process HW state changes */
-       case IBV_EVENT_PATH_MIG:
-       case IBV_EVENT_PATH_MIG_ERR:
-       case IBV_EVENT_PORT_ACTIVE:
-       case IBV_EVENT_LID_CHANGE:
-       case IBV_EVENT_PKEY_CHANGE:
-       case IBV_EVENT_SM_CHANGE:
-       default:
-               dat_status = DAT_ERROR(DAT_NOT_IMPLEMENTED, 0);
-       }
-       return dat_status;
-}
-
-/*
- * dapl_ib_cq_alloc
- *
- * Alloc a CQ
- *
- * Input:
- *     ia_handle               IA handle
- *     evd_ptr                 pointer to EVD struct
- *     cqlen                   minimum QLen
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INSUFFICIENT_RESOURCES
- *
- */
-DAT_RETURN
-dapls_ib_cq_alloc(IN DAPL_IA * ia_ptr,
-                 IN DAPL_EVD * evd_ptr, IN DAT_COUNT * cqlen)
-{
-       struct ibv_comp_channel *channel = ia_ptr->hca_ptr->ib_trans.ib_cq;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    "dapls_ib_cq_alloc: evd %p cqlen=%d \n", evd_ptr, *cqlen);
-
-#ifdef CQ_WAIT_OBJECT
-       if (evd_ptr->cq_wait_obj_handle)
-               channel = evd_ptr->cq_wait_obj_handle->events;
-#endif
-
-       /* Call IB verbs to create CQ */
-       evd_ptr->ib_cq_handle = ibv_create_cq(ia_ptr->hca_ptr->ib_hca_handle,
-                                             *cqlen, evd_ptr, channel, 0);
-
-       if (evd_ptr->ib_cq_handle == IB_INVALID_HANDLE)
-               return (dapl_convert_errno(errno, "create_cq"));
-
-       /* arm cq for events */
-       dapls_set_cq_notify(ia_ptr, evd_ptr);
-
-       /* update with returned cq entry size */
-       *cqlen = evd_ptr->ib_cq_handle->cqe;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    "dapls_ib_cq_alloc: new_cq %p cqlen=%d \n",
-                    evd_ptr->ib_cq_handle, *cqlen);
-
-       return DAT_SUCCESS;
-}
-
-/*
- * dapl_ib_cq_resize
- *
- * Alloc a CQ
- *
- * Input:
- *     ia_handle               IA handle
- *     evd_ptr                 pointer to EVD struct
- *     cqlen                   minimum QLen
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INVALID_PARAMETER
- *
- */
-DAT_RETURN
-dapls_ib_cq_resize(IN DAPL_IA * ia_ptr,
-                  IN DAPL_EVD * evd_ptr, IN DAT_COUNT * cqlen)
-{
-       ib_cq_handle_t new_cq;
-       struct ibv_comp_channel *channel = ia_ptr->hca_ptr->ib_trans.ib_cq;
-
-       /* IB verbs doe not support resize. Try to re-create CQ
-        * with new size. Can only be done if QP is not attached. 
-        * destroy EBUSY == QP still attached.
-        */
-
-#ifdef CQ_WAIT_OBJECT
-       if (evd_ptr->cq_wait_obj_handle)
-               channel = evd_ptr->cq_wait_obj_handle->events;
-#endif
-
-       /* Call IB verbs to create CQ */
-       new_cq = ibv_create_cq(ia_ptr->hca_ptr->ib_hca_handle, *cqlen,
-                              evd_ptr, channel, 0);
-
-       if (new_cq == IB_INVALID_HANDLE)
-               return DAT_INSUFFICIENT_RESOURCES;
-
-       /* destroy the original and replace if successful */
-       if (ibv_destroy_cq(evd_ptr->ib_cq_handle)) {
-               ibv_destroy_cq(new_cq);
-               return (dapl_convert_errno(errno, "resize_cq"));
-       }
-
-       /* update EVD with new cq handle and size */
-       evd_ptr->ib_cq_handle = new_cq;
-       *cqlen = new_cq->cqe;
-
-       /* arm cq for events */
-       dapls_set_cq_notify(ia_ptr, evd_ptr);
-
-       return DAT_SUCCESS;
-}
-
-/*
- * dapls_ib_cq_free
- *
- * destroy a CQ
- *
- * Input:
- *     ia_handle               IA handle
- *     evd_ptr                 pointer to EVD struct
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INVALID_PARAMETER
- *
- */
-DAT_RETURN dapls_ib_cq_free(IN DAPL_IA * ia_ptr, IN DAPL_EVD * evd_ptr)
-{
-       if (evd_ptr->ib_cq_handle != IB_INVALID_HANDLE) {
-               /* copy all entries on CQ to EVD before destroying */
-               dapls_evd_copy_cq(evd_ptr);
-               if (ibv_destroy_cq(evd_ptr->ib_cq_handle))
-                       return (dapl_convert_errno(errno, "destroy_cq"));
-               evd_ptr->ib_cq_handle = IB_INVALID_HANDLE;
-       }
-       return DAT_SUCCESS;
-}
-
-/*
- * dapls_set_cq_notify
- *
- * Set the CQ notification for next
- *
- * Input:
- *     hca_handl               hca handle
- *     DAPL_EVD                evd handle
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     dapl_convert_errno 
- */
-DAT_RETURN dapls_set_cq_notify(IN DAPL_IA * ia_ptr, IN DAPL_EVD * evd_ptr)
-{
-       if (ibv_req_notify_cq(evd_ptr->ib_cq_handle, 0))
-               return (dapl_convert_errno(errno, "notify_cq"));
-       else
-               return DAT_SUCCESS;
-}
-
-/*
- * dapls_ib_completion_notify
- *
- * Set the CQ notification type
- *
- * Input:
- *     hca_handl               hca handle
- *     evd_ptr                 evd handle
- *     type                    notification type
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     dapl_convert_errno
- */
-DAT_RETURN dapls_ib_completion_notify(IN ib_hca_handle_t hca_handle,
-                                     IN DAPL_EVD * evd_ptr,
-                                     IN ib_notification_type_t type)
-{
-       if (ibv_req_notify_cq(evd_ptr->ib_cq_handle, type))
-               return (dapl_convert_errno(errno, "notify_cq_type"));
-       else
-               return DAT_SUCCESS;
-}
-
-/*
- * dapls_ib_completion_poll
- *
- * CQ poll for completions
- *
- * Input:
- *     hca_handl               hca handle
- *     evd_ptr                 evd handle
- *     wc_ptr                  work completion
- *
- * Output:
- *     none
- *
- * Returns: 
- *     DAT_SUCCESS
- *     DAT_QUEUE_EMPTY
- *     
- */
-DAT_RETURN dapls_ib_completion_poll(IN DAPL_HCA * hca_ptr,
-                                   IN DAPL_EVD * evd_ptr,
-                                   IN ib_work_completion_t * wc_ptr)
-{
-       if (ibv_poll_cq(evd_ptr->ib_cq_handle, 1, wc_ptr) == 1)
-               return DAT_SUCCESS;
-
-       return DAT_QUEUE_EMPTY;
-}
-
-#ifdef CQ_WAIT_OBJECT
-
-/* NEW common wait objects for providers with direct CQ wait objects */
-DAT_RETURN
-dapls_ib_wait_object_create(IN DAPL_EVD * evd_ptr,
-                           IN ib_wait_obj_handle_t * p_cq_wait_obj_handle)
-{
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " cq_object_create: (%p,%p)\n",
-                    evd_ptr, p_cq_wait_obj_handle);
-
-       *p_cq_wait_obj_handle =
-           dapl_os_alloc(sizeof(struct _ib_wait_obj_handle));
-
-       if (*p_cq_wait_obj_handle == NULL)
-               return (dapl_convert_errno(ENOMEM, " wait_object_create"));
-
-       dapl_os_memzero(*p_cq_wait_obj_handle,
-                       sizeof(struct _ib_wait_obj_handle));
-
-       /* create pipe for waking up work thread */
-       if (pipe((*p_cq_wait_obj_handle)->pipe))
-               goto bail;
-
-       /* set cq_wait object to evd_ptr */
-       (*p_cq_wait_obj_handle)->events =
-           ibv_create_comp_channel(evd_ptr->header.owner_ia->hca_ptr->
-                                   ib_hca_handle);
-
-       if ((*p_cq_wait_obj_handle)->events == NULL)
-               goto bail;
-
-       return DAT_SUCCESS;
-      bail:
-       dapl_os_free(*p_cq_wait_obj_handle, sizeof(struct _ib_wait_obj_handle));
-       *p_cq_wait_obj_handle = NULL;
-       return (dapl_convert_errno(errno, " wait_object_create"));
-}
-
-DAT_RETURN
-dapls_ib_wait_object_destroy(IN ib_wait_obj_handle_t p_cq_wait_obj_handle)
-{
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " cq_object_destroy: wait_obj=%p\n", p_cq_wait_obj_handle);
-
-       ibv_destroy_comp_channel(p_cq_wait_obj_handle->events);
-
-       dapl_os_free(p_cq_wait_obj_handle, sizeof(struct _ib_wait_obj_handle));
-
-       return DAT_SUCCESS;
-}
-
-DAT_RETURN
-dapls_ib_wait_object_wakeup(IN ib_wait_obj_handle_t p_cq_wait_obj_handle)
-{
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " cq_object_wakeup: wait_obj=%p\n", p_cq_wait_obj_handle);
-
-       /* write to pipe for wake up */
-       if (write(p_cq_wait_obj_handle->pipe[1], "w", sizeof "w") == -1)
-               dapl_log(DAPL_DBG_TYPE_UTIL,
-                        " wait object wakeup write error = %s\n",
-                        strerror(errno));
-       return DAT_SUCCESS;
-}
-
-DAT_RETURN
-dapls_ib_wait_object_wait(IN ib_wait_obj_handle_t p_cq_wait_obj_handle,
-                         IN u_int32_t timeout)
-{
-       struct dapl_evd *evd_ptr;
-       struct ibv_cq *ibv_cq = NULL;
-       int status = 0;
-       int timeout_ms = -1;
-       struct pollfd ufds[2];
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " cq_object_wait: CQ channel %p time %d\n",
-                    p_cq_wait_obj_handle, timeout);
-
-       /* setup cq event channel and pipe fd for consumer wakeup */
-       ufds[0].fd = p_cq_wait_obj_handle->events->fd;
-       ufds[0].events = POLLIN;
-       ufds[0].revents = 0;
-       ufds[1].fd = p_cq_wait_obj_handle->pipe[0];
-       ufds[1].events = POLLIN;
-       ufds[1].revents = 0;
-
-       /* uDAPL timeout values in usecs */
-       if (timeout != DAT_TIMEOUT_INFINITE)
-               timeout_ms = timeout / 1000;
-
-       /* restart syscall */
-       while ((status = poll(ufds, 2, timeout_ms)) == -1)
-               if (errno == EINTR)
-                       continue;
-
-       /* returned event */
-       if (status > 0) {
-               if (ufds[0].revents == POLLIN) {
-                       if (!ibv_get_cq_event(p_cq_wait_obj_handle->events,
-                                             &ibv_cq, (void *)&evd_ptr)) {
-                               ibv_ack_cq_events(ibv_cq, 1);
-                       }
-               }
-               status = 0;
-
-               /* timeout */
-       } else if (status == 0)
-               status = ETIMEDOUT;
-       else
-               status = errno;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " cq_object_wait: RET evd %p ibv_cq %p %s\n",
-                    evd_ptr, ibv_cq, strerror(errno));
-
-       return (dapl_convert_errno(status, "cq_wait_object_wait"));
-
-}
-#endif
-
-/*
- * Local variables:
- *  c-indent-level: 4
- *  c-basic-offset: 4
- *  tab-width: 8
- * End:
- */
diff --git a/branches/winverbs/ulp/dapl2/dapl/openib_cma/dapl_ib_dto.h b/branches/winverbs/ulp/dapl2/dapl/openib_cma/dapl_ib_dto.h
deleted file mode 100644 (file)
index d97c26b..0000000
+++ /dev/null
@@ -1,472 +0,0 @@
-/*
- * This Software is licensed under one of the following licenses:
- *
- * 1) under the terms of the "Common Public License 1.0" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/cpl.php.
- *
- * 2) under the terms of the "The BSD License" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/bsd-license.php.
- *
- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
- *    copy of which is available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/gpl-license.php.
- *
- * Licensee has the right to choose one of the above licenses.
- *
- * Redistributions of source code must retain the above copyright
- * notice and one of the license notices.
- *
- * Redistributions in binary form must reproduce both the above copyright
- * notice, one of the license notices in the documentation
- * and/or other materials provided with the distribution.
- */
-
-/***************************************************************************
- *
- *   Module:            uDAPL
- *
- *   Filename:          dapl_ib_dto.h
- *
- *   Author:            Arlin Davis
- *
- *   Created:           3/10/2005
- *
- *   Description: 
- *
- *   The OpenIB uCMA provider - DTO operations and CQE macros 
- *
- ****************************************************************************
- *                Source Control System Information
- *
- *    $Id: $
- *
- *     Copyright (c) 2005 Intel Corporation.  All rights reserved.
- *
- **************************************************************************/
-#ifndef _DAPL_IB_DTO_H_
-#define _DAPL_IB_DTO_H_
-
-#include "dapl_ib_util.h"
-
-#ifdef DAT_EXTENSIONS
-#include <dat2/dat_ib_extensions.h>
-#endif
-
-STATIC _INLINE_ int dapls_cqe_opcode(ib_work_completion_t *cqe_p);
-
-/*
- * dapls_ib_post_recv
- *
- * Provider specific Post RECV function
- */
-STATIC _INLINE_ DAT_RETURN 
-dapls_ib_post_recv (
-       IN  DAPL_EP             *ep_ptr,
-       IN  DAPL_COOKIE         *cookie,
-       IN  DAT_COUNT           segments,
-       IN  DAT_LMR_TRIPLET     *local_iov )
-{
-       struct ibv_recv_wr wr;
-       struct ibv_recv_wr *bad_wr;
-       ib_data_segment_t *ds = (ib_data_segment_t *)local_iov;
-       DAT_COUNT i, total_len;
-       int ret;
-       
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    " post_rcv: ep %p cookie %p segs %d l_iov %p\n",
-                    ep_ptr, cookie, segments, local_iov);
-
-       /* setup work request */
-       total_len = 0;
-       wr.next = 0;
-       wr.num_sge = segments;
-       wr.wr_id = (uint64_t)(uintptr_t)cookie;
-       wr.sg_list = ds;
-
-       if (cookie != NULL) { 
-               for (i = 0; i < segments; i++) {
-                       dapl_dbg_log(DAPL_DBG_TYPE_EP, 
-                                    " post_rcv: l_key 0x%x va %p len %d\n",
-                                    ds->lkey, ds->addr, ds->length);
-                       total_len += ds->length;
-                       ds++;
-               }
-               cookie->val.dto.size = total_len;
-       }
-
-       ret = ibv_post_recv(ep_ptr->qp_handle->cm_id->qp, &wr, &bad_wr);
-       
-       if (ret)
-               return( dapl_convert_errno(errno,"ibv_recv") );
-
-       DAPL_CNTR(ep_ptr, DCNT_EP_POST_RECV);
-       DAPL_CNTR_DATA(ep_ptr, DCNT_EP_POST_RECV_DATA, total_len);
-
-       return DAT_SUCCESS;
-}
-
-/*
- * dapls_ib_post_send
- *
- * Provider specific Post SEND function
- */
-STATIC _INLINE_ DAT_RETURN 
-dapls_ib_post_send (
-       IN  DAPL_EP                     *ep_ptr,
-       IN  ib_send_op_type_t           op_type,
-       IN  DAPL_COOKIE                 *cookie,
-       IN  DAT_COUNT                   segments,
-       IN  DAT_LMR_TRIPLET             *local_iov,
-       IN  const DAT_RMR_TRIPLET       *remote_iov,
-       IN  DAT_COMPLETION_FLAGS        completion_flags)
-{
-       struct ibv_send_wr wr;
-       struct ibv_send_wr *bad_wr;
-       ib_data_segment_t *ds = (ib_data_segment_t *)local_iov;
-       ib_hca_transport_t *ibt_ptr = 
-               &ep_ptr->header.owner_ia->hca_ptr->ib_trans;
-       DAT_COUNT i, total_len;
-       int ret;
-       
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    " post_snd: ep %p op %d ck %p sgs",
-                    "%d l_iov %p r_iov %p f %d\n",
-                    ep_ptr, op_type, cookie, segments, local_iov, 
-                    remote_iov, completion_flags);
-
-       /* setup the work request */
-       wr.next = 0;
-       wr.opcode = op_type;
-       wr.num_sge = segments;
-       wr.send_flags = 0;
-       wr.wr_id = (uint64_t)(uintptr_t)cookie;
-       wr.sg_list = ds;
-       total_len = 0;
-
-       if (cookie != NULL) {
-               for (i = 0; i < segments; i++ ) {
-                       dapl_dbg_log(DAPL_DBG_TYPE_EP, 
-                                    " post_snd: lkey 0x%x va %p len %d\n",
-                                    ds->lkey, ds->addr, ds->length );
-                       total_len += ds->length;
-                       ds++;
-               }
-               cookie->val.dto.size = total_len;
-       }
-
-       if (wr.num_sge && 
-           (op_type == OP_RDMA_WRITE || op_type == OP_RDMA_READ)) {
-               wr.wr.rdma.remote_addr = remote_iov->virtual_address;
-               wr.wr.rdma.rkey = remote_iov->rmr_context;
-               dapl_dbg_log(DAPL_DBG_TYPE_EP, 
-                            " post_snd_rdma: rkey 0x%x va %#016Lx\n",
-                            wr.wr.rdma.rkey, wr.wr.rdma.remote_addr);
-       }
-
-       /* inline data for send or write ops */
-       if ((total_len <= ibt_ptr->max_inline_send) && 
-          ((op_type == OP_SEND) || (op_type == OP_RDMA_WRITE))) 
-               wr.send_flags |= IBV_SEND_INLINE;
-       
-       /* set completion flags in work request */
-       wr.send_flags |= (DAT_COMPLETION_SUPPRESS_FLAG & 
-                               completion_flags) ? 0 : IBV_SEND_SIGNALED;
-       wr.send_flags |= (DAT_COMPLETION_BARRIER_FENCE_FLAG & 
-                               completion_flags) ? IBV_SEND_FENCE : 0;
-       wr.send_flags |= (DAT_COMPLETION_SOLICITED_WAIT_FLAG & 
-                               completion_flags) ? IBV_SEND_SOLICITED : 0;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP, 
-                    " post_snd: op 0x%x flags 0x%x sglist %p, %d\n", 
-                    wr.opcode, wr.send_flags, wr.sg_list, wr.num_sge);
-
-       ret = ibv_post_send(ep_ptr->qp_handle->cm_id->qp, &wr, &bad_wr);
-
-       if (ret)
-               return( dapl_convert_errno(errno,"ibv_send") );
-
-#ifdef DAPL_COUNTERS
-       switch (op_type) {
-       case OP_SEND:
-               DAPL_CNTR(ep_ptr, DCNT_EP_POST_SEND);
-               DAPL_CNTR_DATA(ep_ptr, DCNT_EP_POST_SEND_DATA,total_len);
-               break;
-       case OP_RDMA_WRITE:
-               DAPL_CNTR(ep_ptr, DCNT_EP_POST_WRITE);
-               DAPL_CNTR_DATA(ep_ptr, DCNT_EP_POST_WRITE_DATA,total_len);
-               break;  
-       case OP_RDMA_READ:
-               DAPL_CNTR(ep_ptr, DCNT_EP_POST_READ);
-               DAPL_CNTR_DATA(ep_ptr, DCNT_EP_POST_READ_DATA,total_len);
-               break;
-       default:
-               break;
-       }
-#endif /* DAPL_COUNTERS */
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP," post_snd: returned\n");
-       return DAT_SUCCESS;
-}
-
-/* map Work Completions to DAPL WR operations */
-STATIC _INLINE_ DAT_DTOS dapls_cqe_dtos_opcode(ib_work_completion_t *cqe_p)
-{
-       switch (cqe_p->opcode) {
-
-       case IBV_WC_SEND:
-               return (DAT_DTO_SEND);
-       case IBV_WC_RDMA_READ:
-               return (DAT_DTO_RDMA_READ);
-       case IBV_WC_BIND_MW:
-               return (DAT_DTO_BIND_MW);
-#ifdef DAT_EXTENSIONS
-       case IBV_WC_RDMA_WRITE:
-               if (cqe_p->wc_flags & IBV_WC_WITH_IMM)
-                       return (DAT_IB_DTO_RDMA_WRITE_IMMED);
-               else
-                       return (DAT_DTO_RDMA_WRITE);
-       case IBV_WC_COMP_SWAP:
-               return (DAT_IB_DTO_CMP_SWAP);
-       case IBV_WC_FETCH_ADD:
-               return (DAT_IB_DTO_FETCH_ADD);
-       case IBV_WC_RECV_RDMA_WITH_IMM:
-               return (DAT_IB_DTO_RECV_IMMED);
-#else
-       case IBV_WC_RDMA_WRITE:
-               return (DAT_DTO_RDMA_WRITE);
-#endif
-       case IBV_WC_RECV:
-               return (DAT_DTO_RECEIVE);
-       default:
-               return (0xff);
-       }
-}
-#define DAPL_GET_CQE_DTOS_OPTYPE(cqe_p) dapls_cqe_dtos_opcode(cqe_p)
-
-
-#ifdef DAT_EXTENSIONS
-/*
- * dapls_ib_post_ext_send
- *
- * Provider specific extended Post SEND function for atomics
- *     OP_COMP_AND_SWAP and OP_FETCH_AND_ADD
- */
-STATIC _INLINE_ DAT_RETURN 
-dapls_ib_post_ext_send (
-       IN  DAPL_EP                     *ep_ptr,
-       IN  ib_send_op_type_t           op_type,
-       IN  DAPL_COOKIE                 *cookie,
-       IN  DAT_COUNT                   segments,
-       IN  DAT_LMR_TRIPLET             *local_iov,
-       IN  const DAT_RMR_TRIPLET       *remote_iov,
-       IN  DAT_UINT32                  immed_data,
-       IN  DAT_UINT64                  compare_add,
-       IN  DAT_UINT64                  swap,
-       IN  DAT_COMPLETION_FLAGS        completion_flags)
-{
-       struct ibv_send_wr wr;
-       struct ibv_send_wr *bad_wr;
-       ib_data_segment_t *ds = (ib_data_segment_t *)local_iov;
-       DAT_COUNT i, total_len;
-       int ret;
-       
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    " post_ext_snd: ep %p op %d ck %p sgs",
-                    "%d l_iov %p r_iov %p f %d\n",
-                    ep_ptr, op_type, cookie, segments, local_iov, 
-                    remote_iov, completion_flags);
-
-       /* setup the work request */
-       wr.next = 0;
-       wr.opcode = op_type;
-       wr.num_sge = segments;
-       wr.send_flags = 0;
-       wr.wr_id = (uint64_t)(uintptr_t)cookie;
-       wr.sg_list = ds;
-       total_len = 0;
-
-       if (cookie != NULL) {
-               for (i = 0; i < segments; i++ ) {
-                       dapl_dbg_log(DAPL_DBG_TYPE_EP, 
-                                    " post_ext_snd: lkey 0x%x va %p ln %d\n",
-                                    ds->lkey, ds->addr, ds->length);
-                       total_len += ds->length;
-                       ds++;
-               }
-               cookie->val.dto.size = total_len;
-       }
-
-       switch (op_type) {
-       case OP_RDMA_WRITE_IMM:
-               /* OP_RDMA_WRITE)IMMED has direct IB wr_type mapping */
-               dapl_dbg_log(DAPL_DBG_TYPE_EP, 
-                            " post_ext: rkey 0x%x va %#016Lx immed=0x%x\n",
-                            remote_iov?remote_iov->rmr_context:0, 
-                            remote_iov?remote_iov->virtual_address:0,
-                            immed_data);
-
-               wr.imm_data = immed_data;
-               if (wr.num_sge) {
-                       wr.wr.rdma.remote_addr = remote_iov->virtual_address;
-                       wr.wr.rdma.rkey = remote_iov->rmr_context;
-               }
-               break;
-       case OP_COMP_AND_SWAP:
-               /* OP_COMP_AND_SWAP has direct IB wr_type mapping */
-               dapl_dbg_log(DAPL_DBG_TYPE_EP, 
-                            " post_ext: OP_COMP_AND_SWAP=%lx,"
-                            "%lx rkey 0x%x va %#016Lx\n",
-                            compare_add, swap, remote_iov->rmr_context,
-                            remote_iov->virtual_address);
-               
-               wr.wr.atomic.compare_add = compare_add;
-               wr.wr.atomic.swap = swap;
-               wr.wr.atomic.remote_addr = remote_iov->virtual_address;
-               wr.wr.atomic.rkey = remote_iov->rmr_context;
-               break;
-       case OP_FETCH_AND_ADD:
-               /* OP_FETCH_AND_ADD has direct IB wr_type mapping */
-               dapl_dbg_log(DAPL_DBG_TYPE_EP, 
-                            " post_ext: OP_FETCH_AND_ADD=%lx,"
-                            "%lx rkey 0x%x va %#016Lx\n",
-                            compare_add, remote_iov->rmr_context,
-                            remote_iov->virtual_address);
-
-               wr.wr.atomic.compare_add = compare_add;
-               wr.wr.atomic.remote_addr = remote_iov->virtual_address;
-               wr.wr.atomic.rkey = remote_iov->rmr_context;
-               break;
-       default:
-               break;
-       }
-
-       /* set completion flags in work request */
-       wr.send_flags |= (DAT_COMPLETION_SUPPRESS_FLAG & 
-                               completion_flags) ? 0 : IBV_SEND_SIGNALED;
-       wr.send_flags |= (DAT_COMPLETION_BARRIER_FENCE_FLAG & 
-                               completion_flags) ? IBV_SEND_FENCE : 0;
-       wr.send_flags |= (DAT_COMPLETION_SOLICITED_WAIT_FLAG & 
-                               completion_flags) ? IBV_SEND_SOLICITED : 0;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP, 
-                    " post_snd: op 0x%x flags 0x%x sglist %p, %d\n", 
-                    wr.opcode, wr.send_flags, wr.sg_list, wr.num_sge);
-
-       ret = ibv_post_send(ep_ptr->qp_handle->cm_id->qp, &wr, &bad_wr);
-
-       if (ret)
-               return( dapl_convert_errno(errno,"ibv_send") );
-
-#ifdef DAPL_COUNTERS
-       switch (op_type) {
-       case OP_RDMA_WRITE_IMM:
-               DAPL_CNTR(ep_ptr, DCNT_EP_POST_WRITE_IMM);
-               DAPL_CNTR_DATA(ep_ptr, 
-                              DCNT_EP_POST_WRITE_IMM_DATA, total_len);
-               break;
-       case OP_COMP_AND_SWAP:
-               DAPL_CNTR(ep_ptr, DCNT_EP_POST_CMP_SWAP);
-               break;  
-       case OP_FETCH_AND_ADD:
-               DAPL_CNTR(ep_ptr, DCNT_EP_POST_FETCH_ADD);
-               break;
-       default:
-               break;
-       }
-#endif /* DAPL_COUNTERS */
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP," post_snd: returned\n");
-       return DAT_SUCCESS;
-}
-#endif
-
-STATIC _INLINE_ DAT_RETURN 
-dapls_ib_optional_prv_dat(
-       IN  DAPL_CR             *cr_ptr,
-       IN  const void          *event_data,
-       OUT   DAPL_CR           **cr_pp)
-{
-    return DAT_SUCCESS;
-}
-
-/* map Work Completions to DAPL WR operations */
-STATIC _INLINE_ int dapls_cqe_opcode(ib_work_completion_t *cqe_p)
-{
-#ifdef DAPL_COUNTERS
-       DAPL_COOKIE *cookie = (DAPL_COOKIE *)(uintptr_t)cqe_p->wr_id;
-#endif /* DAPL_COUNTERS */
-
-       switch (cqe_p->opcode) {
-       case IBV_WC_SEND:
-               return (OP_SEND);
-       case IBV_WC_RDMA_WRITE:
-               if (cqe_p->wc_flags & IBV_WC_WITH_IMM)
-                       return (OP_RDMA_WRITE_IMM);
-               else
-                       return (OP_RDMA_WRITE);
-       case IBV_WC_RDMA_READ:
-               return (OP_RDMA_READ);
-       case IBV_WC_COMP_SWAP:
-               return (OP_COMP_AND_SWAP);
-       case IBV_WC_FETCH_ADD:
-               return (OP_FETCH_AND_ADD);
-       case IBV_WC_BIND_MW:
-               return (OP_BIND_MW);
-       case IBV_WC_RECV:
-               if (cqe_p->wc_flags & IBV_WC_WITH_IMM) {
-                       DAPL_CNTR(cookie->ep, DCNT_EP_RECV_IMM);
-                       DAPL_CNTR_DATA(cookie->ep, DCNT_EP_RECV_IMM_DATA, 
-                                      cqe_p->byte_len);
-                       return (OP_RECEIVE_IMM);
-               } else {
-                       DAPL_CNTR(cookie->ep, DCNT_EP_RECV);
-                       DAPL_CNTR_DATA(cookie->ep, DCNT_EP_RECV_DATA, 
-                                      cqe_p->byte_len);
-                       return (OP_RECEIVE);
-               }
-       case IBV_WC_RECV_RDMA_WITH_IMM:
-               DAPL_CNTR(cookie->ep, DCNT_EP_RECV_RDMA_IMM);
-               DAPL_CNTR_DATA(cookie->ep, DCNT_EP_RECV_RDMA_IMM_DATA, 
-                              cqe_p->byte_len);
-               return (OP_RECEIVE_IMM);
-       default:
-               return (OP_INVALID);
-       }
-}
-
-#define DAPL_GET_CQE_OPTYPE(cqe_p) dapls_cqe_opcode(cqe_p)
-#define DAPL_GET_CQE_WRID(cqe_p) ((ib_work_completion_t*)cqe_p)->wr_id
-#define DAPL_GET_CQE_STATUS(cqe_p) ((ib_work_completion_t*)cqe_p)->status
-#define DAPL_GET_CQE_VENDOR_ERR(cqe_p) ((ib_work_completion_t*)cqe_p)->vendor_err
-#define DAPL_GET_CQE_BYTESNUM(cqe_p) ((ib_work_completion_t*)cqe_p)->byte_len
-#define DAPL_GET_CQE_IMMED_DATA(cqe_p) ((ib_work_completion_t*)cqe_p)->imm_data
-
-STATIC _INLINE_ char * dapls_dto_op_str(int op)
-{
-    static char *optable[] =
-    {
-        "OP_RDMA_WRITE",
-        "OP_RDMA_WRITE_IMM",
-        "OP_SEND",
-        "OP_SEND_IMM",
-        "OP_RDMA_READ",
-        "OP_COMP_AND_SWAP",
-        "OP_FETCH_AND_ADD",
-        "OP_RECEIVE",
-        "OP_RECEIVE_IMM",
-        "OP_BIND_MW"
-    };
-    return ((op < 0 || op > 9) ? "Invalid CQE OP?" : optable[op]);
-}
-
-static _INLINE_ char *
-dapls_cqe_op_str(IN ib_work_completion_t *cqe_ptr)
-{
-    return dapls_dto_op_str(DAPL_GET_CQE_OPTYPE(cqe_ptr));
-}
-
-#define DAPL_GET_CQE_OP_STR(cqe) dapls_cqe_op_str(cqe)
-
-#endif /*  _DAPL_IB_DTO_H_ */
diff --git a/branches/winverbs/ulp/dapl2/dapl/openib_cma/dapl_ib_extensions.c b/branches/winverbs/ulp/dapl2/dapl/openib_cma/dapl_ib_extensions.c
deleted file mode 100644 (file)
index 3bcde58..0000000
+++ /dev/null
@@ -1,329 +0,0 @@
-/*
- * Copyright (c) 2007 Intel Corporation.  All rights reserved.
- *
- * This Software is licensed under one of the following licenses:
- *
- * 1) under the terms of the "Common Public License 1.0" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/cpl.php.
- *
- * 2) under the terms of the "The BSD License" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/bsd-license.php.
- *
- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
- *    copy of which is available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/gpl-license.php.
- *
- * Licensee has the right to choose one of the above licenses.
- *
- * Redistributions of source code must retain the above copyright
- * notice and one of the license notices.
- *
- * Redistributions in binary form must reproduce both the above copyright
- * notice, one of the license notices in the documentation
- * and/or other materials provided with the distribution.
- */
-
-/**********************************************************************
- * 
- * MODULE: dapl_ib_extensions.c
- *
- * PURPOSE:  Extensions routines for OpenIB uCMA provider
- *
- * $Id: $
- *
- **********************************************************************/
-
-#include "dapl.h"
-#include "dapl_adapter_util.h"
-#include "dapl_evd_util.h"
-#include "dapl_ib_util.h"
-#include "dapl_ep_util.h"
-#include "dapl_cookie.h"
-#include <stdarg.h>
-
-DAT_RETURN
-dapli_post_ext(IN DAT_EP_HANDLE ep_handle,
-              IN DAT_UINT64 cmp_add,
-              IN DAT_UINT64 swap,
-              IN DAT_UINT32 immed_data,
-              IN DAT_COUNT segments,
-              IN DAT_LMR_TRIPLET * local_iov,
-              IN DAT_DTO_COOKIE user_cookie,
-              IN const DAT_RMR_TRIPLET * remote_iov,
-              IN int op_type, IN DAT_COMPLETION_FLAGS flags);
-
-/*
- * dapl_extensions
- *
- * Process extension requests
- *
- * Input:
- *     ext_type,
- *     ...
- *
- * Output:
- *     Depends....
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_NOT_IMPLEMENTED
- *      .....
- *
- */
-DAT_RETURN
-dapl_extensions(IN DAT_HANDLE dat_handle,
-               IN DAT_EXTENDED_OP ext_op, IN va_list args)
-{
-       DAT_EP_HANDLE ep;
-       DAT_LMR_TRIPLET *lmr_p;
-       DAT_DTO_COOKIE cookie;
-       const DAT_RMR_TRIPLET *rmr_p;
-       DAT_UINT64 dat_uint64a, dat_uint64b;
-       DAT_UINT32 dat_uint32;
-       DAT_COUNT segments = 1;
-       DAT_COMPLETION_FLAGS comp_flags;
-       DAT_RETURN status = DAT_NOT_IMPLEMENTED;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_API,
-                    "dapl_extensions(hdl %p operation %d, ...)\n",
-                    dat_handle, ext_op);
-
-       switch ((int)ext_op) {
-
-       case DAT_IB_RDMA_WRITE_IMMED_OP:
-               dapl_dbg_log(DAPL_DBG_TYPE_RTN,
-                            " WRITE_IMMED_DATA extension call\n");
-
-               ep = dat_handle;        /* ep_handle */
-               segments = va_arg(args, DAT_COUNT);     /* num segments */
-               lmr_p = va_arg(args, DAT_LMR_TRIPLET *);
-               cookie = va_arg(args, DAT_DTO_COOKIE);
-               rmr_p = va_arg(args, const DAT_RMR_TRIPLET *);
-               dat_uint32 = va_arg(args, DAT_UINT32);  /* immed data */
-               comp_flags = va_arg(args, DAT_COMPLETION_FLAGS);
-
-               status = dapli_post_ext(ep, 0, 0, dat_uint32, segments, lmr_p,
-                                       cookie, rmr_p, OP_RDMA_WRITE_IMM,
-                                       comp_flags);
-               break;
-
-       case DAT_IB_CMP_AND_SWAP_OP:
-               dapl_dbg_log(DAPL_DBG_TYPE_RTN,
-                            " CMP_AND_SWAP extension call\n");
-
-               ep = dat_handle;        /* ep_handle */
-               dat_uint64a = va_arg(args, DAT_UINT64); /* cmp_value */
-               dat_uint64b = va_arg(args, DAT_UINT64); /* swap_value */
-               lmr_p = va_arg(args, DAT_LMR_TRIPLET *);
-               cookie = va_arg(args, DAT_DTO_COOKIE);
-               rmr_p = va_arg(args, const DAT_RMR_TRIPLET *);
-               comp_flags = va_arg(args, DAT_COMPLETION_FLAGS);
-
-               status = dapli_post_ext(ep, dat_uint64a, dat_uint64b,
-                                       0, segments, lmr_p, cookie, rmr_p,
-                                       OP_COMP_AND_SWAP, comp_flags);
-               break;
-
-       case DAT_IB_FETCH_AND_ADD_OP:
-               dapl_dbg_log(DAPL_DBG_TYPE_RTN,
-                            " FETCH_AND_ADD extension call\n");
-
-               ep = dat_handle;        /* ep_handle */
-               dat_uint64a = va_arg(args, DAT_UINT64); /* add value */
-               lmr_p = va_arg(args, DAT_LMR_TRIPLET *);
-               cookie = va_arg(args, DAT_DTO_COOKIE);
-               rmr_p = va_arg(args, const DAT_RMR_TRIPLET *);
-               comp_flags = va_arg(args, DAT_COMPLETION_FLAGS);
-
-               status = dapli_post_ext(ep, dat_uint64a, 0, 0, segments,
-                                       lmr_p, cookie, rmr_p,
-                                       OP_FETCH_AND_ADD, comp_flags);
-
-               break;
-
-#ifdef DAPL_COUNTERS
-       case DAT_QUERY_COUNTERS_OP:
-               {
-                       int cntr, reset;
-                       DAT_UINT64 *p_cntr_out;
-
-                       dapl_dbg_log(DAPL_DBG_TYPE_RTN,
-                                    " Query counter extension call\n");
-
-                       cntr = va_arg(args, int);
-                       p_cntr_out = va_arg(args, DAT_UINT64 *);
-                       reset = va_arg(args, int);
-
-                       status = dapl_query_counter(dat_handle, cntr,
-                                                   p_cntr_out, reset);
-                       break;
-               }
-       case DAT_PRINT_COUNTERS_OP:
-               {
-                       int cntr, reset;
-
-                       dapl_dbg_log(DAPL_DBG_TYPE_RTN,
-                                    " Print counter extension call\n");
-
-                       cntr = va_arg(args, int);
-                       reset = va_arg(args, int);
-
-                       dapl_print_counter(dat_handle, cntr, reset);
-                       status = DAT_SUCCESS;
-                       break;
-               }
-#endif                         /* DAPL_COUNTERS */
-
-       default:
-               dapl_dbg_log(DAPL_DBG_TYPE_ERR,
-                            "unsupported extension(%d)\n", (int)ext_op);
-       }
-
-       return (status);
-}
-
-DAT_RETURN
-dapli_post_ext(IN DAT_EP_HANDLE ep_handle,
-              IN DAT_UINT64 cmp_add,
-              IN DAT_UINT64 swap,
-              IN DAT_UINT32 immed_data,
-              IN DAT_COUNT segments,
-              IN DAT_LMR_TRIPLET * local_iov,
-              IN DAT_DTO_COOKIE user_cookie,
-              IN const DAT_RMR_TRIPLET * remote_iov,
-              IN int op_type, IN DAT_COMPLETION_FLAGS flags)
-{
-       DAPL_EP *ep_ptr;
-       ib_qp_handle_t qp_ptr;
-       DAPL_COOKIE *cookie = NULL;
-       DAT_RETURN dat_status = DAT_SUCCESS;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_API,
-                    " post_ext_op: ep %p cmp_val %d "
-                    "swap_val %d cookie 0x%x, r_iov %p, flags 0x%x\n",
-                    ep_handle, (unsigned)cmp_add, (unsigned)swap,
-                    (unsigned)user_cookie.as_64, remote_iov, flags);
-
-       if (DAPL_BAD_HANDLE(ep_handle, DAPL_MAGIC_EP))
-               return (DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP));
-
-       ep_ptr = (DAPL_EP *) ep_handle;
-       qp_ptr = ep_ptr->qp_handle;
-
-       /*
-        * Synchronization ok since this buffer is only used for send
-        * requests, which aren't allowed to race with each other.
-        */
-       dat_status = dapls_dto_cookie_alloc(&ep_ptr->req_buffer,
-                                           DAPL_DTO_TYPE_EXTENSION,
-                                           user_cookie, &cookie);
-       if (dat_status != DAT_SUCCESS)
-               goto bail;
-
-       /*
-        * Take reference before posting to avoid race conditions with
-        * completions
-        */
-       dapl_os_atomic_inc(&ep_ptr->req_count);
-
-       /*
-        * Invoke provider specific routine to post DTO
-        */
-       dat_status = dapls_ib_post_ext_send(ep_ptr, op_type, cookie, segments,  /* data segments */
-                                           local_iov, remote_iov, immed_data,  /* immed data */
-                                           cmp_add,    /* compare or add */
-                                           swap,       /* swap */
-                                           flags);
-
-       if (dat_status != DAT_SUCCESS) {
-               dapl_os_atomic_dec(&ep_ptr->req_count);
-               dapls_cookie_dealloc(&ep_ptr->req_buffer, cookie);
-       }
-
-      bail:
-       return dat_status;
-
-}
-
-/* 
- * New provider routine to process extended DTO events 
- */
-void
-dapls_cqe_to_event_extension(IN DAPL_EP * ep_ptr,
-                            IN DAPL_COOKIE * cookie,
-                            IN ib_work_completion_t * cqe_ptr,
-                            IN DAT_EVENT * event_ptr)
-{
-       uint32_t ibtype;
-       DAT_DTO_COMPLETION_EVENT_DATA *dto =
-           &event_ptr->event_data.dto_completion_event_data;
-       DAT_IB_EXTENSION_EVENT_DATA *ext_data = (DAT_IB_EXTENSION_EVENT_DATA *)
-           & event_ptr->event_extension_data[0];
-       DAT_DTO_COMPLETION_STATUS dto_status;
-
-       /* Get status from cqe */
-       dto_status = dapls_ib_get_dto_status(cqe_ptr);
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EVD,
-                    " cqe_to_event_ext: dto_ptr %p ext_ptr %p status %d\n",
-                    dto, ext_data, dto_status);
-
-       event_ptr->event_number = DAT_IB_DTO_EVENT;
-       dto->ep_handle = cookie->ep;
-       dto->user_cookie = cookie->val.dto.cookie;
-       dto->operation = DAPL_GET_CQE_DTOS_OPTYPE(cqe_ptr);     /* new for 2.0 */
-       dto->status = ext_data->status = dto_status;
-
-       if (dto_status != DAT_DTO_SUCCESS)
-               return;
-
-       /* 
-        * Get operation type from CQ work completion entry and
-        * if extented operation then set extended event data
-        */
-       ibtype = DAPL_GET_CQE_OPTYPE(cqe_ptr);
-
-       switch (ibtype) {
-
-       case OP_RDMA_WRITE_IMM:
-               dapl_dbg_log(DAPL_DBG_TYPE_EVD,
-                            " cqe_to_event_ext: OP_RDMA_WRITE_IMMED\n");
-
-               /* type and outbound rdma write transfer size */
-               dto->transfered_length = cookie->val.dto.size;
-               ext_data->type = DAT_IB_RDMA_WRITE_IMMED;
-               break;
-       case OP_RECEIVE_IMM:
-               dapl_dbg_log(DAPL_DBG_TYPE_EVD,
-                            " cqe_to_event_ext: OP_RECEIVE_RDMA_IMMED\n");
-
-               /* immed recvd, type and inbound rdma write transfer size */
-               dto->transfered_length = DAPL_GET_CQE_BYTESNUM(cqe_ptr);
-               ext_data->type = DAT_IB_RDMA_WRITE_IMMED_DATA;
-               ext_data->val.immed.data = DAPL_GET_CQE_IMMED_DATA(cqe_ptr);
-               break;
-       case OP_COMP_AND_SWAP:
-               dapl_dbg_log(DAPL_DBG_TYPE_EVD,
-                            " cqe_to_event_ext: COMP_AND_SWAP_RESP\n");
-
-               /* original data is returned in LMR provided with post */
-               ext_data->type = DAT_IB_CMP_AND_SWAP;
-               dto->transfered_length = DAPL_GET_CQE_BYTESNUM(cqe_ptr);
-               break;
-       case OP_FETCH_AND_ADD:
-               dapl_dbg_log(DAPL_DBG_TYPE_EVD,
-                            " cqe_to_event_ext: FETCH_AND_ADD_RESP\n");
-
-               /* original data is returned in LMR provided with post */
-               ext_data->type = DAT_IB_FETCH_AND_ADD;
-               dto->transfered_length = DAPL_GET_CQE_BYTESNUM(cqe_ptr);
-               break;
-       default:
-               /* not extended operation */
-               ext_data->status = DAT_IB_OP_ERR;
-               dto->status = DAT_DTO_ERR_TRANSPORT;
-               break;
-       }
-}
diff --git a/branches/winverbs/ulp/dapl2/dapl/openib_cma/dapl_ib_mem.c b/branches/winverbs/ulp/dapl2/dapl/openib_cma/dapl_ib_mem.c
deleted file mode 100644 (file)
index 7e73044..0000000
+++ /dev/null
@@ -1,380 +0,0 @@
-/*
- * Copyright (c) 2005-2007 Intel Corporation.  All rights reserved.
- *
- * This Software is licensed under one of the following licenses:
- *
- * 1) under the terms of the "Common Public License 1.0" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/cpl.php.
- *
- * 2) under the terms of the "The BSD License" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/bsd-license.php.
- *
- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
- *    copy of which is available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/gpl-license.php.
- *
- * Licensee has the right to choose one of the above licenses.
- *
- * Redistributions of source code must retain the above copyright
- * notice and one of the license notices.
- *
- * Redistributions in binary form must reproduce both the above copyright
- * notice, one of the license notices in the documentation
- * and/or other materials provided with the distribution.
- */
-
-/**********************************************************************
- * 
- * MODULE: dapl_ib_mem.c
- *
- * PURPOSE: Memory windows, registration, and protection domain 
- *
- * $Id:$
- *
- **********************************************************************/
-
-#include "dapl.h"
-#include "dapl_adapter_util.h"
-#include "dapl_lmr_util.h"
-
-/*
- * dapls_convert_privileges
- *
- * Convert LMR privileges to provider  
- *
- * Input:
- *     DAT_MEM_PRIV_FLAGS
- *
- * Output:
- *     none
- *
- * Returns:
- *     ibv_access_flags
- *
- */
-STATIC _INLINE_ int dapls_convert_privileges(IN DAT_MEM_PRIV_FLAGS privileges)
-{
-       int access = 0;
-
-       /*
-        * if (DAT_MEM_PRIV_LOCAL_READ_FLAG & privileges) do nothing
-        */
-       if (DAT_MEM_PRIV_LOCAL_WRITE_FLAG & privileges)
-               access |= IBV_ACCESS_LOCAL_WRITE;
-       if (DAT_MEM_PRIV_REMOTE_WRITE_FLAG & privileges)
-               access |= IBV_ACCESS_REMOTE_WRITE;
-       if (DAT_MEM_PRIV_REMOTE_READ_FLAG & privileges)
-               access |= IBV_ACCESS_REMOTE_READ;
-       if (DAT_MEM_PRIV_REMOTE_READ_FLAG & privileges)
-               access |= IBV_ACCESS_REMOTE_READ;
-       if (DAT_MEM_PRIV_REMOTE_READ_FLAG & privileges)
-               access |= IBV_ACCESS_REMOTE_READ;
-#ifdef DAT_EXTENSIONS
-       if (DAT_IB_MEM_PRIV_REMOTE_ATOMIC & privileges)
-               access |= IBV_ACCESS_REMOTE_ATOMIC;
-#endif
-
-       return access;
-}
-
-/*
- * dapl_ib_pd_alloc
- *
- * Alloc a PD
- *
- * Input:
- *     ia_handle       IA handle
- *     pz              pointer to PZ struct
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INSUFFICIENT_RESOURCES
- *
- */
-DAT_RETURN dapls_ib_pd_alloc(IN DAPL_IA * ia_ptr, IN DAPL_PZ * pz)
-{
-       /* get a protection domain */
-       pz->pd_handle = ibv_alloc_pd(ia_ptr->hca_ptr->ib_hca_handle);
-       if (!pz->pd_handle)
-               return (dapl_convert_errno(ENOMEM, "alloc_pd"));
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " pd_alloc: pd_handle=%p\n", pz->pd_handle);
-
-       return DAT_SUCCESS;
-}
-
-/*
- * dapl_ib_pd_free
- *
- * Free a PD
- *
- * Input:
- *     ia_handle       IA handle
- *     PZ_ptr          pointer to PZ struct
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *      DAT_INVALID_STATE
- *
- */
-DAT_RETURN dapls_ib_pd_free(IN DAPL_PZ * pz)
-{
-       if (pz->pd_handle != IB_INVALID_HANDLE) {
-               if (ibv_dealloc_pd(pz->pd_handle))
-                       return (dapl_convert_errno(errno, "dealloc_pd"));
-               pz->pd_handle = IB_INVALID_HANDLE;
-       }
-       return DAT_SUCCESS;
-}
-
-/*
- * dapl_ib_mr_register
- *
- * Register a virtual memory region
- *
- * Input:
- *     ia_handle       IA handle
- *     lmr             pointer to dapl_lmr struct
- *     virt_addr       virtual address of beginning of mem region
- *     length          length of memory region
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INSUFFICIENT_RESOURCES
- *
- */
-DAT_RETURN
-dapls_ib_mr_register(IN DAPL_IA * ia_ptr,
-                    IN DAPL_LMR * lmr,
-                    IN DAT_PVOID virt_addr,
-                    IN DAT_VLEN length,
-                    IN DAT_MEM_PRIV_FLAGS privileges, IN DAT_VA_TYPE va_type)
-{
-       ib_pd_handle_t ib_pd_handle;
-
-       ib_pd_handle = ((DAPL_PZ *) lmr->param.pz_handle)->pd_handle;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " mr_register: ia=%p, lmr=%p va=%p ln=%d pv=0x%x\n",
-                    ia_ptr, lmr, virt_addr, length, privileges);
-
-       /* TODO: shared memory */
-       if (lmr->param.mem_type == DAT_MEM_TYPE_SHARED_VIRTUAL) {
-               dapl_dbg_log(DAPL_DBG_TYPE_ERR,
-                            " mr_register_shared: NOT IMPLEMENTED\n");
-               return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);
-       }
-
-       /* IB verbs does not support */
-       if (va_type == DAT_VA_TYPE_ZB) {
-               dapl_dbg_log(DAPL_DBG_TYPE_ERR,
-                            " va_type == DAT_VA_TYPE_ZB: NOT SUPPORTED\n");
-               return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);
-       }
-
-       /* local read is default on IB */
-       lmr->mr_handle =
-           ibv_reg_mr(((DAPL_PZ *) lmr->param.pz_handle)->pd_handle,
-                      virt_addr, length, dapls_convert_privileges(privileges));
-
-       if (!lmr->mr_handle)
-               return (dapl_convert_errno(ENOMEM, "reg_mr"));
-
-       lmr->param.lmr_context = lmr->mr_handle->lkey;
-       lmr->param.rmr_context = lmr->mr_handle->rkey;
-       lmr->param.registered_size = length;
-       lmr->param.registered_address = (DAT_VADDR) (uintptr_t) virt_addr;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " mr_register: mr=%p addr=%p pd %p ctx %p "
-                    "lkey=0x%x rkey=0x%x priv=%x\n",
-                    lmr->mr_handle, lmr->mr_handle->addr,
-                    lmr->mr_handle->pd, lmr->mr_handle->context,
-                    lmr->mr_handle->lkey, lmr->mr_handle->rkey,
-                    length, dapls_convert_privileges(privileges));
-
-       return DAT_SUCCESS;
-}
-
-/*
- * dapl_ib_mr_deregister
- *
- * Free a memory region
- *
- * Input:
- *     lmr                     pointer to dapl_lmr struct
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INVALID_STATE
- *
- */
-DAT_RETURN dapls_ib_mr_deregister(IN DAPL_LMR * lmr)
-{
-       if (lmr->mr_handle != IB_INVALID_HANDLE) {
-               if (ibv_dereg_mr(lmr->mr_handle))
-                       return (dapl_convert_errno(errno, "dereg_pd"));
-               lmr->mr_handle = IB_INVALID_HANDLE;
-       }
-       return DAT_SUCCESS;
-}
-
-/*
- * dapl_ib_mr_register_shared
- *
- * Register a virtual memory region
- *
- * Input:
- *     ia_ptr          IA handle
- *     lmr             pointer to dapl_lmr struct
- *     virt_addr       virtual address of beginning of mem region
- *     length          length of memory region
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INSUFFICIENT_RESOURCES
- *
- */
-DAT_RETURN
-dapls_ib_mr_register_shared(IN DAPL_IA * ia_ptr,
-                           IN DAPL_LMR * lmr,
-                           IN DAT_MEM_PRIV_FLAGS privileges,
-                           IN DAT_VA_TYPE va_type)
-{
-       dapl_dbg_log(DAPL_DBG_TYPE_ERR,
-                    " mr_register_shared: NOT IMPLEMENTED\n");
-
-       return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);
-}
-
-/*
- * dapls_ib_mw_alloc
- *
- * Bind a protection domain to a memory window
- *
- * Input:
- *     rmr     Initialized rmr to hold binding handles
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INSUFFICIENT_RESOURCES
- *
- */
-DAT_RETURN dapls_ib_mw_alloc(IN DAPL_RMR * rmr)
-{
-
-       dapl_dbg_log(DAPL_DBG_TYPE_ERR, " mw_alloc: NOT IMPLEMENTED\n");
-
-       return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);
-}
-
-/*
- * dapls_ib_mw_free
- *
- * Release bindings of a protection domain to a memory window
- *
- * Input:
- *     rmr     Initialized rmr to hold binding handles
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INVALID_STATE
- *
- */
-DAT_RETURN dapls_ib_mw_free(IN DAPL_RMR * rmr)
-{
-       dapl_dbg_log(DAPL_DBG_TYPE_ERR, " mw_free: NOT IMPLEMENTED\n");
-
-       return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);
-}
-
-/*
- * dapls_ib_mw_bind
- *
- * Bind a protection domain to a memory window
- *
- * Input:
- *     rmr     Initialized rmr to hold binding handles
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INVALID_PARAMETER;
- *     DAT_INSUFFICIENT_RESOURCES
- *
- */
-DAT_RETURN
-dapls_ib_mw_bind(IN DAPL_RMR * rmr,
-                IN DAPL_LMR * lmr,
-                IN DAPL_EP * ep,
-                IN DAPL_COOKIE * cookie,
-                IN DAT_VADDR virtual_address,
-                IN DAT_VLEN length,
-                IN DAT_MEM_PRIV_FLAGS mem_priv, IN DAT_BOOLEAN is_signaled)
-{
-       dapl_dbg_log(DAPL_DBG_TYPE_ERR, " mw_bind: NOT IMPLEMENTED\n");
-
-       return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);
-}
-
-/*
- * dapls_ib_mw_unbind
- *
- * Unbind a protection domain from a memory window
- *
- * Input:
- *     rmr     Initialized rmr to hold binding handles
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INVALID_PARAMETER;
- *     DAT_INVALID_STATE;
- *     DAT_INSUFFICIENT_RESOURCES
- *
- */
-DAT_RETURN
-dapls_ib_mw_unbind(IN DAPL_RMR * rmr,
-                  IN DAPL_EP * ep,
-                  IN DAPL_COOKIE * cookie, IN DAT_BOOLEAN is_signaled)
-{
-       dapl_dbg_log(DAPL_DBG_TYPE_ERR, " mw_unbind: NOT IMPLEMENTED\n");
-
-       return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);
-}
-
-/*
- * Local variables:
- *  c-indent-level: 4
- *  c-basic-offset: 4
- *  tab-width: 8
- * End:
- */
diff --git a/branches/winverbs/ulp/dapl2/dapl/openib_cma/dapl_ib_qp.c b/branches/winverbs/ulp/dapl2/dapl/openib_cma/dapl_ib_qp.c
deleted file mode 100644 (file)
index c9a61c3..0000000
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- * Copyright (c) 2005-2007 Intel Corporation.  All rights reserved.
- *
- * This Software is licensed under one of the following licenses:
- *
- * 1) under the terms of the "Common Public License 1.0" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/cpl.php.
- *
- * 2) under the terms of the "The BSD License" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/bsd-license.php.
- *
- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
- *    copy of which is available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/gpl-license.php.
- *
- * Licensee has the right to choose one of the above licenses.
- *
- * Redistributions of source code must retain the above copyright
- * notice and one of the license notices.
- *
- * Redistributions in binary form must reproduce both the above copyright
- * notice, one of the license notices in the documentation
- * and/or other materials provided with the distribution.
- */
-
-/**********************************************************************
- *
- * MODULE: dapl_ib_qp.c
- *
- * PURPOSE: QP routines for access to OFED IB Verbs
- *
- * $Id: $
- *
- **********************************************************************/
-
-#include "dapl.h"
-#include "dapl_adapter_util.h"
-
-extern struct rdma_event_channel *g_cm_events;
-
-/*
- * dapl_ib_qp_alloc
- *
- * Alloc a QP
- *
- * Input:
- *     *ep_ptr         pointer to EP INFO
- *     ib_hca_handle   provider HCA handle
- *     ib_pd_handle    provider protection domain handle
- *     cq_recv         provider recv CQ handle
- *     cq_send         provider send CQ handle
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INSUFFICIENT_RESOURCES
- *     DAT_INTERNAL_ERROR
- *
- */
-DAT_RETURN dapls_ib_qp_alloc(IN DAPL_IA * ia_ptr,
-                            IN DAPL_EP * ep_ptr, IN DAPL_EP * ep_ctx_ptr)
-{
-       DAT_EP_ATTR *attr;
-       DAPL_EVD *rcv_evd, *req_evd;
-       ib_cq_handle_t rcv_cq, req_cq;
-       ib_pd_handle_t ib_pd_handle;
-       struct ibv_qp_init_attr qp_create;
-       dp_ib_cm_handle_t conn;
-       struct rdma_cm_id *cm_id;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    " qp_alloc: ia_ptr %p ep_ptr %p ep_ctx_ptr %p\n",
-                    ia_ptr, ep_ptr, ep_ctx_ptr);
-
-       attr = &ep_ptr->param.ep_attr;
-       ib_pd_handle = ((DAPL_PZ *) ep_ptr->param.pz_handle)->pd_handle;
-       rcv_evd = (DAPL_EVD *) ep_ptr->param.recv_evd_handle;
-       req_evd = (DAPL_EVD *) ep_ptr->param.request_evd_handle;
-
-       /* 
-        * DAT allows usage model of EP's with no EVD's but IB does not. 
-        * Create a CQ with zero entries under the covers to support and 
-        * catch any invalid posting. 
-        */
-       if (rcv_evd != DAT_HANDLE_NULL)
-               rcv_cq = rcv_evd->ib_cq_handle;
-       else if (!ia_ptr->hca_ptr->ib_trans.ib_cq_empty)
-               rcv_cq = ia_ptr->hca_ptr->ib_trans.ib_cq_empty;
-       else {
-               struct ibv_comp_channel *channel =
-                   ia_ptr->hca_ptr->ib_trans.ib_cq;
-#ifdef CQ_WAIT_OBJECT
-               if (rcv_evd->cq_wait_obj_handle)
-                       channel = rcv_evd->cq_wait_obj_handle->events;
-#endif
-               /* Call IB verbs to create CQ */
-               rcv_cq = ibv_create_cq(ia_ptr->hca_ptr->ib_hca_handle,
-                                      0, NULL, channel, 0);
-
-               if (rcv_cq == IB_INVALID_HANDLE)
-                       return (dapl_convert_errno(ENOMEM, "create_cq"));
-
-               ia_ptr->hca_ptr->ib_trans.ib_cq_empty = rcv_cq;
-       }
-       if (req_evd != DAT_HANDLE_NULL)
-               req_cq = req_evd->ib_cq_handle;
-       else
-               req_cq = ia_ptr->hca_ptr->ib_trans.ib_cq_empty;
-
-       /* 
-        * IMPLEMENTATION NOTE:
-        * uDAPL allows consumers to post buffers on the EP after creation
-        * and before a connect request (outbound and inbound). This forces
-        * a binding to a device during the hca_open call and requires the
-        * consumer to predetermine which device to listen on or connect from.
-        * This restriction eliminates any option of listening or connecting 
-        * over multiple devices. uDAPL should add API's to resolve addresses 
-        * and bind to the device at the approriate time (before connect 
-        * and after CR arrives). Discovery should happen at connection time 
-        * based on addressing and not on static configuration during open.
-        */
-
-       /* Allocate CM and initialize lock */
-       if ((conn = dapl_os_alloc(sizeof(*conn))) == NULL)
-               return (dapl_convert_errno(ENOMEM, "create_cq"));
-
-       dapl_os_memzero(conn, sizeof(*conn));
-       dapl_os_lock_init(&conn->lock);
-
-       /* create CM_ID, bind to local device, create QP */
-       if (rdma_create_id(g_cm_events, &cm_id, (void *)conn, RDMA_PS_TCP)) {
-               dapl_os_free(conn, sizeof(*conn));
-               return (dapl_convert_errno(errno, "create_qp"));
-       }
-
-       /* open identifies the local device; per DAT specification */
-       if (rdma_bind_addr(cm_id,
-                          (struct sockaddr *)&ia_ptr->hca_ptr->hca_address))
-               goto bail;
-
-       /* Setup attributes and create qp */
-       dapl_os_memzero((void *)&qp_create, sizeof(qp_create));
-       qp_create.cap.max_send_wr = attr->max_request_dtos;
-       qp_create.cap.max_send_sge = attr->max_request_iov;
-       qp_create.cap.max_inline_data =
-           ia_ptr->hca_ptr->ib_trans.max_inline_send;
-       qp_create.send_cq = req_cq;
-
-       /* ibv assumes rcv_cq is never NULL, set to req_cq */
-       if (rcv_cq == NULL) {
-               qp_create.recv_cq = req_cq;
-               qp_create.cap.max_recv_wr = 0;
-               qp_create.cap.max_recv_sge = 0;
-       } else {
-               qp_create.recv_cq = rcv_cq;
-               qp_create.cap.max_recv_wr = attr->max_recv_dtos;
-               qp_create.cap.max_recv_sge = attr->max_recv_iov;
-       }
-       qp_create.qp_type = IBV_QPT_RC;
-       qp_create.qp_context = (void *)ep_ptr;
-
-       /* Let uCMA transition QP states */
-       if (rdma_create_qp(cm_id, ib_pd_handle, &qp_create))
-               goto bail;
-
-       conn->cm_id = cm_id;
-       conn->ep = ep_ptr;
-       conn->hca = ia_ptr->hca_ptr;
-
-       /* setup timers for address and route resolution */
-       conn->arp_timeout = dapl_os_get_env_val("DAPL_CM_ARP_TIMEOUT_MS",
-                                               IB_ARP_TIMEOUT);
-       conn->arp_retries = dapl_os_get_env_val("DAPL_CM_ARP_RETRY_COUNT",
-                                               IB_ARP_RETRY_COUNT);
-       conn->route_timeout = dapl_os_get_env_val("DAPL_CM_ROUTE_TIMEOUT_MS",
-                                                 IB_ROUTE_TIMEOUT);
-       conn->route_retries = dapl_os_get_env_val("DAPL_CM_ROUTE_RETRY_COUNT",
-                                                 IB_ROUTE_RETRY_COUNT);
-
-       /* setup up ep->param to reference the bound local address and port */
-       ep_ptr->param.local_ia_address_ptr = &cm_id->route.addr.src_addr;
-       ep_ptr->param.local_port_qual = rdma_get_src_port(cm_id);
-
-       ep_ptr->qp_handle = conn;
-       ep_ptr->qp_state = IB_QP_STATE_INIT;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    " qp_alloc: qpn %p sq %d,%d rq %d,%d port=%d\n",
-                    ep_ptr->qp_handle->cm_id->qp->qp_num,
-                    qp_create.cap.max_send_wr, qp_create.cap.max_send_sge,
-                    qp_create.cap.max_recv_wr, qp_create.cap.max_recv_sge,
-                    ep_ptr->param.local_port_qual);
-
-       return DAT_SUCCESS;
-      bail:
-       rdma_destroy_id(cm_id);
-       dapl_os_free(conn, sizeof(*conn));
-       return (dapl_convert_errno(errno, "create_qp"));
-}
-
-/*
- * dapl_ib_qp_free
- *
- * Free a QP
- *
- * Input:
- *     ia_handle       IA handle
- *     *ep_ptr         pointer to EP INFO
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *  dapl_convert_errno
- *
- */
-DAT_RETURN dapls_ib_qp_free(IN DAPL_IA * ia_ptr, IN DAPL_EP * ep_ptr)
-{
-       dapl_dbg_log(DAPL_DBG_TYPE_EP, " qp_free:  ep_ptr %p qp %p\n",
-                    ep_ptr, ep_ptr->qp_handle);
-
-       if (ep_ptr->qp_handle != IB_INVALID_HANDLE) {
-               /* qp_handle is conn object with reference to cm_id and qp */
-               dapli_destroy_conn(ep_ptr->qp_handle);
-               ep_ptr->qp_handle = IB_INVALID_HANDLE;
-               ep_ptr->qp_state = IB_QP_STATE_ERROR;
-       }
-       return DAT_SUCCESS;
-}
-
-/*
- * dapl_ib_qp_modify
- *
- * Set the QP to the parameters specified in an EP_PARAM
- *
- * The EP_PARAM structure that is provided has been
- * sanitized such that only non-zero values are valid.
- *
- * Input:
- *     ib_hca_handle           HCA handle
- *     qp_handle               QP handle
- *     ep_attr                 Sanitized EP Params
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INSUFFICIENT_RESOURCES
- *     DAT_INVALID_PARAMETER
- *
- */
-DAT_RETURN dapls_ib_qp_modify(IN DAPL_IA * ia_ptr,
-                             IN DAPL_EP * ep_ptr, IN DAT_EP_ATTR * attr)
-{
-       struct ibv_qp_attr qp_attr;
-
-       if (ep_ptr->qp_handle == IB_INVALID_HANDLE)
-               return DAT_INVALID_PARAMETER;
-
-       /*
-        * Check if we have the right qp_state to modify attributes
-        */
-       if ((ep_ptr->qp_handle->cm_id->qp->state != IBV_QPS_RTR) &&
-           (ep_ptr->qp_handle->cm_id->qp->state != IBV_QPS_RTS))
-               return DAT_INVALID_STATE;
-
-       /* Adjust to current EP attributes */
-       dapl_os_memzero((void *)&qp_attr, sizeof(qp_attr));
-       qp_attr.cap.max_send_wr = attr->max_request_dtos;
-       qp_attr.cap.max_recv_wr = attr->max_recv_dtos;
-       qp_attr.cap.max_send_sge = attr->max_request_iov;
-       qp_attr.cap.max_recv_sge = attr->max_recv_iov;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    "modify_qp: qp %p sq %d,%d, rq %d,%d\n",
-                    ep_ptr->qp_handle->cm_id->qp,
-                    qp_attr.cap.max_send_wr, qp_attr.cap.max_send_sge,
-                    qp_attr.cap.max_recv_wr, qp_attr.cap.max_recv_sge);
-
-       if (ibv_modify_qp(ep_ptr->qp_handle->cm_id->qp, &qp_attr, IBV_QP_CAP)) {
-               dapl_dbg_log(DAPL_DBG_TYPE_ERR,
-                            "modify_qp: modify ep %p qp %p failed\n",
-                            ep_ptr, ep_ptr->qp_handle->cm_id->qp);
-               return (dapl_convert_errno(errno, "modify_qp_state"));
-       }
-
-       return DAT_SUCCESS;
-}
-
-/*
- * dapls_ib_reinit_ep
- *
- * Move the QP to INIT state again.
- *
- * Input:
- *     ep_ptr          DAPL_EP
- *
- * Output:
- *     none
- *
- * Returns:
- *     void
- *
- */
-void dapls_ib_reinit_ep(IN DAPL_EP * ep_ptr)
-{
-       /* uCMA does not allow reuse of CM_ID, destroy and create new one */
-       if (ep_ptr->qp_handle != IB_INVALID_HANDLE) {
-
-               /* destroy */
-               dapli_destroy_conn(ep_ptr->qp_handle);
-
-               /* create new CM_ID and QP */
-               ep_ptr->qp_handle = IB_INVALID_HANDLE;
-               dapls_ib_qp_alloc(ep_ptr->header.owner_ia, ep_ptr, ep_ptr);
-       }
-}
-
-/*
- * Local variables:
- *  c-indent-level: 4
- *  c-basic-offset: 4
- *  tab-width: 8
- * End:
- */
diff --git a/branches/winverbs/ulp/dapl2/dapl/openib_cma/dapl_ib_util.c b/branches/winverbs/ulp/dapl2/dapl/openib_cma/dapl_ib_util.c
deleted file mode 100644 (file)
index f48c1cb..0000000
+++ /dev/null
@@ -1,1133 +0,0 @@
-/*
- * Copyright (c) 2005-2008 Intel Corporation.  All rights reserved.
- *
- * This Software is licensed under one of the following licenses:
- *
- * 1) under the terms of the "Common Public License 1.0" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/cpl.php.
- *
- * 2) under the terms of the "The BSD License" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/bsd-license.php.
- *
- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
- *    copy of which is available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/gpl-license.php.
- *
- * Licensee has the right to choose one of the above licenses.
- *
- * Redistributions of source code must retain the above copyright
- * notice and one of the license notices.
- *
- * Redistributions in binary form must reproduce both the above copyright
- * notice, one of the license notices in the documentation
- * and/or other materials provided with the distribution.
- */
-
-/**********************************************************************
- * 
- * MODULE: dapl_ib_util.c
- *
- * PURPOSE: OFED provider - init, open, close, utilities, work thread
- *
- * $Id:$
- *
- **********************************************************************/
-
-#ifdef RCSID
-static const char rcsid[] = "$Id:  $";
-#endif
-
-#include "openib_osd.h"
-#include "dapl.h"
-#include "dapl_adapter_util.h"
-#include "dapl_ib_util.h"
-#include "dapl_osd.h"
-
-#include <stdlib.h>
-
-int g_dapl_loopback_connection = 0;
-struct rdma_event_channel *g_cm_events = NULL;
-ib_thread_state_t g_ib_thread_state = 0;
-DAPL_OS_THREAD g_ib_thread;
-DAPL_OS_LOCK g_hca_lock;
-struct dapl_llist_entry *g_hca_list;
-
-#if defined(_WIN64) || defined(_WIN32)
-#include "..\..\..\..\..\etc\user\comp_channel.cpp"
-#include <rdma\winverbs.h>
-
-struct ibvw_windata windata;
-
-static int getipaddr_netdev(char *name, char *addr, int addr_len)
-{
-       IWVProvider *prov;
-       WV_DEVICE_ADDRESS devaddr;
-       struct addrinfo *res, *ai;
-       HRESULT hr;
-       int index;
-
-       if (strncmp(name, "rdma_dev", 8)) {
-               return EINVAL;
-       }
-
-       index = atoi(name + 8);
-
-       hr = WvGetObject(&IID_IWVProvider, (LPVOID *) &prov);
-       if (FAILED(hr)) {
-               return hr;
-       }
-
-       hr = getaddrinfo("..localmachine", NULL, NULL, &res);
-       if (hr) {
-               goto release;
-       }
-
-       for (ai = res; ai; ai = ai->ai_next) {
-               hr = prov->lpVtbl->TranslateAddress(prov, ai->ai_addr, &devaddr);
-               if (SUCCEEDED(hr) && (ai->ai_addrlen <= addr_len) && (index-- == 0)) {
-                       memcpy(addr, ai->ai_addr, ai->ai_addrlen);
-                       goto free;
-               }
-       }
-       hr = ENODEV;
-
-free:
-       freeaddrinfo(res);
-release:
-       prov->lpVtbl->Release(prov);
-       return hr;
-}
-
-static int dapls_os_init(void)
-{
-       return ibvw_get_windata(&windata, IBVW_WINDATA_VERSION);
-}
-
-static void dapls_os_release(void)
-{
-       if (windata.comp_mgr)
-               ibvw_release_windata(&windata, IBVW_WINDATA_VERSION);
-       windata.comp_mgr = NULL;
-}
-
-static int dapls_config_comp_channel(struct ibv_comp_channel *channel)
-{
-       channel->comp_channel.Milliseconds = 0;
-       return 0;
-}
-
-static int dapls_config_cm_channel(struct rdma_event_channel *channel)
-{
-       channel->channel.Milliseconds = 0;
-       return 0;
-}
-
-static int dapls_config_verbs(struct ibv_context *verbs)
-{
-       verbs->channel.Milliseconds = 0;
-       return 0;
-}
-
-static int dapls_thread_signal(void)
-{
-       CompManagerCancel(windata.comp_mgr);
-       return 0;
-}
-#else                          // _WIN64 || WIN32
-int g_ib_pipe[2];
-
-static int dapls_os_init(void)
-{
-       /* create pipe for waking up work thread */
-       return pipe(g_ib_pipe);
-}
-
-static void dapls_os_release(void)
-{
-       /* close pipe? */
-}
-
-/* Get IP address using network device name */
-static int getipaddr_netdev(char *name, char *addr, int addr_len)
-{
-       struct ifreq ifr;
-       int skfd, ret, len;
-
-       /* Fill in the structure */
-       snprintf(ifr.ifr_name, IFNAMSIZ, "%s", name);
-       ifr.ifr_hwaddr.sa_family = ARPHRD_INFINIBAND;
-
-       /* Create a socket fd */
-       skfd = socket(PF_INET, SOCK_STREAM, 0);
-       ret = ioctl(skfd, SIOCGIFADDR, &ifr);
-       if (ret)
-               goto bail;
-
-       switch (ifr.ifr_addr.sa_family) {
-#ifdef AF_INET6
-       case AF_INET6:
-               len = sizeof(struct sockaddr_in6);
-               break;
-#endif
-       case AF_INET:
-       default:
-               len = sizeof(struct sockaddr);
-               break;
-       }
-
-       if (len <= addr_len)
-               memcpy(addr, &ifr.ifr_addr, len);
-       else
-               ret = EINVAL;
-
-      bail:
-       close(skfd);
-       return ret;
-}
-
-static int dapls_config_fd(int fd)
-{
-       int opts;
-
-       opts = fcntl(fd, F_GETFL);
-       if (opts < 0 || fcntl(fd, F_SETFL, opts | O_NONBLOCK) < 0) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " dapls_config_fd: fcntl on fd %d ERR %d %s\n",
-                        fd, opts, strerror(errno));
-               return errno;
-       }
-
-       return 0;
-}
-
-static int dapls_config_comp_channel(struct ibv_comp_channel *channel)
-{
-       return dapls_config_fd(channel->fd);
-}
-
-static int dapls_config_cm_channel(struct rdma_event_channel *channel)
-{
-       return dapls_config_fd(channel->fd);
-}
-
-static int dapls_config_verbs(struct ibv_context *verbs)
-{
-       return dapls_config_fd(verbs->async_fd);
-}
-
-static int dapls_thread_signal(void)
-{
-       return write(g_ib_pipe[1], "w", sizeof "w");
-}
-#endif
-
-/* Get IP address using network name, address, or device name */
-static int getipaddr(char *name, char *addr, int len)
-{
-       struct addrinfo *res;
-
-       /* assume netdev for first attempt, then network and address type */
-       if (getipaddr_netdev(name, addr, len)) {
-               if (getaddrinfo(name, NULL, NULL, &res)) {
-                       dapl_log(DAPL_DBG_TYPE_ERR,
-                                " open_hca: getaddr_netdev ERROR:"
-                                " %s. Is %s configured?\n",
-                                strerror(errno), name);
-                       return 1;
-               } else {
-                       if (len >= res->ai_addrlen)
-                               memcpy(addr, res->ai_addr, res->ai_addrlen);
-                       else {
-                               freeaddrinfo(res);
-                               return 1;
-                       }
-                       freeaddrinfo(res);
-               }
-       }
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " getipaddr: family %d port %d addr %d.%d.%d.%d\n",
-                    ((struct sockaddr_in *)addr)->sin_family,
-                    ((struct sockaddr_in *)addr)->sin_port,
-                    ((struct sockaddr_in *)addr)->sin_addr.s_addr >> 0 & 0xff,
-                    ((struct sockaddr_in *)addr)->sin_addr.s_addr >> 8 & 0xff,
-                    ((struct sockaddr_in *)addr)->sin_addr.s_addr >> 16 & 0xff,
-                    ((struct sockaddr_in *)addr)->sin_addr.
-                    s_addr >> 24 & 0xff);
-
-       return 0;
-}
-
-/*
- * dapls_ib_init, dapls_ib_release
- *
- * Initialize Verb related items for device open
- *
- * Input:
- *     none
- *
- * Output:
- *     none
- *
- * Returns:
- *     0 success, -1 error
- *
- */
-int32_t dapls_ib_init(void)
-{
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " dapl_ib_init: \n");
-
-       /* initialize hca_list lock */
-       dapl_os_lock_init(&g_hca_lock);
-
-       /* initialize hca list for CQ events */
-       dapl_llist_init_head(&g_hca_list);
-
-       if (dapls_os_init())
-               return 1;
-
-       return 0;
-}
-
-int32_t dapls_ib_release(void)
-{
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " dapl_ib_release: \n");
-       dapli_ib_thread_destroy();
-       if (g_cm_events != NULL)
-               rdma_destroy_event_channel(g_cm_events);
-       dapls_os_release();
-       return 0;
-}
-
-/*
- * dapls_ib_open_hca
- *
- * Open HCA
- *
- * Input:
- *      *hca_name         pointer to provider device name
- *      *ib_hca_handle_p  pointer to provide HCA handle
- *
- * Output:
- *      none
- *
- * Return:
- *      DAT_SUCCESS
- *      dapl_convert_errno
- *
- */
-DAT_RETURN dapls_ib_open_hca(IN IB_HCA_NAME hca_name, IN DAPL_HCA * hca_ptr)
-{
-       struct rdma_cm_id *cm_id = NULL;
-       union ibv_gid *gid;
-       int ret;
-       DAT_RETURN dat_status;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " open_hca: %s - %p\n", hca_name, hca_ptr);
-
-       /* Setup the global cm event channel */
-       dapl_os_lock(&g_hca_lock);
-       if (g_cm_events == NULL) {
-               g_cm_events = rdma_create_event_channel();
-               if (g_cm_events == NULL) {
-                       dapl_dbg_log(DAPL_DBG_TYPE_ERR,
-                                    " open_hca: ERR - RDMA channel %s\n",
-                                    strerror(errno));
-                       return DAT_INTERNAL_ERROR;
-               }
-       }
-       dapl_os_unlock(&g_hca_lock);
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " open_hca: RDMA channel created (%p)\n", g_cm_events);
-
-       dat_status = dapli_ib_thread_init();
-       if (dat_status != DAT_SUCCESS)
-               return dat_status;
-
-       /* HCA name will be hostname or IP address */
-       if (getipaddr((char *)hca_name,
-                     (char *)&hca_ptr->hca_address, sizeof(DAT_SOCK_ADDR6)))
-               return DAT_INVALID_ADDRESS;
-
-       /* cm_id will bind local device/GID based on IP address */
-       if (rdma_create_id(g_cm_events, &cm_id, (void *)hca_ptr, RDMA_PS_TCP)) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " open_hca: rdma_create_id ERR %s\n", strerror(errno));
-               return DAT_INTERNAL_ERROR;
-       }
-       ret = rdma_bind_addr(cm_id, (struct sockaddr *)&hca_ptr->hca_address);
-       if ((ret) || (cm_id->verbs == NULL)) {
-               rdma_destroy_id(cm_id);
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " open_hca: rdma_bind ERR %s."
-                        " Is %s configured?\n", strerror(errno), hca_name);
-               return DAT_INVALID_ADDRESS;
-       }
-
-       /* keep reference to IB device and cm_id */
-       hca_ptr->ib_trans.cm_id = cm_id;
-       hca_ptr->ib_hca_handle = cm_id->verbs;
-       dapls_config_verbs(cm_id->verbs);
-       hca_ptr->port_num = cm_id->port_num;
-       gid = &cm_id->route.addr.addr.ibaddr.sgid;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " open_hca: ctx=%p port=%d GID subnet %016llx id %016llx\n",
-                    cm_id->verbs, cm_id->port_num,
-                    (unsigned long long)ntohll(gid->global.subnet_prefix),
-                    (unsigned long long)ntohll(gid->global.interface_id));
-
-       /* set inline max with env or default, get local lid and gid 0 */
-       if (hca_ptr->ib_hca_handle->device->transport_type
-           == IBV_TRANSPORT_IWARP)
-               hca_ptr->ib_trans.max_inline_send =
-                   dapl_os_get_env_val("DAPL_MAX_INLINE",
-                                       INLINE_SEND_IWARP_DEFAULT);
-       else
-               hca_ptr->ib_trans.max_inline_send =
-                   dapl_os_get_env_val("DAPL_MAX_INLINE",
-                                       INLINE_SEND_IB_DEFAULT);
-
-       /* set CM timer defaults */
-       hca_ptr->ib_trans.max_cm_timeout =
-           dapl_os_get_env_val("DAPL_MAX_CM_RESPONSE_TIME",
-                               IB_CM_RESPONSE_TIMEOUT);
-       hca_ptr->ib_trans.max_cm_retries =
-           dapl_os_get_env_val("DAPL_MAX_CM_RETRIES", IB_CM_RETRIES);
-
-       /* EVD events without direct CQ channels, non-blocking */
-       hca_ptr->ib_trans.ib_cq =
-           ibv_create_comp_channel(hca_ptr->ib_hca_handle);
-       if (hca_ptr->ib_trans.ib_cq == NULL) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " open_hca: ibv_create_comp_channel ERR %s\n",
-                        strerror(errno));
-               goto bail;
-       }
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " open_hca: CQ channel created\n");
-
-       if (dapls_config_comp_channel(hca_ptr->ib_trans.ib_cq)) {
-               goto bail;
-       }
-
-       /* 
-        * Put new hca_transport on list for async and CQ event processing 
-        * Wakeup work thread to add to polling list
-        */
-       dapl_llist_init_entry((DAPL_LLIST_ENTRY *) & hca_ptr->ib_trans.entry);
-       dapl_os_lock(&g_hca_lock);
-       dapl_llist_add_tail(&g_hca_list,
-                           (DAPL_LLIST_ENTRY *) & hca_ptr->ib_trans.entry,
-                           &hca_ptr->ib_trans.entry);
-       if (dapls_thread_signal() == -1)
-               dapl_log(DAPL_DBG_TYPE_UTIL,
-                        " open_hca: thread wakeup error = %s\n",
-                        strerror(errno));
-       dapl_os_unlock(&g_hca_lock);
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " open_hca: %s, %s %d.%d.%d.%d INLINE_MAX=%d\n", hca_name,
-                    ((struct sockaddr_in *)
-                     &hca_ptr->hca_address)->sin_family == AF_INET ?
-                    "AF_INET" : "AF_INET6", ((struct sockaddr_in *)
-                                             &hca_ptr->hca_address)->sin_addr.
-                    s_addr >> 0 & 0xff, ((struct sockaddr_in *)
-                                         &hca_ptr->hca_address)->sin_addr.
-                    s_addr >> 8 & 0xff, ((struct sockaddr_in *)
-                                         &hca_ptr->hca_address)->sin_addr.
-                    s_addr >> 16 & 0xff, ((struct sockaddr_in *)
-                                          &hca_ptr->hca_address)->sin_addr.
-                    s_addr >> 24 & 0xff, hca_ptr->ib_trans.max_inline_send);
-
-       hca_ptr->ib_trans.d_hca = hca_ptr;
-       return DAT_SUCCESS;
-      bail:
-       rdma_destroy_id(hca_ptr->ib_trans.cm_id);
-       hca_ptr->ib_hca_handle = IB_INVALID_HANDLE;
-       return DAT_INTERNAL_ERROR;
-}
-
-/*
- * dapls_ib_close_hca
- *
- * Open HCA
- *
- * Input:
- *      DAPL_HCA   provide CA handle
- *
- * Output:
- *      none
- *
- * Return:
- *      DAT_SUCCESS
- *     dapl_convert_errno 
- *
- */
-DAT_RETURN dapls_ib_close_hca(IN DAPL_HCA * hca_ptr)
-{
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " close_hca: %p->%p\n",
-                    hca_ptr, hca_ptr->ib_hca_handle);
-
-       if (hca_ptr->ib_hca_handle != IB_INVALID_HANDLE) {
-               if (rdma_destroy_id(hca_ptr->ib_trans.cm_id))
-                       return (dapl_convert_errno(errno, "ib_close_device"));
-               hca_ptr->ib_hca_handle = IB_INVALID_HANDLE;
-       }
-
-       dapl_os_lock(&g_hca_lock);
-       if (g_ib_thread_state != IB_THREAD_RUN) {
-               dapl_os_unlock(&g_hca_lock);
-               goto bail;
-       }
-       dapl_os_unlock(&g_hca_lock);
-
-       /* 
-        * Remove hca from async and CQ event processing list
-        * Wakeup work thread to remove from polling list
-        */
-       hca_ptr->ib_trans.destroy = 1;
-       if (dapls_thread_signal() == -1)
-               dapl_log(DAPL_DBG_TYPE_UTIL,
-                        " destroy: thread wakeup error = %s\n",
-                        strerror(errno));
-
-       /* wait for thread to remove HCA references */
-       while (hca_ptr->ib_trans.destroy != 2) {
-               if (dapls_thread_signal() == -1)
-                       dapl_log(DAPL_DBG_TYPE_UTIL,
-                                " destroy: thread wakeup error = %s\n",
-                                strerror(errno));
-               dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                            " ib_thread_destroy: wait on hca %p destroy\n");
-               dapl_os_sleep_usec(10000);
-       }
-      bail:
-       return (DAT_SUCCESS);
-}
-
-/*
- * dapls_ib_query_hca
- *
- * Query the hca attribute
- *
- * Input:
- *     hca_handl               hca handle      
- *     ia_attr                 attribute of the ia
- *     ep_attr                 attribute of the ep
- *     ip_addr                 ip address of DET NIC
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INVALID_HANDLE
- */
-
-DAT_RETURN dapls_ib_query_hca(IN DAPL_HCA * hca_ptr,
-                             OUT DAT_IA_ATTR * ia_attr,
-                             OUT DAT_EP_ATTR * ep_attr,
-                             OUT DAT_SOCK_ADDR6 * ip_addr)
-{
-       struct ibv_device_attr dev_attr;
-       struct ibv_port_attr port_attr;
-
-       if (hca_ptr->ib_hca_handle == NULL) {
-               dapl_dbg_log(DAPL_DBG_TYPE_ERR, " query_hca: BAD handle\n");
-               return (DAT_INVALID_HANDLE);
-       }
-
-       /* local IP address of device, set during ia_open */
-       if (ip_addr != NULL)
-               memcpy(ip_addr, &hca_ptr->hca_address, sizeof(DAT_SOCK_ADDR6));
-
-       if (ia_attr == NULL && ep_attr == NULL)
-               return DAT_SUCCESS;
-
-       /* query verbs for this device and port attributes */
-       if (ibv_query_device(hca_ptr->ib_hca_handle, &dev_attr) ||
-           ibv_query_port(hca_ptr->ib_hca_handle,
-                          hca_ptr->port_num, &port_attr))
-               return (dapl_convert_errno(errno, "ib_query_hca"));
-
-       /*
-        * There is no query for inline data so there is no way to 
-        * calculate the impact on sge nor the max inline send. Most 
-        * implementions consume 1 or none so just reduce by 1 until 
-        * we are provided with a query mechanism from verbs.
-        */
-       if (hca_ptr->ib_trans.max_inline_send)
-               dev_attr.max_sge--;
-
-       if (ia_attr != NULL) {
-               (void)dapl_os_memzero(ia_attr, sizeof(*ia_attr));
-               ia_attr->adapter_name[DAT_NAME_MAX_LENGTH - 1] = '\0';
-               ia_attr->vendor_name[DAT_NAME_MAX_LENGTH - 1] = '\0';
-               ia_attr->ia_address_ptr =
-                   (DAT_IA_ADDRESS_PTR) & hca_ptr->hca_address;
-
-               dapl_log(DAPL_DBG_TYPE_UTIL,
-                        "dapl_query_hca: %s %s %s\n", hca_ptr->name,
-                        ((struct sockaddr_in *)
-                         ia_attr->ia_address_ptr)->sin_family == AF_INET ?
-                        "AF_INET" : "AF_INET6",
-                        inet_ntoa(((struct sockaddr_in *)
-                                   ia_attr->ia_address_ptr)->sin_addr));
-
-               ia_attr->hardware_version_major = dev_attr.hw_ver;
-               ia_attr->max_eps = dev_attr.max_qp;
-               ia_attr->max_dto_per_ep = dev_attr.max_qp_wr;
-               ia_attr->max_rdma_read_in = dev_attr.max_res_rd_atom;
-               ia_attr->max_rdma_read_out = dev_attr.max_qp_init_rd_atom;
-               ia_attr->max_rdma_read_per_ep_in = dev_attr.max_qp_rd_atom;
-               ia_attr->max_rdma_read_per_ep_out =
-                   dev_attr.max_qp_init_rd_atom;
-               ia_attr->max_rdma_read_per_ep_in_guaranteed = DAT_TRUE;
-               ia_attr->max_rdma_read_per_ep_out_guaranteed = DAT_TRUE;
-               ia_attr->max_evds = dev_attr.max_cq;
-               ia_attr->max_evd_qlen = dev_attr.max_cqe;
-               ia_attr->max_iov_segments_per_dto = dev_attr.max_sge;
-               ia_attr->max_lmrs = dev_attr.max_mr;
-               /* 32bit attribute from 64bit, 4G-1 limit, DAT v2 needs fix */
-               ia_attr->max_lmr_block_size = 
-                   (dev_attr.max_mr_size >> 32) ? ~0 : dev_attr.max_mr_size;
-               ia_attr->max_rmrs = dev_attr.max_mw;
-               ia_attr->max_lmr_virtual_address = dev_attr.max_mr_size;
-               ia_attr->max_rmr_target_address = dev_attr.max_mr_size;
-               ia_attr->max_pzs = dev_attr.max_pd;
-               ia_attr->max_mtu_size = port_attr.max_msg_sz;
-               ia_attr->max_rdma_size = port_attr.max_msg_sz;
-               ia_attr->num_transport_attr = 0;
-               ia_attr->transport_attr = NULL;
-               ia_attr->num_vendor_attr = 0;
-               ia_attr->vendor_attr = NULL;
-               /* iWARP spec. - 1 sge for RDMA reads */
-               if (hca_ptr->ib_hca_handle->device->transport_type
-                   == IBV_TRANSPORT_IWARP)
-                       ia_attr->max_iov_segments_per_rdma_read = 1;
-               else
-                       ia_attr->max_iov_segments_per_rdma_read =
-                           dev_attr.max_sge;
-
-               ia_attr->max_iov_segments_per_rdma_write = dev_attr.max_sge;
-               /* save rd_atom for peer validation during connect requests */
-               hca_ptr->ib_trans.max_rdma_rd_in = dev_attr.max_qp_rd_atom;
-               hca_ptr->ib_trans.max_rdma_rd_out =
-                   dev_attr.max_qp_init_rd_atom;
-#ifdef DAT_EXTENSIONS
-               ia_attr->extension_supported = DAT_EXTENSION_IB;
-               ia_attr->extension_version = DAT_IB_EXTENSION_VERSION;
-#endif
-               dapl_log(DAPL_DBG_TYPE_UTIL,
-                        "dapl_query_hca: (ver=%x) ep's %d ep_q %d"
-                        " evd's %d evd_q %d mr %u\n",
-                        ia_attr->hardware_version_major,
-                        ia_attr->max_eps, ia_attr->max_dto_per_ep,
-                        ia_attr->max_evds, ia_attr->max_evd_qlen, 
-                        ia_attr->max_lmr_block_size);
-               dapl_log(DAPL_DBG_TYPE_UTIL,
-                        "dapl_query_hca: msg %llu rdma %llu iov's %d"
-                        " lmr %d rmr %d rd_in,out %d,%d inline=%d\n",
-                        ia_attr->max_mtu_size, ia_attr->max_rdma_size,
-                        ia_attr->max_iov_segments_per_dto, ia_attr->max_lmrs,
-                        ia_attr->max_rmrs, ia_attr->max_rdma_read_per_ep_in,
-                        ia_attr->max_rdma_read_per_ep_out,
-                        hca_ptr->ib_trans.max_inline_send);
-       }
-
-       if (ep_attr != NULL) {
-               (void)dapl_os_memzero(ep_attr, sizeof(*ep_attr));
-               ep_attr->max_mtu_size = port_attr.max_msg_sz;
-               ep_attr->max_rdma_size = port_attr.max_msg_sz;
-               ep_attr->max_recv_dtos = dev_attr.max_qp_wr;
-               ep_attr->max_request_dtos = dev_attr.max_qp_wr;
-               ep_attr->max_recv_iov = dev_attr.max_sge;
-               ep_attr->max_request_iov = dev_attr.max_sge;
-               ep_attr->max_rdma_read_in = dev_attr.max_qp_rd_atom;
-               ep_attr->max_rdma_read_out = dev_attr.max_qp_init_rd_atom;
-               /* iWARP spec. - 1 sge for RDMA reads */
-               if (hca_ptr->ib_hca_handle->device->transport_type
-                   == IBV_TRANSPORT_IWARP)
-                       ep_attr->max_rdma_read_iov = 1;
-               else
-                       ep_attr->max_rdma_read_iov = dev_attr.max_sge;
-
-               ep_attr->max_rdma_write_iov = dev_attr.max_sge;
-               dapl_log(DAPL_DBG_TYPE_UTIL,
-                        "dapl_query_hca: MAX msg %llu dto %d iov %d"
-                        " rdma i%d,o%d\n",
-                        ep_attr->max_mtu_size,
-                        ep_attr->max_recv_dtos, ep_attr->max_recv_iov,
-                        ep_attr->max_rdma_read_in, ep_attr->max_rdma_read_out);
-       }
-       return DAT_SUCCESS;
-}
-
-/*
- * dapls_ib_setup_async_callback
- *
- * Set up an asynchronous callbacks of various kinds
- *
- * Input:
- *     ia_handle               IA handle
- *     handler_type            type of handler to set up
- *     callback_handle         handle param for completion callbacks
- *     callback                callback routine pointer
- *     context                 argument for callback routine
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INSUFFICIENT_RESOURCES
- *     DAT_INVALID_PARAMETER
- *
- */
-DAT_RETURN dapls_ib_setup_async_callback(IN DAPL_IA * ia_ptr,
-                                        IN DAPL_ASYNC_HANDLER_TYPE type,
-                                        IN DAPL_EVD * evd_ptr,
-                                        IN ib_async_handler_t callback,
-                                        IN void *context)
-{
-       ib_hca_transport_t *hca_ptr;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " setup_async_cb: ia %p type %d hdl %p cb %p ctx %p\n",
-                    ia_ptr, type, evd_ptr, callback, context);
-
-       hca_ptr = &ia_ptr->hca_ptr->ib_trans;
-       switch (type) {
-       case DAPL_ASYNC_UNAFILIATED:
-               hca_ptr->async_unafiliated = (ib_async_handler_t) callback;
-               hca_ptr->async_un_ctx = context;
-               break;
-       case DAPL_ASYNC_CQ_ERROR:
-               hca_ptr->async_cq_error = (ib_async_cq_handler_t) callback;
-               break;
-       case DAPL_ASYNC_CQ_COMPLETION:
-               hca_ptr->async_cq = (ib_async_dto_handler_t) callback;
-               break;
-       case DAPL_ASYNC_QP_ERROR:
-               hca_ptr->async_qp_error = (ib_async_qp_handler_t) callback;
-               break;
-       default:
-               break;
-       }
-       return DAT_SUCCESS;
-}
-
-DAT_RETURN dapli_ib_thread_init(void)
-{
-       DAT_RETURN dat_status;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " ib_thread_init(%d)\n", dapl_os_getpid());
-
-       dapl_os_lock(&g_hca_lock);
-       if (g_ib_thread_state != IB_THREAD_INIT) {
-               dapl_os_unlock(&g_hca_lock);
-               return DAT_SUCCESS;
-       }
-
-       /* uCMA events non-blocking */
-       if (dapls_config_cm_channel(g_cm_events)) {
-               dapl_os_unlock(&g_hca_lock);
-               return (dapl_convert_errno(errno, "create_thread ERR: cm_fd"));
-       }
-
-       g_ib_thread_state = IB_THREAD_CREATE;
-       dapl_os_unlock(&g_hca_lock);
-
-       /* create thread to process inbound connect request */
-       dat_status = dapl_os_thread_create(dapli_thread, NULL, &g_ib_thread);
-       if (dat_status != DAT_SUCCESS)
-               return (dapl_convert_errno(errno,
-                                          "create_thread ERR:"
-                                          " check resource limits"));
-
-       /* wait for thread to start */
-       dapl_os_lock(&g_hca_lock);
-       while (g_ib_thread_state != IB_THREAD_RUN) {
-               dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                            " ib_thread_init: waiting for ib_thread\n");
-               dapl_os_unlock(&g_hca_lock);
-               dapl_os_sleep_usec(2000);
-               dapl_os_lock(&g_hca_lock);
-       }
-       dapl_os_unlock(&g_hca_lock);
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " ib_thread_init(%d) exit\n", dapl_os_getpid());
-
-       return DAT_SUCCESS;
-}
-
-void dapli_ib_thread_destroy(void)
-{
-       int retries = 10;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " ib_thread_destroy(%d)\n", dapl_os_getpid());
-       /* 
-        * wait for async thread to terminate. 
-        * pthread_join would be the correct method
-        * but some applications have some issues
-        */
-
-       /* destroy ib_thread, wait for termination, if not already */
-       dapl_os_lock(&g_hca_lock);
-       if (g_ib_thread_state != IB_THREAD_RUN)
-               goto bail;
-
-       g_ib_thread_state = IB_THREAD_CANCEL;
-       if (dapls_thread_signal() == -1)
-               dapl_log(DAPL_DBG_TYPE_UTIL,
-                        " destroy: thread wakeup error = %s\n",
-                        strerror(errno));
-       while ((g_ib_thread_state != IB_THREAD_EXIT) && (retries--)) {
-               dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                            " ib_thread_destroy: waiting for ib_thread\n");
-               if (dapls_thread_signal() == -1)
-                       dapl_log(DAPL_DBG_TYPE_UTIL,
-                                " destroy: thread wakeup error = %s\n",
-                                strerror(errno));
-               dapl_os_unlock(&g_hca_lock);
-               dapl_os_sleep_usec(2000);
-               dapl_os_lock(&g_hca_lock);
-       }
-
-      bail:
-       dapl_os_unlock(&g_hca_lock);
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " ib_thread_destroy(%d) exit\n", dapl_os_getpid());
-}
-
-void dapli_async_event_cb(struct _ib_hca_transport *hca)
-{
-       struct ibv_async_event event;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " async_event(%p)\n", hca);
-
-       if (hca->destroy)
-               return;
-
-       if (!ibv_get_async_event(hca->cm_id->verbs, &event)) {
-
-               switch (event.event_type) {
-               case IBV_EVENT_CQ_ERR:
-                       {
-                               struct dapl_ep *evd_ptr =
-                                   event.element.cq->cq_context;
-
-                               dapl_log(DAPL_DBG_TYPE_ERR,
-                                        "dapl async_event CQ (%p) ERR %d\n",
-                                        evd_ptr, event.event_type);
-
-                               /* report up if async callback still setup */
-                               if (hca->async_cq_error)
-                                       hca->async_cq_error(hca->cm_id->verbs,
-                                                           event.element.cq,
-                                                           &event,
-                                                           (void *)evd_ptr);
-                               break;
-                       }
-               case IBV_EVENT_COMM_EST:
-                       {
-                               /* Received msgs on connected QP before RTU */
-                               dapl_log(DAPL_DBG_TYPE_UTIL,
-                                        " async_event COMM_EST(%p) rdata beat RTU\n",
-                                        event.element.qp);
-
-                               break;
-                       }
-               case IBV_EVENT_QP_FATAL:
-               case IBV_EVENT_QP_REQ_ERR:
-               case IBV_EVENT_QP_ACCESS_ERR:
-               case IBV_EVENT_QP_LAST_WQE_REACHED:
-               case IBV_EVENT_SRQ_ERR:
-               case IBV_EVENT_SRQ_LIMIT_REACHED:
-               case IBV_EVENT_SQ_DRAINED:
-                       {
-                               struct dapl_ep *ep_ptr =
-                                   event.element.qp->qp_context;
-
-                               dapl_log(DAPL_DBG_TYPE_ERR,
-                                        "dapl async_event QP (%p) ERR %d\n",
-                                        ep_ptr, event.event_type);
-
-                               /* report up if async callback still setup */
-                               if (hca->async_qp_error)
-                                       hca->async_qp_error(hca->cm_id->verbs,
-                                                           ep_ptr->qp_handle,
-                                                           &event,
-                                                           (void *)ep_ptr);
-                               break;
-                       }
-               case IBV_EVENT_PATH_MIG:
-               case IBV_EVENT_PATH_MIG_ERR:
-               case IBV_EVENT_DEVICE_FATAL:
-               case IBV_EVENT_PORT_ACTIVE:
-               case IBV_EVENT_PORT_ERR:
-               case IBV_EVENT_LID_CHANGE:
-               case IBV_EVENT_PKEY_CHANGE:
-               case IBV_EVENT_SM_CHANGE:
-                       {
-                               dapl_log(DAPL_DBG_TYPE_WARN,
-                                        "dapl async_event: DEV ERR %d\n",
-                                        event.event_type);
-
-                               /* report up if async callback still setup */
-                               if (hca->async_unafiliated)
-                                       hca->async_unafiliated(hca->cm_id->
-                                                              verbs, &event,
-                                                              hca->
-                                                              async_un_ctx);
-                               break;
-                       }
-               case IBV_EVENT_CLIENT_REREGISTER:
-                       /* no need to report this event this time */
-                       dapl_log(DAPL_DBG_TYPE_UTIL,
-                                " async_event: IBV_EVENT_CLIENT_REREGISTER\n");
-                       break;
-
-               default:
-                       dapl_log(DAPL_DBG_TYPE_WARN,
-                                "dapl async_event: %d UNKNOWN\n",
-                                event.event_type);
-                       break;
-
-               }
-               ibv_ack_async_event(&event);
-       }
-}
-
-#if defined(_WIN64) || defined(_WIN32)
-/* work thread for uAT, uCM, CQ, and async events */
-void dapli_thread(void *arg)
-{
-       struct _ib_hca_transport *hca;
-       struct _ib_hca_transport *uhca[8];
-       COMP_CHANNEL *channel;
-       int ret, idx, cnt;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread(%d,0x%x): ENTER: \n",
-                    dapl_os_getpid(), g_ib_thread);
-
-       dapl_os_lock(&g_hca_lock);
-       for (g_ib_thread_state = IB_THREAD_RUN;
-            g_ib_thread_state == IB_THREAD_RUN; dapl_os_lock(&g_hca_lock)) {
-
-               idx = 0;
-               hca = dapl_llist_is_empty(&g_hca_list) ? NULL :
-                   dapl_llist_peek_head(&g_hca_list);
-
-               while (hca) {
-                       uhca[idx++] = hca;
-                       hca = dapl_llist_next_entry(&g_hca_list,
-                                                   (DAPL_LLIST_ENTRY *) & hca->
-                                                   entry);
-               }
-               cnt = idx;
-
-               dapl_os_unlock(&g_hca_lock);
-               ret = CompManagerPoll(windata.comp_mgr, INFINITE, &channel);
-
-               dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                            " ib_thread(%d) poll_event 0x%x\n",
-                            dapl_os_getpid(), ret);
-
-               dapli_cma_event_cb();
-
-               /* check and process CQ and ASYNC events, per device */
-               for (idx = 0; idx < cnt; idx++) {
-                       if (uhca[idx]->destroy == 1) {
-                               dapl_os_lock(&g_hca_lock);
-                               dapl_llist_remove_entry(&g_hca_list,
-                                                       (DAPL_LLIST_ENTRY *) &
-                                                       uhca[idx]->entry);
-                               dapl_os_unlock(&g_hca_lock);
-                               uhca[idx]->destroy = 2;
-                       } else {
-                               dapli_cq_event_cb(uhca[idx]);
-                               dapli_async_event_cb(uhca[idx]);
-                       }
-               }
-       }
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread(%d) EXIT\n",
-                    dapl_os_getpid());
-       g_ib_thread_state = IB_THREAD_EXIT;
-       dapl_os_unlock(&g_hca_lock);
-}
-#else                          // _WIN64 || WIN32
-/* work thread for uAT, uCM, CQ, and async events */
-void dapli_thread(void *arg)
-{
-       struct pollfd ufds[__FD_SETSIZE];
-       struct _ib_hca_transport *uhca[__FD_SETSIZE] = { NULL };
-       struct _ib_hca_transport *hca;
-       int ret, idx, fds;
-       char rbuf[2];
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " ib_thread(%d,0x%x): ENTER: pipe %d ucma %d\n",
-                    dapl_os_getpid(), g_ib_thread, g_ib_pipe[0],
-                    g_cm_events->fd);
-
-       /* Poll across pipe, CM, AT never changes */
-       dapl_os_lock(&g_hca_lock);
-       g_ib_thread_state = IB_THREAD_RUN;
-
-       ufds[0].fd = g_ib_pipe[0];      /* pipe */
-       ufds[0].events = POLLIN;
-       ufds[1].fd = g_cm_events->fd;   /* uCMA */
-       ufds[1].events = POLLIN;
-
-       while (g_ib_thread_state == IB_THREAD_RUN) {
-
-               /* build ufds after pipe and uCMA events */
-               ufds[0].revents = 0;
-               ufds[1].revents = 0;
-               idx = 1;
-
-               /*  Walk HCA list and setup async and CQ events */
-               if (!dapl_llist_is_empty(&g_hca_list))
-                       hca = dapl_llist_peek_head(&g_hca_list);
-               else
-                       hca = NULL;
-
-               while (hca) {
-
-                       /* uASYNC events */
-                       ufds[++idx].fd = hca->cm_id->verbs->async_fd;
-                       ufds[idx].events = POLLIN;
-                       ufds[idx].revents = 0;
-                       uhca[idx] = hca;
-
-                       /* uCQ, non-direct events */
-                       ufds[++idx].fd = hca->ib_cq->fd;
-                       ufds[idx].events = POLLIN;
-                       ufds[idx].revents = 0;
-                       uhca[idx] = hca;
-
-                       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                                    " ib_thread(%d) poll_fd: hca[%d]=%p, async=%d"
-                                    " pipe=%d cm=%d cq=d\n",
-                                    dapl_os_getpid(), hca, ufds[idx - 1].fd,
-                                    ufds[0].fd, ufds[1].fd, ufds[idx].fd);
-
-                       hca = dapl_llist_next_entry(&g_hca_list,
-                                                   (DAPL_LLIST_ENTRY *) & hca->
-                                                   entry);
-               }
-
-               /* unlock, and setup poll */
-               fds = idx + 1;
-               dapl_os_unlock(&g_hca_lock);
-               ret = poll(ufds, fds, -1);
-               if (ret <= 0) {
-                       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                                    " ib_thread(%d): ERR %s poll\n",
-                                    dapl_os_getpid(), strerror(errno));
-                       dapl_os_lock(&g_hca_lock);
-                       continue;
-               }
-
-               dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                            " ib_thread(%d) poll_event: "
-                            " async=0x%x pipe=0x%x cm=0x%x cq=0x%x\n",
-                            dapl_os_getpid(), ufds[idx - 1].revents,
-                            ufds[0].revents, ufds[1].revents,
-                            ufds[idx].revents);
-
-               /* uCMA events */
-               if (ufds[1].revents == POLLIN)
-                       dapli_cma_event_cb();
-
-               /* check and process CQ and ASYNC events, per device */
-               for (idx = 2; idx < fds; idx++) {
-                       if (ufds[idx].revents == POLLIN) {
-                               dapli_cq_event_cb(uhca[idx]);
-                               dapli_async_event_cb(uhca[idx]);
-                       }
-               }
-
-               /* check and process user events, PIPE */
-               if (ufds[0].revents == POLLIN) {
-                       if (read(g_ib_pipe[0], rbuf, 2) == -1)
-                               dapl_log(DAPL_DBG_TYPE_UTIL,
-                                        " cr_thread: pipe rd err= %s\n",
-                                        strerror(errno));
-
-                       /* cleanup any device on list marked for destroy */
-                       for (idx = 3; idx < fds; idx++) {
-                               if (uhca[idx] && uhca[idx]->destroy == 1) {
-                                       dapl_os_lock(&g_hca_lock);
-                                       dapl_llist_remove_entry(&g_hca_list,
-                                                               (DAPL_LLIST_ENTRY
-                                                                *)
-                                                               & uhca[idx]->
-                                                               entry);
-                                       dapl_os_unlock(&g_hca_lock);
-                                       uhca[idx]->destroy = 2;
-                               }
-                       }
-               }
-               dapl_os_lock(&g_hca_lock);
-       }
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread(%d) EXIT\n",
-                    dapl_os_getpid());
-       g_ib_thread_state = IB_THREAD_EXIT;
-       dapl_os_unlock(&g_hca_lock);
-}
-#endif
-
-/*
- * dapls_set_provider_specific_attr
- *
- * Input:
- *     attr_ptr        Pointer provider specific attributes
- *
- * Output:
- *     none
- *
- * Returns:
- *     void
- */
-DAT_NAMED_ATTR ib_attrs[] = {
-#ifdef DAT_EXTENSIONS
-       {
-        "DAT_EXTENSION_INTERFACE", "TRUE"}
-       ,
-       {
-        DAT_IB_ATTR_FETCH_AND_ADD, "TRUE"}
-       ,
-       {
-        DAT_IB_ATTR_CMP_AND_SWAP, "TRUE"}
-       ,
-       {
-        DAT_IB_ATTR_IMMED_DATA, "TRUE"}
-       ,
-#ifdef DAPL_COUNTERS
-       {
-        DAT_ATTR_COUNTERS, "TRUE"}
-       ,
-#endif                         /* DAPL_COUNTERS */
-#endif
-};
-
-#define SPEC_ATTR_SIZE( x )    (sizeof( x ) / sizeof( DAT_NAMED_ATTR))
-
-void dapls_query_provider_specific_attr(IN DAPL_IA * ia_ptr,
-                                       IN DAT_PROVIDER_ATTR * attr_ptr)
-{
-       attr_ptr->num_provider_specific_attr = SPEC_ATTR_SIZE(ib_attrs);
-       attr_ptr->provider_specific_attr = ib_attrs;
-}
index 46c9b356c9f14dde76ea979c60a5ed7534169d75..f466c0680813be0c83dc388c91b6b1923da487bb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005-2008 Intel Corporation.  All rights reserved.
+ * Copyright (c) 2005-2009 Intel Corporation.  All rights reserved.
  *
  * This Software is licensed under one of the following licenses:
  *
  * notice, one of the license notices in the documentation
  * and/or other materials provided with the distribution.
  */
-
-/**********************************************************************
- *
- * MODULE: dapl_ib_util.h
- *
- * PURPOSE: The OFED provider - definitions, prototypes,
- *
- * $Id: $
- *
- **********************************************************************/
-
+/* 
+ * Definitions specific to OpenIB CMA provider.
+ *   Connection manager - rdma_cma, provided in separate library.
+ */
 #ifndef _DAPL_IB_UTIL_H_
 #define _DAPL_IB_UTIL_H_
+#define _OPENIB_CMA_ 
 
-#include "openib_osd.h"
 #include <infiniband/verbs.h>
 #include <rdma/rdma_cma.h>
-
-/* Typedefs to map common DAPL provider types to IB verbs */
-typedef        struct dapl_cm_id       *ib_qp_handle_t;
-typedef        struct ibv_cq           *ib_cq_handle_t;
-typedef        struct ibv_pd           *ib_pd_handle_t;
-typedef        struct ibv_mr           *ib_mr_handle_t;
-typedef        struct ibv_mw           *ib_mw_handle_t;
-typedef        struct ibv_wc           ib_work_completion_t;
-
-/* HCA context type maps to IB verbs  */
-typedef        struct ibv_context      *ib_hca_handle_t;
-typedef ib_hca_handle_t                dapl_ibal_ca_t;
+#include "openib_osd.h"
+#include "dapl_ib_common.h"
 
 #define IB_RC_RETRY_COUNT      7
 #define IB_RNR_RETRY_COUNT     7
@@ -64,56 +47,6 @@ typedef ib_hca_handle_t              dapl_ibal_ca_t;
 #define IB_ROUTE_RETRY_COUNT   15      /* 60 sec total */
 #define IB_MAX_AT_RETRY                3
 
-typedef enum {
-       IB_CME_CONNECTED,
-       IB_CME_DISCONNECTED,
-       IB_CME_DISCONNECTED_ON_LINK_DOWN,
-       IB_CME_CONNECTION_REQUEST_PENDING,
-       IB_CME_CONNECTION_REQUEST_PENDING_PRIVATE_DATA,
-       IB_CME_CONNECTION_REQUEST_ACKED,
-       IB_CME_DESTINATION_REJECT,
-       IB_CME_DESTINATION_REJECT_PRIVATE_DATA,
-       IB_CME_DESTINATION_UNREACHABLE,
-       IB_CME_TOO_MANY_CONNECTION_REQUESTS,
-       IB_CME_LOCAL_FAILURE,
-       IB_CME_BROKEN,
-       IB_CME_TIMEOUT
-} ib_cm_events_t;
-
-/* CQ notifications */
-typedef enum
-{
-       IB_NOTIFY_ON_NEXT_COMP,
-       IB_NOTIFY_ON_SOLIC_COMP
-
-} ib_notification_type_t;
-
-/* other mappings */
-typedef int                    ib_bool_t;
-typedef union ibv_gid          GID;
-typedef char                   *IB_HCA_NAME;
-typedef uint16_t               ib_hca_port_t;
-typedef uint32_t               ib_comp_handle_t;
-
-#ifdef CQ_WAIT_OBJECT
-
-/* CQ event channel, plus pipe to enable consumer wakeup */
-typedef struct _ib_wait_obj_handle
-{ 
-       struct ibv_comp_channel *events;
-       int                     pipe[2];
-
-} *ib_wait_obj_handle_t;
-
-#endif
-
-/* Definitions */
-#define IB_INVALID_HANDLE      NULL
-
-/* inline send rdma threshold */
-#define        INLINE_SEND_IWARP_DEFAULT       64
-#define        INLINE_SEND_IB_DEFAULT          200
-
 /* CMA private data areas */
 #define CMA_PDATA_HDR          36
 #define        IB_MAX_REQ_PDATA_SIZE   (92-CMA_PDATA_HDR)
@@ -123,38 +56,6 @@ typedef struct _ib_wait_obj_handle
 #define        IB_MAX_DREP_PDATA_SIZE  (224-CMA_PDATA_HDR)
 #define        IWARP_MAX_PDATA_SIZE    (512-CMA_PDATA_HDR)
 
-/* DTO OPs, ordered for DAPL ENUM definitions */
-#define OP_RDMA_WRITE           IBV_WR_RDMA_WRITE
-#define OP_RDMA_WRITE_IMM       IBV_WR_RDMA_WRITE_WITH_IMM
-#define OP_SEND                 IBV_WR_SEND
-#define OP_SEND_IMM             IBV_WR_SEND_WITH_IMM
-#define OP_RDMA_READ            IBV_WR_RDMA_READ
-#define OP_COMP_AND_SWAP        IBV_WR_ATOMIC_CMP_AND_SWP
-#define OP_FETCH_AND_ADD        IBV_WR_ATOMIC_FETCH_AND_ADD
-#define OP_RECEIVE              7   /* internal op */
-#define OP_RECEIVE_IMM         8   /* internel op */
-#define OP_BIND_MW              9   /* internal op */
-#define OP_INVALID             0xff
-
-/* Definitions to map QP state */
-#define IB_QP_STATE_RESET      IBV_QPS_RESET
-#define IB_QP_STATE_INIT       IBV_QPS_INIT
-#define IB_QP_STATE_RTR                IBV_QPS_RTR
-#define IB_QP_STATE_RTS                IBV_QPS_RTS
-#define IB_QP_STATE_SQD                IBV_QPS_SQD
-#define IB_QP_STATE_SQE                IBV_QPS_SQE
-#define IB_QP_STATE_ERROR      IBV_QPS_ERR
-
-typedef enum
-{
-       IB_THREAD_INIT,
-       IB_THREAD_CREATE,
-       IB_THREAD_RUN,
-       IB_THREAD_CANCEL,
-       IB_THREAD_EXIT
-
-} ib_thread_state_t;
-
 struct dapl_cm_id {
        DAPL_OS_LOCK                    lock;
        int                             destroy;
@@ -171,67 +72,13 @@ struct dapl_cm_id {
        DAT_SOCK_ADDR6                  r_addr;
        int                             p_len;
        unsigned char                   p_data[256]; /* dapl max private data size */
+       ib_qp_cm_t                      dst; /* dapls_modify_qp_state */
+       struct ibv_ah                   *ah; /* dapls_modify_qp_state */
 };
 
 typedef struct dapl_cm_id      *dp_ib_cm_handle_t;
 typedef struct dapl_cm_id      *ib_cm_srvc_handle_t;
 
-/* Operation and state mappings */
-typedef int    ib_send_op_type_t;
-typedef        struct  ibv_sge         ib_data_segment_t;
-typedef enum   ibv_qp_state    ib_qp_state_t;
-typedef        enum    ibv_event_type  ib_async_event_type;
-typedef struct ibv_async_event ib_error_record_t;
-
-/* Definitions for ibverbs/mthca return codes, should be defined in verbs.h */
-/* some are errno and some are -n values */
-
-/**
- * ibv_get_device_name - Return kernel device name
- * ibv_get_device_guid - Return device's node GUID
- * ibv_open_device - Return ibv_context or NULL
- * ibv_close_device - Return 0, (errno?)
- * ibv_get_async_event - Return 0, -1 
- * ibv_alloc_pd - Return ibv_pd, NULL
- * ibv_dealloc_pd - Return 0, errno 
- * ibv_reg_mr - Return ibv_mr, NULL
- * ibv_dereg_mr - Return 0, errno
- * ibv_create_cq - Return ibv_cq, NULL
- * ibv_destroy_cq - Return 0, errno
- * ibv_get_cq_event - Return 0 & ibv_cq/context, int
- * ibv_poll_cq - Return n & ibv_wc, 0 ok, -1 empty, -2 error 
- * ibv_req_notify_cq - Return 0 (void?)
- * ibv_create_qp - Return ibv_qp, NULL
- * ibv_modify_qp - Return 0, errno
- * ibv_destroy_qp - Return 0, errno
- * ibv_post_send - Return 0, -1 & bad_wr
- * ibv_post_recv - Return 0, -1 & bad_wr 
- */
-
-/* async handlers for DTO, CQ, QP, and unafiliated */
-typedef void (*ib_async_dto_handler_t)(
-    IN    ib_hca_handle_t    ib_hca_handle,
-    IN    ib_error_record_t  *err_code,
-    IN    void               *context);
-
-typedef void (*ib_async_cq_handler_t)(
-    IN    ib_hca_handle_t    ib_hca_handle,
-    IN    ib_cq_handle_t     ib_cq_handle,
-    IN    ib_error_record_t  *err_code,
-    IN    void               *context);
-
-typedef void (*ib_async_qp_handler_t)(
-    IN    ib_hca_handle_t    ib_hca_handle,
-    IN    ib_qp_handle_t     ib_qp_handle,
-    IN    ib_error_record_t  *err_code,
-    IN    void               *context);
-
-typedef void (*ib_async_handler_t)(
-    IN    ib_hca_handle_t    ib_hca_handle,
-    IN    ib_error_record_t  *err_code,
-    IN    void               *context);
-
-
 /* ib_hca_transport_t, specific to this implementation */
 typedef struct _ib_hca_transport
 { 
@@ -250,74 +97,38 @@ typedef struct _ib_hca_transport
        uint8_t                 max_cm_timeout;
        uint8_t                 max_cm_retries;
        /* device attributes */
-       int                     max_rdma_rd_in;
-       int                     max_rdma_rd_out;
+       int                     rd_atom_in;
+       int                     rd_atom_out;
+       struct  ibv_device      *ib_dev;
+       /* dapls_modify_qp_state */
+       uint16_t                lid;
+       uint8_t                 ack_timer;
+       uint8_t                 ack_retry;
+       uint8_t                 rnr_timer;
+       uint8_t                 rnr_retry;
+       uint8_t                 global;
+       uint8_t                 hop_limit;
+       uint8_t                 tclass;
+       uint8_t                 mtu;
+       DAT_NAMED_ATTR          named_attr;
 
 } ib_hca_transport_t;
 
-/* provider specfic fields for shared memory support */
-typedef uint32_t ib_shm_transport_t;
-
 /* prototypes */
-int32_t        dapls_ib_init (void);
-int32_t        dapls_ib_release (void);
 void dapli_thread(void *arg);
 DAT_RETURN  dapli_ib_thread_init(void);
 void dapli_ib_thread_destroy(void);
 void dapli_cma_event_cb(void);
-void dapli_cq_event_cb(struct _ib_hca_transport *hca);
 void dapli_async_event_cb(struct _ib_hca_transport *hca);
-void dapli_destroy_conn(struct dapl_cm_id *conn);
-
-DAT_RETURN
-dapls_modify_qp_state ( IN ib_qp_handle_t      qp_handle,
-                       IN ib_qp_state_t        qp_state,
-                       IN struct dapl_cm_id    *conn );
-
-/* inline functions */
-STATIC _INLINE_ IB_HCA_NAME dapl_ib_convert_name (IN char *name)
-{
-       /* use ascii; name of local device */
-       return dapl_os_strdup(name);
-}
+dp_ib_cm_handle_t dapls_ib_cm_create(DAPL_EP *ep);
+void dapls_ib_cm_free(dp_ib_cm_handle_t cm, DAPL_EP *ep);
+DAT_RETURN dapls_modify_qp_state(IN ib_qp_handle_t qp_handle,
+                                IN ib_qp_state_t qp_state,
+                                IN dp_ib_cm_handle_t cm);
 
-STATIC _INLINE_ void dapl_ib_release_name (IN IB_HCA_NAME name)
+STATIC _INLINE_ void dapls_print_cm_list(IN DAPL_IA * ia_ptr)
 {
        return;
 }
 
-/*
- *  Convert errno to DAT_RETURN values
- */
-STATIC _INLINE_ DAT_RETURN 
-dapl_convert_errno( IN int err, IN const char *str )
-{
-    if (!err)  return DAT_SUCCESS;
-       
-#if DAPL_DBG
-    if ((err != EAGAIN) && (err != ETIMEDOUT))
-       dapl_dbg_log (DAPL_DBG_TYPE_ERR," %s %s\n", str, strerror(err));
-#endif 
-
-    switch( err )
-    {
-       case EOVERFLOW  : return DAT_LENGTH_ERROR;
-       case EACCES     : return DAT_PRIVILEGES_VIOLATION;
-       case EPERM      : return DAT_PROTECTION_VIOLATION;                
-       case EINVAL     : return DAT_INVALID_HANDLE;
-       case EISCONN    : return DAT_INVALID_STATE | DAT_INVALID_STATE_EP_CONNECTED;
-       case ECONNREFUSED : return DAT_INVALID_STATE | DAT_INVALID_STATE_EP_NOTREADY;
-       case ETIMEDOUT  : return DAT_TIMEOUT_EXPIRED;
-       case ENETUNREACH: return DAT_INVALID_ADDRESS | DAT_INVALID_ADDRESS_UNREACHABLE;
-       case EADDRINUSE : return DAT_CONN_QUAL_IN_USE;
-       case EALREADY   : return DAT_INVALID_STATE | DAT_INVALID_STATE_EP_ACTCONNPENDING;
-       case ENOMEM     : return DAT_INSUFFICIENT_RESOURCES;
-        case EAGAIN    : return DAT_QUEUE_EMPTY;
-       case EINTR      : return DAT_INTERRUPTED_CALL;
-       case EAFNOSUPPORT : return DAT_INVALID_ADDRESS | DAT_INVALID_ADDRESS_MALFORMED;
-       case EFAULT     : 
-       default         : return DAT_INTERNAL_ERROR;
-    }
- }
-
 #endif /*  _DAPL_IB_UTIL_H_ */
diff --git a/branches/winverbs/ulp/dapl2/dapl/openib_cma/device.c b/branches/winverbs/ulp/dapl2/dapl/openib_cma/device.c
new file mode 100644 (file)
index 0000000..3c9d135
--- /dev/null
@@ -0,0 +1,847 @@
+/*\r
+ * Copyright (c) 2005-2008 Intel Corporation.  All rights reserved.\r
+ *\r
+ * This Software is licensed under one of the following licenses:\r
+ *\r
+ * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
+ *    available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/cpl.php.\r
+ *\r
+ * 2) under the terms of the "The BSD License" a copy of which is\r
+ *    available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/bsd-license.php.\r
+ *\r
+ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
+ *    copy of which is available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/gpl-license.php.\r
+ *\r
+ * Licensee has the right to choose one of the above licenses.\r
+ *\r
+ * Redistributions of source code must retain the above copyright\r
+ * notice and one of the license notices.\r
+ *\r
+ * Redistributions in binary form must reproduce both the above copyright\r
+ * notice, one of the license notices in the documentation\r
+ * and/or other materials provided with the distribution.\r
+ */\r
+\r
+/**********************************************************************\r
+ * \r
+ * MODULE: dapl_ib_util.c\r
+ *\r
+ * PURPOSE: OFED provider - init, open, close, utilities, work thread\r
+ *\r
+ * $Id:$\r
+ *\r
+ **********************************************************************/\r
+\r
+#ifdef RCSID\r
+static const char rcsid[] = "$Id:  $";\r
+#endif\r
+\r
+#include "openib_osd.h"\r
+#include "dapl.h"\r
+#include "dapl_adapter_util.h"\r
+#include "dapl_ib_util.h"\r
+#include "dapl_osd.h"\r
+\r
+#include <stdlib.h>\r
+\r
+struct rdma_event_channel *g_cm_events = NULL;\r
+ib_thread_state_t g_ib_thread_state = 0;\r
+DAPL_OS_THREAD g_ib_thread;\r
+DAPL_OS_LOCK g_hca_lock;\r
+struct dapl_llist_entry *g_hca_list;\r
+\r
+#if defined(_WIN64) || defined(_WIN32)\r
+#include "..\..\..\..\..\etc\user\comp_channel.cpp"\r
+#include <rdma\winverbs.h>\r
+\r
+struct ibvw_windata windata;\r
+\r
+static int getipaddr_netdev(char *name, char *addr, int addr_len)\r
+{\r
+       IWVProvider *prov;\r
+       WV_DEVICE_ADDRESS devaddr;\r
+       struct addrinfo *res, *ai;\r
+       HRESULT hr;\r
+       int index;\r
+\r
+       if (strncmp(name, "rdma_dev", 8)) {\r
+               return EINVAL;\r
+       }\r
+\r
+       index = atoi(name + 8);\r
+\r
+       hr = WvGetObject(&IID_IWVProvider, (LPVOID *) &prov);\r
+       if (FAILED(hr)) {\r
+               return hr;\r
+       }\r
+\r
+       hr = getaddrinfo("..localmachine", NULL, NULL, &res);\r
+       if (hr) {\r
+               goto release;\r
+       }\r
+\r
+       for (ai = res; ai; ai = ai->ai_next) {\r
+               hr = prov->lpVtbl->TranslateAddress(prov, ai->ai_addr, &devaddr);\r
+               if (SUCCEEDED(hr) && (ai->ai_addrlen <= addr_len) && (index-- == 0)) {\r
+                       memcpy(addr, ai->ai_addr, ai->ai_addrlen);\r
+                       goto free;\r
+               }\r
+       }\r
+       hr = ENODEV;\r
+\r
+free:\r
+       freeaddrinfo(res);\r
+release:\r
+       prov->lpVtbl->Release(prov);\r
+       return hr;\r
+}\r
+\r
+static int dapls_os_init(void)\r
+{\r
+       return ibvw_get_windata(&windata, IBVW_WINDATA_VERSION);\r
+}\r
+\r
+static void dapls_os_release(void)\r
+{\r
+       if (windata.comp_mgr)\r
+               ibvw_release_windata(&windata, IBVW_WINDATA_VERSION);\r
+       windata.comp_mgr = NULL;\r
+}\r
+\r
+static int dapls_config_cm_channel(struct rdma_event_channel *channel)\r
+{\r
+       channel->channel.Milliseconds = 0;\r
+       return 0;\r
+}\r
+\r
+static int dapls_config_verbs(struct ibv_context *verbs)\r
+{\r
+       verbs->channel.Milliseconds = 0;\r
+       return 0;\r
+}\r
+\r
+static int dapls_thread_signal(void)\r
+{\r
+       CompManagerCancel(windata.comp_mgr);\r
+       return 0;\r
+}\r
+#else                          // _WIN64 || WIN32\r
+int g_ib_pipe[2];\r
+\r
+static int dapls_os_init(void)\r
+{\r
+       /* create pipe for waking up work thread */\r
+       return pipe(g_ib_pipe);\r
+}\r
+\r
+static void dapls_os_release(void)\r
+{\r
+       /* close pipe? */\r
+}\r
+\r
+/* Get IP address using network device name */\r
+static int getipaddr_netdev(char *name, char *addr, int addr_len)\r
+{\r
+       struct ifreq ifr;\r
+       int skfd, ret, len;\r
+\r
+       /* Fill in the structure */\r
+       snprintf(ifr.ifr_name, IFNAMSIZ, "%s", name);\r
+       ifr.ifr_hwaddr.sa_family = ARPHRD_INFINIBAND;\r
+\r
+       /* Create a socket fd */\r
+       skfd = socket(PF_INET, SOCK_STREAM, 0);\r
+       ret = ioctl(skfd, SIOCGIFADDR, &ifr);\r
+       if (ret)\r
+               goto bail;\r
+\r
+       switch (ifr.ifr_addr.sa_family) {\r
+#ifdef AF_INET6\r
+       case AF_INET6:\r
+               len = sizeof(struct sockaddr_in6);\r
+               break;\r
+#endif\r
+       case AF_INET:\r
+       default:\r
+               len = sizeof(struct sockaddr);\r
+               break;\r
+       }\r
+\r
+       if (len <= addr_len)\r
+               memcpy(addr, &ifr.ifr_addr, len);\r
+       else\r
+               ret = EINVAL;\r
+\r
+      bail:\r
+       close(skfd);\r
+       return ret;\r
+}\r
+\r
+static int dapls_config_fd(int fd)\r
+{\r
+       int opts;\r
+\r
+       opts = fcntl(fd, F_GETFL);\r
+       if (opts < 0 || fcntl(fd, F_SETFL, opts | O_NONBLOCK) < 0) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " dapls_config_fd: fcntl on fd %d ERR %d %s\n",\r
+                        fd, opts, strerror(errno));\r
+               return errno;\r
+       }\r
+\r
+       return 0;\r
+}\r
+\r
+static int dapls_config_cm_channel(struct rdma_event_channel *channel)\r
+{\r
+       return dapls_config_fd(channel->fd);\r
+}\r
+\r
+static int dapls_config_verbs(struct ibv_context *verbs)\r
+{\r
+       return dapls_config_fd(verbs->async_fd);\r
+}\r
+\r
+static int dapls_thread_signal(void)\r
+{\r
+       return write(g_ib_pipe[1], "w", sizeof "w");\r
+}\r
+#endif\r
+\r
+/* Get IP address using network name, address, or device name */\r
+static int getipaddr(char *name, char *addr, int len)\r
+{\r
+       struct addrinfo *res;\r
+\r
+       /* assume netdev for first attempt, then network and address type */\r
+       if (getipaddr_netdev(name, addr, len)) {\r
+               if (getaddrinfo(name, NULL, NULL, &res)) {\r
+                       dapl_log(DAPL_DBG_TYPE_ERR,\r
+                                " open_hca: getaddr_netdev ERROR:"\r
+                                " %s. Is %s configured?\n",\r
+                                strerror(errno), name);\r
+                       return 1;\r
+               } else {\r
+                       if (len >= res->ai_addrlen)\r
+                               memcpy(addr, res->ai_addr, res->ai_addrlen);\r
+                       else {\r
+                               freeaddrinfo(res);\r
+                               return 1;\r
+                       }\r
+                       freeaddrinfo(res);\r
+               }\r
+       }\r
+\r
+       dapl_dbg_log(\r
+               DAPL_DBG_TYPE_UTIL,\r
+               " getipaddr: family %d port %d addr %d.%d.%d.%d\n",\r
+               ((struct sockaddr_in *)addr)->sin_family,\r
+               ((struct sockaddr_in *)addr)->sin_port,\r
+               ((struct sockaddr_in *)addr)->sin_addr.s_addr >> 0 & 0xff,\r
+               ((struct sockaddr_in *)addr)->sin_addr.s_addr >> 8 & 0xff,\r
+               ((struct sockaddr_in *)addr)->sin_addr.s_addr >> 16 & 0xff,\r
+               ((struct sockaddr_in *)addr)->sin_addr.\r
+                s_addr >> 24 & 0xff);\r
+\r
+       return 0;\r
+}\r
+\r
+/*\r
+ * dapls_ib_init, dapls_ib_release\r
+ *\r
+ * Initialize Verb related items for device open\r
+ *\r
+ * Input:\r
+ *     none\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     0 success, -1 error\r
+ *\r
+ */\r
+int32_t dapls_ib_init(void)\r
+{\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " dapl_ib_init: \n");\r
+\r
+       /* initialize hca_list lock */\r
+       dapl_os_lock_init(&g_hca_lock);\r
+\r
+       /* initialize hca list for CQ events */\r
+       dapl_llist_init_head(&g_hca_list);\r
+\r
+       if (dapls_os_init())\r
+               return 1;\r
+\r
+       return 0;\r
+}\r
+\r
+int32_t dapls_ib_release(void)\r
+{\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " dapl_ib_release: \n");\r
+       dapli_ib_thread_destroy();\r
+       if (g_cm_events != NULL)\r
+               rdma_destroy_event_channel(g_cm_events);\r
+       dapls_os_release();\r
+       return 0;\r
+}\r
+\r
+/*\r
+ * dapls_ib_open_hca\r
+ *\r
+ * Open HCA\r
+ *\r
+ * Input:\r
+ *      *hca_name         pointer to provider device name\r
+ *      *ib_hca_handle_p  pointer to provide HCA handle\r
+ *\r
+ * Output:\r
+ *      none\r
+ *\r
+ * Return:\r
+ *      DAT_SUCCESS\r
+ *      dapl_convert_errno\r
+ *\r
+ */\r
+DAT_RETURN dapls_ib_open_hca(IN IB_HCA_NAME hca_name, IN DAPL_HCA * hca_ptr)\r
+{\r
+       struct rdma_cm_id *cm_id = NULL;\r
+       union ibv_gid *gid;\r
+       int ret;\r
+       DAT_RETURN dat_status;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                    " open_hca: %s - %p\n", hca_name, hca_ptr);\r
+\r
+       /* Setup the global cm event channel */\r
+       dapl_os_lock(&g_hca_lock);\r
+       if (g_cm_events == NULL) {\r
+               g_cm_events = rdma_create_event_channel();\r
+               if (g_cm_events == NULL) {\r
+                       dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
+                                    " open_hca: ERR - RDMA channel %s\n",\r
+                                    strerror(errno));\r
+                       dapl_os_unlock(&g_hca_lock);\r
+                       return DAT_INTERNAL_ERROR;\r
+               }\r
+       }\r
+       dapl_os_unlock(&g_hca_lock);\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                    " open_hca: RDMA channel created (%p)\n", g_cm_events);\r
+\r
+       dat_status = dapli_ib_thread_init();\r
+       if (dat_status != DAT_SUCCESS)\r
+               return dat_status;\r
+\r
+       /* HCA name will be hostname or IP address */\r
+       if (getipaddr((char *)hca_name,\r
+                     (char *)&hca_ptr->hca_address, \r
+                     sizeof(DAT_SOCK_ADDR6)))\r
+               return DAT_INVALID_ADDRESS;\r
+\r
+       /* cm_id will bind local device/GID based on IP address */\r
+       if (rdma_create_id(g_cm_events, &cm_id, \r
+                          (void *)hca_ptr, RDMA_PS_TCP)) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " open_hca: rdma_create ERR %s\n", strerror(errno));\r
+               return DAT_INTERNAL_ERROR;\r
+       }\r
+       ret = rdma_bind_addr(cm_id, (struct sockaddr *)&hca_ptr->hca_address);\r
+       if ((ret) || (cm_id->verbs == NULL)) {\r
+               rdma_destroy_id(cm_id);\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " open_hca: rdma_bind ERR %s."\r
+                        " Is %s configured?\n", strerror(errno), hca_name);\r
+               return DAT_INVALID_ADDRESS;\r
+       }\r
+\r
+       /* keep reference to IB device and cm_id */\r
+       hca_ptr->ib_trans.cm_id = cm_id;\r
+       hca_ptr->ib_hca_handle = cm_id->verbs;\r
+       dapls_config_verbs(cm_id->verbs);\r
+       hca_ptr->port_num = cm_id->port_num;\r
+       hca_ptr->ib_trans.ib_dev = cm_id->verbs->device;\r
+       gid = &cm_id->route.addr.addr.ibaddr.sgid;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                    " open_hca: ctx=%p port=%d GID subnet %016llx"\r
+                    " id %016llx\n", cm_id->verbs, cm_id->port_num,\r
+                    (unsigned long long)ntohll(gid->global.subnet_prefix),\r
+                    (unsigned long long)ntohll(gid->global.interface_id));\r
+\r
+       /* set inline max with env or default, get local lid and gid 0 */\r
+       if (hca_ptr->ib_hca_handle->device->transport_type\r
+           == IBV_TRANSPORT_IWARP)\r
+               hca_ptr->ib_trans.max_inline_send =\r
+                   dapl_os_get_env_val("DAPL_MAX_INLINE",\r
+                                       INLINE_SEND_IWARP_DEFAULT);\r
+       else\r
+               hca_ptr->ib_trans.max_inline_send =\r
+                   dapl_os_get_env_val("DAPL_MAX_INLINE",\r
+                                       INLINE_SEND_IB_DEFAULT);\r
+\r
+       /* set CM timer defaults */\r
+       hca_ptr->ib_trans.max_cm_timeout =\r
+           dapl_os_get_env_val("DAPL_MAX_CM_RESPONSE_TIME",\r
+                               IB_CM_RESPONSE_TIMEOUT);\r
+       hca_ptr->ib_trans.max_cm_retries =\r
+           dapl_os_get_env_val("DAPL_MAX_CM_RETRIES", IB_CM_RETRIES);\r
+       \r
+       /* set default IB MTU */\r
+       hca_ptr->ib_trans.mtu = dapl_ib_mtu(2048);\r
+\r
+       /* \r
+        * Put new hca_transport on list for async and CQ event processing \r
+        * Wakeup work thread to add to polling list\r
+        */\r
+       dapl_llist_init_entry((DAPL_LLIST_ENTRY *) & hca_ptr->ib_trans.entry);\r
+       dapl_os_lock(&g_hca_lock);\r
+       dapl_llist_add_tail(&g_hca_list,\r
+                           (DAPL_LLIST_ENTRY *) & hca_ptr->ib_trans.entry,\r
+                           &hca_ptr->ib_trans.entry);\r
+       if (dapls_thread_signal() == -1)\r
+               dapl_log(DAPL_DBG_TYPE_UTIL,\r
+                        " open_hca: thread wakeup error = %s\n",\r
+                        strerror(errno));\r
+       dapl_os_unlock(&g_hca_lock);\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                    " open_hca: %s, %s %d.%d.%d.%d INLINE_MAX=%d\n", hca_name,\r
+                    ((struct sockaddr_in *)\r
+                    &hca_ptr->hca_address)->sin_family == AF_INET ?\r
+                    "AF_INET" : "AF_INET6", \r
+                    ((struct sockaddr_in *)\r
+                    &hca_ptr->hca_address)->sin_addr.s_addr >> 0 & 0xff, \r
+                    ((struct sockaddr_in *)\r
+                    &hca_ptr->hca_address)->sin_addr.s_addr >> 8 & 0xff, \r
+                    ((struct sockaddr_in *)\r
+                    &hca_ptr->hca_address)->sin_addr.s_addr >> 16 & 0xff, \r
+                    ((struct sockaddr_in *)\r
+                    &hca_ptr->hca_address)->sin_addr.s_addr >> 24 & 0xff, \r
+                    hca_ptr->ib_trans.max_inline_send);\r
+\r
+       hca_ptr->ib_trans.d_hca = hca_ptr;\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+/*\r
+ * dapls_ib_close_hca\r
+ *\r
+ * Open HCA\r
+ *\r
+ * Input:\r
+ *      DAPL_HCA   provide CA handle\r
+ *\r
+ * Output:\r
+ *      none\r
+ *\r
+ * Return:\r
+ *      DAT_SUCCESS\r
+ *     dapl_convert_errno \r
+ *\r
+ */\r
+DAT_RETURN dapls_ib_close_hca(IN DAPL_HCA * hca_ptr)\r
+{\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " close_hca: %p->%p\n",\r
+                    hca_ptr, hca_ptr->ib_hca_handle);\r
+\r
+       if (hca_ptr->ib_hca_handle != IB_INVALID_HANDLE) {\r
+               if (rdma_destroy_id(hca_ptr->ib_trans.cm_id))\r
+                       return (dapl_convert_errno(errno, "ib_close_device"));\r
+               hca_ptr->ib_hca_handle = IB_INVALID_HANDLE;\r
+       }\r
+\r
+       dapl_os_lock(&g_hca_lock);\r
+       if (g_ib_thread_state != IB_THREAD_RUN) {\r
+               dapl_os_unlock(&g_hca_lock);\r
+               goto bail;\r
+       }\r
+       dapl_os_unlock(&g_hca_lock);\r
+\r
+       /* \r
+        * Remove hca from async event processing list\r
+        * Wakeup work thread to remove from polling list\r
+        */\r
+       hca_ptr->ib_trans.destroy = 1;\r
+       if (dapls_thread_signal() == -1)\r
+               dapl_log(DAPL_DBG_TYPE_UTIL,\r
+                        " destroy: thread wakeup error = %s\n",\r
+                        strerror(errno));\r
+\r
+       /* wait for thread to remove HCA references */\r
+       while (hca_ptr->ib_trans.destroy != 2) {\r
+               if (dapls_thread_signal() == -1)\r
+                       dapl_log(DAPL_DBG_TYPE_UTIL,\r
+                                " destroy: thread wakeup error = %s\n",\r
+                                strerror(errno));\r
+               dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                            " ib_thread_destroy: wait on hca %p destroy\n");\r
+               dapl_os_sleep_usec(1000);\r
+       }\r
+bail:\r
+       return (DAT_SUCCESS);\r
+}\r
+\r
+\r
+DAT_RETURN dapli_ib_thread_init(void)\r
+{\r
+       DAT_RETURN dat_status;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                    " ib_thread_init(%d)\n", dapl_os_getpid());\r
+\r
+       dapl_os_lock(&g_hca_lock);\r
+       if (g_ib_thread_state != IB_THREAD_INIT) {\r
+               dapl_os_unlock(&g_hca_lock);\r
+               return DAT_SUCCESS;\r
+       }\r
+\r
+       /* uCMA events non-blocking */\r
+       if (dapls_config_cm_channel(g_cm_events)) {\r
+               dapl_os_unlock(&g_hca_lock);\r
+               return (dapl_convert_errno(errno, "create_thread ERR: cm_fd"));\r
+       }\r
+\r
+       g_ib_thread_state = IB_THREAD_CREATE;\r
+       dapl_os_unlock(&g_hca_lock);\r
+\r
+       /* create thread to process inbound connect request */\r
+       dat_status = dapl_os_thread_create(dapli_thread, NULL, &g_ib_thread);\r
+       if (dat_status != DAT_SUCCESS)\r
+               return (dapl_convert_errno(errno,\r
+                                          "create_thread ERR:"\r
+                                          " check resource limits"));\r
+\r
+       /* wait for thread to start */\r
+       dapl_os_lock(&g_hca_lock);\r
+       while (g_ib_thread_state != IB_THREAD_RUN) {\r
+               dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                            " ib_thread_init: waiting for ib_thread\n");\r
+               dapl_os_unlock(&g_hca_lock);\r
+               dapl_os_sleep_usec(1000);\r
+               dapl_os_lock(&g_hca_lock);\r
+       }\r
+       dapl_os_unlock(&g_hca_lock);\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                    " ib_thread_init(%d) exit\n", dapl_os_getpid());\r
+\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+void dapli_ib_thread_destroy(void)\r
+{\r
+       int retries = 10;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                    " ib_thread_destroy(%d)\n", dapl_os_getpid());\r
+       /* \r
+        * wait for async thread to terminate. \r
+        * pthread_join would be the correct method\r
+        * but some applications have some issues\r
+        */\r
+\r
+       /* destroy ib_thread, wait for termination, if not already */\r
+       dapl_os_lock(&g_hca_lock);\r
+       if (g_ib_thread_state != IB_THREAD_RUN)\r
+               goto bail;\r
+\r
+       g_ib_thread_state = IB_THREAD_CANCEL;\r
+       if (dapls_thread_signal() == -1)\r
+               dapl_log(DAPL_DBG_TYPE_UTIL,\r
+                        " destroy: thread wakeup error = %s\n",\r
+                        strerror(errno));\r
+       while ((g_ib_thread_state != IB_THREAD_EXIT) && (retries--)) {\r
+               dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                            " ib_thread_destroy: waiting for ib_thread\n");\r
+               if (dapls_thread_signal() == -1)\r
+                       dapl_log(DAPL_DBG_TYPE_UTIL,\r
+                                " destroy: thread wakeup error = %s\n",\r
+                                strerror(errno));\r
+               dapl_os_unlock(&g_hca_lock);\r
+               dapl_os_sleep_usec(2000);\r
+               dapl_os_lock(&g_hca_lock);\r
+       }\r
+bail:\r
+       dapl_os_unlock(&g_hca_lock);\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                    " ib_thread_destroy(%d) exit\n", dapl_os_getpid());\r
+}\r
+\r
+void dapli_async_event_cb(struct _ib_hca_transport *hca)\r
+{\r
+       struct ibv_async_event event;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " async_event(%p)\n", hca);\r
+\r
+       if (hca->destroy)\r
+               return;\r
+\r
+       if (!ibv_get_async_event(hca->cm_id->verbs, &event)) {\r
+\r
+               switch (event.event_type) {\r
+               case IBV_EVENT_CQ_ERR:\r
+               {\r
+                       struct dapl_ep *evd_ptr =\r
+                               event.element.cq->cq_context;\r
+\r
+                       dapl_log(DAPL_DBG_TYPE_ERR,\r
+                                "dapl async_event CQ (%p) ERR %d\n",\r
+                                evd_ptr, event.event_type);\r
+\r
+                       /* report up if async callback still setup */\r
+                       if (hca->async_cq_error)\r
+                               hca->async_cq_error(hca->cm_id->verbs,\r
+                                                       event.element.cq,\r
+                                                       &event,\r
+                                                       (void *)evd_ptr);\r
+                       break;\r
+               }\r
+               case IBV_EVENT_COMM_EST:\r
+               {\r
+                       /* Received msgs on connected QP before RTU */\r
+                       dapl_log(DAPL_DBG_TYPE_UTIL,\r
+                                " async_event COMM_EST(%p) rdata beat RTU\n",\r
+                                event.element.qp);\r
+\r
+                       break;\r
+               }\r
+               case IBV_EVENT_QP_FATAL:\r
+               case IBV_EVENT_QP_REQ_ERR:\r
+               case IBV_EVENT_QP_ACCESS_ERR:\r
+               case IBV_EVENT_QP_LAST_WQE_REACHED:\r
+               case IBV_EVENT_SRQ_ERR:\r
+               case IBV_EVENT_SRQ_LIMIT_REACHED:\r
+               case IBV_EVENT_SQ_DRAINED:\r
+               {\r
+                       struct dapl_ep *ep_ptr =\r
+                               event.element.qp->qp_context;\r
+\r
+                       dapl_log(DAPL_DBG_TYPE_ERR,\r
+                                "dapl async_event QP (%p) ERR %d\n",\r
+                                ep_ptr, event.event_type);\r
+\r
+                       /* report up if async callback still setup */\r
+                       if (hca->async_qp_error)\r
+                               hca->async_qp_error(hca->cm_id->verbs,\r
+                                                   ep_ptr->qp_handle,\r
+                                                   &event,\r
+                                                   (void *)ep_ptr);\r
+                       break;\r
+               }\r
+               case IBV_EVENT_PATH_MIG:\r
+               case IBV_EVENT_PATH_MIG_ERR:\r
+               case IBV_EVENT_DEVICE_FATAL:\r
+               case IBV_EVENT_PORT_ACTIVE:\r
+               case IBV_EVENT_PORT_ERR:\r
+               case IBV_EVENT_LID_CHANGE:\r
+               case IBV_EVENT_PKEY_CHANGE:\r
+               case IBV_EVENT_SM_CHANGE:\r
+               {\r
+                       dapl_log(DAPL_DBG_TYPE_WARN,\r
+                                "dapl async_event: DEV ERR %d\n",\r
+                                event.event_type);\r
+\r
+                       /* report up if async callback still setup */\r
+                       if (hca->async_unafiliated)\r
+                               hca->async_unafiliated(hca->cm_id->\r
+                                                       verbs, &event,\r
+                                                       hca->\r
+                                                       async_un_ctx);\r
+                       break;\r
+               }\r
+               case IBV_EVENT_CLIENT_REREGISTER:\r
+                       /* no need to report this event this time */\r
+                       dapl_log(DAPL_DBG_TYPE_UTIL,\r
+                                " async_event: IBV_CLIENT_REREGISTER\n");\r
+                       break;\r
+\r
+               default:\r
+                       dapl_log(DAPL_DBG_TYPE_WARN,\r
+                                "dapl async_event: %d UNKNOWN\n",\r
+                                event.event_type);\r
+                       break;\r
+\r
+               }\r
+               ibv_ack_async_event(&event);\r
+       }\r
+}\r
+\r
+#if defined(_WIN64) || defined(_WIN32)\r
+/* work thread for uAT, uCM, CQ, and async events */\r
+void dapli_thread(void *arg)\r
+{\r
+       struct _ib_hca_transport *hca;\r
+       struct _ib_hca_transport *uhca[8];\r
+       COMP_CHANNEL *channel;\r
+       int ret, idx, cnt;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread(%d,0x%x): ENTER: \n",\r
+                    dapl_os_getpid(), g_ib_thread);\r
+\r
+       dapl_os_lock(&g_hca_lock);\r
+       for (g_ib_thread_state = IB_THREAD_RUN;\r
+            g_ib_thread_state == IB_THREAD_RUN; \r
+            dapl_os_lock(&g_hca_lock)) {\r
+\r
+               idx = 0;\r
+               hca = dapl_llist_is_empty(&g_hca_list) ? NULL :\r
+                     dapl_llist_peek_head(&g_hca_list);\r
+\r
+               while (hca) {\r
+                       uhca[idx++] = hca;\r
+                       hca = dapl_llist_next_entry(&g_hca_list,\r
+                                                   (DAPL_LLIST_ENTRY *)\r
+                                                   &hca->entry);\r
+               }\r
+               cnt = idx;\r
+\r
+               dapl_os_unlock(&g_hca_lock);\r
+               ret = CompManagerPoll(windata.comp_mgr, INFINITE, &channel);\r
+\r
+               dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                            " ib_thread(%d) poll_event 0x%x\n",\r
+                            dapl_os_getpid(), ret);\r
+\r
+               dapli_cma_event_cb();\r
+\r
+               /* check and process ASYNC events, per device */\r
+               for (idx = 0; idx < cnt; idx++) {\r
+                       if (uhca[idx]->destroy == 1) {\r
+                               dapl_os_lock(&g_hca_lock);\r
+                               dapl_llist_remove_entry(&g_hca_list,\r
+                                                       (DAPL_LLIST_ENTRY *)\r
+                                                       &uhca[idx]->entry);\r
+                               dapl_os_unlock(&g_hca_lock);\r
+                               uhca[idx]->destroy = 2;\r
+                       } else {\r
+                               dapli_async_event_cb(uhca[idx]);\r
+                       }\r
+               }\r
+       }\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread(%d) EXIT\n",\r
+                    dapl_os_getpid());\r
+       g_ib_thread_state = IB_THREAD_EXIT;\r
+       dapl_os_unlock(&g_hca_lock);\r
+}\r
+#else                          // _WIN64 || WIN32\r
+/* work thread for uAT, uCM, CQ, and async events */\r
+void dapli_thread(void *arg)\r
+{\r
+       struct pollfd ufds[__FD_SETSIZE];\r
+       struct _ib_hca_transport *uhca[__FD_SETSIZE] = { NULL };\r
+       struct _ib_hca_transport *hca;\r
+       int ret, idx, fds;\r
+       char rbuf[2];\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_THREAD,\r
+                    " ib_thread(%d,0x%x): ENTER: pipe %d ucma %d\n",\r
+                    dapl_os_getpid(), g_ib_thread, g_ib_pipe[0],\r
+                    g_cm_events->fd);\r
+\r
+       /* Poll across pipe, CM, AT never changes */\r
+       dapl_os_lock(&g_hca_lock);\r
+       g_ib_thread_state = IB_THREAD_RUN;\r
+\r
+       ufds[0].fd = g_ib_pipe[0];      /* pipe */\r
+       ufds[0].events = POLLIN;\r
+       ufds[1].fd = g_cm_events->fd;   /* uCMA */\r
+       ufds[1].events = POLLIN;\r
+\r
+       while (g_ib_thread_state == IB_THREAD_RUN) {\r
+\r
+               /* build ufds after pipe and uCMA events */\r
+               ufds[0].revents = 0;\r
+               ufds[1].revents = 0;\r
+               idx = 1;\r
+\r
+               /*  Walk HCA list and setup async and CQ events */\r
+               if (!dapl_llist_is_empty(&g_hca_list))\r
+                       hca = dapl_llist_peek_head(&g_hca_list);\r
+               else\r
+                       hca = NULL;\r
+\r
+               while (hca) {\r
+\r
+                       /* uASYNC events */\r
+                       ufds[++idx].fd = hca->cm_id->verbs->async_fd;\r
+                       ufds[idx].events = POLLIN;\r
+                       ufds[idx].revents = 0;\r
+                       uhca[idx] = hca;\r
+\r
+                       dapl_dbg_log(DAPL_DBG_TYPE_THREAD,\r
+                                    " ib_thread(%d) poll_fd: hca[%d]=%p,"\r
+                                    " async=%d pipe=%d cm=%d \n",\r
+                                    dapl_os_getpid(), hca, ufds[idx - 1].fd,\r
+                                    ufds[0].fd, ufds[1].fd);\r
+\r
+                       hca = dapl_llist_next_entry(&g_hca_list,\r
+                                                   (DAPL_LLIST_ENTRY *)\r
+                                                   &hca->entry);\r
+               }\r
+\r
+               /* unlock, and setup poll */\r
+               fds = idx + 1;\r
+               dapl_os_unlock(&g_hca_lock);\r
+               ret = poll(ufds, fds, -1);\r
+               if (ret <= 0) {\r
+                       dapl_dbg_log(DAPL_DBG_TYPE_THREAD,\r
+                                    " ib_thread(%d): ERR %s poll\n",\r
+                                    dapl_os_getpid(), strerror(errno));\r
+                       dapl_os_lock(&g_hca_lock);\r
+                       continue;\r
+               }\r
+\r
+               dapl_dbg_log(DAPL_DBG_TYPE_THREAD,\r
+                            " ib_thread(%d) poll_event: "\r
+                            " async=0x%x pipe=0x%x cm=0x%x \n",\r
+                            dapl_os_getpid(), ufds[idx].revents,\r
+                            ufds[0].revents, ufds[1].revents);\r
+\r
+               /* uCMA events */\r
+               if (ufds[1].revents == POLLIN)\r
+                       dapli_cma_event_cb();\r
+\r
+               /* check and process ASYNC events, per device */\r
+               for (idx = 2; idx < fds; idx++) {\r
+                       if (ufds[idx].revents == POLLIN) {\r
+                               dapli_async_event_cb(uhca[idx]);\r
+                       }\r
+               }\r
+\r
+               /* check and process user events, PIPE */\r
+               if (ufds[0].revents == POLLIN) {\r
+                       if (read(g_ib_pipe[0], rbuf, 2) == -1)\r
+                               dapl_log(DAPL_DBG_TYPE_THREAD,\r
+                                        " cr_thread: pipe rd err= %s\n",\r
+                                        strerror(errno));\r
+\r
+                       /* cleanup any device on list marked for destroy */\r
+                       for (idx = 2; idx < fds; idx++) {\r
+                               if (uhca[idx] && uhca[idx]->destroy == 1) {\r
+                                       dapl_os_lock(&g_hca_lock);\r
+                                       dapl_llist_remove_entry(\r
+                                               &g_hca_list,\r
+                                               (DAPL_LLIST_ENTRY*)\r
+                                               &uhca[idx]->entry);\r
+                                       dapl_os_unlock(&g_hca_lock);\r
+                                       uhca[idx]->destroy = 2;\r
+                               }\r
+                       }\r
+               }\r
+               dapl_os_lock(&g_hca_lock);\r
+       }\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " ib_thread(%d) EXIT\n",\r
+                    dapl_os_getpid());\r
+       g_ib_thread_state = IB_THREAD_EXIT;\r
+       dapl_os_unlock(&g_hca_lock);\r
+}\r
+#endif\r
diff --git a/branches/winverbs/ulp/dapl2/dapl/openib_common.c b/branches/winverbs/ulp/dapl2/dapl/openib_common.c
new file mode 100644 (file)
index 0000000..336eff9
--- /dev/null
@@ -0,0 +1,6 @@
+\r
+#include "openib_common\mem.c"\r
+#include "openib_common\util.c"\r
+#include "openib_common\cq.c"\r
+#include "openib_common\qp.c"\r
+#include "openib_common\ib_extensions.c"\r
diff --git a/branches/winverbs/ulp/dapl2/dapl/openib_common/cq.c b/branches/winverbs/ulp/dapl2/dapl/openib_common/cq.c
new file mode 100644 (file)
index 0000000..aedfd71
--- /dev/null
@@ -0,0 +1,491 @@
+/*\r
+ * Copyright (c) 2009 Intel Corporation.  All rights reserved.\r
+ *\r
+ * This Software is licensed under one of the following licenses:\r
+ *\r
+ * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
+ *    available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/cpl.php.\r
+ *\r
+ * 2) under the terms of the "The BSD License" a copy of which is\r
+ *    available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/bsd-license.php.\r
+ *\r
+ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
+ *    copy of which is available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/gpl-license.php.\r
+ *\r
+ * Licensee has the right to choose one of the above licenses.\r
+ *\r
+ * Redistributions of source code must retain the above copyright\r
+ * notice and one of the license notices.\r
+ *\r
+ * Redistributions in binary form must reproduce both the above copyright\r
+ * notice, one of the license notices in the documentation\r
+ * and/or other materials provided with the distribution.\r
+ */\r
+#include "openib_osd.h"\r
+#include "dapl.h"\r
+#include "dapl_adapter_util.h"\r
+#include "dapl_lmr_util.h"\r
+#include "dapl_evd_util.h"\r
+#include "dapl_ring_buffer_util.h"\r
+\r
+/*\r
+ * Map all verbs DTO completion codes to the DAT equivelent.\r
+ *\r
+ * Not returned by verbs: DAT_DTO_ERR_PARTIAL_PACKET\r
+ */\r
+static struct ib_status_map {\r
+       int ib_status;\r
+       DAT_DTO_COMPLETION_STATUS dat_status;\r
+} ib_status_map[] = {\r
+/* 00 */  {IBV_WC_SUCCESS, DAT_DTO_SUCCESS},\r
+/* 01 */  {IBV_WC_LOC_LEN_ERR, DAT_DTO_ERR_LOCAL_LENGTH},\r
+/* 02 */  {IBV_WC_LOC_QP_OP_ERR, DAT_DTO_ERR_LOCAL_EP},\r
+/* 03 */  {IBV_WC_LOC_EEC_OP_ERR, DAT_DTO_ERR_TRANSPORT},\r
+/* 04 */  {IBV_WC_LOC_PROT_ERR, DAT_DTO_ERR_LOCAL_PROTECTION},\r
+/* 05 */  {IBV_WC_WR_FLUSH_ERR, DAT_DTO_ERR_FLUSHED},\r
+/* 06 */  {IBV_WC_MW_BIND_ERR, DAT_RMR_OPERATION_FAILED},\r
+/* 07 */  {IBV_WC_BAD_RESP_ERR, DAT_DTO_ERR_BAD_RESPONSE},\r
+/* 08 */  {IBV_WC_LOC_ACCESS_ERR, DAT_DTO_ERR_LOCAL_PROTECTION},\r
+/* 09 */  {IBV_WC_REM_INV_REQ_ERR, DAT_DTO_ERR_REMOTE_RESPONDER},\r
+/* 10 */  {IBV_WC_REM_ACCESS_ERR, DAT_DTO_ERR_REMOTE_ACCESS},\r
+/* 11 */  {IBV_WC_REM_OP_ERR, DAT_DTO_ERR_REMOTE_RESPONDER},\r
+/* 12 */  {IBV_WC_RETRY_EXC_ERR, DAT_DTO_ERR_TRANSPORT},\r
+/* 13 */  {IBV_WC_RNR_RETRY_EXC_ERR, DAT_DTO_ERR_RECEIVER_NOT_READY},\r
+/* 14 */  {IBV_WC_LOC_RDD_VIOL_ERR, DAT_DTO_ERR_LOCAL_PROTECTION},\r
+/* 15 */  {IBV_WC_REM_INV_RD_REQ_ERR, DAT_DTO_ERR_REMOTE_RESPONDER},\r
+/* 16 */  {IBV_WC_REM_ABORT_ERR, DAT_DTO_ERR_REMOTE_RESPONDER},\r
+/* 17 */  {IBV_WC_INV_EECN_ERR, DAT_DTO_ERR_TRANSPORT},\r
+/* 18 */  {IBV_WC_INV_EEC_STATE_ERR, DAT_DTO_ERR_TRANSPORT},\r
+/* 19 */  {IBV_WC_FATAL_ERR, DAT_DTO_ERR_TRANSPORT},\r
+/* 20 */  {IBV_WC_RESP_TIMEOUT_ERR, DAT_DTO_ERR_RECEIVER_NOT_READY},\r
+/* 21 */  {IBV_WC_GENERAL_ERR, DAT_DTO_ERR_TRANSPORT},\r
+};\r
+\r
+/*\r
+ * dapls_ib_get_dto_status\r
+ *\r
+ * Return the DAT status of a DTO operation\r
+ *\r
+ * Input:\r
+ *     cqe_ptr         pointer to completion queue entry\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     Value from ib_status_map table above\r
+ */\r
+\r
+DAT_DTO_COMPLETION_STATUS\r
+dapls_ib_get_dto_status(IN ib_work_completion_t * cqe_ptr)\r
+{\r
+       uint32_t ib_status;\r
+       int i;\r
+\r
+       ib_status = DAPL_GET_CQE_STATUS(cqe_ptr);\r
+\r
+       /*\r
+        * Due to the implementation of verbs completion code, we need to\r
+        * search the table for the correct value rather than assuming\r
+        * linear distribution.\r
+        */\r
+       for (i = 0; i <= IBV_WC_GENERAL_ERR; i++) {\r
+               if (ib_status == ib_status_map[i].ib_status) {\r
+                       if (ib_status != IBV_WC_SUCCESS) {\r
+                               dapl_log(DAPL_DBG_TYPE_DTO_COMP_ERR,\r
+                                        " DTO completion ERROR: %d:"\r
+                                        " op %#x\n",\r
+                                        ib_status,\r
+                                        DAPL_GET_CQE_OPTYPE(cqe_ptr));\r
+                       }\r
+                       return ib_status_map[i].dat_status;\r
+               }\r
+       }\r
+\r
+       return DAT_DTO_FAILURE;\r
+}\r
+\r
+DAT_RETURN dapls_ib_get_async_event(IN ib_error_record_t * err_record,\r
+                                   OUT DAT_EVENT_NUMBER * async_event)\r
+{\r
+       DAT_RETURN dat_status = DAT_SUCCESS;\r
+       int err_code = err_record->event_type;\r
+\r
+       switch (err_code) {\r
+               /* OVERFLOW error */\r
+       case IBV_EVENT_CQ_ERR:\r
+               *async_event = DAT_ASYNC_ERROR_EVD_OVERFLOW;\r
+               break;\r
+               /* INTERNAL errors */\r
+       case IBV_EVENT_DEVICE_FATAL:\r
+               *async_event = DAT_ASYNC_ERROR_PROVIDER_INTERNAL_ERROR;\r
+               break;\r
+               /* CATASTROPHIC errors */\r
+       case IBV_EVENT_PORT_ERR:\r
+               *async_event = DAT_ASYNC_ERROR_IA_CATASTROPHIC;\r
+               break;\r
+               /* BROKEN QP error */\r
+       case IBV_EVENT_SQ_DRAINED:\r
+       case IBV_EVENT_QP_FATAL:\r
+       case IBV_EVENT_QP_REQ_ERR:\r
+       case IBV_EVENT_QP_ACCESS_ERR:\r
+               *async_event = DAT_ASYNC_ERROR_EP_BROKEN;\r
+               break;\r
+\r
+               /* connection completion */\r
+       case IBV_EVENT_COMM_EST:\r
+               *async_event = DAT_CONNECTION_EVENT_ESTABLISHED;\r
+               break;\r
+\r
+               /* TODO: process HW state changes */\r
+       case IBV_EVENT_PATH_MIG:\r
+       case IBV_EVENT_PATH_MIG_ERR:\r
+       case IBV_EVENT_PORT_ACTIVE:\r
+       case IBV_EVENT_LID_CHANGE:\r
+       case IBV_EVENT_PKEY_CHANGE:\r
+       case IBV_EVENT_SM_CHANGE:\r
+       default:\r
+               dat_status = DAT_ERROR(DAT_NOT_IMPLEMENTED, 0);\r
+       }\r
+       return dat_status;\r
+}\r
+\r
+/*\r
+ * dapl_ib_cq_alloc\r
+ *\r
+ * Alloc a CQ\r
+ *\r
+ * Input:\r
+ *     ia_handle               IA handle\r
+ *     evd_ptr                 pointer to EVD struct\r
+ *     cqlen                   minimum QLen\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_INSUFFICIENT_RESOURCES\r
+ *\r
+ */\r
+DAT_RETURN\r
+dapls_ib_cq_alloc(IN DAPL_IA * ia_ptr,\r
+                 IN DAPL_EVD * evd_ptr, IN DAT_COUNT * cqlen)\r
+{\r
+       struct ibv_comp_channel *channel = evd_ptr->cq_wait_obj_handle;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                    "dapls_ib_cq_alloc: evd %p cqlen=%d \n", evd_ptr, *cqlen);\r
+\r
+       /* Call IB verbs to create CQ */\r
+       evd_ptr->ib_cq_handle = ibv_create_cq(ia_ptr->hca_ptr->ib_hca_handle,\r
+                                             *cqlen, evd_ptr, channel, 0);\r
+\r
+       if (evd_ptr->ib_cq_handle == IB_INVALID_HANDLE)\r
+               return DAT_INSUFFICIENT_RESOURCES;\r
+\r
+       /* arm cq for events */\r
+       dapls_set_cq_notify(ia_ptr, evd_ptr);\r
+\r
+       /* update with returned cq entry size */\r
+       *cqlen = evd_ptr->ib_cq_handle->cqe;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                    "dapls_ib_cq_alloc: new_cq %p cqlen=%d \n",\r
+                    evd_ptr->ib_cq_handle, *cqlen);\r
+\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+/*\r
+ * dapl_ib_cq_resize\r
+ *\r
+ * Alloc a CQ\r
+ *\r
+ * Input:\r
+ *     ia_handle               IA handle\r
+ *     evd_ptr                 pointer to EVD struct\r
+ *     cqlen                   minimum QLen\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_INVALID_PARAMETER\r
+ *\r
+ */\r
+DAT_RETURN\r
+dapls_ib_cq_resize(IN DAPL_IA * ia_ptr,\r
+                  IN DAPL_EVD * evd_ptr, IN DAT_COUNT * cqlen)\r
+{\r
+       ib_cq_handle_t new_cq;\r
+       struct ibv_comp_channel *channel = evd_ptr->cq_wait_obj_handle;\r
+\r
+       /* IB verbs DOES support resize. REDO THIS.\r
+        * Try to re-create CQ\r
+        * with new size. Can only be done if QP is not attached. \r
+        * destroy EBUSY == QP still attached.\r
+        */\r
+\r
+       /* Call IB verbs to create CQ */\r
+       new_cq = ibv_create_cq(ia_ptr->hca_ptr->ib_hca_handle, *cqlen,\r
+                              evd_ptr, channel, 0);\r
+\r
+       if (new_cq == IB_INVALID_HANDLE)\r
+               return DAT_INSUFFICIENT_RESOURCES;\r
+\r
+       /* destroy the original and replace if successful */\r
+       if (ibv_destroy_cq(evd_ptr->ib_cq_handle)) {\r
+               ibv_destroy_cq(new_cq);\r
+               return (dapl_convert_errno(errno, "resize_cq"));\r
+       }\r
+\r
+       /* update EVD with new cq handle and size */\r
+       evd_ptr->ib_cq_handle = new_cq;\r
+       *cqlen = new_cq->cqe;\r
+\r
+       /* arm cq for events */\r
+       dapls_set_cq_notify(ia_ptr, evd_ptr);\r
+\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+/*\r
+ * dapls_ib_cq_free\r
+ *\r
+ * destroy a CQ\r
+ *\r
+ * Input:\r
+ *     ia_handle               IA handle\r
+ *     evd_ptr                 pointer to EVD struct\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_INVALID_PARAMETER\r
+ *\r
+ */\r
+DAT_RETURN dapls_ib_cq_free(IN DAPL_IA * ia_ptr, IN DAPL_EVD * evd_ptr)\r
+{\r
+       DAT_EVENT event;\r
+       ib_work_completion_t wc;\r
+\r
+       if (evd_ptr->ib_cq_handle != IB_INVALID_HANDLE) {\r
+               /* pull off CQ and EVD entries and toss */\r
+               while (ibv_poll_cq(evd_ptr->ib_cq_handle, 1, &wc) == 1) ;\r
+               while (dapl_evd_dequeue(evd_ptr, &event) == DAT_SUCCESS) ;\r
+               if (ibv_destroy_cq(evd_ptr->ib_cq_handle))\r
+                       return (dapl_convert_errno(errno, "ibv_destroy_cq"));\r
+               evd_ptr->ib_cq_handle = IB_INVALID_HANDLE;\r
+       }\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+/*\r
+ * dapls_set_cq_notify\r
+ *\r
+ * Set the CQ notification for next\r
+ *\r
+ * Input:\r
+ *     hca_handl               hca handle\r
+ *     DAPL_EVD                evd handle\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     dapl_convert_errno \r
+ */\r
+DAT_RETURN dapls_set_cq_notify(IN DAPL_IA * ia_ptr, IN DAPL_EVD * evd_ptr)\r
+{\r
+       if (ibv_req_notify_cq(evd_ptr->ib_cq_handle, 0))\r
+               return (dapl_convert_errno(errno, "notify_cq"));\r
+       else\r
+               return DAT_SUCCESS;\r
+}\r
+\r
+/*\r
+ * dapls_ib_completion_notify\r
+ *\r
+ * Set the CQ notification type\r
+ *\r
+ * Input:\r
+ *     hca_handl               hca handle\r
+ *     evd_ptr                 evd handle\r
+ *     type                    notification type\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     dapl_convert_errno\r
+ */\r
+DAT_RETURN dapls_ib_completion_notify(IN ib_hca_handle_t hca_handle,\r
+                                     IN DAPL_EVD * evd_ptr,\r
+                                     IN ib_notification_type_t type)\r
+{\r
+       if (ibv_req_notify_cq(evd_ptr->ib_cq_handle, type))\r
+               return (dapl_convert_errno(errno, "notify_cq_type"));\r
+       else\r
+               return DAT_SUCCESS;\r
+}\r
+\r
+/*\r
+ * dapls_ib_completion_poll\r
+ *\r
+ * CQ poll for completions\r
+ *\r
+ * Input:\r
+ *     hca_handl               hca handle\r
+ *     evd_ptr                 evd handle\r
+ *     wc_ptr                  work completion\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns: \r
+ *     DAT_SUCCESS\r
+ *     DAT_QUEUE_EMPTY\r
+ *     \r
+ */\r
+DAT_RETURN dapls_ib_completion_poll(IN DAPL_HCA * hca_ptr,\r
+                                   IN DAPL_EVD * evd_ptr,\r
+                                   IN ib_work_completion_t * wc_ptr)\r
+{\r
+       int ret;\r
+\r
+       ret = ibv_poll_cq(evd_ptr->ib_cq_handle, 1, wc_ptr);\r
+       if (ret == 1)\r
+               return DAT_SUCCESS;\r
+\r
+       return DAT_QUEUE_EMPTY;\r
+}\r
+\r
+/* NEW common wait objects for providers with direct CQ wait objects */\r
+DAT_RETURN\r
+dapls_ib_wait_object_create(IN DAPL_EVD * evd_ptr,\r
+                           IN ib_wait_obj_handle_t * p_cq_wait_obj_handle)\r
+{\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                    " cq_object_create: (%p,%p)\n",\r
+                    evd_ptr, p_cq_wait_obj_handle);\r
+\r
+       /* set cq_wait object to evd_ptr */\r
+       *p_cq_wait_obj_handle =\r
+           ibv_create_comp_channel(evd_ptr->header.owner_ia->hca_ptr->\r
+                                   ib_hca_handle);\r
+\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+DAT_RETURN\r
+dapls_ib_wait_object_destroy(IN ib_wait_obj_handle_t p_cq_wait_obj_handle)\r
+{\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                    " cq_object_destroy: wait_obj=%p\n", p_cq_wait_obj_handle);\r
+\r
+       ibv_destroy_comp_channel(p_cq_wait_obj_handle);\r
+\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+DAT_RETURN\r
+dapls_ib_wait_object_wakeup(IN ib_wait_obj_handle_t p_cq_wait_obj_handle)\r
+{\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                    " cq_object_wakeup: wait_obj=%p\n", p_cq_wait_obj_handle);\r
+\r
+       /* no wake up mechanism */\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+#if defined(_WIN32) || defined(_WIN64)\r
+DAT_RETURN\r
+dapls_ib_wait_object_wait(IN ib_wait_obj_handle_t p_cq_wait_obj_handle,\r
+                         IN uint32_t timeout)\r
+{\r
+       struct dapl_evd *evd_ptr;\r
+       struct ibv_cq *ibv_cq = NULL;\r
+       int status = 0;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                    " cq_object_wait: CQ channel %p time %d\n",\r
+                    p_cq_wait_obj_handle, timeout);\r
+\r
+       /* uDAPL timeout values in usecs */\r
+       p_cq_wait_obj_handle->comp_channel.Milliseconds = timeout / 1000;\r
+\r
+       /* returned event */\r
+       status = ibv_get_cq_event(p_cq_wait_obj_handle, &ibv_cq,\r
+                                 (void *)&evd_ptr);\r
+       if (status == 0) {\r
+               ibv_ack_cq_events(ibv_cq, 1);\r
+       }\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                    " cq_object_wait: RET evd %p ibv_cq %p %s\n",\r
+                    evd_ptr, ibv_cq, strerror(errno));\r
+\r
+       return (dapl_convert_errno(status, "cq_wait_object_wait"));\r
+}\r
+#else                  //_WIN32 || _WIN64\r
+DAT_RETURN\r
+dapls_ib_wait_object_wait(IN ib_wait_obj_handle_t p_cq_wait_obj_handle,\r
+                         IN uint32_t timeout)\r
+{\r
+       struct dapl_evd *evd_ptr;\r
+       struct ibv_cq *ibv_cq = NULL;\r
+       int status = 0;\r
+       int timeout_ms = -1;\r
+       struct pollfd cq_fd = {\r
+               .fd = p_cq_wait_obj_handle->fd,\r
+               .events = POLLIN,\r
+               .revents = 0\r
+       };\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                    " cq_object_wait: CQ channel %p time %d\n",\r
+                    p_cq_wait_obj_handle, timeout);\r
+\r
+       /* uDAPL timeout values in usecs */\r
+       if (timeout != DAT_TIMEOUT_INFINITE)\r
+               timeout_ms = timeout / 1000;\r
+\r
+       status = poll(&cq_fd, 1, timeout_ms);\r
+\r
+       /* returned event */\r
+       if (status > 0) {\r
+               if (!ibv_get_cq_event(p_cq_wait_obj_handle,\r
+                                     &ibv_cq, (void *)&evd_ptr)) {\r
+                       ibv_ack_cq_events(ibv_cq, 1);\r
+               }\r
+               status = 0;\r
+\r
+               /* timeout */\r
+       } else if (status == 0)\r
+               status = ETIMEDOUT;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                    " cq_object_wait: RET evd %p ibv_cq %p %s\n",\r
+                    evd_ptr, ibv_cq, strerror(errno));\r
+\r
+       return (dapl_convert_errno(status, "cq_wait_object_wait"));\r
+\r
+}\r
+#endif                         //_WIN32 || _WIN64\r
+\r
+/*\r
+ * Local variables:\r
+ *  c-indent-level: 4\r
+ *  c-basic-offset: 4\r
+ *  tab-width: 8\r
+ * End:\r
+ */\r
diff --git a/branches/winverbs/ulp/dapl2/dapl/openib_common/dapl_ib_common.h b/branches/winverbs/ulp/dapl2/dapl/openib_common/dapl_ib_common.h
new file mode 100644 (file)
index 0000000..2ed5ea1
--- /dev/null
@@ -0,0 +1,299 @@
+/*\r
+ * Copyright (c) 2009 Intel Corporation.  All rights reserved.\r
+ *\r
+ * This Software is licensed under one of the following licenses:\r
+ *\r
+ * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
+ *    available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/cpl.php.\r
+ *\r
+ * 2) under the terms of the "The BSD License" a copy of which is\r
+ *    available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/bsd-license.php.\r
+ *\r
+ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
+ *    copy of which is available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/gpl-license.php.\r
+ *\r
+ * Licensee has the right to choose one of the above licenses.\r
+ *\r
+ * Redistributions of source code must retain the above copyright\r
+ * notice and one of the license notices.\r
+ *\r
+ * Redistributions in binary form must reproduce both the above copyright\r
+ * notice, one of the license notices in the documentation\r
+ * and/or other materials provided with the distribution.\r
+ */\r
+\r
+/* \r
+ * Definitions common to all OpenIB providers, cma, scm, ucm \r
+ */\r
+\r
+#ifndef _DAPL_IB_COMMON_H_\r
+#define _DAPL_IB_COMMON_H_\r
+\r
+#include <infiniband/verbs.h>\r
+\r
+#ifdef DAT_EXTENSIONS\r
+#include <dat2/dat_ib_extensions.h>\r
+#endif\r
+\r
+#ifndef __cplusplus\r
+#define false 0\r
+#define true  1\r
+#endif /*__cplusplus */\r
+\r
+/* Typedefs to map common DAPL provider types to IB verbs */\r
+typedef        struct ibv_qp           *ib_qp_handle_t;\r
+typedef        struct ibv_cq           *ib_cq_handle_t;\r
+typedef        struct ibv_pd           *ib_pd_handle_t;\r
+typedef        struct ibv_mr           *ib_mr_handle_t;\r
+typedef        struct ibv_mw           *ib_mw_handle_t;\r
+typedef        struct ibv_wc           ib_work_completion_t;\r
+\r
+/* HCA context type maps to IB verbs  */\r
+typedef        struct ibv_context      *ib_hca_handle_t;\r
+typedef ib_hca_handle_t                dapl_ibal_ca_t;\r
+\r
+/* QP info to exchange, wire protocol version for these CM's */\r
+#define DCM_VER 4\r
+typedef struct _ib_qp_cm\r
+{ \r
+       uint16_t                ver;\r
+       uint16_t                rej;\r
+       uint16_t                lid;\r
+       uint16_t                port;\r
+       uint32_t                qpn;\r
+       uint32_t                p_size;\r
+       union ibv_gid           gid;\r
+       DAT_SOCK_ADDR6          ia_address;\r
+       uint16_t                qp_type; \r
+} ib_qp_cm_t;\r
+\r
+/* CM events */\r
+typedef enum {\r
+       IB_CME_CONNECTED,\r
+       IB_CME_DISCONNECTED,\r
+       IB_CME_DISCONNECTED_ON_LINK_DOWN,\r
+       IB_CME_CONNECTION_REQUEST_PENDING,\r
+       IB_CME_CONNECTION_REQUEST_PENDING_PRIVATE_DATA,\r
+       IB_CME_CONNECTION_REQUEST_ACKED,\r
+       IB_CME_DESTINATION_REJECT,\r
+       IB_CME_DESTINATION_REJECT_PRIVATE_DATA,\r
+       IB_CME_DESTINATION_UNREACHABLE,\r
+       IB_CME_TOO_MANY_CONNECTION_REQUESTS,\r
+       IB_CME_LOCAL_FAILURE,\r
+       IB_CME_BROKEN,\r
+       IB_CME_TIMEOUT\r
+} ib_cm_events_t;\r
+\r
+/* Operation and state mappings */\r
+typedef int ib_send_op_type_t;\r
+typedef        struct  ibv_sge         ib_data_segment_t;\r
+typedef enum   ibv_qp_state    ib_qp_state_t;\r
+typedef        enum    ibv_event_type  ib_async_event_type;\r
+typedef struct ibv_async_event ib_error_record_t;      \r
+\r
+/* CQ notifications */\r
+typedef enum\r
+{\r
+       IB_NOTIFY_ON_NEXT_COMP,\r
+       IB_NOTIFY_ON_SOLIC_COMP\r
+\r
+} ib_notification_type_t;\r
+\r
+/* other mappings */\r
+typedef int                    ib_bool_t;\r
+typedef union ibv_gid          GID;\r
+typedef char                   *IB_HCA_NAME;\r
+typedef uint16_t               ib_hca_port_t;\r
+typedef uint32_t               ib_comp_handle_t;\r
+\r
+typedef struct ibv_comp_channel *ib_wait_obj_handle_t;\r
+\r
+/* Definitions */\r
+#define IB_INVALID_HANDLE      NULL\r
+\r
+/* inline send rdma threshold */\r
+#define        INLINE_SEND_IWARP_DEFAULT       64\r
+#define        INLINE_SEND_IB_DEFAULT          200\r
+\r
+/* qkey for UD QP's */\r
+#define DAT_UD_QKEY    0x78654321\r
+\r
+/* DTO OPs, ordered for DAPL ENUM definitions */\r
+#define OP_RDMA_WRITE           IBV_WR_RDMA_WRITE\r
+#define OP_RDMA_WRITE_IMM       IBV_WR_RDMA_WRITE_WITH_IMM\r
+#define OP_SEND                 IBV_WR_SEND\r
+#define OP_SEND_IMM             IBV_WR_SEND_WITH_IMM\r
+#define OP_RDMA_READ            IBV_WR_RDMA_READ\r
+#define OP_COMP_AND_SWAP        IBV_WR_ATOMIC_CMP_AND_SWP\r
+#define OP_FETCH_AND_ADD        IBV_WR_ATOMIC_FETCH_AND_ADD\r
+#define OP_RECEIVE              7   /* internal op */\r
+#define OP_RECEIVE_IMM         8   /* rdma write with immed, internel op */\r
+#define OP_RECEIVE_MSG_IMM     9   /* recv msg with immed, internel op */\r
+#define OP_BIND_MW              10   /* internal op */\r
+#define OP_SEND_UD              11  /* internal op */\r
+#define OP_RECV_UD              12  /* internal op */\r
+#define OP_INVALID             0xff\r
+\r
+/* Definitions to map QP state */\r
+#define IB_QP_STATE_RESET      IBV_QPS_RESET\r
+#define IB_QP_STATE_INIT       IBV_QPS_INIT\r
+#define IB_QP_STATE_RTR                IBV_QPS_RTR\r
+#define IB_QP_STATE_RTS                IBV_QPS_RTS\r
+#define IB_QP_STATE_SQD                IBV_QPS_SQD\r
+#define IB_QP_STATE_SQE                IBV_QPS_SQE\r
+#define IB_QP_STATE_ERROR      IBV_QPS_ERR\r
+\r
+/* Definitions for ibverbs/mthca return codes, should be defined in verbs.h */\r
+/* some are errno and some are -n values */\r
+\r
+/**\r
+ * ibv_get_device_name - Return kernel device name\r
+ * ibv_get_device_guid - Return device's node GUID\r
+ * ibv_open_device - Return ibv_context or NULL\r
+ * ibv_close_device - Return 0, (errno?)\r
+ * ibv_get_async_event - Return 0, -1 \r
+ * ibv_alloc_pd - Return ibv_pd, NULL\r
+ * ibv_dealloc_pd - Return 0, errno \r
+ * ibv_reg_mr - Return ibv_mr, NULL\r
+ * ibv_dereg_mr - Return 0, errno\r
+ * ibv_create_cq - Return ibv_cq, NULL\r
+ * ibv_destroy_cq - Return 0, errno\r
+ * ibv_get_cq_event - Return 0 & ibv_cq/context, int\r
+ * ibv_poll_cq - Return n & ibv_wc, 0 ok, -1 empty, -2 error \r
+ * ibv_req_notify_cq - Return 0 (void?)\r
+ * ibv_create_qp - Return ibv_qp, NULL\r
+ * ibv_modify_qp - Return 0, errno\r
+ * ibv_destroy_qp - Return 0, errno\r
+ * ibv_post_send - Return 0, -1 & bad_wr\r
+ * ibv_post_recv - Return 0, -1 & bad_wr \r
+ */\r
+\r
+/* async handler for DTO, CQ, QP, and unafiliated */\r
+typedef void (*ib_async_dto_handler_t)(\r
+    IN    ib_hca_handle_t    ib_hca_handle,\r
+    IN    ib_error_record_t  *err_code,\r
+    IN    void               *context);\r
+\r
+typedef void (*ib_async_cq_handler_t)(\r
+    IN    ib_hca_handle_t    ib_hca_handle,\r
+    IN    ib_cq_handle_t     ib_cq_handle,\r
+    IN    ib_error_record_t  *err_code,\r
+    IN    void               *context);\r
+\r
+typedef void (*ib_async_qp_handler_t)(\r
+    IN    ib_hca_handle_t    ib_hca_handle,\r
+    IN    ib_qp_handle_t     ib_qp_handle,\r
+    IN    ib_error_record_t  *err_code,\r
+    IN    void               *context);\r
+\r
+typedef void (*ib_async_handler_t)(\r
+    IN    ib_hca_handle_t    ib_hca_handle,\r
+    IN    ib_error_record_t  *err_code,\r
+    IN    void               *context);\r
+\r
+typedef enum\r
+{\r
+       IB_THREAD_INIT,\r
+       IB_THREAD_CREATE,\r
+       IB_THREAD_RUN,\r
+       IB_THREAD_CANCEL,\r
+       IB_THREAD_EXIT\r
+\r
+} ib_thread_state_t;\r
+\r
+\r
+/* provider specfic fields for shared memory support */\r
+typedef uint32_t ib_shm_transport_t;\r
+\r
+/* prototypes */\r
+int32_t        dapls_ib_init(void);\r
+int32_t        dapls_ib_release(void);\r
+enum ibv_mtu dapl_ib_mtu(int mtu);\r
+char *dapl_ib_mtu_str(enum ibv_mtu mtu);\r
+DAT_RETURN getlocalipaddr(DAT_SOCK_ADDR *addr, int addr_len);\r
+\r
+/* inline functions */\r
+STATIC _INLINE_ IB_HCA_NAME dapl_ib_convert_name (IN char *name)\r
+{\r
+       /* use ascii; name of local device */\r
+       return dapl_os_strdup(name);\r
+}\r
+\r
+STATIC _INLINE_ void dapl_ib_release_name (IN IB_HCA_NAME name)\r
+{\r
+       return;\r
+}\r
+\r
+/*\r
+ *  Convert errno to DAT_RETURN values\r
+ */\r
+STATIC _INLINE_ DAT_RETURN \r
+dapl_convert_errno( IN int err, IN const char *str )\r
+{\r
+    if (!err)  return DAT_SUCCESS;\r
+       \r
+#if DAPL_DBG\r
+    if ((err != EAGAIN) && (err != ETIMEDOUT))\r
+       dapl_dbg_log (DAPL_DBG_TYPE_ERR," %s %s\n", str, strerror(err));\r
+#endif \r
+\r
+    switch( err )\r
+    {\r
+       case EOVERFLOW  : return DAT_LENGTH_ERROR;\r
+       case EACCES     : return DAT_PRIVILEGES_VIOLATION;\r
+       case EPERM      : return DAT_PROTECTION_VIOLATION;                \r
+       case EINVAL     : return DAT_INVALID_HANDLE;\r
+       case EISCONN    : return DAT_INVALID_STATE | DAT_INVALID_STATE_EP_CONNECTED;\r
+       case ECONNREFUSED : return DAT_INVALID_STATE | DAT_INVALID_STATE_EP_NOTREADY;\r
+       case ETIMEDOUT  : return DAT_TIMEOUT_EXPIRED;\r
+       case ENETUNREACH: return DAT_INVALID_ADDRESS | DAT_INVALID_ADDRESS_UNREACHABLE;\r
+       case EADDRINUSE : return DAT_CONN_QUAL_IN_USE;\r
+       case EALREADY   : return DAT_INVALID_STATE | DAT_INVALID_STATE_EP_ACTCONNPENDING;\r
+       case ENOMEM     : return DAT_INSUFFICIENT_RESOURCES;\r
+        case EAGAIN    : return DAT_QUEUE_EMPTY;\r
+       case EINTR      : return DAT_INTERRUPTED_CALL;\r
+       case EAFNOSUPPORT : return DAT_INVALID_ADDRESS | DAT_INVALID_ADDRESS_MALFORMED;\r
+       case EFAULT     : \r
+       default         : return DAT_INTERNAL_ERROR;\r
+    }\r
+ }\r
+\r
+typedef enum dapl_cm_state \r
+{\r
+       DCM_INIT,\r
+       DCM_LISTEN,\r
+       DCM_CONN_PENDING,\r
+       DCM_RTU_PENDING,\r
+       DCM_ACCEPTING,\r
+       DCM_ACCEPTING_DATA,\r
+       DCM_ACCEPTED,\r
+       DCM_REJECTED,\r
+       DCM_CONNECTED,\r
+       DCM_RELEASED,\r
+       DCM_DISCONNECTED,\r
+       DCM_DESTROY\r
+} DAPL_CM_STATE;\r
+\r
+STATIC _INLINE_ char * dapl_cm_state_str(IN int st)\r
+{\r
+       static char *state[] = {\r
+               "CM_INIT",\r
+               "CM_LISTEN",\r
+               "CM_CONN_PENDING",\r
+               "CM_RTU_PENDING",\r
+               "CM_ACCEPTING",\r
+               "CM_ACCEPTING_DATA",\r
+               "CM_ACCEPTED",\r
+               "CM_REJECTED",\r
+               "CM_CONNECTED",\r
+               "CM_RELEASED",\r
+               "CM_DISCONNECTED",\r
+               "CM_DESTROY"\r
+        };\r
+        return ((st < 0 || st > 11) ? "Invalid CM state?" : state[st]);\r
+}\r
+\r
+#endif /*  _DAPL_IB_COMMON_H_ */\r
diff --git a/branches/winverbs/ulp/dapl2/dapl/openib_common/dapl_ib_dto.h b/branches/winverbs/ulp/dapl2/dapl/openib_common/dapl_ib_dto.h
new file mode 100644 (file)
index 0000000..1e74113
--- /dev/null
@@ -0,0 +1,504 @@
+/*\r
+ * Copyright (c) 2009 Intel Corporation.  All rights reserved.\r
+ *\r
+ * This Software is licensed under one of the following licenses:\r
+ *\r
+ * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
+ *    available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/cpl.php.\r
+ *\r
+ * 2) under the terms of the "The BSD License" a copy of which is\r
+ *    available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/bsd-license.php.\r
+ *\r
+ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
+ *    copy of which is available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/gpl-license.php.\r
+ *\r
+ * Licensee has the right to choose one of the above licenses.\r
+ *\r
+ * Redistributions of source code must retain the above copyright\r
+ * notice and one of the license notices.\r
+ *\r
+ * Redistributions in binary form must reproduce both the above copyright\r
+ * notice, one of the license notices in the documentation\r
+ * and/or other materials provided with the distribution.\r
+ */\r
+#ifndef _DAPL_IB_DTO_H_\r
+#define _DAPL_IB_DTO_H_\r
+\r
+#include "dapl_ib_util.h"\r
+\r
+#ifdef DAT_EXTENSIONS\r
+#include <dat2/dat_ib_extensions.h>\r
+#endif\r
+\r
+STATIC _INLINE_ int dapls_cqe_opcode(ib_work_completion_t *cqe_p);\r
+\r
+#define CQE_WR_TYPE_UD(id) \\r
+       (((DAPL_COOKIE *)(uintptr_t)id)->ep->qp_handle->qp_type == IBV_QPT_UD)\r
+\r
+/*\r
+ * dapls_ib_post_recv\r
+ *\r
+ * Provider specific Post RECV function\r
+ */\r
+STATIC _INLINE_ DAT_RETURN \r
+dapls_ib_post_recv (\r
+       IN  DAPL_EP             *ep_ptr,\r
+       IN  DAPL_COOKIE         *cookie,\r
+       IN  DAT_COUNT           segments,\r
+       IN  DAT_LMR_TRIPLET     *local_iov )\r
+{\r
+       struct ibv_recv_wr wr;\r
+       struct ibv_recv_wr *bad_wr;\r
+       ib_data_segment_t *ds = (ib_data_segment_t *)local_iov;\r
+       DAT_COUNT i, total_len;\r
+       int ret;\r
+       \r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+                    " post_rcv: ep %p cookie %p segs %d l_iov %p\n",\r
+                    ep_ptr, cookie, segments, local_iov);\r
+\r
+       /* setup work request */\r
+       total_len = 0;\r
+       wr.next = 0;\r
+       wr.num_sge = segments;\r
+       wr.wr_id = (uint64_t)(uintptr_t)cookie;\r
+       wr.sg_list = ds;\r
+\r
+       if (cookie != NULL) {\r
+               for (i = 0; i < segments; i++) {\r
+                       dapl_dbg_log(DAPL_DBG_TYPE_EP, \r
+                                    " post_rcv: l_key 0x%x va %p len %d\n",\r
+                                    ds->lkey, ds->addr, ds->length );\r
+                       total_len += ds->length;\r
+                       ds++;\r
+               }\r
+               cookie->val.dto.size = total_len;\r
+       }\r
+\r
+       ret = ibv_post_recv(ep_ptr->qp_handle, &wr, &bad_wr);\r
+       \r
+       if (ret)\r
+               return(dapl_convert_errno(errno,"ibv_recv"));\r
+\r
+       DAPL_CNTR(ep_ptr, DCNT_EP_POST_RECV);\r
+       DAPL_CNTR_DATA(ep_ptr, DCNT_EP_POST_RECV_DATA, total_len);\r
+\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+/*\r
+ * dapls_ib_post_send\r
+ *\r
+ * Provider specific Post SEND function\r
+ */\r
+STATIC _INLINE_ DAT_RETURN \r
+dapls_ib_post_send (\r
+       IN  DAPL_EP                     *ep_ptr,\r
+       IN  ib_send_op_type_t           op_type,\r
+       IN  DAPL_COOKIE                 *cookie,\r
+       IN  DAT_COUNT                   segments,\r
+       IN  DAT_LMR_TRIPLET             *local_iov,\r
+       IN  const DAT_RMR_TRIPLET       *remote_iov,\r
+       IN  DAT_COMPLETION_FLAGS        completion_flags)\r
+{\r
+       struct ibv_send_wr wr;\r
+       struct ibv_send_wr *bad_wr;\r
+       ib_data_segment_t *ds = (ib_data_segment_t *)local_iov;\r
+       ib_hca_transport_t *ibt_ptr = \r
+               &ep_ptr->header.owner_ia->hca_ptr->ib_trans;\r
+       DAT_COUNT i, total_len;\r
+       int ret;\r
+       \r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+                    " post_snd: ep %p op %d ck %p sgs",\r
+                    "%d l_iov %p r_iov %p f %d\n",\r
+                    ep_ptr, op_type, cookie, segments, local_iov, \r
+                    remote_iov, completion_flags);\r
+\r
+#ifdef DAT_EXTENSIONS  \r
+       if (ep_ptr->qp_handle->qp_type != IBV_QPT_RC)\r
+               return(DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP));\r
+#endif\r
+       /* setup the work request */\r
+       wr.next = 0;\r
+       wr.opcode = op_type;\r
+       wr.num_sge = segments;\r
+       wr.send_flags = 0;\r
+       wr.wr_id = (uint64_t)(uintptr_t)cookie;\r
+       wr.sg_list = ds;\r
+       total_len = 0;\r
+\r
+       if (cookie != NULL) {\r
+               for (i = 0; i < segments; i++ ) {\r
+                       dapl_dbg_log(DAPL_DBG_TYPE_EP, \r
+                                    " post_snd: lkey 0x%x va %p len %d\n",\r
+                                    ds->lkey, ds->addr, ds->length );\r
+                       total_len += ds->length;\r
+                       ds++;\r
+               }\r
+               cookie->val.dto.size = total_len;\r
+       }\r
+\r
+       if (wr.num_sge && \r
+           (op_type == OP_RDMA_WRITE || op_type == OP_RDMA_READ)) {\r
+               wr.wr.rdma.remote_addr = remote_iov->virtual_address;\r
+               wr.wr.rdma.rkey = remote_iov->rmr_context;\r
+               dapl_dbg_log(DAPL_DBG_TYPE_EP, \r
+                            " post_snd_rdma: rkey 0x%x va %#016Lx\n",\r
+                            wr.wr.rdma.rkey, wr.wr.rdma.remote_addr);\r
+       }\r
+\r
+\r
+       /* inline data for send or write ops */\r
+       if ((total_len <= ibt_ptr->max_inline_send) && \r
+          ((op_type == OP_SEND) || (op_type == OP_RDMA_WRITE))) \r
+               wr.send_flags |= IBV_SEND_INLINE;\r
+       \r
+       /* set completion flags in work request */\r
+       wr.send_flags |= (DAT_COMPLETION_SUPPRESS_FLAG & \r
+                               completion_flags) ? 0 : IBV_SEND_SIGNALED;\r
+       wr.send_flags |= (DAT_COMPLETION_BARRIER_FENCE_FLAG & \r
+                               completion_flags) ? IBV_SEND_FENCE : 0;\r
+       wr.send_flags |= (DAT_COMPLETION_SOLICITED_WAIT_FLAG & \r
+                               completion_flags) ? IBV_SEND_SOLICITED : 0;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP, \r
+                    " post_snd: op 0x%x flags 0x%x sglist %p, %d\n", \r
+                    wr.opcode, wr.send_flags, wr.sg_list, wr.num_sge);\r
+\r
+       ret = ibv_post_send(ep_ptr->qp_handle, &wr, &bad_wr);\r
+\r
+       if (ret)\r
+               return(dapl_convert_errno(errno,"ibv_send"));\r
+\r
+#ifdef DAPL_COUNTERS\r
+       switch (op_type) {\r
+       case OP_SEND:\r
+               DAPL_CNTR(ep_ptr, DCNT_EP_POST_SEND);\r
+               DAPL_CNTR_DATA(ep_ptr, DCNT_EP_POST_SEND_DATA,total_len);\r
+               break;\r
+       case OP_RDMA_WRITE:\r
+               DAPL_CNTR(ep_ptr, DCNT_EP_POST_WRITE);\r
+               DAPL_CNTR_DATA(ep_ptr, DCNT_EP_POST_WRITE_DATA,total_len);\r
+               break;  \r
+       case OP_RDMA_READ:\r
+               DAPL_CNTR(ep_ptr, DCNT_EP_POST_READ);\r
+               DAPL_CNTR_DATA(ep_ptr, DCNT_EP_POST_READ_DATA,total_len);\r
+               break;\r
+       default:\r
+               break;\r
+       }\r
+#endif /* DAPL_COUNTERS */\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP," post_snd: returned\n");\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+/* map Work Completions to DAPL WR operations */\r
+STATIC _INLINE_ DAT_DTOS dapls_cqe_dtos_opcode(ib_work_completion_t *cqe_p)\r
+{\r
+       switch (cqe_p->opcode) {\r
+\r
+       case IBV_WC_SEND:\r
+#ifdef DAT_EXTENSIONS\r
+               if (CQE_WR_TYPE_UD(cqe_p->wr_id))\r
+                       return (DAT_IB_DTO_SEND_UD);\r
+               else\r
+#endif                 \r
+               return (DAT_DTO_SEND);\r
+       case IBV_WC_RDMA_READ:\r
+               return (DAT_DTO_RDMA_READ);\r
+       case IBV_WC_BIND_MW:\r
+               return (DAT_DTO_BIND_MW);\r
+#ifdef DAT_EXTENSIONS\r
+       case IBV_WC_RDMA_WRITE:\r
+               if (cqe_p->wc_flags & IBV_WC_WITH_IMM)\r
+                       return (DAT_IB_DTO_RDMA_WRITE_IMMED);\r
+               else\r
+                       return (DAT_DTO_RDMA_WRITE);\r
+       case IBV_WC_COMP_SWAP:\r
+               return (DAT_IB_DTO_CMP_SWAP);\r
+       case IBV_WC_FETCH_ADD:\r
+               return (DAT_IB_DTO_FETCH_ADD);\r
+       case IBV_WC_RECV_RDMA_WITH_IMM:\r
+               return (DAT_IB_DTO_RECV_IMMED);\r
+#else\r
+       case IBV_WC_RDMA_WRITE:\r
+               return (DAT_DTO_RDMA_WRITE);\r
+#endif\r
+       case IBV_WC_RECV:\r
+#ifdef DAT_EXTENSIONS\r
+               if (CQE_WR_TYPE_UD(cqe_p->wr_id)) \r
+                       return (DAT_IB_DTO_RECV_UD);\r
+               else if (cqe_p->wc_flags & IBV_WC_WITH_IMM)\r
+                       return (DAT_IB_DTO_RECV_MSG_IMMED);\r
+               else\r
+#endif \r
+               return (DAT_DTO_RECEIVE);\r
+       default:\r
+               return (0xff);\r
+       }\r
+}\r
+#define DAPL_GET_CQE_DTOS_OPTYPE(cqe_p) dapls_cqe_dtos_opcode(cqe_p)\r
+\r
+\r
+#ifdef DAT_EXTENSIONS\r
+/*\r
+ * dapls_ib_post_ext_send\r
+ *\r
+ * Provider specific extended Post SEND function for atomics\r
+ *     OP_COMP_AND_SWAP and OP_FETCH_AND_ADD\r
+ */\r
+STATIC _INLINE_ DAT_RETURN \r
+dapls_ib_post_ext_send (\r
+       IN  DAPL_EP                     *ep_ptr,\r
+       IN  ib_send_op_type_t           op_type,\r
+       IN  DAPL_COOKIE                 *cookie,\r
+       IN  DAT_COUNT                   segments,\r
+       IN  DAT_LMR_TRIPLET             *local_iov,\r
+       IN  const DAT_RMR_TRIPLET       *remote_iov,\r
+       IN  DAT_UINT32                  immed_data,\r
+       IN  DAT_UINT64                  compare_add,\r
+       IN  DAT_UINT64                  swap,\r
+       IN  DAT_COMPLETION_FLAGS        completion_flags,\r
+       IN  DAT_IB_ADDR_HANDLE          *remote_ah)\r
+{\r
+       struct ibv_send_wr wr;\r
+       struct ibv_send_wr *bad_wr;\r
+       ib_data_segment_t *ds = (ib_data_segment_t *)local_iov;\r
+       DAT_COUNT i, total_len;\r
+       int ret;\r
+       \r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+                    " post_ext_snd: ep %p op %d ck %p sgs",\r
+                    "%d l_iov %p r_iov %p f %d\n",\r
+                    ep_ptr, op_type, cookie, segments, local_iov, \r
+                    remote_iov, completion_flags, remote_ah);\r
+\r
+       /* setup the work request */\r
+       wr.next = 0;\r
+       wr.opcode = op_type;\r
+       wr.num_sge = segments;\r
+       wr.send_flags = 0;\r
+       wr.wr_id = (uint64_t)(uintptr_t)cookie;\r
+       wr.sg_list = ds;\r
+       total_len = 0;\r
+\r
+       if (cookie != NULL) {\r
+               for (i = 0; i < segments; i++ ) {\r
+                       dapl_dbg_log(DAPL_DBG_TYPE_EP, \r
+                                    " post_snd: lkey 0x%x va %p len %d\n",\r
+                                    ds->lkey, ds->addr, ds->length );\r
+                       total_len += ds->length;\r
+                       ds++;\r
+               }\r
+               cookie->val.dto.size = total_len;\r
+       }\r
+\r
+       switch (op_type) {\r
+       case OP_RDMA_WRITE_IMM:\r
+               /* OP_RDMA_WRITE)IMMED has direct IB wr_type mapping */\r
+               dapl_dbg_log(DAPL_DBG_TYPE_EP, \r
+                            " post_ext: rkey 0x%x va %#016Lx immed=0x%x\n",\r
+                            remote_iov?remote_iov->rmr_context:0, \r
+                            remote_iov?remote_iov->virtual_address:0,\r
+                            immed_data);\r
+\r
+               wr.imm_data = immed_data;\r
+               if (wr.num_sge) {\r
+                       wr.wr.rdma.remote_addr = remote_iov->virtual_address;\r
+                       wr.wr.rdma.rkey = remote_iov->rmr_context;\r
+               }\r
+               break;\r
+       case OP_COMP_AND_SWAP:\r
+               /* OP_COMP_AND_SWAP has direct IB wr_type mapping */\r
+               dapl_dbg_log(DAPL_DBG_TYPE_EP, \r
+                            " post_ext: OP_COMP_AND_SWAP=%lx,"\r
+                            "%lx rkey 0x%x va %#016Lx\n",\r
+                            compare_add, swap, remote_iov->rmr_context,\r
+                            remote_iov->virtual_address);\r
+               \r
+               wr.wr.atomic.compare_add = compare_add;\r
+               wr.wr.atomic.swap = swap;\r
+               wr.wr.atomic.remote_addr = remote_iov->virtual_address;\r
+               wr.wr.atomic.rkey = remote_iov->rmr_context;\r
+               break;\r
+       case OP_FETCH_AND_ADD:\r
+               /* OP_FETCH_AND_ADD has direct IB wr_type mapping */\r
+               dapl_dbg_log(DAPL_DBG_TYPE_EP, \r
+                            " post_ext: OP_FETCH_AND_ADD=%lx,"\r
+                            "%lx rkey 0x%x va %#016Lx\n",\r
+                            compare_add, remote_iov->rmr_context,\r
+                            remote_iov->virtual_address);\r
+\r
+               wr.wr.atomic.compare_add = compare_add;\r
+               wr.wr.atomic.remote_addr = remote_iov->virtual_address;\r
+               wr.wr.atomic.rkey = remote_iov->rmr_context;\r
+               break;\r
+       case OP_SEND_UD:\r
+               /* post must be on EP with service_type of UD */\r
+               if (ep_ptr->qp_handle->qp_type != IBV_QPT_UD)\r
+                       return(DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP));\r
+\r
+               dapl_dbg_log(DAPL_DBG_TYPE_EP, \r
+                            " post_ext: OP_SEND_UD ah=%p"\r
+                            " qp_num=0x%x\n",\r
+                            remote_ah, remote_ah->qpn);\r
+               \r
+               wr.opcode = OP_SEND;\r
+               wr.wr.ud.ah = remote_ah->ah;\r
+               wr.wr.ud.remote_qpn = remote_ah->qpn;\r
+               wr.wr.ud.remote_qkey = DAT_UD_QKEY;\r
+               break;\r
+       default:\r
+               break;\r
+       }\r
+\r
+       /* set completion flags in work request */\r
+       wr.send_flags |= (DAT_COMPLETION_SUPPRESS_FLAG & \r
+                               completion_flags) ? 0 : IBV_SEND_SIGNALED;\r
+       wr.send_flags |= (DAT_COMPLETION_BARRIER_FENCE_FLAG & \r
+                               completion_flags) ? IBV_SEND_FENCE : 0;\r
+       wr.send_flags |= (DAT_COMPLETION_SOLICITED_WAIT_FLAG & \r
+                               completion_flags) ? IBV_SEND_SOLICITED : 0;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP, \r
+                    " post_snd: op 0x%x flags 0x%x sglist %p, %d\n", \r
+                    wr.opcode, wr.send_flags, wr.sg_list, wr.num_sge);\r
+\r
+       ret = ibv_post_send(ep_ptr->qp_handle, &wr, &bad_wr);\r
+\r
+       if (ret)\r
+               return( dapl_convert_errno(errno,"ibv_send") );\r
+       \r
+#ifdef DAPL_COUNTERS\r
+       switch (op_type) {\r
+       case OP_RDMA_WRITE_IMM:\r
+               DAPL_CNTR(ep_ptr, DCNT_EP_POST_WRITE_IMM);\r
+               DAPL_CNTR_DATA(ep_ptr, \r
+                              DCNT_EP_POST_WRITE_IMM_DATA, total_len);\r
+               break;\r
+       case OP_COMP_AND_SWAP:\r
+               DAPL_CNTR(ep_ptr, DCNT_EP_POST_CMP_SWAP);\r
+               break;  \r
+       case OP_FETCH_AND_ADD:\r
+               DAPL_CNTR(ep_ptr, DCNT_EP_POST_FETCH_ADD);\r
+               break;\r
+       case OP_SEND_UD:\r
+               DAPL_CNTR(ep_ptr, DCNT_EP_POST_SEND_UD);\r
+               DAPL_CNTR_DATA(ep_ptr, DCNT_EP_POST_SEND_UD_DATA, total_len);\r
+               break;\r
+       default:\r
+               break;\r
+       }\r
+#endif /* DAPL_COUNTERS */\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP," post_snd: returned\n");\r
+        return DAT_SUCCESS;\r
+}\r
+#endif\r
+\r
+STATIC _INLINE_ DAT_RETURN \r
+dapls_ib_optional_prv_dat(\r
+       IN  DAPL_CR             *cr_ptr,\r
+       IN  const void          *event_data,\r
+       OUT   DAPL_CR           **cr_pp)\r
+{\r
+    return DAT_SUCCESS;\r
+}\r
+\r
+\r
+/* map Work Completions to DAPL WR operations */\r
+STATIC _INLINE_ int dapls_cqe_opcode(ib_work_completion_t *cqe_p)\r
+{\r
+#ifdef DAPL_COUNTERS\r
+       DAPL_COOKIE *cookie = (DAPL_COOKIE *)(uintptr_t)cqe_p->wr_id;\r
+#endif /* DAPL_COUNTERS */\r
+\r
+       switch (cqe_p->opcode) {\r
+       case IBV_WC_SEND:\r
+               if (CQE_WR_TYPE_UD(cqe_p->wr_id))\r
+                       return(OP_SEND_UD);\r
+               else\r
+                       return (OP_SEND);\r
+       case IBV_WC_RDMA_WRITE:\r
+               if (cqe_p->wc_flags & IBV_WC_WITH_IMM)\r
+                       return (OP_RDMA_WRITE_IMM);\r
+               else\r
+                       return (OP_RDMA_WRITE);\r
+       case IBV_WC_RDMA_READ:\r
+               return (OP_RDMA_READ);\r
+       case IBV_WC_COMP_SWAP:\r
+               return (OP_COMP_AND_SWAP);\r
+       case IBV_WC_FETCH_ADD:\r
+               return (OP_FETCH_AND_ADD);\r
+       case IBV_WC_BIND_MW:\r
+               return (OP_BIND_MW);\r
+       case IBV_WC_RECV:\r
+               if (CQE_WR_TYPE_UD(cqe_p->wr_id)) {\r
+                       DAPL_CNTR(cookie->ep, DCNT_EP_RECV_UD);\r
+                       DAPL_CNTR_DATA(cookie->ep, DCNT_EP_RECV_UD_DATA, \r
+                                      cqe_p->byte_len);\r
+                       return (OP_RECV_UD);\r
+               }\r
+               else if (cqe_p->wc_flags & IBV_WC_WITH_IMM) {\r
+                       DAPL_CNTR(cookie->ep, DCNT_EP_RECV_IMM);\r
+                       DAPL_CNTR_DATA(cookie->ep, DCNT_EP_RECV_IMM_DATA, \r
+                                      cqe_p->byte_len);\r
+                       return (OP_RECEIVE_IMM);\r
+               } else {\r
+                       DAPL_CNTR(cookie->ep, DCNT_EP_RECV);\r
+                       DAPL_CNTR_DATA(cookie->ep, DCNT_EP_RECV_DATA, \r
+                                      cqe_p->byte_len);\r
+                       return (OP_RECEIVE);\r
+               }\r
+       case IBV_WC_RECV_RDMA_WITH_IMM:\r
+               DAPL_CNTR(cookie->ep, DCNT_EP_RECV_RDMA_IMM);\r
+               DAPL_CNTR_DATA(cookie->ep, DCNT_EP_RECV_RDMA_IMM_DATA, \r
+                              cqe_p->byte_len);\r
+               return (OP_RECEIVE_IMM);\r
+       default:\r
+               return (OP_INVALID);\r
+       }\r
+}\r
+\r
+#define DAPL_GET_CQE_OPTYPE(cqe_p) dapls_cqe_opcode(cqe_p)\r
+#define DAPL_GET_CQE_WRID(cqe_p) ((ib_work_completion_t*)cqe_p)->wr_id\r
+#define DAPL_GET_CQE_STATUS(cqe_p) ((ib_work_completion_t*)cqe_p)->status\r
+#define DAPL_GET_CQE_VENDOR_ERR(cqe_p) ((ib_work_completion_t*)cqe_p)->vendor_err\r
+#define DAPL_GET_CQE_BYTESNUM(cqe_p) ((ib_work_completion_t*)cqe_p)->byte_len\r
+#define DAPL_GET_CQE_IMMED_DATA(cqe_p) ((ib_work_completion_t*)cqe_p)->imm_data\r
+\r
+STATIC _INLINE_ char * dapls_dto_op_str(int op)\r
+{\r
+    static char *optable[] =\r
+    {\r
+        "OP_RDMA_WRITE",\r
+        "OP_RDMA_WRITE_IMM",\r
+        "OP_SEND",\r
+        "OP_SEND_IMM",\r
+        "OP_RDMA_READ",\r
+        "OP_COMP_AND_SWAP",\r
+        "OP_FETCH_AND_ADD",\r
+        "OP_RECEIVE",\r
+        "OP_RECEIVE_MSG_IMM",\r
+       "OP_RECEIVE_RDMA_IMM",\r
+        "OP_BIND_MW"\r
+       "OP_SEND_UD"\r
+       "OP_RECV_UD"\r
+    };\r
+    return ((op < 0 || op > 12) ? "Invalid CQE OP?" : optable[op]);\r
+}\r
+\r
+static _INLINE_ char *\r
+dapls_cqe_op_str(IN ib_work_completion_t *cqe_ptr)\r
+{\r
+    return dapls_dto_op_str(DAPL_GET_CQE_OPTYPE(cqe_ptr));\r
+}\r
+\r
+#define DAPL_GET_CQE_OP_STR(cqe) dapls_cqe_op_str(cqe)\r
+\r
+#endif /*  _DAPL_IB_DTO_H_ */\r
diff --git a/branches/winverbs/ulp/dapl2/dapl/openib_common/ib_extensions.c b/branches/winverbs/ulp/dapl2/dapl/openib_common/ib_extensions.c
new file mode 100644 (file)
index 0000000..4dc46ff
--- /dev/null
@@ -0,0 +1,360 @@
+/*\r
+ * Copyright (c) 2007-2009 Intel Corporation.  All rights reserved.\r
+ *\r
+ * This Software is licensed under one of the following licenses:\r
+ *\r
+ * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
+ *    available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/cpl.php.\r
+ *\r
+ * 2) under the terms of the "The BSD License" a copy of which is\r
+ *    available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/bsd-license.php.\r
+ *\r
+ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
+ *    copy of which is available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/gpl-license.php.\r
+ *\r
+ * Licensee has the right to choose one of the above licenses.\r
+ *\r
+ * Redistributions of source code must retain the above copyright\r
+ * notice and one of the license notices.\r
+ *\r
+ * Redistributions in binary form must reproduce both the above copyright\r
+ * notice, one of the license notices in the documentation\r
+ * and/or other materials provided with the distribution.\r
+ */\r
+#include "dapl.h"\r
+#include "dapl_adapter_util.h"\r
+#include "dapl_evd_util.h"\r
+#include "dapl_ib_util.h"\r
+#include "dapl_ep_util.h"\r
+#include "dapl_cookie.h"\r
+#include <stdarg.h>\r
+\r
+DAT_RETURN\r
+dapli_post_ext(IN DAT_EP_HANDLE ep_handle,\r
+              IN DAT_UINT64 cmp_add,\r
+              IN DAT_UINT64 swap,\r
+              IN DAT_UINT32 immed_data,\r
+              IN DAT_COUNT segments,\r
+              IN DAT_LMR_TRIPLET * local_iov,\r
+              IN DAT_DTO_COOKIE user_cookie,\r
+              IN const DAT_RMR_TRIPLET * remote_iov,\r
+              IN int op_type,\r
+              IN DAT_COMPLETION_FLAGS flags, IN DAT_IB_ADDR_HANDLE * ah);\r
+\r
+/*\r
+ * dapl_extensions\r
+ *\r
+ * Process extension requests\r
+ *\r
+ * Input:\r
+ *     ext_type,\r
+ *     ...\r
+ *\r
+ * Output:\r
+ *     Depends....\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_NOT_IMPLEMENTED\r
+ *      .....\r
+ *\r
+ */\r
+DAT_RETURN\r
+dapl_extensions(IN DAT_HANDLE dat_handle,\r
+               IN DAT_EXTENDED_OP ext_op, IN va_list args)\r
+{\r
+       DAT_EP_HANDLE ep;\r
+       DAT_IB_ADDR_HANDLE *ah = NULL;\r
+       DAT_LMR_TRIPLET *lmr_p;\r
+       DAT_DTO_COOKIE cookie;\r
+       const DAT_RMR_TRIPLET *rmr_p;\r
+       DAT_UINT64 dat_uint64a, dat_uint64b;\r
+       DAT_UINT32 dat_uint32;\r
+       DAT_COUNT segments = 1;\r
+       DAT_COMPLETION_FLAGS comp_flags;\r
+       DAT_RETURN status = DAT_NOT_IMPLEMENTED;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_API,\r
+                    "dapl_extensions(hdl %p operation %d, ...)\n",\r
+                    dat_handle, ext_op);\r
+\r
+       switch ((int)ext_op) {\r
+\r
+       case DAT_IB_RDMA_WRITE_IMMED_OP:\r
+               dapl_dbg_log(DAPL_DBG_TYPE_RTN,\r
+                            " WRITE_IMMED_DATA extension call\n");\r
+\r
+               ep = dat_handle;        /* ep_handle */\r
+               segments = va_arg(args, DAT_COUNT);     /* num segments */\r
+               lmr_p = va_arg(args, DAT_LMR_TRIPLET *);\r
+               cookie = va_arg(args, DAT_DTO_COOKIE);\r
+               rmr_p = va_arg(args, const DAT_RMR_TRIPLET *);\r
+               dat_uint32 = va_arg(args, DAT_UINT32);  /* immed data */\r
+               comp_flags = va_arg(args, DAT_COMPLETION_FLAGS);\r
+\r
+               status = dapli_post_ext(ep, 0, 0, dat_uint32, segments, lmr_p,\r
+                                       cookie, rmr_p, OP_RDMA_WRITE_IMM,\r
+                                       comp_flags, ah);\r
+               break;\r
+\r
+       case DAT_IB_CMP_AND_SWAP_OP:\r
+               dapl_dbg_log(DAPL_DBG_TYPE_RTN,\r
+                            " CMP_AND_SWAP extension call\n");\r
+\r
+               ep = dat_handle;        /* ep_handle */\r
+               dat_uint64a = va_arg(args, DAT_UINT64); /* cmp_value */\r
+               dat_uint64b = va_arg(args, DAT_UINT64); /* swap_value */\r
+               lmr_p = va_arg(args, DAT_LMR_TRIPLET *);\r
+               cookie = va_arg(args, DAT_DTO_COOKIE);\r
+               rmr_p = va_arg(args, const DAT_RMR_TRIPLET *);\r
+               comp_flags = va_arg(args, DAT_COMPLETION_FLAGS);\r
+\r
+               status = dapli_post_ext(ep, dat_uint64a, dat_uint64b,\r
+                                       0, segments, lmr_p, cookie, rmr_p,\r
+                                       OP_COMP_AND_SWAP, comp_flags, ah);\r
+               break;\r
+\r
+       case DAT_IB_FETCH_AND_ADD_OP:\r
+               dapl_dbg_log(DAPL_DBG_TYPE_RTN,\r
+                            " FETCH_AND_ADD extension call\n");\r
+\r
+               ep = dat_handle;        /* ep_handle */\r
+               dat_uint64a = va_arg(args, DAT_UINT64); /* add value */\r
+               lmr_p = va_arg(args, DAT_LMR_TRIPLET *);\r
+               cookie = va_arg(args, DAT_DTO_COOKIE);\r
+               rmr_p = va_arg(args, const DAT_RMR_TRIPLET *);\r
+               comp_flags = va_arg(args, DAT_COMPLETION_FLAGS);\r
+\r
+               status = dapli_post_ext(ep, dat_uint64a, 0, 0, segments,\r
+                                       lmr_p, cookie, rmr_p,\r
+                                       OP_FETCH_AND_ADD, comp_flags, ah);\r
+               break;\r
+\r
+       case DAT_IB_UD_SEND_OP:\r
+               dapl_dbg_log(DAPL_DBG_TYPE_RTN,\r
+                            " UD post_send extension call\n");\r
+\r
+               ep = dat_handle;        /* ep_handle */\r
+               segments = va_arg(args, DAT_COUNT);     /* segments */\r
+               lmr_p = va_arg(args, DAT_LMR_TRIPLET *);\r
+               ah = va_arg(args, DAT_IB_ADDR_HANDLE *);\r
+               cookie = va_arg(args, DAT_DTO_COOKIE);\r
+               comp_flags = va_arg(args, DAT_COMPLETION_FLAGS);\r
+\r
+               status = dapli_post_ext(ep, 0, 0, 0, segments,\r
+                                       lmr_p, cookie, NULL,\r
+                                       OP_SEND_UD, comp_flags, ah);\r
+               break;\r
+\r
+#ifdef DAPL_COUNTERS\r
+       case DAT_QUERY_COUNTERS_OP:\r
+               {\r
+                       int cntr, reset;\r
+                       DAT_UINT64 *p_cntr_out;\r
+\r
+                       dapl_dbg_log(DAPL_DBG_TYPE_RTN,\r
+                                    " Query counter extension call\n");\r
+\r
+                       cntr = va_arg(args, int);\r
+                       p_cntr_out = va_arg(args, DAT_UINT64 *);\r
+                       reset = va_arg(args, int);\r
+\r
+                       status = dapl_query_counter(dat_handle, cntr,\r
+                                                   p_cntr_out, reset);\r
+                       break;\r
+               }\r
+       case DAT_PRINT_COUNTERS_OP:\r
+               {\r
+                       int cntr, reset;\r
+\r
+                       dapl_dbg_log(DAPL_DBG_TYPE_RTN,\r
+                                    " Print counter extension call\n");\r
+\r
+                       cntr = va_arg(args, int);\r
+                       reset = va_arg(args, int);\r
+\r
+                       dapl_print_counter(dat_handle, cntr, reset);\r
+                       status = DAT_SUCCESS;\r
+                       break;\r
+               }\r
+#endif                         /* DAPL_COUNTERS */\r
+\r
+       default:\r
+               dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
+                            "unsupported extension(%d)\n", (int)ext_op);\r
+       }\r
+\r
+       return (status);\r
+}\r
+\r
+DAT_RETURN\r
+dapli_post_ext(IN DAT_EP_HANDLE ep_handle,\r
+              IN DAT_UINT64 cmp_add,\r
+              IN DAT_UINT64 swap,\r
+              IN DAT_UINT32 immed_data,\r
+              IN DAT_COUNT segments,\r
+              IN DAT_LMR_TRIPLET * local_iov,\r
+              IN DAT_DTO_COOKIE user_cookie,\r
+              IN const DAT_RMR_TRIPLET * remote_iov,\r
+              IN int op_type,\r
+              IN DAT_COMPLETION_FLAGS flags, IN DAT_IB_ADDR_HANDLE * ah)\r
+{\r
+       DAPL_EP *ep_ptr;\r
+       ib_qp_handle_t qp_ptr;\r
+       DAPL_COOKIE *cookie = NULL;\r
+       DAT_RETURN dat_status = DAT_SUCCESS;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_API,\r
+                    " post_ext_op: ep %p cmp_val %d "\r
+                    "swap_val %d cookie 0x%x, r_iov %p, flags 0x%x, ah %p\n",\r
+                    ep_handle, (unsigned)cmp_add, (unsigned)swap,\r
+                    (unsigned)user_cookie.as_64, remote_iov, flags, ah);\r
+\r
+       if (DAPL_BAD_HANDLE(ep_handle, DAPL_MAGIC_EP))\r
+               return (DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP));\r
+\r
+       ep_ptr = (DAPL_EP *) ep_handle;\r
+       qp_ptr = ep_ptr->qp_handle;\r
+\r
+       /*\r
+        * Synchronization ok since this buffer is only used for send\r
+        * requests, which aren't allowed to race with each other.\r
+        */\r
+       dat_status = dapls_dto_cookie_alloc(&ep_ptr->req_buffer,\r
+                                           DAPL_DTO_TYPE_EXTENSION,\r
+                                           user_cookie, &cookie);\r
+       if (dat_status != DAT_SUCCESS)\r
+               goto bail;\r
+\r
+       /*\r
+        * Take reference before posting to avoid race conditions with\r
+        * completions\r
+        */\r
+       dapl_os_atomic_inc(&ep_ptr->req_count);\r
+\r
+       /*\r
+        * Invoke provider specific routine to post DTO\r
+        */\r
+       dat_status = dapls_ib_post_ext_send(ep_ptr, op_type, cookie, segments,  /* data segments */\r
+                                           local_iov, remote_iov, immed_data,  /* immed data */\r
+                                           cmp_add,    /* compare or add */\r
+                                           swap,       /* swap */\r
+                                           flags, ah);\r
+\r
+       if (dat_status != DAT_SUCCESS) {\r
+               dapl_os_atomic_dec(&ep_ptr->req_count);\r
+               dapls_cookie_dealloc(&ep_ptr->req_buffer, cookie);\r
+       }\r
+\r
+      bail:\r
+       return dat_status;\r
+\r
+}\r
+\r
+/* \r
+ * New provider routine to process extended DTO events \r
+ */\r
+void\r
+dapls_cqe_to_event_extension(IN DAPL_EP * ep_ptr,\r
+                            IN DAPL_COOKIE * cookie,\r
+                            IN ib_work_completion_t * cqe_ptr,\r
+                            IN DAT_EVENT * event_ptr)\r
+{\r
+       uint32_t ibtype;\r
+       DAT_DTO_COMPLETION_EVENT_DATA *dto =\r
+           &event_ptr->event_data.dto_completion_event_data;\r
+       DAT_IB_EXTENSION_EVENT_DATA *ext_data = (DAT_IB_EXTENSION_EVENT_DATA *)\r
+           & event_ptr->event_extension_data[0];\r
+       DAT_DTO_COMPLETION_STATUS dto_status;\r
+\r
+       /* Get status from cqe */\r
+       dto_status = dapls_ib_get_dto_status(cqe_ptr);\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EVD,\r
+                    " cqe_to_event_ext: dto_ptr %p ext_ptr %p status %d\n",\r
+                    dto, ext_data, dto_status);\r
+\r
+       event_ptr->event_number = DAT_IB_DTO_EVENT;\r
+       dto->ep_handle = cookie->ep;\r
+       dto->user_cookie = cookie->val.dto.cookie;\r
+       dto->operation = DAPL_GET_CQE_DTOS_OPTYPE(cqe_ptr);     /* new for 2.0 */\r
+       dto->status = ext_data->status = dto_status;\r
+\r
+       if (dto_status != DAT_DTO_SUCCESS)\r
+               return;\r
+\r
+       /* \r
+        * Get operation type from CQ work completion entry and\r
+        * if extented operation then set extended event data\r
+        */\r
+       ibtype = DAPL_GET_CQE_OPTYPE(cqe_ptr);\r
+\r
+       switch (ibtype) {\r
+\r
+       case OP_RDMA_WRITE_IMM:\r
+               dapl_dbg_log(DAPL_DBG_TYPE_EVD,\r
+                            " cqe_to_event_ext: OP_RDMA_WRITE_IMMED\n");\r
+\r
+               /* type and outbound rdma write transfer size */\r
+               dto->transfered_length = cookie->val.dto.size;\r
+               ext_data->type = DAT_IB_RDMA_WRITE_IMMED;\r
+               break;\r
+       case OP_RECEIVE_IMM:\r
+               dapl_dbg_log(DAPL_DBG_TYPE_EVD,\r
+                            " cqe_to_event_ext: OP_RECEIVE_RDMA_IMMED\n");\r
+\r
+               /* immed recvd, type and inbound rdma write transfer size */\r
+               dto->transfered_length = DAPL_GET_CQE_BYTESNUM(cqe_ptr);\r
+               ext_data->type = DAT_IB_RDMA_WRITE_IMMED_DATA;\r
+               ext_data->val.immed.data = DAPL_GET_CQE_IMMED_DATA(cqe_ptr);\r
+               break;\r
+       case OP_RECEIVE_MSG_IMM:\r
+               dapl_dbg_log(DAPL_DBG_TYPE_EVD,\r
+                            " cqe_to_event_ext: OP_RECEIVE_MSG_IMMED\n");\r
+\r
+               /* immed recvd, type and inbound recv message transfer size */\r
+               dto->transfered_length = DAPL_GET_CQE_BYTESNUM(cqe_ptr);\r
+               ext_data->type = DAT_IB_RECV_IMMED_DATA;\r
+               ext_data->val.immed.data = DAPL_GET_CQE_IMMED_DATA(cqe_ptr);\r
+               break;\r
+       case OP_COMP_AND_SWAP:\r
+               dapl_dbg_log(DAPL_DBG_TYPE_EVD,\r
+                            " cqe_to_event_ext: COMP_AND_SWAP_RESP\n");\r
+\r
+               /* original data is returned in LMR provided with post */\r
+               ext_data->type = DAT_IB_CMP_AND_SWAP;\r
+               dto->transfered_length = DAPL_GET_CQE_BYTESNUM(cqe_ptr);\r
+               break;\r
+       case OP_FETCH_AND_ADD:\r
+               dapl_dbg_log(DAPL_DBG_TYPE_EVD,\r
+                            " cqe_to_event_ext: FETCH_AND_ADD_RESP\n");\r
+\r
+               /* original data is returned in LMR provided with post */\r
+               ext_data->type = DAT_IB_FETCH_AND_ADD;\r
+               dto->transfered_length = DAPL_GET_CQE_BYTESNUM(cqe_ptr);\r
+               break;\r
+       case OP_SEND_UD:\r
+               dapl_dbg_log(DAPL_DBG_TYPE_EVD, " cqe_to_event_ext: UD_SEND\n");\r
+\r
+               /* type and outbound send transfer size */\r
+               ext_data->type = DAT_IB_UD_SEND;\r
+               dto->transfered_length = cookie->val.dto.size;\r
+               break;\r
+       case OP_RECV_UD:\r
+               dapl_dbg_log(DAPL_DBG_TYPE_EVD, " cqe_to_event_ext: UD_RECV\n");\r
+\r
+               /* type and inbound recv message transfer size */\r
+               ext_data->type = DAT_IB_UD_RECV;\r
+               dto->transfered_length = DAPL_GET_CQE_BYTESNUM(cqe_ptr);\r
+               break;\r
+\r
+       default:\r
+               /* not extended operation */\r
+               ext_data->status = DAT_IB_OP_ERR;\r
+               dto->status = DAT_DTO_ERR_TRANSPORT;\r
+               break;\r
+       }\r
+}\r
diff --git a/branches/winverbs/ulp/dapl2/dapl/openib_common/mem.c b/branches/winverbs/ulp/dapl2/dapl/openib_common/mem.c
new file mode 100644 (file)
index 0000000..2e33cac
--- /dev/null
@@ -0,0 +1,370 @@
+/*\r
+ * Copyright (c) 2005-2007 Intel Corporation.  All rights reserved.\r
+ *\r
+ * This Software is licensed under one of the following licenses:\r
+ * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
+ *    available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/cpl.php.\r
+ *\r
+ * 2) under the terms of the "The BSD License" a copy of which is\r
+ *    available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/bsd-license.php.\r
+ *\r
+ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
+ *    copy of which is available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/gpl-license.php.\r
+ *\r
+ * Licensee has the right to choose one of the above licenses.\r
+ *\r
+ * Redistributions of source code must retain the above copyright\r
+ * notice and one of the license notices.\r
+ *\r
+ * Redistributions in binary form must reproduce both the above copyright\r
+ * notice, one of the license notices in the documentation\r
+ * and/or other materials provided with the distribution.\r
+ */\r
+#include "dapl.h"\r
+#include "dapl_adapter_util.h"\r
+#include "dapl_lmr_util.h"\r
+\r
+/*\r
+ * dapls_convert_privileges\r
+ *\r
+ * Convert LMR privileges to provider  \r
+ *\r
+ * Input:\r
+ *     DAT_MEM_PRIV_FLAGS\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     ibv_access_flags\r
+ *\r
+ */\r
+STATIC _INLINE_ int dapls_convert_privileges(IN DAT_MEM_PRIV_FLAGS privileges)\r
+{\r
+       int access = 0;\r
+\r
+       /*\r
+        * if (DAT_MEM_PRIV_LOCAL_READ_FLAG & privileges) do nothing\r
+        */\r
+       if (DAT_MEM_PRIV_LOCAL_WRITE_FLAG & privileges)\r
+               access |= IBV_ACCESS_LOCAL_WRITE;\r
+       if (DAT_MEM_PRIV_REMOTE_WRITE_FLAG & privileges)\r
+               access |= IBV_ACCESS_REMOTE_WRITE;\r
+       if (DAT_MEM_PRIV_REMOTE_READ_FLAG & privileges)\r
+               access |= IBV_ACCESS_REMOTE_READ;\r
+       if (DAT_MEM_PRIV_REMOTE_READ_FLAG & privileges)\r
+               access |= IBV_ACCESS_REMOTE_READ;\r
+       if (DAT_MEM_PRIV_REMOTE_READ_FLAG & privileges)\r
+               access |= IBV_ACCESS_REMOTE_READ;\r
+#ifdef DAT_EXTENSIONS\r
+       if (DAT_IB_MEM_PRIV_REMOTE_ATOMIC & privileges)\r
+               access |= IBV_ACCESS_REMOTE_ATOMIC;\r
+#endif\r
+\r
+       return access;\r
+}\r
+\r
+/*\r
+ * dapl_ib_pd_alloc\r
+ *\r
+ * Alloc a PD\r
+ *\r
+ * Input:\r
+ *     ia_handle       IA handle\r
+ *     pz              pointer to PZ struct\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_INSUFFICIENT_RESOURCES\r
+ *\r
+ */\r
+DAT_RETURN dapls_ib_pd_alloc(IN DAPL_IA * ia_ptr, IN DAPL_PZ * pz)\r
+{\r
+       /* get a protection domain */\r
+       pz->pd_handle = ibv_alloc_pd(ia_ptr->hca_ptr->ib_hca_handle);\r
+       if (!pz->pd_handle)\r
+               return (dapl_convert_errno(ENOMEM, "alloc_pd"));\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                    " pd_alloc: pd_handle=%p\n", pz->pd_handle);\r
+\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+/*\r
+ * dapl_ib_pd_free\r
+ *\r
+ * Free a PD\r
+ *\r
+ * Input:\r
+ *     ia_handle       IA handle\r
+ *     PZ_ptr          pointer to PZ struct\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *      DAT_INVALID_STATE\r
+ *\r
+ */\r
+DAT_RETURN dapls_ib_pd_free(IN DAPL_PZ * pz)\r
+{\r
+       if (pz->pd_handle != IB_INVALID_HANDLE) {\r
+               if (ibv_dealloc_pd(pz->pd_handle))\r
+                       return (dapl_convert_errno(errno, "ibv_dealloc_pd"));\r
+               pz->pd_handle = IB_INVALID_HANDLE;\r
+       }\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+/*\r
+ * dapl_ib_mr_register\r
+ *\r
+ * Register a virtual memory region\r
+ *\r
+ * Input:\r
+ *     ia_handle       IA handle\r
+ *     lmr             pointer to dapl_lmr struct\r
+ *     virt_addr       virtual address of beginning of mem region\r
+ *     length          length of memory region\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_INSUFFICIENT_RESOURCES\r
+ *\r
+ */\r
+DAT_RETURN\r
+dapls_ib_mr_register(IN DAPL_IA * ia_ptr,\r
+                    IN DAPL_LMR * lmr,\r
+                    IN DAT_PVOID virt_addr,\r
+                    IN DAT_VLEN length,\r
+                    IN DAT_MEM_PRIV_FLAGS privileges, IN DAT_VA_TYPE va_type)\r
+{\r
+       ib_pd_handle_t ib_pd_handle;\r
+       struct ibv_device *ibv_dev = ia_ptr->hca_ptr->ib_hca_handle->device;\r
+\r
+       ib_pd_handle = ((DAPL_PZ *) lmr->param.pz_handle)->pd_handle;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                    " mr_register: ia=%p, lmr=%p va=%p ln=%d pv=0x%x\n",\r
+                    ia_ptr, lmr, virt_addr, length, privileges);\r
+\r
+       /* TODO: shared memory */\r
+       if (lmr->param.mem_type == DAT_MEM_TYPE_SHARED_VIRTUAL) {\r
+               dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
+                            " mr_register_shared: NOT IMPLEMENTED\n");\r
+               return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);\r
+       }\r
+\r
+       /* iWARP only support */\r
+       if ((va_type == DAT_VA_TYPE_ZB) &&\r
+           (ibv_dev->transport_type != IBV_TRANSPORT_IWARP)) {\r
+               dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
+                            " va_type == DAT_VA_TYPE_ZB: NOT SUPPORTED\n");\r
+               return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);\r
+       }\r
+\r
+       /* local read is default on IB */\r
+       lmr->mr_handle =\r
+           ibv_reg_mr(((DAPL_PZ *) lmr->param.pz_handle)->pd_handle,\r
+                      virt_addr, length, dapls_convert_privileges(privileges));\r
+\r
+       if (!lmr->mr_handle)\r
+               return (dapl_convert_errno(ENOMEM, "reg_mr"));\r
+\r
+       lmr->param.lmr_context = lmr->mr_handle->lkey;\r
+       lmr->param.rmr_context = lmr->mr_handle->rkey;\r
+       lmr->param.registered_size = length;\r
+       lmr->param.registered_address = (DAT_VADDR) (uintptr_t) virt_addr;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                    " mr_register: mr=%p addr=%p pd %p ctx %p "\r
+                    "lkey=0x%x rkey=0x%x priv=%x\n",\r
+                    lmr->mr_handle, lmr->mr_handle->addr,\r
+                    lmr->mr_handle->pd, lmr->mr_handle->context,\r
+                    lmr->mr_handle->lkey, lmr->mr_handle->rkey,\r
+                    length, dapls_convert_privileges(privileges));\r
+\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+/*\r
+ * dapl_ib_mr_deregister\r
+ *\r
+ * Free a memory region\r
+ *\r
+ * Input:\r
+ *     lmr                     pointer to dapl_lmr struct\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_INVALID_STATE\r
+ *\r
+ */\r
+DAT_RETURN dapls_ib_mr_deregister(IN DAPL_LMR * lmr)\r
+{\r
+       if (lmr->mr_handle != IB_INVALID_HANDLE) {\r
+               if (ibv_dereg_mr(lmr->mr_handle))\r
+                       return (dapl_convert_errno(errno, "dereg_pd"));\r
+               lmr->mr_handle = IB_INVALID_HANDLE;\r
+       }\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+/*\r
+ * dapl_ib_mr_register_shared\r
+ *\r
+ * Register a virtual memory region\r
+ *\r
+ * Input:\r
+ *     ia_ptr          IA handle\r
+ *     lmr             pointer to dapl_lmr struct\r
+ *     privileges      \r
+ *     va_type         \r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_INSUFFICIENT_RESOURCES\r
+ *\r
+ */\r
+DAT_RETURN\r
+dapls_ib_mr_register_shared(IN DAPL_IA * ia_ptr,\r
+                           IN DAPL_LMR * lmr,\r
+                           IN DAT_MEM_PRIV_FLAGS privileges,\r
+                           IN DAT_VA_TYPE va_type)\r
+{\r
+       dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
+                    " mr_register_shared: NOT IMPLEMENTED\n");\r
+\r
+       return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);\r
+}\r
+\r
+/*\r
+ * dapls_ib_mw_alloc\r
+ *\r
+ * Bind a protection domain to a memory window\r
+ *\r
+ * Input:\r
+ *     rmr     Initialized rmr to hold binding handles\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_INSUFFICIENT_RESOURCES\r
+ *\r
+ */\r
+DAT_RETURN dapls_ib_mw_alloc(IN DAPL_RMR * rmr)\r
+{\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_ERR, " mw_alloc: NOT IMPLEMENTED\n");\r
+\r
+       return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);\r
+}\r
+\r
+/*\r
+ * dapls_ib_mw_free\r
+ *\r
+ * Release bindings of a protection domain to a memory window\r
+ *\r
+ * Input:\r
+ *     rmr     Initialized rmr to hold binding handles\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_INVALID_STATE\r
+ *\r
+ */\r
+DAT_RETURN dapls_ib_mw_free(IN DAPL_RMR * rmr)\r
+{\r
+       dapl_dbg_log(DAPL_DBG_TYPE_ERR, " mw_free: NOT IMPLEMENTED\n");\r
+\r
+       return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);\r
+}\r
+\r
+/*\r
+ * dapls_ib_mw_bind\r
+ *\r
+ * Bind a protection domain to a memory window\r
+ *\r
+ * Input:\r
+ *     rmr     Initialized rmr to hold binding handles\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_INVALID_PARAMETER;\r
+ *     DAT_INSUFFICIENT_RESOURCES\r
+ *\r
+ */\r
+DAT_RETURN\r
+dapls_ib_mw_bind(IN DAPL_RMR * rmr,\r
+                IN DAPL_LMR * lmr,\r
+                IN DAPL_EP * ep,\r
+                IN DAPL_COOKIE * cookie,\r
+                IN DAT_VADDR virtual_address,\r
+                IN DAT_VLEN length,\r
+                IN DAT_MEM_PRIV_FLAGS mem_priv, IN DAT_BOOLEAN is_signaled)\r
+{\r
+       dapl_dbg_log(DAPL_DBG_TYPE_ERR, " mw_bind: NOT IMPLEMENTED\n");\r
+\r
+       return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);\r
+}\r
+\r
+/*\r
+ * dapls_ib_mw_unbind\r
+ *\r
+ * Unbind a protection domain from a memory window\r
+ *\r
+ * Input:\r
+ *     rmr     Initialized rmr to hold binding handles\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_INVALID_PARAMETER;\r
+ *     DAT_INVALID_STATE;\r
+ *     DAT_INSUFFICIENT_RESOURCES\r
+ *\r
+ */\r
+DAT_RETURN\r
+dapls_ib_mw_unbind(IN DAPL_RMR * rmr,\r
+                  IN DAPL_EP * ep,\r
+                  IN DAPL_COOKIE * cookie, IN DAT_BOOLEAN is_signaled)\r
+{\r
+       dapl_dbg_log(DAPL_DBG_TYPE_ERR, " mw_unbind: NOT IMPLEMENTED\n");\r
+\r
+       return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);\r
+}\r
+\r
+/*\r
+ * Local variables:\r
+ *  c-indent-level: 4\r
+ *  c-basic-offset: 4\r
+ *  tab-width: 8\r
+ * End:\r
+ */\r
diff --git a/branches/winverbs/ulp/dapl2/dapl/openib_common/qp.c b/branches/winverbs/ulp/dapl2/dapl/openib_common/qp.c
new file mode 100644 (file)
index 0000000..ffff25b
--- /dev/null
@@ -0,0 +1,515 @@
+/*\r
+ * This Software is licensed under one of the following licenses:\r
+ *\r
+ * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
+ *    available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/cpl.php.\r
+ *\r
+ * 2) under the terms of the "The BSD License" a copy of which is\r
+ *    available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/bsd-license.php.\r
+ *\r
+ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
+ *    copy of which is available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/gpl-license.php.\r
+ *\r
+ * Licensee has the right to choose one of the above licenses.\r
+ *\r
+ * Redistributions of source code must retain the above copyright\r
+ * notice and one of the license notices.\r
+ *\r
+ * Redistributions in binary form must reproduce both the above copyright\r
+ * notice, one of the license notices in the documentation\r
+ * and/or other materials provided with the distribution.\r
+ */\r
+#include "dapl.h"\r
+#include "dapl_adapter_util.h"\r
+\r
+/*\r
+ * dapl_ib_qp_alloc\r
+ *\r
+ * Alloc a QP\r
+ *\r
+ * Input:\r
+ *     *ep_ptr         pointer to EP INFO\r
+ *     ib_hca_handle   provider HCA handle\r
+ *     ib_pd_handle    provider protection domain handle\r
+ *     cq_recv         provider recv CQ handle\r
+ *     cq_send         provider send CQ handle\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_INSUFFICIENT_RESOURCES\r
+ *     DAT_INTERNAL_ERROR\r
+ *\r
+ */\r
+DAT_RETURN\r
+dapls_ib_qp_alloc(IN DAPL_IA * ia_ptr,\r
+                 IN DAPL_EP * ep_ptr, IN DAPL_EP * ep_ctx_ptr)\r
+{\r
+       DAT_EP_ATTR *attr;\r
+       DAPL_EVD *rcv_evd, *req_evd;\r
+       ib_cq_handle_t rcv_cq, req_cq;\r
+       ib_pd_handle_t ib_pd_handle;\r
+       struct ibv_qp_init_attr qp_create;\r
+#ifdef _OPENIB_CMA_\r
+       dp_ib_cm_handle_t conn;\r
+#endif\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+                    " qp_alloc: ia_ptr %p ep_ptr %p ep_ctx_ptr %p\n",\r
+                    ia_ptr, ep_ptr, ep_ctx_ptr);\r
+\r
+       attr = &ep_ptr->param.ep_attr;\r
+       ib_pd_handle = ((DAPL_PZ *) ep_ptr->param.pz_handle)->pd_handle;\r
+       rcv_evd = (DAPL_EVD *) ep_ptr->param.recv_evd_handle;\r
+       req_evd = (DAPL_EVD *) ep_ptr->param.request_evd_handle;\r
+\r
+       /* \r
+        * DAT allows usage model of EP's with no EVD's but IB does not. \r
+        * Create a CQ with zero entries under the covers to support and \r
+        * catch any invalid posting. \r
+        */\r
+       if (rcv_evd != DAT_HANDLE_NULL)\r
+               rcv_cq = rcv_evd->ib_cq_handle;\r
+       else if (!ia_ptr->hca_ptr->ib_trans.ib_cq_empty)\r
+               rcv_cq = ia_ptr->hca_ptr->ib_trans.ib_cq_empty;\r
+       else {\r
+               struct ibv_comp_channel *channel = \r
+                               rcv_evd->cq_wait_obj_handle;\r
+                 \r
+               /* Call IB verbs to create CQ */\r
+               rcv_cq = ibv_create_cq(ia_ptr->hca_ptr->ib_hca_handle,\r
+                                      0, NULL, channel, 0);\r
+\r
+               if (rcv_cq == IB_INVALID_HANDLE)\r
+                       return (dapl_convert_errno(ENOMEM, "create_cq"));\r
+\r
+               ia_ptr->hca_ptr->ib_trans.ib_cq_empty = rcv_cq;\r
+       }\r
+       if (req_evd != DAT_HANDLE_NULL)\r
+               req_cq = req_evd->ib_cq_handle;\r
+       else\r
+               req_cq = ia_ptr->hca_ptr->ib_trans.ib_cq_empty;\r
+\r
+       /* \r
+        * IMPLEMENTATION NOTE:\r
+        * uDAPL allows consumers to post buffers on the EP after creation\r
+        * and before a connect request (outbound and inbound). This forces\r
+        * a binding to a device during the hca_open call and requires the\r
+        * consumer to predetermine which device to listen on or connect from.\r
+        * This restriction eliminates any option of listening or connecting \r
+        * over multiple devices. uDAPL should add API's to resolve addresses \r
+        * and bind to the device at the approriate time (before connect \r
+        * and after CR arrives). Discovery should happen at connection time \r
+        * based on addressing and not on static configuration during open.\r
+        */\r
+\r
+#ifdef _OPENIB_CMA_\r
+       /* Allocate CM and initialize lock */\r
+       if ((conn = dapls_ib_cm_create(ep_ptr)) == NULL)\r
+               return (dapl_convert_errno(ENOMEM, "create_cq"));\r
+\r
+       /* open identifies the local device; per DAT specification */\r
+       if (rdma_bind_addr(conn->cm_id,\r
+                          (struct sockaddr *)&ia_ptr->hca_ptr->hca_address))\r
+               return (dapl_convert_errno(EAFNOSUPPORT, "create_cq"));\r
+#endif\r
+       /* Setup attributes and create qp */\r
+       dapl_os_memzero((void *)&qp_create, sizeof(qp_create));\r
+       qp_create.send_cq = req_cq;\r
+       qp_create.cap.max_send_wr = attr->max_request_dtos;\r
+       qp_create.cap.max_send_sge = attr->max_request_iov;\r
+       qp_create.cap.max_inline_data =\r
+           ia_ptr->hca_ptr->ib_trans.max_inline_send;\r
+       qp_create.qp_type = IBV_QPT_RC;\r
+       qp_create.qp_context = (void *)ep_ptr;\r
+\r
+#ifdef DAT_EXTENSIONS \r
+       if (attr->service_type == DAT_IB_SERVICE_TYPE_UD) {\r
+#ifdef _OPENIB_CMA_\r
+               return (DAT_NOT_IMPLEMENTED);\r
+#endif\r
+               qp_create.qp_type = IBV_QPT_UD;\r
+               if (attr->max_message_size >\r
+                   (128 << ia_ptr->hca_ptr->ib_trans.mtu)) {\r
+                       return (DAT_INVALID_PARAMETER | DAT_INVALID_ARG6);\r
+               }\r
+       }\r
+#endif\r
+       \r
+       /* ibv assumes rcv_cq is never NULL, set to req_cq */\r
+       if (rcv_cq == NULL) {\r
+               qp_create.recv_cq = req_cq;\r
+               qp_create.cap.max_recv_wr = 0;\r
+               qp_create.cap.max_recv_sge = 0;\r
+       } else {\r
+               qp_create.recv_cq = rcv_cq;\r
+               qp_create.cap.max_recv_wr = attr->max_recv_dtos;\r
+               qp_create.cap.max_recv_sge = attr->max_recv_iov;\r
+       }\r
+\r
+#ifdef _OPENIB_CMA_\r
+       if (rdma_create_qp(conn->cm_id, ib_pd_handle, &qp_create)) {\r
+               dapls_ib_cm_free(conn, ep_ptr);\r
+               return (dapl_convert_errno(errno, "create_qp"));\r
+       }\r
+       ep_ptr->qp_handle = conn->cm_id->qp;\r
+       ep_ptr->cm_handle = conn;\r
+       ep_ptr->qp_state = IBV_QPS_INIT;\r
+               \r
+       /* setup up ep->param to reference the bound local address and port */\r
+       ep_ptr->param.local_ia_address_ptr = \r
+               &conn->cm_id->route.addr.src_addr;\r
+       ep_ptr->param.local_port_qual = rdma_get_src_port(conn->cm_id);\r
+#else\r
+       ep_ptr->qp_handle = ibv_create_qp(ib_pd_handle, &qp_create);\r
+       if (!ep_ptr->qp_handle)\r
+               return (dapl_convert_errno(ENOMEM, "create_qp"));\r
+               \r
+       /* Setup QP attributes for INIT state on the way out */\r
+       if (dapls_modify_qp_state(ep_ptr->qp_handle,\r
+                                 IBV_QPS_INIT, NULL) != DAT_SUCCESS) {\r
+               ibv_destroy_qp(ep_ptr->qp_handle);\r
+               ep_ptr->qp_handle = IB_INVALID_HANDLE;\r
+               return DAT_INTERNAL_ERROR;\r
+       }\r
+#endif\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+                    " qp_alloc: qpn %p sq %d,%d rq %d,%d\n",\r
+                    ep_ptr->qp_handle->qp_num,\r
+                    qp_create.cap.max_send_wr, qp_create.cap.max_send_sge,\r
+                    qp_create.cap.max_recv_wr, qp_create.cap.max_recv_sge);\r
+\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+/*\r
+ * dapl_ib_qp_free\r
+ *\r
+ * Free a QP\r
+ *\r
+ * Input:\r
+ *     ia_handle       IA handle\r
+ *     *ep_ptr         pointer to EP INFO\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *  dapl_convert_errno\r
+ *\r
+ */\r
+DAT_RETURN dapls_ib_qp_free(IN DAPL_IA * ia_ptr, IN DAPL_EP * ep_ptr)\r
+{\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP, " qp_free:  ep_ptr %p qp %p\n",\r
+                    ep_ptr, ep_ptr->qp_handle);\r
+\r
+       if (ep_ptr->cm_handle != NULL) {\r
+               dapls_ib_cm_free(ep_ptr->cm_handle, ep_ptr);\r
+       }\r
+       \r
+       if (ep_ptr->qp_handle != NULL) {\r
+               /* force error state to flush queue, then destroy */\r
+               dapls_modify_qp_state(ep_ptr->qp_handle, IBV_QPS_ERR, NULL);\r
+\r
+               if (ibv_destroy_qp(ep_ptr->qp_handle))\r
+                       return (dapl_convert_errno(errno, "destroy_qp"));\r
+\r
+               ep_ptr->qp_handle = NULL;\r
+       }\r
+\r
+#ifdef DAT_EXTENSIONS\r
+       /* UD endpoints can have many CR associations and will not\r
+        * set ep->cm_handle. Call provider with cm_ptr null to incidate\r
+        * UD type multi CR's for this EP. It will parse internal list\r
+        * and cleanup all associations.\r
+        */\r
+       if (ep_ptr->param.ep_attr.service_type == DAT_IB_SERVICE_TYPE_UD) \r
+               dapls_ib_cm_free(NULL, ep_ptr);\r
+#endif\r
+\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+/*\r
+ * dapl_ib_qp_modify\r
+ *\r
+ * Set the QP to the parameters specified in an EP_PARAM\r
+ *\r
+ * The EP_PARAM structure that is provided has been\r
+ * sanitized such that only non-zero values are valid.\r
+ *\r
+ * Input:\r
+ *     ib_hca_handle           HCA handle\r
+ *     qp_handle               QP handle\r
+ *     ep_attr                 Sanitized EP Params\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_INSUFFICIENT_RESOURCES\r
+ *     DAT_INVALID_PARAMETER\r
+ *\r
+ */\r
+DAT_RETURN\r
+dapls_ib_qp_modify(IN DAPL_IA * ia_ptr,\r
+                  IN DAPL_EP * ep_ptr, IN DAT_EP_ATTR * attr)\r
+{\r
+       struct ibv_qp_attr qp_attr;\r
+\r
+       if (ep_ptr->qp_handle == IB_INVALID_HANDLE)\r
+               return DAT_INVALID_PARAMETER;\r
+\r
+       /* \r
+        * EP state, qp_handle state should be an indication\r
+        * of current state but the only way to be sure is with\r
+        * a user mode ibv_query_qp call which is NOT available \r
+        */\r
+\r
+       /* move to error state if necessary */\r
+       if ((ep_ptr->qp_state == IB_QP_STATE_ERROR) &&\r
+           (ep_ptr->qp_handle->state != IBV_QPS_ERR)) {\r
+               return (dapls_modify_qp_state(ep_ptr->qp_handle,\r
+                                             IBV_QPS_ERR, NULL));\r
+       }\r
+\r
+       /*\r
+        * Check if we have the right qp_state to modify attributes\r
+        */\r
+       if ((ep_ptr->qp_handle->state != IBV_QPS_RTR) &&\r
+           (ep_ptr->qp_handle->state != IBV_QPS_RTS))\r
+               return DAT_INVALID_STATE;\r
+\r
+       /* Adjust to current EP attributes */\r
+       dapl_os_memzero((void *)&qp_attr, sizeof(qp_attr));\r
+       qp_attr.cap.max_send_wr = attr->max_request_dtos;\r
+       qp_attr.cap.max_recv_wr = attr->max_recv_dtos;\r
+       qp_attr.cap.max_send_sge = attr->max_request_iov;\r
+       qp_attr.cap.max_recv_sge = attr->max_recv_iov;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+                    "modify_qp: qp %p sq %d,%d, rq %d,%d\n",\r
+                    ep_ptr->qp_handle,\r
+                    qp_attr.cap.max_send_wr, qp_attr.cap.max_send_sge,\r
+                    qp_attr.cap.max_recv_wr, qp_attr.cap.max_recv_sge);\r
+\r
+       if (ibv_modify_qp(ep_ptr->qp_handle, &qp_attr, IBV_QP_CAP)) {\r
+               dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
+                            "modify_qp: modify ep %p qp %p failed\n",\r
+                            ep_ptr, ep_ptr->qp_handle);\r
+               return (dapl_convert_errno(errno, "modify_qp_state"));\r
+       }\r
+\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+/*\r
+ * dapls_ib_reinit_ep\r
+ *\r
+ * Move the QP to INIT state again.\r
+ *\r
+ * Input:\r
+ *     ep_ptr          DAPL_EP\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     void\r
+ *\r
+ */\r
+#if defined(_WIN32) || defined(_WIN64)\r
+void dapls_ib_reinit_ep(IN DAPL_EP * ep_ptr)\r
+{\r
+       /* work around bug in low level driver - 3/24/09 */\r
+       /* RTS -> RESET -> INIT -> ERROR QP transition crashes system */\r
+       if (ep_ptr->qp_handle != IB_INVALID_HANDLE) {\r
+               dapls_ib_qp_free(ep_ptr->header.owner_ia, ep_ptr);\r
+               dapls_ib_qp_alloc(ep_ptr->header.owner_ia, ep_ptr, ep_ptr);\r
+       }\r
+}\r
+#else                          // _WIN32 || _WIN64\r
+void dapls_ib_reinit_ep(IN DAPL_EP * ep_ptr)\r
+{\r
+       if (ep_ptr->qp_handle != IB_INVALID_HANDLE &&\r
+           ep_ptr->qp_handle->qp_type != IBV_QPT_UD) {\r
+               /* move to RESET state and then to INIT */\r
+               dapls_modify_qp_state(ep_ptr->qp_handle, IBV_QPS_RESET, 0);\r
+               dapls_modify_qp_state(ep_ptr->qp_handle, IBV_QPS_INIT, 0);\r
+       }\r
+}\r
+#endif                         // _WIN32 || _WIN64\r
+\r
+/* \r
+ * Generic QP modify for init, reset, error, RTS, RTR\r
+ * For UD, create_ah on RTR, qkey on INIT\r
+ */\r
+DAT_RETURN\r
+dapls_modify_qp_state(IN ib_qp_handle_t qp_handle,\r
+                     IN ib_qp_state_t qp_state, \r
+                     IN dp_ib_cm_handle_t cm_ptr)\r
+{\r
+       struct ibv_qp_attr qp_attr;\r
+       enum ibv_qp_attr_mask mask = IBV_QP_STATE;\r
+       DAPL_EP *ep_ptr = (DAPL_EP *) qp_handle->qp_context;\r
+       DAPL_IA *ia_ptr = ep_ptr->header.owner_ia;\r
+       ib_qp_cm_t *qp_cm = &cm_ptr->dst;\r
+       int ret;\r
+\r
+       dapl_os_memzero((void *)&qp_attr, sizeof(qp_attr));\r
+       qp_attr.qp_state = qp_state;\r
+       switch (qp_state) {\r
+               /* additional attributes with RTR and RTS */\r
+       case IBV_QPS_RTR:\r
+               {\r
+                       dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+                                    " QPS_RTR: type %d state %d qpn %x lid %x"\r
+                                    " port %x ep %p qp_state %d\n",\r
+                                    qp_handle->qp_type, qp_handle->qp_type,\r
+                                    qp_cm->qpn, qp_cm->lid, qp_cm->port,\r
+                                    ep_ptr, ep_ptr->qp_state);\r
+\r
+                       mask |= IBV_QP_AV |\r
+                           IBV_QP_PATH_MTU |\r
+                           IBV_QP_DEST_QPN |\r
+                           IBV_QP_RQ_PSN |\r
+                           IBV_QP_MAX_DEST_RD_ATOMIC | IBV_QP_MIN_RNR_TIMER;\r
+\r
+                       qp_attr.dest_qp_num = qp_cm->qpn;\r
+                       qp_attr.rq_psn = 1;\r
+                       qp_attr.path_mtu = ia_ptr->hca_ptr->ib_trans.mtu;\r
+                       qp_attr.max_dest_rd_atomic =\r
+                           ep_ptr->param.ep_attr.max_rdma_read_out;\r
+                       qp_attr.min_rnr_timer =\r
+                           ia_ptr->hca_ptr->ib_trans.rnr_timer;\r
+\r
+                       /* address handle. RC and UD */\r
+                       qp_attr.ah_attr.dlid = qp_cm->lid;\r
+                       if (ia_ptr->hca_ptr->ib_trans.global) {\r
+                               qp_attr.ah_attr.is_global = 1;\r
+                               qp_attr.ah_attr.grh.dgid = qp_cm->gid;\r
+                               qp_attr.ah_attr.grh.hop_limit =\r
+                                   ia_ptr->hca_ptr->ib_trans.hop_limit;\r
+                               qp_attr.ah_attr.grh.traffic_class =\r
+                                   ia_ptr->hca_ptr->ib_trans.tclass;\r
+                       }\r
+                       qp_attr.ah_attr.sl = 0;\r
+                       qp_attr.ah_attr.src_path_bits = 0;\r
+                       qp_attr.ah_attr.port_num = ia_ptr->hca_ptr->port_num;\r
+#ifdef DAT_EXTENSIONS\r
+                       /* UD: create AH for remote side */\r
+                       if (qp_handle->qp_type == IBV_QPT_UD) {\r
+                               ib_pd_handle_t pz;\r
+                               pz = ((DAPL_PZ *)\r
+                                     ep_ptr->param.pz_handle)->pd_handle;\r
+                               mask = IBV_QP_STATE;\r
+                               cm_ptr->ah = ibv_create_ah(pz,\r
+                                                          &qp_attr.ah_attr);\r
+                               if (!cm_ptr->ah)\r
+                                       return (dapl_convert_errno(errno,\r
+                                                                  "ibv_ah"));\r
+\r
+                               /* already RTR, multi remote AH's on QP */\r
+                               if (ep_ptr->qp_state == IBV_QPS_RTR ||\r
+                                   ep_ptr->qp_state == IBV_QPS_RTS)\r
+                                       return DAT_SUCCESS;\r
+                       }\r
+#endif\r
+                       break;\r
+               }\r
+       case IBV_QPS_RTS:\r
+               {\r
+                       /* RC only */\r
+                       if (qp_handle->qp_type == IBV_QPT_RC) {\r
+                               mask |= IBV_QP_SQ_PSN |\r
+                                   IBV_QP_TIMEOUT |\r
+                                   IBV_QP_RETRY_CNT |\r
+                                   IBV_QP_RNR_RETRY | IBV_QP_MAX_QP_RD_ATOMIC;\r
+                               qp_attr.timeout =\r
+                                   ia_ptr->hca_ptr->ib_trans.ack_timer;\r
+                               qp_attr.retry_cnt =\r
+                                   ia_ptr->hca_ptr->ib_trans.ack_retry;\r
+                               qp_attr.rnr_retry =\r
+                                   ia_ptr->hca_ptr->ib_trans.rnr_retry;\r
+                               qp_attr.max_rd_atomic =\r
+                                   ep_ptr->param.ep_attr.max_rdma_read_out;\r
+                       }\r
+                       /* RC and UD */\r
+                       qp_attr.qp_state = IBV_QPS_RTS;\r
+                       qp_attr.sq_psn = 1;\r
+\r
+                       dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+                                    " QPS_RTS: psn %x rd_atomic %d ack %d "\r
+                                    " retry %d rnr_retry %d ep %p qp_state %d\n",\r
+                                    qp_attr.sq_psn, qp_attr.max_rd_atomic,\r
+                                    qp_attr.timeout, qp_attr.retry_cnt,\r
+                                    qp_attr.rnr_retry, ep_ptr,\r
+                                    ep_ptr->qp_state);\r
+#ifdef DAT_EXTENSIONS\r
+                       if (qp_handle->qp_type == IBV_QPT_UD) {\r
+                               /* already RTS, multi remote AH's on QP */\r
+                               if (ep_ptr->qp_state == IBV_QPS_RTS)\r
+                                       return DAT_SUCCESS;\r
+                               else\r
+                                       mask = IBV_QP_STATE | IBV_QP_SQ_PSN;\r
+                       }\r
+#endif\r
+                       break;\r
+               }\r
+       case IBV_QPS_INIT:\r
+               {\r
+                       mask |= IBV_QP_PKEY_INDEX | IBV_QP_PORT;\r
+                       if (qp_handle->qp_type == IBV_QPT_RC) {\r
+                               mask |= IBV_QP_ACCESS_FLAGS;\r
+                               qp_attr.qp_access_flags =\r
+                                   IBV_ACCESS_LOCAL_WRITE |\r
+                                   IBV_ACCESS_REMOTE_WRITE |\r
+                                   IBV_ACCESS_REMOTE_READ |\r
+                                   IBV_ACCESS_REMOTE_ATOMIC |\r
+                                   IBV_ACCESS_MW_BIND;\r
+                       }\r
+#ifdef DAT_EXTENSIONS\r
+                       if (qp_handle->qp_type == IBV_QPT_UD) {\r
+                               /* already INIT, multi remote AH's on QP */\r
+                               if (ep_ptr->qp_state == IBV_QPS_INIT)\r
+                                       return DAT_SUCCESS;\r
+                               mask |= IBV_QP_QKEY;\r
+                               qp_attr.qkey = DAT_UD_QKEY;\r
+                       }\r
+#endif\r
+                       qp_attr.pkey_index = 0;\r
+                       qp_attr.port_num = ia_ptr->hca_ptr->port_num;\r
+\r
+                       dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+                                    " QPS_INIT: pi %x port %x acc %x qkey 0x%x\n",\r
+                                    qp_attr.pkey_index, qp_attr.port_num,\r
+                                    qp_attr.qp_access_flags, qp_attr.qkey);\r
+                       break;\r
+               }\r
+       default:\r
+               break;\r
+\r
+       }\r
+\r
+       ret = ibv_modify_qp(qp_handle, &qp_attr, mask);\r
+       if (ret == 0) {\r
+               ep_ptr->qp_state = qp_state;\r
+               return DAT_SUCCESS;\r
+       } else {\r
+               return (dapl_convert_errno(errno, "modify_qp_state"));\r
+       }\r
+}\r
+\r
+/*\r
+ * Local variables:\r
+ *  c-indent-level: 4\r
+ *  c-basic-offset: 4\r
+ *  tab-width: 8\r
+ * End:\r
+ */\r
diff --git a/branches/winverbs/ulp/dapl2/dapl/openib_common/util.c b/branches/winverbs/ulp/dapl2/dapl/openib_common/util.c
new file mode 100644 (file)
index 0000000..0922e9b
--- /dev/null
@@ -0,0 +1,375 @@
+/*\r
+ * This Software is licensed under one of the following licenses:\r
+ *\r
+ * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
+ *    available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/cpl.php.\r
+ *\r
+ * 2) under the terms of the "The BSD License" a copy of which is\r
+ *    available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/bsd-license.php.\r
+ *\r
+ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
+ *    copy of which is available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/gpl-license.php.\r
+ *\r
+ * Licensee has the right to choose one of the above licenses.\r
+ *\r
+ * Redistributions of source code must retain the above copyright\r
+ * notice and one of the license notices.\r
+ *\r
+ * Redistributions in binary form must reproduce both the above copyright\r
+ * notice, one of the license notices in the documentation\r
+ * and/or other materials provided with the distribution.\r
+ */\r
+#include "dapl.h"\r
+#include "dapl_adapter_util.h"\r
+#include "dapl_ib_util.h"\r
+#include "dapl_osd.h"\r
+\r
+#include <stdlib.h>\r
+\r
+int g_dapl_loopback_connection = 0;\r
+\r
+enum ibv_mtu dapl_ib_mtu(int mtu)\r
+{\r
+       switch (mtu) {\r
+       case 256:\r
+               return IBV_MTU_256;\r
+       case 512:\r
+               return IBV_MTU_512;\r
+       case 1024:\r
+               return IBV_MTU_1024;\r
+       case 2048:\r
+               return IBV_MTU_2048;\r
+       case 4096:\r
+               return IBV_MTU_4096;\r
+       default:\r
+               return IBV_MTU_1024;\r
+       }\r
+}\r
+\r
+char *dapl_ib_mtu_str(enum ibv_mtu mtu)\r
+{\r
+       switch (mtu) {\r
+       case IBV_MTU_256:\r
+               return "256";\r
+       case IBV_MTU_512:\r
+               return "512";\r
+       case IBV_MTU_1024:\r
+               return "1024";\r
+       case IBV_MTU_2048:\r
+               return "2048";\r
+       case IBV_MTU_4096:\r
+               return "4096";\r
+       default:\r
+               return "1024";\r
+       }\r
+}\r
+\r
+DAT_RETURN getlocalipaddr(DAT_SOCK_ADDR * addr, int addr_len)\r
+{\r
+       struct sockaddr_in *sin;\r
+       struct addrinfo *res, hint, *ai;\r
+       int ret;\r
+       char hostname[256];\r
+\r
+       if (addr_len < sizeof(*sin)) {\r
+               return DAT_INTERNAL_ERROR;\r
+       }\r
+\r
+       ret = gethostname(hostname, 256);\r
+       if (ret)\r
+               return dapl_convert_errno(ret, "gethostname");\r
+\r
+       memset(&hint, 0, sizeof hint);\r
+       hint.ai_flags = AI_PASSIVE;\r
+       hint.ai_family = AF_INET;\r
+       hint.ai_socktype = SOCK_STREAM;\r
+       hint.ai_protocol = IPPROTO_TCP;\r
+\r
+       ret = getaddrinfo(hostname, NULL, &hint, &res);\r
+       if (ret) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " getaddrinfo ERR: %d %s\n", ret, gai_strerror(ret));\r
+               return DAT_INVALID_ADDRESS;\r
+       }\r
+\r
+       ret = DAT_INVALID_ADDRESS;\r
+       for (ai = res; ai; ai = ai->ai_next) {\r
+               sin = (struct sockaddr_in *)ai->ai_addr;\r
+               if (*((uint32_t *) & sin->sin_addr) != htonl(0x7f000001)) {\r
+                       *((struct sockaddr_in *)addr) = *sin;\r
+                       ret = DAT_SUCCESS;\r
+                       break;\r
+               }\r
+       }\r
+\r
+       freeaddrinfo(res);\r
+       return ret;\r
+}\r
+\r
+/*\r
+ * dapls_ib_query_hca\r
+ *\r
+ * Query the hca attribute\r
+ *\r
+ * Input:\r
+ *     hca_handl               hca handle      \r
+ *     ia_attr                 attribute of the ia\r
+ *     ep_attr                 attribute of the ep\r
+ *     ip_addr                 ip address of DET NIC\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_INVALID_HANDLE\r
+ */\r
+\r
+DAT_RETURN dapls_ib_query_hca(IN DAPL_HCA * hca_ptr,\r
+                             OUT DAT_IA_ATTR * ia_attr,\r
+                             OUT DAT_EP_ATTR * ep_attr,\r
+                             OUT DAT_SOCK_ADDR6 * ip_addr)\r
+{\r
+       struct ibv_device_attr dev_attr;\r
+       struct ibv_port_attr port_attr;\r
+\r
+       if (hca_ptr->ib_hca_handle == NULL) {\r
+               dapl_dbg_log(DAPL_DBG_TYPE_ERR, " query_hca: BAD handle\n");\r
+               return (DAT_INVALID_HANDLE);\r
+       }\r
+\r
+       /* local IP address of device, set during ia_open */\r
+       if (ip_addr != NULL)\r
+               memcpy(ip_addr, &hca_ptr->hca_address, sizeof(DAT_SOCK_ADDR6));\r
+\r
+       if (ia_attr == NULL && ep_attr == NULL)\r
+               return DAT_SUCCESS;\r
+\r
+       /* query verbs for this device and port attributes */\r
+       if (ibv_query_device(hca_ptr->ib_hca_handle, &dev_attr) ||\r
+           ibv_query_port(hca_ptr->ib_hca_handle,\r
+                          hca_ptr->port_num, &port_attr))\r
+               return (dapl_convert_errno(errno, "ib_query_hca"));\r
+\r
+       if (ia_attr != NULL) {\r
+               (void)dapl_os_memzero(ia_attr, sizeof(*ia_attr));\r
+               ia_attr->adapter_name[DAT_NAME_MAX_LENGTH - 1] = '\0';\r
+               ia_attr->vendor_name[DAT_NAME_MAX_LENGTH - 1] = '\0';\r
+               ia_attr->ia_address_ptr =\r
+                   (DAT_IA_ADDRESS_PTR) & hca_ptr->hca_address;\r
+\r
+               dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                            " query_hca: %s %s \n",\r
+                            ibv_get_device_name(hca_ptr->ib_trans.ib_dev),\r
+                            inet_ntoa(((struct sockaddr_in *)\r
+                                       &hca_ptr->hca_address)->sin_addr));\r
+\r
+               ia_attr->hardware_version_major = dev_attr.hw_ver;\r
+               /* ia_attr->hardware_version_minor   = dev_attr.fw_ver; */\r
+               ia_attr->max_eps = dev_attr.max_qp;\r
+               ia_attr->max_dto_per_ep = dev_attr.max_qp_wr;\r
+               ia_attr->max_rdma_read_in = dev_attr.max_qp_rd_atom;\r
+               ia_attr->max_rdma_read_out = dev_attr.max_qp_init_rd_atom;\r
+               ia_attr->max_rdma_read_per_ep_in = dev_attr.max_qp_rd_atom;\r
+               ia_attr->max_rdma_read_per_ep_out =\r
+                   dev_attr.max_qp_init_rd_atom;\r
+               ia_attr->max_rdma_read_per_ep_in_guaranteed = DAT_TRUE;\r
+               ia_attr->max_rdma_read_per_ep_out_guaranteed = DAT_TRUE;\r
+               ia_attr->max_evds = dev_attr.max_cq;\r
+               ia_attr->max_evd_qlen = dev_attr.max_cqe;\r
+               ia_attr->max_iov_segments_per_dto = dev_attr.max_sge;\r
+               ia_attr->max_lmrs = dev_attr.max_mr;\r
+               /* 32bit attribute from 64bit, 4G-1 limit, DAT v2 needs fix */\r
+               ia_attr->max_lmr_block_size = \r
+                   (dev_attr.max_mr_size >> 32) ? ~0 : dev_attr.max_mr_size;\r
+               ia_attr->max_rmrs = dev_attr.max_mw;\r
+               ia_attr->max_lmr_virtual_address = dev_attr.max_mr_size;\r
+               ia_attr->max_rmr_target_address = dev_attr.max_mr_size;\r
+               ia_attr->max_pzs = dev_attr.max_pd;\r
+               ia_attr->max_message_size = port_attr.max_msg_sz;\r
+               ia_attr->max_rdma_size = port_attr.max_msg_sz;\r
+               /* iWARP spec. - 1 sge for RDMA reads */\r
+               if (hca_ptr->ib_hca_handle->device->transport_type\r
+                   == IBV_TRANSPORT_IWARP)\r
+                       ia_attr->max_iov_segments_per_rdma_read = 1;\r
+               else\r
+                       ia_attr->max_iov_segments_per_rdma_read =\r
+                           dev_attr.max_sge;\r
+               ia_attr->max_iov_segments_per_rdma_write = dev_attr.max_sge;\r
+               ia_attr->num_transport_attr = 0;\r
+               ia_attr->transport_attr = NULL;\r
+               ia_attr->num_vendor_attr = 0;\r
+               ia_attr->vendor_attr = NULL;\r
+#ifdef DAT_EXTENSIONS\r
+               ia_attr->extension_supported = DAT_EXTENSION_IB;\r
+               ia_attr->extension_version = DAT_IB_EXTENSION_VERSION;\r
+#endif\r
+               /* save key device attributes for CM exchange */\r
+               hca_ptr->ib_trans.rd_atom_in  = dev_attr.max_qp_rd_atom;\r
+               hca_ptr->ib_trans.rd_atom_out = dev_attr.max_qp_init_rd_atom;\r
+               \r
+               hca_ptr->ib_trans.mtu = DAPL_MIN(port_attr.active_mtu,\r
+                                                hca_ptr->ib_trans.mtu);\r
+               hca_ptr->ib_trans.ack_timer =\r
+                   DAPL_MAX(dev_attr.local_ca_ack_delay,\r
+                            hca_ptr->ib_trans.ack_timer);\r
+\r
+               /* set MTU in transport specific named attribute */\r
+               hca_ptr->ib_trans.named_attr.name = "DAT_IB_TRANSPORT_MTU";\r
+               hca_ptr->ib_trans.named_attr.value =\r
+                   dapl_ib_mtu_str(hca_ptr->ib_trans.mtu);\r
+\r
+               dapl_log(DAPL_DBG_TYPE_UTIL,\r
+                            " query_hca: (%x.%x) eps %d, sz %d evds %d,"\r
+                            " sz %d mtu %d\n",\r
+                            ia_attr->hardware_version_major,\r
+                            ia_attr->hardware_version_minor,\r
+                            ia_attr->max_eps, ia_attr->max_dto_per_ep,\r
+                            ia_attr->max_evds, ia_attr->max_evd_qlen,\r
+                            128 << hca_ptr->ib_trans.mtu);\r
+\r
+               dapl_log(DAPL_DBG_TYPE_UTIL,\r
+                            " query_hca: msg %llu rdma %llu iov %d lmr %d rmr %d"\r
+                            " ack_time %d mr %u\n",\r
+                            ia_attr->max_message_size, ia_attr->max_rdma_size,\r
+                            ia_attr->max_iov_segments_per_dto,\r
+                            ia_attr->max_lmrs, ia_attr->max_rmrs,\r
+                            hca_ptr->ib_trans.ack_timer,\r
+                            ia_attr->max_lmr_block_size);\r
+       }\r
+\r
+       if (ep_attr != NULL) {\r
+               (void)dapl_os_memzero(ep_attr, sizeof(*ep_attr));\r
+               ep_attr->max_message_size = port_attr.max_msg_sz;\r
+               ep_attr->max_rdma_size = port_attr.max_msg_sz;\r
+               ep_attr->max_recv_dtos = dev_attr.max_qp_wr;\r
+               ep_attr->max_request_dtos = dev_attr.max_qp_wr;\r
+               ep_attr->max_recv_iov = dev_attr.max_sge;\r
+               ep_attr->max_request_iov = dev_attr.max_sge;\r
+               ep_attr->max_rdma_read_in = dev_attr.max_qp_rd_atom;\r
+               ep_attr->max_rdma_read_out = dev_attr.max_qp_init_rd_atom;\r
+               ep_attr->max_rdma_read_iov = dev_attr.max_sge;\r
+               ep_attr->max_rdma_write_iov = dev_attr.max_sge;\r
+               dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                            " query_hca: MAX msg %llu mtu %d qsz %d iov %d"\r
+                            " rdma i%d,o%d\n",\r
+                            ep_attr->max_message_size,\r
+                            128 << hca_ptr->ib_trans.mtu,\r
+                            ep_attr->max_recv_dtos, \r
+                            ep_attr->max_recv_iov,\r
+                            ep_attr->max_rdma_read_in,\r
+                            ep_attr->max_rdma_read_out);\r
+       }\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+/*\r
+ * dapls_ib_setup_async_callback\r
+ *\r
+ * Set up an asynchronous callbacks of various kinds\r
+ *\r
+ * Input:\r
+ *     ia_handle               IA handle\r
+ *     handler_type            type of handler to set up\r
+ *     callback_handle         handle param for completion callbacks\r
+ *     callback                callback routine pointer\r
+ *     context                 argument for callback routine\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_INSUFFICIENT_RESOURCES\r
+ *     DAT_INVALID_PARAMETER\r
+ *\r
+ */\r
+DAT_RETURN dapls_ib_setup_async_callback(IN DAPL_IA * ia_ptr,\r
+                                        IN DAPL_ASYNC_HANDLER_TYPE\r
+                                        handler_type, IN DAPL_EVD * evd_ptr,\r
+                                        IN ib_async_handler_t callback,\r
+                                        IN void *context)\r
+{\r
+       ib_hca_transport_t *hca_ptr;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                    " setup_async_cb: ia %p type %d handle %p cb %p ctx %p\n",\r
+                    ia_ptr, handler_type, evd_ptr, callback, context);\r
+\r
+       hca_ptr = &ia_ptr->hca_ptr->ib_trans;\r
+       switch (handler_type) {\r
+       case DAPL_ASYNC_UNAFILIATED:\r
+               hca_ptr->async_unafiliated = (ib_async_handler_t) callback;\r
+               hca_ptr->async_un_ctx = context;\r
+               break;\r
+       case DAPL_ASYNC_CQ_ERROR:\r
+               hca_ptr->async_cq_error = (ib_async_cq_handler_t) callback;\r
+               break;\r
+       case DAPL_ASYNC_CQ_COMPLETION:\r
+               hca_ptr->async_cq = (ib_async_dto_handler_t) callback;\r
+               break;\r
+       case DAPL_ASYNC_QP_ERROR:\r
+               hca_ptr->async_qp_error = (ib_async_qp_handler_t) callback;\r
+               break;\r
+       default:\r
+               break;\r
+       }\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+/*\r
+ * dapls_set_provider_specific_attr\r
+ *\r
+ * Input:\r
+ *      attr_ptr        Pointer provider specific attributes\r
+ *\r
+ * Output:\r
+ *      none\r
+ *\r
+ * Returns:\r
+ *      void\r
+ */\r
+DAT_NAMED_ATTR ib_attrs[] = {\r
+       {\r
+        "DAT_IB_TRANSPORT_MTU", "2048"}\r
+       ,\r
+#ifdef DAT_EXTENSIONS\r
+       {\r
+        "DAT_EXTENSION_INTERFACE", "TRUE"}\r
+       ,\r
+       {\r
+        DAT_IB_ATTR_FETCH_AND_ADD, "TRUE"}\r
+       ,\r
+       {\r
+        DAT_IB_ATTR_CMP_AND_SWAP, "TRUE"}\r
+       ,\r
+       {\r
+        DAT_IB_ATTR_IMMED_DATA, "TRUE"}\r
+       ,\r
+#ifndef _OPENIB_CMA_\r
+       {\r
+        DAT_IB_ATTR_UD, "TRUE"}\r
+       ,\r
+#endif\r
+#ifdef DAPL_COUNTERS\r
+       {\r
+        DAT_ATTR_COUNTERS, "TRUE"}\r
+       ,\r
+#endif                         /* DAPL_COUNTERS */\r
+#endif\r
+};\r
+\r
+#define SPEC_ATTR_SIZE( x )     (sizeof( x ) / sizeof( DAT_NAMED_ATTR))\r
+\r
+void dapls_query_provider_specific_attr(IN DAPL_IA * ia_ptr,\r
+                                       IN DAT_PROVIDER_ATTR * attr_ptr)\r
+{\r
+       attr_ptr->num_provider_specific_attr = SPEC_ATTR_SIZE(ib_attrs);\r
+       attr_ptr->provider_specific_attr = ib_attrs;\r
+\r
+       /* set MTU to actual settings */\r
+       ib_attrs[0].value = ia_ptr->hca_ptr->ib_trans.named_attr.value;\r
+}\r
index f9204d95d7a7f5fa5f811305eb7e8853361379cf..6e4ad30cc03c46a31bef9375fc79e5a622b64e7c 100644 (file)
@@ -18,16 +18,13 @@ USE_MSVCRT = 1
 \r
 SOURCES = \\r
        udapl.rc \\r
-       ..\dapl_common_src.c    \\r
-       ..\dapl_udapl_src.c             \\r
-       dapl_ib_cq.c                    \\r
-       dapl_ib_extensions.c    \\r
-       dapl_ib_mem.c                   \\r
-       dapl_ib_qp.c                    \\r
-       dapl_ib_util.c                  \\r
-       dapl_ib_cm.c\r
-\r
-INCLUDES = ..\include;..\common;windows;..\..\dat\include;\\r
+       ..\dapl_common_src.c             \\r
+       ..\dapl_udapl_src.c              \\r
+        ..\openib_common.c               \\r
+        device.c                         \\r
+        cm.c\r
+\r
+INCLUDES = ..\include;..\openib_common\;..\common;windows;..\..\dat\include;\\r
                   ..\..\dat\udat\windows;..\udapl\windows;\\r
                   ..\..\..\..\inc;..\..\..\..\inc\user;..\..\..\libibverbs\include\r
 \r
diff --git a/branches/winverbs/ulp/dapl2/dapl/openib_scm/cm.c b/branches/winverbs/ulp/dapl2/dapl/openib_scm/cm.c
new file mode 100644 (file)
index 0000000..3639f15
--- /dev/null
@@ -0,0 +1,1865 @@
+/*\r
+ * This Software is licensed under one of the following licenses:\r
+ *\r
+ * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
+ *    available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/cpl.php.\r
+ *\r
+ * 2) under the terms of the "The BSD License" a copy of which is\r
+ *    available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/bsd-license.php.\r
+ *\r
+ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
+ *    copy of which is available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/gpl-license.php.\r
+ *\r
+ * Licensee has the right to choose one of the above licenses.\r
+ *\r
+ * Redistributions of source code must retain the above copyright\r
+ * notice and one of the license notices.\r
+ *\r
+ * Redistributions in binary form must reproduce both the above copyright\r
+ * notice, one of the license notices in the documentation\r
+ * and/or other materials provided with the distribution.\r
+ */\r
+\r
+/***************************************************************************\r
+ *\r
+ *   Module:            uDAPL\r
+ *\r
+ *   Filename:          dapl_ib_cm.c\r
+ *\r
+ *   Author:            Arlin Davis\r
+ *\r
+ *   Created:           3/10/2005\r
+ *\r
+ *   Description: \r
+ *\r
+ *   The uDAPL openib provider - connection management\r
+ *\r
+ ****************************************************************************\r
+ *                Source Control System Information\r
+ *\r
+ *    $Id: $\r
+ *\r
+ *     Copyright (c) 2005 Intel Corporation.  All rights reserved.\r
+ *\r
+ **************************************************************************/\r
+\r
+#if defined(_WIN32)\r
+#define FD_SETSIZE 1024\r
+#define DAPL_FD_SETSIZE FD_SETSIZE\r
+#endif\r
+\r
+#include "dapl.h"\r
+#include "dapl_adapter_util.h"\r
+#include "dapl_evd_util.h"\r
+#include "dapl_cr_util.h"\r
+#include "dapl_name_service.h"\r
+#include "dapl_ib_util.h"\r
+#include "dapl_osd.h"\r
+\r
+#if defined(_WIN32) || defined(_WIN64)\r
+enum DAPL_FD_EVENTS {\r
+       DAPL_FD_READ = 0x1,\r
+       DAPL_FD_WRITE = 0x2,\r
+       DAPL_FD_ERROR = 0x4\r
+};\r
+\r
+static int dapl_config_socket(DAPL_SOCKET s)\r
+{\r
+       unsigned long nonblocking = 1;\r
+       return ioctlsocket(s, FIONBIO, &nonblocking);\r
+}\r
+\r
+static int dapl_connect_socket(DAPL_SOCKET s, struct sockaddr *addr,\r
+                              int addrlen)\r
+{\r
+       int err;\r
+\r
+       err = connect(s, addr, addrlen);\r
+       if (err == SOCKET_ERROR)\r
+               err = WSAGetLastError();\r
+       return (err == WSAEWOULDBLOCK) ? EAGAIN : err;\r
+}\r
+\r
+struct dapl_fd_set {\r
+       struct fd_set set[3];\r
+};\r
+\r
+static struct dapl_fd_set *dapl_alloc_fd_set(void)\r
+{\r
+       return dapl_os_alloc(sizeof(struct dapl_fd_set));\r
+}\r
+\r
+static void dapl_fd_zero(struct dapl_fd_set *set)\r
+{\r
+       FD_ZERO(&set->set[0]);\r
+       FD_ZERO(&set->set[1]);\r
+       FD_ZERO(&set->set[2]);\r
+}\r
+\r
+static int dapl_fd_set(DAPL_SOCKET s, struct dapl_fd_set *set,\r
+                      enum DAPL_FD_EVENTS event)\r
+{\r
+       FD_SET(s, &set->set[(event == DAPL_FD_READ) ? 0 : 1]);\r
+       FD_SET(s, &set->set[2]);\r
+       return 0;\r
+}\r
+\r
+static enum DAPL_FD_EVENTS dapl_poll(DAPL_SOCKET s, enum DAPL_FD_EVENTS event)\r
+{\r
+       struct fd_set rw_fds;\r
+       struct fd_set err_fds;\r
+       struct timeval tv;\r
+       int ret;\r
+\r
+       FD_ZERO(&rw_fds);\r
+       FD_ZERO(&err_fds);\r
+       FD_SET(s, &rw_fds);\r
+       FD_SET(s, &err_fds);\r
+\r
+       tv.tv_sec = 0;\r
+       tv.tv_usec = 0;\r
+\r
+       if (event == DAPL_FD_READ)\r
+               ret = select(1, &rw_fds, NULL, &err_fds, &tv);\r
+       else\r
+               ret = select(1, NULL, &rw_fds, &err_fds, &tv);\r
+\r
+       if (ret == 0)\r
+               return 0;\r
+       else if (ret == SOCKET_ERROR)\r
+               return WSAGetLastError();\r
+       else if (FD_ISSET(s, &rw_fds))\r
+               return event;\r
+       else\r
+               return DAPL_FD_ERROR;\r
+}\r
+\r
+static int dapl_select(struct dapl_fd_set *set)\r
+{\r
+       int ret;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CM, " dapl_select: sleep\n");\r
+       ret = select(0, &set->set[0], &set->set[1], &set->set[2], NULL);\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CM, " dapl_select: wakeup\n");\r
+\r
+       if (ret == SOCKET_ERROR)\r
+               dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                            " dapl_select: error 0x%x\n", WSAGetLastError());\r
+\r
+       return ret;\r
+}\r
+#else                          // _WIN32 || _WIN64\r
+enum DAPL_FD_EVENTS {\r
+       DAPL_FD_READ = POLLIN,\r
+       DAPL_FD_WRITE = POLLOUT,\r
+       DAPL_FD_ERROR = POLLERR\r
+};\r
+\r
+static int dapl_config_socket(DAPL_SOCKET s)\r
+{\r
+       int ret;\r
+\r
+       ret = fcntl(s, F_GETFL);\r
+       if (ret >= 0)\r
+               ret = fcntl(s, F_SETFL, ret | O_NONBLOCK);\r
+       return ret;\r
+}\r
+\r
+static int dapl_connect_socket(DAPL_SOCKET s, struct sockaddr *addr,\r
+                              int addrlen)\r
+{\r
+       int ret;\r
+\r
+       ret = connect(s, addr, addrlen);\r
+\r
+       return (errno == EINPROGRESS) ? EAGAIN : ret;\r
+}\r
+\r
+struct dapl_fd_set {\r
+       int index;\r
+       struct pollfd set[DAPL_FD_SETSIZE];\r
+};\r
+\r
+static struct dapl_fd_set *dapl_alloc_fd_set(void)\r
+{\r
+       return dapl_os_alloc(sizeof(struct dapl_fd_set));\r
+}\r
+\r
+static void dapl_fd_zero(struct dapl_fd_set *set)\r
+{\r
+       set->index = 0;\r
+}\r
+\r
+static int dapl_fd_set(DAPL_SOCKET s, struct dapl_fd_set *set,\r
+                      enum DAPL_FD_EVENTS event)\r
+{\r
+       if (set->index == DAPL_FD_SETSIZE - 1) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        "SCM ERR: cm_thread exceeded FD_SETSIZE %d\n",\r
+                        set->index + 1);\r
+               return -1;\r
+       }\r
+\r
+       set->set[set->index].fd = s;\r
+       set->set[set->index].revents = 0;\r
+       set->set[set->index++].events = event;\r
+       return 0;\r
+}\r
+\r
+static enum DAPL_FD_EVENTS dapl_poll(DAPL_SOCKET s, enum DAPL_FD_EVENTS event)\r
+{\r
+       struct pollfd fds;\r
+       int ret;\r
+\r
+       fds.fd = s;\r
+       fds.events = event;\r
+       fds.revents = 0;\r
+       ret = poll(&fds, 1, 0);\r
+       dapl_log(DAPL_DBG_TYPE_CM, " dapl_poll: fd=%d ret=%d, evnts=0x%x\n",\r
+                s, ret, fds.revents);\r
+       if (ret == 0)\r
+               return 0;\r
+       else if (fds.revents & (POLLERR | POLLHUP | POLLNVAL)) \r
+               return DAPL_FD_ERROR;\r
+       else \r
+               return fds.revents;\r
+}\r
+\r
+static int dapl_select(struct dapl_fd_set *set)\r
+{\r
+       int ret;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CM, " dapl_select: sleep, fds=%d\n",\r
+                    set->index);\r
+       ret = poll(set->set, set->index, -1);\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CM, " dapl_select: wakeup, ret=0x%x\n", ret);\r
+       return ret;\r
+}\r
+#endif\r
+\r
+dp_ib_cm_handle_t dapls_ib_cm_create(DAPL_EP *ep)\r
+{\r
+       dp_ib_cm_handle_t cm_ptr;\r
+\r
+       /* Allocate CM, init lock, and initialize */\r
+       if ((cm_ptr = dapl_os_alloc(sizeof(*cm_ptr))) == NULL)\r
+               return NULL;\r
+\r
+       (void)dapl_os_memzero(cm_ptr, sizeof(*cm_ptr));\r
+       if (dapl_os_lock_init(&cm_ptr->lock))\r
+               goto bail;\r
+\r
+       cm_ptr->dst.ver = htons(DCM_VER);\r
+       cm_ptr->socket = DAPL_INVALID_SOCKET;\r
+       cm_ptr->ep = ep;\r
+       return cm_ptr;\r
+bail:\r
+       dapl_os_free(cm_ptr, sizeof(*cm_ptr));\r
+       return NULL;\r
+}\r
+\r
+/* mark for destroy, remove all references, schedule cleanup */\r
+/* cm_ptr == NULL (UD), then multi CR's, kill all associated with EP */\r
+void dapls_ib_cm_free(dp_ib_cm_handle_t cm_ptr, DAPL_EP *ep)\r
+{\r
+       DAPL_IA *ia_ptr;\r
+       DAPL_HCA *hca_ptr = NULL;\r
+       dp_ib_cm_handle_t cr, next_cr;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                    " cm_destroy: cm %p ep %p\n", cm_ptr, ep);\r
+\r
+       if (cm_ptr == NULL)\r
+               goto multi_cleanup;\r
+\r
+       /* to notify cleanup thread */\r
+       hca_ptr = cm_ptr->hca;\r
+\r
+       /* cleanup, never made it to work queue */\r
+       dapl_os_lock(&cm_ptr->lock);\r
+       if (cm_ptr->state == DCM_INIT) {\r
+               if (cm_ptr->socket != DAPL_INVALID_SOCKET) {\r
+                       shutdown(cm_ptr->socket, SHUT_RDWR);\r
+                       closesocket(cm_ptr->socket);\r
+               }\r
+               dapl_os_unlock(&cm_ptr->lock);\r
+               dapl_os_free(cm_ptr, sizeof(*cm_ptr));\r
+               return;\r
+       }\r
+\r
+       /* free could be called before disconnect, disc_clean will destroy */\r
+       if (cm_ptr->state == DCM_CONNECTED) {\r
+               dapl_os_unlock(&cm_ptr->lock);\r
+               dapli_socket_disconnect(cm_ptr);\r
+               return;\r
+       }\r
+\r
+       cm_ptr->state = DCM_DESTROY;\r
+       if ((cm_ptr->ep) && (cm_ptr->ep->cm_handle == cm_ptr)) {\r
+               cm_ptr->ep->cm_handle = IB_INVALID_HANDLE;\r
+               cm_ptr->ep = NULL;\r
+       }\r
+\r
+       /* close socket if still active */\r
+       if (cm_ptr->socket != DAPL_INVALID_SOCKET) {\r
+               shutdown(cm_ptr->socket, SHUT_RDWR);\r
+               closesocket(cm_ptr->socket);\r
+               cm_ptr->socket = DAPL_INVALID_SOCKET;\r
+       }\r
+       dapl_os_unlock(&cm_ptr->lock);\r
+       goto notify_thread;\r
+\r
+multi_cleanup:\r
+\r
+       /* \r
+        * UD CR objects are kept active because of direct private data references\r
+        * from CONN events. The cr->socket is closed and marked inactive but the \r
+        * object remains allocated and queued on the CR resource list. There can\r
+        * be multiple CR's associated with a given EP. There is no way to determine \r
+        * when consumer is finished with event until the dat_ep_free.\r
+        *\r
+        * Schedule destruction for all CR's associated with this EP, cr_thread will\r
+        * complete the cleanup with state == DCM_DESTROY. \r
+        */ \r
+       ia_ptr = ep->header.owner_ia;\r
+       dapl_os_lock(&ia_ptr->hca_ptr->ib_trans.lock);\r
+       if (!dapl_llist_is_empty((DAPL_LLIST_HEAD*)\r
+                                 &ia_ptr->hca_ptr->ib_trans.list))\r
+            next_cr = dapl_llist_peek_head((DAPL_LLIST_HEAD*)\r
+                                           &ia_ptr->hca_ptr->ib_trans.list);\r
+       else\r
+           next_cr = NULL;\r
+\r
+       while (next_cr) {\r
+               cr = next_cr;\r
+               next_cr = dapl_llist_next_entry((DAPL_LLIST_HEAD*)\r
+                                               &ia_ptr->hca_ptr->ib_trans.list,\r
+                                               (DAPL_LLIST_ENTRY*)&cr->entry);\r
+               if (cr->ep == ep)  {\r
+                       dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+                                    " qp_free CR: ep %p cr %p\n", ep, cr);\r
+                       dapli_socket_disconnect(cr);\r
+                       dapl_os_lock(&cr->lock);\r
+                       hca_ptr = cr->hca;\r
+                       cr->ep = NULL;\r
+                       cr->state = DCM_DESTROY;\r
+                       dapl_os_unlock(&cr->lock);\r
+               }\r
+       }\r
+       dapl_os_unlock(&ia_ptr->hca_ptr->ib_trans.lock);\r
+\r
+notify_thread:\r
+\r
+       /* wakeup work thread, if something destroyed */\r
+       if (hca_ptr != NULL) {\r
+               if (send(hca_ptr->ib_trans.scm[1], \r
+                        "w", sizeof "w", 0) == -1)\r
+                       dapl_log(DAPL_DBG_TYPE_CM,\r
+                                " cm_destroy: thread wakeup error = %s\n",\r
+                                strerror(errno));\r
+       }\r
+}\r
+\r
+/* queue socket for processing CM work */\r
+static void dapli_cm_queue(struct ib_cm_handle *cm_ptr)\r
+{\r
+       /* add to work queue for cr thread processing */\r
+       dapl_llist_init_entry((DAPL_LLIST_ENTRY *) & cm_ptr->entry);\r
+       dapl_os_lock(&cm_ptr->hca->ib_trans.lock);\r
+       dapl_llist_add_tail(&cm_ptr->hca->ib_trans.list,\r
+                           (DAPL_LLIST_ENTRY *) & cm_ptr->entry, cm_ptr);\r
+       dapl_os_unlock(&cm_ptr->hca->ib_trans.lock);\r
+\r
+       /* wakeup CM work thread */\r
+       if (send(cm_ptr->hca->ib_trans.scm[1], "w", sizeof "w", 0) == -1)\r
+               dapl_log(DAPL_DBG_TYPE_CM,\r
+                        " cm_queue: thread wakeup error = %s\n",\r
+                        strerror(errno));\r
+}\r
+\r
+/*\r
+ * ACTIVE/PASSIVE: called from CR thread or consumer via ep_disconnect\r
+ *                 or from ep_free\r
+ */\r
+DAT_RETURN dapli_socket_disconnect(dp_ib_cm_handle_t cm_ptr)\r
+{\r
+       DAPL_EP *ep_ptr = cm_ptr->ep;\r
+       DAT_UINT32 disc_data = htonl(0xdead);\r
+\r
+       if (ep_ptr == NULL)\r
+               return DAT_SUCCESS;\r
+\r
+       dapl_os_lock(&cm_ptr->lock);\r
+       if ((cm_ptr->state == DCM_INIT) ||\r
+           (cm_ptr->state == DCM_DISCONNECTED) ||\r
+           (cm_ptr->state == DCM_DESTROY)) {\r
+               dapl_os_unlock(&cm_ptr->lock);\r
+               return DAT_SUCCESS;\r
+       } else {\r
+               /* send disc date, close socket, schedule destroy */\r
+               if (cm_ptr->socket != DAPL_INVALID_SOCKET) {\r
+                       if (send(cm_ptr->socket, (char *)&disc_data,\r
+                                sizeof(disc_data), 0) == -1)\r
+                               dapl_log(DAPL_DBG_TYPE_WARN,\r
+                                        " cm_disc: write error = %s\n",\r
+                                        strerror(errno));\r
+                       shutdown(cm_ptr->socket, SHUT_RDWR);\r
+                       closesocket(cm_ptr->socket);\r
+                       cm_ptr->socket = DAPL_INVALID_SOCKET;\r
+               }\r
+               cm_ptr->state = DCM_DISCONNECTED;\r
+       }\r
+       dapl_os_unlock(&cm_ptr->lock);\r
+\r
+       /* disconnect events for RC's only */\r
+       if (ep_ptr->param.ep_attr.service_type == DAT_SERVICE_TYPE_RC) {\r
+               if (ep_ptr->cr_ptr) {\r
+                       dapls_cr_callback(cm_ptr,\r
+                                         IB_CME_DISCONNECTED,\r
+                                         NULL,\r
+                                         ((DAPL_CR *) ep_ptr->cr_ptr)->sp_ptr);\r
+               } else {\r
+                       dapl_evd_connection_callback(ep_ptr->cm_handle,\r
+                                                    IB_CME_DISCONNECTED,\r
+                                                    NULL, ep_ptr);\r
+               }\r
+       }\r
+\r
+       /* scheduled destroy via disconnect clean in callback */\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+/*\r
+ * ACTIVE: socket connected, send QP information to peer \r
+ */\r
+static void dapli_socket_connected(dp_ib_cm_handle_t cm_ptr, int err)\r
+{\r
+       int ret, len, opt = 1;\r
+       struct iovec iov[2];\r
+       struct dapl_ep *ep_ptr = cm_ptr->ep;\r
+\r
+       if (err) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " CONN_PENDING: %s ERR %s -> %s %d\n",\r
+                        err == -1 ? "POLL" : "SOCKOPT",\r
+                        err == -1 ? strerror(errno) : strerror(err), \r
+                        inet_ntoa(((struct sockaddr_in *)\r
+                                  ep_ptr->param.\r
+                                  remote_ia_address_ptr)->sin_addr), \r
+                        ntohs(((struct sockaddr_in *)\r
+                               &cm_ptr->dst.ia_address)->sin_port));\r
+               goto bail;\r
+       }\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+                    " socket connected, write QP and private data\n");\r
+\r
+       /* no delay for small packets */\r
+       ret = setsockopt(cm_ptr->socket, IPPROTO_TCP, TCP_NODELAY,\r
+                        (char *)&opt, sizeof(opt));\r
+       if (ret)\r
+               dapl_log(DAPL_DBG_TYPE_WARN,\r
+                        " connected: NODELAY setsockopt: %s\n",\r
+                        strerror(errno));\r
+\r
+       /* send qp info and pdata to remote peer */\r
+       iov[0].iov_base = (void *)&cm_ptr->dst;\r
+       iov[0].iov_len = sizeof(ib_qp_cm_t);\r
+       if (cm_ptr->dst.p_size) {\r
+               iov[1].iov_base = cm_ptr->p_data;\r
+               iov[1].iov_len = ntohl(cm_ptr->dst.p_size);\r
+               len = writev(cm_ptr->socket, iov, 2);\r
+       } else {\r
+               len = writev(cm_ptr->socket, iov, 1);\r
+       }\r
+\r
+       if (len != (ntohl(cm_ptr->dst.p_size) + sizeof(ib_qp_cm_t))) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " CONN_PENDING write: ERR %s, wcnt=%d -> %s\n",\r
+                        strerror(errno), len, inet_ntoa(((struct sockaddr_in *)\r
+                                                         ep_ptr->param.\r
+                                                         remote_ia_address_ptr)->\r
+                                                        sin_addr));\r
+               goto bail;\r
+       }\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                    " connected: sending SRC port=0x%x lid=0x%x,"\r
+                    " qpn=0x%x, psize=%d\n",\r
+                    ntohs(cm_ptr->dst.port), ntohs(cm_ptr->dst.lid),\r
+                    ntohl(cm_ptr->dst.qpn), ntohl(cm_ptr->dst.p_size));\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                    " connected: sending SRC GID subnet %016llx id %016llx\n",\r
+                    (unsigned long long)\r
+                    htonll(cm_ptr->dst.gid.global.subnet_prefix),\r
+                    (unsigned long long)\r
+                    htonll(cm_ptr->dst.gid.global.interface_id));\r
+\r
+       /* queue up to work thread to avoid blocking consumer */\r
+       cm_ptr->state = DCM_RTU_PENDING;\r
+       return;\r
+      bail:\r
+       /* close socket, free cm structure and post error event */\r
+       dapls_ib_cm_free(cm_ptr, cm_ptr->ep);\r
+       dapl_evd_connection_callback(NULL, IB_CME_LOCAL_FAILURE, NULL, ep_ptr);\r
+}\r
+\r
+/*\r
+ * ACTIVE: Create socket, connect, defer exchange QP information to CR thread\r
+ * to avoid blocking. \r
+ */\r
+DAT_RETURN\r
+dapli_socket_connect(DAPL_EP * ep_ptr,\r
+                    DAT_IA_ADDRESS_PTR r_addr,\r
+                    DAT_CONN_QUAL r_qual, DAT_COUNT p_size, DAT_PVOID p_data)\r
+{\r
+       dp_ib_cm_handle_t cm_ptr;\r
+       int ret;\r
+       DAPL_IA *ia_ptr = ep_ptr->header.owner_ia;\r
+       struct sockaddr_in addr;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP, " connect: r_qual %d p_size=%d\n",\r
+                    r_qual, p_size);\r
+\r
+       cm_ptr = dapls_ib_cm_create(ep_ptr);\r
+       if (cm_ptr == NULL)\r
+               return DAT_INSUFFICIENT_RESOURCES;\r
+\r
+       /* create, connect, sockopt, and exchange QP information */\r
+       if ((cm_ptr->socket =\r
+            socket(AF_INET, SOCK_STREAM, 0)) == DAPL_INVALID_SOCKET) {\r
+               dapl_os_free(cm_ptr, sizeof(*cm_ptr));\r
+               return DAT_INSUFFICIENT_RESOURCES;\r
+       }\r
+\r
+       ret = dapl_config_socket(cm_ptr->socket);\r
+       if (ret < 0) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " socket connect: config socket %d ERR %d %s\n",\r
+                        cm_ptr->socket, ret, strerror(errno));\r
+               goto bail;\r
+       }\r
+\r
+       dapl_os_memcpy(&addr, r_addr, sizeof(addr));\r
+       addr.sin_port = htons(r_qual);\r
+       ret = dapl_connect_socket(cm_ptr->socket, (struct sockaddr *)&addr,\r
+                                 sizeof(addr));\r
+       if (ret && ret != EAGAIN) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " socket connect ERROR: %s -> %s r_qual %d\n",\r
+                        strerror(errno),\r
+                        inet_ntoa(addr.sin_addr), (unsigned int)r_qual);\r
+               dapls_ib_cm_free(cm_ptr, cm_ptr->ep);\r
+               return DAT_INVALID_ADDRESS;\r
+       }\r
+\r
+       /* Send QP info, IA address, and private data */\r
+       cm_ptr->dst.qpn = htonl(ep_ptr->qp_handle->qp_num);\r
+#ifdef DAT_EXTENSIONS\r
+       cm_ptr->dst.qp_type = htons(ep_ptr->qp_handle->qp_type);\r
+#endif\r
+       cm_ptr->dst.port = htons(ia_ptr->hca_ptr->port_num);\r
+       cm_ptr->dst.lid = ia_ptr->hca_ptr->ib_trans.lid;\r
+       cm_ptr->dst.gid = ia_ptr->hca_ptr->ib_trans.gid;\r
+\r
+       /* save references */\r
+       cm_ptr->hca = ia_ptr->hca_ptr;\r
+       cm_ptr->ep = ep_ptr;\r
+       cm_ptr->dst.ia_address = ia_ptr->hca_ptr->hca_address;\r
+       ((struct sockaddr_in *)\r
+               &cm_ptr->dst.ia_address)->sin_port = ntohs(r_qual);\r
+\r
+       if (p_size) {\r
+               cm_ptr->dst.p_size = htonl(p_size);\r
+               dapl_os_memcpy(cm_ptr->p_data, p_data, p_size);\r
+       }\r
+\r
+       /* connected or pending, either way results via async event */\r
+       if (ret == 0)\r
+               dapli_socket_connected(cm_ptr, 0);\r
+       else\r
+               cm_ptr->state = DCM_CONN_PENDING;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+                    " connect: socket %d to %s r_qual %d pending\n",\r
+                    cm_ptr->socket,\r
+                    inet_ntoa(addr.sin_addr), (unsigned int)r_qual);\r
+\r
+       dapli_cm_queue(cm_ptr);\r
+       return DAT_SUCCESS;\r
+      bail:\r
+       dapl_log(DAPL_DBG_TYPE_ERR,\r
+                " socket connect ERROR: %s query lid(0x%x)/gid"\r
+                " -> %s r_qual %d\n",\r
+                strerror(errno), ntohs(cm_ptr->dst.lid),\r
+                inet_ntoa(((struct sockaddr_in *)r_addr)->sin_addr),\r
+                (unsigned int)r_qual);\r
+\r
+       /* close socket, free cm structure */\r
+       dapls_ib_cm_free(cm_ptr, cm_ptr->ep);\r
+       return DAT_INTERNAL_ERROR;\r
+}\r
+\r
+/*\r
+ * ACTIVE: exchange QP information, called from CR thread\r
+ */\r
+static void dapli_socket_connect_rtu(dp_ib_cm_handle_t cm_ptr)\r
+{\r
+       DAPL_EP *ep_ptr = cm_ptr->ep;\r
+       int len;\r
+       short rtu_data = htons(0x0E0F);\r
+       ib_cm_events_t event = IB_CME_DESTINATION_REJECT;\r
+\r
+       /* read DST information into cm_ptr, overwrite SRC info */\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP, " connect_rtu: recv peer QP data\n");\r
+\r
+       len = recv(cm_ptr->socket, (char *)&cm_ptr->dst, sizeof(ib_qp_cm_t), 0);\r
+       if (len != sizeof(ib_qp_cm_t) || ntohs(cm_ptr->dst.ver) != DCM_VER) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " CONN_RTU read: ERR %s, rcnt=%d, ver=%d -> %s\n",\r
+                        strerror(errno), len, cm_ptr->dst.ver,\r
+                        inet_ntoa(((struct sockaddr_in *)\r
+                                   ep_ptr->param.remote_ia_address_ptr)->\r
+                                  sin_addr));\r
+               goto bail;\r
+       }\r
+\r
+       /* convert peer response values to host order */\r
+       cm_ptr->dst.port = ntohs(cm_ptr->dst.port);\r
+       cm_ptr->dst.lid = ntohs(cm_ptr->dst.lid);\r
+       cm_ptr->dst.qpn = ntohl(cm_ptr->dst.qpn);\r
+#ifdef DAT_EXTENSIONS\r
+       cm_ptr->dst.qp_type = ntohs(cm_ptr->dst.qp_type);\r
+#endif\r
+       cm_ptr->dst.p_size = ntohl(cm_ptr->dst.p_size);\r
+\r
+       /* save remote address information */\r
+       dapl_os_memcpy(&ep_ptr->remote_ia_address,\r
+                      &cm_ptr->dst.ia_address,\r
+                      sizeof(ep_ptr->remote_ia_address));\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+                    " CONN_RTU: DST %s port=0x%x lid=0x%x,"\r
+                    " qpn=0x%x, qp_type=%d, psize=%d\n",\r
+                    inet_ntoa(((struct sockaddr_in *)\r
+                               &cm_ptr->dst.ia_address)->sin_addr),\r
+                    cm_ptr->dst.port, cm_ptr->dst.lid,\r
+                    cm_ptr->dst.qpn, cm_ptr->dst.qp_type, cm_ptr->dst.p_size);\r
+\r
+       /* validate private data size before reading */\r
+       if (cm_ptr->dst.p_size > IB_MAX_REP_PDATA_SIZE) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " CONN_RTU read: psize (%d) wrong -> %s\n",\r
+                        cm_ptr->dst.p_size, inet_ntoa(((struct sockaddr_in *)\r
+                                                       ep_ptr->param.\r
+                                                       remote_ia_address_ptr)->\r
+                                                      sin_addr));\r
+               goto bail;\r
+       }\r
+\r
+       /* read private data into cm_handle if any present */\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+                    " socket connected, read private data\n");\r
+       if (cm_ptr->dst.p_size) {\r
+               len =\r
+                   recv(cm_ptr->socket, cm_ptr->p_data, cm_ptr->dst.p_size, 0);\r
+               if (len != cm_ptr->dst.p_size) {\r
+                       dapl_log(DAPL_DBG_TYPE_ERR,\r
+                                " CONN_RTU read pdata: ERR %s, rcnt=%d -> %s\n",\r
+                                strerror(errno), len,\r
+                                inet_ntoa(((struct sockaddr_in *)\r
+                                           ep_ptr->param.\r
+                                           remote_ia_address_ptr)->sin_addr));\r
+                       goto bail;\r
+               }\r
+       }\r
+\r
+       /* check for consumer reject */\r
+       if (cm_ptr->dst.rej) {\r
+               dapl_log(DAPL_DBG_TYPE_CM,\r
+                        " CONN_RTU read: PEER REJ reason=0x%x -> %s\n",\r
+                        ntohs(cm_ptr->dst.rej),\r
+                        inet_ntoa(((struct sockaddr_in *)\r
+                                   ep_ptr->param.remote_ia_address_ptr)->\r
+                                  sin_addr));\r
+               event = IB_CME_DESTINATION_REJECT_PRIVATE_DATA;\r
+#ifdef DAT_EXTENSIONS\r
+               if (cm_ptr->dst.qp_type == IBV_QPT_UD) \r
+                       goto ud_bail;\r
+               else\r
+#endif\r
+               goto bail;\r
+       }\r
+\r
+       /* modify QP to RTR and then to RTS with remote info */\r
+       dapl_os_lock(&ep_ptr->header.lock);\r
+       if (dapls_modify_qp_state(ep_ptr->qp_handle,\r
+                                 IBV_QPS_RTR, cm_ptr) != DAT_SUCCESS) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " CONN_RTU: QPS_RTR ERR %s -> %s\n",\r
+                        strerror(errno), inet_ntoa(((struct sockaddr_in *)\r
+                                                    ep_ptr->param.\r
+                                                    remote_ia_address_ptr)->\r
+                                                   sin_addr));\r
+               dapl_os_unlock(&ep_ptr->header.lock);\r
+               goto bail;\r
+       }\r
+       if (dapls_modify_qp_state(ep_ptr->qp_handle,\r
+                                 IBV_QPS_RTS, cm_ptr) != DAT_SUCCESS) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " CONN_RTU: QPS_RTS ERR %s -> %s\n",\r
+                        strerror(errno), inet_ntoa(((struct sockaddr_in *)\r
+                                                    ep_ptr->param.\r
+                                                    remote_ia_address_ptr)->\r
+                                                   sin_addr));\r
+               dapl_os_unlock(&ep_ptr->header.lock);\r
+               goto bail;\r
+       }\r
+       dapl_os_unlock(&ep_ptr->header.lock);\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP, " connect_rtu: send RTU\n");\r
+\r
+       /* complete handshake after final QP state change */\r
+       if (send(cm_ptr->socket, (char *)&rtu_data, sizeof(rtu_data), 0) == -1) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " CONN_RTU: write error = %s\n", strerror(errno));\r
+               goto bail;\r
+       }\r
+       /* init cm_handle and post the event with private data */\r
+       cm_ptr->state = DCM_CONNECTED;\r
+       event = IB_CME_CONNECTED;\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP, " ACTIVE: connected!\n");\r
+\r
+#ifdef DAT_EXTENSIONS\r
+ud_bail:\r
+       if (cm_ptr->dst.qp_type == IBV_QPT_UD) {\r
+               DAT_IB_EXTENSION_EVENT_DATA xevent;\r
+\r
+               /* post EVENT, modify_qp created ah */\r
+               xevent.status = 0;\r
+               xevent.type = DAT_IB_UD_REMOTE_AH;\r
+               xevent.remote_ah.ah = cm_ptr->ah;\r
+               xevent.remote_ah.qpn = cm_ptr->dst.qpn;\r
+               dapl_os_memcpy(&xevent.remote_ah.ia_addr,\r
+                              &cm_ptr->dst.ia_address,\r
+                              sizeof(cm_ptr->dst.ia_address));\r
+\r
+               if (event == IB_CME_CONNECTED)\r
+                       event = DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED;\r
+               else\r
+                       event = DAT_IB_UD_CONNECTION_REJECT_EVENT;\r
+\r
+               dapls_evd_post_connection_event_ext((DAPL_EVD *) ep_ptr->param.\r
+                                                   connect_evd_handle,\r
+                                                   event,\r
+                                                   (DAT_EP_HANDLE) ep_ptr,\r
+                                                   (DAT_COUNT) cm_ptr->dst.p_size,\r
+                                                   (DAT_PVOID *) cm_ptr->p_data,\r
+                                                   (DAT_PVOID *) &xevent);\r
+\r
+               /* done with socket, don't destroy cm_ptr, need pdata */\r
+               closesocket(cm_ptr->socket);\r
+               cm_ptr->socket = DAPL_INVALID_SOCKET;\r
+               cm_ptr->state = DCM_RELEASED;\r
+       } else\r
+#endif\r
+       {\r
+               ep_ptr->cm_handle = cm_ptr; /* only RC, multi CR's on UD */\r
+               dapl_evd_connection_callback(cm_ptr,\r
+                                            IB_CME_CONNECTED,\r
+                                            cm_ptr->p_data, ep_ptr);\r
+       }\r
+       return;\r
+\r
+bail:\r
+       /* close socket, and post error event */\r
+       dapls_ib_reinit_ep(ep_ptr);     /* reset QP state */\r
+       closesocket(cm_ptr->socket);\r
+       cm_ptr->socket = DAPL_INVALID_SOCKET;\r
+       dapl_evd_connection_callback(NULL, event, cm_ptr->p_data, ep_ptr);\r
+}\r
+\r
+/*\r
+ * PASSIVE: Create socket, listen, accept, exchange QP information \r
+ */\r
+DAT_RETURN\r
+dapli_socket_listen(DAPL_IA * ia_ptr, DAT_CONN_QUAL serviceID, DAPL_SP * sp_ptr)\r
+{\r
+       struct sockaddr_in addr;\r
+       ib_cm_srvc_handle_t cm_ptr = NULL;\r
+       int opt = 1;\r
+       DAT_RETURN dat_status = DAT_SUCCESS;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+                    " listen(ia_ptr %p ServiceID %d sp_ptr %p)\n",\r
+                    ia_ptr, serviceID, sp_ptr);\r
+\r
+       cm_ptr = dapls_ib_cm_create(NULL);\r
+       if (cm_ptr == NULL)\r
+               return DAT_INSUFFICIENT_RESOURCES;\r
+\r
+       cm_ptr->sp = sp_ptr;\r
+       cm_ptr->hca = ia_ptr->hca_ptr;\r
+\r
+       /* bind, listen, set sockopt, accept, exchange data */\r
+       if ((cm_ptr->socket =\r
+            socket(AF_INET, SOCK_STREAM, 0)) == DAPL_INVALID_SOCKET) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR, " ERR: listen socket create: %s\n",\r
+                        strerror(errno));\r
+               dat_status = DAT_INSUFFICIENT_RESOURCES;\r
+               goto bail;\r
+       }\r
+\r
+       setsockopt(cm_ptr->socket, SOL_SOCKET, SO_REUSEADDR,\r
+                  (char *)&opt, sizeof(opt));\r
+\r
+       addr.sin_port = htons(serviceID);\r
+       addr.sin_family = AF_INET;\r
+       addr.sin_addr.s_addr = INADDR_ANY;\r
+\r
+       if ((bind(cm_ptr->socket, (struct sockaddr *)&addr, sizeof(addr)) < 0)\r
+           || (listen(cm_ptr->socket, 128) < 0)) {\r
+               dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                            " listen: ERROR %s on conn_qual 0x%x\n",\r
+                            strerror(errno), serviceID);\r
+               if (errno == EADDRINUSE)\r
+                       dat_status = DAT_CONN_QUAL_IN_USE;\r
+               else\r
+                       dat_status = DAT_CONN_QUAL_UNAVAILABLE;\r
+               goto bail;\r
+       }\r
+\r
+       /* set cm_handle for this service point, save listen socket */\r
+       sp_ptr->cm_srvc_handle = cm_ptr;\r
+\r
+       /* queue up listen socket to process inbound CR's */\r
+       cm_ptr->state = DCM_LISTEN;\r
+       dapli_cm_queue(cm_ptr);\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                    " listen: qual 0x%x cr %p s_fd %d\n",\r
+                    ntohs(serviceID), cm_ptr, cm_ptr->socket);\r
+\r
+       return dat_status;\r
+      bail:\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                    " listen: ERROR on conn_qual 0x%x\n", serviceID);\r
+       dapls_ib_cm_free(cm_ptr, cm_ptr->ep);\r
+       return dat_status;\r
+}\r
+\r
+/*\r
+ * PASSIVE: accept socket \r
+ */\r
+static void dapli_socket_accept(ib_cm_srvc_handle_t cm_ptr)\r
+{\r
+       dp_ib_cm_handle_t acm_ptr;\r
+       int ret, len, opt = 1;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP, " socket_accept\n");\r
+       \r
+       /* \r
+        * Accept all CR's on this port to avoid half-connection (SYN_RCV)\r
+        * stalls with many to one connection storms\r
+        */\r
+       do {\r
+               /* Allocate accept CM and initialize */\r
+               if ((acm_ptr = dapls_ib_cm_create(NULL)) == NULL)\r
+                       return;\r
+\r
+               acm_ptr->sp = cm_ptr->sp;\r
+               acm_ptr->hca = cm_ptr->hca;\r
+\r
+               len = sizeof(acm_ptr->dst.ia_address);\r
+               acm_ptr->socket = accept(cm_ptr->socket,\r
+                                       (struct sockaddr *)\r
+                                       &acm_ptr->dst.ia_address,\r
+                                       (socklen_t *) & len);\r
+               if (acm_ptr->socket == DAPL_INVALID_SOCKET) {\r
+                       dapl_log(DAPL_DBG_TYPE_ERR,\r
+                               " accept: ERR %s on FD %d l_cr %p\n",\r
+                               strerror(errno), cm_ptr->socket, cm_ptr);\r
+                       dapls_ib_cm_free(acm_ptr, acm_ptr->ep);\r
+                       return;\r
+               }\r
+\r
+               /* no delay for small packets */\r
+               ret = setsockopt(acm_ptr->socket, IPPROTO_TCP, TCP_NODELAY,\r
+                          (char *)&opt, sizeof(opt));\r
+               if (ret)\r
+                       dapl_log(DAPL_DBG_TYPE_WARN,\r
+                                " accept: NODELAY setsockopt: %s\n",\r
+                                strerror(errno));\r
+\r
+               acm_ptr->state = DCM_ACCEPTING;\r
+               dapli_cm_queue(acm_ptr);\r
+       \r
+       } while (dapl_poll(cm_ptr->socket, DAPL_FD_READ) == DAPL_FD_READ);\r
+}\r
+\r
+/*\r
+ * PASSIVE: receive peer QP information, private data, post cr_event \r
+ */\r
+static void dapli_socket_accept_data(ib_cm_srvc_handle_t acm_ptr)\r
+{\r
+       int len;\r
+       void *p_data = NULL;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP, " socket accepted, read QP data\n");\r
+\r
+       /* read in DST QP info, IA address. check for private data */\r
+       len =\r
+           recv(acm_ptr->socket, (char *)&acm_ptr->dst, sizeof(ib_qp_cm_t), 0);\r
+       if (len != sizeof(ib_qp_cm_t) || ntohs(acm_ptr->dst.ver) != DCM_VER) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " accept read: ERR %s, rcnt=%d, ver=%d\n",\r
+                        strerror(errno), len, ntohs(acm_ptr->dst.ver));\r
+               goto bail;\r
+       }\r
+\r
+       /* convert accepted values to host order */\r
+       acm_ptr->dst.port = ntohs(acm_ptr->dst.port);\r
+       acm_ptr->dst.lid = ntohs(acm_ptr->dst.lid);\r
+       acm_ptr->dst.qpn = ntohl(acm_ptr->dst.qpn);\r
+#ifdef DAT_EXTENSIONS\r
+       acm_ptr->dst.qp_type = ntohs(acm_ptr->dst.qp_type);\r
+#endif\r
+       acm_ptr->dst.p_size = ntohl(acm_ptr->dst.p_size);\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+                    " accept: DST %s port=0x%x lid=0x%x, qpn=0x%x, psize=%d\n",\r
+                    inet_ntoa(((struct sockaddr_in *)&acm_ptr->dst.\r
+                               ia_address)->sin_addr), acm_ptr->dst.port,\r
+                    acm_ptr->dst.lid, acm_ptr->dst.qpn, acm_ptr->dst.p_size);\r
+\r
+       /* validate private data size before reading */\r
+       if (acm_ptr->dst.p_size > IB_MAX_REQ_PDATA_SIZE) {\r
+               dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
+                            " accept read: psize (%d) wrong\n",\r
+                            acm_ptr->dst.p_size);\r
+               goto bail;\r
+       }\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP, " socket accepted, read private data\n");\r
+\r
+       /* read private data into cm_handle if any present */\r
+       if (acm_ptr->dst.p_size) {\r
+               len =\r
+                   recv(acm_ptr->socket, acm_ptr->p_data, acm_ptr->dst.p_size,\r
+                        0);\r
+               if (len != acm_ptr->dst.p_size) {\r
+                       dapl_log(DAPL_DBG_TYPE_ERR,\r
+                                " accept read pdata: ERR %s, rcnt=%d\n",\r
+                                strerror(errno), len);\r
+                       goto bail;\r
+               }\r
+               dapl_dbg_log(DAPL_DBG_TYPE_EP, " accept: psize=%d read\n", len);\r
+               p_data = acm_ptr->p_data;\r
+       }\r
+\r
+       acm_ptr->state = DCM_ACCEPTING_DATA;\r
+\r
+#ifdef DAT_EXTENSIONS\r
+       if (acm_ptr->dst.qp_type == IBV_QPT_UD) {\r
+               DAT_IB_EXTENSION_EVENT_DATA xevent;\r
+\r
+               /* post EVENT, modify_qp created ah */\r
+               xevent.status = 0;\r
+               xevent.type = DAT_IB_UD_CONNECT_REQUEST;\r
+\r
+               dapls_evd_post_cr_event_ext(acm_ptr->sp,\r
+                                           DAT_IB_UD_CONNECTION_REQUEST_EVENT,\r
+                                           acm_ptr,\r
+                                           (DAT_COUNT) acm_ptr->dst.p_size,\r
+                                           (DAT_PVOID *) acm_ptr->p_data,\r
+                                           (DAT_PVOID *) & xevent);\r
+       } else\r
+#endif\r
+               /* trigger CR event and return SUCCESS */\r
+               dapls_cr_callback(acm_ptr,\r
+                                 IB_CME_CONNECTION_REQUEST_PENDING,\r
+                                 p_data, acm_ptr->sp);\r
+       return;\r
+      bail:\r
+       /* close socket, free cm structure, active will see socket close as reject */\r
+       dapls_ib_cm_free(acm_ptr, acm_ptr->ep);\r
+       return;\r
+}\r
+\r
+/*\r
+ * PASSIVE: consumer accept, send local QP information, private data, \r
+ * queue on work thread to receive RTU information to avoid blocking\r
+ * user thread. \r
+ */\r
+DAT_RETURN\r
+dapli_socket_accept_usr(DAPL_EP * ep_ptr,\r
+                       DAPL_CR * cr_ptr, DAT_COUNT p_size, DAT_PVOID p_data)\r
+{\r
+       DAPL_IA *ia_ptr = ep_ptr->header.owner_ia;\r
+       dp_ib_cm_handle_t cm_ptr = cr_ptr->ib_cm_handle;\r
+       ib_qp_cm_t local;\r
+       struct iovec iov[2];\r
+       int len;\r
+\r
+       if (p_size > IB_MAX_REP_PDATA_SIZE)\r
+               return DAT_LENGTH_ERROR;\r
+\r
+       /* must have a accepted socket */\r
+       if (cm_ptr->socket == DAPL_INVALID_SOCKET)\r
+               return DAT_INTERNAL_ERROR;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+                    " ACCEPT_USR: remote port=0x%x lid=0x%x"\r
+                    " qpn=0x%x qp_type %d, psize=%d\n",\r
+                    cm_ptr->dst.port, cm_ptr->dst.lid,\r
+                    cm_ptr->dst.qpn, cm_ptr->dst.qp_type, cm_ptr->dst.p_size);\r
+\r
+#ifdef DAT_EXTENSIONS\r
+       if (cm_ptr->dst.qp_type == IBV_QPT_UD &&\r
+           ep_ptr->qp_handle->qp_type != IBV_QPT_UD) {\r
+               dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
+                            " ACCEPT_USR: ERR remote QP is UD,"\r
+                            ", but local QP is not\n");\r
+               return (DAT_INVALID_HANDLE | DAT_INVALID_HANDLE_EP);\r
+       }\r
+#endif\r
+\r
+       /* modify QP to RTR and then to RTS with remote info already read */\r
+       dapl_os_lock(&ep_ptr->header.lock);\r
+       if (dapls_modify_qp_state(ep_ptr->qp_handle,\r
+                                 IBV_QPS_RTR, cm_ptr) != DAT_SUCCESS) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " ACCEPT_USR: QPS_RTR ERR %s -> %s\n",\r
+                        strerror(errno), inet_ntoa(((struct sockaddr_in *)\r
+                                                    &cm_ptr->dst.ia_address)->\r
+                                                   sin_addr));\r
+               dapl_os_unlock(&ep_ptr->header.lock);\r
+               goto bail;\r
+       }\r
+       if (dapls_modify_qp_state(ep_ptr->qp_handle,\r
+                                 IBV_QPS_RTS, cm_ptr) != DAT_SUCCESS) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " ACCEPT_USR: QPS_RTS ERR %s -> %s\n",\r
+                        strerror(errno), inet_ntoa(((struct sockaddr_in *)\r
+                                                    &cm_ptr->dst.ia_address)->\r
+                                                   sin_addr));\r
+               dapl_os_unlock(&ep_ptr->header.lock);\r
+               goto bail;\r
+       }\r
+       dapl_os_unlock(&ep_ptr->header.lock);\r
+\r
+       /* save remote address information */\r
+       dapl_os_memcpy(&ep_ptr->remote_ia_address,\r
+                      &cm_ptr->dst.ia_address,\r
+                      sizeof(ep_ptr->remote_ia_address));\r
+\r
+       /* send our QP info, IA address, pdata. Don't overwrite dst data */\r
+       local.ver = htons(DCM_VER);\r
+       local.rej = 0;\r
+       local.qpn = htonl(ep_ptr->qp_handle->qp_num);\r
+       local.qp_type = htons(ep_ptr->qp_handle->qp_type);\r
+       local.port = htons(ia_ptr->hca_ptr->port_num);\r
+       local.lid = ia_ptr->hca_ptr->ib_trans.lid;\r
+       local.gid = ia_ptr->hca_ptr->ib_trans.gid;\r
+       local.ia_address = ia_ptr->hca_ptr->hca_address;\r
+       ((struct sockaddr_in *)&local.ia_address)->sin_port = \r
+               ntohs(cm_ptr->sp->conn_qual);\r
+\r
+       local.p_size = htonl(p_size);\r
+       iov[0].iov_base = (void *)&local;\r
+       iov[0].iov_len = sizeof(ib_qp_cm_t);\r
+       if (p_size) {\r
+               iov[1].iov_base = p_data;\r
+               iov[1].iov_len = p_size;\r
+               len = writev(cm_ptr->socket, iov, 2);\r
+       } else {\r
+               len = writev(cm_ptr->socket, iov, 1);\r
+       }\r
+\r
+       if (len != (p_size + sizeof(ib_qp_cm_t))) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " ACCEPT_USR: ERR %s, wcnt=%d -> %s\n",\r
+                        strerror(errno), len, inet_ntoa(((struct sockaddr_in *)\r
+                                                         &cm_ptr->dst.\r
+                                                         ia_address)->\r
+                                                        sin_addr));\r
+               goto bail;\r
+       }\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                    " ACCEPT_USR: local port=0x%x lid=0x%x"\r
+                    " qpn=0x%x psize=%d\n",\r
+                    ntohs(local.port), ntohs(local.lid),\r
+                    ntohl(local.qpn), ntohl(local.p_size));\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                    " ACCEPT_USR SRC GID subnet %016llx id %016llx\n",\r
+                    (unsigned long long)\r
+                    htonll(local.gid.global.subnet_prefix),\r
+                    (unsigned long long)\r
+                    htonll(local.gid.global.interface_id));\r
+\r
+       /* save state and reference to EP, queue for RTU data */\r
+       cm_ptr->ep = ep_ptr;\r
+       cm_ptr->hca = ia_ptr->hca_ptr;\r
+       cm_ptr->state = DCM_ACCEPTED;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP, " PASSIVE: accepted!\n");\r
+       return DAT_SUCCESS;\r
+      bail:\r
+       dapls_ib_cm_free(cm_ptr, cm_ptr->ep);\r
+       dapls_ib_reinit_ep(ep_ptr);     /* reset QP state */\r
+       return DAT_INTERNAL_ERROR;\r
+}\r
+\r
+/*\r
+ * PASSIVE: read RTU from active peer, post CONN event\r
+ */\r
+void dapli_socket_accept_rtu(dp_ib_cm_handle_t cm_ptr)\r
+{\r
+       int len;\r
+       short rtu_data = 0;\r
+\r
+       /* complete handshake after final QP state change */\r
+       len = recv(cm_ptr->socket, (char *)&rtu_data, sizeof(rtu_data), 0);\r
+       if (len != sizeof(rtu_data) || ntohs(rtu_data) != 0x0e0f) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " ACCEPT_RTU: ERR %s, rcnt=%d rdata=%x\n",\r
+                        strerror(errno), len, ntohs(rtu_data),\r
+                        inet_ntoa(((struct sockaddr_in *)\r
+                                   &cm_ptr->dst.ia_address)->sin_addr));\r
+               goto bail;\r
+       }\r
+\r
+       /* save state and reference to EP, queue for disc event */\r
+       cm_ptr->state = DCM_CONNECTED;\r
+\r
+       /* final data exchange if remote QP state is good to go */\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP, " PASSIVE: connected!\n");\r
+\r
+#ifdef DAT_EXTENSIONS\r
+       if (cm_ptr->dst.qp_type == IBV_QPT_UD) {\r
+               DAT_IB_EXTENSION_EVENT_DATA xevent;\r
+\r
+               /* post EVENT, modify_qp created ah */\r
+               xevent.status = 0;\r
+               xevent.type = DAT_IB_UD_PASSIVE_REMOTE_AH;\r
+               xevent.remote_ah.ah = cm_ptr->ah;\r
+               xevent.remote_ah.qpn = cm_ptr->dst.qpn;\r
+               dapl_os_memcpy(&xevent.remote_ah.ia_addr,\r
+                              &cm_ptr->dst.ia_address,\r
+                              sizeof(cm_ptr->dst.ia_address));\r
+\r
+               dapls_evd_post_connection_event_ext((DAPL_EVD *) cm_ptr->ep->\r
+                                                   param.connect_evd_handle,\r
+                                                   DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED,\r
+                                                   (DAT_EP_HANDLE) cm_ptr->ep,\r
+                                                   (DAT_COUNT) cm_ptr->dst.p_size,\r
+                                                   (DAT_PVOID *) cm_ptr->p_data,\r
+                                                   (DAT_PVOID *) &xevent);\r
+\r
+                /* done with socket, don't destroy cm_ptr, need pdata */\r
+                closesocket(cm_ptr->socket);\r
+                cm_ptr->socket = DAPL_INVALID_SOCKET;\r
+               cm_ptr->state = DCM_RELEASED;\r
+       } else {\r
+#endif\r
+               cm_ptr->ep->cm_handle = cm_ptr; /* only RC, multi CR's on UD */\r
+               dapls_cr_callback(cm_ptr, IB_CME_CONNECTED, NULL, cm_ptr->sp);\r
+       }\r
+       return;\r
+      \r
+bail:\r
+       dapls_ib_reinit_ep(cm_ptr->ep); /* reset QP state */\r
+       dapls_ib_cm_free(cm_ptr, cm_ptr->ep);\r
+       dapls_cr_callback(cm_ptr, IB_CME_DESTINATION_REJECT, NULL, cm_ptr->sp);\r
+}\r
+\r
+/*\r
+ * dapls_ib_connect\r
+ *\r
+ * Initiate a connection with the passive listener on another node\r
+ *\r
+ * Input:\r
+ *     ep_handle,\r
+ *     remote_ia_address,\r
+ *     remote_conn_qual,\r
+ *     prd_size                size of private data and structure\r
+ *     prd_prt                 pointer to private data structure\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_INSUFFICIENT_RESOURCES\r
+ *     DAT_INVALID_PARAMETER\r
+ *\r
+ */\r
+DAT_RETURN\r
+dapls_ib_connect(IN DAT_EP_HANDLE ep_handle,\r
+                IN DAT_IA_ADDRESS_PTR remote_ia_address,\r
+                IN DAT_CONN_QUAL remote_conn_qual,\r
+                IN DAT_COUNT private_data_size, IN void *private_data)\r
+{\r
+       DAPL_EP *ep_ptr;\r
+       ib_qp_handle_t qp_ptr;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+                    " connect(ep_handle %p ....)\n", ep_handle);\r
+\r
+       ep_ptr = (DAPL_EP *) ep_handle;\r
+       qp_ptr = ep_ptr->qp_handle;\r
+\r
+       return (dapli_socket_connect(ep_ptr, remote_ia_address,\r
+                                    remote_conn_qual,\r
+                                    private_data_size, private_data));\r
+}\r
+\r
+/*\r
+ * dapls_ib_disconnect\r
+ *\r
+ * Disconnect an EP\r
+ *\r
+ * Input:\r
+ *     ep_handle,\r
+ *     disconnect_flags\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ */\r
+DAT_RETURN\r
+dapls_ib_disconnect(IN DAPL_EP * ep_ptr, IN DAT_CLOSE_FLAGS close_flags)\r
+{\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+                    "dapls_ib_disconnect(ep_handle %p ....)\n", ep_ptr);\r
+\r
+       /* reinit to modify QP state */\r
+       dapls_ib_reinit_ep(ep_ptr);\r
+\r
+       if (ep_ptr->cm_handle == NULL ||\r
+           ep_ptr->param.ep_state == DAT_EP_STATE_DISCONNECTED)\r
+               return DAT_SUCCESS;\r
+       else\r
+               return (dapli_socket_disconnect(ep_ptr->cm_handle));\r
+}\r
+\r
+/*\r
+ * dapls_ib_disconnect_clean\r
+ *\r
+ * Clean up outstanding connection data. This routine is invoked\r
+ * after the final disconnect callback has occurred. Only on the\r
+ * ACTIVE side of a connection. It is also called if dat_ep_connect\r
+ * times out using the consumer supplied timeout value.\r
+ *\r
+ * Input:\r
+ *     ep_ptr          DAPL_EP\r
+ *     active          Indicates active side of connection\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     void\r
+ *\r
+ */\r
+void\r
+dapls_ib_disconnect_clean(IN DAPL_EP * ep_ptr,\r
+                         IN DAT_BOOLEAN active,\r
+                         IN const ib_cm_events_t ib_cm_event)\r
+{\r
+       /* NOTE: SCM will only initialize cm_handle with RC type\r
+        * \r
+        * For UD there can many in-flight CR's so you \r
+        * cannot cleanup timed out CR's with EP reference \r
+        * alone since they share the same EP. The common\r
+        * code that handles connection timeout logic needs \r
+        * updated for UD support.\r
+        */\r
+       if (ep_ptr->cm_handle)\r
+               dapls_ib_cm_free(ep_ptr->cm_handle, ep_ptr);\r
+\r
+       return;\r
+}\r
+\r
+/*\r
+ * dapl_ib_setup_conn_listener\r
+ *\r
+ * Have the CM set up a connection listener.\r
+ *\r
+ * Input:\r
+ *     ibm_hca_handle          HCA handle\r
+ *     qp_handle                       QP handle\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_INSUFFICIENT_RESOURCES\r
+ *     DAT_INTERNAL_ERROR\r
+ *     DAT_CONN_QUAL_UNAVAILBLE\r
+ *     DAT_CONN_QUAL_IN_USE\r
+ *\r
+ */\r
+DAT_RETURN\r
+dapls_ib_setup_conn_listener(IN DAPL_IA * ia_ptr,\r
+                            IN DAT_UINT64 ServiceID, IN DAPL_SP * sp_ptr)\r
+{\r
+       return (dapli_socket_listen(ia_ptr, ServiceID, sp_ptr));\r
+}\r
+\r
+/*\r
+ * dapl_ib_remove_conn_listener\r
+ *\r
+ * Have the CM remove a connection listener.\r
+ *\r
+ * Input:\r
+ *     ia_handle               IA handle\r
+ *     ServiceID               IB Channel Service ID\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_INVALID_STATE\r
+ *\r
+ */\r
+DAT_RETURN\r
+dapls_ib_remove_conn_listener(IN DAPL_IA * ia_ptr, IN DAPL_SP * sp_ptr)\r
+{\r
+       ib_cm_srvc_handle_t cm_ptr = sp_ptr->cm_srvc_handle;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+                    "dapls_ib_remove_conn_listener(ia_ptr %p sp_ptr %p cm_ptr %p)\n",\r
+                    ia_ptr, sp_ptr, cm_ptr);\r
+\r
+       /* close accepted socket, free cm_srvc_handle and return */\r
+       if (cm_ptr != NULL) {\r
+               if (cm_ptr->socket != DAPL_INVALID_SOCKET) {\r
+                       shutdown(cm_ptr->socket, SHUT_RDWR);\r
+                       closesocket(cm_ptr->socket);\r
+                       cm_ptr->socket = DAPL_INVALID_SOCKET;\r
+               }\r
+               /* cr_thread will free */\r
+               cm_ptr->state = DCM_DESTROY;\r
+               sp_ptr->cm_srvc_handle = NULL;\r
+               if (send(cm_ptr->hca->ib_trans.scm[1], \r
+                        "w", sizeof "w", 0) == -1)\r
+                       dapl_log(DAPL_DBG_TYPE_CM,\r
+                                " cm_destroy: thread wakeup error = %s\n",\r
+                                strerror(errno));\r
+       }\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+/*\r
+ * dapls_ib_accept_connection\r
+ *\r
+ * Perform necessary steps to accept a connection\r
+ *\r
+ * Input:\r
+ *     cr_handle\r
+ *     ep_handle\r
+ *     private_data_size\r
+ *     private_data\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_INSUFFICIENT_RESOURCES\r
+ *     DAT_INTERNAL_ERROR\r
+ *\r
+ */\r
+DAT_RETURN\r
+dapls_ib_accept_connection(IN DAT_CR_HANDLE cr_handle,\r
+                          IN DAT_EP_HANDLE ep_handle,\r
+                          IN DAT_COUNT p_size, IN const DAT_PVOID p_data)\r
+{\r
+       DAPL_CR *cr_ptr;\r
+       DAPL_EP *ep_ptr;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+                    "dapls_ib_accept_connection(cr %p ep %p prd %p,%d)\n",\r
+                    cr_handle, ep_handle, p_data, p_size);\r
+\r
+       cr_ptr = (DAPL_CR *) cr_handle;\r
+       ep_ptr = (DAPL_EP *) ep_handle;\r
+\r
+       /* allocate and attach a QP if necessary */\r
+       if (ep_ptr->qp_state == DAPL_QP_STATE_UNATTACHED) {\r
+               DAT_RETURN status;\r
+               status = dapls_ib_qp_alloc(ep_ptr->header.owner_ia,\r
+                                          ep_ptr, ep_ptr);\r
+               if (status != DAT_SUCCESS)\r
+                       return status;\r
+       }\r
+       return (dapli_socket_accept_usr(ep_ptr, cr_ptr, p_size, p_data));\r
+}\r
+\r
+/*\r
+ * dapls_ib_reject_connection\r
+ *\r
+ * Reject a connection\r
+ *\r
+ * Input:\r
+ *     cr_handle\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_INTERNAL_ERROR\r
+ *\r
+ */\r
+DAT_RETURN\r
+dapls_ib_reject_connection(IN dp_ib_cm_handle_t cm_ptr,\r
+                          IN int reason,\r
+                          IN DAT_COUNT psize, IN const DAT_PVOID pdata)\r
+{\r
+       struct iovec iov[2];\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+                    " reject(cm %p reason %x, pdata %p, psize %d)\n",\r
+                    cm_ptr, reason, pdata, psize);\r
+\r
+        if (psize > IB_MAX_REJ_PDATA_SIZE)\r
+                return DAT_LENGTH_ERROR;\r
+\r
+       /* write reject data to indicate reject */\r
+       if (cm_ptr->socket != DAPL_INVALID_SOCKET) {\r
+               cm_ptr->dst.rej = (uint16_t) reason;\r
+               cm_ptr->dst.rej = htons(cm_ptr->dst.rej);\r
+               cm_ptr->dst.p_size = htonl(psize);\r
+               /* get qp_type from request */\r
+               cm_ptr->dst.qp_type = ntohs(cm_ptr->dst.qp_type);\r
+\r
+               iov[0].iov_base = (void *)&cm_ptr->dst;\r
+               iov[0].iov_len = sizeof(ib_qp_cm_t);\r
+               if (psize) {\r
+                       iov[1].iov_base = pdata;\r
+                       iov[1].iov_len = psize;\r
+                       writev(cm_ptr->socket, iov, 2);\r
+               } else {\r
+                       writev(cm_ptr->socket, iov, 1);\r
+               }\r
+\r
+               shutdown(cm_ptr->socket, SHUT_RDWR);\r
+               closesocket(cm_ptr->socket);\r
+               cm_ptr->socket = DAPL_INVALID_SOCKET;\r
+       }\r
+\r
+       /* cr_thread will destroy CR */\r
+       cm_ptr->state = DCM_DESTROY;\r
+       if (send(cm_ptr->hca->ib_trans.scm[1], "w", sizeof "w", 0) == -1)\r
+               dapl_log(DAPL_DBG_TYPE_CM,\r
+                        " cm_destroy: thread wakeup error = %s\n",\r
+                        strerror(errno));\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+/*\r
+ * dapls_ib_cm_remote_addr\r
+ *\r
+ * Obtain the remote IP address given a connection\r
+ *\r
+ * Input:\r
+ *     cr_handle\r
+ *\r
+ * Output:\r
+ *     remote_ia_address: where to place the remote address\r
+ *\r
+ * Returns:\r
+ *     DAT_SUCCESS\r
+ *     DAT_INVALID_HANDLE\r
+ *\r
+ */\r
+DAT_RETURN\r
+dapls_ib_cm_remote_addr(IN DAT_HANDLE dat_handle,\r
+                       OUT DAT_SOCK_ADDR6 * remote_ia_address)\r
+{\r
+       DAPL_HEADER *header;\r
+       dp_ib_cm_handle_t ib_cm_handle;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_EP,\r
+                    "dapls_ib_cm_remote_addr(dat_handle %p, ....)\n",\r
+                    dat_handle);\r
+\r
+       header = (DAPL_HEADER *) dat_handle;\r
+\r
+       if (header->magic == DAPL_MAGIC_EP)\r
+               ib_cm_handle = ((DAPL_EP *) dat_handle)->cm_handle;\r
+       else if (header->magic == DAPL_MAGIC_CR)\r
+               ib_cm_handle = ((DAPL_CR *) dat_handle)->ib_cm_handle;\r
+       else\r
+               return DAT_INVALID_HANDLE;\r
+\r
+       dapl_os_memcpy(remote_ia_address,\r
+                      &ib_cm_handle->dst.ia_address, sizeof(DAT_SOCK_ADDR6));\r
+\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+/*\r
+ * dapls_ib_private_data_size\r
+ *\r
+ * Return the size of private data given a connection op type\r
+ *\r
+ * Input:\r
+ *     prd_ptr         private data pointer\r
+ *     conn_op         connection operation type\r
+ *\r
+ * If prd_ptr is NULL, this is a query for the max size supported by\r
+ * the provider, otherwise it is the actual size of the private data\r
+ * contained in prd_ptr.\r
+ *\r
+ *\r
+ * Output:\r
+ *     None\r
+ *\r
+ * Returns:\r
+ *     length of private data\r
+ *\r
+ */\r
+int dapls_ib_private_data_size(IN DAPL_PRIVATE * prd_ptr,\r
+                              IN DAPL_PDATA_OP conn_op, IN DAPL_HCA * hca_ptr)\r
+{\r
+       int size;\r
+\r
+       switch (conn_op) {\r
+       case DAPL_PDATA_CONN_REQ:\r
+               {\r
+                       size = IB_MAX_REQ_PDATA_SIZE;\r
+                       break;\r
+               }\r
+       case DAPL_PDATA_CONN_REP:\r
+               {\r
+                       size = IB_MAX_REP_PDATA_SIZE;\r
+                       break;\r
+               }\r
+       case DAPL_PDATA_CONN_REJ:\r
+               {\r
+                       size = IB_MAX_REJ_PDATA_SIZE;\r
+                       break;\r
+               }\r
+       case DAPL_PDATA_CONN_DREQ:\r
+               {\r
+                       size = IB_MAX_DREQ_PDATA_SIZE;\r
+                       break;\r
+               }\r
+       case DAPL_PDATA_CONN_DREP:\r
+               {\r
+                       size = IB_MAX_DREP_PDATA_SIZE;\r
+                       break;\r
+               }\r
+       default:\r
+               {\r
+                       size = 0;\r
+               }\r
+\r
+       }                       /* end case */\r
+\r
+       return size;\r
+}\r
+\r
+/*\r
+ * Map all socket CM event codes to the DAT equivelent.\r
+ */\r
+#define DAPL_IB_EVENT_CNT      10\r
+\r
+static struct ib_cm_event_map {\r
+       const ib_cm_events_t ib_cm_event;\r
+       DAT_EVENT_NUMBER dat_event_num;\r
+} ib_cm_event_map[DAPL_IB_EVENT_CNT] = {\r
+/* 00 */ {IB_CME_CONNECTED, \r
+         DAT_CONNECTION_EVENT_ESTABLISHED},\r
+/* 01 */ {IB_CME_DISCONNECTED, \r
+         DAT_CONNECTION_EVENT_DISCONNECTED},\r
+/* 02 */ {IB_CME_DISCONNECTED_ON_LINK_DOWN,\r
+         DAT_CONNECTION_EVENT_DISCONNECTED},\r
+/* 03 */ {IB_CME_CONNECTION_REQUEST_PENDING, \r
+         DAT_CONNECTION_REQUEST_EVENT},\r
+/* 04 */ {IB_CME_CONNECTION_REQUEST_PENDING_PRIVATE_DATA,\r
+         DAT_CONNECTION_REQUEST_EVENT},\r
+/* 05 */ {IB_CME_DESTINATION_REJECT,\r
+         DAT_CONNECTION_EVENT_NON_PEER_REJECTED},\r
+/* 06 */ {IB_CME_DESTINATION_REJECT_PRIVATE_DATA,\r
+         DAT_CONNECTION_EVENT_PEER_REJECTED},\r
+/* 07 */ {IB_CME_DESTINATION_UNREACHABLE, \r
+         DAT_CONNECTION_EVENT_UNREACHABLE},\r
+/* 08 */ {IB_CME_TOO_MANY_CONNECTION_REQUESTS,\r
+         DAT_CONNECTION_EVENT_NON_PEER_REJECTED},\r
+/* 09 */ {IB_CME_LOCAL_FAILURE, \r
+         DAT_CONNECTION_EVENT_BROKEN}\r
+};\r
+\r
+/*\r
+ * dapls_ib_get_cm_event\r
+ *\r
+ * Return a DAT connection event given a provider CM event.\r
+ *\r
+ * Input:\r
+ *     dat_event_num   DAT event we need an equivelent CM event for\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     ib_cm_event of translated DAPL value\r
+ */\r
+DAT_EVENT_NUMBER\r
+dapls_ib_get_dat_event(IN const ib_cm_events_t ib_cm_event,\r
+                      IN DAT_BOOLEAN active)\r
+{\r
+       DAT_EVENT_NUMBER dat_event_num;\r
+       int i;\r
+\r
+       active = active;\r
+\r
+       if (ib_cm_event > IB_CME_LOCAL_FAILURE)\r
+               return (DAT_EVENT_NUMBER) 0;\r
+\r
+       dat_event_num = 0;\r
+       for (i = 0; i < DAPL_IB_EVENT_CNT; i++) {\r
+               if (ib_cm_event == ib_cm_event_map[i].ib_cm_event) {\r
+                       dat_event_num = ib_cm_event_map[i].dat_event_num;\r
+                       break;\r
+               }\r
+       }\r
+       dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,\r
+                    "dapls_ib_get_dat_event: event translate(%s) ib=0x%x dat=0x%x\n",\r
+                    active ? "active" : "passive", ib_cm_event, dat_event_num);\r
+\r
+       return dat_event_num;\r
+}\r
+\r
+/*\r
+ * dapls_ib_get_dat_event\r
+ *\r
+ * Return a DAT connection event given a provider CM event.\r
+ * \r
+ * Input:\r
+ *     ib_cm_event     event provided to the dapl callback routine\r
+ *     active          switch indicating active or passive connection\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     DAT_EVENT_NUMBER of translated provider value\r
+ */\r
+ib_cm_events_t dapls_ib_get_cm_event(IN DAT_EVENT_NUMBER dat_event_num)\r
+{\r
+       ib_cm_events_t ib_cm_event;\r
+       int i;\r
+\r
+       ib_cm_event = 0;\r
+       for (i = 0; i < DAPL_IB_EVENT_CNT; i++) {\r
+               if (dat_event_num == ib_cm_event_map[i].dat_event_num) {\r
+                       ib_cm_event = ib_cm_event_map[i].ib_cm_event;\r
+                       break;\r
+               }\r
+       }\r
+       return ib_cm_event;\r
+}\r
+\r
+/* outbound/inbound CR processing thread to avoid blocking applications */\r
+void cr_thread(void *arg)\r
+{\r
+       struct dapl_hca *hca_ptr = arg;\r
+       dp_ib_cm_handle_t cr, next_cr;\r
+       int opt, ret;\r
+       socklen_t opt_len;\r
+       char rbuf[2];\r
+       struct dapl_fd_set *set;\r
+       enum DAPL_FD_EVENTS event;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cr_thread: ENTER hca %p\n", hca_ptr);\r
+       set = dapl_alloc_fd_set();\r
+       if (!set)\r
+               goto out;\r
+\r
+       dapl_os_lock(&hca_ptr->ib_trans.lock);\r
+       hca_ptr->ib_trans.cr_state = IB_THREAD_RUN;\r
+\r
+       while (1) {\r
+               dapl_fd_zero(set);\r
+               dapl_fd_set(hca_ptr->ib_trans.scm[0], set, DAPL_FD_READ);\r
+\r
+               if (!dapl_llist_is_empty(&hca_ptr->ib_trans.list))\r
+                       next_cr = dapl_llist_peek_head(&hca_ptr->ib_trans.list);\r
+               else\r
+                       next_cr = NULL;\r
+\r
+               while (next_cr) {\r
+                       cr = next_cr;\r
+                       next_cr = dapl_llist_next_entry(&hca_ptr->ib_trans.list,\r
+                                                       (DAPL_LLIST_ENTRY *) &\r
+                                                       cr->entry);\r
+                       if (cr->state == DCM_DESTROY\r
+                           || hca_ptr->ib_trans.cr_state != IB_THREAD_RUN) {\r
+                               dapl_llist_remove_entry(&hca_ptr->ib_trans.list,\r
+                                                       (DAPL_LLIST_ENTRY *) &\r
+                                                       cr->entry);\r
+                               dapl_dbg_log(DAPL_DBG_TYPE_CM, \r
+                                            " CR FREE: %p ep=%p st=%d sock=%d\n", \r
+                                            cr, cr->ep, cr->state, cr->socket);\r
+                               dapl_os_free(cr, sizeof(*cr));\r
+                               continue;\r
+                       }\r
+                       if (cr->socket == DAPL_INVALID_SOCKET) \r
+                               continue;\r
+\r
+                       event = (cr->state == DCM_CONN_PENDING) ?\r
+                           DAPL_FD_WRITE : DAPL_FD_READ;\r
+                       if (dapl_fd_set(cr->socket, set, event)) {\r
+                               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                                        " cr_thread: DESTROY CR st=%d fd %d"\r
+                                        " -> %s\n", cr->state, cr->socket,\r
+                                        inet_ntoa(((struct sockaddr_in *)\r
+                                                   &cr->dst.ia_address)->\r
+                                                  sin_addr));\r
+                               dapls_ib_cm_free(cr, cr->ep);\r
+                               continue;\r
+                       }\r
+\r
+                       dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                                    " poll cr=%p, socket=%d\n", cr,\r
+                                    cr->socket);\r
+                       dapl_os_unlock(&hca_ptr->ib_trans.lock);\r
+\r
+                       ret = dapl_poll(cr->socket, event);\r
+\r
+                       dapl_dbg_log(DAPL_DBG_TYPE_CM,\r
+                                    " poll ret=0x%x cr->state=%d socket=%d\n",\r
+                                    ret, cr->state, cr->socket);\r
+\r
+                       /* data on listen, qp exchange, and on disc req */\r
+                       if (ret == DAPL_FD_READ) {\r
+                               if (cr->socket != DAPL_INVALID_SOCKET) {\r
+                                       switch (cr->state) {\r
+                                       case DCM_LISTEN:\r
+                                               dapli_socket_accept(cr);\r
+                                               break;\r
+                                       case DCM_ACCEPTING:\r
+                                               dapli_socket_accept_data(cr);\r
+                                               break;\r
+                                       case DCM_ACCEPTED:\r
+                                               dapli_socket_accept_rtu(cr);\r
+                                               break;\r
+                                       case DCM_RTU_PENDING:\r
+                                               dapli_socket_connect_rtu(cr);\r
+                                               break;\r
+                                       case DCM_CONNECTED:\r
+                                               dapli_socket_disconnect(cr);\r
+                                               break;\r
+                                       default:\r
+                                               break;\r
+                                       }\r
+                               }\r
+                       /* connect socket is writable, check status */\r
+                       } else if (ret == DAPL_FD_WRITE ||\r
+                                  (cr->state == DCM_CONN_PENDING && \r
+                                   ret == DAPL_FD_ERROR)) {\r
+                               opt = 0;\r
+                               opt_len = sizeof(opt);\r
+                               ret = getsockopt(cr->socket, SOL_SOCKET,\r
+                                                SO_ERROR, (char *)&opt,\r
+                                                &opt_len);\r
+                               if (!ret)\r
+                                       dapli_socket_connected(cr, opt);\r
+                               else\r
+                                       dapli_socket_connected(cr, errno);\r
+                        \r
+                       /* POLLUP, ERR, NVAL, or poll error - DISC */\r
+                       } else if (ret < 0 || ret == DAPL_FD_ERROR) {\r
+                               dapl_log(DAPL_DBG_TYPE_CM,\r
+                                    " poll=%d cr->st=%s sk=%d ep %p, %d\n",\r
+                                    ret, dapl_cm_state_str(cr->state), \r
+                                    cr->socket, cr->ep,\r
+                                    cr->ep ? cr->ep->param.ep_state:0);\r
+                               dapli_socket_disconnect(cr);\r
+                       }\r
+                       dapl_os_lock(&hca_ptr->ib_trans.lock);\r
+               }\r
+\r
+               /* set to exit and all resources destroyed */\r
+               if ((hca_ptr->ib_trans.cr_state != IB_THREAD_RUN) &&\r
+                   (dapl_llist_is_empty(&hca_ptr->ib_trans.list)))\r
+                       break;\r
+\r
+               dapl_os_unlock(&hca_ptr->ib_trans.lock);\r
+               dapl_select(set);\r
+\r
+               /* if pipe used to wakeup, consume */\r
+               while (dapl_poll(hca_ptr->ib_trans.scm[0], \r
+                                DAPL_FD_READ) == DAPL_FD_READ) {\r
+                       if (recv(hca_ptr->ib_trans.scm[0], rbuf, 2, 0) == -1)\r
+                               dapl_log(DAPL_DBG_TYPE_CM,\r
+                                        " cr_thread: read pipe error = %s\n",\r
+                                        strerror(errno));\r
+               }\r
+               dapl_os_lock(&hca_ptr->ib_trans.lock);\r
+               \r
+               /* set to exit and all resources destroyed */\r
+               if ((hca_ptr->ib_trans.cr_state != IB_THREAD_RUN) &&\r
+                   (dapl_llist_is_empty(&hca_ptr->ib_trans.list)))\r
+                       break;\r
+       }\r
+\r
+       dapl_os_unlock(&hca_ptr->ib_trans.lock);\r
+       free(set);\r
+      out:\r
+       hca_ptr->ib_trans.cr_state = IB_THREAD_EXIT;\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cr_thread(hca %p) exit\n", hca_ptr);\r
+}\r
+\r
+\r
+#ifdef DAPL_COUNTERS\r
+/* Debug aid: List all Connections in process and state */\r
+void dapls_print_cm_list(IN DAPL_IA *ia_ptr)\r
+{\r
+       /* Print in process CR's for this IA, if debug type set */\r
+       int i = 0;\r
+       dp_ib_cm_handle_t cr, next_cr;\r
+\r
+       dapl_os_lock(&ia_ptr->hca_ptr->ib_trans.lock);\r
+       if (!dapl_llist_is_empty((DAPL_LLIST_HEAD*)\r
+                                &ia_ptr->hca_ptr->ib_trans.list))\r
+                                next_cr = dapl_llist_peek_head((DAPL_LLIST_HEAD*)\r
+                                &ia_ptr->hca_ptr->ib_trans.list);\r
+       else\r
+               next_cr = NULL;\r
+\r
+        printf("\n DAPL IA CONNECTIONS IN PROCESS:\n");\r
+       while (next_cr) {\r
+               cr = next_cr;\r
+               next_cr = dapl_llist_next_entry((DAPL_LLIST_HEAD*)\r
+                                &ia_ptr->hca_ptr->ib_trans.list,\r
+                               (DAPL_LLIST_ENTRY*)&cr->entry);\r
+\r
+               printf( "  CONN[%d]: sp %p ep %p sock %d %s %s %s %s %d\n",\r
+                       i, cr->sp, cr->ep, cr->socket,\r
+                       cr->dst.qp_type == IBV_QPT_RC ? "RC" : "UD",\r
+                       dapl_cm_state_str(cr->state),\r
+                       cr->sp ? "<-" : "->",\r
+                       cr->state == DCM_LISTEN ? \r
+                       inet_ntoa(((struct sockaddr_in *)\r
+                               &ia_ptr->hca_ptr->hca_address)->sin_addr) :\r
+                       inet_ntoa(((struct sockaddr_in *)\r
+                               &cr->dst.ia_address)->sin_addr),\r
+                       cr->sp ? (int)cr->sp->conn_qual : \r
+                       ntohs(((struct sockaddr_in *)\r
+                               &cr->dst.ia_address)->sin_port));\r
+               i++;\r
+       }\r
+       printf("\n");\r
+       dapl_os_unlock(&ia_ptr->hca_ptr->ib_trans.lock);\r
+}\r
+#endif\r
diff --git a/branches/winverbs/ulp/dapl2/dapl/openib_scm/dapl_ib_cm.c b/branches/winverbs/ulp/dapl2/dapl/openib_scm/dapl_ib_cm.c
deleted file mode 100644 (file)
index 9cad5be..0000000
+++ /dev/null
@@ -1,1680 +0,0 @@
-/*
- * This Software is licensed under one of the following licenses:
- *
- * 1) under the terms of the "Common Public License 1.0" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/cpl.php.
- *
- * 2) under the terms of the "The BSD License" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/bsd-license.php.
- *
- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
- *    copy of which is available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/gpl-license.php.
- *
- * Licensee has the right to choose one of the above licenses.
- *
- * Redistributions of source code must retain the above copyright
- * notice and one of the license notices.
- *
- * Redistributions in binary form must reproduce both the above copyright
- * notice, one of the license notices in the documentation
- * and/or other materials provided with the distribution.
- */
-
-/***************************************************************************
- *
- *   Module:            uDAPL
- *
- *   Filename:          dapl_ib_cm.c
- *
- *   Author:            Arlin Davis
- *
- *   Created:           3/10/2005
- *
- *   Description: 
- *
- *   The uDAPL openib provider - connection management
- *
- ****************************************************************************
- *                Source Control System Information
- *
- *    $Id: $
- *
- *     Copyright (c) 2005 Intel Corporation.  All rights reserved.
- *
- **************************************************************************/
-
-#include "dapl.h"
-#include "dapl_adapter_util.h"
-#include "dapl_evd_util.h"
-#include "dapl_cr_util.h"
-#include "dapl_name_service.h"
-#include "dapl_ib_util.h"
-#include "dapl_osd.h"
-
-#if defined(_WIN32) || defined(_WIN64)
-enum DAPL_FD_EVENTS {
-       DAPL_FD_READ = 0x1,
-       DAPL_FD_WRITE = 0x2,
-       DAPL_FD_ERROR = 0x4
-};
-
-static int dapl_config_socket(DAPL_SOCKET s)
-{
-       unsigned long nonblocking = 1;
-       return ioctlsocket(s, FIONBIO, &nonblocking);
-}
-
-static int dapl_connect_socket(DAPL_SOCKET s, struct sockaddr *addr,
-                              int addrlen)
-{
-       int err;
-
-       err = connect(s, addr, addrlen);
-       if (err == SOCKET_ERROR)
-               err = WSAGetLastError();
-       return (err == WSAEWOULDBLOCK) ? EAGAIN : err;
-}
-
-struct dapl_fd_set {
-       struct fd_set set[3];
-};
-
-static struct dapl_fd_set *dapl_alloc_fd_set(void)
-{
-       return dapl_os_alloc(sizeof(struct dapl_fd_set));
-}
-
-static void dapl_fd_zero(struct dapl_fd_set *set)
-{
-       FD_ZERO(&set->set[0]);
-       FD_ZERO(&set->set[1]);
-       FD_ZERO(&set->set[2]);
-}
-
-static int dapl_fd_set(DAPL_SOCKET s, struct dapl_fd_set *set,
-                      enum DAPL_FD_EVENTS event)
-{
-       FD_SET(s, &set->set[(event == DAPL_FD_READ) ? 0 : 1]);
-       FD_SET(s, &set->set[2]);
-       return 0;
-}
-
-static enum DAPL_FD_EVENTS dapl_poll(DAPL_SOCKET s, enum DAPL_FD_EVENTS event)
-{
-       struct fd_set rw_fds;
-       struct fd_set err_fds;
-       struct timeval tv;
-       int ret;
-
-       FD_ZERO(&rw_fds);
-       FD_ZERO(&err_fds);
-       FD_SET(s, &rw_fds);
-       FD_SET(s, &err_fds);
-
-       tv.tv_sec = 0;
-       tv.tv_usec = 0;
-
-       if (event == DAPL_FD_READ)
-               ret = select(1, &rw_fds, NULL, &err_fds, &tv);
-       else
-               ret = select(1, NULL, &rw_fds, &err_fds, &tv);
-
-       if (ret == 0)
-               return 0;
-       else if (ret == SOCKET_ERROR)
-               return WSAGetLastError();
-       else if (FD_ISSET(s, &rw_fds))
-               return event;
-       else
-               return DAPL_FD_ERROR;
-}
-
-static int dapl_select(struct dapl_fd_set *set)
-{
-       int ret;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_CM, " dapl_select: sleep\n");
-       ret = select(0, &set->set[0], &set->set[1], &set->set[2], NULL);
-       dapl_dbg_log(DAPL_DBG_TYPE_CM, " dapl_select: wakeup\n");
-
-       if (ret == SOCKET_ERROR)
-               dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                            " dapl_select: error 0x%x\n", WSAGetLastError());
-
-       return ret;
-}
-#else                          // _WIN32 || _WIN64
-enum DAPL_FD_EVENTS {
-       DAPL_FD_READ = POLLIN,
-       DAPL_FD_WRITE = POLLOUT,
-       DAPL_FD_ERROR = POLLERR
-};
-
-static int dapl_config_socket(DAPL_SOCKET s)
-{
-       int ret;
-
-       ret = fcntl(s, F_GETFL);
-       if (ret >= 0)
-               ret = fcntl(s, F_SETFL, ret | O_NONBLOCK);
-       return ret;
-}
-
-static int dapl_connect_socket(DAPL_SOCKET s, struct sockaddr *addr,
-                              int addrlen)
-{
-       int ret;
-
-       ret = connect(s, addr, addrlen);
-
-       return (errno == EINPROGRESS) ? EAGAIN : ret;
-}
-
-struct dapl_fd_set {
-       int index;
-       struct pollfd set[DAPL_FD_SETSIZE];
-};
-
-static struct dapl_fd_set *dapl_alloc_fd_set(void)
-{
-       return dapl_os_alloc(sizeof(struct dapl_fd_set));
-}
-
-static void dapl_fd_zero(struct dapl_fd_set *set)
-{
-       set->index = 0;
-}
-
-static int dapl_fd_set(DAPL_SOCKET s, struct dapl_fd_set *set,
-                      enum DAPL_FD_EVENTS event)
-{
-       if (set->index == DAPL_FD_SETSIZE - 1) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        "SCM ERR: cm_thread exceeded FD_SETSIZE %d\n",
-                        set->index + 1);
-               return -1;
-       }
-
-       set->set[set->index].fd = s;
-       set->set[set->index].revents = 0;
-       set->set[set->index++].events = event;
-       return 0;
-}
-
-static enum DAPL_FD_EVENTS dapl_poll(DAPL_SOCKET s, enum DAPL_FD_EVENTS event)
-{
-       struct pollfd fds;
-       int ret;
-
-       fds.fd = s;
-       fds.events = event;
-       fds.revents = 0;
-       ret = poll(&fds, 1, 0);
-       dapl_dbg_log(DAPL_DBG_TYPE_CM, " dapl_poll: ret=%d, events=0x%x\n",
-                    ret, fds.revents);
-       if (ret <= 0)
-               return ret;
-
-       return fds.revents;
-}
-
-static int dapl_select(struct dapl_fd_set *set)
-{
-       int ret;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_CM, " dapl_select: sleep, fds=%d\n",
-                    set->index);
-       ret = poll(set->set, set->index, -1);
-       dapl_dbg_log(DAPL_DBG_TYPE_CM, " dapl_select: wakeup, ret=0x%x\n", ret);
-       return ret;
-}
-#endif
-
-static struct ib_cm_handle *dapli_cm_create(void)
-{
-       struct ib_cm_handle *cm_ptr;
-
-       /* Allocate CM, init lock, and initialize */
-       if ((cm_ptr = dapl_os_alloc(sizeof(*cm_ptr))) == NULL)
-               return NULL;
-
-       (void)dapl_os_memzero(cm_ptr, sizeof(*cm_ptr));
-       if (dapl_os_lock_init(&cm_ptr->lock))
-               goto bail;
-
-       cm_ptr->dst.ver = htons(DSCM_VER);
-       cm_ptr->socket = DAPL_INVALID_SOCKET;
-       return cm_ptr;
-      bail:
-       dapl_os_free(cm_ptr, sizeof(*cm_ptr));
-       return NULL;
-}
-
-/* mark for destroy, remove all references, schedule cleanup */
-static void dapli_cm_destroy(struct ib_cm_handle *cm_ptr)
-{
-       dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                    " cm_destroy: cm %p ep %p\n", cm_ptr, cm_ptr->ep);
-
-       /* cleanup, never made it to work queue */
-       if (cm_ptr->state == SCM_INIT) {
-               if (cm_ptr->socket != DAPL_INVALID_SOCKET)
-                       closesocket(cm_ptr->socket);
-               dapl_os_free(cm_ptr, sizeof(*cm_ptr));
-               return;
-       }
-
-       dapl_os_lock(&cm_ptr->lock);
-       cm_ptr->state = SCM_DESTROY;
-       if ((cm_ptr->ep) && (cm_ptr->ep->cm_handle == cm_ptr))
-               cm_ptr->ep->cm_handle = IB_INVALID_HANDLE;
-
-       /* close socket if still active */
-       if (cm_ptr->socket != DAPL_INVALID_SOCKET) {
-               closesocket(cm_ptr->socket);
-               cm_ptr->socket = DAPL_INVALID_SOCKET;
-       }
-       dapl_os_unlock(&cm_ptr->lock);
-
-       /* wakeup work thread */
-       if (send(cm_ptr->hca->ib_trans.scm[1], "w", sizeof "w", 0) == -1)
-               dapl_log(DAPL_DBG_TYPE_CM,
-                        " cm_destroy: thread wakeup error = %s\n",
-                        strerror(errno));
-}
-
-/* queue socket for processing CM work */
-static void dapli_cm_queue(struct ib_cm_handle *cm_ptr)
-{
-       /* add to work queue for cr thread processing */
-       dapl_llist_init_entry((DAPL_LLIST_ENTRY *) & cm_ptr->entry);
-       dapl_os_lock(&cm_ptr->hca->ib_trans.lock);
-       dapl_llist_add_tail(&cm_ptr->hca->ib_trans.list,
-                           (DAPL_LLIST_ENTRY *) & cm_ptr->entry, cm_ptr);
-       dapl_os_unlock(&cm_ptr->hca->ib_trans.lock);
-
-       /* wakeup CM work thread */
-       if (send(cm_ptr->hca->ib_trans.scm[1], "w", sizeof "w", 0) == -1)
-               dapl_log(DAPL_DBG_TYPE_CM,
-                        " cm_queue: thread wakeup error = %s\n",
-                        strerror(errno));
-}
-
-/*
- * ACTIVE/PASSIVE: called from CR thread or consumer via ep_disconnect
- */
-static DAT_RETURN dapli_socket_disconnect(dp_ib_cm_handle_t cm_ptr)
-{
-       DAPL_EP *ep_ptr = cm_ptr->ep;
-       DAT_UINT32 disc_data = htonl(0xdead);
-
-       if (ep_ptr == NULL)
-               return DAT_SUCCESS;
-
-       dapl_os_lock(&cm_ptr->lock);
-       if ((cm_ptr->state == SCM_INIT) ||
-           (cm_ptr->state == SCM_DISCONNECTED) ||
-           (cm_ptr->state == SCM_DESTROY)) {
-               dapl_os_unlock(&cm_ptr->lock);
-               return DAT_SUCCESS;
-       } else {
-               /* send disc date, close socket, schedule destroy */
-               if (cm_ptr->socket != DAPL_INVALID_SOCKET) {
-                       if (send(cm_ptr->socket, (char *)&disc_data,
-                                sizeof(disc_data), 0) == -1)
-                               dapl_log(DAPL_DBG_TYPE_WARN,
-                                        " cm_disc: write error = %s\n",
-                                        strerror(errno));
-                       closesocket(cm_ptr->socket);
-                       cm_ptr->socket = DAPL_INVALID_SOCKET;
-               }
-               cm_ptr->state = SCM_DISCONNECTED;
-       }
-       dapl_os_unlock(&cm_ptr->lock);
-
-       /* disconnect events for RC's only */
-       if (ep_ptr->param.ep_attr.service_type == DAT_SERVICE_TYPE_RC) {
-               if (ep_ptr->cr_ptr) {
-                       dapls_cr_callback(cm_ptr,
-                                         IB_CME_DISCONNECTED,
-                                         NULL,
-                                         ((DAPL_CR *) ep_ptr->cr_ptr)->sp_ptr);
-               } else {
-                       dapl_evd_connection_callback(ep_ptr->cm_handle,
-                                                    IB_CME_DISCONNECTED,
-                                                    NULL, ep_ptr);
-               }
-       }
-
-       /* scheduled destroy via disconnect clean in callback */
-       return DAT_SUCCESS;
-}
-
-/*
- * ACTIVE: socket connected, send QP information to peer 
- */
-static void dapli_socket_connected(dp_ib_cm_handle_t cm_ptr, int err)
-{
-       int len, opt = 1;
-       struct iovec iov[2];
-       struct dapl_ep *ep_ptr = cm_ptr->ep;
-
-       if (err) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " CONN_PENDING: socket ERR %s -> %s\n",
-                        strerror(err), inet_ntoa(((struct sockaddr_in *)
-                                                  ep_ptr->param.
-                                                  remote_ia_address_ptr)->
-                                                 sin_addr));
-               goto bail;
-       }
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    " socket connected, write QP and private data\n");
-
-       /* no delay for small packets */
-       setsockopt(cm_ptr->socket, IPPROTO_TCP, TCP_NODELAY,
-                  (char *)&opt, sizeof(opt));
-
-       /* send qp info and pdata to remote peer */
-       iov[0].iov_base = (void *)&cm_ptr->dst;
-       iov[0].iov_len = sizeof(ib_qp_cm_t);
-       if (cm_ptr->dst.p_size) {
-               iov[1].iov_base = cm_ptr->p_data;
-               iov[1].iov_len = ntohl(cm_ptr->dst.p_size);
-               len = writev(cm_ptr->socket, iov, 2);
-       } else {
-               len = writev(cm_ptr->socket, iov, 1);
-       }
-
-       if (len != (ntohl(cm_ptr->dst.p_size) + sizeof(ib_qp_cm_t))) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " CONN_PENDING write: ERR %s, wcnt=%d -> %s\n",
-                        strerror(errno), len, inet_ntoa(((struct sockaddr_in *)
-                                                         ep_ptr->param.
-                                                         remote_ia_address_ptr)->
-                                                        sin_addr));
-               goto bail;
-       }
-       dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                    " connected: sending SRC port=0x%x lid=0x%x,"
-                    " qpn=0x%x, psize=%d\n",
-                    ntohs(cm_ptr->dst.port), ntohs(cm_ptr->dst.lid),
-                    ntohl(cm_ptr->dst.qpn), ntohl(cm_ptr->dst.p_size));
-       dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                    " connected: sending SRC GID subnet %016llx id %016llx\n",
-                    (unsigned long long)
-                    htonll(cm_ptr->dst.gid.global.subnet_prefix),
-                    (unsigned long long)
-                    htonll(cm_ptr->dst.gid.global.interface_id));
-
-       /* queue up to work thread to avoid blocking consumer */
-       cm_ptr->state = SCM_RTU_PENDING;
-       return;
-      bail:
-       /* close socket, free cm structure and post error event */
-       dapli_cm_destroy(cm_ptr);
-       dapl_evd_connection_callback(NULL, IB_CME_LOCAL_FAILURE, NULL, ep_ptr);
-}
-
-/*
- * ACTIVE: Create socket, connect, defer exchange QP information to CR thread
- * to avoid blocking. 
- */
-DAT_RETURN
-dapli_socket_connect(DAPL_EP * ep_ptr,
-                    DAT_IA_ADDRESS_PTR r_addr,
-                    DAT_CONN_QUAL r_qual, DAT_COUNT p_size, DAT_PVOID p_data)
-{
-       dp_ib_cm_handle_t cm_ptr;
-       int ret;
-       DAPL_IA *ia_ptr = ep_ptr->header.owner_ia;
-       struct sockaddr_in addr;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP, " connect: r_qual %d p_size=%d\n",
-                    r_qual, p_size);
-
-       cm_ptr = dapli_cm_create();
-       if (cm_ptr == NULL)
-               return DAT_INSUFFICIENT_RESOURCES;
-
-       /* create, connect, sockopt, and exchange QP information */
-       if ((cm_ptr->socket =
-            socket(AF_INET, SOCK_STREAM, 0)) == DAPL_INVALID_SOCKET) {
-               dapl_os_free(cm_ptr, sizeof(*cm_ptr));
-               return DAT_INSUFFICIENT_RESOURCES;
-       }
-
-       ret = dapl_config_socket(cm_ptr->socket);
-       if (ret < 0) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " socket connect: config socket %d ERR %d %s\n",
-                        cm_ptr->socket, ret, strerror(errno));
-               goto bail;
-       }
-
-       dapl_os_memcpy(&addr, r_addr, sizeof(addr));
-       addr.sin_port = htons(r_qual);
-       ret = dapl_connect_socket(cm_ptr->socket, (struct sockaddr *)&addr,
-                                 sizeof(addr));
-       if (ret && ret != EAGAIN) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " socket connect ERROR: %s -> %s r_qual %d\n",
-                        strerror(errno),
-                        inet_ntoa(addr.sin_addr), (unsigned int)r_qual);
-               dapli_cm_destroy(cm_ptr);
-               return DAT_INVALID_ADDRESS;
-       }
-
-       /* Send QP info, IA address, and private data */
-       cm_ptr->dst.qpn = htonl(ep_ptr->qp_handle->qp_num);
-#ifdef DAT_EXTENSIONS
-       cm_ptr->dst.qp_type = htons(ep_ptr->qp_handle->qp_type);
-#endif
-       cm_ptr->dst.port = htons(ia_ptr->hca_ptr->port_num);
-       cm_ptr->dst.lid = ia_ptr->hca_ptr->ib_trans.lid;
-       cm_ptr->dst.gid = ia_ptr->hca_ptr->ib_trans.gid;
-
-       /* save references */
-       cm_ptr->hca = ia_ptr->hca_ptr;
-       cm_ptr->ep = ep_ptr;
-       cm_ptr->dst.ia_address = ia_ptr->hca_ptr->hca_address;
-       if (p_size) {
-               cm_ptr->dst.p_size = htonl(p_size);
-               dapl_os_memcpy(cm_ptr->p_data, p_data, p_size);
-       }
-
-       /* connected or pending, either way results via async event */
-       if (ret == 0)
-               dapli_socket_connected(cm_ptr, 0);
-       else
-               cm_ptr->state = SCM_CONN_PENDING;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    " connect: socket %d to %s r_qual %d pending\n",
-                    cm_ptr->socket,
-                    inet_ntoa(addr.sin_addr), (unsigned int)r_qual);
-
-       dapli_cm_queue(cm_ptr);
-       return DAT_SUCCESS;
-      bail:
-       dapl_log(DAPL_DBG_TYPE_ERR,
-                " socket connect ERROR: %s query lid(0x%x)/gid"
-                " -> %s r_qual %d\n",
-                strerror(errno), ntohs(cm_ptr->dst.lid),
-                inet_ntoa(((struct sockaddr_in *)r_addr)->sin_addr),
-                (unsigned int)r_qual);
-
-       /* close socket, free cm structure */
-       dapli_cm_destroy(cm_ptr);
-       return DAT_INTERNAL_ERROR;
-}
-
-/*
- * ACTIVE: exchange QP information, called from CR thread
- */
-static void dapli_socket_connect_rtu(dp_ib_cm_handle_t cm_ptr)
-{
-       DAPL_EP *ep_ptr = cm_ptr->ep;
-       int len;
-       short rtu_data = htons(0x0E0F);
-       ib_cm_events_t event = IB_CME_DESTINATION_REJECT;
-
-       /* read DST information into cm_ptr, overwrite SRC info */
-       dapl_dbg_log(DAPL_DBG_TYPE_EP, " connect_rtu: recv peer QP data\n");
-
-       len = recv(cm_ptr->socket, (char *)&cm_ptr->dst, sizeof(ib_qp_cm_t), 0);
-       if (len != sizeof(ib_qp_cm_t) || ntohs(cm_ptr->dst.ver) != DSCM_VER) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " CONN_RTU read: ERR %s, rcnt=%d, ver=%d -> %s\n",
-                        strerror(errno), len, cm_ptr->dst.ver,
-                        inet_ntoa(((struct sockaddr_in *)
-                                   ep_ptr->param.remote_ia_address_ptr)->
-                                  sin_addr));
-               goto bail;
-       }
-       /* check for consumer reject */
-       if (cm_ptr->dst.rej) {
-               dapl_log(DAPL_DBG_TYPE_CM,
-                        " CONN_RTU read: PEER REJ reason=0x%x -> %s\n",
-                        ntohs(cm_ptr->dst.rej),
-                        inet_ntoa(((struct sockaddr_in *)
-                                   ep_ptr->param.remote_ia_address_ptr)->
-                                  sin_addr));
-               event = IB_CME_DESTINATION_REJECT_PRIVATE_DATA;
-               goto bail;
-       }
-
-       /* convert peer response values to host order */
-       cm_ptr->dst.port = ntohs(cm_ptr->dst.port);
-       cm_ptr->dst.lid = ntohs(cm_ptr->dst.lid);
-       cm_ptr->dst.qpn = ntohl(cm_ptr->dst.qpn);
-#ifdef DAT_EXTENSIONS
-       cm_ptr->dst.qp_type = ntohs(cm_ptr->dst.qp_type);
-#endif
-       cm_ptr->dst.p_size = ntohl(cm_ptr->dst.p_size);
-
-       /* save remote address information */
-       dapl_os_memcpy(&ep_ptr->remote_ia_address,
-                      &cm_ptr->dst.ia_address,
-                      sizeof(ep_ptr->remote_ia_address));
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    " CONN_RTU: DST %s port=0x%x lid=0x%x,"
-                    " qpn=0x%x, qp_type=%d, psize=%d\n",
-                    inet_ntoa(((struct sockaddr_in *)
-                               &cm_ptr->dst.ia_address)->sin_addr),
-                    cm_ptr->dst.port, cm_ptr->dst.lid,
-                    cm_ptr->dst.qpn, cm_ptr->dst.qp_type, cm_ptr->dst.p_size);
-
-       /* validate private data size before reading */
-       if (cm_ptr->dst.p_size > IB_MAX_REP_PDATA_SIZE) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " CONN_RTU read: psize (%d) wrong -> %s\n",
-                        cm_ptr->dst.p_size, inet_ntoa(((struct sockaddr_in *)
-                                                       ep_ptr->param.
-                                                       remote_ia_address_ptr)->
-                                                      sin_addr));
-               goto bail;
-       }
-
-       /* read private data into cm_handle if any present */
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    " socket connected, read private data\n");
-       if (cm_ptr->dst.p_size) {
-               len =
-                   recv(cm_ptr->socket, cm_ptr->p_data, cm_ptr->dst.p_size, 0);
-               if (len != cm_ptr->dst.p_size) {
-                       dapl_log(DAPL_DBG_TYPE_ERR,
-                                " CONN_RTU read pdata: ERR %s, rcnt=%d -> %s\n",
-                                strerror(errno), len,
-                                inet_ntoa(((struct sockaddr_in *)
-                                           ep_ptr->param.
-                                           remote_ia_address_ptr)->sin_addr));
-                       goto bail;
-               }
-       }
-
-       /* modify QP to RTR and then to RTS with remote info */
-       dapl_os_lock(&ep_ptr->header.lock);
-       if (dapls_modify_qp_state(ep_ptr->qp_handle,
-                                 IBV_QPS_RTR, cm_ptr) != DAT_SUCCESS) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " CONN_RTU: QPS_RTR ERR %s -> %s\n",
-                        strerror(errno), inet_ntoa(((struct sockaddr_in *)
-                                                    ep_ptr->param.
-                                                    remote_ia_address_ptr)->
-                                                   sin_addr));
-               dapl_os_unlock(&ep_ptr->header.lock);
-               goto bail;
-       }
-       if (dapls_modify_qp_state(ep_ptr->qp_handle,
-                                 IBV_QPS_RTS, cm_ptr) != DAT_SUCCESS) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " CONN_RTU: QPS_RTS ERR %s -> %s\n",
-                        strerror(errno), inet_ntoa(((struct sockaddr_in *)
-                                                    ep_ptr->param.
-                                                    remote_ia_address_ptr)->
-                                                   sin_addr));
-               dapl_os_unlock(&ep_ptr->header.lock);
-               goto bail;
-       }
-       dapl_os_unlock(&ep_ptr->header.lock);
-       dapl_dbg_log(DAPL_DBG_TYPE_EP, " connect_rtu: send RTU\n");
-
-       /* complete handshake after final QP state change */
-       if (send(cm_ptr->socket, (char *)&rtu_data, sizeof(rtu_data), 0) == -1) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " CONN_RTU: write error = %s\n", strerror(errno));
-               goto bail;
-       }
-       /* init cm_handle and post the event with private data */
-       ep_ptr->cm_handle = cm_ptr;
-       cm_ptr->state = SCM_CONNECTED;
-       dapl_dbg_log(DAPL_DBG_TYPE_EP, " ACTIVE: connected!\n");
-
-#ifdef DAT_EXTENSIONS
-       if (cm_ptr->dst.qp_type == IBV_QPT_UD) {
-               DAT_IB_EXTENSION_EVENT_DATA xevent;
-
-               /* post EVENT, modify_qp created ah */
-               xevent.status = 0;
-               xevent.type = DAT_IB_UD_REMOTE_AH;
-               xevent.remote_ah.ah = cm_ptr->ah;
-               xevent.remote_ah.qpn = cm_ptr->dst.qpn;
-               dapl_os_memcpy(&xevent.remote_ah.ia_addr,
-                              &cm_ptr->dst.ia_address,
-                              sizeof(cm_ptr->dst.ia_address));
-
-               dapls_evd_post_connection_event_ext((DAPL_EVD *) ep_ptr->param.
-                                                   connect_evd_handle,
-                                                   DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED,
-                                                   (DAT_EP_HANDLE) ep_ptr,
-                                                   (DAT_COUNT) cm_ptr->dst.
-                                                   p_size,
-                                                   (DAT_PVOID *) cm_ptr->
-                                                   p_data,
-                                                   (DAT_PVOID *) & xevent);
-       } else
-#endif
-               dapl_evd_connection_callback(cm_ptr,
-                                            IB_CME_CONNECTED,
-                                            cm_ptr->p_data, ep_ptr);
-       return;
-      bail:
-       /* close socket, free cm structure and post error event */
-       dapli_cm_destroy(cm_ptr);
-       dapls_ib_reinit_ep(ep_ptr);     /* reset QP state */
-       dapl_evd_connection_callback(NULL, event, NULL, ep_ptr);
-}
-
-/*
- * PASSIVE: Create socket, listen, accept, exchange QP information 
- */
-DAT_RETURN
-dapli_socket_listen(DAPL_IA * ia_ptr, DAT_CONN_QUAL serviceID, DAPL_SP * sp_ptr)
-{
-       struct sockaddr_in addr;
-       ib_cm_srvc_handle_t cm_ptr = NULL;
-       int opt = 1;
-       DAT_RETURN dat_status = DAT_SUCCESS;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    " listen(ia_ptr %p ServiceID %d sp_ptr %p)\n",
-                    ia_ptr, serviceID, sp_ptr);
-
-       cm_ptr = dapli_cm_create();
-       if (cm_ptr == NULL)
-               return DAT_INSUFFICIENT_RESOURCES;
-
-       cm_ptr->sp = sp_ptr;
-       cm_ptr->hca = ia_ptr->hca_ptr;
-
-       /* bind, listen, set sockopt, accept, exchange data */
-       if ((cm_ptr->socket =
-            socket(AF_INET, SOCK_STREAM, 0)) == DAPL_INVALID_SOCKET) {
-               dapl_log(DAPL_DBG_TYPE_ERR, " ERR: listen socket create: %s\n",
-                        strerror(errno));
-               dat_status = DAT_INSUFFICIENT_RESOURCES;
-               goto bail;
-       }
-
-       setsockopt(cm_ptr->socket, SOL_SOCKET, SO_REUSEADDR,
-                  (char *)&opt, sizeof(opt));
-       addr.sin_port = htons(serviceID);
-       addr.sin_family = AF_INET;
-       addr.sin_addr.s_addr = INADDR_ANY;
-
-       if ((bind(cm_ptr->socket, (struct sockaddr *)&addr, sizeof(addr)) < 0)
-           || (listen(cm_ptr->socket, 128) < 0)) {
-               dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                            " listen: ERROR %s on conn_qual 0x%x\n",
-                            strerror(errno), serviceID);
-               if (errno == EADDRINUSE)
-                       dat_status = DAT_CONN_QUAL_IN_USE;
-               else
-                       dat_status = DAT_CONN_QUAL_UNAVAILABLE;
-               goto bail;
-       }
-
-       /* set cm_handle for this service point, save listen socket */
-       sp_ptr->cm_srvc_handle = cm_ptr;
-
-       /* queue up listen socket to process inbound CR's */
-       cm_ptr->state = SCM_LISTEN;
-       dapli_cm_queue(cm_ptr);
-
-       dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                    " listen: qual 0x%x cr %p s_fd %d\n",
-                    ntohs(serviceID), cm_ptr, cm_ptr->socket);
-
-       return dat_status;
-      bail:
-       dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                    " listen: ERROR on conn_qual 0x%x\n", serviceID);
-       dapli_cm_destroy(cm_ptr);
-       return dat_status;
-}
-
-/*
- * PASSIVE: accept socket 
- */
-static void dapli_socket_accept(ib_cm_srvc_handle_t cm_ptr)
-{
-       dp_ib_cm_handle_t acm_ptr;
-       int len;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP, " socket_accept\n");
-
-       /* Allocate accept CM and initialize */
-       if ((acm_ptr = dapli_cm_create()) == NULL)
-               return;
-
-       acm_ptr->sp = cm_ptr->sp;
-       acm_ptr->hca = cm_ptr->hca;
-
-       len = sizeof(acm_ptr->dst.ia_address);
-       acm_ptr->socket = accept(cm_ptr->socket,
-                                (struct sockaddr *)&acm_ptr->dst.ia_address,
-                                (socklen_t *) & len);
-       if (acm_ptr->socket == DAPL_INVALID_SOCKET) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " accept: ERR %s on FD %d l_cr %p\n",
-                        strerror(errno), cm_ptr->socket, cm_ptr);
-               goto bail;
-       }
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    " socket accepted, queue new cm %p\n", acm_ptr);
-
-       acm_ptr->state = SCM_ACCEPTING;
-       dapli_cm_queue(acm_ptr);
-       return;
-      bail:
-       /* close socket, free cm structure, active will see socket close as reject */
-       dapli_cm_destroy(acm_ptr);
-}
-
-/*
- * PASSIVE: receive peer QP information, private data, post cr_event 
- */
-static void dapli_socket_accept_data(ib_cm_srvc_handle_t acm_ptr)
-{
-       int len;
-       void *p_data = NULL;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP, " socket accepted, read QP data\n");
-
-       /* read in DST QP info, IA address. check for private data */
-       len =
-           recv(acm_ptr->socket, (char *)&acm_ptr->dst, sizeof(ib_qp_cm_t), 0);
-       if (len != sizeof(ib_qp_cm_t) || ntohs(acm_ptr->dst.ver) != DSCM_VER) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " accept read: ERR %s, rcnt=%d, ver=%d\n",
-                        strerror(errno), len, ntohs(acm_ptr->dst.ver));
-               goto bail;
-       }
-
-       /* convert accepted values to host order */
-       acm_ptr->dst.port = ntohs(acm_ptr->dst.port);
-       acm_ptr->dst.lid = ntohs(acm_ptr->dst.lid);
-       acm_ptr->dst.qpn = ntohl(acm_ptr->dst.qpn);
-#ifdef DAT_EXTENSIONS
-       acm_ptr->dst.qp_type = ntohs(acm_ptr->dst.qp_type);
-#endif
-       acm_ptr->dst.p_size = ntohl(acm_ptr->dst.p_size);
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    " accept: DST %s port=0x%x lid=0x%x, qpn=0x%x, psize=%d\n",
-                    inet_ntoa(((struct sockaddr_in *)&acm_ptr->dst.
-                               ia_address)->sin_addr), acm_ptr->dst.port,
-                    acm_ptr->dst.lid, acm_ptr->dst.qpn, acm_ptr->dst.p_size);
-
-       /* validate private data size before reading */
-       if (acm_ptr->dst.p_size > IB_MAX_REQ_PDATA_SIZE) {
-               dapl_dbg_log(DAPL_DBG_TYPE_ERR,
-                            " accept read: psize (%d) wrong\n",
-                            acm_ptr->dst.p_size);
-               goto bail;
-       }
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP, " socket accepted, read private data\n");
-
-       /* read private data into cm_handle if any present */
-       if (acm_ptr->dst.p_size) {
-               len =
-                   recv(acm_ptr->socket, acm_ptr->p_data, acm_ptr->dst.p_size,
-                        0);
-               if (len != acm_ptr->dst.p_size) {
-                       dapl_log(DAPL_DBG_TYPE_ERR,
-                                " accept read pdata: ERR %s, rcnt=%d\n",
-                                strerror(errno), len);
-                       goto bail;
-               }
-               dapl_dbg_log(DAPL_DBG_TYPE_EP, " accept: psize=%d read\n", len);
-               p_data = acm_ptr->p_data;
-       }
-
-       acm_ptr->state = SCM_ACCEPTING_DATA;
-
-#ifdef DAT_EXTENSIONS
-       if (acm_ptr->dst.qp_type == IBV_QPT_UD) {
-               DAT_IB_EXTENSION_EVENT_DATA xevent;
-
-               /* post EVENT, modify_qp created ah */
-               xevent.status = 0;
-               xevent.type = DAT_IB_UD_CONNECT_REQUEST;
-
-               dapls_evd_post_cr_event_ext(acm_ptr->sp,
-                                           DAT_IB_UD_CONNECTION_REQUEST_EVENT,
-                                           acm_ptr,
-                                           (DAT_COUNT) acm_ptr->dst.p_size,
-                                           (DAT_PVOID *) acm_ptr->p_data,
-                                           (DAT_PVOID *) & xevent);
-       } else
-#endif
-               /* trigger CR event and return SUCCESS */
-               dapls_cr_callback(acm_ptr,
-                                 IB_CME_CONNECTION_REQUEST_PENDING,
-                                 p_data, acm_ptr->sp);
-       return;
-      bail:
-       /* close socket, free cm structure, active will see socket close as reject */
-       dapli_cm_destroy(acm_ptr);
-       return;
-}
-
-/*
- * PASSIVE: consumer accept, send local QP information, private data, 
- * queue on work thread to receive RTU information to avoid blocking
- * user thread. 
- */
-DAT_RETURN
-dapli_socket_accept_usr(DAPL_EP * ep_ptr,
-                       DAPL_CR * cr_ptr, DAT_COUNT p_size, DAT_PVOID p_data)
-{
-       DAPL_IA *ia_ptr = ep_ptr->header.owner_ia;
-       dp_ib_cm_handle_t cm_ptr = cr_ptr->ib_cm_handle;
-       ib_qp_cm_t local;
-       struct iovec iov[2];
-       int len;
-
-       if (p_size > IB_MAX_REP_PDATA_SIZE)
-               return DAT_LENGTH_ERROR;
-
-       /* must have a accepted socket */
-       if (cm_ptr->socket == DAPL_INVALID_SOCKET)
-               return DAT_INTERNAL_ERROR;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    " ACCEPT_USR: remote port=0x%x lid=0x%x"
-                    " qpn=0x%x qp_type %d, psize=%d\n",
-                    cm_ptr->dst.port, cm_ptr->dst.lid,
-                    cm_ptr->dst.qpn, cm_ptr->dst.qp_type, cm_ptr->dst.p_size);
-
-#ifdef DAT_EXTENSIONS
-       if (cm_ptr->dst.qp_type == IBV_QPT_UD &&
-           ep_ptr->qp_handle->qp_type != IBV_QPT_UD) {
-               dapl_dbg_log(DAPL_DBG_TYPE_ERR,
-                            " ACCEPT_USR: ERR remote QP is UD,"
-                            ", but local QP is not\n");
-               return (DAT_INVALID_HANDLE | DAT_INVALID_HANDLE_EP);
-       }
-#endif
-
-       /* modify QP to RTR and then to RTS with remote info already read */
-       dapl_os_lock(&ep_ptr->header.lock);
-       if (dapls_modify_qp_state(ep_ptr->qp_handle,
-                                 IBV_QPS_RTR, cm_ptr) != DAT_SUCCESS) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " ACCEPT_USR: QPS_RTR ERR %s -> %s\n",
-                        strerror(errno), inet_ntoa(((struct sockaddr_in *)
-                                                    &cm_ptr->dst.ia_address)->
-                                                   sin_addr));
-               dapl_os_unlock(&ep_ptr->header.lock);
-               goto bail;
-       }
-       if (dapls_modify_qp_state(ep_ptr->qp_handle,
-                                 IBV_QPS_RTS, cm_ptr) != DAT_SUCCESS) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " ACCEPT_USR: QPS_RTS ERR %s -> %s\n",
-                        strerror(errno), inet_ntoa(((struct sockaddr_in *)
-                                                    &cm_ptr->dst.ia_address)->
-                                                   sin_addr));
-               dapl_os_unlock(&ep_ptr->header.lock);
-               goto bail;
-       }
-       dapl_os_unlock(&ep_ptr->header.lock);
-
-       /* save remote address information */
-       dapl_os_memcpy(&ep_ptr->remote_ia_address,
-                      &cm_ptr->dst.ia_address,
-                      sizeof(ep_ptr->remote_ia_address));
-
-       /* send our QP info, IA address, pdata. Don't overwrite dst data */
-       local.ver = htons(DSCM_VER);
-       local.rej = 0;
-       local.qpn = htonl(ep_ptr->qp_handle->qp_num);
-       local.qp_type = htons(ep_ptr->qp_handle->qp_type);
-       local.port = htons(ia_ptr->hca_ptr->port_num);
-       local.lid = ia_ptr->hca_ptr->ib_trans.lid;
-       local.gid = ia_ptr->hca_ptr->ib_trans.gid;
-       local.ia_address = ia_ptr->hca_ptr->hca_address;
-       local.p_size = htonl(p_size);
-       iov[0].iov_base = (void *)&local;
-       iov[0].iov_len = sizeof(ib_qp_cm_t);
-       if (p_size) {
-               iov[1].iov_base = p_data;
-               iov[1].iov_len = p_size;
-               len = writev(cm_ptr->socket, iov, 2);
-       } else {
-               len = writev(cm_ptr->socket, iov, 1);
-       }
-
-       if (len != (p_size + sizeof(ib_qp_cm_t))) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " ACCEPT_USR: ERR %s, wcnt=%d -> %s\n",
-                        strerror(errno), len, inet_ntoa(((struct sockaddr_in *)
-                                                         &cm_ptr->dst.
-                                                         ia_address)->
-                                                        sin_addr));
-               goto bail;
-       }
-
-       dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                    " ACCEPT_USR: local port=0x%x lid=0x%x"
-                    " qpn=0x%x psize=%d\n",
-                    ntohs(local.port), ntohs(local.lid),
-                    ntohl(local.qpn), ntohl(local.p_size));
-       dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                    " ACCEPT_USR SRC GID subnet %016llx id %016llx\n",
-                    (unsigned long long)
-                    htonll(local.gid.global.subnet_prefix),
-                    (unsigned long long)
-                    htonll(local.gid.global.interface_id));
-
-       /* save state and reference to EP, queue for RTU data */
-       cm_ptr->ep = ep_ptr;
-       cm_ptr->hca = ia_ptr->hca_ptr;
-       cm_ptr->state = SCM_ACCEPTED;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP, " PASSIVE: accepted!\n");
-       return DAT_SUCCESS;
-      bail:
-       dapli_cm_destroy(cm_ptr);
-       dapls_ib_reinit_ep(ep_ptr);     /* reset QP state */
-       return DAT_INTERNAL_ERROR;
-}
-
-/*
- * PASSIVE: read RTU from active peer, post CONN event
- */
-void dapli_socket_accept_rtu(dp_ib_cm_handle_t cm_ptr)
-{
-       int len;
-       short rtu_data = 0;
-
-       /* complete handshake after final QP state change */
-       len = recv(cm_ptr->socket, (char *)&rtu_data, sizeof(rtu_data), 0);
-       if (len != sizeof(rtu_data) || ntohs(rtu_data) != 0x0e0f) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " ACCEPT_RTU: ERR %s, rcnt=%d rdata=%x\n",
-                        strerror(errno), len, ntohs(rtu_data),
-                        inet_ntoa(((struct sockaddr_in *)
-                                   &cm_ptr->dst.ia_address)->sin_addr));
-               goto bail;
-       }
-
-       /* save state and reference to EP, queue for disc event */
-       cm_ptr->state = SCM_CONNECTED;
-
-       /* final data exchange if remote QP state is good to go */
-       dapl_dbg_log(DAPL_DBG_TYPE_EP, " PASSIVE: connected!\n");
-
-#ifdef DAT_EXTENSIONS
-       if (cm_ptr->dst.qp_type == IBV_QPT_UD) {
-               DAT_IB_EXTENSION_EVENT_DATA xevent;
-
-               /* post EVENT, modify_qp created ah */
-               xevent.status = 0;
-               xevent.type = DAT_IB_UD_PASSIVE_REMOTE_AH;
-               xevent.remote_ah.ah = cm_ptr->ah;
-               xevent.remote_ah.qpn = cm_ptr->dst.qpn;
-               dapl_os_memcpy(&xevent.remote_ah.ia_addr,
-                              &cm_ptr->dst.ia_address,
-                              sizeof(cm_ptr->dst.ia_address));
-
-               dapls_evd_post_connection_event_ext((DAPL_EVD *) cm_ptr->ep->
-                                                   param.connect_evd_handle,
-                                                   DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED,
-                                                   (DAT_EP_HANDLE) cm_ptr->ep,
-                                                   (DAT_COUNT) cm_ptr->dst.
-                                                   p_size,
-                                                   (DAT_PVOID *) cm_ptr->
-                                                   p_data,
-                                                   (DAT_PVOID *) & xevent);
-       } else
-#endif
-               dapls_cr_callback(cm_ptr, IB_CME_CONNECTED, NULL, cm_ptr->sp);
-       return;
-      bail:
-       dapls_ib_reinit_ep(cm_ptr->ep); /* reset QP state */
-       dapli_cm_destroy(cm_ptr);
-       dapls_cr_callback(cm_ptr, IB_CME_DESTINATION_REJECT, NULL, cm_ptr->sp);
-}
-
-/*
- * dapls_ib_connect
- *
- * Initiate a connection with the passive listener on another node
- *
- * Input:
- *     ep_handle,
- *     remote_ia_address,
- *     remote_conn_qual,
- *     prd_size                size of private data and structure
- *     prd_prt                 pointer to private data structure
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INSUFFICIENT_RESOURCES
- *     DAT_INVALID_PARAMETER
- *
- */
-DAT_RETURN
-dapls_ib_connect(IN DAT_EP_HANDLE ep_handle,
-                IN DAT_IA_ADDRESS_PTR remote_ia_address,
-                IN DAT_CONN_QUAL remote_conn_qual,
-                IN DAT_COUNT private_data_size, IN void *private_data)
-{
-       DAPL_EP *ep_ptr;
-       ib_qp_handle_t qp_ptr;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    " connect(ep_handle %p ....)\n", ep_handle);
-
-       ep_ptr = (DAPL_EP *) ep_handle;
-       qp_ptr = ep_ptr->qp_handle;
-
-       return (dapli_socket_connect(ep_ptr, remote_ia_address,
-                                    remote_conn_qual,
-                                    private_data_size, private_data));
-}
-
-/*
- * dapls_ib_disconnect
- *
- * Disconnect an EP
- *
- * Input:
- *     ep_handle,
- *     disconnect_flags
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- */
-DAT_RETURN
-dapls_ib_disconnect(IN DAPL_EP * ep_ptr, IN DAT_CLOSE_FLAGS close_flags)
-{
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    "dapls_ib_disconnect(ep_handle %p ....)\n", ep_ptr);
-
-       /* reinit to modify QP state */
-       dapls_ib_reinit_ep(ep_ptr);
-
-       if (ep_ptr->cm_handle == NULL ||
-           ep_ptr->param.ep_state == DAT_EP_STATE_DISCONNECTED)
-               return DAT_SUCCESS;
-       else
-               return (dapli_socket_disconnect(ep_ptr->cm_handle));
-}
-
-/*
- * dapls_ib_disconnect_clean
- *
- * Clean up outstanding connection data. This routine is invoked
- * after the final disconnect callback has occurred. Only on the
- * ACTIVE side of a connection.
- *
- * Input:
- *     ep_ptr          DAPL_EP
- *     active          Indicates active side of connection
- *
- * Output:
- *     none
- *
- * Returns:
- *     void
- *
- */
-void
-dapls_ib_disconnect_clean(IN DAPL_EP * ep_ptr,
-                         IN DAT_BOOLEAN active,
-                         IN const ib_cm_events_t ib_cm_event)
-{
-       if (ep_ptr->cm_handle)
-               dapli_cm_destroy(ep_ptr->cm_handle);
-
-       return;
-}
-
-/*
- * dapl_ib_setup_conn_listener
- *
- * Have the CM set up a connection listener.
- *
- * Input:
- *     ibm_hca_handle          HCA handle
- *     qp_handle                       QP handle
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INSUFFICIENT_RESOURCES
- *     DAT_INTERNAL_ERROR
- *     DAT_CONN_QUAL_UNAVAILBLE
- *     DAT_CONN_QUAL_IN_USE
- *
- */
-DAT_RETURN
-dapls_ib_setup_conn_listener(IN DAPL_IA * ia_ptr,
-                            IN DAT_UINT64 ServiceID, IN DAPL_SP * sp_ptr)
-{
-       return (dapli_socket_listen(ia_ptr, ServiceID, sp_ptr));
-}
-
-/*
- * dapl_ib_remove_conn_listener
- *
- * Have the CM remove a connection listener.
- *
- * Input:
- *     ia_handle               IA handle
- *     ServiceID               IB Channel Service ID
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INVALID_STATE
- *
- */
-DAT_RETURN
-dapls_ib_remove_conn_listener(IN DAPL_IA * ia_ptr, IN DAPL_SP * sp_ptr)
-{
-       ib_cm_srvc_handle_t cm_ptr = sp_ptr->cm_srvc_handle;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    "dapls_ib_remove_conn_listener(ia_ptr %p sp_ptr %p cm_ptr %p)\n",
-                    ia_ptr, sp_ptr, cm_ptr);
-
-       /* close accepted socket, free cm_srvc_handle and return */
-       if (cm_ptr != NULL) {
-               if (cm_ptr->socket != DAPL_INVALID_SOCKET) {
-                       closesocket(cm_ptr->socket);
-                       cm_ptr->socket = DAPL_INVALID_SOCKET;
-               }
-               /* cr_thread will free */
-               cm_ptr->state = SCM_DESTROY;
-               sp_ptr->cm_srvc_handle = NULL;
-               if (send(cm_ptr->hca->ib_trans.scm[1], 
-                        "w", sizeof "w", 0) == -1)
-                       dapl_log(DAPL_DBG_TYPE_CM,
-                                " cm_destroy: thread wakeup error = %s\n",
-                                strerror(errno));
-       }
-       return DAT_SUCCESS;
-}
-
-/*
- * dapls_ib_accept_connection
- *
- * Perform necessary steps to accept a connection
- *
- * Input:
- *     cr_handle
- *     ep_handle
- *     private_data_size
- *     private_data
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INSUFFICIENT_RESOURCES
- *     DAT_INTERNAL_ERROR
- *
- */
-DAT_RETURN
-dapls_ib_accept_connection(IN DAT_CR_HANDLE cr_handle,
-                          IN DAT_EP_HANDLE ep_handle,
-                          IN DAT_COUNT p_size, IN const DAT_PVOID p_data)
-{
-       DAPL_CR *cr_ptr;
-       DAPL_EP *ep_ptr;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    "dapls_ib_accept_connection(cr %p ep %p prd %p,%d)\n",
-                    cr_handle, ep_handle, p_data, p_size);
-
-       cr_ptr = (DAPL_CR *) cr_handle;
-       ep_ptr = (DAPL_EP *) ep_handle;
-
-       /* allocate and attach a QP if necessary */
-       if (ep_ptr->qp_state == DAPL_QP_STATE_UNATTACHED) {
-               DAT_RETURN status;
-               status = dapls_ib_qp_alloc(ep_ptr->header.owner_ia,
-                                          ep_ptr, ep_ptr);
-               if (status != DAT_SUCCESS)
-                       return status;
-       }
-       return (dapli_socket_accept_usr(ep_ptr, cr_ptr, p_size, p_data));
-}
-
-/*
- * dapls_ib_reject_connection
- *
- * Reject a connection
- *
- * Input:
- *     cr_handle
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INTERNAL_ERROR
- *
- */
-DAT_RETURN
-dapls_ib_reject_connection(IN dp_ib_cm_handle_t cm_ptr,
-                          IN int reason,
-                          IN DAT_COUNT psize, IN const DAT_PVOID pdata)
-{
-       struct iovec iov[2];
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    " reject(cm %p reason %x, pdata %p, psize %d)\n",
-                    cm_ptr, reason, pdata, psize);
-
-       /* write reject data to indicate reject */
-       if (cm_ptr->socket != DAPL_INVALID_SOCKET) {
-               cm_ptr->dst.rej = (uint16_t) reason;
-               cm_ptr->dst.rej = htons(cm_ptr->dst.rej);
-
-               iov[0].iov_base = (void *)&cm_ptr->dst;
-               iov[0].iov_len = sizeof(ib_qp_cm_t);
-               if (psize) {
-                       iov[1].iov_base = pdata;
-                       iov[1].iov_len = psize;
-                       writev(cm_ptr->socket, iov, 2);
-               } else {
-                       writev(cm_ptr->socket, iov, 1);
-               }
-
-               closesocket(cm_ptr->socket);
-               cm_ptr->socket = DAPL_INVALID_SOCKET;
-       }
-
-       /* cr_thread will destroy CR */
-       cm_ptr->state = SCM_REJECTED;
-       if (send(cm_ptr->hca->ib_trans.scm[1], "w", sizeof "w", 0) == -1)
-               dapl_log(DAPL_DBG_TYPE_CM,
-                        " cm_destroy: thread wakeup error = %s\n",
-                        strerror(errno));
-       return DAT_SUCCESS;
-}
-
-/*
- * dapls_ib_cm_remote_addr
- *
- * Obtain the remote IP address given a connection
- *
- * Input:
- *     cr_handle
- *
- * Output:
- *     remote_ia_address: where to place the remote address
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INVALID_HANDLE
- *
- */
-DAT_RETURN
-dapls_ib_cm_remote_addr(IN DAT_HANDLE dat_handle,
-                       OUT DAT_SOCK_ADDR6 * remote_ia_address)
-{
-       DAPL_HEADER *header;
-       dp_ib_cm_handle_t ib_cm_handle;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    "dapls_ib_cm_remote_addr(dat_handle %p, ....)\n",
-                    dat_handle);
-
-       header = (DAPL_HEADER *) dat_handle;
-
-       if (header->magic == DAPL_MAGIC_EP)
-               ib_cm_handle = ((DAPL_EP *) dat_handle)->cm_handle;
-       else if (header->magic == DAPL_MAGIC_CR)
-               ib_cm_handle = ((DAPL_CR *) dat_handle)->ib_cm_handle;
-       else
-               return DAT_INVALID_HANDLE;
-
-       dapl_os_memcpy(remote_ia_address,
-                      &ib_cm_handle->dst.ia_address, sizeof(DAT_SOCK_ADDR6));
-
-       return DAT_SUCCESS;
-}
-
-/*
- * dapls_ib_private_data_size
- *
- * Return the size of private data given a connection op type
- *
- * Input:
- *     prd_ptr         private data pointer
- *     conn_op         connection operation type
- *
- * If prd_ptr is NULL, this is a query for the max size supported by
- * the provider, otherwise it is the actual size of the private data
- * contained in prd_ptr.
- *
- *
- * Output:
- *     None
- *
- * Returns:
- *     length of private data
- *
- */
-int dapls_ib_private_data_size(IN DAPL_PRIVATE * prd_ptr,
-                              IN DAPL_PDATA_OP conn_op, IN DAPL_HCA * hca_ptr)
-{
-       int size;
-
-       switch (conn_op) {
-       case DAPL_PDATA_CONN_REQ:
-               {
-                       size = IB_MAX_REQ_PDATA_SIZE;
-                       break;
-               }
-       case DAPL_PDATA_CONN_REP:
-               {
-                       size = IB_MAX_REP_PDATA_SIZE;
-                       break;
-               }
-       case DAPL_PDATA_CONN_REJ:
-               {
-                       size = IB_MAX_REJ_PDATA_SIZE;
-                       break;
-               }
-       case DAPL_PDATA_CONN_DREQ:
-               {
-                       size = IB_MAX_DREQ_PDATA_SIZE;
-                       break;
-               }
-       case DAPL_PDATA_CONN_DREP:
-               {
-                       size = IB_MAX_DREP_PDATA_SIZE;
-                       break;
-               }
-       default:
-               {
-                       size = 0;
-               }
-
-       }                       /* end case */
-
-       return size;
-}
-
-/*
- * Map all socket CM event codes to the DAT equivelent.
- */
-#define DAPL_IB_EVENT_CNT      11
-
-static struct ib_cm_event_map {
-       const ib_cm_events_t ib_cm_event;
-       DAT_EVENT_NUMBER dat_event_num;
-} ib_cm_event_map[DAPL_IB_EVENT_CNT] = {
-       /* 00 */  {
-       IB_CME_CONNECTED, DAT_CONNECTION_EVENT_ESTABLISHED},
-           /* 01 */  {
-       IB_CME_DISCONNECTED, DAT_CONNECTION_EVENT_DISCONNECTED},
-           /* 02 */  {
-       IB_CME_DISCONNECTED_ON_LINK_DOWN,
-                   DAT_CONNECTION_EVENT_DISCONNECTED},
-           /* 03 */  {
-       IB_CME_CONNECTION_REQUEST_PENDING, DAT_CONNECTION_REQUEST_EVENT},
-           /* 04 */  {
-       IB_CME_CONNECTION_REQUEST_PENDING_PRIVATE_DATA,
-                   DAT_CONNECTION_REQUEST_EVENT},
-           /* 05 */  {
-       IB_CME_DESTINATION_REJECT,
-                   DAT_CONNECTION_EVENT_NON_PEER_REJECTED},
-           /* 06 */  {
-       IB_CME_DESTINATION_REJECT_PRIVATE_DATA,
-                   DAT_CONNECTION_EVENT_PEER_REJECTED},
-           /* 07 */  {
-       IB_CME_DESTINATION_UNREACHABLE, DAT_CONNECTION_EVENT_UNREACHABLE},
-           /* 08 */  {
-       IB_CME_TOO_MANY_CONNECTION_REQUESTS,
-                   DAT_CONNECTION_EVENT_NON_PEER_REJECTED},
-           /* 09 */  {
-       IB_CME_LOCAL_FAILURE, DAT_CONNECTION_EVENT_BROKEN},
-           /* 10 */  {
-       IB_CM_LOCAL_FAILURE, DAT_CONNECTION_EVENT_BROKEN}
-};
-
-/*
- * dapls_ib_get_cm_event
- *
- * Return a DAT connection event given a provider CM event.
- *
- * Input:
- *     dat_event_num   DAT event we need an equivelent CM event for
- *
- * Output:
- *     none
- *
- * Returns:
- *     ib_cm_event of translated DAPL value
- */
-DAT_EVENT_NUMBER
-dapls_ib_get_dat_event(IN const ib_cm_events_t ib_cm_event,
-                      IN DAT_BOOLEAN active)
-{
-       DAT_EVENT_NUMBER dat_event_num;
-       int i;
-
-       active = active;
-
-       if (ib_cm_event > IB_CM_LOCAL_FAILURE)
-               return (DAT_EVENT_NUMBER) 0;
-
-       dat_event_num = 0;
-       for (i = 0; i < DAPL_IB_EVENT_CNT; i++) {
-               if (ib_cm_event == ib_cm_event_map[i].ib_cm_event) {
-                       dat_event_num = ib_cm_event_map[i].dat_event_num;
-                       break;
-               }
-       }
-       dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK,
-                    "dapls_ib_get_dat_event: event translate(%s) ib=0x%x dat=0x%x\n",
-                    active ? "active" : "passive", ib_cm_event, dat_event_num);
-
-       return dat_event_num;
-}
-
-/*
- * dapls_ib_get_dat_event
- *
- * Return a DAT connection event given a provider CM event.
- * 
- * Input:
- *     ib_cm_event     event provided to the dapl callback routine
- *     active          switch indicating active or passive connection
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_EVENT_NUMBER of translated provider value
- */
-ib_cm_events_t dapls_ib_get_cm_event(IN DAT_EVENT_NUMBER dat_event_num)
-{
-       ib_cm_events_t ib_cm_event;
-       int i;
-
-       ib_cm_event = 0;
-       for (i = 0; i < DAPL_IB_EVENT_CNT; i++) {
-               if (dat_event_num == ib_cm_event_map[i].dat_event_num) {
-                       ib_cm_event = ib_cm_event_map[i].ib_cm_event;
-                       break;
-               }
-       }
-       return ib_cm_event;
-}
-
-/* outbound/inbound CR processing thread to avoid blocking applications */
-void cr_thread(void *arg)
-{
-       struct dapl_hca *hca_ptr = arg;
-       dp_ib_cm_handle_t cr, next_cr;
-       int opt, ret;
-       socklen_t opt_len;
-       char rbuf[2];
-       struct dapl_fd_set *set;
-       enum DAPL_FD_EVENTS event;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cr_thread: ENTER hca %p\n", hca_ptr);
-       set = dapl_alloc_fd_set();
-       if (!set)
-               goto out;
-
-       dapl_os_lock(&hca_ptr->ib_trans.lock);
-       hca_ptr->ib_trans.cr_state = IB_THREAD_RUN;
-
-       while (hca_ptr->ib_trans.cr_state == IB_THREAD_RUN) {
-               dapl_fd_zero(set);
-               dapl_fd_set(hca_ptr->ib_trans.scm[0], set, DAPL_FD_READ);
-
-               if (!dapl_llist_is_empty(&hca_ptr->ib_trans.list))
-                       next_cr = dapl_llist_peek_head(&hca_ptr->ib_trans.list);
-               else
-                       next_cr = NULL;
-
-               while (next_cr) {
-                       cr = next_cr;
-                       next_cr = dapl_llist_next_entry(&hca_ptr->ib_trans.list,
-                                                       (DAPL_LLIST_ENTRY *) &
-                                                       cr->entry);
-                       if (cr->state == SCM_DESTROY
-                           || hca_ptr->ib_trans.cr_state != IB_THREAD_RUN) {
-                               dapl_llist_remove_entry(&hca_ptr->ib_trans.list,
-                                                       (DAPL_LLIST_ENTRY *) &
-                                                       cr->entry);
-                               dapl_os_free(cr, sizeof(*cr));
-                               continue;
-                       }
-                       if (cr->socket == DAPL_INVALID_SOCKET)
-                               continue;
-
-                       event = (cr->state == SCM_CONN_PENDING) ?
-                           DAPL_FD_WRITE : DAPL_FD_READ;
-                       if (dapl_fd_set(cr->socket, set, event)) {
-                               dapl_log(DAPL_DBG_TYPE_ERR,
-                                        " cr_thread: DESTROY CR st=%d fd %d"
-                                        " -> %s\n", cr->state, cr->socket,
-                                        inet_ntoa(((struct sockaddr_in *)
-                                                   &cr->dst.ia_address)->
-                                                  sin_addr));
-                               dapli_cm_destroy(cr);
-                               continue;
-                       }
-
-                       dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                                    " poll cr=%p, socket=%d\n", cr,
-                                    cr->socket);
-                       dapl_os_unlock(&hca_ptr->ib_trans.lock);
-
-                       ret = dapl_poll(cr->socket, event);
-
-                       dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                                    " poll ret=0x%x cr->state=%d socket=%d\n",
-                                    ret, cr->state, cr->socket);
-
-                       /* data on listen, qp exchange, and on disconnect request */
-                       if (ret == DAPL_FD_READ) {
-                               if (cr->socket != DAPL_INVALID_SOCKET) {
-                                       switch (cr->state) {
-                                       case SCM_LISTEN:
-                                               dapli_socket_accept(cr);
-                                               break;
-                                       case SCM_ACCEPTING:
-                                               dapli_socket_accept_data(cr);
-                                               break;
-                                       case SCM_ACCEPTED:
-                                               dapli_socket_accept_rtu(cr);
-                                               break;
-                                       case SCM_RTU_PENDING:
-                                               dapli_socket_connect_rtu(cr);
-                                               break;
-                                       case SCM_CONNECTED:
-                                               dapli_socket_disconnect(cr);
-                                               break;
-                                       default:
-                                               break;
-                                       }
-                               }
-                               /* connect socket is writable, check status */
-                       } else if (ret == DAPL_FD_WRITE || ret == DAPL_FD_ERROR) {
-                               if (cr->state == SCM_CONN_PENDING) {
-                                       opt = 0;
-                                       opt_len = sizeof(opt);
-                                       ret = getsockopt(cr->socket, SOL_SOCKET,
-                                                        SO_ERROR, (char *)&opt,
-                                                        &opt_len);
-                                       if (!ret)
-                                               dapli_socket_connected(cr, opt);
-                                       else
-                                               dapli_socket_connected(cr,
-                                                                      errno);
-                               } else {
-                                       dapl_log(DAPL_DBG_TYPE_CM,
-                                                " CM poll ERR, wrong state(%d) -> %s SKIP\n",
-                                                cr->state,
-                                                inet_ntoa(((struct sockaddr_in
-                                                            *)&cr->dst.
-                                                           ia_address)->
-                                                          sin_addr));
-                               }
-                       } else if (ret != 0) {
-                               dapl_log(DAPL_DBG_TYPE_CM,
-                                        " CM poll warning %s, ret=%d st=%d -> %s\n",
-                                        strerror(errno), ret, cr->state,
-                                        inet_ntoa(((struct sockaddr_in *)
-                                                   &cr->dst.ia_address)->
-                                                  sin_addr));
-
-                               /* POLLUP, NVAL, or poll error. - DISC */
-                               dapli_socket_disconnect(cr);
-                       }
-
-                       dapl_os_lock(&hca_ptr->ib_trans.lock);
-               }
-
-               dapl_os_unlock(&hca_ptr->ib_trans.lock);
-               dapl_select(set);
-
-               /* if pipe used to wakeup, consume */
-               while (dapl_poll(hca_ptr->ib_trans.scm[0], 
-                                DAPL_FD_READ) == DAPL_FD_READ) {
-                       if (recv(hca_ptr->ib_trans.scm[0], rbuf, 2, 0) == -1)
-                               dapl_log(DAPL_DBG_TYPE_CM,
-                                        " cr_thread: read pipe error = %s\n",
-                                        strerror(errno));
-               }
-               dapl_os_lock(&hca_ptr->ib_trans.lock);
-       }
-
-       dapl_os_unlock(&hca_ptr->ib_trans.lock);
-       free(set);
-      out:
-       hca_ptr->ib_trans.cr_state = IB_THREAD_EXIT;
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cr_thread(hca %p) exit\n", hca_ptr);
-}
diff --git a/branches/winverbs/ulp/dapl2/dapl/openib_scm/dapl_ib_cq.c b/branches/winverbs/ulp/dapl2/dapl/openib_scm/dapl_ib_cq.c
deleted file mode 100644 (file)
index 8a9a2ab..0000000
+++ /dev/null
@@ -1,704 +0,0 @@
-/*
- * This Software is licensed under one of the following licenses:
- *
- * 1) under the terms of the "Common Public License 1.0" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/cpl.php.
- *
- * 2) under the terms of the "The BSD License" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/bsd-license.php.
- *
- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
- *    copy of which is available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/gpl-license.php.
- *
- * Licensee has the right to choose one of the above licenses.
- *
- * Redistributions of source code must retain the above copyright
- * notice and one of the license notices.
- *
- * Redistributions in binary form must reproduce both the above copyright
- * notice, one of the license notices in the documentation
- * and/or other materials provided with the distribution.
- */
-
-/***************************************************************************
- *
- *   Module:            uDAPL
- *
- *   Filename:          dapl_ib_cq.c
- *
- *   Author:            Arlin Davis
- *
- *   Created:           3/10/2005
- *
- *   Description: 
- *
- *   The uDAPL openib provider - completion queue
- *
- ****************************************************************************
- *                Source Control System Information
- *
- *    $Id: $
- *
- *     Copyright (c) 2005 Intel Corporation.  All rights reserved.
- *
- **************************************************************************/
-
-#include "openib_osd.h"
-#include "dapl.h"
-#include "dapl_adapter_util.h"
-#include "dapl_lmr_util.h"
-#include "dapl_evd_util.h"
-#include "dapl_ring_buffer_util.h"
-
-#if defined(_WIN64) || defined(_WIN32)
-#include "..\..\..\..\..\etc\user\comp_channel.cpp"
-
-void dapli_cq_thread_destroy(struct dapl_hca *hca_ptr)
-{
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cq_thread_destroy(%p)\n", hca_ptr);
-
-       if (hca_ptr->ib_trans.cq_state != IB_THREAD_RUN)
-               return;
-
-       /* destroy cr_thread and lock */
-       hca_ptr->ib_trans.cq_state = IB_THREAD_CANCEL;
-       CompChannelCancel(&hca_ptr->ib_trans.ib_cq->comp_channel);
-       dapl_dbg_log(DAPL_DBG_TYPE_CM, " cq_thread_destroy(%p) cancel\n",
-                    hca_ptr);
-       while (hca_ptr->ib_trans.cq_state != IB_THREAD_EXIT) {
-               dapl_os_sleep_usec(20000);
-       }
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cq_thread_destroy(%d) exit\n",
-                    dapl_os_getpid());
-}
-
-static void cq_thread(void *arg)
-{
-       struct dapl_hca *hca_ptr = arg;
-       struct dapl_evd *evd_ptr;
-       struct ibv_cq *ibv_cq = NULL;
-
-       hca_ptr->ib_trans.cq_state = IB_THREAD_RUN;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cq_thread: ENTER hca %p\n", hca_ptr);
-
-       /* wait on DTO event, or signal to abort */
-       while (hca_ptr->ib_trans.cq_state == IB_THREAD_RUN) {
-               if (!ibv_get_cq_event
-                   (hca_ptr->ib_trans.ib_cq, &ibv_cq, (void *)&evd_ptr)) {
-
-                       if (DAPL_BAD_HANDLE(evd_ptr, DAPL_MAGIC_EVD)) {
-                               ibv_ack_cq_events(ibv_cq, 1);
-                               return;
-                       }
-
-                       /* process DTO event via callback */
-                       dapl_evd_dto_callback(hca_ptr->ib_hca_handle,
-                                             evd_ptr->ib_cq_handle,
-                                             (void *)evd_ptr);
-
-                       ibv_ack_cq_events(ibv_cq, 1);
-               }
-       }
-       hca_ptr->ib_trans.cq_state = IB_THREAD_EXIT;
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cq_thread: EXIT: hca %p \n",
-                    hca_ptr);
-}
-
-#else                          // _WIN32 || _WIN64
-
-void dapli_cq_thread_destroy(struct dapl_hca *hca_ptr)
-{
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cq_thread_destroy(%p)\n", hca_ptr);
-
-       if (hca_ptr->ib_trans.cq_state != IB_THREAD_RUN)
-               return;
-
-       /* destroy cr_thread and lock */
-       hca_ptr->ib_trans.cq_state = IB_THREAD_CANCEL;
-       pthread_kill(hca_ptr->ib_trans.cq_thread, SIGUSR1);
-       dapl_dbg_log(DAPL_DBG_TYPE_CM, " cq_thread_destroy(%p) cancel\n",
-                    hca_ptr);
-       while (hca_ptr->ib_trans.cq_state != IB_THREAD_EXIT) {
-               dapl_os_sleep_usec(20000);
-       }
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cq_thread_destroy(%d) exit\n",
-                    dapl_os_getpid());
-}
-
-/* catch the signal */
-static void ib_cq_handler(int signum)
-{
-       return;
-}
-
-static void cq_thread(void *arg)
-{
-       struct dapl_hca *hca_ptr = arg;
-       struct dapl_evd *evd_ptr;
-       struct ibv_cq *ibv_cq = NULL;
-       sigset_t sigset;
-
-       sigemptyset(&sigset);
-       sigaddset(&sigset, SIGUSR1);
-       pthread_sigmask(SIG_UNBLOCK, &sigset, NULL);
-       signal(SIGUSR1, ib_cq_handler);
-
-       hca_ptr->ib_trans.cq_state = IB_THREAD_RUN;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cq_thread: ENTER hca %p\n", hca_ptr);
-
-       /* wait on DTO event, or signal to abort */
-       while (hca_ptr->ib_trans.cq_state == IB_THREAD_RUN) {
-               struct pollfd cq_fd = {
-                       .fd = hca_ptr->ib_trans.ib_cq->fd,
-                       .events = POLLIN,
-                       .revents = 0
-               };
-               if ((poll(&cq_fd, 1, -1) == 1) &&
-                   (!ibv_get_cq_event
-                    (hca_ptr->ib_trans.ib_cq, &ibv_cq, (void *)&evd_ptr))) {
-
-                       if (DAPL_BAD_HANDLE(evd_ptr, DAPL_MAGIC_EVD)) {
-                               ibv_ack_cq_events(ibv_cq, 1);
-                               return;
-                       }
-
-                       /* process DTO event via callback */
-                       dapl_evd_dto_callback(hca_ptr->ib_hca_handle,
-                                             evd_ptr->ib_cq_handle,
-                                             (void *)evd_ptr);
-
-                       ibv_ack_cq_events(ibv_cq, 1);
-               }
-       }
-       hca_ptr->ib_trans.cq_state = IB_THREAD_EXIT;
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cq_thread: EXIT: hca %p \n",
-                    hca_ptr);
-}
-
-#endif                         // _WIN32 || _WIN64
-
-int dapli_cq_thread_init(struct dapl_hca *hca_ptr)
-{
-       DAT_RETURN dat_status;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cq_thread_init(%p)\n", hca_ptr);
-
-       /* create thread to process inbound connect request */
-       hca_ptr->ib_trans.cq_state = IB_THREAD_INIT;
-       dat_status =
-           dapl_os_thread_create(cq_thread, (void *)hca_ptr,
-                                 &hca_ptr->ib_trans.cq_thread);
-       if (dat_status != DAT_SUCCESS) {
-               dapl_dbg_log(DAPL_DBG_TYPE_ERR,
-                            " cq_thread_init: failed to create thread\n");
-               return 1;
-       }
-
-       /* wait for thread to start */
-       while (hca_ptr->ib_trans.cq_state != IB_THREAD_RUN) {
-               dapl_os_sleep_usec(20000);
-       }
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cq_thread_init(%d) exit\n",
-                    dapl_os_getpid());
-       return 0;
-}
-
-/*
- * Map all verbs DTO completion codes to the DAT equivelent.
- *
- * Not returned by verbs:     DAT_DTO_ERR_PARTIAL_PACKET
- */
-static struct ib_status_map {
-       int ib_status;
-       DAT_DTO_COMPLETION_STATUS dat_status;
-} ib_status_map[] = {
-       /* 00 */  {
-       IBV_WC_SUCCESS, DAT_DTO_SUCCESS},
-           /* 01 */  {
-       IBV_WC_LOC_LEN_ERR, DAT_DTO_ERR_LOCAL_LENGTH},
-           /* 02 */  {
-       IBV_WC_LOC_QP_OP_ERR, DAT_DTO_ERR_LOCAL_EP},
-           /* 03 */  {
-       IBV_WC_LOC_EEC_OP_ERR, DAT_DTO_ERR_TRANSPORT},
-           /* 04 */  {
-       IBV_WC_LOC_PROT_ERR, DAT_DTO_ERR_LOCAL_PROTECTION},
-           /* 05 */  {
-       IBV_WC_WR_FLUSH_ERR, DAT_DTO_ERR_FLUSHED},
-           /* 06 */  {
-       IBV_WC_MW_BIND_ERR, DAT_RMR_OPERATION_FAILED},
-           /* 07 */  {
-       IBV_WC_BAD_RESP_ERR, DAT_DTO_ERR_BAD_RESPONSE},
-           /* 08 */  {
-       IBV_WC_LOC_ACCESS_ERR, DAT_DTO_ERR_LOCAL_PROTECTION},
-           /* 09 */  {
-       IBV_WC_REM_INV_REQ_ERR, DAT_DTO_ERR_REMOTE_RESPONDER},
-           /* 10 */  {
-       IBV_WC_REM_ACCESS_ERR, DAT_DTO_ERR_REMOTE_ACCESS},
-           /* 11 */  {
-       IBV_WC_REM_OP_ERR, DAT_DTO_ERR_REMOTE_RESPONDER},
-           /* 12 */  {
-       IBV_WC_RETRY_EXC_ERR, DAT_DTO_ERR_TRANSPORT},
-           /* 13 */  {
-       IBV_WC_RNR_RETRY_EXC_ERR, DAT_DTO_ERR_RECEIVER_NOT_READY},
-           /* 14 */  {
-       IBV_WC_LOC_RDD_VIOL_ERR, DAT_DTO_ERR_LOCAL_PROTECTION},
-           /* 15 */  {
-       IBV_WC_REM_INV_RD_REQ_ERR, DAT_DTO_ERR_REMOTE_RESPONDER},
-           /* 16 */  {
-       IBV_WC_REM_ABORT_ERR, DAT_DTO_ERR_REMOTE_RESPONDER},
-           /* 17 */  {
-       IBV_WC_INV_EECN_ERR, DAT_DTO_ERR_TRANSPORT},
-           /* 18 */  {
-       IBV_WC_INV_EEC_STATE_ERR, DAT_DTO_ERR_TRANSPORT},
-           /* 19 */  {
-       IBV_WC_FATAL_ERR, DAT_DTO_ERR_TRANSPORT},
-           /* 20 */  {
-       IBV_WC_RESP_TIMEOUT_ERR, DAT_DTO_ERR_RECEIVER_NOT_READY},
-           /* 21 */  {
-IBV_WC_GENERAL_ERR, DAT_DTO_ERR_TRANSPORT},};
-
-/*
- * dapls_ib_get_dto_status
- *
- * Return the DAT status of a DTO operation
- *
- * Input:
- *     cqe_ptr         pointer to completion queue entry
- *
- * Output:
- *     none
- *
- * Returns:
- *     Value from ib_status_map table above
- */
-
-DAT_DTO_COMPLETION_STATUS
-dapls_ib_get_dto_status(IN ib_work_completion_t * cqe_ptr)
-{
-       uint32_t ib_status;
-       int i;
-
-       ib_status = DAPL_GET_CQE_STATUS(cqe_ptr);
-
-       /*
-        * Due to the implementation of verbs completion code, we need to
-        * search the table for the correct value rather than assuming
-        * linear distribution.
-        */
-       for (i = 0; i <= IBV_WC_GENERAL_ERR; i++) {
-               if (ib_status == ib_status_map[i].ib_status) {
-                       if (ib_status != IBV_WC_SUCCESS) {
-                               dapl_dbg_log(DAPL_DBG_TYPE_DTO_COMP_ERR,
-                                            " DTO completion ERROR: %d: op %#x\n",
-                                            ib_status,
-                                            DAPL_GET_CQE_OPTYPE(cqe_ptr));
-                       }
-                       return ib_status_map[i].dat_status;
-               }
-       }
-
-       dapl_dbg_log(DAPL_DBG_TYPE_DTO_COMP_ERR,
-                    " DTO completion ERROR: %d: op %#x\n",
-                    ib_status, DAPL_GET_CQE_OPTYPE(cqe_ptr));
-
-       return DAT_DTO_FAILURE;
-}
-
-DAT_RETURN dapls_ib_get_async_event(IN ib_error_record_t * err_record,
-                                   OUT DAT_EVENT_NUMBER * async_event)
-{
-       DAT_RETURN dat_status = DAT_SUCCESS;
-       int err_code = err_record->event_type;
-
-       switch (err_code) {
-               /* OVERFLOW error */
-       case IBV_EVENT_CQ_ERR:
-               *async_event = DAT_ASYNC_ERROR_EVD_OVERFLOW;
-               break;
-               /* INTERNAL errors */
-       case IBV_EVENT_DEVICE_FATAL:
-               *async_event = DAT_ASYNC_ERROR_PROVIDER_INTERNAL_ERROR;
-               break;
-               /* CATASTROPHIC errors */
-       case IBV_EVENT_PORT_ERR:
-               *async_event = DAT_ASYNC_ERROR_IA_CATASTROPHIC;
-               break;
-               /* BROKEN QP error */
-       case IBV_EVENT_SQ_DRAINED:
-       case IBV_EVENT_QP_FATAL:
-       case IBV_EVENT_QP_REQ_ERR:
-       case IBV_EVENT_QP_ACCESS_ERR:
-               *async_event = DAT_ASYNC_ERROR_EP_BROKEN;
-               break;
-
-               /* connection completion */
-       case IBV_EVENT_COMM_EST:
-               *async_event = DAT_CONNECTION_EVENT_ESTABLISHED;
-               break;
-
-               /* TODO: process HW state changes */
-       case IBV_EVENT_PATH_MIG:
-       case IBV_EVENT_PATH_MIG_ERR:
-       case IBV_EVENT_PORT_ACTIVE:
-       case IBV_EVENT_LID_CHANGE:
-       case IBV_EVENT_PKEY_CHANGE:
-       case IBV_EVENT_SM_CHANGE:
-       default:
-               dat_status = DAT_ERROR(DAT_NOT_IMPLEMENTED, 0);
-       }
-       return dat_status;
-}
-
-/*
- * dapl_ib_cq_alloc
- *
- * Alloc a CQ
- *
- * Input:
- *     ia_handle               IA handle
- *     evd_ptr                 pointer to EVD struct
- *     cqlen                   minimum QLen
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INSUFFICIENT_RESOURCES
- *
- */
-DAT_RETURN
-dapls_ib_cq_alloc(IN DAPL_IA * ia_ptr,
-                 IN DAPL_EVD * evd_ptr, IN DAT_COUNT * cqlen)
-{
-       struct ibv_comp_channel *channel = ia_ptr->hca_ptr->ib_trans.ib_cq;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    "dapls_ib_cq_alloc: evd %p cqlen=%d \n", evd_ptr, *cqlen);
-
-#ifdef CQ_WAIT_OBJECT
-       if (evd_ptr->cq_wait_obj_handle)
-               channel = evd_ptr->cq_wait_obj_handle;
-#endif
-
-       /* Call IB verbs to create CQ */
-       evd_ptr->ib_cq_handle = ibv_create_cq(ia_ptr->hca_ptr->ib_hca_handle,
-                                             *cqlen, evd_ptr, channel, 0);
-
-       if (evd_ptr->ib_cq_handle == IB_INVALID_HANDLE)
-               return DAT_INSUFFICIENT_RESOURCES;
-
-       /* arm cq for events */
-       dapls_set_cq_notify(ia_ptr, evd_ptr);
-
-       /* update with returned cq entry size */
-       *cqlen = evd_ptr->ib_cq_handle->cqe;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    "dapls_ib_cq_alloc: new_cq %p cqlen=%d \n",
-                    evd_ptr->ib_cq_handle, *cqlen);
-
-       return DAT_SUCCESS;
-}
-
-/*
- * dapl_ib_cq_resize
- *
- * Alloc a CQ
- *
- * Input:
- *     ia_handle               IA handle
- *     evd_ptr                 pointer to EVD struct
- *     cqlen                   minimum QLen
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INVALID_PARAMETER
- *
- */
-DAT_RETURN
-dapls_ib_cq_resize(IN DAPL_IA * ia_ptr,
-                  IN DAPL_EVD * evd_ptr, IN DAT_COUNT * cqlen)
-{
-       ib_cq_handle_t new_cq;
-       struct ibv_comp_channel *channel = ia_ptr->hca_ptr->ib_trans.ib_cq;
-
-       /* IB verbs doe not support resize. Try to re-create CQ
-        * with new size. Can only be done if QP is not attached. 
-        * destroy EBUSY == QP still attached.
-        */
-
-#ifdef CQ_WAIT_OBJECT
-       if (evd_ptr->cq_wait_obj_handle)
-               channel = evd_ptr->cq_wait_obj_handle;
-#endif
-
-       /* Call IB verbs to create CQ */
-       new_cq = ibv_create_cq(ia_ptr->hca_ptr->ib_hca_handle, *cqlen,
-                              evd_ptr, channel, 0);
-
-       if (new_cq == IB_INVALID_HANDLE)
-               return DAT_INSUFFICIENT_RESOURCES;
-
-       /* destroy the original and replace if successful */
-       if (ibv_destroy_cq(evd_ptr->ib_cq_handle)) {
-               ibv_destroy_cq(new_cq);
-               return (dapl_convert_errno(errno, "resize_cq"));
-       }
-
-       /* update EVD with new cq handle and size */
-       evd_ptr->ib_cq_handle = new_cq;
-       *cqlen = new_cq->cqe;
-
-       /* arm cq for events */
-       dapls_set_cq_notify(ia_ptr, evd_ptr);
-
-       return DAT_SUCCESS;
-}
-
-/*
- * dapls_ib_cq_free
- *
- * destroy a CQ
- *
- * Input:
- *     ia_handle               IA handle
- *     evd_ptr                 pointer to EVD struct
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INVALID_PARAMETER
- *
- */
-DAT_RETURN dapls_ib_cq_free(IN DAPL_IA * ia_ptr, IN DAPL_EVD * evd_ptr)
-{
-       DAT_EVENT event;
-       ib_work_completion_t wc;
-
-       if (evd_ptr->ib_cq_handle != IB_INVALID_HANDLE) {
-               /* pull off CQ and EVD entries and toss */
-               while (ibv_poll_cq(evd_ptr->ib_cq_handle, 1, &wc) == 1) ;
-               while (dapl_evd_dequeue(evd_ptr, &event) == DAT_SUCCESS) ;
-               if (ibv_destroy_cq(evd_ptr->ib_cq_handle))
-                       return (dapl_convert_errno(errno, "ibv_destroy_cq"));
-               evd_ptr->ib_cq_handle = IB_INVALID_HANDLE;
-       }
-       return DAT_SUCCESS;
-}
-
-/*
- * dapls_set_cq_notify
- *
- * Set the CQ notification for next
- *
- * Input:
- *     hca_handl               hca handle
- *     DAPL_EVD                evd handle
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     dapl_convert_errno 
- */
-DAT_RETURN dapls_set_cq_notify(IN DAPL_IA * ia_ptr, IN DAPL_EVD * evd_ptr)
-{
-       if (ibv_req_notify_cq(evd_ptr->ib_cq_handle, 0))
-               return (dapl_convert_errno(errno, "notify_cq"));
-       else
-               return DAT_SUCCESS;
-}
-
-/*
- * dapls_ib_completion_notify
- *
- * Set the CQ notification type
- *
- * Input:
- *     hca_handl               hca handle
- *     evd_ptr                 evd handle
- *     type                    notification type
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     dapl_convert_errno
- */
-DAT_RETURN dapls_ib_completion_notify(IN ib_hca_handle_t hca_handle,
-                                     IN DAPL_EVD * evd_ptr,
-                                     IN ib_notification_type_t type)
-{
-       if (ibv_req_notify_cq(evd_ptr->ib_cq_handle, type))
-               return (dapl_convert_errno(errno, "notify_cq_type"));
-       else
-               return DAT_SUCCESS;
-}
-
-/*
- * dapls_ib_completion_poll
- *
- * CQ poll for completions
- *
- * Input:
- *     hca_handl               hca handle
- *     evd_ptr                 evd handle
- *     wc_ptr                  work completion
- *
- * Output:
- *     none
- *
- * Returns: 
- *     DAT_SUCCESS
- *     DAT_QUEUE_EMPTY
- *     
- */
-DAT_RETURN dapls_ib_completion_poll(IN DAPL_HCA * hca_ptr,
-                                   IN DAPL_EVD * evd_ptr,
-                                   IN ib_work_completion_t * wc_ptr)
-{
-       int ret;
-
-       ret = ibv_poll_cq(evd_ptr->ib_cq_handle, 1, wc_ptr);
-       if (ret == 1)
-               return DAT_SUCCESS;
-
-       return DAT_QUEUE_EMPTY;
-}
-
-#ifdef CQ_WAIT_OBJECT
-
-/* NEW common wait objects for providers with direct CQ wait objects */
-DAT_RETURN
-dapls_ib_wait_object_create(IN DAPL_EVD * evd_ptr,
-                           IN ib_wait_obj_handle_t * p_cq_wait_obj_handle)
-{
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " cq_object_create: (%p,%p)\n",
-                    evd_ptr, p_cq_wait_obj_handle);
-
-       /* set cq_wait object to evd_ptr */
-       *p_cq_wait_obj_handle =
-           ibv_create_comp_channel(evd_ptr->header.owner_ia->hca_ptr->
-                                   ib_hca_handle);
-
-       return DAT_SUCCESS;
-}
-
-DAT_RETURN
-dapls_ib_wait_object_destroy(IN ib_wait_obj_handle_t p_cq_wait_obj_handle)
-{
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " cq_object_destroy: wait_obj=%p\n", p_cq_wait_obj_handle);
-
-       ibv_destroy_comp_channel(p_cq_wait_obj_handle);
-
-       return DAT_SUCCESS;
-}
-
-DAT_RETURN
-dapls_ib_wait_object_wakeup(IN ib_wait_obj_handle_t p_cq_wait_obj_handle)
-{
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " cq_object_wakeup: wait_obj=%p\n", p_cq_wait_obj_handle);
-
-       /* no wake up mechanism */
-       return DAT_SUCCESS;
-}
-
-#if defined(_WIN32) || defined(_WIN64)
-DAT_RETURN
-dapls_ib_wait_object_wait(IN ib_wait_obj_handle_t p_cq_wait_obj_handle,
-                         IN uint32_t timeout)
-{
-       struct dapl_evd *evd_ptr;
-       struct ibv_cq *ibv_cq = NULL;
-       int status = 0;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " cq_object_wait: CQ channel %p time %d\n",
-                    p_cq_wait_obj_handle, timeout);
-
-       /* uDAPL timeout values in usecs */
-       p_cq_wait_obj_handle->comp_channel.Milliseconds = timeout / 1000;
-
-       /* returned event */
-       status = ibv_get_cq_event(p_cq_wait_obj_handle, &ibv_cq,
-                                 (void *)&evd_ptr);
-       if (status == 0) {
-               ibv_ack_cq_events(ibv_cq, 1);
-       }
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " cq_object_wait: RET evd %p ibv_cq %p %s\n",
-                    evd_ptr, ibv_cq, strerror(errno));
-
-       return (dapl_convert_errno(status, "cq_wait_object_wait"));
-}
-#else                          //_WIN32 || _WIN64
-DAT_RETURN
-dapls_ib_wait_object_wait(IN ib_wait_obj_handle_t p_cq_wait_obj_handle,
-                         IN uint32_t timeout)
-{
-       struct dapl_evd *evd_ptr;
-       struct ibv_cq *ibv_cq = NULL;
-       int status = 0;
-       int timeout_ms = -1;
-       struct pollfd cq_fd = {
-               .fd = p_cq_wait_obj_handle->fd,
-               .events = POLLIN,
-               .revents = 0
-       };
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " cq_object_wait: CQ channel %p time %d\n",
-                    p_cq_wait_obj_handle, timeout);
-
-       /* uDAPL timeout values in usecs */
-       if (timeout != DAT_TIMEOUT_INFINITE)
-               timeout_ms = timeout / 1000;
-
-       status = poll(&cq_fd, 1, timeout_ms);
-
-       /* returned event */
-       if (status > 0) {
-               if (!ibv_get_cq_event(p_cq_wait_obj_handle,
-                                     &ibv_cq, (void *)&evd_ptr)) {
-                       ibv_ack_cq_events(ibv_cq, 1);
-               }
-               status = 0;
-
-               /* timeout */
-       } else if (status == 0)
-               status = ETIMEDOUT;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " cq_object_wait: RET evd %p ibv_cq %p %s\n",
-                    evd_ptr, ibv_cq, strerror(errno));
-
-       return (dapl_convert_errno(status, "cq_wait_object_wait"));
-
-}
-#endif                         //_WIN32 || _WIN64
-#endif                         // CQ_WAIT_OBJECT
-
-/*
- * Local variables:
- *  c-indent-level: 4
- *  c-basic-offset: 4
- *  tab-width: 8
- * End:
- */
diff --git a/branches/winverbs/ulp/dapl2/dapl/openib_scm/dapl_ib_dto.h b/branches/winverbs/ulp/dapl2/dapl/openib_scm/dapl_ib_dto.h
deleted file mode 100644 (file)
index 9118b2e..0000000
+++ /dev/null
@@ -1,527 +0,0 @@
-/*
- * This Software is licensed under one of the following licenses:
- *
- * 1) under the terms of the "Common Public License 1.0" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/cpl.php.
- *
- * 2) under the terms of the "The BSD License" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/bsd-license.php.
- *
- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
- *    copy of which is available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/gpl-license.php.
- *
- * Licensee has the right to choose one of the above licenses.
- *
- * Redistributions of source code must retain the above copyright
- * notice and one of the license notices.
- *
- * Redistributions in binary form must reproduce both the above copyright
- * notice, one of the license notices in the documentation
- * and/or other materials provided with the distribution.
- */
-
-/***************************************************************************
- *
- *   Module:            uDAPL
- *
- *   Filename:          dapl_ib_dto.h
- *
- *   Author:            Arlin Davis
- *
- *   Created:           3/10/2005
- *
- *   Description: 
- *
- *   The OpenIB uCMA provider - DTO operations and CQE macros 
- *
- ****************************************************************************
- *                Source Control System Information
- *
- *    $Id: $
- *
- *     Copyright (c) 2005 Intel Corporation.  All rights reserved.
- *
- **************************************************************************/
-#ifndef _DAPL_IB_DTO_H_
-#define _DAPL_IB_DTO_H_
-
-#include "dapl_ib_util.h"
-
-#ifdef DAT_EXTENSIONS
-#include <dat2/dat_ib_extensions.h>
-#endif
-
-#define        DEFAULT_DS_ENTRIES      8
-
-STATIC _INLINE_ int dapls_cqe_opcode(ib_work_completion_t *cqe_p);
-
-#define CQE_WR_TYPE_UD(id) \
-       (((DAPL_COOKIE *)(uintptr_t)id)->ep->qp_handle->qp_type == IBV_QPT_UD)
-
-/*
- * dapls_ib_post_recv
- *
- * Provider specific Post RECV function
- */
-STATIC _INLINE_ DAT_RETURN 
-dapls_ib_post_recv (
-       IN  DAPL_EP             *ep_ptr,
-       IN  DAPL_COOKIE         *cookie,
-       IN  DAT_COUNT           segments,
-       IN  DAT_LMR_TRIPLET     *local_iov )
-{
-       struct ibv_recv_wr wr;
-       struct ibv_recv_wr *bad_wr;
-       ib_data_segment_t *ds = (ib_data_segment_t *)local_iov;
-       DAT_COUNT i, total_len;
-       int ret;
-       
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    " post_rcv: ep %p cookie %p segs %d l_iov %p\n",
-                    ep_ptr, cookie, segments, local_iov);
-
-       /* setup work request */
-       total_len = 0;
-       wr.next = 0;
-       wr.num_sge = segments;
-       wr.wr_id = (uint64_t)(uintptr_t)cookie;
-       wr.sg_list = ds;
-
-       if (cookie != NULL) {
-               for (i = 0; i < segments; i++) {
-                       dapl_dbg_log(DAPL_DBG_TYPE_EP, 
-                                    " post_rcv: l_key 0x%x va %p len %d\n",
-                                    ds->lkey, ds->addr, ds->length );
-                       total_len += ds->length;
-                       ds++;
-               }
-               cookie->val.dto.size = total_len;
-       }
-
-       ret = ibv_post_recv(ep_ptr->qp_handle, &wr, &bad_wr);
-       
-       if (ret)
-               return(dapl_convert_errno(errno,"ibv_recv"));
-
-       DAPL_CNTR(ep_ptr, DCNT_EP_POST_RECV);
-       DAPL_CNTR_DATA(ep_ptr, DCNT_EP_POST_RECV_DATA, total_len);
-
-       return DAT_SUCCESS;
-}
-
-/*
- * dapls_ib_post_send
- *
- * Provider specific Post SEND function
- */
-STATIC _INLINE_ DAT_RETURN 
-dapls_ib_post_send (
-       IN  DAPL_EP                     *ep_ptr,
-       IN  ib_send_op_type_t           op_type,
-       IN  DAPL_COOKIE                 *cookie,
-       IN  DAT_COUNT                   segments,
-       IN  DAT_LMR_TRIPLET             *local_iov,
-       IN  const DAT_RMR_TRIPLET       *remote_iov,
-       IN  DAT_COMPLETION_FLAGS        completion_flags)
-{
-       struct ibv_send_wr wr;
-       struct ibv_send_wr *bad_wr;
-       ib_data_segment_t *ds = (ib_data_segment_t *)local_iov;
-       ib_hca_transport_t *ibt_ptr = 
-               &ep_ptr->header.owner_ia->hca_ptr->ib_trans;
-       DAT_COUNT i, total_len;
-       int ret;
-       
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    " post_snd: ep %p op %d ck %p sgs",
-                    "%d l_iov %p r_iov %p f %d\n",
-                    ep_ptr, op_type, cookie, segments, local_iov, 
-                    remote_iov, completion_flags);
-
-#ifdef DAT_EXTENSIONS  
-       if (ep_ptr->qp_handle->qp_type != IBV_QPT_RC)
-               return(DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP));
-#endif
-       /* setup the work request */
-       wr.next = 0;
-       wr.opcode = op_type;
-       wr.num_sge = segments;
-       wr.send_flags = 0;
-       wr.wr_id = (uint64_t)(uintptr_t)cookie;
-       wr.sg_list = ds;
-       total_len = 0;
-
-       if (cookie != NULL) {
-               for (i = 0; i < segments; i++ ) {
-                       dapl_dbg_log(DAPL_DBG_TYPE_EP, 
-                                    " post_snd: lkey 0x%x va %p len %d\n",
-                                    ds->lkey, ds->addr, ds->length );
-                       total_len += ds->length;
-                       ds++;
-               }
-               cookie->val.dto.size = total_len;
-       }
-
-       if (wr.num_sge && 
-           (op_type == OP_RDMA_WRITE || op_type == OP_RDMA_READ)) {
-               wr.wr.rdma.remote_addr = remote_iov->virtual_address;
-               wr.wr.rdma.rkey = remote_iov->rmr_context;
-               dapl_dbg_log(DAPL_DBG_TYPE_EP, 
-                            " post_snd_rdma: rkey 0x%x va %#016Lx\n",
-                            wr.wr.rdma.rkey, wr.wr.rdma.remote_addr);
-       }
-
-
-       /* inline data for send or write ops */
-       if ((total_len <= ibt_ptr->max_inline_send) && 
-          ((op_type == OP_SEND) || (op_type == OP_RDMA_WRITE))) 
-               wr.send_flags |= IBV_SEND_INLINE;
-       
-       /* set completion flags in work request */
-       wr.send_flags |= (DAT_COMPLETION_SUPPRESS_FLAG & 
-                               completion_flags) ? 0 : IBV_SEND_SIGNALED;
-       wr.send_flags |= (DAT_COMPLETION_BARRIER_FENCE_FLAG & 
-                               completion_flags) ? IBV_SEND_FENCE : 0;
-       wr.send_flags |= (DAT_COMPLETION_SOLICITED_WAIT_FLAG & 
-                               completion_flags) ? IBV_SEND_SOLICITED : 0;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP, 
-                    " post_snd: op 0x%x flags 0x%x sglist %p, %d\n", 
-                    wr.opcode, wr.send_flags, wr.sg_list, wr.num_sge);
-
-       ret = ibv_post_send(ep_ptr->qp_handle, &wr, &bad_wr);
-
-       if (ret)
-               return(dapl_convert_errno(errno,"ibv_send"));
-
-#ifdef DAPL_COUNTERS
-       switch (op_type) {
-       case OP_SEND:
-               DAPL_CNTR(ep_ptr, DCNT_EP_POST_SEND);
-               DAPL_CNTR_DATA(ep_ptr, DCNT_EP_POST_SEND_DATA,total_len);
-               break;
-       case OP_RDMA_WRITE:
-               DAPL_CNTR(ep_ptr, DCNT_EP_POST_WRITE);
-               DAPL_CNTR_DATA(ep_ptr, DCNT_EP_POST_WRITE_DATA,total_len);
-               break;  
-       case OP_RDMA_READ:
-               DAPL_CNTR(ep_ptr, DCNT_EP_POST_READ);
-               DAPL_CNTR_DATA(ep_ptr, DCNT_EP_POST_READ_DATA,total_len);
-               break;
-       default:
-               break;
-       }
-#endif /* DAPL_COUNTERS */
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP," post_snd: returned\n");
-       return DAT_SUCCESS;
-}
-
-/* map Work Completions to DAPL WR operations */
-STATIC _INLINE_ DAT_DTOS dapls_cqe_dtos_opcode(ib_work_completion_t *cqe_p)
-{
-       switch (cqe_p->opcode) {
-
-       case IBV_WC_SEND:
-#ifdef DAT_EXTENSIONS
-               if (CQE_WR_TYPE_UD(cqe_p->wr_id))
-                       return (DAT_IB_DTO_SEND_UD);
-               else
-#endif                 
-               return (DAT_DTO_SEND);
-       case IBV_WC_RDMA_READ:
-               return (DAT_DTO_RDMA_READ);
-       case IBV_WC_BIND_MW:
-               return (DAT_DTO_BIND_MW);
-#ifdef DAT_EXTENSIONS
-       case IBV_WC_RDMA_WRITE:
-               if (cqe_p->wc_flags & IBV_WC_WITH_IMM)
-                       return (DAT_IB_DTO_RDMA_WRITE_IMMED);
-               else
-                       return (DAT_DTO_RDMA_WRITE);
-       case IBV_WC_COMP_SWAP:
-               return (DAT_IB_DTO_CMP_SWAP);
-       case IBV_WC_FETCH_ADD:
-               return (DAT_IB_DTO_FETCH_ADD);
-       case IBV_WC_RECV_RDMA_WITH_IMM:
-               return (DAT_IB_DTO_RECV_IMMED);
-#else
-       case IBV_WC_RDMA_WRITE:
-               return (DAT_DTO_RDMA_WRITE);
-#endif
-       case IBV_WC_RECV:
-#ifdef DAT_EXTENSIONS
-               if (CQE_WR_TYPE_UD(cqe_p->wr_id)) 
-                       return (DAT_IB_DTO_RECV_UD);
-               else if (cqe_p->wc_flags & IBV_WC_WITH_IMM)
-                       return (DAT_IB_DTO_RECV_MSG_IMMED);
-               else
-#endif 
-               return (DAT_DTO_RECEIVE);
-       default:
-               return (0xff);
-       }
-}
-#define DAPL_GET_CQE_DTOS_OPTYPE(cqe_p) dapls_cqe_dtos_opcode(cqe_p)
-
-
-#ifdef DAT_EXTENSIONS
-/*
- * dapls_ib_post_ext_send
- *
- * Provider specific extended Post SEND function for atomics
- *     OP_COMP_AND_SWAP and OP_FETCH_AND_ADD
- */
-STATIC _INLINE_ DAT_RETURN 
-dapls_ib_post_ext_send (
-       IN  DAPL_EP                     *ep_ptr,
-       IN  ib_send_op_type_t           op_type,
-       IN  DAPL_COOKIE                 *cookie,
-       IN  DAT_COUNT                   segments,
-       IN  DAT_LMR_TRIPLET             *local_iov,
-       IN  const DAT_RMR_TRIPLET       *remote_iov,
-       IN  DAT_UINT32                  immed_data,
-       IN  DAT_UINT64                  compare_add,
-       IN  DAT_UINT64                  swap,
-       IN  DAT_COMPLETION_FLAGS        completion_flags,
-       IN  DAT_IB_ADDR_HANDLE          *remote_ah)
-{
-       struct ibv_send_wr wr;
-       struct ibv_send_wr *bad_wr;
-       ib_data_segment_t *ds = (ib_data_segment_t *)local_iov;
-       DAT_COUNT i, total_len;
-       int ret;
-       
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    " post_ext_snd: ep %p op %d ck %p sgs",
-                    "%d l_iov %p r_iov %p f %d\n",
-                    ep_ptr, op_type, cookie, segments, local_iov, 
-                    remote_iov, completion_flags, remote_ah);
-
-       /* setup the work request */
-       wr.next = 0;
-       wr.opcode = op_type;
-       wr.num_sge = segments;
-       wr.send_flags = 0;
-       wr.wr_id = (uint64_t)(uintptr_t)cookie;
-       wr.sg_list = ds;
-       total_len = 0;
-
-       if (cookie != NULL) {
-               for (i = 0; i < segments; i++ ) {
-                       dapl_dbg_log(DAPL_DBG_TYPE_EP, 
-                                    " post_snd: lkey 0x%x va %p len %d\n",
-                                    ds->lkey, ds->addr, ds->length );
-                       total_len += ds->length;
-                       ds++;
-               }
-               cookie->val.dto.size = total_len;
-       }
-
-       switch (op_type) {
-       case OP_RDMA_WRITE_IMM:
-               /* OP_RDMA_WRITE)IMMED has direct IB wr_type mapping */
-               dapl_dbg_log(DAPL_DBG_TYPE_EP, 
-                            " post_ext: rkey 0x%x va %#016Lx immed=0x%x\n",
-                            remote_iov?remote_iov->rmr_context:0, 
-                            remote_iov?remote_iov->virtual_address:0,
-                            immed_data);
-
-               wr.imm_data = immed_data;
-               if (wr.num_sge) {
-                       wr.wr.rdma.remote_addr = remote_iov->virtual_address;
-                       wr.wr.rdma.rkey = remote_iov->rmr_context;
-               }
-               break;
-       case OP_COMP_AND_SWAP:
-               /* OP_COMP_AND_SWAP has direct IB wr_type mapping */
-               dapl_dbg_log(DAPL_DBG_TYPE_EP, 
-                            " post_ext: OP_COMP_AND_SWAP=%lx,"
-                            "%lx rkey 0x%x va %#016Lx\n",
-                            compare_add, swap, remote_iov->rmr_context,
-                            remote_iov->virtual_address);
-               
-               wr.wr.atomic.compare_add = compare_add;
-               wr.wr.atomic.swap = swap;
-               wr.wr.atomic.remote_addr = remote_iov->virtual_address;
-               wr.wr.atomic.rkey = remote_iov->rmr_context;
-               break;
-       case OP_FETCH_AND_ADD:
-               /* OP_FETCH_AND_ADD has direct IB wr_type mapping */
-               dapl_dbg_log(DAPL_DBG_TYPE_EP, 
-                            " post_ext: OP_FETCH_AND_ADD=%lx,"
-                            "%lx rkey 0x%x va %#016Lx\n",
-                            compare_add, remote_iov->rmr_context,
-                            remote_iov->virtual_address);
-
-               wr.wr.atomic.compare_add = compare_add;
-               wr.wr.atomic.remote_addr = remote_iov->virtual_address;
-               wr.wr.atomic.rkey = remote_iov->rmr_context;
-               break;
-       case OP_SEND_UD:
-               /* post must be on EP with service_type of UD */
-               if (ep_ptr->qp_handle->qp_type != IBV_QPT_UD)
-                       return(DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP));
-
-               dapl_dbg_log(DAPL_DBG_TYPE_EP, 
-                            " post_ext: OP_SEND_UD ah=%p"
-                            " qp_num=0x%x\n",
-                            remote_ah, remote_ah->qpn);
-               
-               wr.opcode = OP_SEND;
-               wr.wr.ud.ah = remote_ah->ah;
-               wr.wr.ud.remote_qpn = remote_ah->qpn;
-               wr.wr.ud.remote_qkey = SCM_UD_QKEY;
-               break;
-       default:
-               break;
-       }
-
-       /* set completion flags in work request */
-       wr.send_flags |= (DAT_COMPLETION_SUPPRESS_FLAG & 
-                               completion_flags) ? 0 : IBV_SEND_SIGNALED;
-       wr.send_flags |= (DAT_COMPLETION_BARRIER_FENCE_FLAG & 
-                               completion_flags) ? IBV_SEND_FENCE : 0;
-       wr.send_flags |= (DAT_COMPLETION_SOLICITED_WAIT_FLAG & 
-                               completion_flags) ? IBV_SEND_SOLICITED : 0;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP, 
-                    " post_snd: op 0x%x flags 0x%x sglist %p, %d\n", 
-                    wr.opcode, wr.send_flags, wr.sg_list, wr.num_sge);
-
-       ret = ibv_post_send(ep_ptr->qp_handle, &wr, &bad_wr);
-
-       if (ret)
-               return( dapl_convert_errno(errno,"ibv_send") );
-       
-#ifdef DAPL_COUNTERS
-       switch (op_type) {
-       case OP_RDMA_WRITE_IMM:
-               DAPL_CNTR(ep_ptr, DCNT_EP_POST_WRITE_IMM);
-               DAPL_CNTR_DATA(ep_ptr, 
-                              DCNT_EP_POST_WRITE_IMM_DATA, total_len);
-               break;
-       case OP_COMP_AND_SWAP:
-               DAPL_CNTR(ep_ptr, DCNT_EP_POST_CMP_SWAP);
-               break;  
-       case OP_FETCH_AND_ADD:
-               DAPL_CNTR(ep_ptr, DCNT_EP_POST_FETCH_ADD);
-               break;
-       case OP_SEND_UD:
-               DAPL_CNTR(ep_ptr, DCNT_EP_POST_SEND_UD);
-               DAPL_CNTR_DATA(ep_ptr, DCNT_EP_POST_SEND_UD_DATA, total_len);
-               break;
-       default:
-               break;
-       }
-#endif /* DAPL_COUNTERS */
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP," post_snd: returned\n");
-        return DAT_SUCCESS;
-}
-#endif
-
-STATIC _INLINE_ DAT_RETURN 
-dapls_ib_optional_prv_dat(
-       IN  DAPL_CR             *cr_ptr,
-       IN  const void          *event_data,
-       OUT   DAPL_CR           **cr_pp)
-{
-    return DAT_SUCCESS;
-}
-
-
-/* map Work Completions to DAPL WR operations */
-STATIC _INLINE_ int dapls_cqe_opcode(ib_work_completion_t *cqe_p)
-{
-#ifdef DAPL_COUNTERS
-       DAPL_COOKIE *cookie = (DAPL_COOKIE *)(uintptr_t)cqe_p->wr_id;
-#endif /* DAPL_COUNTERS */
-
-       switch (cqe_p->opcode) {
-       case IBV_WC_SEND:
-               if (CQE_WR_TYPE_UD(cqe_p->wr_id))
-                       return(OP_SEND_UD);
-               else
-                       return (OP_SEND);
-       case IBV_WC_RDMA_WRITE:
-               if (cqe_p->wc_flags & IBV_WC_WITH_IMM)
-                       return (OP_RDMA_WRITE_IMM);
-               else
-                       return (OP_RDMA_WRITE);
-       case IBV_WC_RDMA_READ:
-               return (OP_RDMA_READ);
-       case IBV_WC_COMP_SWAP:
-               return (OP_COMP_AND_SWAP);
-       case IBV_WC_FETCH_ADD:
-               return (OP_FETCH_AND_ADD);
-       case IBV_WC_BIND_MW:
-               return (OP_BIND_MW);
-       case IBV_WC_RECV:
-               if (CQE_WR_TYPE_UD(cqe_p->wr_id)) {
-                       DAPL_CNTR(cookie->ep, DCNT_EP_RECV_UD);
-                       DAPL_CNTR_DATA(cookie->ep, DCNT_EP_RECV_UD_DATA, 
-                                      cqe_p->byte_len);
-                       return (OP_RECV_UD);
-               }
-               else if (cqe_p->wc_flags & IBV_WC_WITH_IMM) {
-                       DAPL_CNTR(cookie->ep, DCNT_EP_RECV_IMM);
-                       DAPL_CNTR_DATA(cookie->ep, DCNT_EP_RECV_IMM_DATA, 
-                                      cqe_p->byte_len);
-                       return (OP_RECEIVE_IMM);
-               } else {
-                       DAPL_CNTR(cookie->ep, DCNT_EP_RECV);
-                       DAPL_CNTR_DATA(cookie->ep, DCNT_EP_RECV_DATA, 
-                                      cqe_p->byte_len);
-                       return (OP_RECEIVE);
-               }
-       case IBV_WC_RECV_RDMA_WITH_IMM:
-               DAPL_CNTR(cookie->ep, DCNT_EP_RECV_RDMA_IMM);
-               DAPL_CNTR_DATA(cookie->ep, DCNT_EP_RECV_RDMA_IMM_DATA, 
-                              cqe_p->byte_len);
-               return (OP_RECEIVE_IMM);
-       default:
-               return (OP_INVALID);
-       }
-}
-
-#define DAPL_GET_CQE_OPTYPE(cqe_p) dapls_cqe_opcode(cqe_p)
-#define DAPL_GET_CQE_WRID(cqe_p) ((ib_work_completion_t*)cqe_p)->wr_id
-#define DAPL_GET_CQE_STATUS(cqe_p) ((ib_work_completion_t*)cqe_p)->status
-#define DAPL_GET_CQE_VENDOR_ERR(cqe_p) ((ib_work_completion_t*)cqe_p)->vendor_err
-#define DAPL_GET_CQE_BYTESNUM(cqe_p) ((ib_work_completion_t*)cqe_p)->byte_len
-#define DAPL_GET_CQE_IMMED_DATA(cqe_p) ((ib_work_completion_t*)cqe_p)->imm_data
-
-STATIC _INLINE_ char * dapls_dto_op_str(int op)
-{
-    static char *optable[] =
-    {
-        "OP_RDMA_WRITE",
-        "OP_RDMA_WRITE_IMM",
-        "OP_SEND",
-        "OP_SEND_IMM",
-        "OP_RDMA_READ",
-        "OP_COMP_AND_SWAP",
-        "OP_FETCH_AND_ADD",
-        "OP_RECEIVE",
-        "OP_RECEIVE_MSG_IMM",
-       "OP_RECEIVE_RDMA_IMM",
-        "OP_BIND_MW"
-       "OP_SEND_UD"
-       "OP_RECV_UD"
-    };
-    return ((op < 0 || op > 12) ? "Invalid CQE OP?" : optable[op]);
-}
-
-static _INLINE_ char *
-dapls_cqe_op_str(IN ib_work_completion_t *cqe_ptr)
-{
-    return dapls_dto_op_str(DAPL_GET_CQE_OPTYPE(cqe_ptr));
-}
-
-#define DAPL_GET_CQE_OP_STR(cqe) dapls_cqe_op_str(cqe)
-
-#endif /*  _DAPL_IB_DTO_H_ */
diff --git a/branches/winverbs/ulp/dapl2/dapl/openib_scm/dapl_ib_extensions.c b/branches/winverbs/ulp/dapl2/dapl/openib_scm/dapl_ib_extensions.c
deleted file mode 100644 (file)
index 98a07ec..0000000
+++ /dev/null
@@ -1,371 +0,0 @@
-/*
- * Copyright (c) 2007 Intel Corporation.  All rights reserved.
- *
- * This Software is licensed under one of the following licenses:
- *
- * 1) under the terms of the "Common Public License 1.0" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/cpl.php.
- *
- * 2) under the terms of the "The BSD License" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/bsd-license.php.
- *
- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
- *    copy of which is available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/gpl-license.php.
- *
- * Licensee has the right to choose one of the above licenses.
- *
- * Redistributions of source code must retain the above copyright
- * notice and one of the license notices.
- *
- * Redistributions in binary form must reproduce both the above copyright
- * notice, one of the license notices in the documentation
- * and/or other materials provided with the distribution.
- */
-
-/**********************************************************************
- * 
- * MODULE: dapl_ib_extensions.c
- *
- * PURPOSE:  Extensions routines for OpenIB uCMA provider
- *
- * $Id: $
- *
- **********************************************************************/
-
-#include "dapl.h"
-#include "dapl_adapter_util.h"
-#include "dapl_evd_util.h"
-#include "dapl_ib_util.h"
-#include "dapl_ep_util.h"
-#include "dapl_cookie.h"
-#include <stdarg.h>
-
-DAT_RETURN
-dapli_post_ext(IN DAT_EP_HANDLE ep_handle,
-              IN DAT_UINT64 cmp_add,
-              IN DAT_UINT64 swap,
-              IN DAT_UINT32 immed_data,
-              IN DAT_COUNT segments,
-              IN DAT_LMR_TRIPLET * local_iov,
-              IN DAT_DTO_COOKIE user_cookie,
-              IN const DAT_RMR_TRIPLET * remote_iov,
-              IN int op_type,
-              IN DAT_COMPLETION_FLAGS flags, IN DAT_IB_ADDR_HANDLE * ah);
-
-/*
- * dapl_extensions
- *
- * Process extension requests
- *
- * Input:
- *     ext_type,
- *     ...
- *
- * Output:
- *     Depends....
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_NOT_IMPLEMENTED
- *      .....
- *
- */
-DAT_RETURN
-dapl_extensions(IN DAT_HANDLE dat_handle,
-               IN DAT_EXTENDED_OP ext_op, IN va_list args)
-{
-       DAT_EP_HANDLE ep;
-       DAT_IB_ADDR_HANDLE *ah = NULL;
-       DAT_LMR_TRIPLET *lmr_p;
-       DAT_DTO_COOKIE cookie;
-       const DAT_RMR_TRIPLET *rmr_p;
-       DAT_UINT64 dat_uint64a, dat_uint64b;
-       DAT_UINT32 dat_uint32;
-       DAT_COUNT segments = 1;
-       DAT_COMPLETION_FLAGS comp_flags;
-       DAT_RETURN status = DAT_NOT_IMPLEMENTED;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_API,
-                    "dapl_extensions(hdl %p operation %d, ...)\n",
-                    dat_handle, ext_op);
-
-       switch ((int)ext_op) {
-
-       case DAT_IB_RDMA_WRITE_IMMED_OP:
-               dapl_dbg_log(DAPL_DBG_TYPE_RTN,
-                            " WRITE_IMMED_DATA extension call\n");
-
-               ep = dat_handle;        /* ep_handle */
-               segments = va_arg(args, DAT_COUNT);     /* num segments */
-               lmr_p = va_arg(args, DAT_LMR_TRIPLET *);
-               cookie = va_arg(args, DAT_DTO_COOKIE);
-               rmr_p = va_arg(args, const DAT_RMR_TRIPLET *);
-               dat_uint32 = va_arg(args, DAT_UINT32);  /* immed data */
-               comp_flags = va_arg(args, DAT_COMPLETION_FLAGS);
-
-               status = dapli_post_ext(ep, 0, 0, dat_uint32, segments, lmr_p,
-                                       cookie, rmr_p, OP_RDMA_WRITE_IMM,
-                                       comp_flags, ah);
-               break;
-
-       case DAT_IB_CMP_AND_SWAP_OP:
-               dapl_dbg_log(DAPL_DBG_TYPE_RTN,
-                            " CMP_AND_SWAP extension call\n");
-
-               ep = dat_handle;        /* ep_handle */
-               dat_uint64a = va_arg(args, DAT_UINT64); /* cmp_value */
-               dat_uint64b = va_arg(args, DAT_UINT64); /* swap_value */
-               lmr_p = va_arg(args, DAT_LMR_TRIPLET *);
-               cookie = va_arg(args, DAT_DTO_COOKIE);
-               rmr_p = va_arg(args, const DAT_RMR_TRIPLET *);
-               comp_flags = va_arg(args, DAT_COMPLETION_FLAGS);
-
-               status = dapli_post_ext(ep, dat_uint64a, dat_uint64b,
-                                       0, segments, lmr_p, cookie, rmr_p,
-                                       OP_COMP_AND_SWAP, comp_flags, ah);
-               break;
-
-       case DAT_IB_FETCH_AND_ADD_OP:
-               dapl_dbg_log(DAPL_DBG_TYPE_RTN,
-                            " FETCH_AND_ADD extension call\n");
-
-               ep = dat_handle;        /* ep_handle */
-               dat_uint64a = va_arg(args, DAT_UINT64); /* add value */
-               lmr_p = va_arg(args, DAT_LMR_TRIPLET *);
-               cookie = va_arg(args, DAT_DTO_COOKIE);
-               rmr_p = va_arg(args, const DAT_RMR_TRIPLET *);
-               comp_flags = va_arg(args, DAT_COMPLETION_FLAGS);
-
-               status = dapli_post_ext(ep, dat_uint64a, 0, 0, segments,
-                                       lmr_p, cookie, rmr_p,
-                                       OP_FETCH_AND_ADD, comp_flags, ah);
-               break;
-
-       case DAT_IB_UD_SEND_OP:
-               dapl_dbg_log(DAPL_DBG_TYPE_RTN,
-                            " UD post_send extension call\n");
-
-               ep = dat_handle;        /* ep_handle */
-               segments = va_arg(args, DAT_COUNT);     /* segments */
-               lmr_p = va_arg(args, DAT_LMR_TRIPLET *);
-               ah = va_arg(args, DAT_IB_ADDR_HANDLE *);
-               cookie = va_arg(args, DAT_DTO_COOKIE);
-               comp_flags = va_arg(args, DAT_COMPLETION_FLAGS);
-
-               status = dapli_post_ext(ep, 0, 0, 0, segments,
-                                       lmr_p, cookie, NULL,
-                                       OP_SEND_UD, comp_flags, ah);
-               break;
-
-#ifdef DAPL_COUNTERS
-       case DAT_QUERY_COUNTERS_OP:
-               {
-                       int cntr, reset;
-                       DAT_UINT64 *p_cntr_out;
-
-                       dapl_dbg_log(DAPL_DBG_TYPE_RTN,
-                                    " Query counter extension call\n");
-
-                       cntr = va_arg(args, int);
-                       p_cntr_out = va_arg(args, DAT_UINT64 *);
-                       reset = va_arg(args, int);
-
-                       status = dapl_query_counter(dat_handle, cntr,
-                                                   p_cntr_out, reset);
-                       break;
-               }
-       case DAT_PRINT_COUNTERS_OP:
-               {
-                       int cntr, reset;
-
-                       dapl_dbg_log(DAPL_DBG_TYPE_RTN,
-                                    " Print counter extension call\n");
-
-                       cntr = va_arg(args, int);
-                       reset = va_arg(args, int);
-
-                       dapl_print_counter(dat_handle, cntr, reset);
-                       status = DAT_SUCCESS;
-                       break;
-               }
-#endif                         /* DAPL_COUNTERS */
-
-       default:
-               dapl_dbg_log(DAPL_DBG_TYPE_ERR,
-                            "unsupported extension(%d)\n", (int)ext_op);
-       }
-
-       return (status);
-}
-
-DAT_RETURN
-dapli_post_ext(IN DAT_EP_HANDLE ep_handle,
-              IN DAT_UINT64 cmp_add,
-              IN DAT_UINT64 swap,
-              IN DAT_UINT32 immed_data,
-              IN DAT_COUNT segments,
-              IN DAT_LMR_TRIPLET * local_iov,
-              IN DAT_DTO_COOKIE user_cookie,
-              IN const DAT_RMR_TRIPLET * remote_iov,
-              IN int op_type,
-              IN DAT_COMPLETION_FLAGS flags, IN DAT_IB_ADDR_HANDLE * ah)
-{
-       DAPL_EP *ep_ptr;
-       ib_qp_handle_t qp_ptr;
-       DAPL_COOKIE *cookie = NULL;
-       DAT_RETURN dat_status = DAT_SUCCESS;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_API,
-                    " post_ext_op: ep %p cmp_val %d "
-                    "swap_val %d cookie 0x%x, r_iov %p, flags 0x%x, ah %p\n",
-                    ep_handle, (unsigned)cmp_add, (unsigned)swap,
-                    (unsigned)user_cookie.as_64, remote_iov, flags, ah);
-
-       if (DAPL_BAD_HANDLE(ep_handle, DAPL_MAGIC_EP))
-               return (DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP));
-
-       ep_ptr = (DAPL_EP *) ep_handle;
-       qp_ptr = ep_ptr->qp_handle;
-
-       /*
-        * Synchronization ok since this buffer is only used for send
-        * requests, which aren't allowed to race with each other.
-        */
-       dat_status = dapls_dto_cookie_alloc(&ep_ptr->req_buffer,
-                                           DAPL_DTO_TYPE_EXTENSION,
-                                           user_cookie, &cookie);
-       if (dat_status != DAT_SUCCESS)
-               goto bail;
-
-       /*
-        * Take reference before posting to avoid race conditions with
-        * completions
-        */
-       dapl_os_atomic_inc(&ep_ptr->req_count);
-
-       /*
-        * Invoke provider specific routine to post DTO
-        */
-       dat_status = dapls_ib_post_ext_send(ep_ptr, op_type, cookie, segments,  /* data segments */
-                                           local_iov, remote_iov, immed_data,  /* immed data */
-                                           cmp_add,    /* compare or add */
-                                           swap,       /* swap */
-                                           flags, ah);
-
-       if (dat_status != DAT_SUCCESS) {
-               dapl_os_atomic_dec(&ep_ptr->req_count);
-               dapls_cookie_dealloc(&ep_ptr->req_buffer, cookie);
-       }
-
-      bail:
-       return dat_status;
-
-}
-
-/* 
- * New provider routine to process extended DTO events 
- */
-void
-dapls_cqe_to_event_extension(IN DAPL_EP * ep_ptr,
-                            IN DAPL_COOKIE * cookie,
-                            IN ib_work_completion_t * cqe_ptr,
-                            IN DAT_EVENT * event_ptr)
-{
-       uint32_t ibtype;
-       DAT_DTO_COMPLETION_EVENT_DATA *dto =
-           &event_ptr->event_data.dto_completion_event_data;
-       DAT_IB_EXTENSION_EVENT_DATA *ext_data = (DAT_IB_EXTENSION_EVENT_DATA *)
-           & event_ptr->event_extension_data[0];
-       DAT_DTO_COMPLETION_STATUS dto_status;
-
-       /* Get status from cqe */
-       dto_status = dapls_ib_get_dto_status(cqe_ptr);
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EVD,
-                    " cqe_to_event_ext: dto_ptr %p ext_ptr %p status %d\n",
-                    dto, ext_data, dto_status);
-
-       event_ptr->event_number = DAT_IB_DTO_EVENT;
-       dto->ep_handle = cookie->ep;
-       dto->user_cookie = cookie->val.dto.cookie;
-       dto->operation = DAPL_GET_CQE_DTOS_OPTYPE(cqe_ptr);     /* new for 2.0 */
-       dto->status = ext_data->status = dto_status;
-
-       if (dto_status != DAT_DTO_SUCCESS)
-               return;
-
-       /* 
-        * Get operation type from CQ work completion entry and
-        * if extented operation then set extended event data
-        */
-       ibtype = DAPL_GET_CQE_OPTYPE(cqe_ptr);
-
-       switch (ibtype) {
-
-       case OP_RDMA_WRITE_IMM:
-               dapl_dbg_log(DAPL_DBG_TYPE_EVD,
-                            " cqe_to_event_ext: OP_RDMA_WRITE_IMMED\n");
-
-               /* type and outbound rdma write transfer size */
-               dto->transfered_length = cookie->val.dto.size;
-               ext_data->type = DAT_IB_RDMA_WRITE_IMMED;
-               break;
-       case OP_RECEIVE_IMM:
-               dapl_dbg_log(DAPL_DBG_TYPE_EVD,
-                            " cqe_to_event_ext: OP_RECEIVE_RDMA_IMMED\n");
-
-               /* immed recvd, type and inbound rdma write transfer size */
-               dto->transfered_length = DAPL_GET_CQE_BYTESNUM(cqe_ptr);
-               ext_data->type = DAT_IB_RDMA_WRITE_IMMED_DATA;
-               ext_data->val.immed.data = DAPL_GET_CQE_IMMED_DATA(cqe_ptr);
-               break;
-       case OP_RECEIVE_MSG_IMM:
-               dapl_dbg_log(DAPL_DBG_TYPE_EVD,
-                            " cqe_to_event_ext: OP_RECEIVE_MSG_IMMED\n");
-
-               /* immed recvd, type and inbound recv message transfer size */
-               dto->transfered_length = DAPL_GET_CQE_BYTESNUM(cqe_ptr);
-               ext_data->type = DAT_IB_RECV_IMMED_DATA;
-               ext_data->val.immed.data = DAPL_GET_CQE_IMMED_DATA(cqe_ptr);
-               break;
-       case OP_COMP_AND_SWAP:
-               dapl_dbg_log(DAPL_DBG_TYPE_EVD,
-                            " cqe_to_event_ext: COMP_AND_SWAP_RESP\n");
-
-               /* original data is returned in LMR provided with post */
-               ext_data->type = DAT_IB_CMP_AND_SWAP;
-               dto->transfered_length = DAPL_GET_CQE_BYTESNUM(cqe_ptr);
-               break;
-       case OP_FETCH_AND_ADD:
-               dapl_dbg_log(DAPL_DBG_TYPE_EVD,
-                            " cqe_to_event_ext: FETCH_AND_ADD_RESP\n");
-
-               /* original data is returned in LMR provided with post */
-               ext_data->type = DAT_IB_FETCH_AND_ADD;
-               dto->transfered_length = DAPL_GET_CQE_BYTESNUM(cqe_ptr);
-               break;
-       case OP_SEND_UD:
-               dapl_dbg_log(DAPL_DBG_TYPE_EVD, " cqe_to_event_ext: UD_SEND\n");
-
-               /* type and outbound send transfer size */
-               ext_data->type = DAT_IB_UD_SEND;
-               dto->transfered_length = cookie->val.dto.size;
-               break;
-       case OP_RECV_UD:
-               dapl_dbg_log(DAPL_DBG_TYPE_EVD, " cqe_to_event_ext: UD_RECV\n");
-
-               /* type and inbound recv message transfer size */
-               ext_data->type = DAT_IB_UD_RECV;
-               dto->transfered_length = DAPL_GET_CQE_BYTESNUM(cqe_ptr);
-               break;
-
-       default:
-               /* not extended operation */
-               ext_data->status = DAT_IB_OP_ERR;
-               dto->status = DAT_DTO_ERR_TRANSPORT;
-               break;
-       }
-}
diff --git a/branches/winverbs/ulp/dapl2/dapl/openib_scm/dapl_ib_mem.c b/branches/winverbs/ulp/dapl2/dapl/openib_scm/dapl_ib_mem.c
deleted file mode 100644 (file)
index e45a2b3..0000000
+++ /dev/null
@@ -1,382 +0,0 @@
-       /*
-        * Copyright (c) 2005-2007 Intel Corporation.  All rights reserved.
-        *
-        * This Software is licensed under one of the following licenses:
-        *
-        * 1) under the terms of the "Common Public License 1.0" a copy of which is
-        *    available from the Open Source Initiative, see
-        *    http://www.opensource.org/licenses/cpl.php.
-        *
-        * 2) under the terms of the "The BSD License" a copy of which is
-        *    available from the Open Source Initiative, see
-        *    http://www.opensource.org/licenses/bsd-license.php.
-        *
-        * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
-        *    copy of which is available from the Open Source Initiative, see
-        *    http://www.opensource.org/licenses/gpl-license.php.
-        *
-        * Licensee has the right to choose one of the above licenses.
-        *
-        * Redistributions of source code must retain the above copyright
-        * notice and one of the license notices.
-        *
-        * Redistributions in binary form must reproduce both the above copyright
-        * notice, one of the license notices in the documentation
-        * and/or other materials provided with the distribution.
-        */
-
-/**********************************************************************
- * 
- * MODULE: dapl_ib_mem.c
- *
- * PURPOSE: Memory windows, registration, and protection domain 
- *
- * $Id:$
- *
- **********************************************************************/
-
-#include "dapl.h"
-#include "dapl_adapter_util.h"
-#include "dapl_lmr_util.h"
-
-/*
- * dapls_convert_privileges
- *
- * Convert LMR privileges to provider  
- *
- * Input:
- *     DAT_MEM_PRIV_FLAGS
- *
- * Output:
- *     none
- *
- * Returns:
- *     ibv_access_flags
- *
- */
-STATIC _INLINE_ int dapls_convert_privileges(IN DAT_MEM_PRIV_FLAGS privileges)
-{
-       int access = 0;
-
-       /*
-        * if (DAT_MEM_PRIV_LOCAL_READ_FLAG & privileges) do nothing
-        */
-       if (DAT_MEM_PRIV_LOCAL_WRITE_FLAG & privileges)
-               access |= IBV_ACCESS_LOCAL_WRITE;
-       if (DAT_MEM_PRIV_REMOTE_WRITE_FLAG & privileges)
-               access |= IBV_ACCESS_REMOTE_WRITE;
-       if (DAT_MEM_PRIV_REMOTE_READ_FLAG & privileges)
-               access |= IBV_ACCESS_REMOTE_READ;
-       if (DAT_MEM_PRIV_REMOTE_READ_FLAG & privileges)
-               access |= IBV_ACCESS_REMOTE_READ;
-       if (DAT_MEM_PRIV_REMOTE_READ_FLAG & privileges)
-               access |= IBV_ACCESS_REMOTE_READ;
-#ifdef DAT_EXTENSIONS
-       if (DAT_IB_MEM_PRIV_REMOTE_ATOMIC & privileges)
-               access |= IBV_ACCESS_REMOTE_ATOMIC;
-#endif
-
-       return access;
-}
-
-/*
- * dapl_ib_pd_alloc
- *
- * Alloc a PD
- *
- * Input:
- *     ia_handle       IA handle
- *     pz              pointer to PZ struct
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INSUFFICIENT_RESOURCES
- *
- */
-DAT_RETURN dapls_ib_pd_alloc(IN DAPL_IA * ia_ptr, IN DAPL_PZ * pz)
-{
-       /* get a protection domain */
-       pz->pd_handle = ibv_alloc_pd(ia_ptr->hca_ptr->ib_hca_handle);
-       if (!pz->pd_handle)
-               return (dapl_convert_errno(ENOMEM, "alloc_pd"));
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " pd_alloc: pd_handle=%p\n", pz->pd_handle);
-
-       return DAT_SUCCESS;
-}
-
-/*
- * dapl_ib_pd_free
- *
- * Free a PD
- *
- * Input:
- *     ia_handle       IA handle
- *     PZ_ptr          pointer to PZ struct
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *      DAT_INVALID_STATE
- *
- */
-DAT_RETURN dapls_ib_pd_free(IN DAPL_PZ * pz)
-{
-       if (pz->pd_handle != IB_INVALID_HANDLE) {
-               if (ibv_dealloc_pd(pz->pd_handle))
-                       return (dapl_convert_errno(errno, "ibv_dealloc_pd"));
-               pz->pd_handle = IB_INVALID_HANDLE;
-       }
-       return DAT_SUCCESS;
-}
-
-/*
- * dapl_ib_mr_register
- *
- * Register a virtual memory region
- *
- * Input:
- *     ia_handle       IA handle
- *     lmr             pointer to dapl_lmr struct
- *     virt_addr       virtual address of beginning of mem region
- *     length          length of memory region
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INSUFFICIENT_RESOURCES
- *
- */
-DAT_RETURN
-dapls_ib_mr_register(IN DAPL_IA * ia_ptr,
-                    IN DAPL_LMR * lmr,
-                    IN DAT_PVOID virt_addr,
-                    IN DAT_VLEN length,
-                    IN DAT_MEM_PRIV_FLAGS privileges, IN DAT_VA_TYPE va_type)
-{
-       ib_pd_handle_t ib_pd_handle;
-       struct ibv_device *ibv_dev = ia_ptr->hca_ptr->ib_hca_handle->device;
-
-       ib_pd_handle = ((DAPL_PZ *) lmr->param.pz_handle)->pd_handle;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " mr_register: ia=%p, lmr=%p va=%p ln=%d pv=0x%x\n",
-                    ia_ptr, lmr, virt_addr, length, privileges);
-
-       /* TODO: shared memory */
-       if (lmr->param.mem_type == DAT_MEM_TYPE_SHARED_VIRTUAL) {
-               dapl_dbg_log(DAPL_DBG_TYPE_ERR,
-                            " mr_register_shared: NOT IMPLEMENTED\n");
-               return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);
-       }
-
-       /* iWARP only support */
-       if ((va_type == DAT_VA_TYPE_ZB) &&
-           (ibv_dev->transport_type != IBV_TRANSPORT_IWARP)) {
-               dapl_dbg_log(DAPL_DBG_TYPE_ERR,
-                            " va_type == DAT_VA_TYPE_ZB: NOT SUPPORTED\n");
-               return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);
-       }
-
-       /* local read is default on IB */
-       lmr->mr_handle =
-           ibv_reg_mr(((DAPL_PZ *) lmr->param.pz_handle)->pd_handle,
-                      virt_addr, length, dapls_convert_privileges(privileges));
-
-       if (!lmr->mr_handle)
-               return (dapl_convert_errno(ENOMEM, "reg_mr"));
-
-       lmr->param.lmr_context = lmr->mr_handle->lkey;
-       lmr->param.rmr_context = lmr->mr_handle->rkey;
-       lmr->param.registered_size = length;
-       lmr->param.registered_address = (DAT_VADDR) (uintptr_t) virt_addr;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " mr_register: mr=%p addr=%p pd %p ctx %p "
-                    "lkey=0x%x rkey=0x%x priv=%x\n",
-                    lmr->mr_handle, lmr->mr_handle->addr,
-                    lmr->mr_handle->pd, lmr->mr_handle->context,
-                    lmr->mr_handle->lkey, lmr->mr_handle->rkey,
-                    length, dapls_convert_privileges(privileges));
-
-       return DAT_SUCCESS;
-}
-
-/*
- * dapl_ib_mr_deregister
- *
- * Free a memory region
- *
- * Input:
- *     lmr                     pointer to dapl_lmr struct
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INVALID_STATE
- *
- */
-DAT_RETURN dapls_ib_mr_deregister(IN DAPL_LMR * lmr)
-{
-       if (lmr->mr_handle != IB_INVALID_HANDLE) {
-               if (ibv_dereg_mr(lmr->mr_handle))
-                       return (dapl_convert_errno(errno, "dereg_pd"));
-               lmr->mr_handle = IB_INVALID_HANDLE;
-       }
-       return DAT_SUCCESS;
-}
-
-/*
- * dapl_ib_mr_register_shared
- *
- * Register a virtual memory region
- *
- * Input:
- *     ia_ptr          IA handle
- *     lmr             pointer to dapl_lmr struct
- *     privileges      
- *     va_type         
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INSUFFICIENT_RESOURCES
- *
- */
-DAT_RETURN
-dapls_ib_mr_register_shared(IN DAPL_IA * ia_ptr,
-                           IN DAPL_LMR * lmr,
-                           IN DAT_MEM_PRIV_FLAGS privileges,
-                           IN DAT_VA_TYPE va_type)
-{
-       dapl_dbg_log(DAPL_DBG_TYPE_ERR,
-                    " mr_register_shared: NOT IMPLEMENTED\n");
-
-       return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);
-}
-
-/*
- * dapls_ib_mw_alloc
- *
- * Bind a protection domain to a memory window
- *
- * Input:
- *     rmr     Initialized rmr to hold binding handles
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INSUFFICIENT_RESOURCES
- *
- */
-DAT_RETURN dapls_ib_mw_alloc(IN DAPL_RMR * rmr)
-{
-
-       dapl_dbg_log(DAPL_DBG_TYPE_ERR, " mw_alloc: NOT IMPLEMENTED\n");
-
-       return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);
-}
-
-/*
- * dapls_ib_mw_free
- *
- * Release bindings of a protection domain to a memory window
- *
- * Input:
- *     rmr     Initialized rmr to hold binding handles
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INVALID_STATE
- *
- */
-DAT_RETURN dapls_ib_mw_free(IN DAPL_RMR * rmr)
-{
-       dapl_dbg_log(DAPL_DBG_TYPE_ERR, " mw_free: NOT IMPLEMENTED\n");
-
-       return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);
-}
-
-/*
- * dapls_ib_mw_bind
- *
- * Bind a protection domain to a memory window
- *
- * Input:
- *     rmr     Initialized rmr to hold binding handles
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INVALID_PARAMETER;
- *     DAT_INSUFFICIENT_RESOURCES
- *
- */
-DAT_RETURN
-dapls_ib_mw_bind(IN DAPL_RMR * rmr,
-                IN DAPL_LMR * lmr,
-                IN DAPL_EP * ep,
-                IN DAPL_COOKIE * cookie,
-                IN DAT_VADDR virtual_address,
-                IN DAT_VLEN length,
-                IN DAT_MEM_PRIV_FLAGS mem_priv, IN DAT_BOOLEAN is_signaled)
-{
-       dapl_dbg_log(DAPL_DBG_TYPE_ERR, " mw_bind: NOT IMPLEMENTED\n");
-
-       return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);
-}
-
-/*
- * dapls_ib_mw_unbind
- *
- * Unbind a protection domain from a memory window
- *
- * Input:
- *     rmr     Initialized rmr to hold binding handles
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INVALID_PARAMETER;
- *     DAT_INVALID_STATE;
- *     DAT_INSUFFICIENT_RESOURCES
- *
- */
-DAT_RETURN
-dapls_ib_mw_unbind(IN DAPL_RMR * rmr,
-                  IN DAPL_EP * ep,
-                  IN DAPL_COOKIE * cookie, IN DAT_BOOLEAN is_signaled)
-{
-       dapl_dbg_log(DAPL_DBG_TYPE_ERR, " mw_unbind: NOT IMPLEMENTED\n");
-
-       return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);
-}
-
-/*
- * Local variables:
- *  c-indent-level: 4
- *  c-basic-offset: 4
- *  tab-width: 8
- * End:
- */
diff --git a/branches/winverbs/ulp/dapl2/dapl/openib_scm/dapl_ib_qp.c b/branches/winverbs/ulp/dapl2/dapl/openib_scm/dapl_ib_qp.c
deleted file mode 100644 (file)
index e14d4d9..0000000
+++ /dev/null
@@ -1,471 +0,0 @@
-/*
- * This Software is licensed under one of the following licenses:
- *
- * 1) under the terms of the "Common Public License 1.0" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/cpl.php.
- *
- * 2) under the terms of the "The BSD License" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/bsd-license.php.
- *
- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
- *    copy of which is available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/gpl-license.php.
- *
- * Licensee has the right to choose one of the above licenses.
- *
- * Redistributions of source code must retain the above copyright
- * notice and one of the license notices.
- *
- * Redistributions in binary form must reproduce both the above copyright
- * notice, one of the license notices in the documentation
- * and/or other materials provided with the distribution.
- */
-
-/**********************************************************************
- *
- * MODULE: dapl_ib_qp.c
- *
- * PURPOSE: QP routines for access to ofa rdma verbs 
- *
- * $Id: $
- **********************************************************************/
-
-#include "dapl.h"
-#include "dapl_adapter_util.h"
-
-/*
- * dapl_ib_qp_alloc
- *
- * Alloc a QP
- *
- * Input:
- *     *ep_ptr         pointer to EP INFO
- *     ib_hca_handle   provider HCA handle
- *     ib_pd_handle    provider protection domain handle
- *     cq_recv         provider recv CQ handle
- *     cq_send         provider send CQ handle
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INSUFFICIENT_RESOURCES
- *     DAT_INTERNAL_ERROR
- *
- */
-DAT_RETURN
-dapls_ib_qp_alloc(IN DAPL_IA * ia_ptr,
-                 IN DAPL_EP * ep_ptr, IN DAPL_EP * ep_ctx_ptr)
-{
-       DAT_EP_ATTR *attr;
-       DAPL_EVD *rcv_evd, *req_evd;
-       ib_cq_handle_t rcv_cq, req_cq;
-       ib_pd_handle_t ib_pd_handle;
-       struct ibv_qp_init_attr qp_create;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    " qp_alloc: ia_ptr %p ep_ptr %p ep_ctx_ptr %p\n",
-                    ia_ptr, ep_ptr, ep_ctx_ptr);
-
-       attr = &ep_ptr->param.ep_attr;
-       ib_pd_handle = ((DAPL_PZ *) ep_ptr->param.pz_handle)->pd_handle;
-       rcv_evd = (DAPL_EVD *) ep_ptr->param.recv_evd_handle;
-       req_evd = (DAPL_EVD *) ep_ptr->param.request_evd_handle;
-
-       /* 
-        * DAT allows usage model of EP's with no EVD's but IB does not. 
-        * Create a CQ with zero entries under the covers to support and 
-        * catch any invalid posting. 
-        */
-       if (rcv_evd != DAT_HANDLE_NULL)
-               rcv_cq = rcv_evd->ib_cq_handle;
-       else if (!ia_ptr->hca_ptr->ib_trans.ib_cq_empty)
-               rcv_cq = ia_ptr->hca_ptr->ib_trans.ib_cq_empty;
-       else {
-               struct ibv_comp_channel *channel =
-                   ia_ptr->hca_ptr->ib_trans.ib_cq;
-#ifdef CQ_WAIT_OBJECT
-               if (rcv_evd->cq_wait_obj_handle)
-                       channel = rcv_evd->cq_wait_obj_handle;
-#endif
-               /* Call IB verbs to create CQ */
-               rcv_cq = ibv_create_cq(ia_ptr->hca_ptr->ib_hca_handle,
-                                      0, NULL, channel, 0);
-
-               if (rcv_cq == IB_INVALID_HANDLE)
-                       return (dapl_convert_errno(ENOMEM, "create_cq"));
-
-               ia_ptr->hca_ptr->ib_trans.ib_cq_empty = rcv_cq;
-       }
-       if (req_evd != DAT_HANDLE_NULL)
-               req_cq = req_evd->ib_cq_handle;
-       else
-               req_cq = ia_ptr->hca_ptr->ib_trans.ib_cq_empty;
-
-       /* Setup attributes and create qp */
-       dapl_os_memzero((void *)&qp_create, sizeof(qp_create));
-       qp_create.send_cq = req_cq;
-       qp_create.cap.max_send_wr = attr->max_request_dtos;
-       qp_create.cap.max_send_sge = attr->max_request_iov;
-       qp_create.cap.max_inline_data =
-           ia_ptr->hca_ptr->ib_trans.max_inline_send;
-       qp_create.qp_type = IBV_QPT_RC;
-
-#ifdef DAT_EXTENSIONS
-       if (attr->service_type == DAT_IB_SERVICE_TYPE_UD) {
-               qp_create.qp_type = IBV_QPT_UD;
-               if (attr->max_message_size >
-                   (128 << ia_ptr->hca_ptr->ib_trans.mtu)) {
-                       return (DAT_INVALID_PARAMETER | DAT_INVALID_ARG6);
-               }
-       }
-#endif
-       qp_create.qp_context = (void *)ep_ptr;
-
-       /* ibv assumes rcv_cq is never NULL, set to req_cq */
-       if (rcv_cq == NULL) {
-               qp_create.recv_cq = req_cq;
-               qp_create.cap.max_recv_wr = 0;
-               qp_create.cap.max_recv_sge = 0;
-       } else {
-               qp_create.recv_cq = rcv_cq;
-               qp_create.cap.max_recv_wr = attr->max_recv_dtos;
-               qp_create.cap.max_recv_sge = attr->max_recv_iov;
-       }
-
-       ep_ptr->qp_handle = ibv_create_qp(ib_pd_handle, &qp_create);
-       if (!ep_ptr->qp_handle)
-               return (dapl_convert_errno(ENOMEM, "create_qp"));
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    " qp_alloc: qpn %p sq %d,%d rq %d,%d\n",
-                    ep_ptr->qp_handle->qp_num,
-                    qp_create.cap.max_send_wr, qp_create.cap.max_send_sge,
-                    qp_create.cap.max_recv_wr, qp_create.cap.max_recv_sge);
-
-       /* Setup QP attributes for INIT state on the way out */
-       if (dapls_modify_qp_state(ep_ptr->qp_handle,
-                                 IBV_QPS_INIT, NULL) != DAT_SUCCESS) {
-               ibv_destroy_qp(ep_ptr->qp_handle);
-               ep_ptr->qp_handle = IB_INVALID_HANDLE;
-               return DAT_INTERNAL_ERROR;
-       }
-
-       return DAT_SUCCESS;
-}
-
-/*
- * dapl_ib_qp_free
- *
- * Free a QP
- *
- * Input:
- *     ia_handle       IA handle
- *     *ep_ptr         pointer to EP INFO
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *  dapl_convert_errno
- *
- */
-DAT_RETURN dapls_ib_qp_free(IN DAPL_IA * ia_ptr, IN DAPL_EP * ep_ptr)
-{
-       dapl_dbg_log(DAPL_DBG_TYPE_EP, " qp_free:  ep_ptr %p qp %p\n",
-                    ep_ptr, ep_ptr->qp_handle);
-
-       if (ep_ptr->qp_handle != IB_INVALID_HANDLE) {
-               /* force error state to flush queue, then destroy */
-               dapls_modify_qp_state(ep_ptr->qp_handle, IBV_QPS_ERR, NULL);
-
-               if (ibv_destroy_qp(ep_ptr->qp_handle))
-                       return (dapl_convert_errno(errno, "destroy_qp"));
-
-               ep_ptr->qp_handle = IB_INVALID_HANDLE;
-       }
-
-       return DAT_SUCCESS;
-}
-
-/*
- * dapl_ib_qp_modify
- *
- * Set the QP to the parameters specified in an EP_PARAM
- *
- * The EP_PARAM structure that is provided has been
- * sanitized such that only non-zero values are valid.
- *
- * Input:
- *     ib_hca_handle           HCA handle
- *     qp_handle               QP handle
- *     ep_attr                 Sanitized EP Params
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INSUFFICIENT_RESOURCES
- *     DAT_INVALID_PARAMETER
- *
- */
-DAT_RETURN
-dapls_ib_qp_modify(IN DAPL_IA * ia_ptr,
-                  IN DAPL_EP * ep_ptr, IN DAT_EP_ATTR * attr)
-{
-       struct ibv_qp_attr qp_attr;
-
-       if (ep_ptr->qp_handle == IB_INVALID_HANDLE)
-               return DAT_INVALID_PARAMETER;
-
-       /* 
-        * EP state, qp_handle state should be an indication
-        * of current state but the only way to be sure is with
-        * a user mode ibv_query_qp call which is NOT available 
-        */
-
-       /* move to error state if necessary */
-       if ((ep_ptr->qp_state == IB_QP_STATE_ERROR) &&
-           (ep_ptr->qp_handle->state != IBV_QPS_ERR)) {
-               return (dapls_modify_qp_state(ep_ptr->qp_handle,
-                                             IBV_QPS_ERR, NULL));
-       }
-
-       /*
-        * Check if we have the right qp_state to modify attributes
-        */
-       if ((ep_ptr->qp_handle->state != IBV_QPS_RTR) &&
-           (ep_ptr->qp_handle->state != IBV_QPS_RTS))
-               return DAT_INVALID_STATE;
-
-       /* Adjust to current EP attributes */
-       dapl_os_memzero((void *)&qp_attr, sizeof(qp_attr));
-       qp_attr.cap.max_send_wr = attr->max_request_dtos;
-       qp_attr.cap.max_recv_wr = attr->max_recv_dtos;
-       qp_attr.cap.max_send_sge = attr->max_request_iov;
-       qp_attr.cap.max_recv_sge = attr->max_recv_iov;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    "modify_qp: qp %p sq %d,%d, rq %d,%d\n",
-                    ep_ptr->qp_handle,
-                    qp_attr.cap.max_send_wr, qp_attr.cap.max_send_sge,
-                    qp_attr.cap.max_recv_wr, qp_attr.cap.max_recv_sge);
-
-       if (ibv_modify_qp(ep_ptr->qp_handle, &qp_attr, IBV_QP_CAP)) {
-               dapl_dbg_log(DAPL_DBG_TYPE_ERR,
-                            "modify_qp: modify ep %p qp %p failed\n",
-                            ep_ptr, ep_ptr->qp_handle);
-               return (dapl_convert_errno(errno, "modify_qp_state"));
-       }
-
-       return DAT_SUCCESS;
-}
-
-/*
- * dapls_ib_reinit_ep
- *
- * Move the QP to INIT state again.
- *
- * Input:
- *     ep_ptr          DAPL_EP
- *
- * Output:
- *     none
- *
- * Returns:
- *     void
- *
- */
-#if defined(_WIN32) || defined(_WIN64)
-void dapls_ib_reinit_ep(IN DAPL_EP * ep_ptr)
-{
-       /* work around bug in low level driver - 3/24/09 */
-       /* RTS -> RESET -> INIT -> ERROR QP transition crashes system */
-       if (ep_ptr->qp_handle != IB_INVALID_HANDLE) {
-               dapls_ib_qp_free(ep_ptr->header.owner_ia, ep_ptr);
-               dapls_ib_qp_alloc(ep_ptr->header.owner_ia, ep_ptr, ep_ptr);
-       }
-}
-#else                          // _WIN32 || _WIN64
-void dapls_ib_reinit_ep(IN DAPL_EP * ep_ptr)
-{
-       if (ep_ptr->qp_handle != IB_INVALID_HANDLE &&
-           ep_ptr->qp_handle->qp_type != IBV_QPT_UD) {
-               /* move to RESET state and then to INIT */
-               dapls_modify_qp_state(ep_ptr->qp_handle, IBV_QPS_RESET, 0);
-               dapls_modify_qp_state(ep_ptr->qp_handle, IBV_QPS_INIT, 0);
-       }
-}
-#endif                         // _WIN32 || _WIN64
-
-/* 
- * Generic QP modify for init, reset, error, RTS, RTR
- * For UD, create_ah on RTR, qkey on INIT
- */
-DAT_RETURN
-dapls_modify_qp_state(IN ib_qp_handle_t qp_handle,
-                     IN ib_qp_state_t qp_state, IN struct ib_cm_handle *cm_ptr)
-{
-       struct ibv_qp_attr qp_attr;
-       enum ibv_qp_attr_mask mask = IBV_QP_STATE;
-       DAPL_EP *ep_ptr = (DAPL_EP *) qp_handle->qp_context;
-       DAPL_IA *ia_ptr = ep_ptr->header.owner_ia;
-       ib_qp_cm_t *qp_cm = &cm_ptr->dst;
-       int ret;
-
-       dapl_os_memzero((void *)&qp_attr, sizeof(qp_attr));
-       qp_attr.qp_state = qp_state;
-       switch (qp_state) {
-               /* additional attributes with RTR and RTS */
-       case IBV_QPS_RTR:
-               {
-                       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                                    " QPS_RTR: type %d state %d qpn %x lid %x"
-                                    " port %x ep %p qp_state %d\n",
-                                    qp_handle->qp_type, qp_handle->qp_type,
-                                    qp_cm->qpn, qp_cm->lid, qp_cm->port,
-                                    ep_ptr, ep_ptr->qp_state);
-
-                       mask |= IBV_QP_AV |
-                           IBV_QP_PATH_MTU |
-                           IBV_QP_DEST_QPN |
-                           IBV_QP_RQ_PSN |
-                           IBV_QP_MAX_DEST_RD_ATOMIC | IBV_QP_MIN_RNR_TIMER;
-
-                       qp_attr.dest_qp_num = qp_cm->qpn;
-                       qp_attr.rq_psn = 1;
-                       qp_attr.path_mtu = ia_ptr->hca_ptr->ib_trans.mtu;
-                       qp_attr.max_dest_rd_atomic =
-                           ep_ptr->param.ep_attr.max_rdma_read_out;
-                       qp_attr.min_rnr_timer =
-                           ia_ptr->hca_ptr->ib_trans.rnr_timer;
-
-                       /* address handle. RC and UD */
-                       qp_attr.ah_attr.dlid = qp_cm->lid;
-                       if (ia_ptr->hca_ptr->ib_trans.global) {
-                               qp_attr.ah_attr.is_global = 1;
-                               qp_attr.ah_attr.grh.dgid = qp_cm->gid;
-                               qp_attr.ah_attr.grh.hop_limit =
-                                   ia_ptr->hca_ptr->ib_trans.hop_limit;
-                               qp_attr.ah_attr.grh.traffic_class =
-                                   ia_ptr->hca_ptr->ib_trans.tclass;
-                       }
-                       qp_attr.ah_attr.sl = 0;
-                       qp_attr.ah_attr.src_path_bits = 0;
-                       qp_attr.ah_attr.port_num = ia_ptr->hca_ptr->port_num;
-#ifdef DAT_EXTENSIONS
-                       /* UD: create AH for remote side */
-                       if (qp_handle->qp_type == IBV_QPT_UD) {
-                               ib_pd_handle_t pz;
-                               pz = ((DAPL_PZ *)
-                                     ep_ptr->param.pz_handle)->pd_handle;
-                               mask = IBV_QP_STATE;
-                               cm_ptr->ah = ibv_create_ah(pz,
-                                                          &qp_attr.ah_attr);
-                               if (!cm_ptr->ah)
-                                       return (dapl_convert_errno(errno,
-                                                                  "ibv_ah"));
-
-                               /* already RTR, multi remote AH's on QP */
-                               if (ep_ptr->qp_state == IBV_QPS_RTR ||
-                                   ep_ptr->qp_state == IBV_QPS_RTS)
-                                       return DAT_SUCCESS;
-                       }
-#endif
-                       break;
-               }
-       case IBV_QPS_RTS:
-               {
-                       /* RC only */
-                       if (qp_handle->qp_type == IBV_QPT_RC) {
-                               mask |= IBV_QP_SQ_PSN |
-                                   IBV_QP_TIMEOUT |
-                                   IBV_QP_RETRY_CNT |
-                                   IBV_QP_RNR_RETRY | IBV_QP_MAX_QP_RD_ATOMIC;
-                               qp_attr.timeout =
-                                   ia_ptr->hca_ptr->ib_trans.ack_timer;
-                               qp_attr.retry_cnt =
-                                   ia_ptr->hca_ptr->ib_trans.ack_retry;
-                               qp_attr.rnr_retry =
-                                   ia_ptr->hca_ptr->ib_trans.rnr_retry;
-                               qp_attr.max_rd_atomic =
-                                   ep_ptr->param.ep_attr.max_rdma_read_out;
-                       }
-                       /* RC and UD */
-                       qp_attr.qp_state = IBV_QPS_RTS;
-                       qp_attr.sq_psn = 1;
-
-                       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                                    " QPS_RTS: psn %x rd_atomic %d ack %d "
-                                    " retry %d rnr_retry %d ep %p qp_state %d\n",
-                                    qp_attr.sq_psn, qp_attr.max_rd_atomic,
-                                    qp_attr.timeout, qp_attr.retry_cnt,
-                                    qp_attr.rnr_retry, ep_ptr,
-                                    ep_ptr->qp_state);
-#ifdef DAT_EXTENSIONS
-                       if (qp_handle->qp_type == IBV_QPT_UD) {
-                               /* already RTS, multi remote AH's on QP */
-                               if (ep_ptr->qp_state == IBV_QPS_RTS)
-                                       return DAT_SUCCESS;
-                               else
-                                       mask = IBV_QP_STATE | IBV_QP_SQ_PSN;
-                       }
-#endif
-                       break;
-               }
-       case IBV_QPS_INIT:
-               {
-                       mask |= IBV_QP_PKEY_INDEX | IBV_QP_PORT;
-                       if (qp_handle->qp_type == IBV_QPT_RC) {
-                               mask |= IBV_QP_ACCESS_FLAGS;
-                               qp_attr.qp_access_flags =
-                                   IBV_ACCESS_LOCAL_WRITE |
-                                   IBV_ACCESS_REMOTE_WRITE |
-                                   IBV_ACCESS_REMOTE_READ |
-                                   IBV_ACCESS_REMOTE_ATOMIC |
-                                   IBV_ACCESS_MW_BIND;
-                       }
-#ifdef DAT_EXTENSIONS
-                       if (qp_handle->qp_type == IBV_QPT_UD) {
-                               /* already INIT, multi remote AH's on QP */
-                               if (ep_ptr->qp_state == IBV_QPS_INIT)
-                                       return DAT_SUCCESS;
-                               mask |= IBV_QP_QKEY;
-                               qp_attr.qkey = SCM_UD_QKEY;
-                       }
-#endif
-                       qp_attr.pkey_index = 0;
-                       qp_attr.port_num = ia_ptr->hca_ptr->port_num;
-
-                       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                                    " QPS_INIT: pi %x port %x acc %x qkey 0x%x\n",
-                                    qp_attr.pkey_index, qp_attr.port_num,
-                                    qp_attr.qp_access_flags, qp_attr.qkey);
-                       break;
-               }
-       default:
-               break;
-
-       }
-
-       ret = ibv_modify_qp(qp_handle, &qp_attr, mask);
-       if (ret == 0) {
-               ep_ptr->qp_state = qp_state;
-               return DAT_SUCCESS;
-       } else {
-               return (dapl_convert_errno(errno, "modify_qp_state"));
-       }
-}
-
-/*
- * Local variables:
- *  c-indent-level: 4
- *  c-basic-offset: 4
- *  tab-width: 8
- * End:
- */
diff --git a/branches/winverbs/ulp/dapl2/dapl/openib_scm/dapl_ib_util.c b/branches/winverbs/ulp/dapl2/dapl/openib_scm/dapl_ib_util.c
deleted file mode 100644 (file)
index 30c71fa..0000000
+++ /dev/null
@@ -1,743 +0,0 @@
-/*
- * This Software is licensed under one of the following licenses:
- *
- * 1) under the terms of the "Common Public License 1.0" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/cpl.php.
- *
- * 2) under the terms of the "The BSD License" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/bsd-license.php.
- *
- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
- *    copy of which is available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/gpl-license.php.
- *
- * Licensee has the right to choose one of the above licenses.
- *
- * Redistributions of source code must retain the above copyright
- * notice and one of the license notices.
- *
- * Redistributions in binary form must reproduce both the above copyright
- * notice, one of the license notices in the documentation
- * and/or other materials provided with the distribution.
- */
-
-/***************************************************************************
- *
- *   Module:            uDAPL
- *
- *   Filename:          dapl_ib_util.c
- *
- *   Author:            Arlin Davis
- *
- *   Created:           3/10/2005
- *
- *   Description: 
- *
- *   The uDAPL openib provider - init, open, close, utilities
- *
- ****************************************************************************
- *                Source Control System Information
- *
- *    $Id: $
- *
- *     Copyright (c) 2005 Intel Corporation.  All rights reserved.
- *
- **************************************************************************/
-#ifdef RCSID
-static const char rcsid[] = "$Id:  $";
-#endif
-
-#include "openib_osd.h"
-#include "dapl.h"
-#include "dapl_adapter_util.h"
-#include "dapl_ib_util.h"
-#include "dapl_osd.h"
-
-#include <stdlib.h>
-
-int g_dapl_loopback_connection = 0;
-
-enum ibv_mtu dapl_ib_mtu(int mtu)
-{
-       switch (mtu) {
-       case 256:
-               return IBV_MTU_256;
-       case 512:
-               return IBV_MTU_512;
-       case 1024:
-               return IBV_MTU_1024;
-       case 2048:
-               return IBV_MTU_2048;
-       case 4096:
-               return IBV_MTU_4096;
-       default:
-               return IBV_MTU_1024;
-       }
-}
-
-char *dapl_ib_mtu_str(enum ibv_mtu mtu)
-{
-       switch (mtu) {
-       case IBV_MTU_256:
-               return "256";
-       case IBV_MTU_512:
-               return "512";
-       case IBV_MTU_1024:
-               return "1024";
-       case IBV_MTU_2048:
-               return "2048";
-       case IBV_MTU_4096:
-               return "4096";
-       default:
-               return "1024";
-       }
-}
-
-static DAT_RETURN getlocalipaddr(DAT_SOCK_ADDR * addr, int addr_len)
-{
-       struct sockaddr_in *sin;
-       struct addrinfo *res, hint, *ai;
-       int ret;
-       char hostname[256];
-
-       if (addr_len < sizeof(*sin)) {
-               return DAT_INTERNAL_ERROR;
-       }
-
-       ret = gethostname(hostname, 256);
-       if (ret)
-               return dapl_convert_errno(ret, "gethostname");
-
-       memset(&hint, 0, sizeof hint);
-       hint.ai_flags = AI_PASSIVE;
-       hint.ai_family = AF_INET;
-       hint.ai_socktype = SOCK_STREAM;
-       hint.ai_protocol = IPPROTO_TCP;
-
-       ret = getaddrinfo(hostname, NULL, &hint, &res);
-       if (ret) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " getaddrinfo ERR: %d %s\n", ret, gai_strerror(ret));
-               return DAT_INVALID_ADDRESS;
-       }
-
-       ret = DAT_INVALID_ADDRESS;
-       for (ai = res; ai; ai = ai->ai_next) {
-               sin = (struct sockaddr_in *)ai->ai_addr;
-               if (*((uint32_t *) & sin->sin_addr) != htonl(0x7f000001)) {
-                       *((struct sockaddr_in *)addr) = *sin;
-                       ret = DAT_SUCCESS;
-                       break;
-               }
-       }
-
-       freeaddrinfo(res);
-       return ret;
-}
-
-static int32_t create_cr_pipe(IN DAPL_HCA * hca_ptr)
-{
-       DAPL_SOCKET listen_socket;
-       struct sockaddr_in addr;
-       socklen_t addrlen = sizeof(addr);
-       int ret;
-
-       listen_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
-       if (listen_socket == DAPL_INVALID_SOCKET)
-               return 1;
-
-       memset(&addr, 0, sizeof addr);
-       addr.sin_family = AF_INET;
-       addr.sin_addr.s_addr = htonl(0x7f000001);
-       ret = bind(listen_socket, (struct sockaddr *)&addr, sizeof addr);
-       if (ret)
-               goto err1;
-
-       ret = getsockname(listen_socket, (struct sockaddr *)&addr, &addrlen);
-       if (ret)
-               goto err1;
-
-       ret = listen(listen_socket, 0);
-       if (ret)
-               goto err1;
-
-       hca_ptr->ib_trans.scm[1] = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
-       if (hca_ptr->ib_trans.scm[1] == DAPL_INVALID_SOCKET)
-               goto err1;
-
-       ret = connect(hca_ptr->ib_trans.scm[1], 
-                     (struct sockaddr *)&addr, sizeof(addr));
-       if (ret)
-               goto err2;
-
-       hca_ptr->ib_trans.scm[0] = accept(listen_socket, NULL, NULL);
-       if (hca_ptr->ib_trans.scm[0] == DAPL_INVALID_SOCKET)
-               goto err2;
-
-       closesocket(listen_socket);
-       return 0;
-
-      err2:
-       closesocket(hca_ptr->ib_trans.scm[1]);
-      err1:
-       closesocket(listen_socket);
-       return 1;
-}
-
-static void destroy_cr_pipe(IN DAPL_HCA * hca_ptr)
-{
-       closesocket(hca_ptr->ib_trans.scm[0]);
-       closesocket(hca_ptr->ib_trans.scm[1]);
-}
-
-
-/*
- * dapls_ib_init, dapls_ib_release
- *
- * Initialize Verb related items for device open
- *
- * Input:
- *     none
- *
- * Output:
- *     none
- *
- * Returns:
- *     0 success, -1 error
- *
- */
-int32_t dapls_ib_init(void)
-{
-       return 0;
-}
-
-int32_t dapls_ib_release(void)
-{
-       return 0;
-}
-
-#if defined(_WIN64) || defined(_WIN32)
-int dapls_config_comp_channel(struct ibv_comp_channel *channel)
-{
-       return 0;
-}
-#else                          // _WIN64 || WIN32
-int dapls_config_comp_channel(struct ibv_comp_channel *channel)
-{
-       int opts;
-
-       opts = fcntl(channel->fd, F_GETFL);     /* uCQ */
-       if (opts < 0 || fcntl(channel->fd, F_SETFL, opts | O_NONBLOCK) < 0) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " dapls_create_comp_channel: fcntl on ib_cq->fd %d ERR %d %s\n",
-                        channel->fd, opts, strerror(errno));
-               return errno;
-       }
-
-       return 0;
-}
-#endif
-
-/*
- * dapls_ib_open_hca
- *
- * Open HCA
- *
- * Input:
- *      *hca_name         pointer to provider device name
- *      *ib_hca_handle_p  pointer to provide HCA handle
- *
- * Output:
- *      none
- *
- * Return:
- *      DAT_SUCCESS
- *      dapl_convert_errno
- *
- */
-DAT_RETURN dapls_ib_open_hca(IN IB_HCA_NAME hca_name, IN DAPL_HCA * hca_ptr)
-{
-       struct ibv_device **dev_list;
-       struct ibv_port_attr port_attr;
-       int i;
-       DAT_RETURN dat_status;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " open_hca: %s - %p\n", hca_name, hca_ptr);
-
-       /* get the IP address of the device */
-       dat_status = getlocalipaddr((DAT_SOCK_ADDR *) & hca_ptr->hca_address,
-                                   sizeof(DAT_SOCK_ADDR6));
-       if (dat_status != DAT_SUCCESS)
-               return dat_status;
-
-       /* Get list of all IB devices, find match, open */
-       dev_list = ibv_get_device_list(NULL);
-       if (!dev_list) {
-               dapl_dbg_log(DAPL_DBG_TYPE_ERR,
-                            " open_hca: ibv_get_device_list() failed\n",
-                            hca_name);
-               return DAT_INTERNAL_ERROR;
-       }
-
-       for (i = 0; dev_list[i]; ++i) {
-               hca_ptr->ib_trans.ib_dev = dev_list[i];
-               if (!strcmp(ibv_get_device_name(hca_ptr->ib_trans.ib_dev),
-                           hca_name))
-                       goto found;
-       }
-
-       dapl_log(DAPL_DBG_TYPE_ERR,
-                " open_hca: device %s not found\n", hca_name);
-       goto err;
-
-      found:
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " open_hca: Found dev %s %016llx\n",
-                    ibv_get_device_name(hca_ptr->ib_trans.ib_dev),
-                    (unsigned long long)
-                    ntohll(ibv_get_device_guid(hca_ptr->ib_trans.ib_dev)));
-
-       hca_ptr->ib_hca_handle = ibv_open_device(hca_ptr->ib_trans.ib_dev);
-       if (!hca_ptr->ib_hca_handle) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " open_hca: dev open failed for %s, err=%s\n",
-                        ibv_get_device_name(hca_ptr->ib_trans.ib_dev),
-                        strerror(errno));
-               goto err;
-       }
-
-       /* get lid for this hca-port, network order */
-       if (ibv_query_port(hca_ptr->ib_hca_handle,
-                          (uint8_t) hca_ptr->port_num, &port_attr)) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " open_hca: get lid ERR for %s, err=%s\n",
-                        ibv_get_device_name(hca_ptr->ib_trans.ib_dev),
-                        strerror(errno));
-               goto err;
-       } else {
-               hca_ptr->ib_trans.lid = htons(port_attr.lid);
-       }
-
-       /* get gid for this hca-port, network order */
-       if (ibv_query_gid(hca_ptr->ib_hca_handle,
-                         (uint8_t) hca_ptr->port_num,
-                         0, &hca_ptr->ib_trans.gid)) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " open_hca: query GID ERR for %s, err=%s\n",
-                        ibv_get_device_name(hca_ptr->ib_trans.ib_dev),
-                        strerror(errno));
-               goto err;
-       }
-
-       /* set RC tunables via enviroment or default */
-       hca_ptr->ib_trans.max_inline_send =
-           dapl_os_get_env_val("DAPL_MAX_INLINE", INLINE_SEND_DEFAULT);
-       hca_ptr->ib_trans.ack_retry =
-           dapl_os_get_env_val("DAPL_ACK_RETRY", SCM_ACK_RETRY);
-       hca_ptr->ib_trans.ack_timer =
-           dapl_os_get_env_val("DAPL_ACK_TIMER", SCM_ACK_TIMER);
-       hca_ptr->ib_trans.rnr_retry =
-           dapl_os_get_env_val("DAPL_RNR_RETRY", SCM_RNR_RETRY);
-       hca_ptr->ib_trans.rnr_timer =
-           dapl_os_get_env_val("DAPL_RNR_TIMER", SCM_RNR_TIMER);
-       hca_ptr->ib_trans.global =
-           dapl_os_get_env_val("DAPL_GLOBAL_ROUTING", SCM_GLOBAL);
-       hca_ptr->ib_trans.hop_limit =
-           dapl_os_get_env_val("DAPL_HOP_LIMIT", SCM_HOP_LIMIT);
-       hca_ptr->ib_trans.tclass =
-           dapl_os_get_env_val("DAPL_TCLASS", SCM_TCLASS);
-       hca_ptr->ib_trans.mtu =
-           dapl_ib_mtu(dapl_os_get_env_val("DAPL_IB_MTU", SCM_IB_MTU));
-
-#ifndef CQ_WAIT_OBJECT
-       /* initialize cq_lock */
-       dat_status = dapl_os_lock_init(&hca_ptr->ib_trans.cq_lock);
-       if (dat_status != DAT_SUCCESS) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " open_hca: failed to init cq_lock\n");
-               goto bail;
-       }
-       /* EVD events without direct CQ channels, non-blocking */
-       hca_ptr->ib_trans.ib_cq =
-           ibv_create_comp_channel(hca_ptr->ib_hca_handle);
-       if (hca_ptr->ib_trans.ib_cq == NULL) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " open_hca: ibv_create_comp_channel ERR %s\n",
-                        strerror(errno));
-               goto bail;
-       }
-
-       if (dapls_config_comp_channel(hca_ptr->ib_trans.ib_cq)) {
-               goto bail;
-       }
-
-       if (dapli_cq_thread_init(hca_ptr)) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " open_hca: cq_thread_init failed for %s\n",
-                        ibv_get_device_name(hca_ptr->ib_trans.ib_dev));
-               goto bail;
-       }
-#endif                         /* CQ_WAIT_OBJECT */
-
-       /* initialize cr_list lock */
-       dat_status = dapl_os_lock_init(&hca_ptr->ib_trans.lock);
-       if (dat_status != DAT_SUCCESS) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " open_hca: failed to init cr_list lock\n");
-               goto bail;
-       }
-
-       /* initialize CM list for listens on this HCA */
-       dapl_llist_init_head(&hca_ptr->ib_trans.list);
-
-       /* initialize pipe, user level wakeup on select */
-       if (create_cr_pipe(hca_ptr)) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " open_hca: failed to init cr pipe - %s\n",
-                        strerror(errno));
-               goto bail;
-       }
-
-       /* create thread to process inbound connect request */
-       hca_ptr->ib_trans.cr_state = IB_THREAD_INIT;
-       dat_status = dapl_os_thread_create(cr_thread,
-                                          (void *)hca_ptr,
-                                          &hca_ptr->ib_trans.thread);
-       if (dat_status != DAT_SUCCESS) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " open_hca: failed to create thread\n");
-               goto bail;
-       }
-
-       /* wait for thread */
-       while (hca_ptr->ib_trans.cr_state != IB_THREAD_RUN) {
-               dapl_os_sleep_usec(2000);
-       }
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " open_hca: devname %s, port %d, hostname_IP %s\n",
-                    ibv_get_device_name(hca_ptr->ib_trans.ib_dev),
-                    hca_ptr->port_num, inet_ntoa(((struct sockaddr_in *)
-                                                  &hca_ptr->hca_address)->
-                                                 sin_addr));
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " open_hca: LID 0x%x GID Subnet 0x" F64x " ID 0x" F64x
-                    "\n", ntohs(hca_ptr->ib_trans.lid), (unsigned long long)
-                    htonll(hca_ptr->ib_trans.gid.global.subnet_prefix),
-                    (unsigned long long)htonll(hca_ptr->ib_trans.gid.global.
-                                               interface_id));
-
-       ibv_free_device_list(dev_list);
-       return dat_status;
-
-      bail:
-       ibv_close_device(hca_ptr->ib_hca_handle);
-       hca_ptr->ib_hca_handle = IB_INVALID_HANDLE;
-      err:
-       ibv_free_device_list(dev_list);
-       return DAT_INTERNAL_ERROR;
-}
-
-/*
- * dapls_ib_close_hca
- *
- * Open HCA
- *
- * Input:
- *      DAPL_HCA   provide CA handle
- *
- * Output:
- *      none
- *
- * Return:
- *      DAT_SUCCESS
- *     dapl_convert_errno 
- *
- */
-DAT_RETURN dapls_ib_close_hca(IN DAPL_HCA * hca_ptr)
-{
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " close_hca: %p\n", hca_ptr);
-
-#ifndef CQ_WAIT_OBJECT
-       dapli_cq_thread_destroy(hca_ptr);
-       dapl_os_lock_destroy(&hca_ptr->ib_trans.cq_lock);
-#endif                         /* CQ_WAIT_OBJECT */
-
-       if (hca_ptr->ib_hca_handle != IB_INVALID_HANDLE) {
-               if (ibv_close_device(hca_ptr->ib_hca_handle))
-                       return (dapl_convert_errno(errno, "ib_close_device"));
-               hca_ptr->ib_hca_handle = IB_INVALID_HANDLE;
-       }
-
-       /* destroy cr_thread and lock */
-       hca_ptr->ib_trans.cr_state = IB_THREAD_CANCEL;
-       if (send(hca_ptr->ib_trans.scm[1], "w", sizeof "w", 0) == -1)
-               dapl_log(DAPL_DBG_TYPE_UTIL,
-                        " thread_destroy: thread wakeup err = %s\n",
-                        strerror(errno));
-       while (hca_ptr->ib_trans.cr_state != IB_THREAD_EXIT) {
-               dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                            " close_hca: waiting for cr_thread\n");
-               if (send(hca_ptr->ib_trans.scm[1], "w", sizeof "w", 0) == -1)
-                       dapl_log(DAPL_DBG_TYPE_UTIL,
-                                " thread_destroy: thread wakeup err = %s\n",
-                                strerror(errno));
-               dapl_os_sleep_usec(2000);
-       }
-       dapl_os_lock_destroy(&hca_ptr->ib_trans.lock);
-       destroy_cr_pipe(hca_ptr); /* no longer need pipe */
-       return (DAT_SUCCESS);
-}
-
-/*
- * dapls_ib_query_hca
- *
- * Query the hca attribute
- *
- * Input:
- *     hca_handl               hca handle      
- *     ia_attr                 attribute of the ia
- *     ep_attr                 attribute of the ep
- *     ip_addr                 ip address of DET NIC
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INVALID_HANDLE
- */
-
-DAT_RETURN dapls_ib_query_hca(IN DAPL_HCA * hca_ptr,
-                             OUT DAT_IA_ATTR * ia_attr,
-                             OUT DAT_EP_ATTR * ep_attr,
-                             OUT DAT_SOCK_ADDR6 * ip_addr)
-{
-       struct ibv_device_attr dev_attr;
-       struct ibv_port_attr port_attr;
-
-       if (hca_ptr->ib_hca_handle == NULL) {
-               dapl_dbg_log(DAPL_DBG_TYPE_ERR, " query_hca: BAD handle\n");
-               return (DAT_INVALID_HANDLE);
-       }
-
-       /* local IP address of device, set during ia_open */
-       if (ip_addr != NULL)
-               memcpy(ip_addr, &hca_ptr->hca_address, sizeof(DAT_SOCK_ADDR6));
-
-       if (ia_attr == NULL && ep_attr == NULL)
-               return DAT_SUCCESS;
-
-       /* query verbs for this device and port attributes */
-       if (ibv_query_device(hca_ptr->ib_hca_handle, &dev_attr) ||
-           ibv_query_port(hca_ptr->ib_hca_handle,
-                          hca_ptr->port_num, &port_attr))
-               return (dapl_convert_errno(errno, "ib_query_hca"));
-
-       if (ia_attr != NULL) {
-               (void)dapl_os_memzero(ia_attr, sizeof(*ia_attr));
-               ia_attr->adapter_name[DAT_NAME_MAX_LENGTH - 1] = '\0';
-               ia_attr->vendor_name[DAT_NAME_MAX_LENGTH - 1] = '\0';
-               ia_attr->ia_address_ptr =
-                   (DAT_IA_ADDRESS_PTR) & hca_ptr->hca_address;
-
-               dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                            " query_hca: %s %s \n",
-                            ibv_get_device_name(hca_ptr->ib_trans.ib_dev),
-                            inet_ntoa(((struct sockaddr_in *)
-                                       &hca_ptr->hca_address)->sin_addr));
-
-               ia_attr->hardware_version_major = dev_attr.hw_ver;
-               /* ia_attr->hardware_version_minor   = dev_attr.fw_ver; */
-               ia_attr->max_eps = dev_attr.max_qp;
-               ia_attr->max_dto_per_ep = dev_attr.max_qp_wr;
-               ia_attr->max_rdma_read_in = dev_attr.max_qp_rd_atom;
-               ia_attr->max_rdma_read_out = dev_attr.max_qp_init_rd_atom;
-               ia_attr->max_rdma_read_per_ep_in = dev_attr.max_qp_rd_atom;
-               ia_attr->max_rdma_read_per_ep_out =
-                   dev_attr.max_qp_init_rd_atom;
-               ia_attr->max_rdma_read_per_ep_in_guaranteed = DAT_TRUE;
-               ia_attr->max_rdma_read_per_ep_out_guaranteed = DAT_TRUE;
-               ia_attr->max_evds = dev_attr.max_cq;
-               ia_attr->max_evd_qlen = dev_attr.max_cqe;
-               ia_attr->max_iov_segments_per_dto = dev_attr.max_sge;
-               ia_attr->max_lmrs = dev_attr.max_mr;
-               /* 32bit attribute from 64bit, 4G-1 limit, DAT v2 needs fix */
-               ia_attr->max_lmr_block_size = 
-                   (dev_attr.max_mr_size >> 32) ? ~0 : dev_attr.max_mr_size;
-               ia_attr->max_rmrs = dev_attr.max_mw;
-               ia_attr->max_lmr_virtual_address = dev_attr.max_mr_size;
-               ia_attr->max_rmr_target_address = dev_attr.max_mr_size;
-               ia_attr->max_pzs = dev_attr.max_pd;
-               ia_attr->max_message_size = port_attr.max_msg_sz;
-               ia_attr->max_rdma_size = port_attr.max_msg_sz;
-               ia_attr->max_iov_segments_per_rdma_read = dev_attr.max_sge;
-               ia_attr->max_iov_segments_per_rdma_write = dev_attr.max_sge;
-               ia_attr->num_transport_attr = 0;
-               ia_attr->transport_attr = NULL;
-               ia_attr->num_vendor_attr = 0;
-               ia_attr->vendor_attr = NULL;
-#ifdef DAT_EXTENSIONS
-               ia_attr->extension_supported = DAT_EXTENSION_IB;
-               ia_attr->extension_version = DAT_IB_EXTENSION_VERSION;
-#endif
-               hca_ptr->ib_trans.mtu = DAPL_MIN(port_attr.active_mtu,
-                                                hca_ptr->ib_trans.mtu);
-               hca_ptr->ib_trans.ack_timer =
-                   DAPL_MAX(dev_attr.local_ca_ack_delay,
-                            hca_ptr->ib_trans.ack_timer);
-
-               /* set MTU in transport specific named attribute */
-               hca_ptr->ib_trans.named_attr.name = "DAT_IB_TRANSPORT_MTU";
-               hca_ptr->ib_trans.named_attr.value =
-                   dapl_ib_mtu_str(hca_ptr->ib_trans.mtu);
-
-               dapl_log(DAPL_DBG_TYPE_UTIL,
-                            " query_hca: (%x.%x) ep %d ep_q %d evd %d"
-                            " evd_q %d mtu %d\n",
-                            ia_attr->hardware_version_major,
-                            ia_attr->hardware_version_minor,
-                            ia_attr->max_eps, ia_attr->max_dto_per_ep,
-                            ia_attr->max_evds, ia_attr->max_evd_qlen,
-                            128 << hca_ptr->ib_trans.mtu);
-
-               dapl_log(DAPL_DBG_TYPE_UTIL,
-                            " query_hca: msg %llu rdma %llu iov %d lmr %d rmr %d"
-                            " ack_time %d mr %u\n",
-                            ia_attr->max_message_size, ia_attr->max_rdma_size,
-                            ia_attr->max_iov_segments_per_dto,
-                            ia_attr->max_lmrs, ia_attr->max_rmrs,
-                            hca_ptr->ib_trans.ack_timer,
-                            ia_attr->max_lmr_block_size);
-       }
-
-       if (ep_attr != NULL) {
-               (void)dapl_os_memzero(ep_attr, sizeof(*ep_attr));
-               ep_attr->max_message_size = port_attr.max_msg_sz;
-               ep_attr->max_rdma_size = port_attr.max_msg_sz;
-               ep_attr->max_recv_dtos = dev_attr.max_qp_wr;
-               ep_attr->max_request_dtos = dev_attr.max_qp_wr;
-               ep_attr->max_recv_iov = dev_attr.max_sge;
-               ep_attr->max_request_iov = dev_attr.max_sge;
-               ep_attr->max_rdma_read_in = dev_attr.max_qp_rd_atom;
-               ep_attr->max_rdma_read_out = dev_attr.max_qp_init_rd_atom;
-               ep_attr->max_rdma_read_iov = dev_attr.max_sge;
-               ep_attr->max_rdma_write_iov = dev_attr.max_sge;
-               dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                            " query_hca: MAX msg %llu mtu %d dto %d iov %d"
-                            " rdma i%d,o%d\n",
-                            ep_attr->max_message_size,
-                            ep_attr->max_recv_dtos, ep_attr->max_recv_iov,
-                            ep_attr->max_rdma_read_in,
-                            ep_attr->max_rdma_read_out);
-       }
-       return DAT_SUCCESS;
-}
-
-/*
- * dapls_ib_setup_async_callback
- *
- * Set up an asynchronous callbacks of various kinds
- *
- * Input:
- *     ia_handle               IA handle
- *     handler_type            type of handler to set up
- *     callback_handle         handle param for completion callbacks
- *     callback                callback routine pointer
- *     context                 argument for callback routine
- *
- * Output:
- *     none
- *
- * Returns:
- *     DAT_SUCCESS
- *     DAT_INSUFFICIENT_RESOURCES
- *     DAT_INVALID_PARAMETER
- *
- */
-DAT_RETURN dapls_ib_setup_async_callback(IN DAPL_IA * ia_ptr,
-                                        IN DAPL_ASYNC_HANDLER_TYPE
-                                        handler_type, IN DAPL_EVD * evd_ptr,
-                                        IN ib_async_handler_t callback,
-                                        IN void *context)
-{
-       ib_hca_transport_t *hca_ptr;
-
-       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
-                    " setup_async_cb: ia %p type %d handle %p cb %p ctx %p\n",
-                    ia_ptr, handler_type, evd_ptr, callback, context);
-
-       hca_ptr = &ia_ptr->hca_ptr->ib_trans;
-       switch (handler_type) {
-       case DAPL_ASYNC_UNAFILIATED:
-               hca_ptr->async_unafiliated = (ib_async_handler_t) callback;
-               hca_ptr->async_un_ctx = context;
-               break;
-       case DAPL_ASYNC_CQ_ERROR:
-               hca_ptr->async_cq_error = (ib_async_cq_handler_t) callback;
-               break;
-       case DAPL_ASYNC_CQ_COMPLETION:
-               hca_ptr->async_cq = (ib_async_dto_handler_t) callback;
-               break;
-       case DAPL_ASYNC_QP_ERROR:
-               hca_ptr->async_qp_error = (ib_async_qp_handler_t) callback;
-               break;
-       default:
-               break;
-       }
-       return DAT_SUCCESS;
-}
-
-/*
- * dapls_set_provider_specific_attr
- *
- * Input:
- *      attr_ptr        Pointer provider specific attributes
- *
- * Output:
- *      none
- *
- * Returns:
- *      void
- */
-DAT_NAMED_ATTR ib_attrs[] = {
-       {
-        "DAT_IB_TRANSPORT_MTU", "1024"}
-       ,
-#ifdef DAT_EXTENSIONS
-       {
-        "DAT_EXTENSION_INTERFACE", "TRUE"}
-       ,
-       {
-        DAT_IB_ATTR_FETCH_AND_ADD, "TRUE"}
-       ,
-       {
-        DAT_IB_ATTR_CMP_AND_SWAP, "TRUE"}
-       ,
-       {
-        DAT_IB_ATTR_IMMED_DATA, "TRUE"}
-       ,
-       {
-        DAT_IB_ATTR_UD, "TRUE"}
-       ,
-#ifdef DAPL_COUNTERS
-       {
-        DAT_ATTR_COUNTERS, "TRUE"}
-       ,
-#endif                         /* DAPL_COUNTERS */
-#endif
-};
-
-#define SPEC_ATTR_SIZE( x )     (sizeof( x ) / sizeof( DAT_NAMED_ATTR))
-
-void dapls_query_provider_specific_attr(IN DAPL_IA * ia_ptr,
-                                       IN DAT_PROVIDER_ATTR * attr_ptr)
-{
-       attr_ptr->num_provider_specific_attr = SPEC_ATTR_SIZE(ib_attrs);
-       attr_ptr->provider_specific_attr = ib_attrs;
-
-       /* set MTU to actual settings */
-       ib_attrs[0].value = ia_ptr->hca_ptr->ib_trans.named_attr.value;
-}
index e9245721d92b67fbed6bf6d02d689e9791f8bd76..e83c5ae34090eb7965facf2d2b48c1ef90449788 100644 (file)
-/*
- * This Software is licensed under one of the following licenses:
- *
- * 1) under the terms of the "Common Public License 1.0" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/cpl.php.
- *
- * 2) under the terms of the "The BSD License" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/bsd-license.php.
- *
- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
- *    copy of which is available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/gpl-license.php.
- *
- * Licensee has the right to choose one of the above licenses.
- *
- * Redistributions of source code must retain the above copyright
- * notice and one of the license notices.
- *
- * Redistributions in binary form must reproduce both the above copyright
- * notice, one of the license notices in the documentation
- * and/or other materials provided with the distribution.
- */
-
-/***************************************************************************
- *
- *   Module:            uDAPL
- *
- *   Filename:          dapl_ib_util.h
- *
- *   Author:            Arlin Davis
- *
- *   Created:           3/10/2005
- *
- *   Description: 
- *
- *   The uDAPL openib provider - definitions, prototypes,
- *
- ****************************************************************************
- *                Source Control System Information
- *
- *    $Id: $
- *
- *     Copyright (c) 2005 Intel Corporation.  All rights reserved.
- *
- **************************************************************************/
-
-#ifndef _DAPL_IB_UTIL_H_
-#define _DAPL_IB_UTIL_H_
-
-#include "openib_osd.h"
-#include <infiniband/verbs.h>
-
-#ifdef DAT_EXTENSIONS
-#include <dat2/dat_ib_extensions.h>
-#endif
-
-#ifndef __cplusplus
-#define false 0
-#define true  1
-#endif /*__cplusplus */
-
-/* Typedefs to map common DAPL provider types to IB verbs */
-typedef        struct ibv_qp           *ib_qp_handle_t;
-typedef        struct ibv_cq           *ib_cq_handle_t;
-typedef        struct ibv_pd           *ib_pd_handle_t;
-typedef        struct ibv_mr           *ib_mr_handle_t;
-typedef        struct ibv_mw           *ib_mw_handle_t;
-typedef        struct ibv_wc           ib_work_completion_t;
-
-/* HCA context type maps to IB verbs  */
-typedef        struct ibv_context      *ib_hca_handle_t;
-typedef ib_hca_handle_t                dapl_ibal_ca_t;
-
-/* destination info to exchange, define wire protocol version */
-#define DSCM_VER 4
-typedef struct _ib_qp_cm
-{ 
-       uint16_t                ver;
-       uint16_t                rej;
-       uint16_t                lid;
-       uint16_t                port;
-       uint32_t                qpn;
-       uint32_t                p_size;
-       union ibv_gid           gid;
-       DAT_SOCK_ADDR6          ia_address;
-       uint16_t                qp_type; 
-} ib_qp_cm_t;
-
-typedef enum scm_state 
-{
-       SCM_INIT,
-       SCM_LISTEN,
-       SCM_CONN_PENDING,
-       SCM_RTU_PENDING,
-       SCM_ACCEPTING,
-       SCM_ACCEPTING_DATA,
-       SCM_ACCEPTED,
-       SCM_REJECTED,
-       SCM_CONNECTED,
-       SCM_DISCONNECTED,
-       SCM_DESTROY
-} SCM_STATE;
-
-struct ib_cm_handle
-{ 
-       struct dapl_llist_entry entry;
-       DAPL_OS_LOCK            lock;
-       SCM_STATE               state;
-       DAPL_SOCKET             socket;
-       struct dapl_hca         *hca;
-       struct dapl_sp          *sp;    
-       struct dapl_ep          *ep;
-       ib_qp_cm_t              dst;
-       unsigned char           p_data[256];    /* must follow ib_qp_cm_t */
-       struct ibv_ah           *ah;
-};
-
-typedef struct ib_cm_handle    *dp_ib_cm_handle_t;
-typedef dp_ib_cm_handle_t      ib_cm_srvc_handle_t;
-
-/* CM events */
-typedef enum 
-{
-    IB_CME_CONNECTED,
-    IB_CME_DISCONNECTED,
-    IB_CME_DISCONNECTED_ON_LINK_DOWN,
-    IB_CME_CONNECTION_REQUEST_PENDING,
-    IB_CME_CONNECTION_REQUEST_PENDING_PRIVATE_DATA,
-    IB_CME_DESTINATION_REJECT,
-    IB_CME_DESTINATION_REJECT_PRIVATE_DATA,
-    IB_CME_DESTINATION_UNREACHABLE,
-    IB_CME_TOO_MANY_CONNECTION_REQUESTS,
-    IB_CME_LOCAL_FAILURE,
-    IB_CM_LOCAL_FAILURE
-
-} ib_cm_events_t;
-
-/* Operation and state mappings */
-typedef int ib_send_op_type_t;
-typedef        struct  ibv_sge         ib_data_segment_t;
-typedef enum   ibv_qp_state    ib_qp_state_t;
-typedef        enum    ibv_event_type  ib_async_event_type;
-typedef struct ibv_async_event ib_error_record_t;      
-
-/* CQ notifications */
-typedef enum
-{
-       IB_NOTIFY_ON_NEXT_COMP,
-       IB_NOTIFY_ON_SOLIC_COMP
-
-} ib_notification_type_t;
-
-/* other mappings */
-typedef int                    ib_bool_t;
-typedef union ibv_gid          GID;
-typedef char                   *IB_HCA_NAME;
-typedef uint16_t               ib_hca_port_t;
-typedef uint32_t               ib_comp_handle_t;
-
-#ifdef CQ_WAIT_OBJECT
-typedef struct ibv_comp_channel *ib_wait_obj_handle_t;
-#endif
-
-/* Definitions */
-#define IB_INVALID_HANDLE      NULL
-
-/* inline send rdma threshold */
-#define        INLINE_SEND_DEFAULT     200
-
-/* qkey for UD QP's */
-#define SCM_UD_QKEY    0x78654321
-
-/* RC timer - retry count defaults */
-#define SCM_ACK_TIMER 16 /* 5 bits, 4.096us*2^ack_timer. 16== 268ms */
-#define SCM_ACK_RETRY 7  /* 3 bits, 7 * 268ms = 1.8 seconds */
-#define SCM_RNR_TIMER 12 /* 5 bits, 12 =.64ms, 28 =163ms, 31 =491ms */
-#define SCM_RNR_RETRY 7  /* 3 bits, 7 == infinite */
-#define SCM_IB_MTU    2048
-
-/* Global routing defaults */
-#define SCM_GLOBAL     0       /* global routing is disabled */
-#define SCM_HOP_LIMIT  0xff
-#define SCM_TCLASS     0
-
-/* CM private data areas */
-#define        IB_MAX_REQ_PDATA_SIZE   92
-#define        IB_MAX_REP_PDATA_SIZE   196
-#define        IB_MAX_REJ_PDATA_SIZE   148
-#define        IB_MAX_DREQ_PDATA_SIZE  220
-#define        IB_MAX_DREP_PDATA_SIZE  224
-#define        IB_MAX_RTU_PDATA_SIZE   224
-
-/* DTO OPs, ordered for DAPL ENUM definitions */
-#define OP_RDMA_WRITE           IBV_WR_RDMA_WRITE
-#define OP_RDMA_WRITE_IMM       IBV_WR_RDMA_WRITE_WITH_IMM
-#define OP_SEND                 IBV_WR_SEND
-#define OP_SEND_IMM             IBV_WR_SEND_WITH_IMM
-#define OP_RDMA_READ            IBV_WR_RDMA_READ
-#define OP_COMP_AND_SWAP        IBV_WR_ATOMIC_CMP_AND_SWP
-#define OP_FETCH_AND_ADD        IBV_WR_ATOMIC_FETCH_AND_ADD
-#define OP_RECEIVE              7   /* internal op */
-#define OP_RECEIVE_IMM         8   /* rdma write with immed, internel op */
-#define OP_RECEIVE_MSG_IMM     9   /* recv msg with immed, internel op */
-#define OP_BIND_MW              10   /* internal op */
-#define OP_SEND_UD              11  /* internal op */
-#define OP_RECV_UD              12  /* internal op */
-#define OP_INVALID             0xff
-
-/* Definitions to map QP state */
-#define IB_QP_STATE_RESET      IBV_QPS_RESET
-#define IB_QP_STATE_INIT       IBV_QPS_INIT
-#define IB_QP_STATE_RTR                IBV_QPS_RTR
-#define IB_QP_STATE_RTS                IBV_QPS_RTS
-#define IB_QP_STATE_SQD                IBV_QPS_SQD
-#define IB_QP_STATE_SQE                IBV_QPS_SQE
-#define IB_QP_STATE_ERROR      IBV_QPS_ERR
-
-/* Definitions for ibverbs/mthca return codes, should be defined in verbs.h */
-/* some are errno and some are -n values */
-
-/**
- * ibv_get_device_name - Return kernel device name
- * ibv_get_device_guid - Return device's node GUID
- * ibv_open_device - Return ibv_context or NULL
- * ibv_close_device - Return 0, (errno?)
- * ibv_get_async_event - Return 0, -1 
- * ibv_alloc_pd - Return ibv_pd, NULL
- * ibv_dealloc_pd - Return 0, errno 
- * ibv_reg_mr - Return ibv_mr, NULL
- * ibv_dereg_mr - Return 0, errno
- * ibv_create_cq - Return ibv_cq, NULL
- * ibv_destroy_cq - Return 0, errno
- * ibv_get_cq_event - Return 0 & ibv_cq/context, int
- * ibv_poll_cq - Return n & ibv_wc, 0 ok, -1 empty, -2 error 
- * ibv_req_notify_cq - Return 0 (void?)
- * ibv_create_qp - Return ibv_qp, NULL
- * ibv_modify_qp - Return 0, errno
- * ibv_destroy_qp - Return 0, errno
- * ibv_post_send - Return 0, -1 & bad_wr
- * ibv_post_recv - Return 0, -1 & bad_wr 
- */
-
-/* async handler for DTO, CQ, QP, and unafiliated */
-typedef void (*ib_async_dto_handler_t)(
-    IN    ib_hca_handle_t    ib_hca_handle,
-    IN    ib_error_record_t  *err_code,
-    IN    void               *context);
-
-typedef void (*ib_async_cq_handler_t)(
-    IN    ib_hca_handle_t    ib_hca_handle,
-    IN    ib_cq_handle_t     ib_cq_handle,
-    IN    ib_error_record_t  *err_code,
-    IN    void               *context);
-
-typedef void (*ib_async_qp_handler_t)(
-    IN    ib_hca_handle_t    ib_hca_handle,
-    IN    ib_qp_handle_t     ib_qp_handle,
-    IN    ib_error_record_t  *err_code,
-    IN    void               *context);
-
-typedef void (*ib_async_handler_t)(
-    IN    ib_hca_handle_t    ib_hca_handle,
-    IN    ib_error_record_t  *err_code,
-    IN    void               *context);
-
-typedef enum
-{
-       IB_THREAD_INIT,
-       IB_THREAD_RUN,
-       IB_THREAD_CANCEL,
-       IB_THREAD_EXIT
-
-} ib_thread_state_t;
-
-/* ib_hca_transport_t, specific to this implementation */
-typedef struct _ib_hca_transport
-{ 
-       union ibv_gid           gid;
-       struct  ibv_device      *ib_dev;
-       ib_cq_handle_t          ib_cq_empty;
-       DAPL_OS_LOCK            cq_lock;        
-       int                     max_inline_send;
-       ib_thread_state_t       cq_state;
-       DAPL_OS_THREAD          cq_thread;
-       struct ibv_comp_channel *ib_cq;
-       int                     cr_state;
-       DAPL_OS_THREAD          thread;
-       DAPL_OS_LOCK            lock;   
-       struct dapl_llist_entry *list;  
-       ib_async_handler_t      async_unafiliated;
-       void                    *async_un_ctx;
-       ib_async_cq_handler_t   async_cq_error;
-       ib_async_dto_handler_t  async_cq;
-       ib_async_qp_handler_t   async_qp_error;
-       uint16_t                lid;
-       uint8_t                 ack_timer;
-       uint8_t                 ack_retry;
-       uint8_t                 rnr_timer;
-       uint8_t                 rnr_retry;
-       uint8_t                 global;
-       uint8_t                 hop_limit;
-       uint8_t                 tclass;
-       uint8_t                 mtu;
-       DAT_NAMED_ATTR          named_attr;
-       DAPL_SOCKET             scm[2];
-} ib_hca_transport_t;
-
-/* provider specfic fields for shared memory support */
-typedef uint32_t ib_shm_transport_t;
-
-/* prototypes */
-int32_t        dapls_ib_init (void);
-int32_t        dapls_ib_release (void);
-void cr_thread(void *arg);
-int dapli_cq_thread_init(struct dapl_hca *hca_ptr);
-void dapli_cq_thread_destroy(struct dapl_hca *hca_ptr);
-
-
-DAT_RETURN
-dapls_modify_qp_state ( IN ib_qp_handle_t      qp_handle,
-                       IN ib_qp_state_t        qp_state,
-                       IN struct ib_cm_handle  *cm_ptr );
-
-/* inline functions */
-STATIC _INLINE_ IB_HCA_NAME dapl_ib_convert_name (IN char *name)
-{
-       /* use ascii; name of local device */
-       return dapl_os_strdup(name);
-}
-
-STATIC _INLINE_ void dapl_ib_release_name (IN IB_HCA_NAME name)
-{
-       return;
-}
-
-/*
- *  Convert errno to DAT_RETURN values
- */
-STATIC _INLINE_ DAT_RETURN 
-dapl_convert_errno( IN int err, IN const char *str )
-{
-    if (!err)  return DAT_SUCCESS;
-       
-#if DAPL_DBG
-    if ((err != EAGAIN) && (err != ETIMEDOUT))
-       dapl_dbg_log (DAPL_DBG_TYPE_ERR," %s %s\n", str, strerror(err));
-#endif 
-
-    switch( err )
-    {
-       case EOVERFLOW  : return DAT_LENGTH_ERROR;
-       case EACCES     : return DAT_PRIVILEGES_VIOLATION;
-       case EPERM      : return DAT_PROTECTION_VIOLATION;                
-       case EINVAL     : return DAT_INVALID_HANDLE;
-       case EISCONN    : return DAT_INVALID_STATE | DAT_INVALID_STATE_EP_CONNECTED;
-       case ECONNREFUSED : return DAT_INVALID_STATE | DAT_INVALID_STATE_EP_NOTREADY;
-       case ETIMEDOUT  : return DAT_TIMEOUT_EXPIRED;
-       case ENETUNREACH: return DAT_INVALID_ADDRESS | DAT_INVALID_ADDRESS_UNREACHABLE;
-       case EADDRINUSE : return DAT_CONN_QUAL_IN_USE;
-       case EALREADY   : return DAT_INVALID_STATE | DAT_INVALID_STATE_EP_ACTCONNPENDING;
-       case ENOMEM     : return DAT_INSUFFICIENT_RESOURCES;
-        case EAGAIN    : return DAT_QUEUE_EMPTY;
-       case EINTR      : return DAT_INTERRUPTED_CALL;
-       case EAFNOSUPPORT : return DAT_INVALID_ADDRESS | DAT_INVALID_ADDRESS_MALFORMED;
-       case EFAULT     : 
-       default         : return DAT_INTERNAL_ERROR;
-    }
- }
-
-/*
- * Definitions required only for DAT 1.1 builds
- */
-#define IB_ACCESS_LOCAL_READ    IBV_ACCESS_LOCAL_WRITE
-#define IB_ACCESS_LOCAL_WRITE   IBV_ACCESS_LOCAL_WRITE
-#define IB_ACCESS_REMOTE_READ   IBV_ACCESS_REMOTE_READ
-#define IB_ACCESS_REMOTE_WRITE  IBV_ACCESS_REMOTE_WRITE
-#define IB_ACCESS_MW_BIND       IBV_ACCESS_LOCAL_WRITE
-#define IB_ACCESS_ATOMIC       
-
-#endif /*  _DAPL_IB_UTIL_H_ */
+/*\r
+ * This Software is licensed under one of the following licenses:\r
+ *\r
+ * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
+ *    available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/cpl.php.\r
+ *\r
+ * 2) under the terms of the "The BSD License" a copy of which is\r
+ *    available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/bsd-license.php.\r
+ *\r
+ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
+ *    copy of which is available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/gpl-license.php.\r
+ *\r
+ * Licensee has the right to choose one of the above licenses.\r
+ *\r
+ * Redistributions of source code must retain the above copyright\r
+ * notice and one of the license notices.\r
+ *\r
+ * Redistributions in binary form must reproduce both the above copyright\r
+ * notice, one of the license notices in the documentation\r
+ * and/or other materials provided with the distribution.\r
+ */\r
+\r
+#ifndef _DAPL_IB_UTIL_H_\r
+#define _DAPL_IB_UTIL_H_\r
+#define _OPENIB_SCM_ \r
+\r
+#include <infiniband/verbs.h>\r
+#include "openib_osd.h"\r
+#include "dapl_ib_common.h"\r
+\r
+struct ib_cm_handle\r
+{ \r
+       struct dapl_llist_entry entry;\r
+       DAPL_OS_LOCK            lock;\r
+       int                     state;\r
+       DAPL_SOCKET             socket;\r
+       struct dapl_hca         *hca;\r
+       struct dapl_sp          *sp;    \r
+       struct dapl_ep          *ep;\r
+       ib_qp_cm_t              dst;\r
+       unsigned char           p_data[256];    /* must follow ib_qp_cm_t */\r
+       struct ibv_ah           *ah;\r
+};\r
+\r
+typedef struct ib_cm_handle    *dp_ib_cm_handle_t;\r
+typedef dp_ib_cm_handle_t      ib_cm_srvc_handle_t;\r
+\r
+/* Definitions */\r
+#define IB_INVALID_HANDLE      NULL\r
+\r
+/* inline send rdma threshold */\r
+#define        INLINE_SEND_DEFAULT     200\r
+\r
+/* RC timer - retry count defaults */\r
+#define SCM_ACK_TIMER 16 /* 5 bits, 4.096us*2^ack_timer. 16== 268ms */\r
+#define SCM_ACK_RETRY 7  /* 3 bits, 7 * 268ms = 1.8 seconds */\r
+#define SCM_RNR_TIMER 12 /* 5 bits, 12 =.64ms, 28 =163ms, 31 =491ms */\r
+#define SCM_RNR_RETRY 7  /* 3 bits, 7 == infinite */\r
+#define SCM_IB_MTU    2048\r
+\r
+/* Global routing defaults */\r
+#define SCM_GLOBAL     0       /* global routing is disabled */\r
+#define SCM_HOP_LIMIT  0xff\r
+#define SCM_TCLASS     0\r
+\r
+/* CM private data areas */\r
+#define        IB_MAX_REQ_PDATA_SIZE   92\r
+#define        IB_MAX_REP_PDATA_SIZE   196\r
+#define        IB_MAX_REJ_PDATA_SIZE   148\r
+#define        IB_MAX_DREQ_PDATA_SIZE  220\r
+#define        IB_MAX_DREP_PDATA_SIZE  224\r
+#define        IB_MAX_RTU_PDATA_SIZE   224\r
+\r
+\r
+/* ib_hca_transport_t, specific to this implementation */\r
+typedef struct _ib_hca_transport\r
+{ \r
+       union ibv_gid           gid;\r
+       struct  ibv_device      *ib_dev;\r
+       ib_cq_handle_t          ib_cq_empty;\r
+       DAPL_OS_LOCK            cq_lock;        \r
+       int                     max_inline_send;\r
+       ib_thread_state_t       cq_state;\r
+       DAPL_OS_THREAD          cq_thread;\r
+       struct ibv_comp_channel *ib_cq;\r
+       int                     cr_state;\r
+       DAPL_OS_THREAD          thread;\r
+       DAPL_OS_LOCK            lock;   \r
+       struct dapl_llist_entry *list;  \r
+       ib_async_handler_t      async_unafiliated;\r
+       void                    *async_un_ctx;\r
+       ib_async_cq_handler_t   async_cq_error;\r
+       ib_async_dto_handler_t  async_cq;\r
+       ib_async_qp_handler_t   async_qp_error;\r
+       int                     rd_atom_in;\r
+       int                     rd_atom_out;\r
+       uint16_t                lid;\r
+       uint8_t                 ack_timer;\r
+       uint8_t                 ack_retry;\r
+       uint8_t                 rnr_timer;\r
+       uint8_t                 rnr_retry;\r
+       uint8_t                 global;\r
+       uint8_t                 hop_limit;\r
+       uint8_t                 tclass;\r
+       uint8_t                 mtu;\r
+       DAT_NAMED_ATTR          named_attr;\r
+       DAPL_SOCKET             scm[2];\r
+} ib_hca_transport_t;\r
+\r
+/* prototypes */\r
+void cr_thread(void *arg);\r
+int dapli_cq_thread_init(struct dapl_hca *hca_ptr);\r
+void dapli_cq_thread_destroy(struct dapl_hca *hca_ptr);\r
+DAT_RETURN dapli_socket_disconnect(dp_ib_cm_handle_t cm_ptr);\r
+void dapls_print_cm_list(IN DAPL_IA *ia_ptr);\r
+dp_ib_cm_handle_t dapls_ib_cm_create(DAPL_EP *ep);\r
+void dapls_ib_cm_free(dp_ib_cm_handle_t cm, DAPL_EP *ep);\r
+DAT_RETURN dapls_modify_qp_state(IN ib_qp_handle_t qp_handle,\r
+                                IN ib_qp_state_t qp_state,\r
+                                IN dp_ib_cm_handle_t cm);\r
+\r
+#endif /*  _DAPL_IB_UTIL_H_ */\r
diff --git a/branches/winverbs/ulp/dapl2/dapl/openib_scm/device.c b/branches/winverbs/ulp/dapl2/dapl/openib_scm/device.c
new file mode 100644 (file)
index 0000000..293e028
--- /dev/null
@@ -0,0 +1,412 @@
+/*\r
+ * This Software is licensed under one of the following licenses:\r
+ *\r
+ * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
+ *    available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/cpl.php.\r
+ *\r
+ * 2) under the terms of the "The BSD License" a copy of which is\r
+ *    available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/bsd-license.php.\r
+ *\r
+ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
+ *    copy of which is available from the Open Source Initiative, see\r
+ *    http://www.opensource.org/licenses/gpl-license.php.\r
+ *\r
+ * Licensee has the right to choose one of the above licenses.\r
+ *\r
+ * Redistributions of source code must retain the above copyright\r
+ * notice and one of the license notices.\r
+ *\r
+ * Redistributions in binary form must reproduce both the above copyright\r
+ * notice, one of the license notices in the documentation\r
+ * and/or other materials provided with the distribution.\r
+ */\r
+\r
+/***************************************************************************\r
+ *\r
+ *   Module:            uDAPL\r
+ *\r
+ *   Filename:          dapl_ib_util.c\r
+ *\r
+ *   Author:            Arlin Davis\r
+ *\r
+ *   Created:           3/10/2005\r
+ *\r
+ *   Description: \r
+ *\r
+ *   The uDAPL openib provider - init, open, close, utilities\r
+ *\r
+ ****************************************************************************\r
+ *                Source Control System Information\r
+ *\r
+ *    $Id: $\r
+ *\r
+ *     Copyright (c) 2005 Intel Corporation.  All rights reserved.\r
+ *\r
+ **************************************************************************/\r
+#ifdef RCSID\r
+static const char rcsid[] = "$Id:  $";\r
+#endif\r
+\r
+#include "openib_osd.h"\r
+#include "dapl.h"\r
+#include "dapl_adapter_util.h"\r
+#include "dapl_ib_util.h"\r
+#include "dapl_osd.h"\r
+\r
+#include <stdlib.h>\r
+\r
+static int32_t create_cr_pipe(IN DAPL_HCA * hca_ptr)\r
+{\r
+       DAPL_SOCKET listen_socket;\r
+       struct sockaddr_in addr;\r
+       socklen_t addrlen = sizeof(addr);\r
+       int ret;\r
+\r
+       listen_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);\r
+       if (listen_socket == DAPL_INVALID_SOCKET)\r
+               return 1;\r
+\r
+       memset(&addr, 0, sizeof addr);\r
+       addr.sin_family = AF_INET;\r
+       addr.sin_addr.s_addr = htonl(0x7f000001);\r
+       ret = bind(listen_socket, (struct sockaddr *)&addr, sizeof addr);\r
+       if (ret)\r
+               goto err1;\r
+\r
+       ret = getsockname(listen_socket, (struct sockaddr *)&addr, &addrlen);\r
+       if (ret)\r
+               goto err1;\r
+\r
+       ret = listen(listen_socket, 0);\r
+       if (ret)\r
+               goto err1;\r
+\r
+       hca_ptr->ib_trans.scm[1] = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);\r
+       if (hca_ptr->ib_trans.scm[1] == DAPL_INVALID_SOCKET)\r
+               goto err1;\r
+\r
+       ret = connect(hca_ptr->ib_trans.scm[1], \r
+                     (struct sockaddr *)&addr, sizeof(addr));\r
+       if (ret)\r
+               goto err2;\r
+\r
+       hca_ptr->ib_trans.scm[0] = accept(listen_socket, NULL, NULL);\r
+       if (hca_ptr->ib_trans.scm[0] == DAPL_INVALID_SOCKET)\r
+               goto err2;\r
+\r
+       closesocket(listen_socket);\r
+       return 0;\r
+\r
+      err2:\r
+       closesocket(hca_ptr->ib_trans.scm[1]);\r
+      err1:\r
+       closesocket(listen_socket);\r
+       return 1;\r
+}\r
+\r
+static void destroy_cr_pipe(IN DAPL_HCA * hca_ptr)\r
+{\r
+       closesocket(hca_ptr->ib_trans.scm[0]);\r
+       closesocket(hca_ptr->ib_trans.scm[1]);\r
+}\r
+\r
+\r
+/*\r
+ * dapls_ib_init, dapls_ib_release\r
+ *\r
+ * Initialize Verb related items for device open\r
+ *\r
+ * Input:\r
+ *     none\r
+ *\r
+ * Output:\r
+ *     none\r
+ *\r
+ * Returns:\r
+ *     0 success, -1 error\r
+ *\r
+ */\r
+int32_t dapls_ib_init(void)\r
+{\r
+       return 0;\r
+}\r
+\r
+int32_t dapls_ib_release(void)\r
+{\r
+       return 0;\r
+}\r
+\r
+#if defined(_WIN64) || defined(_WIN32)\r
+int dapls_config_comp_channel(struct ibv_comp_channel *channel)\r
+{\r
+       return 0;\r
+}\r
+#else                          // _WIN64 || WIN32\r
+int dapls_config_comp_channel(struct ibv_comp_channel *channel)\r
+{\r
+       int opts;\r
+\r
+       opts = fcntl(channel->fd, F_GETFL);     /* uCQ */\r
+       if (opts < 0 || fcntl(channel->fd, F_SETFL, opts | O_NONBLOCK) < 0) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " dapls_create_comp_channel: fcntl on ib_cq->fd %d ERR %d %s\n",\r
+                        channel->fd, opts, strerror(errno));\r
+               return errno;\r
+       }\r
+\r
+       return 0;\r
+}\r
+#endif\r
+\r
+/*\r
+ * dapls_ib_open_hca\r
+ *\r
+ * Open HCA\r
+ *\r
+ * Input:\r
+ *      *hca_name         pointer to provider device name\r
+ *      *ib_hca_handle_p  pointer to provide HCA handle\r
+ *\r
+ * Output:\r
+ *      none\r
+ *\r
+ * Return:\r
+ *      DAT_SUCCESS\r
+ *      dapl_convert_errno\r
+ *\r
+ */\r
+DAT_RETURN dapls_ib_open_hca(IN IB_HCA_NAME hca_name, IN DAPL_HCA * hca_ptr)\r
+{\r
+       struct ibv_device **dev_list;\r
+       struct ibv_port_attr port_attr;\r
+       int i;\r
+       DAT_RETURN dat_status;\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                    " open_hca: %s - %p\n", hca_name, hca_ptr);\r
+\r
+       /* get the IP address of the device */\r
+       dat_status = getlocalipaddr((DAT_SOCK_ADDR *) &hca_ptr->hca_address,\r
+                                   sizeof(DAT_SOCK_ADDR6));\r
+       if (dat_status != DAT_SUCCESS)\r
+               return dat_status;\r
+\r
+       /* Get list of all IB devices, find match, open */\r
+       dev_list = ibv_get_device_list(NULL);\r
+       if (!dev_list) {\r
+               dapl_dbg_log(DAPL_DBG_TYPE_ERR,\r
+                            " open_hca: ibv_get_device_list() failed\n",\r
+                            hca_name);\r
+               return DAT_INTERNAL_ERROR;\r
+       }\r
+\r
+       for (i = 0; dev_list[i]; ++i) {\r
+               hca_ptr->ib_trans.ib_dev = dev_list[i];\r
+               if (!strcmp(ibv_get_device_name(hca_ptr->ib_trans.ib_dev),\r
+                           hca_name))\r
+                       goto found;\r
+       }\r
+\r
+       dapl_log(DAPL_DBG_TYPE_ERR,\r
+                " open_hca: device %s not found\n", hca_name);\r
+       goto err;\r
+\r
+      found:\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " open_hca: Found dev %s %016llx\n",\r
+                    ibv_get_device_name(hca_ptr->ib_trans.ib_dev),\r
+                    (unsigned long long)\r
+                    ntohll(ibv_get_device_guid(hca_ptr->ib_trans.ib_dev)));\r
+\r
+       hca_ptr->ib_hca_handle = ibv_open_device(hca_ptr->ib_trans.ib_dev);\r
+       if (!hca_ptr->ib_hca_handle) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " open_hca: dev open failed for %s, err=%s\n",\r
+                        ibv_get_device_name(hca_ptr->ib_trans.ib_dev),\r
+                        strerror(errno));\r
+               goto err;\r
+       }\r
+\r
+       /* get lid for this hca-port, network order */\r
+       if (ibv_query_port(hca_ptr->ib_hca_handle,\r
+                          (uint8_t) hca_ptr->port_num, &port_attr)) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " open_hca: get lid ERR for %s, err=%s\n",\r
+                        ibv_get_device_name(hca_ptr->ib_trans.ib_dev),\r
+                        strerror(errno));\r
+               goto err;\r
+       } else {\r
+               hca_ptr->ib_trans.lid = htons(port_attr.lid);\r
+       }\r
+\r
+       /* get gid for this hca-port, network order */\r
+       if (ibv_query_gid(hca_ptr->ib_hca_handle,\r
+                         (uint8_t) hca_ptr->port_num,\r
+                         0, &hca_ptr->ib_trans.gid)) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " open_hca: query GID ERR for %s, err=%s\n",\r
+                        ibv_get_device_name(hca_ptr->ib_trans.ib_dev),\r
+                        strerror(errno));\r
+               goto err;\r
+       }\r
+\r
+       /* set RC tunables via enviroment or default */\r
+       hca_ptr->ib_trans.max_inline_send =\r
+           dapl_os_get_env_val("DAPL_MAX_INLINE", INLINE_SEND_DEFAULT);\r
+       hca_ptr->ib_trans.ack_retry =\r
+           dapl_os_get_env_val("DAPL_ACK_RETRY", SCM_ACK_RETRY);\r
+       hca_ptr->ib_trans.ack_timer =\r
+           dapl_os_get_env_val("DAPL_ACK_TIMER", SCM_ACK_TIMER);\r
+       hca_ptr->ib_trans.rnr_retry =\r
+           dapl_os_get_env_val("DAPL_RNR_RETRY", SCM_RNR_RETRY);\r
+       hca_ptr->ib_trans.rnr_timer =\r
+           dapl_os_get_env_val("DAPL_RNR_TIMER", SCM_RNR_TIMER);\r
+       hca_ptr->ib_trans.global =\r
+           dapl_os_get_env_val("DAPL_GLOBAL_ROUTING", SCM_GLOBAL);\r
+       hca_ptr->ib_trans.hop_limit =\r
+           dapl_os_get_env_val("DAPL_HOP_LIMIT", SCM_HOP_LIMIT);\r
+       hca_ptr->ib_trans.tclass =\r
+           dapl_os_get_env_val("DAPL_TCLASS", SCM_TCLASS);\r
+       hca_ptr->ib_trans.mtu =\r
+           dapl_ib_mtu(dapl_os_get_env_val("DAPL_IB_MTU", SCM_IB_MTU));\r
+\r
+#ifndef CQ_WAIT_OBJECT\r
+       /* initialize cq_lock */\r
+       dat_status = dapl_os_lock_init(&hca_ptr->ib_trans.cq_lock);\r
+       if (dat_status != DAT_SUCCESS) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " open_hca: failed to init cq_lock\n");\r
+               goto bail;\r
+       }\r
+       /* EVD events without direct CQ channels, non-blocking */\r
+       hca_ptr->ib_trans.ib_cq =\r
+           ibv_create_comp_channel(hca_ptr->ib_hca_handle);\r
+       if (hca_ptr->ib_trans.ib_cq == NULL) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " open_hca: ibv_create_comp_channel ERR %s\n",\r
+                        strerror(errno));\r
+               goto bail;\r
+       }\r
+\r
+       if (dapls_config_comp_channel(hca_ptr->ib_trans.ib_cq)) {\r
+               goto bail;\r
+       }\r
+\r
+       if (dapli_cq_thread_init(hca_ptr)) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " open_hca: cq_thread_init failed for %s\n",\r
+                        ibv_get_device_name(hca_ptr->ib_trans.ib_dev));\r
+               goto bail;\r
+       }\r
+#endif                         /* CQ_WAIT_OBJECT */\r
+\r
+       /* initialize cr_list lock */\r
+       dat_status = dapl_os_lock_init(&hca_ptr->ib_trans.lock);\r
+       if (dat_status != DAT_SUCCESS) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " open_hca: failed to init cr_list lock\n");\r
+               goto bail;\r
+       }\r
+\r
+       /* initialize CM list for listens on this HCA */\r
+       dapl_llist_init_head(&hca_ptr->ib_trans.list);\r
+\r
+       /* initialize pipe, user level wakeup on select */\r
+       if (create_cr_pipe(hca_ptr)) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " open_hca: failed to init cr pipe - %s\n",\r
+                        strerror(errno));\r
+               goto bail;\r
+       }\r
+\r
+       /* create thread to process inbound connect request */\r
+       hca_ptr->ib_trans.cr_state = IB_THREAD_INIT;\r
+       dat_status = dapl_os_thread_create(cr_thread,\r
+                                          (void *)hca_ptr,\r
+                                          &hca_ptr->ib_trans.thread);\r
+       if (dat_status != DAT_SUCCESS) {\r
+               dapl_log(DAPL_DBG_TYPE_ERR,\r
+                        " open_hca: failed to create thread\n");\r
+               goto bail;\r
+       }\r
+\r
+       /* wait for thread */\r
+       while (hca_ptr->ib_trans.cr_state != IB_THREAD_RUN) {\r
+               dapl_os_sleep_usec(2000);\r
+       }\r
+\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                    " open_hca: devname %s, port %d, hostname_IP %s\n",\r
+                    ibv_get_device_name(hca_ptr->ib_trans.ib_dev),\r
+                    hca_ptr->port_num, inet_ntoa(((struct sockaddr_in *)\r
+                                                  &hca_ptr->hca_address)->\r
+                                                 sin_addr));\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                    " open_hca: LID 0x%x GID Subnet 0x" F64x " ID 0x" F64x\r
+                    "\n", ntohs(hca_ptr->ib_trans.lid), (unsigned long long)\r
+                    htonll(hca_ptr->ib_trans.gid.global.subnet_prefix),\r
+                    (unsigned long long)htonll(hca_ptr->ib_trans.gid.global.\r
+                                               interface_id));\r
+\r
+       ibv_free_device_list(dev_list);\r
+       return dat_status;\r
+\r
+      bail:\r
+       ibv_close_device(hca_ptr->ib_hca_handle);\r
+       hca_ptr->ib_hca_handle = IB_INVALID_HANDLE;\r
+      err:\r
+       ibv_free_device_list(dev_list);\r
+       return DAT_INTERNAL_ERROR;\r
+}\r
+\r
+/*\r
+ * dapls_ib_close_hca\r
+ *\r
+ * Open HCA\r
+ *\r
+ * Input:\r
+ *      DAPL_HCA   provide CA handle\r
+ *\r
+ * Output:\r
+ *      none\r
+ *\r
+ * Return:\r
+ *      DAT_SUCCESS\r
+ *     dapl_convert_errno \r
+ *\r
+ */\r
+DAT_RETURN dapls_ib_close_hca(IN DAPL_HCA * hca_ptr)\r
+{\r
+       dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " close_hca: %p\n", hca_ptr);\r
+\r
+#ifndef CQ_WAIT_OBJECT\r
+       dapli_cq_thread_destroy(hca_ptr);\r
+       dapl_os_lock_destroy(&hca_ptr->ib_trans.cq_lock);\r
+#endif                         /* CQ_WAIT_OBJECT */\r
+\r
+       if (hca_ptr->ib_hca_handle != IB_INVALID_HANDLE) {\r
+               if (ibv_close_device(hca_ptr->ib_hca_handle))\r
+                       return (dapl_convert_errno(errno, "ib_close_device"));\r
+               hca_ptr->ib_hca_handle = IB_INVALID_HANDLE;\r
+       }\r
+\r
+       /* destroy cr_thread and lock */\r
+       hca_ptr->ib_trans.cr_state = IB_THREAD_CANCEL;\r
+       if (send(hca_ptr->ib_trans.scm[1], "w", sizeof "w", 0) == -1)\r
+               dapl_log(DAPL_DBG_TYPE_UTIL,\r
+                        " thread_destroy: thread wakeup err = %s\n",\r
+                        strerror(errno));\r
+       while (hca_ptr->ib_trans.cr_state != IB_THREAD_EXIT) {\r
+               dapl_dbg_log(DAPL_DBG_TYPE_UTIL,\r
+                            " close_hca: waiting for cr_thread\n");\r
+               if (send(hca_ptr->ib_trans.scm[1], "w", sizeof "w", 0) == -1)\r
+                       dapl_log(DAPL_DBG_TYPE_UTIL,\r
+                                " thread_destroy: thread wakeup err = %s\n",\r
+                                strerror(errno));\r
+               dapl_os_sleep_usec(2000);\r
+       }\r
+       dapl_os_lock_destroy(&hca_ptr->ib_trans.lock);\r
+       destroy_cr_pipe(hca_ptr); /* no longer need pipe */\r
+       return (DAT_SUCCESS);\r
+}\r
index 235a82e21aab80fb2d546c456f33216281ac9921..41001d57e7e8dbdea512c5a9052708259bc33597 100644 (file)
@@ -1,21 +1,21 @@
-#ifndef OPENIB_OSD_H
-#define OPENIB_OSD_H
-
-#include <endian.h>
-#include <netinet/in.h>
-
-#if __BYTE_ORDER == __BIG_ENDIAN
-#define htonll(x) (x)
-#define ntohll(x) (x)
-#elif __BYTE_ORDER == __LITTLE_ENDIAN
-#define htonll(x)  bswap_64(x)
-#define ntohll(x)  bswap_64(x)
-#endif
-
-#define DAPL_SOCKET int
-#define DAPL_INVALID_SOCKET -1
-#define DAPL_FD_SETSIZE 8192
-
-#define closesocket close
-
-#endif // OPENIB_OSD_H
+#ifndef OPENIB_OSD_H\r
+#define OPENIB_OSD_H\r
+\r
+#include <endian.h>\r
+#include <netinet/in.h>\r
+\r
+#if __BYTE_ORDER == __BIG_ENDIAN\r
+#define htonll(x) (x)\r
+#define ntohll(x) (x)\r
+#elif __BYTE_ORDER == __LITTLE_ENDIAN\r
+#define htonll(x)  bswap_64(x)\r
+#define ntohll(x)  bswap_64(x)\r
+#endif\r
+\r
+#define DAPL_SOCKET int\r
+#define DAPL_INVALID_SOCKET -1\r
+#define DAPL_FD_SETSIZE 16384\r
+\r
+#define closesocket close\r
+\r
+#endif // OPENIB_OSD_H\r
index 7eb3df36ddb56c54e7f48265a63e749268a6a885..31fe32f1f19dda8fbd632acdba9b108a073b9502 100644 (file)
@@ -1,35 +1,39 @@
-#ifndef OPENIB_OSD_H
-#define OPENIB_OSD_H
-
-#ifndef FD_SETSIZE
-#define FD_SETSIZE 1024 /* Set before including winsock2 - see select help */
-#define DAPL_FD_SETSIZE FD_SETSIZE
-#endif
-
-#include <winsock2.h>
-#include <ws2tcpip.h>
-#include <io.h>
-#include <fcntl.h>
-
-#define ntohll _byteswap_uint64
-#define htonll _byteswap_uint64
-
-#define DAPL_SOCKET SOCKET
-#define DAPL_INVALID_SOCKET INVALID_SOCKET
-
-/* allow casting to WSABUF */
-struct iovec
-{
-       u_long iov_len;
-       char FAR* iov_base;
-};
-
-static int writev(DAPL_SOCKET s, struct iovec *vector, int count)
-{
-       int len, ret;
-
-       ret = WSASend(s, (WSABUF *) vector, count, &len, 0, NULL, NULL);
-       return ret ? ret : len;
-}
-
-#endif // OPENIB_OSD_H
+#ifndef OPENIB_OSD_H\r
+#define OPENIB_OSD_H\r
+\r
+#if defined(FD_SETSIZE) && FD_SETSIZE != 1024\r
+#undef FD_SETSIZE\r
+#undef DAPL_FD_SETSIZE\r
+#endif\r
+\r
+#define FD_SETSIZE 1024 /* Set before including winsock2 - see select help */\r
+#define DAPL_FD_SETSIZE FD_SETSIZE\r
+\r
+#include <winsock2.h>\r
+#include <ws2tcpip.h>\r
+#include <io.h>\r
+#include <fcntl.h>\r
+\r
+#define ntohll _byteswap_uint64\r
+#define htonll _byteswap_uint64\r
+\r
+#define DAPL_SOCKET SOCKET\r
+#define DAPL_INVALID_SOCKET INVALID_SOCKET\r
+#define SHUT_RDWR SD_BOTH\r
+\r
+/* allow casting to WSABUF */\r
+struct iovec\r
+{\r
+       u_long iov_len;\r
+       char FAR* iov_base;\r
+};\r
+\r
+static int writev(DAPL_SOCKET s, struct iovec *vector, int count)\r
+{\r
+       int len, ret;\r
+\r
+       ret = WSASend(s, (WSABUF *) vector, count, &len, 0, NULL, NULL);\r
+       return ret ? ret : len;\r
+}\r
+\r
+#endif // OPENIB_OSD_H\r
index 2c082b1b295347161d2c66e0411b7be5909555ca..59df1de1cfb3a12e362539594cb936b135141087 100644 (file)
  * 2.0.3 - Add query/print counter support for IA, EP, and EVD's 
  *         dat_query_counters(), dat_print_counters()
  *
+ * 2.0.4 - Add DAT_IB_UD_CONNECTION_REJECT_EVENT extended UD event
+ *
  */
-#define DAT_IB_EXTENSION_VERSION       203     /* 2.0.3 */
+#define DAT_IB_EXTENSION_VERSION       204     /* 2.0.4 */
 #define DAT_ATTR_COUNTERS              "DAT_COUNTERS"
 #define DAT_IB_ATTR_FETCH_AND_ADD      "DAT_IB_FETCH_AND_ADD"
 #define DAT_IB_ATTR_CMP_AND_SWAP       "DAT_IB_CMP_AND_SWAP"
@@ -89,7 +91,8 @@ typedef enum dat_ib_event_number
 {
        DAT_IB_DTO_EVENT = DAT_IB_EXTENSION_RANGE_BASE,
        DAT_IB_UD_CONNECTION_REQUEST_EVENT,
-       DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED
+       DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED,
+       DAT_IB_UD_CONNECTION_REJECT_EVENT
 
 } DAT_IB_EVENT_NUMBER;
 
index 42e3773440d1f59c932119961e4e055d5e9f0d57..32b29ff74c2bd20e4ac83fa41bae17a092c6e0ba 100644 (file)
@@ -51,6 +51,7 @@ dat_rsp_create
 dat_rsp_free
 dat_rsp_query
 dat_strerror
+dat_get_handle_type
 dats_get_ia_handle
 #ifdef DAT_EXTENSIONS
 dat_extension_op
index 9cbb202137e051fd9aa92f051b606fb82e548931..c445d5a875124077ed37a32a0e69a9ae802cebb6 100644 (file)
@@ -308,7 +308,7 @@ if "%T%" == "interop" (
 )\r
 \r
 if "%T%" == "stop" (\r
-    %DT% -T Q -s %S% -D %D% > nul\r
+    %DT% -T Q -s %S% -D %D%\r
     goto rxt\r
 )\r
 \r
index 1d3760d037a3e72bda7cc69a9967a0ead230eb4b..c876d413fe35dd03692b48f06305aaff663149b8 100644 (file)
@@ -37,10 +37,10 @@ if "%DEV%" == ""    set DEV=%1
 rem '-D' enables full debug output?\r
 rem '-D hex-bit-mask' enables selective debug output - see manual.htm for details.\r
 if "%2" == "-D" (\r
-    if "%2" == "" (\r
+    if "%3" == "" (\r
         set X=0xfffff\r
     ) else (\r
-        set X=%2\r
+        set X=%3\r
     )\r
 ) else ( set X= )\r
 \r
index a023c19d7297e73815ae3c4c2ac4f3a77b97fef7..6d92345e3d9887946890ce424db47f9a1c15d153 100644 (file)
@@ -1,14 +1,18 @@
-bin_PROGRAMS = dtest
-dtest_SOURCES = dtest.c
-dtest_CFLAGS = -g -Wall -D_GNU_SOURCE 
-
-if EXT_TYPE_IB
-bin_PROGRAMS += dtestx
-dtestx_SOURCES = dtestx.c
-dtestx_CFLAGS = -g -Wall -D_GNU_SOURCE -DDAT_EXTENSIONS
-dtestx_LDADD = $(top_builddir)/dat/udat/libdat2.la
-endif
-
-INCLUDES =  -I $(srcdir)/../../dat/include 
-dtest_LDADD = $(top_builddir)/dat/udat/libdat2.la
-
+bin_PROGRAMS = dtest dtestcm\r
+dtest_SOURCES = dtest.c\r
+dtest_CFLAGS = -g -Wall -D_GNU_SOURCE \r
+\r
+dtestcm_SOURCES = dtestcm.c\r
+dtestcm_CFLAGS = -g -Wall -D_GNU_SOURCE \r
+\r
+if EXT_TYPE_IB\r
+bin_PROGRAMS += dtestx\r
+dtestx_SOURCES = dtestx.c\r
+dtestx_CFLAGS = -g -Wall -D_GNU_SOURCE -DDAT_EXTENSIONS\r
+dtestx_LDADD = $(top_builddir)/dat/udat/libdat2.la\r
+endif\r
+\r
+INCLUDES =  -I $(srcdir)/../../dat/include \r
+dtest_LDADD = $(top_builddir)/dat/udat/libdat2.la\r
+dtestcm_LDADD = $(top_builddir)/dat/udat/libdat2.la\r
+\r
index f1f0f2b57df27f103d9f9618c7e8600c785695f8..77d78b2bbf900724a9c9f767ab1b6a278ab680ec 100644 (file)
@@ -630,19 +630,6 @@ complete:
        return (0);
 }
 
-#if defined(_WIN32) || defined(_WIN64)
-
-void gettimeofday(struct timeval *t, char *jnk)
-{
-       SYSTEMTIME now;
-       GetLocalTime(&now);
-       t->tv_sec = now.wMinute * 60;
-       t->tv_sec += now.wSecond;
-       t->tv_usec = now.wMilliseconds;
-}
-
-#endif
-
 double get_time(void)
 {
        struct timeval tp;
diff --git a/branches/winverbs/ulp/dapl2/test/dtest/dtestcm.c b/branches/winverbs/ulp/dapl2/test/dtest/dtestcm.c
new file mode 100644 (file)
index 0000000..b6dcccf
--- /dev/null
@@ -0,0 +1,1112 @@
+/*\r
+ * Copyright (c) 2009 Intel Corporation.  All rights reserved.\r
+ *\r
+ * This software is available to you under a choice of one of two\r
+ * licenses.  You may choose to be licensed under the terms of the GNU\r
+ * General Public License (GPL) Version 2, available from the file\r
+ * COPYING in the main directory of this source tree, or the\r
+ * OpenIB.org BSD license below:\r
+ *\r
+ *     Redistribution and use in source and binary forms, with or\r
+ *     without modification, are permitted provided that the following\r
+ *     conditions are met:\r
+ *\r
+ *      - Redistributions of source code must retain the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer.\r
+ *\r
+ *      - Redistributions in binary form must reproduce the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer in the documentation and/or other materials\r
+ *        provided with the distribution.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
+ * SOFTWARE.\r
+ *\r
+ * $Id: $\r
+ */\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+\r
+#ifdef DAPL_PROVIDER\r
+#undef DAPL_PROVIDER\r
+#endif\r
+\r
+#if defined(_WIN32) || defined(_WIN64)\r
+\r
+#include <windows.h>\r
+#include <winsock2.h>\r
+#include <ws2tcpip.h>\r
+#include <io.h>\r
+#include <process.h>\r
+#include <complib/cl_types.h>\r
+#include "..\..\..\..\etc\user\getopt.c"\r
+\r
+#define F64x "%I64x"\r
+#define F64d "%I64d"\r
+\r
+#ifdef DBG\r
+#define DAPL_PROVIDER "ibnic0v2d"\r
+#else\r
+#define DAPL_PROVIDER "ibnic0v2"\r
+#endif\r
+\r
+#define ntohll _byteswap_uint64\r
+#define htonll _byteswap_uint64\r
+\r
+#else // _WIN32 || _WIN64\r
+\r
+#include <endian.h>\r
+#include <byteswap.h>\r
+#include <netdb.h>\r
+#include <sys/types.h>\r
+#include <sys/socket.h>\r
+#include <sys/time.h>\r
+#include <netinet/in.h>\r
+#include <netinet/tcp.h>\r
+#include <arpa/inet.h>\r
+#include <sys/mman.h>\r
+#include <getopt.h>\r
+#include <inttypes.h>\r
+#include <unistd.h>\r
+\r
+#define DAPL_PROVIDER "ofa-v2-mlx4_0-1"\r
+\r
+#define F64x "%"PRIx64""\r
+#define F64d "%"PRId64""\r
+\r
+\r
+#if __BYTE_ORDER == __BIG_ENDIAN\r
+#define htonll(x) (x)\r
+#define ntohll(x) (x)\r
+#elif __BYTE_ORDER == __LITTLE_ENDIAN\r
+#define htonll(x)  bswap_64(x)\r
+#define ntohll(x)  bswap_64(x)\r
+#endif\r
+\r
+#endif // _WIN32 || _WIN64\r
+\r
+#define MAX_POLLING_CNT 50000\r
+\r
+/* Header files needed for DAT/uDAPL */\r
+#include    "dat2/udat.h"\r
+#include    "dat2/dat_ib_extensions.h"\r
+\r
+/* definitions */\r
+#define SERVER_CONN_QUAL  45248\r
+#define CONN_TIMEOUT      (1000*1000*100)\r
+#define CR_TIMEOUT       DAT_TIMEOUT_INFINITE\r
+\r
+/* Global DAT vars */\r
+static DAT_IA_HANDLE h_ia = DAT_HANDLE_NULL;\r
+static DAT_PZ_HANDLE h_pz = DAT_HANDLE_NULL;\r
+static DAT_EP_HANDLE *h_ep;\r
+static DAT_PSP_HANDLE *h_psp;\r
+static DAT_CR_HANDLE h_cr = DAT_HANDLE_NULL;\r
+\r
+static DAT_EVD_HANDLE h_async_evd = DAT_HANDLE_NULL;\r
+static DAT_EVD_HANDLE h_dto_req_evd = DAT_HANDLE_NULL;\r
+static DAT_EVD_HANDLE h_dto_rcv_evd = DAT_HANDLE_NULL;\r
+static DAT_EVD_HANDLE h_cr_evd = DAT_HANDLE_NULL;\r
+static DAT_EVD_HANDLE h_conn_evd = DAT_HANDLE_NULL;\r
+\r
+static DAT_EP_ATTR ep_attr;\r
+char hostname[256] = { 0 };\r
+char provider[64] = DAPL_PROVIDER;\r
+char addr_str[INET_ADDRSTRLEN];\r
+\r
+int status;\r
+\r
+/* timers */\r
+double start, stop, total_us, total_sec;\r
+\r
+struct dt_time {\r
+       double total;\r
+       double open;\r
+       double reg;\r
+       double unreg;\r
+       double pzc;\r
+       double pzf;\r
+       double evdc;\r
+       double evdf;\r
+       double cnoc;\r
+       double cnof;\r
+       double epc;\r
+       double epf;\r
+       double rtt;\r
+       double close;\r
+       double conn;\r
+};\r
+\r
+struct dt_time time;\r
+\r
+/* defaults */\r
+static int connected = 0;\r
+static int multi_listens = 0;\r
+static int ud_test = 0;\r
+static int server = 1;\r
+static int waiting = 0;\r
+static int verbose = 0;\r
+static int cr_poll_count = 0;\r
+static int conn_poll_count = 0;\r
+static int delay = 0;\r
+static int connections = 1000;\r
+static int burst = 100;\r
+static int port_id = SERVER_CONN_QUAL;\r
+\r
+/* forward prototypes */\r
+const char *DT_RetToString(DAT_RETURN ret_value);\r
+const char *DT_EventToSTr(DAT_EVENT_NUMBER event_code);\r
+void print_usage(void);\r
+double get_time(void);\r
+DAT_RETURN conn_client(void);\r
+DAT_RETURN conn_server(void);\r
+DAT_RETURN disconnect_eps(void);\r
+DAT_RETURN create_events(void);\r
+DAT_RETURN destroy_events(void);\r
+\r
+#define LOGPRINTF if (verbose) printf\r
+\r
+void flush_evds(void)\r
+{\r
+       DAT_EVENT event;\r
+\r
+       /* Flush async error queue */\r
+       printf(" ERR: Checking ASYNC EVD...\n");\r
+       while (dat_evd_dequeue(h_async_evd, &event) == DAT_SUCCESS) {\r
+               printf(" ASYNC EVD ENTRY: handle=%p reason=%d\n",\r
+                       event.event_data.asynch_error_event_data.dat_handle,\r
+                       event.event_data.asynch_error_event_data.reason);\r
+       }\r
+}\r
+\r
+int main(int argc, char **argv)\r
+{\r
+       int i, c, len;\r
+       DAT_RETURN ret;\r
+       \r
+       /* parse arguments */\r
+       while ((c = getopt(argc, argv, "smwvub:c:d:h:P:p:")) != -1) {\r
+               switch (c) {\r
+               case 's':\r
+                       server = 1;\r
+                       break;\r
+               case 'm':\r
+                       multi_listens = 1;\r
+                       break;\r
+               case 'w':\r
+                       waiting = 1;\r
+                       break;\r
+               case 'u':\r
+                       ud_test = 1;\r
+                       break;\r
+               case 'c':\r
+                       connections = atoi(optarg);\r
+                       break;\r
+               case 'p':\r
+                       port_id = atoi(optarg);\r
+                       break;\r
+               case 'v':\r
+                       verbose = 1;\r
+                       fflush(stdout);\r
+                       break;\r
+               case 'd':\r
+                       delay = atoi(optarg);\r
+                       break;\r
+               case 'b':\r
+                       burst = atoi(optarg);\r
+                       break;\r
+               case 'h':\r
+                       server = 0;\r
+                       strcpy(hostname, optarg);\r
+                       break;\r
+               case 'P':\r
+                       strcpy(provider, optarg);\r
+                       break;\r
+               default:\r
+                       print_usage();\r
+                       exit(-12);\r
+               }\r
+       }\r
+\r
+#if defined(_WIN32) || defined(_WIN64)\r
+       {\r
+               WSADATA wsaData;\r
+\r
+               i = WSAStartup(MAKEWORD(2, 2), &wsaData);\r
+               if (i != 0) {\r
+                       printf("%s WSAStartup(2.2) failed? (0x%x)\n", argv[0],\r
+                              i);\r
+                       fflush(stdout);\r
+                       exit(1);\r
+               }\r
+       }\r
+#endif\r
+\r
+       if (!server) {\r
+               printf(" Running client on %s with %d %s connections\n", \r
+                       provider, connections, ud_test ? "UD" : "RC");\r
+       } else {\r
+               printf(" Running server on %s with %d %s connections\n", \r
+                       provider, connections, ud_test ? "UD" : "RC");\r
+       }\r
+       fflush(stdout);\r
+       \r
+       if (burst > connections)\r
+               burst = connections;\r
+\r
+       \r
+       /* allocate EP handles for all connections */\r
+       h_ep = (DAT_EP_HANDLE*)malloc(connections * sizeof(DAT_EP_HANDLE));\r
+       if (h_ep == NULL) {     \r
+               perror("malloc ep");\r
+               exit(1);\r
+       }\r
+       memset(h_ep, 0, (burst * sizeof(DAT_PSP_HANDLE)));\r
+       \r
+       /* allocate PSP handles, check for multi-listens */\r
+       if (multi_listens)\r
+               len = burst * sizeof(DAT_PSP_HANDLE);\r
+       else\r
+               len = sizeof(DAT_PSP_HANDLE);\r
+\r
+       h_psp = (DAT_PSP_HANDLE*)malloc(len);\r
+       if (h_psp == NULL) {    \r
+               perror("malloc psp");\r
+               exit(1);\r
+       }\r
+       memset(h_psp, 0, len);\r
+       memset(&time, 0, sizeof(struct dt_time));\r
+\r
+       /* dat_ia_open, dat_pz_create */\r
+       h_async_evd = DAT_HANDLE_NULL;\r
+       start = get_time();\r
+       ret = dat_ia_open(provider, 8, &h_async_evd, &h_ia);\r
+       stop = get_time();\r
+       time.open += ((stop - start) * 1.0e6);\r
+       if (ret != DAT_SUCCESS) {\r
+               fprintf(stderr, " Error Adaptor open: %s\n",\r
+                       DT_RetToString(ret));\r
+               exit(1);\r
+       } else\r
+               LOGPRINTF(" Opened Interface Adaptor\n");\r
+\r
+       /* Create Protection Zone */\r
+       start = get_time();\r
+       LOGPRINTF(" Create Protection Zone\n");\r
+       ret = dat_pz_create(h_ia, &h_pz);\r
+       stop = get_time();\r
+       time.pzc += ((stop - start) * 1.0e6);\r
+       if (ret != DAT_SUCCESS) {\r
+               fprintf(stderr, " Error creating Protection Zone: %s\n",\r
+                       DT_RetToString(ret));\r
+               exit(1);\r
+       } else\r
+               LOGPRINTF(" Created Protection Zone\n");\r
+\r
+       LOGPRINTF(" Create events\n");\r
+       ret = create_events();\r
+       if (ret != DAT_SUCCESS) {\r
+               fprintf(stderr, " Error creating events: %s\n",\r
+                       DT_RetToString(ret));\r
+               goto cleanup;\r
+       } else {\r
+               LOGPRINTF(" Create events done\n");\r
+       }\r
+\r
+       /* create EP */\r
+       memset(&ep_attr, 0, sizeof(ep_attr));\r
+       if (ud_test) {\r
+               ep_attr.service_type = DAT_IB_SERVICE_TYPE_UD;\r
+               ep_attr.max_message_size = 2048;\r
+       } else {\r
+               ep_attr.service_type = DAT_SERVICE_TYPE_RC;\r
+               ep_attr.max_rdma_size = 0x10000;\r
+               ep_attr.max_rdma_read_in = 4;\r
+               ep_attr.max_rdma_read_out = 4;\r
+       }\r
+       ep_attr.max_recv_dtos = 1;\r
+       ep_attr.max_request_dtos = 1;\r
+       ep_attr.max_recv_iov = 1;\r
+       ep_attr.max_request_iov = 1;\r
+       ep_attr.request_completion_flags = DAT_COMPLETION_DEFAULT_FLAG;\r
+       \r
+       start = get_time();\r
+       for (i = 0; i < connections; i++) {\r
+               ret = dat_ep_create(h_ia, h_pz, h_dto_rcv_evd,\r
+                                   h_dto_req_evd, h_conn_evd, \r
+                                   &ep_attr, &h_ep[i]);\r
+       }\r
+       stop = get_time();\r
+       time.epc += ((stop - start) * 1.0e6);\r
+       time.total += time.epc;\r
+       if (ret != DAT_SUCCESS) {\r
+               fprintf(stderr, " Error dat_ep_create: %s\n",\r
+                       DT_RetToString(ret));\r
+               goto cleanup;\r
+       } else\r
+               LOGPRINTF(" EP created %p \n", h_ep[i]);\r
+\r
+       /* create the service point for server listen */\r
+       if (server) {\r
+               LOGPRINTF(" Creating server service point(s)\n");\r
+               for (i = 0; i < burst; i++) {\r
+                       ret = dat_psp_create(h_ia,\r
+                                            port_id+i,\r
+                                            h_cr_evd, \r
+                                            DAT_PSP_CONSUMER_FLAG, \r
+                                            &h_psp[i]);\r
+\r
+                       if (ret != DAT_SUCCESS) {\r
+                               fprintf(stderr, " ERR psp_create: %s\n",\r
+                                       DT_RetToString(ret));\r
+                               goto cleanup;\r
+                       } else\r
+                               LOGPRINTF(" psp_created for listen\n");\r
+\r
+                       printf(" Server ready on port %d\n", \r
+                               port_id+i);\r
+\r
+                       if (!multi_listens)\r
+                               break;\r
+               }\r
+       }\r
+       \r
+       /* Connect all */\r
+       if (server)\r
+               ret = conn_server();\r
+       else    \r
+               ret = conn_client();\r
+       \r
+       if (ret != DAT_SUCCESS) {\r
+               fprintf(stderr, " Error %s: %s\n",\r
+                        server ? "server()" : "client()",\r
+                       DT_RetToString(ret));\r
+               goto cleanup;\r
+       } else\r
+               LOGPRINTF(" connect_ep complete\n");\r
+\r
+       connected = 1;\r
+       goto complete;\r
+\r
+cleanup:\r
+       flush_evds();\r
+       goto bail;\r
+complete:\r
+\r
+       /* disconnect and free EP resources */\r
+       if (h_ep[0]) {\r
+               /* unregister message buffers and tear down connection */\r
+               LOGPRINTF(" Disconnect EPs\n");\r
+               ret = disconnect_eps();\r
+               if (ret != DAT_SUCCESS) {\r
+                       fprintf(stderr, " Error disconnect_eps: %s\n",\r
+                               DT_RetToString(ret));\r
+                       goto bail;\r
+               } else {\r
+                       LOGPRINTF(" disconnect_eps complete\n");\r
+               }\r
+       }\r
+\r
+       /* destroy server service point(s) */\r
+       if ((server) && (h_psp[0] != DAT_HANDLE_NULL)) {\r
+               for (i = 0; i < burst; i++) {\r
+                       ret = dat_psp_free(h_psp[i]);\r
+                       if (ret != DAT_SUCCESS) {\r
+                               fprintf(stderr, " Error dat_psp_free: %s\n",\r
+                                       DT_RetToString(ret));\r
+                               goto bail;\r
+                       } else {\r
+                               LOGPRINTF(" psp_free[%d] complete\n",i);\r
+                       }\r
+                       if (!multi_listens)\r
+                               break;\r
+               }\r
+       }\r
+\r
+       /* free EVDs */\r
+       LOGPRINTF(" destroy events\n");\r
+       ret = destroy_events();\r
+       if (ret != DAT_SUCCESS) {\r
+               fprintf(stderr, " Error destroy_events: %s\n",\r
+                       DT_RetToString(ret));\r
+               goto bail;\r
+       } else\r
+               LOGPRINTF(" destroy events done\n");\r
+\r
+\r
+       /* Free protection domain */\r
+       LOGPRINTF(" Freeing pz\n");\r
+       start = get_time();\r
+       ret = dat_pz_free(h_pz);\r
+       stop = get_time();\r
+       time.pzf += ((stop - start) * 1.0e6);\r
+       if (ret != DAT_SUCCESS) {\r
+               fprintf(stderr, " Error freeing PZ: %s\n",\r
+                       DT_RetToString(ret));\r
+               goto bail;\r
+       } else {\r
+               LOGPRINTF(" Freed pz\n");\r
+               h_pz = NULL;\r
+       }\r
+\r
+       /* close the device */\r
+       LOGPRINTF(" Closing Interface Adaptor\n");\r
+       start = get_time();\r
+       ret = dat_ia_close(h_ia, DAT_CLOSE_ABRUPT_FLAG);\r
+       stop = get_time();\r
+       time.close += ((stop - start) * 1.0e6);\r
+       if (ret != DAT_SUCCESS) {\r
+               fprintf(stderr, " Error Adaptor close: %s\n",\r
+                       DT_RetToString(ret));\r
+               goto bail;\r
+       } else\r
+               LOGPRINTF(" Closed Interface Adaptor\n");\r
+\r
+       printf(" DAPL Connection Test Complete.\n");\r
+       printf(" open:      %10.2lf usec\n", time.open);\r
+       printf(" close:     %10.2lf usec\n", time.close);\r
+       printf(" PZ create: %10.2lf usec\n", time.pzc);\r
+       printf(" PZ free:   %10.2lf usec\n", time.pzf);\r
+       printf(" LMR create:%10.2lf usec\n", time.reg);\r
+       printf(" LMR free:  %10.2lf usec\n", time.unreg);\r
+       printf(" EVD create:%10.2lf usec\n", time.evdc);\r
+       printf(" EVD free:  %10.2lf usec\n", time.evdf);\r
+       printf(" EP create: %10.2lf usec avg\n", time.epc/connections);\r
+       printf(" EP free:   %10.2lf usec avg\n", time.epf/connections);\r
+       if (!server) {\r
+               printf(" Connections: %8.2lf usec, CPS %7.2lf "\r
+                       "Total %4.2lf secs, poll_cnt=%u, Num=%d\n", \r
+                      (double)(time.conn/connections), \r
+                      (double)(1/(time.conn/1000000/connections)), \r
+                      (double)(time.conn/1000000), \r
+                      conn_poll_count, connections);\r
+       }\r
+       printf(" TOTAL:     %4.2lf sec\n",  time.total/1000000);\r
+       fflush(stderr); fflush(stdout);\r
+bail:\r
+       free(h_ep);\r
+       free(h_psp);\r
+\r
+#if defined(_WIN32) || defined(_WIN64)\r
+       WSACleanup();\r
+#endif\r
+       return (0);\r
+}\r
+\r
+double get_time(void)\r
+{\r
+       struct timeval tp;\r
+\r
+       gettimeofday(&tp, NULL);\r
+       return ((double)tp.tv_sec + (double)tp.tv_usec * 1e-6);\r
+}\r
+\r
+DAT_RETURN conn_server()\r
+{\r
+       DAT_RETURN ret;\r
+       DAT_EVENT event;\r
+       DAT_COUNT nmore;\r
+       int i,bi;\r
+       unsigned char *buf;\r
+       DAT_CR_ARRIVAL_EVENT_DATA *cr_event =\r
+               &event.event_data.cr_arrival_event_data;\r
+       DAT_CR_PARAM cr_param = { 0 };\r
+       \r
+       printf(" Accepting...\n");\r
+       for (i = 0; i < connections; i++) {\r
+                                       \r
+               /* poll for CR's */\r
+               if (!waiting) {\r
+                       cr_poll_count = 0;\r
+                       while (DAT_GET_TYPE(dat_evd_dequeue(h_cr_evd, &event)) \r
+                                       == DAT_QUEUE_EMPTY)\r
+                               cr_poll_count++;\r
+               } else {\r
+                       ret = dat_evd_wait(h_cr_evd, CR_TIMEOUT, \r
+                                          1, &event, &nmore);\r
+                       if (ret != DAT_SUCCESS) {\r
+                               fprintf(stderr,\r
+                                       " ERR: CR dat_evd_wait() %s\n",\r
+                                        DT_RetToString(ret));\r
+                               return ret;\r
+                       }\r
+               }\r
+       \r
+               if ((event.event_number != DAT_CONNECTION_REQUEST_EVENT) &&\r
+                   (ud_test && event.event_number != \r
+                    DAT_IB_UD_CONNECTION_REQUEST_EVENT)) {\r
+                               fprintf(stderr, " Error unexpected CR event : %s\n",\r
+                                       DT_EventToSTr(event.event_number));\r
+                               return (DAT_ABORT);\r
+               }\r
+\r
+               \r
+               /* use to test rdma_cma timeout logic */\r
+#if defined(_WIN32) || defined(_WIN64)\r
+               if (delay) {\r
+                       printf(" Accept delayed by %d seconds...\n", delay);\r
+                       Sleep(delay * 1000);\r
+               }\r
+#else\r
+               if (delay) {\r
+                       printf(" Accept delayed by %d seconds...\n", delay);\r
+                       sleep(delay);\r
+               }\r
+#endif\r
+               /* accept connect request from client */\r
+               h_cr = cr_event->cr_handle;\r
+               LOGPRINTF(" Accepting connect request from client\n");\r
+\r
+               /* private data - check and send it back */\r
+               dat_cr_query(h_cr, DAT_CSP_FIELD_ALL, &cr_param);\r
+\r
+               buf = (unsigned char *)cr_param.private_data;\r
+               LOGPRINTF(" CONN REQUEST Private Data %p[0]=%d [47]=%d\n",\r
+                          buf, buf[0], buf[47]);\r
+               \r
+               for (bi = 0; bi < 48; bi++) {\r
+                       if (buf[bi] != bi + 1) {\r
+                               fprintf(stderr, " ERR on CONNECT REQUEST"\r
+                                       " private data: %p[%d]=%d s/be %d\n",\r
+                                        buf, bi, buf[bi], bi + 1);\r
+                               dat_cr_reject(h_cr, 0, NULL);\r
+                               return (DAT_ABORT);\r
+                       }\r
+                       buf[bi]++;      /* change for trip back */\r
+               }\r
+\r
+#ifdef TEST_REJECT_WITH_PRIVATE_DATA\r
+               printf(" REJECT request with 48 bytes of private data\n");\r
+               ret = dat_cr_reject(h_cr, 48, cr_param.private_data);\r
+               printf("\n DAPL Test Complete. %s\n\n",\r
+                       ret ? "FAILED" : "PASSED");\r
+               exit(0);\r
+#endif\r
+               ret = dat_cr_accept(h_cr, h_ep[i], 48, \r
+                                   cr_param.private_data);\r
+\r
+               if (ret != DAT_SUCCESS) {\r
+                       fprintf(stderr, " ERR dat_cr_accept: %s\n",\r
+                               DT_RetToString(ret));\r
+                       return (ret);\r
+               } else\r
+                       LOGPRINTF(" accept[%d] complete\n", i);\r
+       \r
+               event.event_number = 0;\r
+       }\r
+\r
+       /* process the RTU, ESTABLISHMENT event */\r
+       printf(" Completing...\n");\r
+        for (i=0;i<connections;i++) {\r
+               \r
+               /* process completions */\r
+               if (!waiting) {\r
+                       conn_poll_count = 0;\r
+                       while (DAT_GET_TYPE(dat_evd_dequeue(h_conn_evd, \r
+                                           &event)) == DAT_QUEUE_EMPTY)\r
+                               conn_poll_count++;\r
+               } else {\r
+                       ret = dat_evd_wait(h_conn_evd, CONN_TIMEOUT, \r
+                                          1, &event, &nmore);\r
+                       if (ret != DAT_SUCCESS) {\r
+                               fprintf(stderr,\r
+                                       " ERR: CONN evd_wait() %s\n",\r
+                                        DT_RetToString(ret));\r
+                               return ret;\r
+                       }\r
+               }\r
+               if ((event.event_number != DAT_CONNECTION_EVENT_ESTABLISHED) &&\r
+                   (ud_test && event.event_number != \r
+                    DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED)) {\r
+\r
+                       fprintf(stderr, " Error unexpected CR EST "\r
+                               "event : 0x%x %s\n",\r
+                                event.event_number,\r
+                               DT_EventToSTr(event.event_number));\r
+                       return (DAT_ABORT);\r
+               }\r
+               event.event_number = 0;\r
+               LOGPRINTF(" CONN_EST[%d] complete\n", i);\r
+       }\r
+\r
+       printf("\n ALL %d CONNECTED on Server!\n\n", connections);\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+       \r
+DAT_RETURN conn_client() \r
+{\r
+       DAT_SOCK_ADDR raddr;\r
+       DAT_RETURN ret;\r
+       DAT_EVENT event;\r
+       DAT_COUNT nmore;\r
+       DAT_CONN_QUAL conn_id;\r
+       DAT_CONNECTION_EVENT_DATA *conn_event =\r
+               &event.event_data.connect_event_data;\r
+       int i,ii,bi;\r
+       unsigned char *buf;\r
+       unsigned char pdata[48] = { 0 };\r
+       struct addrinfo *target;\r
+       int rval;\r
+\r
+#if defined(_WIN32) || defined(_WIN64)\r
+       if ((rval = getaddrinfo(hostname, "ftp", NULL, &target)) != 0) {\r
+               printf("\n remote name resolution failed! %s\n",\r
+                       gai_strerror(rval));\r
+               exit(1);\r
+       }\r
+       rval = ((struct sockaddr_in *)target->ai_addr)->sin_addr.s_addr;\r
+#else\r
+       if (getaddrinfo(hostname, NULL, NULL, &target) != 0) {\r
+               perror("\n remote name resolution failed!");\r
+               exit(1);\r
+       }\r
+       rval = ((struct sockaddr_in *)target->ai_addr)->sin_addr.s_addr;\r
+#endif\r
+       printf(" Connecting to Server: %s \n",  hostname);\r
+       printf(" Address: %d.%d.%d.%d port %d\n",\r
+               (rval >> 0) & 0xff, (rval >> 8) & 0xff,\r
+               (rval >> 16) & 0xff, (rval >> 24) & 0xff, \r
+               port_id);\r
+\r
+       raddr = *((DAT_IA_ADDRESS_PTR)target->ai_addr);\r
+       freeaddrinfo(target);\r
+\r
+       for (i = 0; i < 48; i++) /* simple pattern in private data */\r
+               pdata[i] = i + 1;\r
+\r
+               printf(" Connecting...\n");\r
+       start = get_time();\r
+       for (i = 0; i < connections; i += burst) {\r
+               for (ii = 0; ii < burst; ii++) { /* conn_reqs */\r
+                       if (multi_listens)\r
+                               conn_id = port_id + ii;\r
+                       else\r
+                               conn_id = port_id;\r
+\r
+                       ret = dat_ep_connect(h_ep[i+ii], &raddr, \r
+                                            conn_id, CONN_TIMEOUT,\r
+                                            48, (DAT_PVOID) pdata, 0, \r
+                                            DAT_CONNECT_DEFAULT_FLAG);\r
+                       if (ret != DAT_SUCCESS) {\r
+                               fprintf(stderr, " ERR dat_ep_connect: %s\n",\r
+                                       DT_RetToString(ret));\r
+                               return (ret);\r
+                       } else\r
+                               LOGPRINTF(" dat_ep_connect[%d] complete\n", \r
+                                         i+ii);\r
+\r
+               } \r
+               for (ii = 0; ii < burst; ii++) { /* conn_events */\r
+                       if (!waiting) {\r
+                               conn_poll_count = 0;\r
+                               while (DAT_GET_TYPE(dat_evd_dequeue(\r
+                                       h_conn_evd, &event)) == \r
+                                       DAT_QUEUE_EMPTY)\r
+                                       conn_poll_count++;\r
+                       } else {\r
+                               ret = dat_evd_wait(h_conn_evd, CONN_TIMEOUT, \r
+                                                  1, &event, &nmore);\r
+\r
+                               if (ret != DAT_SUCCESS) {\r
+                                       fprintf(stderr,\r
+                                               " ERR: CONN evd_wait() %s\n",\r
+                                               DT_RetToString(ret));\r
+                                       return ret;\r
+                               }\r
+                       }\r
+\r
+#ifdef TEST_REJECT_WITH_PRIVATE_DATA\r
+                       if (event.event_number != \r
+                               DAT_CONNECTION_EVENT_PEER_REJECTED) {\r
+                               fprintf(stderr, " expected conn reject "\r
+                                       "event : %s\n",\r
+                                       DT_EventToSTr(event.event_number));\r
+                               return (DAT_ABORT);\r
+                       }\r
+\r
+                       /* get the reject private data and validate */\r
+                       buf = (unsigned char *)conn_event->private_data;\r
+                       printf(" Recv REJ with pdata %p[0]=%d [47]=%d\n",\r
+                        buf, buf[0], buf[47]);\r
+                       for (bi = 0; bi < 48; bi++) {\r
+                               if (buf[bi] != idx + 2) {\r
+                                       fprintf(stderr, " client: Error"\r
+                                               " with REJECT event private"\r
+                                               " data: %p[%d]=%d s/be %d\n",\r
+                                                buf, bi, \r
+                                               buf[bi], bi + 2);\r
+                                       dat_ep_disconnect(h_ep[i+ii], 0);\r
+                                       return (DAT_ABORT);\r
+                               }\r
+                       }\r
+                       printf("\n Rej Test Done. PASSED\n\n");\r
+                       exit(0);\r
+#endif\r
+                       if ((event.event_number != \r
+                           DAT_CONNECTION_EVENT_ESTABLISHED) &&\r
+                           (ud_test && event.event_number != \r
+                           DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED)) {\r
+                               fprintf(stderr, " Error unexpected conn "\r
+                                       "event : 0x%x %s\n",\r
+                                        event.event_number,\r
+                                       DT_EventToSTr(event.event_number));\r
+                               return (DAT_ABORT);\r
+                       }\r
+\r
+                       /* check private data back from server  */\r
+                       buf = (unsigned char *)conn_event->private_data;\r
+\r
+                       LOGPRINTF(" CONN[%d] Private Data "\r
+                                 "%p[0]=%d [47]=%d\n",\r
+                                  i+ii, buf, buf[0], buf[47]);\r
+\r
+                       for (bi = 0; bi < 48; bi++) {\r
+                               if (buf[bi] != bi + 2) {\r
+                                       DAT_COUNT nmore;\r
+                                       fprintf(stderr, " ERR CONN event"\r
+                                               " pdata: %p[%d]=%d s/be %d\n",\r
+                                                buf, bi, buf[bi], \r
+                                               bi + 2);\r
+                                       dat_ep_disconnect(h_ep[i+ii], \r
+                                               DAT_CLOSE_ABRUPT_FLAG);\r
+                                       LOGPRINTF(" waiting for disc...\n");\r
+                                       dat_evd_wait(h_conn_evd, \r
+                                                    DAT_TIMEOUT_INFINITE,\r
+                                                    1, &event, &nmore); \r
+                                       return (DAT_ABORT);\r
+                               }\r
+                       }\r
+                       event.event_number = 0;\r
+               } \r
+       }\r
+\r
+       stop = get_time();\r
+               time.conn += ((stop - start) * 1.0e6);\r
+\r
+       printf("\n ALL %d CONNECTED on Client!\n\n",  connections);\r
+\r
+       return (DAT_SUCCESS);\r
+}\r
+\r
+/* validate disconnected EP's and free them */\r
+DAT_RETURN disconnect_eps(void)\r
+{\r
+       DAT_RETURN ret;\r
+       DAT_EVENT event;\r
+       DAT_COUNT nmore;\r
+       int i,ii;\r
+       DAT_CONNECTION_EVENT_DATA *conn_event =\r
+               &event.event_data.connect_event_data;\r
+\r
+       if (!connected)\r
+               return DAT_SUCCESS;\r
+\r
+       /* UD, no connection to disconnect, just free EP's */\r
+       if (ud_test) {\r
+               for (i = 0; i < connections; i++) {\r
+                       ret = dat_ep_free(h_ep[i]);\r
+                       if (ret != DAT_SUCCESS) {\r
+                               fprintf(stderr, \r
+                                       " ERR free EP[%d] %p: %s\n",\r
+                                       i, h_ep[i], DT_RetToString(ret));\r
+                       } else {\r
+                               LOGPRINTF(" Freed EP[%d] %p\n", \r
+                                         i, h_ep[i]);\r
+                               h_ep[i] = DAT_HANDLE_NULL;\r
+                       }\r
+               }\r
+               stop = get_time();\r
+               time.epf += ((stop - start) * 1.0e6);\r
+               time.total += time.epf;\r
+               return DAT_SUCCESS;\r
+       }\r
+       \r
+       /* \r
+        * Only the client needs to call disconnect. The server _should_ be able\r
+        * to just wait on the EVD associated with connection events for a\r
+        * disconnect request and then exit.\r
+        */\r
+       if (!server) {\r
+               start = get_time();\r
+               for (i = 0; i < connections; i++) {\r
+                       LOGPRINTF(" dat_ep_disconnect\n");\r
+                       ret = dat_ep_disconnect(h_ep[i], \r
+                                               DAT_CLOSE_DEFAULT);\r
+                       if (ret != DAT_SUCCESS) {\r
+                               fprintf(stderr,\r
+                                       " Error disconnect: %s\n",\r
+                                               DT_RetToString(ret));\r
+                               return ret;\r
+                       } else {\r
+                               LOGPRINTF(" disconnect completed\n");\r
+                       }\r
+               }\r
+       } else {\r
+               LOGPRINTF(" Server waiting for disconnect...\n");\r
+       }\r
+\r
+       LOGPRINTF(" Wait for Disc event, free EPs as completed\n");\r
+       start = get_time();\r
+       for (i = 0; i < connections; i++) {\r
+               event.event_number = 0;\r
+               conn_event->ep_handle = NULL;\r
+               ret = dat_evd_wait(h_conn_evd, DAT_TIMEOUT_INFINITE, \r
+                                  1, &event, &nmore);\r
+               if (ret != DAT_SUCCESS) {\r
+                       fprintf(stderr, " Error dat_evd_wait: %s\n",\r
+                               DT_RetToString(ret));\r
+                       return ret;\r
+               } else {\r
+                       LOGPRINTF(" disc event[%d] complete,"\r
+                                 " check for valid EP...\n", i);\r
+               }\r
+\r
+               /* check for valid EP in creation list */\r
+               for (ii = 0; ii < connections; ii++) {\r
+                       if (h_ep[ii] == conn_event->ep_handle) {\r
+                               LOGPRINTF(" valid EP[%d] %p !\n", \r
+                                         ii, h_ep[ii]);\r
+                               ret = dat_ep_free(h_ep[ii]);\r
+                               if (ret != DAT_SUCCESS) {\r
+                                       fprintf(stderr, \r
+                                               " ERR free EP[%d] %p: %s\n",\r
+                                               i, h_ep[ii], \r
+                                               DT_RetToString(ret));\r
+                               } else {\r
+                                       LOGPRINTF(" Freed EP[%d] %p\n", \r
+                                                 i, h_ep[ii]);\r
+                                       h_ep[ii] = DAT_HANDLE_NULL;\r
+                               }\r
+                               break;\r
+                       } else {\r
+                               continue;\r
+                       }\r
+               }\r
+               if (ii == connections) {\r
+                       LOGPRINTF(" %s: invalid EP[%d] %p via DISC event!\n", \r
+                                 server ? "Server" : "Client", \r
+                                 i, conn_event->ep_handle);\r
+                       return DAT_INVALID_HANDLE;\r
+               }\r
+       }\r
+       /* free EPs */\r
+       stop = get_time();\r
+       time.epf += ((stop - start) * 1.0e6);\r
+       time.total += time.epf;\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+\r
+ /*\r
+  * Create CR, CONN, and DTO events\r
+  */\r
+DAT_RETURN create_events(void)\r
+{\r
+       DAT_RETURN ret;\r
+\r
+       /* create cr EVD */\r
+       start = get_time();\r
+       ret = dat_evd_create(h_ia, connections, DAT_HANDLE_NULL, \r
+                            DAT_EVD_CR_FLAG, &h_cr_evd);\r
+       stop = get_time();\r
+       time.evdc += ((stop - start) * 1.0e6);\r
+       time.total += time.evdc;\r
+       if (ret != DAT_SUCCESS) {\r
+               fprintf(stderr, " Error dat_evd_create: %s\n",\r
+                        DT_RetToString(ret));\r
+               return (ret);\r
+       } else {\r
+               LOGPRINTF(" cr_evd created %p\n",  h_cr_evd);\r
+       }\r
+\r
+       /* create conn EVD */\r
+       ret = dat_evd_create(h_ia,\r
+                            connections*2,\r
+                            DAT_HANDLE_NULL,\r
+                            DAT_EVD_CONNECTION_FLAG, &h_conn_evd);\r
+       if (ret != DAT_SUCCESS) {\r
+               fprintf(stderr, " Error dat_evd_create: %s\n",\r
+                        DT_RetToString(ret));\r
+               return (ret);\r
+       } else {\r
+               LOGPRINTF(" con_evd created %p\n",  h_conn_evd);\r
+       }\r
+\r
+       /* create dto SND EVD */\r
+       ret = dat_evd_create(h_ia, 1, NULL, \r
+                            DAT_EVD_DTO_FLAG, &h_dto_req_evd);\r
+       if (ret != DAT_SUCCESS) {\r
+               fprintf(stderr, " Error dat_evd_create REQ: %s\n",\r
+                        DT_RetToString(ret));\r
+               return (ret);\r
+       } else {\r
+               LOGPRINTF(" dto_req_evd created %p\n", \r
+                         h_dto_req_evd);\r
+       }\r
+\r
+       /* create dto RCV EVD */\r
+       ret = dat_evd_create(h_ia, 1, NULL,\r
+                            DAT_EVD_DTO_FLAG, &h_dto_rcv_evd);\r
+       if (ret != DAT_SUCCESS) {\r
+               fprintf(stderr, " Error dat_evd_create RCV: %s\n",\r
+                        DT_RetToString(ret));\r
+               return (ret);\r
+       } else {\r
+               LOGPRINTF(" dto_rcv_evd created %p\n", \r
+                         h_dto_rcv_evd);\r
+       }\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+/*\r
+ * Destroy CR, CONN, CNO, and DTO events\r
+ */\r
+\r
+DAT_RETURN destroy_events(void)\r
+{\r
+       DAT_RETURN ret;\r
+\r
+       /* free cr EVD */\r
+       if (h_cr_evd != DAT_HANDLE_NULL) {\r
+               LOGPRINTF(" Free cr EVD %p \n",  h_cr_evd);\r
+               ret = dat_evd_free(h_cr_evd);\r
+               if (ret != DAT_SUCCESS) {\r
+                       fprintf(stderr, " Error freeing cr EVD: %s\n",\r
+                                DT_RetToString(ret));\r
+                       return (ret);\r
+               } else {\r
+                       LOGPRINTF(" Freed cr EVD\n");\r
+                       h_cr_evd = DAT_HANDLE_NULL;\r
+               }\r
+       }\r
+\r
+       /* free conn EVD */\r
+       if (h_conn_evd != DAT_HANDLE_NULL) {\r
+               LOGPRINTF(" Free conn EVD %p\n",  h_conn_evd);\r
+               ret = dat_evd_free(h_conn_evd);\r
+               if (ret != DAT_SUCCESS) {\r
+                       fprintf(stderr, " Error freeing conn EVD: %s\n",\r
+                                DT_RetToString(ret));\r
+                       return (ret);\r
+               } else {\r
+                       LOGPRINTF(" Freed conn EVD\n");\r
+                       h_conn_evd = DAT_HANDLE_NULL;\r
+               }\r
+       }\r
+\r
+       /* free RCV dto EVD */\r
+       if (h_dto_rcv_evd != DAT_HANDLE_NULL) {\r
+               LOGPRINTF(" Free RCV dto EVD %p\n",  h_dto_rcv_evd);\r
+               start = get_time();\r
+               ret = dat_evd_free(h_dto_rcv_evd);\r
+               stop = get_time();\r
+               time.evdf += ((stop - start) * 1.0e6);\r
+               time.total += time.evdf;\r
+               if (ret != DAT_SUCCESS) {\r
+                       fprintf(stderr, " Error freeing dto EVD: %s\n",\r
+                                DT_RetToString(ret));\r
+                       return (ret);\r
+               } else {\r
+                       LOGPRINTF(" Freed dto EVD\n");\r
+                       h_dto_rcv_evd = DAT_HANDLE_NULL;\r
+               }\r
+       }\r
+\r
+       /* free REQ dto EVD */\r
+       if (h_dto_req_evd != DAT_HANDLE_NULL) {\r
+               LOGPRINTF(" Free REQ dto EVD %p\n",  h_dto_req_evd);\r
+               ret = dat_evd_free(h_dto_req_evd);\r
+               if (ret != DAT_SUCCESS) {\r
+                       fprintf(stderr, " Error freeing dto EVD: %s\n",\r
+                                DT_RetToString(ret));\r
+                       return (ret);\r
+               } else {\r
+                       LOGPRINTF(" Freed dto EVD\n");\r
+                       h_dto_req_evd = DAT_HANDLE_NULL;\r
+               }\r
+       }\r
+\r
+       return DAT_SUCCESS;\r
+}\r
+\r
+/*\r
+ * Map DAT_RETURN values to readable strings,\r
+ * but don't assume the values are zero-based or contiguous.\r
+ */\r
+char errmsg[512] = { 0 };\r
+const char *DT_RetToString(DAT_RETURN ret_value)\r
+{\r
+       const char *major_msg, *minor_msg;\r
+\r
+       dat_strerror(ret_value, &major_msg, &minor_msg);\r
+\r
+       strcpy(errmsg, major_msg);\r
+       strcat(errmsg, " ");\r
+       strcat(errmsg, minor_msg);\r
+\r
+       return errmsg;\r
+}\r
+\r
+/*\r
+ * Map DAT_EVENT_CODE values to readable strings\r
+ */\r
+const char *DT_EventToSTr(DAT_EVENT_NUMBER event_code)\r
+{\r
+       unsigned int i;\r
+       static struct {\r
+               const char *name;\r
+               DAT_RETURN value;\r
+       } dat_events[] = {\r
+#   define DATxx(x) { # x, x }\r
+               DATxx(DAT_DTO_COMPLETION_EVENT),\r
+                   DATxx(DAT_RMR_BIND_COMPLETION_EVENT),\r
+                   DATxx(DAT_CONNECTION_REQUEST_EVENT),\r
+                   DATxx(DAT_CONNECTION_EVENT_ESTABLISHED),\r
+                   DATxx(DAT_CONNECTION_EVENT_PEER_REJECTED),\r
+                   DATxx(DAT_CONNECTION_EVENT_NON_PEER_REJECTED),\r
+                   DATxx(DAT_CONNECTION_EVENT_ACCEPT_COMPLETION_ERROR),\r
+                   DATxx(DAT_CONNECTION_EVENT_DISCONNECTED),\r
+                   DATxx(DAT_CONNECTION_EVENT_BROKEN),\r
+                   DATxx(DAT_CONNECTION_EVENT_TIMED_OUT),\r
+                   DATxx(DAT_CONNECTION_EVENT_UNREACHABLE),\r
+                   DATxx(DAT_ASYNC_ERROR_EVD_OVERFLOW),\r
+                   DATxx(DAT_ASYNC_ERROR_IA_CATASTROPHIC),\r
+                   DATxx(DAT_ASYNC_ERROR_EP_BROKEN),\r
+                   DATxx(DAT_ASYNC_ERROR_TIMED_OUT),\r
+                   DATxx(DAT_ASYNC_ERROR_PROVIDER_INTERNAL_ERROR),\r
+                   DATxx(DAT_SOFTWARE_EVENT)\r
+#   undef DATxx\r
+       };\r
+#   define NUM_EVENTS (sizeof(dat_events)/sizeof(dat_events[0]))\r
+\r
+       for (i = 0; i < NUM_EVENTS; i++) {\r
+               if (dat_events[i].value == event_code) {\r
+                       return (dat_events[i].name);\r
+               }\r
+       }\r
+\r
+       return ("Invalid_DAT_EVENT_NUMBER");\r
+}\r
+\r
+void print_usage(void)\r
+{\r
+       printf("\n DAPL USAGE \n\n");\r
+       printf("s: server\n");\r
+       printf("c: connections (default = 1000)\n");\r
+       printf("v: verbose\n");\r
+       printf("w: wait on event (default, polling)\n");\r
+       printf("d: delay before accept\n");\r
+       printf("h: hostname/address of server, specified on client\n");\r
+       printf("P: provider name (default = OpenIB-v2-ib0)\n");\r
+       printf("\n");\r
+}\r
+\r
index 2d062f1dae1bb36861acfe10ead2a894d67a44bd..2945a741d1eaa4757c9201fa33fe80e479d1c88c 100644 (file)
-/*
- * Copyright (c) 2007-2008 Intel Corporation.  All rights reserved.
- *
- * This software is available to you under a choice of one of two
- * licenses.  You may choose to be licensed under the terms of the GNU
- * General Public License (GPL) Version 2, available from the file
- * COPYING in the main directory of this source tree, or the
- * OpenIB.org BSD license below:
- *
- *     Redistribution and use in source and binary forms, with or
- *     without modification, are permitted provided that the following
- *     conditions are met:
- *
- *      - Redistributions of source code must retain the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer.
- *
- *      - Redistributions in binary form must reproduce the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer in the documentation and/or other materials
- *        provided with the distribution.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * $Id: $
- */
-#include <stdio.h>
-#include <stdlib.h>
-
-#if defined(_WIN32) || defined(_WIN64)
-#include <windows.h>
-#include <winsock2.h>
-#include <ws2tcpip.h>
-#include <io.h>
-#include <process.h>
-#include <complib/cl_types.h>
-#include "..\..\..\..\etc\user\getopt.c"
-#define __BYTE_ORDER __LITTLE_ENDIAN
-
-#define F64x "%I64x"
-#define F64u "%I64u"
-#define DAPL_PROVIDER "ibnic0v2"
-#else
-#include <netdb.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/time.h>
-#include <netinet/in.h>
-#include <netinet/tcp.h>
-#include <arpa/inet.h>
-#include <inttypes.h>
-#include <string.h>
-#include <unistd.h>
-
-#define DAPL_PROVIDER "ofa-v2-ib0"
-#define F64x "%"PRIx64""
-#define F64u "%"PRIu64""
-
-#endif
-
-#include "dat2/udat.h"
-#include "dat2/dat_ib_extensions.h"
-
-int disconnect_ep(void);
-
-#define _OK(status, str) \
-{\
-       const char  *maj_msg, *min_msg;\
-       if (status != DAT_SUCCESS) {\
-               dat_strerror(status, &maj_msg, &min_msg);\
-               fprintf(stderr, str " returned %s : %s\n", maj_msg, min_msg);\
-               dat_ia_close(ia, DAT_CLOSE_DEFAULT);\
-               exit(1);\
-       } else if (verbose) {\
-               printf("dtestx: %s success\n",str);\
-       }\
-}
-
-#define _OK2(status, str)\
-{\
-       const char  *maj_msg, *min_msg;\
-       if (status != DAT_SUCCESS) {\
-               dat_strerror(status, &maj_msg, &min_msg);\
-               fprintf(stderr, str " returned %s : %s\n", maj_msg, min_msg);\
-               dat_ia_close(ia, DAT_CLOSE_DEFAULT);\
-               exit(1);\
-       } else if (verbose) {\
-               printf("dtestx: %s\n",str);\
-       }\
-}
-
-/* byte swap helpers from Complib */
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-#define ntoh16(x) (uint16_t)( \
-        (((uint16_t)(x) & 0x00FF) << 8) | \
-        (((uint16_t)(x) & 0xFF00) >> 8))
-#define hton16(x) ntoh16(x)
-#define ntoh32(x) (uint32_t)( \
-        (((uint32_t)(x) & 0x000000FF) << 24)| \
-        (((uint32_t)(x) & 0x0000FF00) << 8) | \
-        (((uint32_t)(x) & 0x00FF0000) >> 8) | \
-        (((uint32_t)(x) & 0xFF000000) >> 24))
-#define hton32(x) ntoh32(x)
-#define ntoh64(x) (uint64_t)( \
-        (((uint64_t)x & 0x00000000000000FFULL) << 56) | \
-        (((uint64_t)x & 0x000000000000FF00ULL) << 40) | \
-        (((uint64_t)x & 0x0000000000FF0000ULL) << 24) | \
-        (((uint64_t)x & 0x00000000FF000000ULL) << 8 ) | \
-        (((uint64_t)x & 0x000000FF00000000ULL) >> 8 ) | \
-        (((uint64_t)x & 0x0000FF0000000000ULL) >> 24) | \
-        (((uint64_t)x & 0x00FF000000000000ULL) >> 40) | \
-        (((uint64_t)x & 0xFF00000000000000ULL) >> 56))
-#define hton64(x) ntoh64(x)
-#elif __BYTE_ORDER == __BIG_ENDIAN
-#define hton16(x) (x)
-#define ntoh16(x) (x)
-#define hton32(x) (x)
-#define ntoh32(x) (x)
-#define hton64(x) (x)
-#define ntoh64(x) (x)
-#endif                         /* __BYTE_ORDER == __BIG_ENDIAN */
-
-#define MIN(a, b) ((a < b) ? (a) : (b))
-#define MAX(a, b) ((a > b) ? (a) : (b))
-
-#define DTO_TIMEOUT       (1000*1000*5)
-#define CONN_TIMEOUT      (1000*1000*30)
-#define SERVER_TIMEOUT    (DAT_TIMEOUT_INFINITE)
-#define CLIENT_ID              31111
-#define SERVER_ID              31112
-#define BUF_SIZE               256
-#define BUF_SIZE_ATOMIC                8
-#define REG_MEM_COUNT          10
-#define SND_RDMA_BUF_INDEX     0
-#define RCV_RDMA_BUF_INDEX     1
-#define SEND_BUF_INDEX         2
-#define RECV_BUF_INDEX         3
-#define MAX_EP_COUNT           8
-
-DAT_VADDR *atomic_buf;
-DAT_LMR_HANDLE lmr_atomic;
-DAT_LMR_CONTEXT lmr_atomic_context;
-DAT_RMR_CONTEXT rmr_atomic_context;
-DAT_VLEN reg_atomic_size;
-DAT_VADDR reg_atomic_addr;
-DAT_LMR_HANDLE lmr[REG_MEM_COUNT * MAX_EP_COUNT];
-DAT_LMR_CONTEXT lmr_context[REG_MEM_COUNT * MAX_EP_COUNT];
-DAT_RMR_TRIPLET rmr[REG_MEM_COUNT * MAX_EP_COUNT];
-DAT_RMR_CONTEXT rmr_context[REG_MEM_COUNT * MAX_EP_COUNT];
-DAT_VLEN reg_size[REG_MEM_COUNT * MAX_EP_COUNT];
-DAT_VADDR reg_addr[REG_MEM_COUNT * MAX_EP_COUNT];
-DAT_RMR_TRIPLET *buf[REG_MEM_COUNT * MAX_EP_COUNT];
-DAT_EP_HANDLE ep[MAX_EP_COUNT];
-DAT_EVD_HANDLE async_evd = DAT_HANDLE_NULL;
-DAT_IA_HANDLE ia = DAT_HANDLE_NULL;
-DAT_PZ_HANDLE pz = DAT_HANDLE_NULL;
-DAT_EVD_HANDLE cr_evd = DAT_HANDLE_NULL;
-DAT_EVD_HANDLE con_evd = DAT_HANDLE_NULL;
-DAT_EVD_HANDLE dto_evd = DAT_HANDLE_NULL;
-DAT_PSP_HANDLE psp = DAT_HANDLE_NULL;
-int server = 1;
-int remote_host = 0;
-int ud_test = 0;
-int multi_eps = 0;
-int buf_size = BUF_SIZE;
-int msg_size = sizeof(DAT_RMR_TRIPLET);
-char provider[64] = DAPL_PROVIDER;
-char hostname[256] = { 0 };
-DAT_IB_ADDR_HANDLE remote_ah[MAX_EP_COUNT];
-int eps = 1;
-int verbose = 0;
-int counters = 0;
-int counters_ok = 0;
-
-#define LOGPRINTF if (verbose) printf
-
-void print_usage(void)
-{
-       printf("\n dtestx usage \n\n");
-       printf("v: verbose\n");
-       printf("p: print counters\n");
-       printf("u  unreliable datagram test\n");
-       printf("U: unreliable datagram test, UD endpoint count\n");
-       printf("m  unreliable datagram test, multiple Server endpoints\n");
-       printf("b: buf length to allocate\n");
-       printf("h: hostname/address of Server, client and UDP server\n");
-       printf("c: Client\n");
-       printf("s: Server, default\n");
-       printf("P: provider name (default = ofa-v2-ib0)\n");
-       printf("\n");
-}
-
-#if defined(_WIN32) || defined(_WIN64)
-static void sleep(int secs)
-{
-       Sleep(secs * 1000);
-}
-
-#define _WSACleanup() WSACleanup()
-#else
-#define        _WSACleanup()
-#endif
-
-void
-send_msg(void *data,
-        DAT_COUNT size,
-        DAT_LMR_CONTEXT context,
-        DAT_DTO_COOKIE cookie, DAT_COMPLETION_FLAGS flags)
-{
-       DAT_LMR_TRIPLET iov;
-       DAT_EVENT event;
-       DAT_COUNT nmore;
-       DAT_RETURN status;
-       int i, ep_idx = 0, ah_idx = 0;
-       DAT_DTO_COMPLETION_EVENT_DATA *dto_event =
-           &event.event_data.dto_completion_event_data;
-
-       iov.lmr_context = context;
-       iov.virtual_address = (DAT_VADDR) (uintptr_t) data;
-       iov.segment_length = (DAT_VLEN) size;
-
-       for (i = 0; i < eps; i++) {
-               if (ud_test) {
-                       /* 
-                        * Client and Server: ep[0] and ah[0] on single 
-                        * and ep[i] on multiple (-m) endpoint options. 
-                        */
-                       if (multi_eps) {
-                               ep_idx = i;
-                               ah_idx = server ? 0 : i;
-                       }
-                       printf("%s sending on ep=%p to remote_ah: ah=%p"
-                              " qpn=0x%x addr=%s\n",
-                              server ? "Server" : "Client", ep[ep_idx],
-                              remote_ah[ah_idx].ah,
-                              remote_ah[ah_idx].qpn,
-                              inet_ntoa(((struct sockaddr_in *)
-                                         &remote_ah[ah_idx].ia_addr)->
-                                        sin_addr));
-
-                       /* client expects all data in on first EP */
-                       status = dat_ib_post_send_ud(ep[ep_idx],
-                                                    1,
-                                                    &iov,
-                                                    &remote_ah[ah_idx],
-                                                    cookie, flags);
-
-               } else {
-                       status = dat_ep_post_send(ep[0], 1, &iov,
-                                                 cookie, flags);
-               }
-               _OK(status, "dat_ep_post_send");
-
-               if (!(flags & DAT_COMPLETION_SUPPRESS_FLAG)) {
-                       status = dat_evd_wait(dto_evd, DTO_TIMEOUT,
-                                             1, &event, &nmore);
-                       _OK(status, "dat_evd_wait after dat_ep_post_send");
-
-                       if (event.event_number != DAT_DTO_COMPLETION_EVENT &&
-                           ud_test && event.event_number != DAT_IB_DTO_EVENT) {
-                               printf("unexpected event waiting post_send "
-                                      "completion - 0x%x\n",
-                                      event.event_number);
-                               exit(1);
-                       }
-                       _OK(dto_event->status, "event status for post_send");
-               }
-       }
-}
-
-/* RC - Server only, UD - Server and Client, one per EP */
-void process_cr(int idx)
-{
-       DAT_EVENT event;
-       DAT_COUNT nmore;
-       DAT_RETURN status;
-       int pdata;
-       DAT_CR_HANDLE cr = DAT_HANDLE_NULL;
-       DAT_CONN_QUAL exp_qual = server ? SERVER_ID : CLIENT_ID;
-       DAT_CR_PARAM cr_param;
-       DAT_CR_ARRIVAL_EVENT_DATA *cr_event =
-           &event.event_data.cr_arrival_event_data;
-
-       LOGPRINTF("%s waiting for connect[%d] request\n",
-                 server ? "Server" : "Client", idx);
-
-       status = dat_evd_wait(cr_evd, SERVER_TIMEOUT, 1, &event, &nmore);
-       _OK(status, "CR dat_evd_wait");
-
-       if (event.event_number != DAT_CONNECTION_REQUEST_EVENT &&
-           (ud_test && event.event_number !=
-            DAT_IB_UD_CONNECTION_REQUEST_EVENT)) {
-               printf("unexpected event,!conn req: 0x%x\n",
-                      event.event_number);
-               exit(1);
-       }
-
-       if ((cr_event->conn_qual != exp_qual) ||
-           (cr_event->sp_handle.psp_handle != psp)) {
-               printf("wrong cr event data\n");
-               exit(1);
-       }
-
-       cr = cr_event->cr_handle;
-       status = dat_cr_query(cr, DAT_CSP_FIELD_ALL, &cr_param);
-       _OK(status, "dat_cr_query");
-
-       /* use private data to select EP */
-       pdata = ntoh32(*((int *)cr_param.private_data));
-
-       LOGPRINTF("%s recvd pdata=0x%x, send pdata=0x%x\n",
-                 server ? "Server" : "Client", pdata,
-                 *(int *)cr_param.private_data);
-
-       status = dat_cr_accept(cr, ep[pdata], 4, cr_param.private_data);
-       _OK(status, "dat_cr_accept");
-
-       printf("%s accepted CR on EP[%d]=%p\n",
-              server ? "Server" : "Client", pdata, ep[pdata]);
-}
-
-/* RC - Client and Server: 1, UD - Client: 1 per EP, Server: 2 per EP's */
-void process_conn(int idx)
-{
-       DAT_EVENT event;
-       DAT_COUNT nmore;
-       DAT_RETURN status;
-       int pdata;
-       DAT_IB_EXTENSION_EVENT_DATA *ext_event = (DAT_IB_EXTENSION_EVENT_DATA *)
-           & event.event_extension_data[0];
-       DAT_CONNECTION_EVENT_DATA *conn_event =
-           &event.event_data.connect_event_data;
-
-       LOGPRINTF("%s waiting for connect[%d] establishment\n",
-                 server ? "Server" : "Client", idx);
-
-       status = dat_evd_wait(con_evd, CONN_TIMEOUT, 1, &event, &nmore);
-       _OK(status, "CONN dat_evd_wait");
-
-       LOGPRINTF("%s got connect[%d] event, pdata %p sz=%d\n",
-                 server ? "Server" : "Client", idx,
-                 conn_event->private_data, conn_event->private_data_size);
-
-       /* Waiting on CR's or CONN_EST */
-       if (event.event_number != DAT_CONNECTION_EVENT_ESTABLISHED &&
-           (ud_test && event.event_number !=
-            DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED)) {
-               printf("unexpected event, !conn established: 0x%x\n",
-                      event.event_number);
-               exit(1);
-       }
-
-       /* RC or PASSIVE CONN_EST we are done */
-       if (!ud_test)
-               return;
-
-       /* store each remote_ah according to remote EP index */
-       pdata = ntoh32(*((int *)conn_event->private_data));
-       LOGPRINTF(" Client got private data=0x%x\n", pdata);
-
-       /* UD, get AH for sends. 
-        * NOTE: bi-directional AH resolution results in a CONN_EST
-        * for both outbound connect and inbound CR.
-        * Use Active CONN_EST which includes server's CR
-        * pdata for remote_ah idx to send on and ignore PASSIVE CONN_EST.
-        *
-        * DAT_IB_UD_PASSIVE_REMOTE_AH == passive side CONN_EST
-        * DAT_IB_UD_REMOTE_AH == active side CONN_EST
-        */
-       if (ext_event->type == DAT_IB_UD_REMOTE_AH) {
-               remote_ah[pdata] = ext_event->remote_ah;
-               printf("remote_ah[%d]: ah=%p, qpn=0x%x "
-                      "addr=%s\n",
-                      pdata, remote_ah[pdata].ah,
-                      remote_ah[pdata].qpn, inet_ntoa(((struct sockaddr_in *)
-                                                       &remote_ah[pdata].
-                                                       ia_addr)->sin_addr));
-
-       } else if (ext_event->type != DAT_IB_UD_PASSIVE_REMOTE_AH) {
-               printf("unexpected UD ext_event type: 0x%x\n", ext_event->type);
-               exit(1);
-       }
-}
-
-int connect_ep(char *hostname)
-{
-       DAT_SOCK_ADDR remote_addr;
-       DAT_EP_ATTR ep_attr;
-       DAT_RETURN status;
-       DAT_REGION_DESCRIPTION region;
-       DAT_EVENT event;
-       DAT_COUNT nmore;
-       DAT_LMR_TRIPLET iov;
-       DAT_RMR_TRIPLET *r_iov;
-       DAT_DTO_COOKIE cookie;
-       DAT_CONN_QUAL conn_qual;
-       DAT_BOOLEAN in, out;
-       int i, ii, pdata, ctx;
-       DAT_PROVIDER_ATTR prov_attrs;
-       DAT_DTO_COMPLETION_EVENT_DATA *dto_event =
-           &event.event_data.dto_completion_event_data;
-
-       status = dat_ia_open(provider, 8, &async_evd, &ia);
-       _OK(status, "dat_ia_open");
-
-       memset(&prov_attrs, 0, sizeof(prov_attrs));
-       status = dat_ia_query(ia, NULL, 0, NULL,
-                             DAT_PROVIDER_FIELD_ALL, &prov_attrs);
-       _OK(status, "dat_ia_query");
-
-       /* Print provider specific attributes */
-       for (i = 0; i < prov_attrs.num_provider_specific_attr; i++) {
-               LOGPRINTF(" Provider Specific Attribute[%d] %s=%s\n",
-                         i, prov_attrs.provider_specific_attr[i].name,
-                         prov_attrs.provider_specific_attr[i].value);
-
-               /* check for counter support */
-               status = strcmp(prov_attrs.provider_specific_attr[i].name,
-                               "DAT_COUNTERS");
-               if (!status)
-                       counters_ok = 1;
-       }
-
-       /* make sure provider supports counters */
-       if ((counters) && (!counters_ok)) {
-               printf("Disable dat_query_counters:"
-                      " Provider not built with counters\n");
-               counters = 0;
-       }
-
-       status = dat_pz_create(ia, &pz);
-       _OK(status, "dat_pz_create");
-
-       status = dat_evd_create(ia, eps * 2, DAT_HANDLE_NULL, DAT_EVD_CR_FLAG,
-                               &cr_evd);
-       _OK(status, "dat_evd_create CR");
-       status = dat_evd_create(ia, eps * 2, DAT_HANDLE_NULL,
-                               DAT_EVD_CONNECTION_FLAG, &con_evd);
-       _OK(status, "dat_evd_create CR");
-       status = dat_evd_create(ia, eps * 10, DAT_HANDLE_NULL, DAT_EVD_DTO_FLAG,
-                               &dto_evd);
-       _OK(status, "dat_evd_create DTO");
-
-       memset(&ep_attr, 0, sizeof(ep_attr));
-       if (ud_test) {
-               msg_size += 40;
-               ep_attr.service_type = DAT_IB_SERVICE_TYPE_UD;
-               ep_attr.max_message_size = buf_size;
-               ep_attr.max_rdma_read_in = 0;
-               ep_attr.max_rdma_read_out = 0;
-       } else {
-               ep_attr.service_type = DAT_SERVICE_TYPE_RC;
-               ep_attr.max_rdma_size = 0x10000;
-               ep_attr.max_rdma_read_in = 4;
-               ep_attr.max_rdma_read_out = 4;
-       }
-       ep_attr.qos = 0;
-       ep_attr.recv_completion_flags = 0;
-       ep_attr.max_recv_dtos = eps * 10;
-       ep_attr.max_request_dtos = eps * 10;
-       ep_attr.max_recv_iov = 1;
-       ep_attr.max_request_iov = 1;
-       ep_attr.request_completion_flags = DAT_COMPLETION_DEFAULT_FLAG;
-       ep_attr.ep_transport_specific_count = 0;
-       ep_attr.ep_transport_specific = NULL;
-       ep_attr.ep_provider_specific_count = 0;
-       ep_attr.ep_provider_specific = NULL;
-
-       for (i = 0; i < eps; i++) {
-               status = dat_ep_create(ia, pz, dto_evd, dto_evd,
-                                      con_evd, &ep_attr, &ep[i]);
-               _OK(status, "dat_ep_create");
-               LOGPRINTF(" create_ep[%d]=%p\n", i, ep[i]);
-       }
-
-       for (i = 0; i < REG_MEM_COUNT * eps; i++) {
-               buf[i] = (DAT_RMR_TRIPLET *) malloc(buf_size);
-               region.for_va = buf[i];
-               status = dat_lmr_create(ia,
-                                       DAT_MEM_TYPE_VIRTUAL,
-                                       region,
-                                       buf_size,
-                                       pz,
-                                       DAT_MEM_PRIV_ALL_FLAG |
-                                       DAT_IB_MEM_PRIV_REMOTE_ATOMIC,
-                                       DAT_VA_TYPE_VA,
-                                       &lmr[i],
-                                       &lmr_context[i],
-                                       &rmr_context[i],
-                                       &reg_size[i], &reg_addr[i]);
-               _OK(status, "dat_lmr_create");
-       }
-
-       /* register atomic return buffer for original data */
-       atomic_buf = (DAT_UINT64 *) malloc(BUF_SIZE_ATOMIC);
-       region.for_va = atomic_buf;
-       status = dat_lmr_create(ia,
-                               DAT_MEM_TYPE_VIRTUAL,
-                               region,
-                               BUF_SIZE_ATOMIC,
-                               pz,
-                               DAT_MEM_PRIV_ALL_FLAG |
-                               DAT_IB_MEM_PRIV_REMOTE_ATOMIC,
-                               DAT_VA_TYPE_VA,
-                               &lmr_atomic,
-                               &lmr_atomic_context,
-                               &rmr_atomic_context,
-                               &reg_atomic_size, &reg_atomic_addr);
-       _OK(status, "dat_lmr_create atomic");
-
-       for (ii = 0; ii < eps; ii++) {
-               for (i = RECV_BUF_INDEX; i < REG_MEM_COUNT; i++) {
-                       int ep_idx = 0;
-                       cookie.as_64 = (ii * REG_MEM_COUNT) + i;
-                       iov.lmr_context = lmr_context[(ii * REG_MEM_COUNT) + i];
-                       iov.virtual_address =
-                           (DAT_VADDR) (uintptr_t) buf[(ii * REG_MEM_COUNT) +
-                                                       i];
-                       iov.segment_length = buf_size;
-                       LOGPRINTF(" post_recv (%p) on ep[%d]=%p\n",
-                                 buf[(ii * REG_MEM_COUNT) + i], ii, ep[ii]);
-                       /* ep[0], unless testing Server and multi EP's */
-                       if (server && multi_eps) {
-                               ep_idx = ii;
-                               cookie.as_64 = i;
-                       }
-                       status = dat_ep_post_recv(ep[ep_idx],
-                                                 1,
-                                                 &iov,
-                                                 cookie,
-                                                 DAT_COMPLETION_DEFAULT_FLAG);
-                       _OK(status, "dat_ep_post_recv");
-               }
-       }
-       /* setup receive buffer to initial string to be overwritten */
-       strcpy((char *)buf[RCV_RDMA_BUF_INDEX], "blah, blah, blah\n");
-
-       /* ud can resolve_ah and connect both ways, same EP */
-       if (server || (!server && ud_test)) {
-               if (server) {
-                       conn_qual = SERVER_ID;
-                       strcpy((char *)buf[SND_RDMA_BUF_INDEX], "Server data");
-               } else {
-                       conn_qual = CLIENT_ID;
-                       strcpy((char *)buf[SND_RDMA_BUF_INDEX], "Client data");
-               }
-               status = dat_psp_create(ia,
-                                       conn_qual,
-                                       cr_evd, DAT_PSP_CONSUMER_FLAG, &psp);
-               _OK(status, "dat_psp_create");
-
-               /* Server always waits for first CR from Client */
-               if (server)
-                       process_cr(0);
-
-       }
-
-       /* ud can resolve_ah and connect both ways */
-       if (!server || (server && ud_test)) {
-               struct addrinfo *target;
-
-               if (getaddrinfo(hostname, NULL, NULL, &target) != 0) {
-                       printf("Error getting remote address.\n");
-                       exit(1);
-               }
-
-               printf("Remote %s Name: %s \n",
-                      server ? "Client" : "Server", hostname);
-               printf("Remote %s Net Address: %s\n",
-                      server ? "Client" : "Server",
-                      inet_ntoa(((struct sockaddr_in *)
-                                 target->ai_addr)->sin_addr));
-
-               remote_addr = *((DAT_IA_ADDRESS_PTR) target->ai_addr);
-               freeaddrinfo(target);
-               strcpy((char *)buf[SND_RDMA_BUF_INDEX], "Client written data");
-
-               /* one Client EP, multiple Server EPs, same conn_qual 
-                * use private data to select EP on Server 
-                */
-               for (i = 0; i < eps; i++) {
-                       /* pdata selects Server EP, 
-                        * support both muliple Server and single EP's 
-                        */
-                       if (multi_eps)
-                               pdata = hton32(i);
-                       else
-                               pdata = 0;      /* just use first EP */
-
-                       status = dat_ep_connect(ep[0],
-                                               &remote_addr,
-                                               (server ? CLIENT_ID :
-                                                SERVER_ID), CONN_TIMEOUT, 4,
-                                               (DAT_PVOID) & pdata, 0,
-                                               DAT_CONNECT_DEFAULT_FLAG);
-                       _OK(status, "dat_ep_connect");
-               }
-       }
-
-       /* UD: process CR's starting with 2nd on server, 1st for client */
-       if (ud_test) {
-               for (i = (server ? 1 : 0); i < eps; i++)
-                       process_cr(i);
-       }
-
-       /* RC and UD: process CONN EST events */
-       for (i = 0; i < eps; i++)
-               process_conn(i);
-
-       /* UD: CONN EST events for CONN's and CR's */
-       if (ud_test) {
-               for (i = 0; i < eps; i++)
-                       process_conn(i);
-       }
-
-       printf("Connected! %d endpoints\n", eps);
-
-       /*
-        *  Setup our remote memory and tell the other side about it
-        *  Swap to network order.
-        */
-       r_iov = (DAT_RMR_TRIPLET *) buf[SEND_BUF_INDEX];
-       r_iov->rmr_context = hton32(rmr_context[RCV_RDMA_BUF_INDEX]);
-       r_iov->virtual_address =
-           hton64((DAT_VADDR) (uintptr_t) buf[RCV_RDMA_BUF_INDEX]);
-       r_iov->segment_length = hton32(buf_size);
-
-       printf("Send RMR message: r_key_ctx=0x%x,va=" F64x ",len=0x%x\n",
-              hton32(r_iov->rmr_context),
-              hton64(r_iov->virtual_address), hton32(r_iov->segment_length));
-
-       send_msg(buf[SEND_BUF_INDEX],
-                sizeof(DAT_RMR_TRIPLET),
-                lmr_context[SEND_BUF_INDEX],
-                cookie, DAT_COMPLETION_SUPPRESS_FLAG);
-
-       dat_ep_get_status(ep[0], NULL, &in, &out);
-       printf("EP[0] status: posted buffers: Req=%d, Rcv=%d\n", in, out);
-
-       /*
-        *  Wait for their RMR
-        */
-       for (i = 0, ctx = 0; i < eps; i++, ctx++) {
-               /* expected cookie, recv buf idx in every mem pool */
-               ctx = (ctx % REG_MEM_COUNT) ? ctx : ctx + RECV_BUF_INDEX;
-               LOGPRINTF("Waiting for remote to send RMR data\n");
-
-               status = dat_evd_wait(dto_evd, DTO_TIMEOUT, 1, &event, &nmore);
-               _OK(status, "dat_evd_wait after dat_ep_post_send");
-
-               if ((event.event_number != DAT_DTO_COMPLETION_EVENT) &&
-                   (ud_test && event.event_number != DAT_IB_DTO_EVENT)) {
-                       printf("unexpected event waiting for RMR context "
-                              "- 0x%x\n", event.event_number);
-                       exit(1);
-               }
-               _OK(dto_event->status, "event status for post_recv");
-
-               /* careful when checking cookies:
-                * Client - receiving multi messages on a single EP 
-                * Server - not receiving on multiple EP's
-                */
-               if (!server || (server && !multi_eps)) {
-                       if (dto_event->transfered_length != msg_size ||
-                           dto_event->user_cookie.as_64 != ctx) {
-                               printf("unexpected event data on recv: len=%d"
-                                      " cookie=" F64x " expected %d/%d\n",
-                                      (int)dto_event->transfered_length,
-                                      dto_event->user_cookie.as_64,
-                                      msg_size, ctx);
-                               exit(1);
-                       }
-                       /* Server - receiving one message each across many EP's */
-               } else {
-                       if (dto_event->transfered_length != msg_size ||
-                           dto_event->user_cookie.as_64 != RECV_BUF_INDEX) {
-                               printf("unexpected event data on recv: len=%d"
-                                      "cookie=" F64x " expected %d/%d\n",
-                                      (int)dto_event->transfered_length,
-                                      dto_event->user_cookie.as_64,
-                                      msg_size, RECV_BUF_INDEX);
-                               exit(1);
-                       }
-               }
-
-               /* swap RMR,address info to host order */
-               if (!server || (server && !multi_eps))
-                       r_iov = (DAT_RMR_TRIPLET *) buf[ctx];
-               else
-                       r_iov =
-                           (DAT_RMR_TRIPLET *) buf[(i * REG_MEM_COUNT) +
-                                                   RECV_BUF_INDEX];
-
-               if (ud_test)
-                       r_iov = (DAT_RMR_TRIPLET *) ((char *)r_iov + 40);
-
-               r_iov->rmr_context = ntoh32(r_iov->rmr_context);
-               r_iov->virtual_address = ntoh64(r_iov->virtual_address);
-               r_iov->segment_length = ntoh32(r_iov->segment_length);
-
-               printf("Recv RMR message: r_iov(%p):"
-                      " r_key_ctx=%x,va=" F64x ",len=0x%x on EP=%p\n",
-                      r_iov, r_iov->rmr_context,
-                      r_iov->virtual_address,
-                      r_iov->segment_length, dto_event->ep_handle);
-       }
-       return (0);
-}
-
-int disconnect_ep(void)
-{
-       DAT_RETURN status;
-       DAT_EVENT event;
-       DAT_COUNT nmore;
-       int i;
-
-       if (!ud_test) {
-               status = dat_ep_disconnect(ep[0], DAT_CLOSE_DEFAULT);
-               _OK2(status, "dat_ep_disconnect");
-
-               status = dat_evd_wait(con_evd, DAT_TIMEOUT_INFINITE, 1,
-                                     &event, &nmore);
-               _OK(status, "dat_evd_wait");
-       }
-       if (psp) {
-               status = dat_psp_free(psp);
-               _OK2(status, "dat_psp_free");
-       }
-       for (i = 0; i < REG_MEM_COUNT * eps; i++) {
-               status = dat_lmr_free(lmr[i]);
-               _OK2(status, "dat_lmr_free");
-       }
-       if (lmr_atomic) {
-               status = dat_lmr_free(lmr_atomic);
-               _OK2(status, "dat_lmr_free_atomic");
-       }
-       for (i = 0; i < eps; i++) {
-               if (counters) { /* examples of query and print */
-                       int ii;
-                       DAT_UINT64 ep_cntrs[DCNT_EP_ALL_COUNTERS];
-
-                       dat_query_counters(ep[i], DCNT_EP_ALL_COUNTERS,
-                                          ep_cntrs, 0);
-                       printf(" EP[%d] Cntrs:", i);
-                       for (ii = 0; ii < DCNT_EP_ALL_COUNTERS; ii++)
-                               printf(" " F64u "", ep_cntrs[ii]);
-                       printf("\n");
-                       dat_print_counters(ep[i], DCNT_EP_ALL_COUNTERS, 0);
-               }
-               status = dat_ep_free(ep[i]);
-               _OK2(status, "dat_ep_free");
-       }
-       if (counters) {         /* examples of query and print */
-               int ii;
-               DAT_UINT64 evd_cntrs[DCNT_EVD_ALL_COUNTERS];
-
-               dat_query_counters(dto_evd, DCNT_EVD_ALL_COUNTERS,
-                                  evd_cntrs, 0);
-               printf(" DTO_EVD Cntrs:");
-               for (ii = 0; ii < DCNT_EVD_ALL_COUNTERS; ii++)
-                       printf(" " F64u "", evd_cntrs[ii]);
-               printf("\n");
-               dat_print_counters(dto_evd, DCNT_EVD_ALL_COUNTERS, 0);
-
-               dat_query_counters(con_evd, DCNT_EVD_ALL_COUNTERS,
-                                  evd_cntrs, 0);
-               printf(" CONN_EVD Cntrs:");
-               for (ii = 0; ii < DCNT_EVD_ALL_COUNTERS; ii++)
-                       printf(" " F64u "", evd_cntrs[ii]);
-               printf("\n");
-               dat_print_counters(con_evd, DCNT_EVD_ALL_COUNTERS, 0);
-
-               dat_query_counters(cr_evd, DCNT_EVD_ALL_COUNTERS, evd_cntrs, 0);
-               printf(" CR_EVD Cntrs:");
-               for (ii = 0; ii < DCNT_EVD_ALL_COUNTERS; ii++)
-                       printf(" " F64u "", evd_cntrs[ii]);
-               printf("\n");
-               dat_print_counters(cr_evd, DCNT_EVD_ALL_COUNTERS, 0);
-       }
-       status = dat_evd_free(dto_evd);
-       _OK2(status, "dat_evd_free DTO");
-
-       status = dat_evd_free(con_evd);
-       _OK2(status, "dat_evd_free CON");
-
-       status = dat_evd_free(cr_evd);
-       _OK2(status, "dat_evd_free CR");
-
-       status = dat_pz_free(pz);
-       _OK2(status, "dat_pz_free");
-
-       if (counters) {         /* examples of query and print */
-               int ii;
-               DAT_UINT64 ia_cntrs[DCNT_IA_ALL_COUNTERS];
-
-               dat_query_counters(ia, DCNT_IA_ALL_COUNTERS, ia_cntrs, 0);
-               printf(" IA Cntrs:");
-               for (ii = 0; ii < DCNT_IA_ALL_COUNTERS; ii++)
-                       printf(" " F64u "", ia_cntrs[ii]);
-               printf("\n");
-               dat_print_counters(ia, DCNT_IA_ALL_COUNTERS, 0);
-       }
-       status = dat_ia_close(ia, DAT_CLOSE_DEFAULT);
-       _OK2(status, "dat_ia_close");
-
-       return (0);
-}
-
-int do_immediate()
-{
-       DAT_EVENT event;
-       DAT_COUNT nmore;
-       DAT_LMR_TRIPLET iov;
-       DAT_RMR_TRIPLET r_iov;
-       DAT_DTO_COOKIE cookie;
-       DAT_RETURN status;
-       DAT_UINT32 immed_data;
-       DAT_UINT32 immed_data_recv = 0;
-       DAT_DTO_COMPLETION_EVENT_DATA *dto_event =
-           &event.event_data.dto_completion_event_data;
-       DAT_IB_EXTENSION_EVENT_DATA *ext_event =
-           (DAT_IB_EXTENSION_EVENT_DATA *) & event.event_extension_data[0];
-
-       printf("\nDoing RDMA WRITE IMMEDIATE DATA\n");
-
-       if (server) {
-               immed_data = 0x1111;
-       } else {
-               immed_data = 0x7777;
-       }
-
-       cookie.as_64 = 0x5555;
-
-       /* RMR info already swapped back to host order in connect_ep */
-       r_iov = *buf[RECV_BUF_INDEX];
-
-       iov.lmr_context = lmr_context[SND_RDMA_BUF_INDEX];
-       iov.virtual_address = (DAT_VADDR) (uintptr_t) buf[SND_RDMA_BUF_INDEX];
-       iov.segment_length = buf_size;
-
-       cookie.as_64 = 0x9999;
-
-       status = dat_ib_post_rdma_write_immed(ep[0],    // ep_handle
-                                             1,        // segments
-                                             &iov,     // LMR
-                                             cookie,   // user_cookie
-                                             &r_iov,   // RMR
-                                             immed_data,
-                                             DAT_COMPLETION_DEFAULT_FLAG);
-       _OK(status, "dat_ib_post_rdma_write_immed");
-
-       /*
-        *  Collect first event, write completion or inbound recv with immed
-        */
-       status = dat_evd_wait(dto_evd, DTO_TIMEOUT, 1, &event, &nmore);
-       _OK(status, "dat_evd_wait after dat_ib_post_rdma_write");
-       if (event.event_number != DAT_IB_DTO_EVENT) {
-               printf("unexpected event #0x%x waiting for WR-IMMED #0x%x\n",
-                      event.event_number, DAT_IB_DTO_EVENT);
-               exit(1);
-       }
-
-       if (nmore)
-               printf("%s() nmore %d\n", __FUNCTION__, nmore);
-       _OK(dto_event->status, "DTO event status");
-       if (ext_event->type == DAT_IB_RDMA_WRITE_IMMED) {
-               if ((dto_event->transfered_length != buf_size) ||
-                   (dto_event->user_cookie.as_64 != 0x9999)) {
-                       printf
-                           ("unexpected event data for rdma_write_immed: len=%d "
-                            "cookie=0x%x\n", (int)dto_event->transfered_length,
-                            (int)dto_event->user_cookie.as_64);
-                       exit(1);
-               }
-       } else if (ext_event->type == DAT_IB_RDMA_WRITE_IMMED_DATA) {
-               if ((dto_event->transfered_length != buf_size) ||
-                   (dto_event->user_cookie.as_64 != RECV_BUF_INDEX + 1)) {
-                       printf
-                           ("unexpected event data of immediate write: len=%d "
-                            "cookie=" F64x " expected %d/%d\n",
-                            (int)dto_event->transfered_length,
-                            dto_event->user_cookie.as_64, (int)sizeof(int),
-                            RECV_BUF_INDEX + 1);
-                       exit(1);
-               }
-
-               /* get immediate data from event */
-               immed_data_recv = ext_event->val.immed.data;
-       } else {
-               printf("unexpected extension type for event - 0x%x, 0x%x\n",
-                      event.event_number, ext_event->type);
-               exit(1);
-       }
-
-       /*
-        * Collect second event, write completion or inbound recv with immed
-        */
-       status = dat_evd_wait(dto_evd, DTO_TIMEOUT, 1, &event, &nmore);
-       _OK(status, "dat_evd_wait after dat_ib_post_rdma_write");
-       if (event.event_number != DAT_IB_DTO_EVENT) {
-               printf("unexpected event # waiting for WR-IMMED - 0x%x\n",
-                      event.event_number);
-               exit(1);
-       }
-
-       _OK(dto_event->status, "event status");
-       if (ext_event->type == DAT_IB_RDMA_WRITE_IMMED) {
-               if ((dto_event->transfered_length != buf_size) ||
-                   (dto_event->user_cookie.as_64 != 0x9999)) {
-                       printf
-                           ("unexpected event data for rdma_write_immed: len=%d "
-                            "cookie=0x%x\n", (int)dto_event->transfered_length,
-                            (int)dto_event->user_cookie.as_64);
-                       exit(1);
-               }
-       } else if (ext_event->type == DAT_IB_RDMA_WRITE_IMMED_DATA) {
-               if ((dto_event->transfered_length != buf_size) ||
-                   (dto_event->user_cookie.as_64 != RECV_BUF_INDEX + 1)) {
-                       printf
-                           ("unexpected event data of immediate write: len=%d "
-                            "cookie=" F64x " expected %d/%d\n",
-                            (int)dto_event->transfered_length,
-                            dto_event->user_cookie.as_64, (int)sizeof(int),
-                            RECV_BUF_INDEX + 1);
-                       exit(1);
-               }
-
-               /* get immediate data from event */
-               immed_data_recv = ext_event->val.immed.data;
-       } else {
-               printf("unexpected extension type for event - 0x%x, 0x%x\n",
-                      event.event_number, ext_event->type);
-               exit(1);
-       }
-
-       if ((server) && (immed_data_recv != 0x7777)) {
-               printf("ERROR: Server: unexpected imm_data_recv 0x%x/0x%x\n",
-                      0x7777, immed_data_recv);
-               exit(1);
-       } else if ((!server) && (immed_data_recv != 0x1111)) {
-               printf("ERROR: Client: unexpected imm_data_recv 0x%x/0x%x\n",
-                      0x1111, immed_data_recv);
-               exit(1);
-       }
-
-       if (server)
-               printf("Server received immed_data=0x%x\n", immed_data_recv);
-       else
-               printf("Client received immed_data=0x%x\n", immed_data_recv);
-
-       printf("rdma buffer %p contains: %s\n",
-              buf[RCV_RDMA_BUF_INDEX], (char *)buf[RCV_RDMA_BUF_INDEX]);
-
-       printf("\n RDMA_WRITE_WITH_IMMEDIATE_DATA test - PASSED\n");
-       return (0);
-}
-
-int do_cmp_swap()
-{
-       DAT_DTO_COOKIE cookie;
-       DAT_RETURN status;
-       DAT_EVENT event;
-       DAT_COUNT nmore;
-       DAT_LMR_TRIPLET l_iov;
-       DAT_RMR_TRIPLET r_iov;
-       volatile DAT_UINT64 *target = (DAT_UINT64 *) buf[RCV_RDMA_BUF_INDEX];
-       DAT_DTO_COMPLETION_EVENT_DATA *dto_event =
-           &event.event_data.dto_completion_event_data;
-       DAT_IB_EXTENSION_EVENT_DATA *ext_event =
-           (DAT_IB_EXTENSION_EVENT_DATA *) & event.event_extension_data[0];
-
-       printf("\nDoing CMP and SWAP\n");
-
-       /* RMR info already swapped back to host order in connect_ep */
-       r_iov = *buf[RECV_BUF_INDEX];
-
-       l_iov.lmr_context = lmr_atomic_context;
-       l_iov.virtual_address = (DAT_UINT64) (uintptr_t) atomic_buf;
-       l_iov.segment_length = BUF_SIZE_ATOMIC;
-
-       cookie.as_64 = 3333;
-
-       if (server) {
-               *target = 0x12345;
-               sleep(1);
-               /* Server does not compare and should not swap */
-               printf("dtx svr - starting cmp_swap\n");
-               status = dat_ib_post_cmp_and_swap(ep[0],
-                                                 (DAT_UINT64) 0x654321,
-                                                 (DAT_UINT64) 0x6789A,
-                                                 &l_iov,
-                                                 cookie,
-                                                 &r_iov,
-                                                 DAT_COMPLETION_DEFAULT_FLAG);
-               printf("dtx svr - done cmp_swap, chk status\n");
-       } else {
-               *target = 0x54321;
-               sleep(1);
-               printf("dtx cli - starting cmp_swap\n");
-               /* Client does compare and should swap */
-               status = dat_ib_post_cmp_and_swap(ep[0],
-                                                 (DAT_UINT64) 0x12345,
-                                                 (DAT_UINT64) 0x98765,
-                                                 &l_iov,
-                                                 cookie,
-                                                 &r_iov,
-                                                 DAT_COMPLETION_DEFAULT_FLAG);
-               printf("dtx cli - done cmp_swap, chk status\n");
-       }
-       _OK(status, "dat_ib_post_cmp_and_swap");
-       status = dat_evd_wait(dto_evd, DTO_TIMEOUT, 1, &event, &nmore);
-       _OK(status, "dat_evd_wait for compare and swap");
-       if (event.event_number != DAT_IB_DTO_EVENT) {
-               printf("unexpected event after post_cmp_and_swap: 0x%x\n",
-                      event.event_number);
-               exit(1);
-       }
-
-       _OK(dto_event->status, "event status for CMP and SWAP");
-       if (ext_event->type != DAT_IB_CMP_AND_SWAP) {
-               printf("unexpected event data of cmp_swap: type=%d cookie=%d "
-                      "original " F64x "\n",
-                      (int)ext_event->type,
-                      (int)dto_event->user_cookie.as_64, *atomic_buf);
-               exit(1);
-       }
-
-       sleep(2);               /* wait for other side to complete swap */
-
-       if (server) {
-               printf("Server got original data        = " F64x ", expected "
-                      "0x54321\n", *atomic_buf);
-               printf("Client final result (on Server) = " F64x ", expected "
-                      "0x98765\n", *target);
-
-               if (*atomic_buf != 0x54321 || *target != 0x98765) {
-                       printf("ERROR: Server CMP_SWAP\n");
-                       exit(1);
-               }
-       } else {
-               printf("Client got original data        = " F64x ", expected "
-                      "0x12345\n", *atomic_buf);
-               printf("Server final result (on Client) = 0x" F64x ", expected "
-                      "0x54321\n", *target);
-
-               if (*atomic_buf != 0x12345 || *target != 0x54321) {
-                       printf("ERROR: Client CMP_SWAP\n");
-                       exit(1);
-               }
-       }
-       printf("\n CMP_SWAP test - PASSED\n");
-       return (0);
-}
-
-int do_fetch_add()
-{
-       DAT_DTO_COOKIE cookie;
-       DAT_RETURN status;
-       DAT_EVENT event;
-       DAT_COUNT nmore;
-       DAT_LMR_TRIPLET l_iov;
-       DAT_RMR_TRIPLET r_iov;
-       volatile DAT_UINT64 *target = (DAT_UINT64 *) buf[RCV_RDMA_BUF_INDEX];
-       DAT_DTO_COMPLETION_EVENT_DATA *dto_event =
-           &event.event_data.dto_completion_event_data;
-       DAT_IB_EXTENSION_EVENT_DATA *ext_event =
-           (DAT_IB_EXTENSION_EVENT_DATA *) & event.event_extension_data[0];
-
-       printf("\nDoing FETCH and ADD\n");
-
-       /* RMR info already swapped back to host order in connect_ep */
-       r_iov = *buf[RECV_BUF_INDEX];
-
-       l_iov.lmr_context = lmr_atomic_context;
-       l_iov.virtual_address = (DAT_UINT64) (uintptr_t) atomic_buf;
-       l_iov.segment_length = BUF_SIZE_ATOMIC;
-
-       cookie.as_64 = 0x7777;
-       if (server) {
-               /* Wait for Client to finish cmp_swap */
-               while (*target != 0x98765)
-                       sleep(1);
-               *target = 0x10;
-               sleep(1);
-               status = dat_ib_post_fetch_and_add(ep[0],
-                                                  (DAT_UINT64) 0x100,
-                                                  &l_iov,
-                                                  cookie,
-                                                  &r_iov,
-                                                  DAT_COMPLETION_DEFAULT_FLAG);
-       } else {
-               /* Wait for Server, no swap so nothing to check */
-               *target = 0x100;
-               sleep(1);
-               status = dat_ib_post_fetch_and_add(ep[0],
-                                                  (DAT_UINT64) 0x10,
-                                                  &l_iov,
-                                                  cookie,
-                                                  &r_iov,
-                                                  DAT_COMPLETION_DEFAULT_FLAG);
-       }
-       _OK(status, "dat_ib_post_fetch_and_add");
-       status = dat_evd_wait(dto_evd, DTO_TIMEOUT, 1, &event, &nmore);
-       _OK(status, "dat_evd_wait for fetch and add");
-       if (event.event_number != DAT_IB_DTO_EVENT) {
-               printf("unexpected event after post_fetch_and_add: 0x%x\n",
-                      event.event_number);
-               exit(1);
-       }
-
-       _OK(dto_event->status, "event status for FETCH and ADD");
-       if (ext_event->type != DAT_IB_FETCH_AND_ADD) {
-               printf("unexpected event data of fetch and add : type=%d "
-                      "cookie=%d original%d\n",
-                      (int)ext_event->type,
-                      (int)dto_event->user_cookie.as_64, (int)*atomic_buf);
-               exit(1);
-       }
-
-       if (server) {
-               printf("Client original data (on Server) = " F64x ", expected "
-                      "0x100\n", *atomic_buf);
-       } else {
-               printf("Server original data (on Client) = " F64x ", expected "
-                      "0x10\n", *atomic_buf);
-       }
-
-       sleep(1);
-
-       if (server) {
-               status = dat_ib_post_fetch_and_add(ep[0],
-                                                  (DAT_UINT64) 0x100,
-                                                  &l_iov,
-                                                  cookie,
-                                                  &r_iov,
-                                                  DAT_COMPLETION_DEFAULT_FLAG);
-       } else {
-               status = dat_ib_post_fetch_and_add(ep[0],
-                                                  (DAT_UINT64) 0x10,
-                                                  &l_iov,
-                                                  cookie,
-                                                  &r_iov,
-                                                  DAT_COMPLETION_DEFAULT_FLAG);
-       }
-
-       status = dat_evd_wait(dto_evd, DTO_TIMEOUT, 1, &event, &nmore);
-       _OK(status, "dat_evd_wait for second fetch and add");
-       if (event.event_number != DAT_IB_DTO_EVENT) {
-               printf("unexpected event after second post_fetch_and_add: "
-                      "0x%x\n", event.event_number);
-               exit(1);
-       }
-
-       _OK(dto_event->status, "event status for second FETCH and ADD");
-       if (ext_event->type != DAT_IB_FETCH_AND_ADD) {
-               printf("unexpected event data of second fetch and add : "
-                      "type=%d cookie=%d original%p\n",
-                      (int)ext_event->type,
-                      (int)dto_event->user_cookie.as_64, atomic_buf);
-               exit(1);
-       }
-
-       sleep(1);               /* wait for other side to complete fetch_add */
-
-       if (server) {
-               printf("Server got original data         = " F64x ", expected "
-                      "0x200\n", *atomic_buf);
-               printf("Client final result (on Server)  = " F64x ", expected "
-                      "0x30\n", *target);
-
-               if (*atomic_buf != 0x200 || *target != 0x30) {
-                       printf("ERROR: Server FETCH_ADD\n");
-                       exit(1);
-               }
-       } else {
-               printf("Server side original data        = " F64x ", expected "
-                      "0x20\n", *atomic_buf);
-               printf("Server final result (on Client)  = " F64x ", expected "
-                      "0x300\n", *target);
-
-               if (*atomic_buf != 0x20 || *target != 0x300) {
-                       printf("ERROR: Server FETCH_ADD\n");
-                       exit(1);
-               }
-       }
-       printf("\n FETCH_ADD test - PASSED\n");
-       return (0);
-}
-
-int main(int argc, char **argv)
-{
-       int rc;
-
-       /* parse arguments */
-       while ((rc = getopt(argc, argv, "csvumpU:h:b:P:")) != -1) {
-               switch (rc) {
-               case 'u':
-                       ud_test = 1;
-                       eps = MAX_EP_COUNT / 2;
-                       break;
-               case 'm':
-                       multi_eps = 1;
-                       break;
-               case 'c':
-                       server = 0;
-                       break;
-               case 's':
-                       server = 1;
-                       break;
-               case 'p':
-                       counters = 1;
-                       break;
-               case 'h':
-                       remote_host = 1;
-                       strcpy(hostname, optarg);
-                       break;
-               case 'b':
-                       buf_size = atoi(optarg);
-                       break;
-               case 'U':
-                       ud_test = 1;
-                       eps = MIN(atoi(optarg), MAX_EP_COUNT);
-                       break;
-               case 'P':
-                       strcpy(provider, optarg);
-                       break;
-               case 'v':
-                       verbose = 1;
-                       break;
-               default:
-                       print_usage();
-                       exit(-12);
-               }
-       }
-
-#if defined(_WIN32) || defined(_WIN64)
-       {
-               WSADATA wsaData;
-               int i;
-
-               i = WSAStartup(MAKEWORD(2, 2), &wsaData);
-               if (i != 0) {
-                       printf("%s WSAStartup(2.2) fail? (0x%x)\n", argv[0], i);
-                       fflush(stdout);
-                       exit(1);
-               }
-       }
-#endif
-       /* for non UD tests, -h is always client */
-       if (remote_host && !ud_test)
-               server = 0;
-
-       if (!server) {
-               printf("\nRunning as Client - %s %s %d endpoint(s)\n",
-                      provider, ud_test ? "UD test" : "", eps);
-       } else {
-               printf("\nRunning as Server - %s %s %d endpoint(s)\n",
-                      provider, ud_test ? "UD test" : "", eps);
-       }
-
-       /*
-        * connect
-        */
-       if (connect_ep(hostname)) {
-               _WSACleanup();
-               exit(1);
-       }
-       if (ud_test)
-               goto bail;
-
-       if (do_immediate()) {
-               _WSACleanup();
-               exit(1);
-       }
-       if (do_cmp_swap()) {
-               _WSACleanup();
-               exit(1);
-       }
-       if (do_fetch_add()) {
-               _WSACleanup();
-               exit(1);
-       }
-      bail:
-       rc = disconnect_ep();
-       _WSACleanup();
-
-       if (!rc)
-               printf("\n IB extension test - %s test PASSED\n\n",
-                      ud_test ? "UD" : "immed/atomic");
-       return rc;
-}
+/*\r
+ * Copyright (c) 2007-2008 Intel Corporation.  All rights reserved.\r
+ *\r
+ * This software is available to you under a choice of one of two\r
+ * licenses.  You may choose to be licensed under the terms of the GNU\r
+ * General Public License (GPL) Version 2, available from the file\r
+ * COPYING in the main directory of this source tree, or the\r
+ * OpenIB.org BSD license below:\r
+ *\r
+ *     Redistribution and use in source and binary forms, with or\r
+ *     without modification, are permitted provided that the following\r
+ *     conditions are met:\r
+ *\r
+ *      - Redistributions of source code must retain the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer.\r
+ *\r
+ *      - Redistributions in binary form must reproduce the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer in the documentation and/or other materials\r
+ *        provided with the distribution.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
+ * SOFTWARE.\r
+ *\r
+ * $Id: $\r
+ */\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+\r
+#if defined(_WIN32) || defined(_WIN64)\r
+#include <windows.h>\r
+#include <winsock2.h>\r
+#include <ws2tcpip.h>\r
+#include <io.h>\r
+#include <process.h>\r
+#include <complib/cl_types.h>\r
+#include "..\..\..\..\etc\user\getopt.c"\r
+#define __BYTE_ORDER __LITTLE_ENDIAN\r
+\r
+#define F64x "%I64x"\r
+#define F64u "%I64u"\r
+#define DAPL_PROVIDER "ibnic0v2"\r
+#else\r
+#include <netdb.h>\r
+#include <sys/types.h>\r
+#include <sys/socket.h>\r
+#include <sys/time.h>\r
+#include <netinet/in.h>\r
+#include <netinet/tcp.h>\r
+#include <arpa/inet.h>\r
+#include <inttypes.h>\r
+#include <string.h>\r
+#include <unistd.h>\r
+\r
+#define DAPL_PROVIDER "ofa-v2-ib0"\r
+#define F64x "%"PRIx64""\r
+#define F64u "%"PRIu64""\r
+\r
+#endif\r
+\r
+#include "dat2/udat.h"\r
+#include "dat2/dat_ib_extensions.h"\r
+\r
+int disconnect_ep(void);\r
+\r
+#define _OK(status, str) \\r
+{\\r
+       const char  *maj_msg, *min_msg;\\r
+       if (status != DAT_SUCCESS) {\\r
+               dat_strerror(status, &maj_msg, &min_msg);\\r
+               fprintf(stderr, str " returned %s : %s\n", maj_msg, min_msg);\\r
+               dat_ia_close(ia, DAT_CLOSE_DEFAULT);\\r
+               exit(1);\\r
+       } else if (verbose) {\\r
+               printf("dtestx: %s success\n",str);\\r
+       }\\r
+}\r
+\r
+#define _OK2(status, str)\\r
+{\\r
+       const char  *maj_msg, *min_msg;\\r
+       if (status != DAT_SUCCESS) {\\r
+               dat_strerror(status, &maj_msg, &min_msg);\\r
+               fprintf(stderr, str " returned %s : %s\n", maj_msg, min_msg);\\r
+               dat_ia_close(ia, DAT_CLOSE_DEFAULT);\\r
+               exit(1);\\r
+       } else if (verbose) {\\r
+               printf("dtestx: %s\n",str);\\r
+       }\\r
+}\r
+\r
+/* byte swap helpers from Complib */\r
+#if __BYTE_ORDER == __LITTLE_ENDIAN\r
+#define ntoh16(x) (uint16_t)( \\r
+        (((uint16_t)(x) & 0x00FF) << 8) | \\r
+        (((uint16_t)(x) & 0xFF00) >> 8))\r
+#define hton16(x) ntoh16(x)\r
+#define ntoh32(x) (uint32_t)( \\r
+        (((uint32_t)(x) & 0x000000FF) << 24)| \\r
+        (((uint32_t)(x) & 0x0000FF00) << 8) | \\r
+        (((uint32_t)(x) & 0x00FF0000) >> 8) | \\r
+        (((uint32_t)(x) & 0xFF000000) >> 24))\r
+#define hton32(x) ntoh32(x)\r
+#define ntoh64(x) (uint64_t)( \\r
+        (((uint64_t)x & 0x00000000000000FFULL) << 56) | \\r
+        (((uint64_t)x & 0x000000000000FF00ULL) << 40) | \\r
+        (((uint64_t)x & 0x0000000000FF0000ULL) << 24) | \\r
+        (((uint64_t)x & 0x00000000FF000000ULL) << 8 ) | \\r
+        (((uint64_t)x & 0x000000FF00000000ULL) >> 8 ) | \\r
+        (((uint64_t)x & 0x0000FF0000000000ULL) >> 24) | \\r
+        (((uint64_t)x & 0x00FF000000000000ULL) >> 40) | \\r
+        (((uint64_t)x & 0xFF00000000000000ULL) >> 56))\r
+#define hton64(x) ntoh64(x)\r
+#elif __BYTE_ORDER == __BIG_ENDIAN\r
+#define hton16(x) (x)\r
+#define ntoh16(x) (x)\r
+#define hton32(x) (x)\r
+#define ntoh32(x) (x)\r
+#define hton64(x) (x)\r
+#define ntoh64(x) (x)\r
+#endif                         /* __BYTE_ORDER == __BIG_ENDIAN */\r
+\r
+#define MIN(a, b) ((a < b) ? (a) : (b))\r
+#define MAX(a, b) ((a > b) ? (a) : (b))\r
+\r
+#define DTO_TIMEOUT       (1000*1000*5)\r
+#define CONN_TIMEOUT      (1000*1000*30)\r
+#define SERVER_TIMEOUT    (DAT_TIMEOUT_INFINITE)\r
+#define CLIENT_ID              31111\r
+#define SERVER_ID              31112\r
+#define BUF_SIZE               256\r
+#define BUF_SIZE_ATOMIC                8\r
+#define REG_MEM_COUNT          10\r
+#define SND_RDMA_BUF_INDEX     0\r
+#define RCV_RDMA_BUF_INDEX     1\r
+#define SEND_BUF_INDEX         2\r
+#define RECV_BUF_INDEX         3\r
+#define MAX_EP_COUNT           8\r
+\r
+DAT_VADDR *atomic_buf;\r
+DAT_LMR_HANDLE lmr_atomic;\r
+DAT_LMR_CONTEXT lmr_atomic_context;\r
+DAT_RMR_CONTEXT rmr_atomic_context;\r
+DAT_VLEN reg_atomic_size;\r
+DAT_VADDR reg_atomic_addr;\r
+DAT_LMR_HANDLE lmr[REG_MEM_COUNT * MAX_EP_COUNT];\r
+DAT_LMR_CONTEXT lmr_context[REG_MEM_COUNT * MAX_EP_COUNT];\r
+DAT_RMR_TRIPLET rmr[REG_MEM_COUNT * MAX_EP_COUNT];\r
+DAT_RMR_CONTEXT rmr_context[REG_MEM_COUNT * MAX_EP_COUNT];\r
+DAT_VLEN reg_size[REG_MEM_COUNT * MAX_EP_COUNT];\r
+DAT_VADDR reg_addr[REG_MEM_COUNT * MAX_EP_COUNT];\r
+DAT_RMR_TRIPLET *buf[REG_MEM_COUNT * MAX_EP_COUNT];\r
+DAT_EP_HANDLE ep[MAX_EP_COUNT];\r
+DAT_EVD_HANDLE async_evd = DAT_HANDLE_NULL;\r
+DAT_IA_HANDLE ia = DAT_HANDLE_NULL;\r
+DAT_PZ_HANDLE pz = DAT_HANDLE_NULL;\r
+DAT_EVD_HANDLE cr_evd = DAT_HANDLE_NULL;\r
+DAT_EVD_HANDLE con_evd = DAT_HANDLE_NULL;\r
+DAT_EVD_HANDLE dto_evd = DAT_HANDLE_NULL;\r
+DAT_PSP_HANDLE psp = DAT_HANDLE_NULL;\r
+int server = 1;\r
+int remote_host = 0;\r
+int ud_test = 0;\r
+int multi_eps = 0;\r
+int buf_size = BUF_SIZE;\r
+int msg_size = sizeof(DAT_RMR_TRIPLET);\r
+char provider[64] = DAPL_PROVIDER;\r
+char hostname[256] = { 0 };\r
+DAT_IB_ADDR_HANDLE remote_ah[MAX_EP_COUNT];\r
+int eps = 1;\r
+int verbose = 0;\r
+int counters = 0;\r
+int counters_ok = 0;\r
+\r
+#define LOGPRINTF if (verbose) printf\r
+\r
+void print_usage(void)\r
+{\r
+       printf("\n dtestx usage \n\n");\r
+       printf("v: verbose\n");\r
+       printf("p: print counters\n");\r
+       printf("u  unreliable datagram test\n");\r
+       printf("U: unreliable datagram test, UD endpoint count\n");\r
+       printf("m  unreliable datagram test, multiple Server endpoints\n");\r
+       printf("b: buf length to allocate\n");\r
+       printf("h: hostname/address of Server, client and UDP server\n");\r
+       printf("c: Client\n");\r
+       printf("s: Server, default\n");\r
+       printf("P: provider name (default = ofa-v2-ib0)\n");\r
+       printf("\n");\r
+}\r
+\r
+#if defined(_WIN32) || defined(_WIN64)\r
+static void sleep(int secs)\r
+{\r
+       Sleep(secs * 1000);\r
+}\r
+\r
+#define _WSACleanup() WSACleanup()\r
+#else\r
+#define        _WSACleanup()\r
+#endif\r
+\r
+void\r
+send_msg(void *data,\r
+        DAT_COUNT size,\r
+        DAT_LMR_CONTEXT context,\r
+        DAT_DTO_COOKIE cookie, DAT_COMPLETION_FLAGS flags)\r
+{\r
+       DAT_LMR_TRIPLET iov;\r
+       DAT_EVENT event;\r
+       DAT_COUNT nmore;\r
+       DAT_RETURN status;\r
+       int i, ep_idx = 0, ah_idx = 0;\r
+       DAT_DTO_COMPLETION_EVENT_DATA *dto_event =\r
+           &event.event_data.dto_completion_event_data;\r
+\r
+       iov.lmr_context = context;\r
+       iov.virtual_address = (DAT_VADDR) (uintptr_t) data;\r
+       iov.segment_length = (DAT_VLEN) size;\r
+\r
+       for (i = 0; i < eps; i++) {\r
+               if (ud_test) {\r
+                       /* \r
+                        * Client and Server: ep[0] and ah[0] on single \r
+                        * and ep[i] on multiple (-m) endpoint options. \r
+                        */\r
+                       if (multi_eps) {\r
+                               ep_idx = i;\r
+                               ah_idx = server ? 0 : i;\r
+                       }\r
+                       printf("%s sending on ep=%p to remote_ah: ah=%p"\r
+                              " qpn=0x%x addr=%s\n",\r
+                              server ? "Server" : "Client", ep[ep_idx],\r
+                              remote_ah[ah_idx].ah,\r
+                              remote_ah[ah_idx].qpn,\r
+                              inet_ntoa(((struct sockaddr_in *)\r
+                                         &remote_ah[ah_idx].ia_addr)->\r
+                                        sin_addr));\r
+\r
+                       /* client expects all data in on first EP */\r
+                       status = dat_ib_post_send_ud(ep[ep_idx],\r
+                                                    1,\r
+                                                    &iov,\r
+                                                    &remote_ah[ah_idx],\r
+                                                    cookie, flags);\r
+\r
+               } else {\r
+                       status = dat_ep_post_send(ep[0], 1, &iov,\r
+                                                 cookie, flags);\r
+               }\r
+               _OK(status, "dat_ep_post_send");\r
+\r
+               if (!(flags & DAT_COMPLETION_SUPPRESS_FLAG)) {\r
+                       status = dat_evd_wait(dto_evd, DTO_TIMEOUT,\r
+                                             1, &event, &nmore);\r
+                       _OK(status, "dat_evd_wait after dat_ep_post_send");\r
+\r
+                       if (event.event_number != DAT_DTO_COMPLETION_EVENT &&\r
+                           ud_test && event.event_number != DAT_IB_DTO_EVENT) {\r
+                               printf("unexpected event waiting post_send "\r
+                                      "completion - 0x%x\n",\r
+                                      event.event_number);\r
+                               exit(1);\r
+                       }\r
+                       _OK(dto_event->status, "event status for post_send");\r
+               }\r
+       }\r
+}\r
+\r
+/* RC - Server only, UD - Server and Client, one per EP */\r
+void process_cr(int idx)\r
+{\r
+       DAT_EVENT event;\r
+       DAT_COUNT nmore;\r
+       DAT_RETURN status;\r
+       int pdata;\r
+       DAT_CR_HANDLE cr = DAT_HANDLE_NULL;\r
+       DAT_CONN_QUAL exp_qual = server ? SERVER_ID : CLIENT_ID;\r
+       DAT_CR_PARAM cr_param;\r
+       DAT_CR_ARRIVAL_EVENT_DATA *cr_event =\r
+           &event.event_data.cr_arrival_event_data;\r
+\r
+       LOGPRINTF("%s waiting for connect[%d] request\n",\r
+                 server ? "Server" : "Client", idx);\r
+\r
+       status = dat_evd_wait(cr_evd, SERVER_TIMEOUT, 1, &event, &nmore);\r
+       _OK(status, "CR dat_evd_wait");\r
+\r
+       if (event.event_number != DAT_CONNECTION_REQUEST_EVENT &&\r
+           (ud_test && event.event_number !=\r
+            DAT_IB_UD_CONNECTION_REQUEST_EVENT)) {\r
+               printf("unexpected event,!conn req: 0x%x\n",\r
+                      event.event_number);\r
+               exit(1);\r
+       }\r
+\r
+       if ((cr_event->conn_qual != exp_qual) ||\r
+           (cr_event->sp_handle.psp_handle != psp)) {\r
+               printf("wrong cr event data\n");\r
+               exit(1);\r
+       }\r
+\r
+       cr = cr_event->cr_handle;\r
+       status = dat_cr_query(cr, DAT_CSP_FIELD_ALL, &cr_param);\r
+       _OK(status, "dat_cr_query");\r
+\r
+       /* use private data to select EP */\r
+       pdata = ntoh32(*((int *)cr_param.private_data));\r
+\r
+       LOGPRINTF("%s recvd pdata=0x%x, send pdata=0x%x\n",\r
+                 server ? "Server" : "Client", pdata,\r
+                 *(int *)cr_param.private_data);\r
+\r
+       status = dat_cr_accept(cr, ep[pdata], 4, cr_param.private_data);\r
+       _OK(status, "dat_cr_accept");\r
+\r
+       printf("%s accepted CR on EP[%d]=%p\n",\r
+              server ? "Server" : "Client", pdata, ep[pdata]);\r
+}\r
+\r
+/* RC - Client and Server: 1, UD - Client: 1 per EP, Server: 2 per EP's */\r
+void process_conn(int idx)\r
+{\r
+       DAT_EVENT event;\r
+       DAT_COUNT nmore;\r
+       DAT_RETURN status;\r
+       int pdata;\r
+       DAT_IB_EXTENSION_EVENT_DATA *ext_event = (DAT_IB_EXTENSION_EVENT_DATA *)\r
+           & event.event_extension_data[0];\r
+       DAT_CONNECTION_EVENT_DATA *conn_event =\r
+           &event.event_data.connect_event_data;\r
+\r
+       LOGPRINTF("%s waiting for connect[%d] establishment\n",\r
+                 server ? "Server" : "Client", idx);\r
+\r
+       status = dat_evd_wait(con_evd, CONN_TIMEOUT, 1, &event, &nmore);\r
+       _OK(status, "CONN dat_evd_wait");\r
+\r
+       LOGPRINTF("%s got connect[%d] event 0x%x, pdata %p sz=%d\n",\r
+                 server ? "Server" : "Client", idx,\r
+                 event.event_number, conn_event->private_data, \r
+                 conn_event->private_data_size);\r
+\r
+       /* Waiting on CR's or CONN_EST */\r
+       if (event.event_number != DAT_CONNECTION_EVENT_ESTABLISHED ||\r
+           (ud_test && event.event_number !=\r
+            DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED)) {\r
+               printf("unexpected event, !conn established: 0x%x\n",\r
+                      event.event_number);\r
+               exit(1);\r
+       }\r
+\r
+       /* RC or PASSIVE CONN_EST we are done */\r
+       if (!ud_test)\r
+               return;\r
+\r
+       /* store each remote_ah according to remote EP index */\r
+       pdata = ntoh32(*((int *)conn_event->private_data));\r
+       LOGPRINTF(" Client got private data=0x%x\n", pdata);\r
+\r
+       /* UD, get AH for sends. \r
+        * NOTE: bi-directional AH resolution results in a CONN_EST\r
+        * for both outbound connect and inbound CR.\r
+        * Use Active CONN_EST which includes server's CR\r
+        * pdata for remote_ah idx to send on and ignore PASSIVE CONN_EST.\r
+        *\r
+        * DAT_IB_UD_PASSIVE_REMOTE_AH == passive side CONN_EST\r
+        * DAT_IB_UD_REMOTE_AH == active side CONN_EST\r
+        */\r
+       if (ext_event->type == DAT_IB_UD_REMOTE_AH) {\r
+               remote_ah[pdata] = ext_event->remote_ah;\r
+               printf("remote_ah[%d]: ah=%p, qpn=0x%x "\r
+                      "addr=%s\n",\r
+                      pdata, remote_ah[pdata].ah,\r
+                      remote_ah[pdata].qpn, inet_ntoa(((struct sockaddr_in *)\r
+                                                       &remote_ah[pdata].\r
+                                                       ia_addr)->sin_addr));\r
+\r
+       } else if (ext_event->type != DAT_IB_UD_PASSIVE_REMOTE_AH) {\r
+               printf("unexpected UD ext_event type: 0x%x\n", ext_event->type);\r
+               exit(1);\r
+       }\r
+}\r
+\r
+int connect_ep(char *hostname)\r
+{\r
+       DAT_SOCK_ADDR remote_addr;\r
+       DAT_EP_ATTR ep_attr;\r
+       DAT_RETURN status;\r
+       DAT_REGION_DESCRIPTION region;\r
+       DAT_EVENT event;\r
+       DAT_COUNT nmore;\r
+       DAT_LMR_TRIPLET iov;\r
+       DAT_RMR_TRIPLET *r_iov;\r
+       DAT_DTO_COOKIE cookie;\r
+       DAT_CONN_QUAL conn_qual;\r
+       DAT_BOOLEAN in, out;\r
+       int i, ii, pdata, ctx;\r
+       DAT_PROVIDER_ATTR prov_attrs;\r
+       DAT_DTO_COMPLETION_EVENT_DATA *dto_event =\r
+           &event.event_data.dto_completion_event_data;\r
+\r
+       status = dat_ia_open(provider, 8, &async_evd, &ia);\r
+       _OK(status, "dat_ia_open");\r
+\r
+       memset(&prov_attrs, 0, sizeof(prov_attrs));\r
+       status = dat_ia_query(ia, NULL, 0, NULL,\r
+                             DAT_PROVIDER_FIELD_ALL, &prov_attrs);\r
+       _OK(status, "dat_ia_query");\r
+\r
+       /* Print provider specific attributes */\r
+       for (i = 0; i < prov_attrs.num_provider_specific_attr; i++) {\r
+               LOGPRINTF(" Provider Specific Attribute[%d] %s=%s\n",\r
+                         i, prov_attrs.provider_specific_attr[i].name,\r
+                         prov_attrs.provider_specific_attr[i].value);\r
+\r
+               /* check for counter support */\r
+               status = strcmp(prov_attrs.provider_specific_attr[i].name,\r
+                               "DAT_COUNTERS");\r
+               if (!status)\r
+                       counters_ok = 1;\r
+       }\r
+\r
+       /* make sure provider supports counters */\r
+       if ((counters) && (!counters_ok)) {\r
+               printf("Disable dat_query_counters:"\r
+                      " Provider not built with counters\n");\r
+               counters = 0;\r
+       }\r
+\r
+       status = dat_pz_create(ia, &pz);\r
+       _OK(status, "dat_pz_create");\r
+\r
+       status = dat_evd_create(ia, eps * 2, DAT_HANDLE_NULL, DAT_EVD_CR_FLAG,\r
+                               &cr_evd);\r
+       _OK(status, "dat_evd_create CR");\r
+       status = dat_evd_create(ia, eps * 2, DAT_HANDLE_NULL,\r
+                               DAT_EVD_CONNECTION_FLAG, &con_evd);\r
+       _OK(status, "dat_evd_create CR");\r
+       status = dat_evd_create(ia, eps * 10, DAT_HANDLE_NULL, DAT_EVD_DTO_FLAG,\r
+                               &dto_evd);\r
+       _OK(status, "dat_evd_create DTO");\r
+\r
+       memset(&ep_attr, 0, sizeof(ep_attr));\r
+       if (ud_test) {\r
+               msg_size += 40;\r
+               ep_attr.service_type = DAT_IB_SERVICE_TYPE_UD;\r
+               ep_attr.max_message_size = buf_size;\r
+               ep_attr.max_rdma_read_in = 0;\r
+               ep_attr.max_rdma_read_out = 0;\r
+       } else {\r
+               ep_attr.service_type = DAT_SERVICE_TYPE_RC;\r
+               ep_attr.max_rdma_size = 0x10000;\r
+               ep_attr.max_rdma_read_in = 4;\r
+               ep_attr.max_rdma_read_out = 4;\r
+       }\r
+       ep_attr.qos = 0;\r
+       ep_attr.recv_completion_flags = 0;\r
+       ep_attr.max_recv_dtos = eps * 10;\r
+       ep_attr.max_request_dtos = eps * 10;\r
+       ep_attr.max_recv_iov = 1;\r
+       ep_attr.max_request_iov = 1;\r
+       ep_attr.request_completion_flags = DAT_COMPLETION_DEFAULT_FLAG;\r
+       ep_attr.ep_transport_specific_count = 0;\r
+       ep_attr.ep_transport_specific = NULL;\r
+       ep_attr.ep_provider_specific_count = 0;\r
+       ep_attr.ep_provider_specific = NULL;\r
+\r
+       for (i = 0; i < eps; i++) {\r
+               status = dat_ep_create(ia, pz, dto_evd, dto_evd,\r
+                                      con_evd, &ep_attr, &ep[i]);\r
+               _OK(status, "dat_ep_create");\r
+               LOGPRINTF(" create_ep[%d]=%p\n", i, ep[i]);\r
+       }\r
+\r
+       for (i = 0; i < REG_MEM_COUNT * eps; i++) {\r
+               buf[i] = (DAT_RMR_TRIPLET *) malloc(buf_size);\r
+               region.for_va = buf[i];\r
+               status = dat_lmr_create(ia,\r
+                                       DAT_MEM_TYPE_VIRTUAL,\r
+                                       region,\r
+                                       buf_size,\r
+                                       pz,\r
+                                       DAT_MEM_PRIV_ALL_FLAG |\r
+                                       DAT_IB_MEM_PRIV_REMOTE_ATOMIC,\r
+                                       DAT_VA_TYPE_VA,\r
+                                       &lmr[i],\r
+                                       &lmr_context[i],\r
+                                       &rmr_context[i],\r
+                                       &reg_size[i], &reg_addr[i]);\r
+               _OK(status, "dat_lmr_create");\r
+       }\r
+\r
+       /* register atomic return buffer for original data */\r
+       atomic_buf = (DAT_UINT64 *) malloc(BUF_SIZE_ATOMIC);\r
+       region.for_va = atomic_buf;\r
+       status = dat_lmr_create(ia,\r
+                               DAT_MEM_TYPE_VIRTUAL,\r
+                               region,\r
+                               BUF_SIZE_ATOMIC,\r
+                               pz,\r
+                               DAT_MEM_PRIV_ALL_FLAG |\r
+                               DAT_IB_MEM_PRIV_REMOTE_ATOMIC,\r
+                               DAT_VA_TYPE_VA,\r
+                               &lmr_atomic,\r
+                               &lmr_atomic_context,\r
+                               &rmr_atomic_context,\r
+                               &reg_atomic_size, &reg_atomic_addr);\r
+       _OK(status, "dat_lmr_create atomic");\r
+\r
+       for (ii = 0; ii < eps; ii++) {\r
+               for (i = RECV_BUF_INDEX; i < REG_MEM_COUNT; i++) {\r
+                       int ep_idx = 0;\r
+                       cookie.as_64 = (ii * REG_MEM_COUNT) + i;\r
+                       iov.lmr_context = lmr_context[(ii * REG_MEM_COUNT) + i];\r
+                       iov.virtual_address =\r
+                           (DAT_VADDR) (uintptr_t) buf[(ii * REG_MEM_COUNT) +\r
+                                                       i];\r
+                       iov.segment_length = buf_size;\r
+                       LOGPRINTF(" post_recv (%p) on ep[%d]=%p\n",\r
+                                 buf[(ii * REG_MEM_COUNT) + i], ii, ep[ii]);\r
+                       /* ep[0], unless testing Server and multi EP's */\r
+                       if (server && multi_eps) {\r
+                               ep_idx = ii;\r
+                               cookie.as_64 = i;\r
+                       }\r
+                       status = dat_ep_post_recv(ep[ep_idx],\r
+                                                 1,\r
+                                                 &iov,\r
+                                                 cookie,\r
+                                                 DAT_COMPLETION_DEFAULT_FLAG);\r
+                       _OK(status, "dat_ep_post_recv");\r
+               }\r
+       }\r
+       /* setup receive buffer to initial string to be overwritten */\r
+       strcpy((char *)buf[RCV_RDMA_BUF_INDEX], "blah, blah, blah\n");\r
+\r
+       /* ud can resolve_ah and connect both ways, same EP */\r
+       if (server || (!server && ud_test)) {\r
+               if (server) {\r
+                       conn_qual = SERVER_ID;\r
+                       strcpy((char *)buf[SND_RDMA_BUF_INDEX], "Server data");\r
+               } else {\r
+                       conn_qual = CLIENT_ID;\r
+                       strcpy((char *)buf[SND_RDMA_BUF_INDEX], "Client data");\r
+               }\r
+               status = dat_psp_create(ia,\r
+                                       conn_qual,\r
+                                       cr_evd, DAT_PSP_CONSUMER_FLAG, &psp);\r
+               _OK(status, "dat_psp_create");\r
+\r
+               /* Server always waits for first CR from Client */\r
+               if (server)\r
+                       process_cr(0);\r
+\r
+       }\r
+\r
+       /* ud can resolve_ah and connect both ways */\r
+       if (!server || (server && ud_test)) {\r
+               struct addrinfo *target;\r
+\r
+               if (getaddrinfo(hostname, NULL, NULL, &target) != 0) {\r
+                       printf("Error getting remote address.\n");\r
+                       exit(1);\r
+               }\r
+\r
+               printf("Remote %s Name: %s \n",\r
+                      server ? "Client" : "Server", hostname);\r
+               printf("Remote %s Net Address: %s\n",\r
+                      server ? "Client" : "Server",\r
+                      inet_ntoa(((struct sockaddr_in *)\r
+                                 target->ai_addr)->sin_addr));\r
+\r
+               remote_addr = *((DAT_IA_ADDRESS_PTR) target->ai_addr);\r
+               freeaddrinfo(target);\r
+               strcpy((char *)buf[SND_RDMA_BUF_INDEX], "Client written data");\r
+\r
+               /* one Client EP, multiple Server EPs, same conn_qual \r
+                * use private data to select EP on Server \r
+                */\r
+               for (i = 0; i < eps; i++) {\r
+                       /* pdata selects Server EP, \r
+                        * support both muliple Server and single EP's \r
+                        */\r
+                       if (multi_eps)\r
+                               pdata = hton32(i);\r
+                       else\r
+                               pdata = 0;      /* just use first EP */\r
+\r
+                       status = dat_ep_connect(ep[0],\r
+                                               &remote_addr,\r
+                                               (server ? CLIENT_ID :\r
+                                                SERVER_ID), CONN_TIMEOUT, 4,\r
+                                               (DAT_PVOID) & pdata, 0,\r
+                                               DAT_CONNECT_DEFAULT_FLAG);\r
+                       _OK(status, "dat_ep_connect");\r
+               }\r
+       }\r
+\r
+       /* UD: process CR's starting with 2nd on server, 1st for client */\r
+       if (ud_test) {\r
+               for (i = (server ? 1 : 0); i < eps; i++)\r
+                       process_cr(i);\r
+       }\r
+\r
+       /* RC and UD: process CONN EST events */\r
+       for (i = 0; i < eps; i++)\r
+               process_conn(i);\r
+\r
+       /* UD: CONN EST events for CONN's and CR's */\r
+       if (ud_test) {\r
+               for (i = 0; i < eps; i++)\r
+                       process_conn(i);\r
+       }\r
+\r
+       printf("Connected! %d endpoints\n", eps);\r
+\r
+       /*\r
+        *  Setup our remote memory and tell the other side about it\r
+        *  Swap to network order.\r
+        */\r
+       r_iov = (DAT_RMR_TRIPLET *) buf[SEND_BUF_INDEX];\r
+       r_iov->rmr_context = hton32(rmr_context[RCV_RDMA_BUF_INDEX]);\r
+       r_iov->virtual_address =\r
+           hton64((DAT_VADDR) (uintptr_t) buf[RCV_RDMA_BUF_INDEX]);\r
+       r_iov->segment_length = hton32(buf_size);\r
+\r
+       printf("Send RMR message: r_key_ctx=0x%x,va=" F64x ",len=0x%x\n",\r
+              hton32(r_iov->rmr_context),\r
+              hton64(r_iov->virtual_address), hton32(r_iov->segment_length));\r
+\r
+       send_msg(buf[SEND_BUF_INDEX],\r
+                sizeof(DAT_RMR_TRIPLET),\r
+                lmr_context[SEND_BUF_INDEX],\r
+                cookie, DAT_COMPLETION_SUPPRESS_FLAG);\r
+\r
+       dat_ep_get_status(ep[0], NULL, &in, &out);\r
+       printf("EP[0] status: posted buffers: Req=%d, Rcv=%d\n", in, out);\r
+\r
+       /*\r
+        *  Wait for their RMR\r
+        */\r
+       for (i = 0, ctx = 0; i < eps; i++, ctx++) {\r
+               /* expected cookie, recv buf idx in every mem pool */\r
+               ctx = (ctx % REG_MEM_COUNT) ? ctx : ctx + RECV_BUF_INDEX;\r
+               LOGPRINTF("Waiting for remote to send RMR data\n");\r
+\r
+               status = dat_evd_wait(dto_evd, DTO_TIMEOUT, 1, &event, &nmore);\r
+               _OK(status, "dat_evd_wait after dat_ep_post_send");\r
+\r
+               if ((event.event_number != DAT_DTO_COMPLETION_EVENT) &&\r
+                   (ud_test && event.event_number != DAT_IB_DTO_EVENT)) {\r
+                       printf("unexpected event waiting for RMR context "\r
+                              "- 0x%x\n", event.event_number);\r
+                       exit(1);\r
+               }\r
+               _OK(dto_event->status, "event status for post_recv");\r
+\r
+               /* careful when checking cookies:\r
+                * Client - receiving multi messages on a single EP \r
+                * Server - not receiving on multiple EP's\r
+                */\r
+               if (!server || (server && !multi_eps)) {\r
+                       if (dto_event->transfered_length != msg_size ||\r
+                           dto_event->user_cookie.as_64 != ctx) {\r
+                               printf("unexpected event data on recv: len=%d"\r
+                                      " cookie=" F64x " expected %d/%d\n",\r
+                                      (int)dto_event->transfered_length,\r
+                                      dto_event->user_cookie.as_64,\r
+                                      msg_size, ctx);\r
+                               exit(1);\r
+                       }\r
+                       /* Server - receiving one message each across many EP's */\r
+               } else {\r
+                       if (dto_event->transfered_length != msg_size ||\r
+                           dto_event->user_cookie.as_64 != RECV_BUF_INDEX) {\r
+                               printf("unexpected event data on recv: len=%d"\r
+                                      "cookie=" F64x " expected %d/%d\n",\r
+                                      (int)dto_event->transfered_length,\r
+                                      dto_event->user_cookie.as_64,\r
+                                      msg_size, RECV_BUF_INDEX);\r
+                               exit(1);\r
+                       }\r
+               }\r
+\r
+               /* swap RMR,address info to host order */\r
+               if (!server || (server && !multi_eps))\r
+                       r_iov = (DAT_RMR_TRIPLET *) buf[ctx];\r
+               else\r
+                       r_iov =\r
+                           (DAT_RMR_TRIPLET *) buf[(i * REG_MEM_COUNT) +\r
+                                                   RECV_BUF_INDEX];\r
+\r
+               if (ud_test)\r
+                       r_iov = (DAT_RMR_TRIPLET *) ((char *)r_iov + 40);\r
+\r
+               r_iov->rmr_context = ntoh32(r_iov->rmr_context);\r
+               r_iov->virtual_address = ntoh64(r_iov->virtual_address);\r
+               r_iov->segment_length = ntoh32(r_iov->segment_length);\r
+\r
+               printf("Recv RMR message: r_iov(%p):"\r
+                      " r_key_ctx=%x,va=" F64x ",len=0x%x on EP=%p\n",\r
+                      r_iov, r_iov->rmr_context,\r
+                      r_iov->virtual_address,\r
+                      r_iov->segment_length, dto_event->ep_handle);\r
+       }\r
+       return (0);\r
+}\r
+\r
+int disconnect_ep(void)\r
+{\r
+       DAT_RETURN status;\r
+       DAT_EVENT event;\r
+       DAT_COUNT nmore;\r
+       int i;\r
+\r
+       if (!ud_test) {\r
+               status = dat_ep_disconnect(ep[0], DAT_CLOSE_DEFAULT);\r
+               _OK2(status, "dat_ep_disconnect");\r
+\r
+               status = dat_evd_wait(con_evd, DAT_TIMEOUT_INFINITE, 1,\r
+                                     &event, &nmore);\r
+               _OK(status, "dat_evd_wait");\r
+       }\r
+       if (psp) {\r
+               status = dat_psp_free(psp);\r
+               _OK2(status, "dat_psp_free");\r
+       }\r
+       for (i = 0; i < REG_MEM_COUNT * eps; i++) {\r
+               status = dat_lmr_free(lmr[i]);\r
+               _OK2(status, "dat_lmr_free");\r
+       }\r
+       if (lmr_atomic) {\r
+               status = dat_lmr_free(lmr_atomic);\r
+               _OK2(status, "dat_lmr_free_atomic");\r
+       }\r
+       for (i = 0; i < eps; i++) {\r
+               if (counters) { /* examples of query and print */\r
+                       int ii;\r
+                       DAT_UINT64 ep_cntrs[DCNT_EP_ALL_COUNTERS];\r
+\r
+                       dat_query_counters(ep[i], DCNT_EP_ALL_COUNTERS,\r
+                                          ep_cntrs, 0);\r
+                       printf(" EP[%d] Cntrs:", i);\r
+                       for (ii = 0; ii < DCNT_EP_ALL_COUNTERS; ii++)\r
+                               printf(" " F64u "", ep_cntrs[ii]);\r
+                       printf("\n");\r
+                       dat_print_counters(ep[i], DCNT_EP_ALL_COUNTERS, 0);\r
+               }\r
+               status = dat_ep_free(ep[i]);\r
+               _OK2(status, "dat_ep_free");\r
+       }\r
+       if (counters) {         /* examples of query and print */\r
+               int ii;\r
+               DAT_UINT64 evd_cntrs[DCNT_EVD_ALL_COUNTERS];\r
+\r
+               dat_query_counters(dto_evd, DCNT_EVD_ALL_COUNTERS,\r
+                                  evd_cntrs, 0);\r
+               printf(" DTO_EVD Cntrs:");\r
+               for (ii = 0; ii < DCNT_EVD_ALL_COUNTERS; ii++)\r
+                       printf(" " F64u "", evd_cntrs[ii]);\r
+               printf("\n");\r
+               dat_print_counters(dto_evd, DCNT_EVD_ALL_COUNTERS, 0);\r
+\r
+               dat_query_counters(con_evd, DCNT_EVD_ALL_COUNTERS,\r
+                                  evd_cntrs, 0);\r
+               printf(" CONN_EVD Cntrs:");\r
+               for (ii = 0; ii < DCNT_EVD_ALL_COUNTERS; ii++)\r
+                       printf(" " F64u "", evd_cntrs[ii]);\r
+               printf("\n");\r
+               dat_print_counters(con_evd, DCNT_EVD_ALL_COUNTERS, 0);\r
+\r
+               dat_query_counters(cr_evd, DCNT_EVD_ALL_COUNTERS, evd_cntrs, 0);\r
+               printf(" CR_EVD Cntrs:");\r
+               for (ii = 0; ii < DCNT_EVD_ALL_COUNTERS; ii++)\r
+                       printf(" " F64u "", evd_cntrs[ii]);\r
+               printf("\n");\r
+               dat_print_counters(cr_evd, DCNT_EVD_ALL_COUNTERS, 0);\r
+       }\r
+       status = dat_evd_free(dto_evd);\r
+       _OK2(status, "dat_evd_free DTO");\r
+\r
+       status = dat_evd_free(con_evd);\r
+       _OK2(status, "dat_evd_free CON");\r
+\r
+       status = dat_evd_free(cr_evd);\r
+       _OK2(status, "dat_evd_free CR");\r
+\r
+       status = dat_pz_free(pz);\r
+       _OK2(status, "dat_pz_free");\r
+\r
+       if (counters) {         /* examples of query and print */\r
+               int ii;\r
+               DAT_UINT64 ia_cntrs[DCNT_IA_ALL_COUNTERS];\r
+\r
+               dat_query_counters(ia, DCNT_IA_ALL_COUNTERS, ia_cntrs, 0);\r
+               printf(" IA Cntrs:");\r
+               for (ii = 0; ii < DCNT_IA_ALL_COUNTERS; ii++)\r
+                       printf(" " F64u "", ia_cntrs[ii]);\r
+               printf("\n");\r
+               dat_print_counters(ia, DCNT_IA_ALL_COUNTERS, 0);\r
+       }\r
+       status = dat_ia_close(ia, DAT_CLOSE_DEFAULT);\r
+       _OK2(status, "dat_ia_close");\r
+\r
+       return (0);\r
+}\r
+\r
+int do_immediate()\r
+{\r
+       DAT_EVENT event;\r
+       DAT_COUNT nmore;\r
+       DAT_LMR_TRIPLET iov;\r
+       DAT_RMR_TRIPLET r_iov;\r
+       DAT_DTO_COOKIE cookie;\r
+       DAT_RETURN status;\r
+       DAT_UINT32 immed_data;\r
+       DAT_UINT32 immed_data_recv = 0;\r
+       DAT_DTO_COMPLETION_EVENT_DATA *dto_event =\r
+           &event.event_data.dto_completion_event_data;\r
+       DAT_IB_EXTENSION_EVENT_DATA *ext_event =\r
+           (DAT_IB_EXTENSION_EVENT_DATA *) & event.event_extension_data[0];\r
+\r
+       printf("\nDoing RDMA WRITE IMMEDIATE DATA\n");\r
+\r
+       if (server) {\r
+               immed_data = 0x1111;\r
+       } else {\r
+               immed_data = 0x7777;\r
+       }\r
+\r
+       cookie.as_64 = 0x5555;\r
+\r
+       /* RMR info already swapped back to host order in connect_ep */\r
+       r_iov = *buf[RECV_BUF_INDEX];\r
+\r
+       iov.lmr_context = lmr_context[SND_RDMA_BUF_INDEX];\r
+       iov.virtual_address = (DAT_VADDR) (uintptr_t) buf[SND_RDMA_BUF_INDEX];\r
+       iov.segment_length = buf_size;\r
+\r
+       cookie.as_64 = 0x9999;\r
+\r
+       status = dat_ib_post_rdma_write_immed(ep[0],    // ep_handle\r
+                                             1,        // segments\r
+                                             &iov,     // LMR\r
+                                             cookie,   // user_cookie\r
+                                             &r_iov,   // RMR\r
+                                             immed_data,\r
+                                             DAT_COMPLETION_DEFAULT_FLAG);\r
+       _OK(status, "dat_ib_post_rdma_write_immed");\r
+\r
+       /*\r
+        *  Collect first event, write completion or inbound recv with immed\r
+        */\r
+       status = dat_evd_wait(dto_evd, DTO_TIMEOUT, 1, &event, &nmore);\r
+       _OK(status, "dat_evd_wait after dat_ib_post_rdma_write");\r
+       if (event.event_number != DAT_IB_DTO_EVENT) {\r
+               printf("unexpected event #0x%x waiting for WR-IMMED #0x%x\n",\r
+                      event.event_number, DAT_IB_DTO_EVENT);\r
+               exit(1);\r
+       }\r
+\r
+       if (nmore)\r
+               printf("%s() nmore %d\n", __FUNCTION__, nmore);\r
+       _OK(dto_event->status, "DTO event status");\r
+       if (ext_event->type == DAT_IB_RDMA_WRITE_IMMED) {\r
+               if ((dto_event->transfered_length != buf_size) ||\r
+                   (dto_event->user_cookie.as_64 != 0x9999)) {\r
+                       printf\r
+                           ("unexpected event data for rdma_write_immed: len=%d "\r
+                            "cookie=0x%x\n", (int)dto_event->transfered_length,\r
+                            (int)dto_event->user_cookie.as_64);\r
+                       exit(1);\r
+               }\r
+       } else if (ext_event->type == DAT_IB_RDMA_WRITE_IMMED_DATA) {\r
+               if ((dto_event->transfered_length != buf_size) ||\r
+                   (dto_event->user_cookie.as_64 != RECV_BUF_INDEX + 1)) {\r
+                       printf\r
+                           ("unexpected event data of immediate write: len=%d "\r
+                            "cookie=" F64x " expected %d/%d\n",\r
+                            (int)dto_event->transfered_length,\r
+                            dto_event->user_cookie.as_64, (int)sizeof(int),\r
+                            RECV_BUF_INDEX + 1);\r
+                       exit(1);\r
+               }\r
+\r
+               /* get immediate data from event */\r
+               immed_data_recv = ext_event->val.immed.data;\r
+       } else {\r
+               printf("unexpected extension type for event - 0x%x, 0x%x\n",\r
+                      event.event_number, ext_event->type);\r
+               exit(1);\r
+       }\r
+\r
+       /*\r
+        * Collect second event, write completion or inbound recv with immed\r
+        */\r
+       status = dat_evd_wait(dto_evd, DTO_TIMEOUT, 1, &event, &nmore);\r
+       _OK(status, "dat_evd_wait after dat_ib_post_rdma_write");\r
+       if (event.event_number != DAT_IB_DTO_EVENT) {\r
+               printf("unexpected event # waiting for WR-IMMED - 0x%x\n",\r
+                      event.event_number);\r
+               exit(1);\r
+       }\r
+\r
+       _OK(dto_event->status, "event status");\r
+       if (ext_event->type == DAT_IB_RDMA_WRITE_IMMED) {\r
+               if ((dto_event->transfered_length != buf_size) ||\r
+                   (dto_event->user_cookie.as_64 != 0x9999)) {\r
+                       printf\r
+                           ("unexpected event data for rdma_write_immed: len=%d "\r
+                            "cookie=0x%x\n", (int)dto_event->transfered_length,\r
+                            (int)dto_event->user_cookie.as_64);\r
+                       exit(1);\r
+               }\r
+       } else if (ext_event->type == DAT_IB_RDMA_WRITE_IMMED_DATA) {\r
+               if ((dto_event->transfered_length != buf_size) ||\r
+                   (dto_event->user_cookie.as_64 != RECV_BUF_INDEX + 1)) {\r
+                       printf\r
+                           ("unexpected event data of immediate write: len=%d "\r
+                            "cookie=" F64x " expected %d/%d\n",\r
+                            (int)dto_event->transfered_length,\r
+                            dto_event->user_cookie.as_64, (int)sizeof(int),\r
+                            RECV_BUF_INDEX + 1);\r
+                       exit(1);\r
+               }\r
+\r
+               /* get immediate data from event */\r
+               immed_data_recv = ext_event->val.immed.data;\r
+       } else {\r
+               printf("unexpected extension type for event - 0x%x, 0x%x\n",\r
+                      event.event_number, ext_event->type);\r
+               exit(1);\r
+       }\r
+\r
+       if ((server) && (immed_data_recv != 0x7777)) {\r
+               printf("ERROR: Server: unexpected imm_data_recv 0x%x/0x%x\n",\r
+                      0x7777, immed_data_recv);\r
+               exit(1);\r
+       } else if ((!server) && (immed_data_recv != 0x1111)) {\r
+               printf("ERROR: Client: unexpected imm_data_recv 0x%x/0x%x\n",\r
+                      0x1111, immed_data_recv);\r
+               exit(1);\r
+       }\r
+\r
+       if (server)\r
+               printf("Server received immed_data=0x%x\n", immed_data_recv);\r
+       else\r
+               printf("Client received immed_data=0x%x\n", immed_data_recv);\r
+\r
+       printf("rdma buffer %p contains: %s\n",\r
+              buf[RCV_RDMA_BUF_INDEX], (char *)buf[RCV_RDMA_BUF_INDEX]);\r
+\r
+       printf("\n RDMA_WRITE_WITH_IMMEDIATE_DATA test - PASSED\n");\r
+       return (0);\r
+}\r
+\r
+int do_cmp_swap()\r
+{\r
+       DAT_DTO_COOKIE cookie;\r
+       DAT_RETURN status;\r
+       DAT_EVENT event;\r
+       DAT_COUNT nmore;\r
+       DAT_LMR_TRIPLET l_iov;\r
+       DAT_RMR_TRIPLET r_iov;\r
+       volatile DAT_UINT64 *target = (DAT_UINT64 *) buf[RCV_RDMA_BUF_INDEX];\r
+       DAT_DTO_COMPLETION_EVENT_DATA *dto_event =\r
+           &event.event_data.dto_completion_event_data;\r
+       DAT_IB_EXTENSION_EVENT_DATA *ext_event =\r
+           (DAT_IB_EXTENSION_EVENT_DATA *) & event.event_extension_data[0];\r
+\r
+       printf("\nDoing CMP and SWAP\n");\r
+\r
+       /* RMR info already swapped back to host order in connect_ep */\r
+       r_iov = *buf[RECV_BUF_INDEX];\r
+\r
+       l_iov.lmr_context = lmr_atomic_context;\r
+       l_iov.virtual_address = (DAT_UINT64) (uintptr_t) atomic_buf;\r
+       l_iov.segment_length = BUF_SIZE_ATOMIC;\r
+\r
+       cookie.as_64 = 3333;\r
+\r
+       if (server) {\r
+               *target = 0x12345;\r
+               sleep(1);\r
+               /* Server does not compare and should not swap */\r
+               printf("dtx svr - starting cmp_swap\n");\r
+               status = dat_ib_post_cmp_and_swap(ep[0],\r
+                                                 (DAT_UINT64) 0x654321,\r
+                                                 (DAT_UINT64) 0x6789A,\r
+                                                 &l_iov,\r
+                                                 cookie,\r
+                                                 &r_iov,\r
+                                                 DAT_COMPLETION_DEFAULT_FLAG);\r
+               printf("dtx svr - done cmp_swap, chk status\n");\r
+       } else {\r
+               *target = 0x54321;\r
+               sleep(1);\r
+               printf("dtx cli - starting cmp_swap\n");\r
+               /* Client does compare and should swap */\r
+               status = dat_ib_post_cmp_and_swap(ep[0],\r
+                                                 (DAT_UINT64) 0x12345,\r
+                                                 (DAT_UINT64) 0x98765,\r
+                                                 &l_iov,\r
+                                                 cookie,\r
+                                                 &r_iov,\r
+                                                 DAT_COMPLETION_DEFAULT_FLAG);\r
+               printf("dtx cli - done cmp_swap, chk status\n");\r
+       }\r
+       _OK(status, "dat_ib_post_cmp_and_swap");\r
+       status = dat_evd_wait(dto_evd, DTO_TIMEOUT, 1, &event, &nmore);\r
+       _OK(status, "dat_evd_wait for compare and swap");\r
+       if (event.event_number != DAT_IB_DTO_EVENT) {\r
+               printf("unexpected event after post_cmp_and_swap: 0x%x\n",\r
+                      event.event_number);\r
+               exit(1);\r
+       }\r
+\r
+       _OK(dto_event->status, "event status for CMP and SWAP");\r
+       if (ext_event->type != DAT_IB_CMP_AND_SWAP) {\r
+               printf("unexpected event data of cmp_swap: type=%d cookie=%d "\r
+                      "original " F64x "\n",\r
+                      (int)ext_event->type,\r
+                      (int)dto_event->user_cookie.as_64, *atomic_buf);\r
+               exit(1);\r
+       }\r
+\r
+       sleep(2);               /* wait for other side to complete swap */\r
+\r
+       if (server) {\r
+               printf("Server got original data        = " F64x ", expected "\r
+                      "0x54321\n", *atomic_buf);\r
+               printf("Client final result (on Server) = " F64x ", expected "\r
+                      "0x98765\n", *target);\r
+\r
+               if (*atomic_buf != 0x54321 || *target != 0x98765) {\r
+                       printf("ERROR: Server CMP_SWAP\n");\r
+                       exit(1);\r
+               }\r
+       } else {\r
+               printf("Client got original data        = " F64x ", expected "\r
+                      "0x12345\n", *atomic_buf);\r
+               printf("Server final result (on Client) = 0x" F64x ", expected "\r
+                      "0x54321\n", *target);\r
+\r
+               if (*atomic_buf != 0x12345 || *target != 0x54321) {\r
+                       printf("ERROR: Client CMP_SWAP\n");\r
+                       exit(1);\r
+               }\r
+       }\r
+       printf("\n CMP_SWAP test - PASSED\n");\r
+       return (0);\r
+}\r
+\r
+int do_fetch_add()\r
+{\r
+       DAT_DTO_COOKIE cookie;\r
+       DAT_RETURN status;\r
+       DAT_EVENT event;\r
+       DAT_COUNT nmore;\r
+       DAT_LMR_TRIPLET l_iov;\r
+       DAT_RMR_TRIPLET r_iov;\r
+       volatile DAT_UINT64 *target = (DAT_UINT64 *) buf[RCV_RDMA_BUF_INDEX];\r
+       DAT_DTO_COMPLETION_EVENT_DATA *dto_event =\r
+           &event.event_data.dto_completion_event_data;\r
+       DAT_IB_EXTENSION_EVENT_DATA *ext_event =\r
+           (DAT_IB_EXTENSION_EVENT_DATA *) & event.event_extension_data[0];\r
+\r
+       printf("\nDoing FETCH and ADD\n");\r
+\r
+       /* RMR info already swapped back to host order in connect_ep */\r
+       r_iov = *buf[RECV_BUF_INDEX];\r
+\r
+       l_iov.lmr_context = lmr_atomic_context;\r
+       l_iov.virtual_address = (DAT_UINT64) (uintptr_t) atomic_buf;\r
+       l_iov.segment_length = BUF_SIZE_ATOMIC;\r
+\r
+       cookie.as_64 = 0x7777;\r
+       if (server) {\r
+               /* Wait for Client to finish cmp_swap */\r
+               while (*target != 0x98765)\r
+                       sleep(1);\r
+               *target = 0x10;\r
+               sleep(1);\r
+               status = dat_ib_post_fetch_and_add(ep[0],\r
+                                                  (DAT_UINT64) 0x100,\r
+                                                  &l_iov,\r
+                                                  cookie,\r
+                                                  &r_iov,\r
+                                                  DAT_COMPLETION_DEFAULT_FLAG);\r
+       } else {\r
+               /* Wait for Server, no swap so nothing to check */\r
+               *target = 0x100;\r
+               sleep(1);\r
+               status = dat_ib_post_fetch_and_add(ep[0],\r
+                                                  (DAT_UINT64) 0x10,\r
+                                                  &l_iov,\r
+                                                  cookie,\r
+                                                  &r_iov,\r
+                                                  DAT_COMPLETION_DEFAULT_FLAG);\r
+       }\r
+       _OK(status, "dat_ib_post_fetch_and_add");\r
+       status = dat_evd_wait(dto_evd, DTO_TIMEOUT, 1, &event, &nmore);\r
+       _OK(status, "dat_evd_wait for fetch and add");\r
+       if (event.event_number != DAT_IB_DTO_EVENT) {\r
+               printf("unexpected event after post_fetch_and_add: 0x%x\n",\r
+                      event.event_number);\r
+               exit(1);\r
+       }\r
+\r
+       _OK(dto_event->status, "event status for FETCH and ADD");\r
+       if (ext_event->type != DAT_IB_FETCH_AND_ADD) {\r
+               printf("unexpected event data of fetch and add : type=%d "\r
+                      "cookie=%d original%d\n",\r
+                      (int)ext_event->type,\r
+                      (int)dto_event->user_cookie.as_64, (int)*atomic_buf);\r
+               exit(1);\r
+       }\r
+\r
+       if (server) {\r
+               printf("Client original data (on Server) = " F64x ", expected "\r
+                      "0x100\n", *atomic_buf);\r
+       } else {\r
+               printf("Server original data (on Client) = " F64x ", expected "\r
+                      "0x10\n", *atomic_buf);\r
+       }\r
+\r
+       sleep(1);\r
+\r
+       if (server) {\r
+               status = dat_ib_post_fetch_and_add(ep[0],\r
+                                                  (DAT_UINT64) 0x100,\r
+                                                  &l_iov,\r
+                                                  cookie,\r
+                                                  &r_iov,\r
+                                                  DAT_COMPLETION_DEFAULT_FLAG);\r
+       } else {\r
+               status = dat_ib_post_fetch_and_add(ep[0],\r
+                                                  (DAT_UINT64) 0x10,\r
+                                                  &l_iov,\r
+                                                  cookie,\r
+                                                  &r_iov,\r
+                                                  DAT_COMPLETION_DEFAULT_FLAG);\r
+       }\r
+\r
+       status = dat_evd_wait(dto_evd, DTO_TIMEOUT, 1, &event, &nmore);\r
+       _OK(status, "dat_evd_wait for second fetch and add");\r
+       if (event.event_number != DAT_IB_DTO_EVENT) {\r
+               printf("unexpected event after second post_fetch_and_add: "\r
+                      "0x%x\n", event.event_number);\r
+               exit(1);\r
+       }\r
+\r
+       _OK(dto_event->status, "event status for second FETCH and ADD");\r
+       if (ext_event->type != DAT_IB_FETCH_AND_ADD) {\r
+               printf("unexpected event data of second fetch and add : "\r
+                      "type=%d cookie=%d original%p\n",\r
+                      (int)ext_event->type,\r
+                      (int)dto_event->user_cookie.as_64, atomic_buf);\r
+               exit(1);\r
+       }\r
+\r
+       sleep(1);               /* wait for other side to complete fetch_add */\r
+\r
+       if (server) {\r
+               printf("Server got original data         = " F64x ", expected "\r
+                      "0x200\n", *atomic_buf);\r
+               printf("Client final result (on Server)  = " F64x ", expected "\r
+                      "0x30\n", *target);\r
+\r
+               if (*atomic_buf != 0x200 || *target != 0x30) {\r
+                       printf("ERROR: Server FETCH_ADD\n");\r
+                       exit(1);\r
+               }\r
+       } else {\r
+               printf("Server side original data        = " F64x ", expected "\r
+                      "0x20\n", *atomic_buf);\r
+               printf("Server final result (on Client)  = " F64x ", expected "\r
+                      "0x300\n", *target);\r
+\r
+               if (*atomic_buf != 0x20 || *target != 0x300) {\r
+                       printf("ERROR: Server FETCH_ADD\n");\r
+                       exit(1);\r
+               }\r
+       }\r
+       printf("\n FETCH_ADD test - PASSED\n");\r
+       return (0);\r
+}\r
+\r
+int main(int argc, char **argv)\r
+{\r
+       int rc;\r
+\r
+       /* parse arguments */\r
+       while ((rc = getopt(argc, argv, "csvumpU:h:b:P:")) != -1) {\r
+               switch (rc) {\r
+               case 'u':\r
+                       ud_test = 1;\r
+                       eps = MAX_EP_COUNT / 2;\r
+                       break;\r
+               case 'm':\r
+                       multi_eps = 1;\r
+                       break;\r
+               case 'c':\r
+                       server = 0;\r
+                       break;\r
+               case 's':\r
+                       server = 1;\r
+                       break;\r
+               case 'p':\r
+                       counters = 1;\r
+                       break;\r
+               case 'h':\r
+                       remote_host = 1;\r
+                       strcpy(hostname, optarg);\r
+                       break;\r
+               case 'b':\r
+                       buf_size = atoi(optarg);\r
+                       break;\r
+               case 'U':\r
+                       ud_test = 1;\r
+                       eps = MIN(atoi(optarg), MAX_EP_COUNT);\r
+                       break;\r
+               case 'P':\r
+                       strcpy(provider, optarg);\r
+                       break;\r
+               case 'v':\r
+                       verbose = 1;\r
+                       break;\r
+               default:\r
+                       print_usage();\r
+                       exit(-12);\r
+               }\r
+       }\r
+\r
+#if defined(_WIN32) || defined(_WIN64)\r
+       {\r
+               WSADATA wsaData;\r
+               int i;\r
+\r
+               i = WSAStartup(MAKEWORD(2, 2), &wsaData);\r
+               if (i != 0) {\r
+                       printf("%s WSAStartup(2.2) fail? (0x%x)\n", argv[0], i);\r
+                       fflush(stdout);\r
+                       exit(1);\r
+               }\r
+       }\r
+#endif\r
+       /* for non UD tests, -h is always client */\r
+       if (remote_host && !ud_test)\r
+               server = 0;\r
+\r
+       if (!server) {\r
+               printf("\nRunning as Client - %s %s %d endpoint(s)\n",\r
+                      provider, ud_test ? "UD test" : "", eps);\r
+       } else {\r
+               printf("\nRunning as Server - %s %s %d endpoint(s)\n",\r
+                      provider, ud_test ? "UD test" : "", eps);\r
+       }\r
+\r
+       /*\r
+        * connect\r
+        */\r
+       if (connect_ep(hostname)) {\r
+               _WSACleanup();\r
+               exit(1);\r
+       }\r
+       if (ud_test)\r
+               goto bail;\r
+\r
+       if (do_immediate()) {\r
+               _WSACleanup();\r
+               exit(1);\r
+       }\r
+       if (do_cmp_swap()) {\r
+               _WSACleanup();\r
+               exit(1);\r
+       }\r
+       if (do_fetch_add()) {\r
+               _WSACleanup();\r
+               exit(1);\r
+       }\r
+      bail:\r
+       rc = disconnect_ep();\r
+       _WSACleanup();\r
+\r
+       if (!rc)\r
+               printf("\n IB extension test - %s test PASSED\n\n",\r
+                      ud_test ? "UD" : "immed/atomic");\r
+       return rc;\r
+}\r
index cac5a549cddf95f3a5b94687a3f444f0601b8346..50f0131443757779c212b08e2dbb503c5b9c150e 100644 (file)
@@ -1 +1 @@
-dirs = dtest dtestx
+dirs = dtest dtestx dtestcm
index 58f5c661550dfac792da84b2fa0cc98687f6edc3..e880beb121fc028c71fcd11a8ddd0aa02153b8bf 100644 (file)
@@ -19,7 +19,7 @@ INCLUDES = ..\..\..\..\dat\include;..\..\..\..\..\..\inc;\
 RCOPTIONS=/I..\..\..\..\..\..\inc;
 
 # Set defines particular to the driver.
-#USER_C_FLAGS = $(USER_C_FLAGS) /DDAT_EXTENSIONS
+USER_C_FLAGS = $(USER_C_FLAGS) /DDAT_EXTENSIONS /DFD_SETSIZE=1024
 
 !if $(FREEBUILD)
 DATLIB = dat2.lib
index ae69c20473df5c633aec7592cdfe49a6da426838..2bdfae3d871e7905790e6a23787d4cc910eea8ab 100644 (file)
@@ -1,2 +1,3 @@
+#include "..\..\..\..\..\..\etc\user\gtod.c"
 #include "..\..\dtest.c"
 
diff --git a/branches/winverbs/ulp/dapl2/test/dtest/windows/dtestcm/SOURCES b/branches/winverbs/ulp/dapl2/test/dtest/windows/dtestcm/SOURCES
new file mode 100644 (file)
index 0000000..662da89
--- /dev/null
@@ -0,0 +1,33 @@
+!if $(FREEBUILD)
+TARGETNAME = dtestcm
+!else
+TARGETNAME = dtestcmd
+!endif
+
+TARGETPATH = ..\..\..\..\..\..\bin\user\obj$(BUILD_ALT_DIR)
+TARGETTYPE = PROGRAM
+UMTYPE = console
+USE_MSVCRT = 1
+
+SOURCES = \
+       dtestcm.rc      \
+       dtestcm.c
+       
+INCLUDES = ..\..\..\..\dat\include;..\..\..\..\..\..\inc;\
+          ..\..\..\..\..\..\inc\user;
+
+RCOPTIONS=/I..\..\..\..\..\..\inc;
+
+# Set defines particular to the driver.
+USER_C_FLAGS = $(USER_C_FLAGS) /DDAT_EXTENSIONS /DFD_SETSIZE=1024
+
+!if $(FREEBUILD)
+DATLIB = dat2.lib
+!else
+DATLIB = dat2d.lib
+!endif
+
+TARGETLIBS = $(TARGETPATH)\*\$(DATLIB) $(SDK_LIB_PATH)\ws2_32.lib
+
+# XXX do this ASAP - MSC_WARNING_LEVEL= /W3
+MSC_WARNING_LEVEL = /W1
diff --git a/branches/winverbs/ulp/dapl2/test/dtest/windows/dtestcm/dtestcm.c b/branches/winverbs/ulp/dapl2/test/dtest/windows/dtestcm/dtestcm.c
new file mode 100644 (file)
index 0000000..c734a6b
--- /dev/null
@@ -0,0 +1,3 @@
+#include "..\..\..\..\..\..\etc\user\gtod.c"\r
+#include "..\..\dtestcm.c"\r
+\r
diff --git a/branches/winverbs/ulp/dapl2/test/dtest/windows/dtestcm/dtestcm.rc b/branches/winverbs/ulp/dapl2/test/dtest/windows/dtestcm/dtestcm.rc
new file mode 100644 (file)
index 0000000..a167485
--- /dev/null
@@ -0,0 +1,48 @@
+/*\r
+ * Copyright (c) 2009 Intel Corporation.  All rights reserved.\r
+ *\r
+ * This software is available to you under the OpenIB.org BSD license\r
+ * below:\r
+ *\r
+ *     Redistribution and use in source and binary forms, with or\r
+ *     without modification, are permitted provided that the following\r
+ *     conditions are met:\r
+ *\r
+ *      - Redistributions of source code must retain the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer.\r
+ *\r
+ *      - Redistributions in binary form must reproduce the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer in the documentation and/or other materials\r
+ *        provided with the distribution.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
+ * SOFTWARE.\r
+ *\r
+ * $Id$\r
+ */\r
+\r
+\r
+#include <oib_ver.h>\r
+\r
+#define VER_FILETYPE                   VFT_APP\r
+#define VER_FILESUBTYPE                        VFT2_UNKNOWN\r
+\r
+#if DBG\r
+#define VER_FILEDESCRIPTION_STR                "Measure DAPL connection rate scaling (Debug)"\r
+#define VER_INTERNALNAME_STR           "dtestcmd.exe"\r
+#define VER_ORIGINALFILENAME_STR       "dtestcmd.exe"\r
+#else\r
+#define VER_FILEDESCRIPTION_STR                "Measure DAPL connection rate scaling"\r
+#define VER_INTERNALNAME_STR           "dtestcm.exe"\r
+#define VER_ORIGINALFILENAME_STR       "dtestcm.exe"\r
+#endif\r
+\r
+#include <common.ver>\r
diff --git a/branches/winverbs/ulp/dapl2/test/dtest/windows/dtestcm/makefile b/branches/winverbs/ulp/dapl2/test/dtest/windows/dtestcm/makefile
new file mode 100644 (file)
index 0000000..5fb2ee8
--- /dev/null
@@ -0,0 +1,7 @@
+#\r
+# DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source\r
+# file to this component.  This file merely indirects to the real make file\r
+# that is shared by all the driver components of the OpenIB Windows project.\r
+#\r
+\r
+!INCLUDE ..\..\..\..\..\..\inc\openib.def\r
index ee6381750d1708b65fbd3742a87be57bd790602a..2a7f1f60ca17cde03270855aa3bf8768a544d884 100644 (file)
@@ -16,6 +16,9 @@ SOURCES = \
 INCLUDES = ..\..\..\..\dat\include;..\..\..\..\..\..\inc;\\r
           ..\..\..\..\..\..\inc\user;\r
 \r
+# Set defines particular to the driver.\r
+USER_C_FLAGS = $(USER_C_FLAGS) /DDAT_EXTENSIONS /DFD_SETSIZE=1024\r
+\r
 !if $(FREEBUILD)\r
 DATLIB = dat2.lib\r
 !else\r
index ff7ff5ba9f6672729aee155fc69e7d19cd63d458..da36393a62698b4f4eadd2c8bb3d8e45ee6e0abb 100644 (file)
@@ -2072,7 +2072,11 @@ __recv_mgr_filter(
                        if( (p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_SERVER &&\r
                                p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_CLIENT) ||\r
                                (p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_CLIENT &&\r
-                               p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_SERVER) )\r
+                               p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_SERVER) ||\r
+                               (p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_PROXY_SERVER &&\r
+                               p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_CLIENT) ||\r
+                               (p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_CLIENT &&\r
+                               p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_PROXY_SERVER) )\r
                        {\r
                                if( len < (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t) +\r
                                        sizeof(udp_hdr_t) + DHCP_MIN_SIZE) )\r
@@ -2256,7 +2260,7 @@ __recv_dhcp(
                return IB_INVALID_PARAMETER;\r
        }\r
 \r
-       p_option = &p_dhcp->options[4];\r
+       p_option = &p_dhcp->options[DHCP_COOKIE_SIZE];\r
        while( *p_option != DHCP_OPT_END && p_option < &p_dhcp->options[312] )\r
        {\r
                switch( *p_option )\r
@@ -2339,14 +2343,12 @@ __recv_dhcp(
                 * accesses to the contents.\r
                 * Recover CID to standard type.\r
                 */\r
-\r
-               CL_ASSERT(sizeof(ib_net64_t) == 8);\r
-\r
                p_cid[1] =  sizeof (ib_net64_t) + 1;// CID length \r
                p_cid[2] =  DHCP_HW_TYPE_ETH;// CID type\r
                RtlMoveMemory( &p_cid[3], &p_cid[15], sizeof (ib_net64_t) );\r
                RtlFillMemory(&p_cid[11], 12, 0);\r
-               p_cid[sizeof (ib_net64_t) + 3] = DHCP_OPT_END; //terminate tag \r
+\r
+               RtlCopyMemory( p_dhcp->chaddr, &p_src->mac, sizeof(p_src->mac) );\r
        }\r
        IPOIB_EXIT( IPOIB_DBG_RECV );\r
        return status;\r
index a528904bb75c4bf88f553dfda249ea52ad68c744..774f114b380a0080176cdc10310573d11c8a1165 100644 (file)
@@ -19,13 +19,13 @@ ENABLE_EVENT_TRACING=1
 \r
 SOURCES=       ipoib_log.mc \\r
                ipoib.rc \\r
-               ipoib_driver.c \\r
-               ipoib_adapter.c \\r
-               ipoib_endpoint.c \\r
-               ipoib_port.c \\r
-               ipoib_ibat.c \\r
-#              ipoib_cm.c      \\r
-               ipoib_xfr_mgr.c\r
+               ipoib_driver.cpp \\r
+               ipoib_adapter.cpp \\r
+               ipoib_endpoint.cpp \\r
+               ipoib_port.cpp \\r
+               ipoib_ibat.cpp \\r
+#              ipoib_cm.cpp    \\r
+               ipoib_xfr_mgr.cpp\r
 \r
 INCLUDES=..;..\..\..\inc;..\..\..\inc\kernel;\r
 \r
@@ -50,7 +50,7 @@ TARGETLIBS= \
 \r
 C_DEFINES = $(C_DEFINES) -DEVENT_TRACING\r
 \r
-RUN_WPP = $(SOURCES) -km -ext: .c .h .C .H \\r
+RUN_WPP = $(SOURCES) -km -ext: .c .cpp .h .C .CPP .H\\r
        -scan:ipoib_debug.h \\r
        -func:IPOIB_PRINT(LEVEL,FLAGS,(MSG,...)) \\r
        -func:IPOIB_PRINT_EXIT(LEVEL,FLAGS,(MSG,...))\r
diff --git a/branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.c b/branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.c
deleted file mode 100644 (file)
index 9274709..0000000
+++ /dev/null
@@ -1,1642 +0,0 @@
-/*\r
- * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
- * Copyright (c) 2006 Mellanox Technologies.  All rights reserved.\r
- * Portions Copyright (c) 2008 Microsoft Corporation.  All rights reserved.\r
- *\r
- * This software is available to you under the OpenIB.org BSD license\r
- * below:\r
- *\r
- *     Redistribution and use in source and binary forms, with or\r
- *     without modification, are permitted provided that the following\r
- *     conditions are met:\r
- *\r
- *      - Redistributions of source code must retain the above\r
- *        copyright notice, this list of conditions and the following\r
- *        disclaimer.\r
- *\r
- *      - Redistributions in binary form must reproduce the above\r
- *        copyright notice, this list of conditions and the following\r
- *        disclaimer in the documentation and/or other materials\r
- *        provided with the distribution.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
- * SOFTWARE.\r
- *\r
- * $Id: ipoib_adapter.c 4506 2009-06-23 14:40:54Z xalex $\r
- */\r
-\r
-\r
-\r
-#include "ipoib_adapter.h"\r
-#include "ipoib_port.h"\r
-#include "ipoib_driver.h"\r
-#include "ipoib_debug.h"\r
-\r
-#if defined(EVENT_TRACING)\r
-#ifdef offsetof\r
-#undef offsetof\r
-#endif\r
-#include "ipoib_adapter.tmh"\r
-#endif\r
-\r
-\r
-#define ITEM_POOL_START                16\r
-#define ITEM_POOL_GROW         16\r
-\r
-\r
-/* IB Link speeds in 100bps */\r
-#define ONE_X_IN_100BPS                25000000\r
-#define FOUR_X_IN_100BPS       100000000\r
-#define TWELVE_X_IN_100BPS     300000000\r
-\r
-\r
-/* Declarations */\r
-static void\r
-adapter_construct(\r
-       IN                              ipoib_adapter_t* const          p_adapter );\r
-\r
-\r
-static ib_api_status_t\r
-adapter_init(\r
-       IN                              ipoib_adapter_t* const          p_adapter );\r
-\r
-\r
-static void\r
-__adapter_destroying(\r
-       IN                              cl_obj_t* const                         p_obj );\r
-\r
-\r
-static void\r
-__adapter_free(\r
-       IN                              cl_obj_t* const                         p_obj );\r
-\r
-\r
-static ib_api_status_t\r
-__ipoib_pnp_reg(\r
-       IN                              ipoib_adapter_t* const          p_adapter,\r
-       IN                              ib_pnp_class_t                          flags );\r
-\r
-\r
-static void\r
-__ipoib_pnp_dereg(\r
-       IN                              void*                                           context );\r
-\r
-\r
-static void\r
-__ipoib_adapter_reset(\r
-       IN                              void*   context);\r
-\r
-\r
-static ib_api_status_t\r
-__ipoib_pnp_cb(\r
-       IN                              ib_pnp_rec_t                            *p_pnp_rec );\r
-\r
-\r
-void\r
-ipoib_join_mcast(\r
-       IN                              ipoib_adapter_t* const          p_adapter );\r
-\r
-\r
-/* Leaves all mcast groups when port goes down. */\r
-static void\r
-ipoib_clear_mcast(\r
-       IN                              ipoib_port_t* const                     p_port );\r
-\r
-NDIS_STATUS\r
-ipoib_get_adapter_guids(\r
-       IN                              NDIS_HANDLE* const                      h_adapter,\r
-       IN      OUT                     ipoib_adapter_t                         *p_adapter );\r
-\r
-NDIS_STATUS\r
-ipoib_get_adapter_params(\r
-       IN                              NDIS_HANDLE* const                      wrapper_config_context,\r
-       IN      OUT                     ipoib_adapter_t                         *p_adapter,\r
-       OUT                             PUCHAR                                          *p_mac,\r
-       OUT                             UINT                                            *p_len);\r
-\r
-\r
-/* Implementation */\r
-ib_api_status_t\r
-ipoib_create_adapter(\r
-       IN                              NDIS_HANDLE                                     wrapper_config_context,\r
-       IN                              void* const                                     h_adapter,\r
-               OUT                     ipoib_adapter_t** const         pp_adapter )\r
-{\r
-       ipoib_adapter_t         *p_adapter;\r
-       ib_api_status_t         status;\r
-       cl_status_t                     cl_status;\r
-       PUCHAR                          mac;\r
-       UINT                            len;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       p_adapter = cl_zalloc( sizeof(ipoib_adapter_t) );\r
-       if( !p_adapter )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Failed to allocate ipoib_adapter_t (%d bytes)",\r
-                       sizeof(ipoib_adapter_t)) );\r
-               return IB_INSUFFICIENT_MEMORY;\r
-       }\r
-\r
-       adapter_construct( p_adapter );\r
-\r
-       p_adapter->h_adapter = h_adapter;\r
-\r
-       p_adapter->p_ifc = cl_zalloc( sizeof(ib_al_ifc_t) );\r
-       if( !p_adapter->p_ifc )\r
-       {\r
-               __adapter_free( &p_adapter->obj );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ipoib_create_adapter failed to alloc ipoib_ifc_t %d bytes\n",\r
-                       sizeof(ib_al_ifc_t)) );\r
-               return IB_INSUFFICIENT_MEMORY;\r
-       }\r
-\r
-       /* Get the CA and port GUID from the bus driver. */\r
-       status = ipoib_get_adapter_guids( h_adapter,  p_adapter );\r
-       if( status != NDIS_STATUS_SUCCESS )\r
-       {\r
-ASSERT(FALSE);\r
-//return NDIS_STATUS_SUCCESS;\r
-               __adapter_free( &p_adapter->obj );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ipoib_get_adapter_guids returned 0x%.8X.\n", status) );\r
-               return status;\r
-       }\r
-\r
-       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
-                       ("Port %016I64x (CA %016I64x port %d) initializing\n",\r
-                       p_adapter->guids.port_guid.guid, p_adapter->guids.ca_guid,\r
-                       p_adapter->guids.port_num) );\r
-\r
-       cl_status = cl_obj_init( &p_adapter->obj, CL_DESTROY_SYNC,\r
-               __adapter_destroying, NULL, __adapter_free );\r
-       if( cl_status != CL_SUCCESS )\r
-       {\r
-               __adapter_free( &p_adapter->obj );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("cl_obj_init returned %#x\n", cl_status) );\r
-               return IB_ERROR;\r
-       }\r
-\r
-       /* Read configuration parameters. */\r
-       status = ipoib_get_adapter_params( wrapper_config_context,\r
-               p_adapter , &mac, &len);\r
-       if( status != NDIS_STATUS_SUCCESS )\r
-       {\r
-               cl_obj_destroy( &p_adapter->obj );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ipoib_get_adapter_params returned 0x%.8x.\n", status) );\r
-               return status;\r
-       }\r
-               \r
-       status = adapter_init( p_adapter );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               cl_obj_destroy( &p_adapter->obj );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("adapter_init returned %s.\n", \r
-                       p_adapter->p_ifc->get_err_str( status )) );\r
-               return status;\r
-       }\r
-\r
-       ETH_COPY_NETWORK_ADDRESS( p_adapter->params.conf_mac.addr, p_adapter->mac.addr );\r
-       /* If there is a NetworkAddress override in registry, use it */\r
-       if( (status == NDIS_STATUS_SUCCESS) && (len == HW_ADDR_LEN) )\r
-       {\r
-               if( ETH_IS_MULTICAST(mac) || ETH_IS_BROADCAST(mac) ||\r
-                       !ETH_IS_LOCALLY_ADMINISTERED(mac) )\r
-               {\r
-                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_INIT,\r
-                               ("Overriding NetworkAddress is invalid - "\r
-                               "%02x-%02x-%02x-%02x-%02x-%02x\n",\r
-                               mac[0], mac[1], mac[2],\r
-                               mac[3], mac[4], mac[5]) );\r
-               }\r
-               else\r
-       {\r
-                       ETH_COPY_NETWORK_ADDRESS( p_adapter->params.conf_mac.addr, mac );\r
-               }\r
-       }\r
-\r
-       *pp_adapter = p_adapter;\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-       return status;\r
-}\r
-\r
-\r
-ib_api_status_t\r
-ipoib_start_adapter(\r
-       IN                              ipoib_adapter_t* const          p_adapter )\r
-{\r
-       ib_api_status_t status;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       status = __ipoib_pnp_reg( p_adapter,\r
-               IB_PNP_FLAG_REG_SYNC | IB_PNP_FLAG_REG_COMPLETE );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-       return status;\r
-}\r
-\r
-\r
-void\r
-ipoib_destroy_adapter(\r
-       IN                              ipoib_adapter_t* const          p_adapter )\r
-{\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       CL_ASSERT( p_adapter );\r
-\r
-       /*\r
-        * Flag the adapter as being removed.  We use the IB_PNP_PORT_REMOVE state\r
-        * for this purpose.  Note that we protect this state change with both the\r
-        * mutex and the lock.  The mutex provides synchronization as a whole\r
-        * between destruction and AL callbacks (PnP, Query, Destruction).\r
-        * The lock provides protection\r
-        */\r
-       KeWaitForMutexObject(\r
-               &p_adapter->mutex, Executive, KernelMode, FALSE, NULL );\r
-       cl_obj_lock( &p_adapter->obj );\r
-       p_adapter->state = IB_PNP_PORT_REMOVE;\r
-\r
-       /*\r
-        * Clear the pointer to the port object since the object destruction\r
-        * will cascade to child objects.  This prevents potential duplicate\r
-        * destruction (or worse, stale pointer usage).\r
-        */\r
-       p_adapter->p_port = NULL;\r
-\r
-       cl_obj_unlock( &p_adapter->obj );\r
-\r
-       KeReleaseMutex( &p_adapter->mutex, FALSE );\r
-\r
-       cl_obj_destroy( &p_adapter->obj );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-}\r
-\r
-\r
-static void\r
-adapter_construct(\r
-       IN                              ipoib_adapter_t* const          p_adapter )\r
-{\r
-       cl_obj_construct( &p_adapter->obj, IPOIB_OBJ_INSTANCE );\r
-       cl_spinlock_construct( &p_adapter->send_stat_lock );\r
-       cl_spinlock_construct( &p_adapter->recv_stat_lock );\r
-       cl_qpool_construct( &p_adapter->item_pool );\r
-       KeInitializeMutex( &p_adapter->mutex, 0 );\r
-\r
-       cl_thread_construct(&p_adapter->destroy_thread);\r
-       \r
-       cl_vector_construct( &p_adapter->ip_vector );\r
-\r
-       cl_perf_construct( &p_adapter->perf );\r
-\r
-       p_adapter->state = IB_PNP_PORT_ADD;\r
-       p_adapter->port_rate = FOUR_X_IN_100BPS;\r
-}\r
-\r
-\r
-static ib_api_status_t\r
-adapter_init(\r
-       IN                              ipoib_adapter_t* const          p_adapter )\r
-{\r
-       cl_status_t                     cl_status;\r
-       ib_api_status_t         status;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       cl_status = cl_perf_init( &p_adapter->perf, MaxPerf );\r
-       if( cl_status != CL_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("cl_perf_init returned %#x\n", cl_status) );\r
-               return IB_ERROR;\r
-       }\r
-\r
-       cl_status = cl_spinlock_init( &p_adapter->send_stat_lock );\r
-       if( cl_status != CL_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("cl_spinlock_init returned %#x\n", cl_status) );\r
-               return IB_ERROR;\r
-       }\r
-\r
-       cl_status = cl_spinlock_init( &p_adapter->recv_stat_lock );\r
-       if( cl_status != CL_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("cl_spinlock_init returned %#x\n", cl_status) );\r
-               return IB_ERROR;\r
-       }\r
-\r
-       cl_status = cl_qpool_init( &p_adapter->item_pool, ITEM_POOL_START, 0,\r
-               ITEM_POOL_GROW, sizeof(cl_pool_obj_t), NULL, NULL, NULL );\r
-       if( cl_status != CL_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("cl_qpool_init returned %#x\n", cl_status) );\r
-               return IB_ERROR;\r
-       }\r
-\r
-\r
-       /* We manually manage the size and capacity of the vector. */\r
-       cl_status = cl_vector_init( &p_adapter->ip_vector, 0,\r
-               0, sizeof(net_address_item_t), NULL, NULL, p_adapter );\r
-       if( cl_status != CL_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("cl_vector_init for ip_vector returned %#x\n",\r
-                       cl_status) );\r
-               return IB_ERROR;\r
-       }\r
-\r
-       /* Validate the port GUID and generate the MAC address. */\r
-       status =\r
-               ipoib_mac_from_guid( p_adapter->guids.port_guid.guid, p_adapter->params.guid_mask, &p_adapter->mac);\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               if( status == IB_INVALID_GUID_MASK )\r
-               {\r
-                       IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_ERROR,\r
-                               ("Invalid GUID mask received, rejecting it") );\r
-                       ipoib_create_log(p_adapter->h_adapter, GUID_MASK_LOG_INDEX, EVENT_IPOIB_WRONG_PARAMETER_WRN);\r
-               }\r
-\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ipoib_mac_from_guid returned %s\n", \r
-                       p_adapter->p_ifc->get_err_str( status )) );\r
-               return status;\r
-       }\r
-\r
-       /* Open AL. */\r
-       status = p_adapter->p_ifc->open_al( &p_adapter->h_al );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ib_open_al returned %s\n", \r
-                       p_adapter->p_ifc->get_err_str( status )) );\r
-               return status;\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-       return status;\r
-}\r
-\r
-\r
-static ib_api_status_t\r
-__ipoib_pnp_reg(\r
-       IN                              ipoib_adapter_t* const          p_adapter,\r
-       IN                              ib_pnp_class_t                          flags )\r
-{\r
-       ib_api_status_t         status;\r
-       ib_pnp_req_t            pnp_req;\r
-       \r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       CL_ASSERT( !p_adapter->h_pnp );\r
-       CL_ASSERT( !p_adapter->registering );\r
-\r
-       p_adapter->registering = TRUE;\r
-       \r
-       /* Register for PNP events. */\r
-       cl_memclr( &pnp_req, sizeof(pnp_req) );\r
-       pnp_req.pnp_class = IB_PNP_PORT | flags;\r
-       /*\r
-        * Context is the cl_obj of the adapter to allow passing cl_obj_deref\r
-        * to ib_dereg_pnp.\r
-        */\r
-       pnp_req.pnp_context = &p_adapter->obj;\r
-       pnp_req.pfn_pnp_cb = __ipoib_pnp_cb;\r
-       status = p_adapter->p_ifc->reg_pnp( p_adapter->h_al, &pnp_req, &p_adapter->h_pnp );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               ASSERT(FALSE);\r
-               p_adapter->registering = FALSE;\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ib_reg_pnp returned %s\n", \r
-                       p_adapter->p_ifc->get_err_str( status )) );\r
-               return status;\r
-       }\r
-       /*\r
-        * Reference the adapter on behalf of the PNP registration.\r
-        * This allows the destruction to block until the PNP deregistration\r
-        * completes.\r
-        */\r
-       cl_obj_ref( &p_adapter->obj );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-       return status;\r
-}\r
-\r
-\r
-static void\r
-__adapter_destroying(\r
-       IN                              cl_obj_t* const                         p_obj )\r
-{\r
-       ipoib_adapter_t         *p_adapter;\r
-       KLOCK_QUEUE_HANDLE      hdl;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       p_adapter = PARENT_STRUCT( p_obj, ipoib_adapter_t, obj );\r
-\r
-       /*\r
-        * The adapter's object will be dereferenced when the deregistration\r
-        * completes.  No need to lock here since all PnP related API calls\r
-        * are driven by NDIS (via the Init/Reset/Destroy paths).\r
-        */\r
-       if( p_adapter->h_pnp )\r
-       {\r
-               p_adapter->p_ifc->dereg_pnp( p_adapter->h_pnp, cl_obj_deref );\r
-               p_adapter->h_pnp = NULL;\r
-       }\r
-\r
-       if( p_adapter->packet_filter )\r
-       {\r
-               KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
-               cl_obj_lock( &p_adapter->obj );\r
-\r
-               ASSERT( cl_qlist_count( &g_ipoib.adapter_list ) );\r
-               cl_qlist_remove_item( &g_ipoib.adapter_list, &p_adapter->entry );\r
-\r
-               p_adapter->packet_filter = 0;\r
-\r
-               cl_obj_unlock( &p_adapter->obj );\r
-               KeReleaseInStackQueuedSpinLock( &hdl );\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-}\r
-\r
-\r
-static void\r
-__adapter_free(\r
-       IN                              cl_obj_t* const                         p_obj )\r
-{\r
-       ipoib_adapter_t *p_adapter;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       p_adapter = PARENT_STRUCT( p_obj, ipoib_adapter_t, obj );\r
-\r
-       if( p_adapter->p_ifc )\r
-       {\r
-               if( p_adapter->h_al )\r
-                       p_adapter->p_ifc->close_al( p_adapter->h_al );\r
-\r
-               cl_free( p_adapter->p_ifc );\r
-               p_adapter->p_ifc = NULL;\r
-       }\r
-\r
-       cl_vector_destroy( &p_adapter->ip_vector );\r
-       cl_qpool_destroy( &p_adapter->item_pool );\r
-       cl_spinlock_destroy( &p_adapter->recv_stat_lock );\r
-       cl_spinlock_destroy( &p_adapter->send_stat_lock );\r
-       cl_obj_deinit( p_obj );\r
-\r
-       cl_perf_destroy( &p_adapter->perf, TRUE );\r
-\r
-       cl_free( p_adapter );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-}\r
-\r
-\r
-static ib_api_status_t\r
-ipoib_query_pkey_index(ipoib_adapter_t *p_adapter)\r
-{\r
-       ib_api_status_t                 status;\r
-       ib_ca_attr_t                *ca_attr;\r
-       uint32_t                            ca_size;\r
-       uint16_t index = 0;\r
-\r
-       /* Query the CA for Pkey table */\r
-       status = p_adapter->p_ifc->query_ca(p_adapter->p_port->ib_mgr.h_ca, NULL, &ca_size);\r
-       if(status != IB_INSUFFICIENT_MEMORY)\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                               ("ib_query_ca failed\n"));\r
-               return status;\r
-       }\r
-\r
-       ca_attr = (ib_ca_attr_t*)cl_zalloc(ca_size);\r
-       if      (!ca_attr)\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                               ("cl_zalloc can't allocate %d\n",ca_size));\r
-               return IB_INSUFFICIENT_MEMORY;\r
-       }\r
-\r
-       status = p_adapter->p_ifc->query_ca(p_adapter->p_port->ib_mgr.h_ca, ca_attr,&ca_size);  \r
-       if( status != IB_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                               ("ib_query_ca returned %s\n", \r
-                                                p_adapter->p_ifc->get_err_str( status )) );\r
-               goto pkey_end;\r
-       }\r
-       CL_ASSERT(ca_attr->p_port_attr[p_adapter->p_port->port_num -1].p_pkey_table[0] == IB_DEFAULT_PKEY);\r
-       for(index = 0; index < ca_attr->p_port_attr[p_adapter->p_port->port_num -1].num_pkeys; index++)\r
-       {\r
-               if(cl_hton16(p_adapter->guids.port_guid.pkey) == ca_attr->p_port_attr[p_adapter->p_port->port_num -1].p_pkey_table[index])\r
-                       break;\r
-       }\r
-       if(index >= ca_attr->p_port_attr[p_adapter->p_port->port_num -1].num_pkeys)\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                               ("Pkey table is invalid, index not found\n"));\r
-               NdisWriteErrorLogEntry( p_adapter->h_adapter,\r
-                       EVENT_IPOIB_PARTITION_ERR, 1, p_adapter->guids.port_guid.pkey );\r
-               status = IB_NOT_FOUND;\r
-               p_adapter->p_port->pkey_index = PKEY_INVALID_INDEX;\r
-               goto pkey_end;\r
-       }\r
-\r
-       p_adapter->p_port->pkey_index = index;\r
-       IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_IB,\r
-                                       ("for PKEY = 0x%04X got index = %d\n",p_adapter->guids.port_guid.pkey,index));\r
-\r
-pkey_end:\r
-       if(ca_attr)\r
-               cl_free(ca_attr);\r
-       return status;\r
-}\r
-\r
-static ib_api_status_t\r
-__ipoib_pnp_cb(\r
-       IN                              ib_pnp_rec_t                            *p_pnp_rec )\r
-{\r
-       ipoib_adapter_t         *p_adapter;\r
-       ipoib_port_t            *p_port;\r
-       ib_pnp_event_t          old_state;\r
-       ib_pnp_port_rec_t       *p_port_rec;\r
-       ib_api_status_t         status = IB_SUCCESS;\r
-       NDIS_LINK_STATE         link_state;\r
-       NDIS_STATUS_INDICATION  status_indication;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_PNP );\r
-\r
-       CL_ASSERT( p_pnp_rec );\r
-       NdisZeroMemory(&link_state, sizeof(NDIS_LINK_STATE));\r
-       p_adapter =\r
-               PARENT_STRUCT( p_pnp_rec->pnp_context, ipoib_adapter_t, obj );\r
-\r
-       CL_ASSERT( p_adapter );\r
-\r
-       /* Synchronize with destruction */\r
-       KeWaitForMutexObject(\r
-               &p_adapter->mutex, Executive, KernelMode, FALSE, NULL );\r
-       cl_obj_lock( &p_adapter->obj );\r
-       old_state = p_adapter->state;\r
-       cl_obj_unlock( &p_adapter->obj );\r
-       if( old_state == IB_PNP_PORT_REMOVE )\r
-       {\r
-               KeReleaseMutex( &p_adapter->mutex, FALSE );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_PNP,\r
-                       ("Aborting - Adapter destroying.\n") );\r
-               return IB_NOT_DONE;\r
-       }\r
-\r
-       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_PNP,\r
-               ("p_pnp_rec->pnp_event = 0x%x (%s)\n",\r
-               p_pnp_rec->pnp_event, ib_get_pnp_event_str( p_pnp_rec->pnp_event )) );\r
-\r
-       p_port_rec = (ib_pnp_port_rec_t*)p_pnp_rec;\r
-\r
-       switch( p_pnp_rec->pnp_event )\r
-       {\r
-       case IB_PNP_PORT_ADD:\r
-               CL_ASSERT( !p_pnp_rec->context );\r
-               /* Only process our port GUID. */\r
-               if( p_pnp_rec->guid != p_adapter->guids.port_guid.guid )\r
-               {\r
-                       status = IB_NOT_DONE;\r
-                       break;\r
-               }\r
-\r
-               /* Don't process if we're destroying. */\r
-               if( p_adapter->obj.state == CL_DESTROYING )\r
-               {\r
-                       status = IB_NOT_DONE;\r
-                       break;\r
-               }\r
-\r
-               CL_ASSERT( !p_adapter->p_port );\r
-               /* Allocate all IB resources. */\r
-               cl_obj_lock( &p_adapter->obj );\r
-               p_adapter->state = IB_PNP_PORT_ADD;\r
-               cl_obj_unlock( &p_adapter->obj );\r
-               status = ipoib_create_port( p_adapter, p_port_rec, &p_port );\r
-               cl_obj_lock( &p_adapter->obj );\r
-               if( status != IB_SUCCESS )\r
-               {\r
-                       p_adapter->state = old_state;\r
-                       cl_obj_unlock( &p_adapter->obj );\r
-                       p_adapter->hung = TRUE;\r
-                       break;\r
-               }\r
-\r
-               p_pnp_rec->context = p_port;\r
-\r
-               p_adapter->p_port = p_port;\r
-               cl_obj_unlock( &p_adapter->obj );\r
-               break;\r
-\r
-       case IB_PNP_PORT_REMOVE:\r
-               /* Release all IB resources. */\r
-               CL_ASSERT( p_pnp_rec->context );\r
-\r
-               cl_obj_lock( &p_adapter->obj );\r
-               p_adapter->state = IB_PNP_PORT_REMOVE;\r
-               p_port = p_adapter->p_port;\r
-               p_adapter->p_port = NULL;\r
-               cl_obj_unlock( &p_adapter->obj );\r
-               ipoib_port_destroy( p_port );\r
-               p_pnp_rec->context = NULL;\r
-               status = IB_SUCCESS;\r
-               break;\r
-\r
-       case IB_PNP_PORT_ACTIVE:\r
-               /* Join multicast groups and put QP in RTS. */\r
-               CL_ASSERT( p_pnp_rec->context );\r
-\r
-               cl_obj_lock( &p_adapter->obj );\r
-               p_adapter->state = IB_PNP_PORT_INIT;\r
-               cl_obj_unlock( &p_adapter->obj );\r
-               ipoib_port_up( p_adapter->p_port, p_port_rec );\r
-\r
-               status = IB_SUCCESS;\r
-               break;\r
-\r
-       case IB_PNP_PORT_ARMED:\r
-               status = IB_SUCCESS;\r
-               break;\r
-\r
-       case IB_PNP_PORT_INIT:\r
-               /*\r
-                * Init could happen if the SM brings the port down\r
-                * without changing the physical link.\r
-                */\r
-       case IB_PNP_PORT_DOWN:\r
-               CL_ASSERT( p_pnp_rec->context );\r
-\r
-               cl_obj_lock( &p_adapter->obj );\r
-               old_state = p_adapter->state;\r
-               p_adapter->state = IB_PNP_PORT_DOWN;\r
-               cl_obj_unlock( &p_adapter->obj );\r
-               status = IB_SUCCESS;\r
-\r
-               if( !p_adapter->registering && old_state != IB_PNP_PORT_DOWN )\r
-               {\r
-                       link_state.Header.Revision = NDIS_LINK_STATE_REVISION_1;\r
-                       link_state.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;\r
-                       link_state.Header.Size = sizeof(NDIS_LINK_STATE);\r
-                       link_state.MediaConnectState = MediaConnectStateDisconnected;\r
-                       //link_state.MediaConnectState = MediaConnectStateConnected;\r
-                       link_state.MediaDuplexState = MediaDuplexStateFull;\r
-                       link_state.XmitLinkSpeed = link_state.RcvLinkSpeed = IPOIB_MEDIA_MAX_SPEED;\r
-\r
-                       IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,\r
-                                   p_adapter->h_adapter,\r
-                                   NDIS_STATUS_LINK_STATE,\r
-                                   (PVOID)&link_state,\r
-                                   sizeof(link_state));\r
-\r
-                       NdisMIndicateStatusEx(p_adapter->h_adapter,&status_indication);\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
-                               ("Link DOWN!\n") );\r
-\r
-                       ipoib_port_down( p_adapter->p_port );\r
-               }\r
-               break;\r
-\r
-       case IB_PNP_REG_COMPLETE:\r
-               if( p_adapter->registering )\r
-               {\r
-                       p_adapter->registering = FALSE;\r
-                       cl_obj_lock( &p_adapter->obj );\r
-                       old_state = p_adapter->state;\r
-                       cl_obj_unlock( &p_adapter->obj );\r
-\r
-                       if( old_state == IB_PNP_PORT_DOWN )\r
-                       {\r
-                               /* If we were initializing, we might have pended some OIDs. */\r
-                               ipoib_resume_oids( p_adapter );\r
-\r
-                               link_state.Header.Revision = NDIS_LINK_STATE_REVISION_1;\r
-                               link_state.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;\r
-                               link_state.Header.Size = sizeof(NDIS_LINK_STATE);\r
-                               link_state.MediaConnectState = MediaConnectStateDisconnected;\r
-                               //link_state.MediaConnectState = MediaConnectStateConnected;\r
-                               link_state.MediaDuplexState = MediaDuplexStateFull;\r
-                               link_state.XmitLinkSpeed = link_state.RcvLinkSpeed = IPOIB_MEDIA_MAX_SPEED;\r
-\r
-                               IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,\r
-                                                                          p_adapter->h_adapter,\r
-                                                                          NDIS_STATUS_LINK_STATE,\r
-                                                                          (PVOID)&link_state,\r
-                                                                          sizeof(link_state));\r
-                               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_INIT,\r
-                       ("Indicate DISCONNECT\n") );\r
-                               NdisMIndicateStatusEx(p_adapter->h_adapter,&status_indication);                 \r
-                       }\r
-               }\r
-\r
-               if( p_adapter->reset && p_adapter->state != IB_PNP_PORT_INIT )\r
-               {\r
-                       p_adapter->reset = FALSE;\r
-                       NdisMResetComplete(\r
-                               p_adapter->h_adapter, NDIS_STATUS_SUCCESS, TRUE );\r
-               }\r
-               status = IB_SUCCESS;\r
-               break;\r
-\r
-       default:\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
-                       ("IPOIB: Received unhandled PnP event 0x%x (%s)\n",\r
-                       p_pnp_rec->pnp_event, ib_get_pnp_event_str( p_pnp_rec->pnp_event )) );\r
-               /* Fall through. */\r
-\r
-               status = IB_SUCCESS;\r
-\r
-               /* We ignore events below if the link is not active. */\r
-               if( p_port_rec->p_port_attr->link_state != IB_LINK_ACTIVE )\r
-                       break;\r
-\r
-               case IB_PNP_PKEY_CHANGE:\r
-                       if(p_pnp_rec->pnp_event == IB_PNP_PKEY_CHANGE && \r
-                          p_adapter->guids.port_guid.pkey != IB_DEFAULT_PKEY)\r
-                       {\r
-                               status = ipoib_query_pkey_index(p_adapter);\r
-                               if(status != IB_SUCCESS)\r
-                               {\r
-                                  cl_obj_lock( &p_adapter->obj );\r
-                                  p_adapter->state = IB_PNP_PORT_INIT;\r
-                                  cl_obj_unlock( &p_adapter->obj );\r
-                               }\r
-                       }\r
-\r
-               case IB_PNP_SM_CHANGE:\r
-               case IB_PNP_GID_CHANGE:\r
-               case IB_PNP_LID_CHANGE:\r
-\r
-               cl_obj_lock( &p_adapter->obj );\r
-               old_state = p_adapter->state;\r
-               switch( old_state )\r
-               {\r
-               case IB_PNP_PORT_DOWN:\r
-                       p_adapter->state = IB_PNP_PORT_INIT;\r
-                       break;\r
-\r
-               default:\r
-                       p_adapter->state = IB_PNP_PORT_DOWN;\r
-               }\r
-               cl_obj_unlock( &p_adapter->obj );\r
-               \r
-               if( p_adapter->registering )\r
-                       break;\r
-\r
-               switch( old_state )\r
-               {\r
-               case IB_PNP_PORT_ACTIVE:\r
-               case IB_PNP_PORT_INIT:\r
-                       link_state.Header.Revision = NDIS_LINK_STATE_REVISION_1;\r
-                       link_state.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;\r
-                       link_state.Header.Size = sizeof(NDIS_LINK_STATE);\r
-                       link_state.MediaConnectState = MediaConnectStateDisconnected;\r
-                       //link_state.MediaConnectState = MediaConnectStateConnected;\r
-                       link_state.MediaDuplexState = MediaDuplexStateFull;\r
-                       link_state.XmitLinkSpeed = link_state.RcvLinkSpeed = IPOIB_MEDIA_MAX_SPEED;\r
-\r
-                       IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,\r
-                                                                  p_adapter->h_adapter,\r
-                                                                  NDIS_STATUS_LINK_STATE,\r
-                                                                  (PVOID)&link_state,\r
-                                                                  sizeof(link_state));\r
-\r
-                       NdisMIndicateStatusEx(p_adapter->h_adapter,&status_indication);         \r
-\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
-                               ("Link DOWN!\n") );\r
-                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_INIT,\r
-                       ("Indicate DISCONNECT\n") );\r
-\r
-                       ipoib_port_down( p_adapter->p_port );\r
-                       /* Fall through. */\r
-\r
-               case IB_PNP_PORT_DOWN:\r
-                       cl_obj_lock( &p_adapter->obj );\r
-                       p_adapter->state = IB_PNP_PORT_INIT;\r
-                       cl_obj_unlock( &p_adapter->obj );\r
-                       ipoib_port_up( p_adapter->p_port, (ib_pnp_port_rec_t*)p_pnp_rec );\r
-               }\r
-               break;\r
-       }\r
-\r
-       KeReleaseMutex( &p_adapter->mutex, FALSE );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_PNP );\r
-       return status;\r
-}\r
-\r
-\r
-/* Joins/leaves mcast groups based on currently programmed mcast MACs. */\r
-void\r
-ipoib_refresh_mcast(\r
-       IN                              ipoib_adapter_t* const          p_adapter,\r
-       IN                              mac_addr_t* const                       p_mac_array,\r
-       IN              const   uint8_t                                         num_macs )\r
-{\r
-       uint8_t                         i, j;\r
-       ipoib_port_t            *p_port = NULL;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_MCAST );\r
-       cl_obj_lock( &p_adapter->obj );\r
-       if( p_adapter->state == IB_PNP_PORT_ACTIVE )\r
-       {\r
-               p_port = p_adapter->p_port;\r
-               ipoib_port_ref( p_port, ref_refresh_mcast );\r
-       }\r
-       cl_obj_unlock( &p_adapter->obj );\r
-\r
-       if( p_port )\r
-       {\r
-               /* Purge old entries. */\r
-               for( i = 0; i < p_adapter->mcast_array_size; i++ )\r
-               {\r
-                       for( j = 0; j < num_macs; j++ )\r
-                       {\r
-                               if( !cl_memcmp( &p_adapter->mcast_array[i], &p_mac_array[j],\r
-                                       sizeof(mac_addr_t) ) )\r
-                               {\r
-                                       break;\r
-                               }\r
-                       }\r
-                       if( j != num_macs )\r
-                               continue;\r
-\r
-                       ipoib_port_remove_endpt( p_port, p_adapter->mcast_array[i] );\r
-               }\r
-\r
-               /* Add new entries */\r
-               for( i = 0; i < num_macs; i++ )\r
-               {\r
-                       for( j = 0; j < p_adapter->mcast_array_size; j++ )\r
-                       {\r
-                               if( !cl_memcmp( &p_adapter->mcast_array[j], &p_mac_array[i],\r
-                                       sizeof(mac_addr_t) ) )\r
-                               {\r
-                                       break;\r
-                               }\r
-                       }\r
-\r
-                       if( j != p_adapter->mcast_array_size )\r
-                               continue;\r
-                       if ( ( p_mac_array[i].addr[0] == 1 && p_mac_array[i].addr[1] == 0 && p_mac_array[i].addr[2] == 0x5e &&\r
-                                  p_mac_array[i].addr[3] == 0 && p_mac_array[i].addr[4] == 0 && p_mac_array[i].addr[5] == 1 ) ||\r
-                                 !( p_mac_array[i].addr[0] == 1 && p_mac_array[i].addr[1] == 0 && p_mac_array[i].addr[2] == 0x5e )\r
-                               )\r
-                       {\r
-                               ipoib_port_join_mcast( p_port, p_mac_array[i], IB_MC_REC_STATE_FULL_MEMBER );\r
-                       }\r
-               }\r
-       }\r
-\r
-       /* Copy the MAC array. */\r
-       NdisMoveMemory( p_adapter->mcast_array, p_mac_array,\r
-               num_macs * sizeof(mac_addr_t) );\r
-       p_adapter->mcast_array_size = num_macs;\r
-\r
-       if( p_port )\r
-               ipoib_port_deref( p_port, ref_refresh_mcast );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_MCAST );\r
-}\r
-\r
-\r
-ib_api_status_t\r
-ipoib_reset_adapter(\r
-       IN                              ipoib_adapter_t* const          p_adapter )\r
-{\r
-       ib_api_status_t         status;\r
-       ib_pnp_handle_t         h_pnp;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       if( p_adapter->reset )\r
-               return IB_INVALID_STATE;\r
-\r
-       p_adapter->hung = FALSE;\r
-       p_adapter->reset = TRUE;\r
-\r
-       if( p_adapter->h_pnp )\r
-       {\r
-               h_pnp = p_adapter->h_pnp;\r
-               p_adapter->h_pnp  = NULL;\r
-               status = p_adapter->p_ifc->dereg_pnp( h_pnp, __ipoib_pnp_dereg );\r
-               if( status == IB_SUCCESS )\r
-                       status = IB_NOT_DONE;\r
-       }\r
-       else\r
-       {\r
-               status = __ipoib_pnp_reg( p_adapter, IB_PNP_FLAG_REG_COMPLETE );\r
-               if( status == IB_SUCCESS )\r
-                       p_adapter->hung = FALSE;\r
-       }\r
-       if (status == IB_NOT_DONE) {\r
-               p_adapter->reset = TRUE;\r
-       }\r
-       else {\r
-               p_adapter->reset = FALSE;\r
-       }\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-       return status;\r
-}\r
-\r
-\r
-static void\r
-__ipoib_pnp_dereg(\r
-       IN                              void*                                           context )\r
-{\r
-       ipoib_adapter_t*        p_adapter;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       p_adapter = PARENT_STRUCT( context, ipoib_adapter_t, obj );\r
-\r
-       cl_thread_init(&p_adapter->destroy_thread, __ipoib_adapter_reset, (void*)p_adapter, "destroy_thread");\r
-       \r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-}\r
-\r
-static void\r
-__ipoib_adapter_reset(\r
-       IN                              void*   context)\r
-{\r
-\r
-       ipoib_adapter_t *p_adapter;\r
-       ipoib_port_t            *p_port;\r
-       ib_api_status_t         status;\r
-       ib_pnp_event_t          state;\r
-       \r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Got RESET\n") );\r
-//     return;\r
-       p_adapter = (ipoib_adapter_t*)context;\r
-       \r
-       /* Synchronize with destruction */\r
-       KeWaitForMutexObject(\r
-               &p_adapter->mutex, Executive, KernelMode, FALSE, NULL );\r
-\r
-       cl_obj_lock( &p_adapter->obj );\r
-\r
-       CL_ASSERT( !p_adapter->h_pnp );\r
-\r
-       if( p_adapter->state != IB_PNP_PORT_REMOVE )\r
-               p_adapter->state = IB_PNP_PORT_ADD;\r
-\r
-       state = p_adapter->state;\r
-\r
-       /* Destroy the current port instance if it still exists. */\r
-       p_port = p_adapter->p_port;\r
-       p_adapter->p_port = NULL;\r
-       cl_obj_unlock( &p_adapter->obj );\r
-\r
-       if( p_port )\r
-               ipoib_port_destroy( p_port );\r
-       ASSERT(p_adapter->reset == TRUE);\r
-       if( state != IB_PNP_PORT_REMOVE )\r
-       {\r
-               status = __ipoib_pnp_reg( p_adapter, IB_PNP_FLAG_REG_COMPLETE );\r
-               if( status != IB_SUCCESS )\r
-               {\r
-                       p_adapter->reset = FALSE;\r
-                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("__ipoib_pnp_reg returned %s\n",\r
-                               p_adapter->p_ifc->get_err_str( status )) );\r
-                       NdisMResetComplete( \r
-                               p_adapter->h_adapter, NDIS_STATUS_HARD_ERRORS, TRUE );\r
-               }\r
-       }\r
-       else\r
-       {\r
-               p_adapter->reset = FALSE;\r
-               NdisMResetComplete(\r
-                       p_adapter->h_adapter, NDIS_STATUS_SUCCESS, TRUE );\r
-               status = IB_SUCCESS;\r
-       }\r
-\r
-       /* Dereference the adapter since the previous registration is now gone. */\r
-       cl_obj_deref( &p_adapter->obj );\r
-\r
-       KeReleaseMutex( &p_adapter->mutex, FALSE );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-}\r
-\r
-\r
-void\r
-ipoib_set_rate(\r
-       IN                              ipoib_adapter_t* const          p_adapter,\r
-       IN              const   uint8_t                                         link_width, \r
-       IN              const   uint8_t                                         link_speed )\r
-{\r
-       uint32_t        rate;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       /* Set the link speed based on the IB link speed (1x vs 4x, etc). */\r
-       switch( link_speed )\r
-       {\r
-       case IB_LINK_SPEED_ACTIVE_2_5:\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
-                       ("Link speed is 2.5Gs\n") );\r
-               rate = IB_LINK_SPEED_ACTIVE_2_5;\r
-               break;\r
-\r
-       case IB_LINK_SPEED_ACTIVE_5:\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
-                       ("Link speed is 5G\n") );\r
-               rate = IB_LINK_SPEED_ACTIVE_5;\r
-               break;\r
-\r
-       case IB_LINK_SPEED_ACTIVE_10:\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
-                       ("Link speed is 10G\n") );\r
-               rate = IB_LINK_SPEED_ACTIVE_10;\r
-               break;\r
-\r
-       default:\r
-               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Invalid link speed %d.\n", link_speed) );\r
-               rate = 0;\r
-       }\r
-\r
-       switch( link_width )\r
-       {\r
-       case IB_LINK_WIDTH_ACTIVE_1X:\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
-                       ("Link width is 1X\n") );\r
-               rate *= ONE_X_IN_100BPS;\r
-               break;\r
-\r
-       case IB_LINK_WIDTH_ACTIVE_4X:\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
-                       ("Link width is 4X\n") );\r
-               rate *= FOUR_X_IN_100BPS;\r
-               break;\r
-\r
-       case IB_LINK_WIDTH_ACTIVE_12X:\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
-                       ("Link width is 12X\n") );\r
-               rate *= TWELVE_X_IN_100BPS;\r
-               break;\r
-\r
-       default:\r
-               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Invalid link rate (%d).\n", link_width) );\r
-               rate = 0;\r
-       }\r
-\r
-       p_adapter->port_rate = rate;\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-}\r
-\r
-\r
-ib_api_status_t\r
-ipoib_set_active(\r
-       IN                              ipoib_adapter_t* const          p_adapter )\r
-{\r
-       ib_pnp_event_t  old_state;\r
-       uint8_t                 i;\r
-       ib_api_status_t status = IB_SUCCESS;\r
-       NDIS_LINK_STATE         link_state;\r
-       NDIS_STATUS_INDICATION  status_indication;\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       NdisZeroMemory(&link_state, sizeof(NDIS_LINK_STATE));\r
-       cl_obj_lock( &p_adapter->obj );\r
-       old_state = p_adapter->state;\r
-\r
-       /* Change the state to indicate that we are now connected and live. */\r
-       if( old_state == IB_PNP_PORT_INIT )\r
-               p_adapter->state = IB_PNP_PORT_ACTIVE;\r
-\r
-       cl_obj_unlock( &p_adapter->obj );\r
-\r
-       /*\r
-        * If we had a pending OID request for OID_GEN_LINK_SPEED,\r
-        * complete it now.\r
-        */\r
-       switch( old_state )\r
-       {\r
-       case IB_PNP_PORT_ADD:\r
-               ipoib_reg_addrs( p_adapter );\r
-               /* Fall through. */\r
-\r
-       case IB_PNP_PORT_REMOVE:\r
-               ipoib_resume_oids( p_adapter );\r
-               break;\r
-\r
-       default:\r
-               if (p_adapter->guids.port_guid.pkey != IB_DEFAULT_PKEY)\r
-               {\r
-                       status = ipoib_query_pkey_index(p_adapter);\r
-                       if( IB_SUCCESS != status)\r
-                       {\r
-                               break;\r
-                       }\r
-               }\r
-               /* Join all programmed multicast groups. */\r
-               for( i = 0; i < p_adapter->mcast_array_size; i++ )\r
-               {\r
-                       ipoib_port_join_mcast(\r
-                               p_adapter->p_port, p_adapter->mcast_array[i] ,IB_MC_REC_STATE_FULL_MEMBER);\r
-               }\r
-\r
-               /* Register all existing addresses. */\r
-               ipoib_reg_addrs( p_adapter );\r
-\r
-               ipoib_resume_oids( p_adapter );\r
-\r
-               /*\r
-                * Now that we're in the broadcast group, notify that\r
-                * we have a link.\r
-                */\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, ("Link UP!\n") );\r
-               NdisWriteErrorLogEntry( p_adapter->h_adapter,\r
-                       EVENT_IPOIB_PORT_UP + (p_adapter->port_rate/ONE_X_IN_100BPS),\r
-                       1, p_adapter->port_rate );\r
-\r
-               if( !p_adapter->reset )\r
-               {\r
-                       link_state.Header.Revision = NDIS_LINK_STATE_REVISION_1;\r
-                       link_state.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;\r
-                       link_state.Header.Size = sizeof(NDIS_LINK_STATE);\r
-                       link_state.MediaConnectState = MediaConnectStateConnected;\r
-                       link_state.MediaDuplexState = MediaDuplexStateFull;\r
-                       link_state.XmitLinkSpeed = \r
-                       link_state.RcvLinkSpeed = IPOIB_MEDIA_MAX_SPEED;\r
-                       link_state.PauseFunctions = NdisPauseFunctionsSendAndReceive;\r
-                       IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,\r
-                                                                  p_adapter->h_adapter,\r
-                                                                  NDIS_STATUS_LINK_STATE,\r
-                                                                  (PVOID)&link_state,\r
-                                                                  sizeof(link_state));\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, ("***************Indicate connect!\n") );\r
-                       NdisMIndicateStatusEx(p_adapter->h_adapter,&status_indication);\r
-               }\r
-       }\r
-\r
-       if( p_adapter->reset )\r
-       {\r
-               ASSERT(FALSE);\r
-               p_adapter->reset = FALSE;\r
-               NdisMResetComplete(\r
-                       p_adapter->h_adapter, NDIS_STATUS_SUCCESS, TRUE );\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-       return  status;\r
-}\r
-\r
-/*\r
- * If something goes wrong after the port goes active, e.g.\r
- *     - PortInfo query failure\r
- *     - MC Join timeout\r
- *     - etc\r
- * Mark the port state as down, resume any pended OIDS, etc.\r
- */\r
-void\r
-ipoib_set_inactive(\r
-       IN                              ipoib_adapter_t* const          p_adapter )\r
-{\r
-       ib_pnp_event_t  old_state;\r
-       NDIS_LINK_STATE         link_state;\r
-       NDIS_STATUS_INDICATION  status_indication;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       NdisZeroMemory(&link_state, sizeof(NDIS_LINK_STATE));\r
-       cl_obj_lock( &p_adapter->obj );\r
-       old_state = p_adapter->state;\r
-       if( old_state != IB_PNP_PORT_REMOVE )\r
-               p_adapter->state = IB_PNP_PORT_DOWN;\r
-       cl_obj_unlock( &p_adapter->obj );\r
-\r
-       /*\r
-        * If we had a pending OID request for OID_GEN_LINK_SPEED,\r
-        * complete it now.\r
-        */\r
-       if( old_state == IB_PNP_PORT_INIT )\r
-       {\r
-               link_state.Header.Revision = NDIS_LINK_STATE_REVISION_1;\r
-               link_state.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;\r
-               link_state.Header.Size = sizeof(NDIS_LINK_STATE);\r
-               link_state.MediaConnectState = MediaConnectStateDisconnected;\r
-               //link_state.MediaConnectState = MediaConnectStateConnected;\r
-               \r
-               link_state.MediaDuplexState = MediaDuplexStateFull;\r
-               link_state.XmitLinkSpeed = link_state.RcvLinkSpeed = IPOIB_MEDIA_MAX_SPEED;\r
-\r
-               IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,\r
-                                                          p_adapter->h_adapter,\r
-                                                          NDIS_STATUS_LINK_STATE,\r
-                                                          (PVOID)&link_state,\r
-                                                          sizeof(link_state));\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, ("Indicate Disconnect!\n") );\r
-               NdisMIndicateStatusEx(p_adapter->h_adapter,&status_indication);\r
-\r
-               ipoib_resume_oids( p_adapter );\r
-       }\r
-\r
-       if( p_adapter->reset )\r
-       {\r
-               p_adapter->reset = FALSE;\r
-               NdisMResetComplete(\r
-                       p_adapter->h_adapter, NDIS_STATUS_SUCCESS, TRUE );\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-}\r
-\r
-NDIS_STATUS\r
-ipoib_get_gen_stat(\r
-       IN                              ipoib_adapter_t* const          p_adapter,\r
-       OUT             pending_oid_t* const            p_oid_info)\r
-{\r
-       PNDIS_STATISTICS_INFO StatisticsInfo;\r
-       IPOIB_ENTER( IPOIB_DBG_STAT );\r
-\r
-       if (p_oid_info->buf_len < sizeof(StatisticsInfo))\r
-       {\r
-               *p_oid_info->p_bytes_needed = sizeof(NDIS_STATISTICS_INFO);\r
-               return NDIS_STATUS_INVALID_LENGTH;\r
-       }\r
-\r
-       StatisticsInfo = (PNDIS_STATISTICS_INFO)p_oid_info->p_buf;\r
-    StatisticsInfo->Header.Revision = NDIS_OBJECT_REVISION_1;\r
-    StatisticsInfo->Header.Type = NDIS_OBJECT_TYPE_DEFAULT;\r
-    StatisticsInfo->Header.Size = sizeof(NDIS_STATISTICS_INFO);\r
-    /*StatisticsInfo->SupportedStatistics = NDIS_STATISTICS_FLAGS_VALID_RCV_DISCARDS          |\r
-                                          NDIS_STATISTICS_FLAGS_VALID_RCV_ERROR             |\r
-                                                                                 NDIS_STATISTICS_FLAGS_VALID_DIRECTED_FRAMES_RCV   |\r
-                                          NDIS_STATISTICS_FLAGS_VALID_MULTICAST_FRAMES_RCV  |\r
-                                                                                 NDIS_STATISTICS_FLAGS_VALID_BROADCAST_FRAMES_RCV  |\r
-                                          NDIS_STATISTICS_FLAGS_VALID_BYTES_RCV             | \r
-                                          NDIS_STATISTICS_FLAGS_VALID_MULTICAST_BYTES_RCV   |\r
-                                                                                 NDIS_STATISTICS_FLAGS_VALID_BROADCAST_BYTES_RCV       |\r
-                                                                                 NDIS_STATISTICS_FLAGS_VALID_DIRECTED_BYTES_RCV        |\r
-\r
-                                                                                 NDIS_STATISTICS_FLAGS_VALID_XMIT_DISCARDS                     |\r
-                                                                                 NDIS_STATISTICS_FLAGS_VALID_XMIT_ERROR            |\r
-                                                                                 NDIS_STATISTICS_FLAGS_VALID_DIRECTED_FRAMES_XMIT  | \r
-                                          NDIS_STATISTICS_FLAGS_VALID_MULTICAST_FRAMES_XMIT |\r
-                                                                                 NDIS_STATISTICS_FLAGS_VALID_BROADCAST_FRAMES_XMIT |\r
-                                                                                 NDIS_STATISTICS_FLAGS_VALID_BYTES_XMIT                        |\r
-                                                                                 NDIS_STATISTICS_FLAGS_VALID_DIRECTED_BYTES_XMIT       |\r
-                                                                                 NDIS_STATISTICS_FLAGS_VALID_MULTICAST_BYTES_XMIT      |\r
-                                                                                 NDIS_STATISTICS_FLAGS_VALID_BROADCAST_BYTES_XMIT; */\r
-                                                                                 \r
-                                                                                 \r
-       StatisticsInfo->SupportedStatistics =  NDIS_STATISTICS_FLAGS_VALID_DIRECTED_FRAMES_RCV |\r
-                                                                                       //The data in the ifHCInUcastPkts member is valid. \r
-                                                                                       NDIS_STATISTICS_FLAGS_VALID_MULTICAST_FRAMES_RCV |\r
-                                                                                       //The data in the ifHCInMulticastPkts member is valid. \r
-                                                                                       NDIS_STATISTICS_FLAGS_VALID_BROADCAST_FRAMES_RCV |\r
-                                                                                       //The data in the ifHCInBroadcastPkts member is valid. \r
-                                                                                       NDIS_STATISTICS_FLAGS_VALID_BYTES_RCV |\r
-                                                                                       //The data in the ifHCInOctets member is valid. \r
-                                                                                       NDIS_STATISTICS_FLAGS_VALID_RCV_DISCARDS |\r
-                                                                                       //The data in the ifInDiscards member is valid. \r
-                                                                                       NDIS_STATISTICS_FLAGS_VALID_RCV_ERROR |\r
-                                                                                       //The data in the ifInErrors member is valid. \r
-                                                                                       NDIS_STATISTICS_FLAGS_VALID_DIRECTED_FRAMES_XMIT |\r
-                                                                                       //The data in the ifHCOutUcastPkts member is valid. \r
-                                                                                       NDIS_STATISTICS_FLAGS_VALID_MULTICAST_FRAMES_XMIT |\r
-                                                                                       //The data in the ifHCOutMulticastPkts member is valid. \r
-                                                                                       NDIS_STATISTICS_FLAGS_VALID_BROADCAST_FRAMES_XMIT |\r
-                                                                                       //The data in the ifHCOutBroadcastPkts member is valid. \r
-                                                                                       NDIS_STATISTICS_FLAGS_VALID_BYTES_XMIT |\r
-                                                                                       //The data in the ifHCOutOctets member is valid. \r
-                                                                                       NDIS_STATISTICS_FLAGS_VALID_XMIT_ERROR |\r
-                                                                                       //The data in the ifOutErrors member is valid. \r
-                                                                                       NDIS_STATISTICS_FLAGS_VALID_XMIT_DISCARDS |\r
-                                                                                       //The data in the ifOutDiscards member is valid. \r
-                                                                                       NDIS_STATISTICS_FLAGS_VALID_DIRECTED_BYTES_RCV |\r
-                                                                                       //The data in the ifHCInUcastOctets member is valid. \r
-                                                                                       NDIS_STATISTICS_FLAGS_VALID_MULTICAST_BYTES_RCV |\r
-                                                                                       //The data in the ifHCInMulticastOctets member is valid. \r
-                                                                                       NDIS_STATISTICS_FLAGS_VALID_BROADCAST_BYTES_RCV |\r
-                                                                                       //The data in the ifHCInBroadcastOctets member is valid. \r
-                                                                                       NDIS_STATISTICS_FLAGS_VALID_DIRECTED_BYTES_XMIT |\r
-                                                                                       //The data in the ifHCOutUcastOctets member is valid. \r
-                                                                                       NDIS_STATISTICS_FLAGS_VALID_MULTICAST_BYTES_XMIT |\r
-                                                                                       //The data in the ifHCOutMulticastOctets member is valid. \r
-                                                                                       NDIS_STATISTICS_FLAGS_VALID_BROADCAST_BYTES_XMIT ;\r
-                                                                                       //The data in the ifHCOutBroadcastOctets member is valid\r
-\r
-    cl_spinlock_acquire( &p_adapter->recv_stat_lock );\r
-    StatisticsInfo->ifInDiscards = p_adapter->recv_stats.comp.dropped +\r
-                                   p_adapter->recv_stats.comp.error;            \r
-    StatisticsInfo->ifInErrors = p_adapter->recv_stats.comp.error;\r
-    StatisticsInfo->ifHCInOctets = p_adapter->recv_stats.ucast.bytes + \r
-                                                                  p_adapter->recv_stats.bcast.bytes + \r
-                                                                  p_adapter->recv_stats.mcast.bytes;       \r
-    StatisticsInfo->ifHCInUcastPkts       = p_adapter->recv_stats.ucast.frames;\r
-    StatisticsInfo->ifHCInMulticastPkts   = p_adapter->recv_stats.mcast.frames;  \r
-    StatisticsInfo->ifHCInBroadcastPkts   = p_adapter->recv_stats.bcast.frames;  \r
-       StatisticsInfo->ifHCInMulticastOctets = p_adapter->recv_stats.mcast.bytes;\r
-       StatisticsInfo->ifHCInBroadcastOctets = p_adapter->recv_stats.bcast.bytes;\r
-       StatisticsInfo->ifHCInUcastOctets     = p_adapter->recv_stats.ucast.bytes;\r
-       cl_spinlock_release( &p_adapter->recv_stat_lock );\r
-\r
-    cl_spinlock_acquire( &p_adapter->send_stat_lock ); \r
-    StatisticsInfo->ifHCOutOctets = p_adapter->send_stats.ucast.bytes + \r
-                                                                       p_adapter->send_stats.mcast.bytes + \r
-                                                                       p_adapter->send_stats.bcast.bytes;        \r
-    StatisticsInfo->ifHCOutUcastPkts       = p_adapter->send_stats.ucast.frames;     \r
-    StatisticsInfo->ifHCOutMulticastPkts   = p_adapter->send_stats.mcast.frames; \r
-    StatisticsInfo->ifHCOutBroadcastPkts   = p_adapter->send_stats.bcast.frames; \r
-    StatisticsInfo->ifOutErrors            = p_adapter->send_stats.comp.error;                                      \r
-    StatisticsInfo->ifOutDiscards          = p_adapter->send_stats.comp.dropped;\r
-       StatisticsInfo->ifHCOutUcastOctets     = p_adapter->send_stats.ucast.bytes;\r
-       StatisticsInfo->ifHCOutMulticastOctets = p_adapter->send_stats.mcast.bytes;\r
-       StatisticsInfo->ifHCOutBroadcastOctets = p_adapter->send_stats.bcast.bytes;\r
-    cl_spinlock_release( &p_adapter->send_stat_lock );\r
-\r
-       *p_oid_info->p_bytes_used = sizeof(NDIS_STATISTICS_INFO);\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-       return NDIS_STATUS_SUCCESS;\r
-}\r
-\r
-NDIS_STATUS\r
-ipoib_get_recv_stat(\r
-       IN                              ipoib_adapter_t* const          p_adapter,\r
-       IN              const   ip_stat_sel_t                           stat_sel,\r
-       IN                              pending_oid_t* const            p_oid_info )\r
-{\r
-       uint64_t        stat;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_STAT );\r
-\r
-       CL_ASSERT( p_adapter );\r
-\r
-       cl_spinlock_acquire( &p_adapter->recv_stat_lock );\r
-       switch( stat_sel )\r
-       {\r
-       case IP_STAT_SUCCESS:\r
-               stat = p_adapter->recv_stats.comp.success;\r
-               break;\r
-\r
-       case IP_STAT_ERROR:\r
-               stat = p_adapter->recv_stats.comp.error;\r
-               break;\r
-\r
-       case IP_STAT_DROPPED:\r
-               stat = p_adapter->recv_stats.comp.dropped;\r
-               break;\r
-\r
-       case IP_STAT_UCAST_BYTES:\r
-               stat = p_adapter->recv_stats.ucast.bytes;\r
-               break;\r
-\r
-       case IP_STAT_UCAST_FRAMES:\r
-               stat = p_adapter->recv_stats.ucast.frames;\r
-               break;\r
-\r
-       case IP_STAT_BCAST_BYTES:\r
-               stat = p_adapter->recv_stats.bcast.bytes;\r
-               break;\r
-\r
-       case IP_STAT_BCAST_FRAMES:\r
-               stat = p_adapter->recv_stats.bcast.frames;\r
-               break;\r
-\r
-       case IP_STAT_MCAST_BYTES:\r
-               stat = p_adapter->recv_stats.mcast.bytes;\r
-               break;\r
-\r
-       case IP_STAT_MCAST_FRAMES:\r
-               stat = p_adapter->recv_stats.mcast.frames;\r
-               break;\r
-\r
-       default:\r
-               stat = 0;\r
-       }\r
-       cl_spinlock_release( &p_adapter->recv_stat_lock );\r
-\r
-       *p_oid_info->p_bytes_needed = sizeof(uint64_t);\r
-\r
-       if( p_oid_info->buf_len >= sizeof(uint64_t) )\r
-       {\r
-               *((uint64_t*)p_oid_info->p_buf) = stat;\r
-               *p_oid_info->p_bytes_used = sizeof(uint64_t);\r
-       }\r
-       else if( p_oid_info->buf_len >= sizeof(uint32_t) )\r
-       {\r
-               *((uint32_t*)p_oid_info->p_buf) = (uint32_t)stat;\r
-               *p_oid_info->p_bytes_used = sizeof(uint32_t);\r
-       }\r
-       else\r
-       {\r
-               *p_oid_info->p_bytes_used = 0;\r
-               IPOIB_EXIT( IPOIB_DBG_STAT );\r
-               return NDIS_STATUS_INVALID_LENGTH;\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_STAT );\r
-       return NDIS_STATUS_SUCCESS;\r
-}\r
-\r
-\r
-void\r
-ipoib_inc_recv_stat(\r
-       IN                              ipoib_adapter_t* const          p_adapter,\r
-       IN              const   ip_stat_sel_t                           stat_sel,\r
-       IN              const   size_t                                          bytes OPTIONAL,\r
-       IN              const   size_t                                          packets OPTIONAL )\r
-{\r
-       IPOIB_ENTER( IPOIB_DBG_STAT );\r
-\r
-       cl_spinlock_acquire( &p_adapter->recv_stat_lock );\r
-       switch( stat_sel )\r
-       {\r
-       case IP_STAT_ERROR:\r
-               p_adapter->recv_stats.comp.error++;\r
-               break;\r
-\r
-       case IP_STAT_DROPPED:\r
-               p_adapter->recv_stats.comp.dropped++;\r
-               break;\r
-\r
-       case IP_STAT_UCAST_BYTES:\r
-       case IP_STAT_UCAST_FRAMES:\r
-               p_adapter->recv_stats.comp.success++;\r
-               p_adapter->recv_stats.ucast.frames += packets;\r
-               p_adapter->recv_stats.ucast.bytes += bytes;\r
-               break;\r
-\r
-       case IP_STAT_BCAST_BYTES:\r
-       case IP_STAT_BCAST_FRAMES:\r
-               p_adapter->recv_stats.comp.success++;\r
-               p_adapter->recv_stats.bcast.frames += packets;\r
-               p_adapter->recv_stats.bcast.bytes += bytes;\r
-               break;\r
-\r
-       case IP_STAT_MCAST_BYTES:\r
-       case IP_STAT_MCAST_FRAMES:\r
-               p_adapter->recv_stats.comp.success++;\r
-               p_adapter->recv_stats.mcast.frames += packets;\r
-               p_adapter->recv_stats.mcast.bytes += bytes;\r
-               break;\r
-\r
-       default:\r
-               break;\r
-       }\r
-       cl_spinlock_release( &p_adapter->recv_stat_lock );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_STAT );\r
-}\r
-\r
-NDIS_STATUS\r
-ipoib_get_send_stat(\r
-       IN                              ipoib_adapter_t* const          p_adapter,\r
-       IN              const   ip_stat_sel_t                           stat_sel,\r
-       IN                              pending_oid_t* const            p_oid_info )\r
-{\r
-       uint64_t        stat;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_STAT );\r
-\r
-       CL_ASSERT( p_adapter );\r
-\r
-       cl_spinlock_acquire( &p_adapter->send_stat_lock );\r
-       switch( stat_sel )\r
-       {\r
-       case IP_STAT_SUCCESS:\r
-               stat = p_adapter->send_stats.comp.success;\r
-               break;\r
-\r
-       case IP_STAT_ERROR:\r
-               stat = p_adapter->send_stats.comp.error;\r
-               break;\r
-\r
-       case IP_STAT_DROPPED:\r
-               stat = p_adapter->send_stats.comp.dropped;\r
-               break;\r
-\r
-       case IP_STAT_UCAST_BYTES:\r
-               stat = p_adapter->send_stats.ucast.bytes;\r
-               break;\r
-\r
-       case IP_STAT_UCAST_FRAMES:\r
-               stat = p_adapter->send_stats.ucast.frames;\r
-               break;\r
-\r
-       case IP_STAT_BCAST_BYTES:\r
-               stat = p_adapter->send_stats.bcast.bytes;\r
-               break;\r
-\r
-       case IP_STAT_BCAST_FRAMES:\r
-               stat = p_adapter->send_stats.bcast.frames;\r
-               break;\r
-\r
-       case IP_STAT_MCAST_BYTES:\r
-               stat = p_adapter->send_stats.mcast.bytes;\r
-               break;\r
-\r
-       case IP_STAT_MCAST_FRAMES:\r
-               stat = p_adapter->send_stats.mcast.frames;\r
-               break;\r
-\r
-       default:\r
-               stat = 0;\r
-       }\r
-       cl_spinlock_release( &p_adapter->send_stat_lock );\r
-\r
-       *p_oid_info->p_bytes_needed = sizeof(uint64_t);\r
-\r
-       if( p_oid_info->buf_len >= sizeof(uint64_t) )\r
-       {\r
-               *((uint64_t*)p_oid_info->p_buf) = stat;\r
-               *p_oid_info->p_bytes_used = sizeof(uint64_t);\r
-       }\r
-       else if( p_oid_info->buf_len >= sizeof(uint32_t) )\r
-       {\r
-               *((uint32_t*)p_oid_info->p_buf) = (uint32_t)stat;\r
-               *p_oid_info->p_bytes_used = sizeof(uint32_t);\r
-       }\r
-       else\r
-       {\r
-               *p_oid_info->p_bytes_used = 0;\r
-               IPOIB_EXIT( IPOIB_DBG_STAT );\r
-               return NDIS_STATUS_INVALID_LENGTH;\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_STAT );\r
-       return NDIS_STATUS_SUCCESS;\r
-}\r
-\r
-\r
-void\r
-ipoib_inc_send_stat(\r
-       IN                              ipoib_adapter_t* const          p_adapter,\r
-       IN              const   ip_stat_sel_t                           stat_sel,\r
-       IN              const   size_t                                          bytes OPTIONAL )\r
-{\r
-       IPOIB_ENTER( IPOIB_DBG_STAT );\r
-\r
-       cl_spinlock_acquire( &p_adapter->send_stat_lock );\r
-       switch( stat_sel )\r
-       {\r
-       case IP_STAT_ERROR:\r
-               p_adapter->send_stats.comp.error++;\r
-               break;\r
-\r
-       case IP_STAT_DROPPED:\r
-               p_adapter->send_stats.comp.dropped++;\r
-               break;\r
-\r
-       case IP_STAT_UCAST_BYTES:\r
-       case IP_STAT_UCAST_FRAMES:\r
-               p_adapter->send_stats.comp.success++;\r
-               p_adapter->send_stats.ucast.frames++;\r
-               p_adapter->send_stats.ucast.bytes += bytes;\r
-               break;\r
-\r
-       case IP_STAT_BCAST_BYTES:\r
-       case IP_STAT_BCAST_FRAMES:\r
-               p_adapter->send_stats.comp.success++;\r
-               p_adapter->send_stats.bcast.frames++;\r
-               p_adapter->send_stats.bcast.bytes += bytes;\r
-               break;\r
-\r
-       case IP_STAT_MCAST_BYTES:\r
-       case IP_STAT_MCAST_FRAMES:\r
-               p_adapter->send_stats.comp.success++;\r
-               p_adapter->send_stats.mcast.frames++;\r
-               p_adapter->send_stats.mcast.bytes += bytes;\r
-               break;\r
-\r
-       default:\r
-               break;\r
-       }\r
-       cl_spinlock_release( &p_adapter->send_stat_lock );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_STAT );\r
-}\r
diff --git a/branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.cpp b/branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.cpp
new file mode 100644 (file)
index 0000000..6733a38
--- /dev/null
@@ -0,0 +1,1639 @@
+/*\r
+ * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
+ * Copyright (c) 2006 Mellanox Technologies.  All rights reserved.\r
+ * Portions Copyright (c) 2008 Microsoft Corporation.  All rights reserved.\r
+ *\r
+ * This software is available to you under the OpenIB.org BSD license\r
+ * below:\r
+ *\r
+ *     Redistribution and use in source and binary forms, with or\r
+ *     without modification, are permitted provided that the following\r
+ *     conditions are met:\r
+ *\r
+ *      - Redistributions of source code must retain the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer.\r
+ *\r
+ *      - Redistributions in binary form must reproduce the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer in the documentation and/or other materials\r
+ *        provided with the distribution.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
+ * SOFTWARE.\r
+ *\r
+ * $Id: ipoib_adapter.c 4506 2009-06-23 14:40:54Z xalex $\r
+ */\r
+\r
+\r
+\r
+#include "ipoib_adapter.h"\r
+#include "ipoib_port.h"\r
+#include "ipoib_driver.h"\r
+#include "ipoib_debug.h"\r
+\r
+#if defined(EVENT_TRACING)\r
+#ifdef offsetof\r
+#undef offsetof\r
+#endif\r
+#include "ipoib_adapter.tmh"\r
+#endif\r
+\r
+\r
+#define ITEM_POOL_START                16\r
+#define ITEM_POOL_GROW         16\r
+\r
+\r
+/* IB Link speeds in 100bps */\r
+#define ONE_X_IN_100BPS                25000000\r
+#define FOUR_X_IN_100BPS       100000000\r
+#define TWELVE_X_IN_100BPS     300000000\r
+\r
+\r
+/* Declarations */\r
+static void\r
+adapter_construct(\r
+       IN                              ipoib_adapter_t* const          p_adapter );\r
+\r
+\r
+static ib_api_status_t\r
+adapter_init(\r
+       IN                              ipoib_adapter_t* const          p_adapter );\r
+\r
+\r
+static void\r
+__adapter_destroying(\r
+       IN                              cl_obj_t* const                         p_obj );\r
+\r
+\r
+static void\r
+__adapter_free(\r
+       IN                              cl_obj_t* const                         p_obj );\r
+\r
+\r
+static ib_api_status_t\r
+__ipoib_pnp_reg(\r
+       IN                              ipoib_adapter_t* const          p_adapter,\r
+       IN                              ib_pnp_class_t                          flags );\r
+\r
+\r
+static void\r
+__ipoib_pnp_dereg(\r
+       IN                              void*                                           context );\r
+\r
+\r
+static void\r
+__ipoib_adapter_reset(\r
+       IN                              void*   context);\r
+\r
+\r
+static ib_api_status_t\r
+__ipoib_pnp_cb(\r
+       IN                              ib_pnp_rec_t                            *p_pnp_rec );\r
+\r
+\r
+void\r
+ipoib_join_mcast(\r
+       IN                              ipoib_adapter_t* const          p_adapter );\r
+\r
+\r
+/* Leaves all mcast groups when port goes down. */\r
+static void\r
+ipoib_clear_mcast(\r
+       IN                              ipoib_port_t* const                     p_port );\r
+\r
+NDIS_STATUS\r
+ipoib_get_adapter_guids(\r
+       IN                              NDIS_HANDLE* const                      h_adapter,\r
+       IN      OUT                     ipoib_adapter_t                         *p_adapter );\r
+\r
+NDIS_STATUS\r
+ipoib_get_adapter_params(\r
+       IN      OUT                     ipoib_adapter_t                         *p_adapter,\r
+       OUT                             PUCHAR                                          *p_mac,\r
+       OUT                             UINT                                            *p_len);\r
+\r
+\r
+/* Implementation */\r
+ib_api_status_t\r
+ipoib_create_adapter(\r
+       IN                              void* const                                     h_adapter,\r
+               OUT                     ipoib_adapter_t** const         pp_adapter )\r
+{\r
+       ipoib_adapter_t         *p_adapter;\r
+       NDIS_STATUS                     status;\r
+       ib_api_status_t         ib_status;\r
+       cl_status_t                     cl_status;\r
+       PUCHAR                          mac;\r
+       UINT                            len;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       p_adapter = (ipoib_adapter_t *) cl_zalloc( sizeof(ipoib_adapter_t) );\r
+       if( !p_adapter )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Failed to allocate ipoib_adapter_t (%d bytes)",\r
+                       sizeof(ipoib_adapter_t)) );\r
+               return IB_INSUFFICIENT_MEMORY;\r
+       }\r
+\r
+       adapter_construct( p_adapter );\r
+\r
+       p_adapter->h_adapter = h_adapter;\r
+\r
+       p_adapter->p_ifc = (ib_al_ifc_t *) cl_zalloc( sizeof(ib_al_ifc_t) );\r
+       if( !p_adapter->p_ifc )\r
+       {\r
+               __adapter_free( &p_adapter->obj );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ipoib_create_adapter failed to alloc ipoib_ifc_t %d bytes\n",\r
+                       sizeof(ib_al_ifc_t)) );\r
+               return IB_INSUFFICIENT_MEMORY;\r
+       }\r
+\r
+       /* Get the CA and port GUID from the bus driver. */\r
+       status = ipoib_get_adapter_guids( (NDIS_HANDLE *const) h_adapter,  p_adapter );\r
+       if( status != NDIS_STATUS_SUCCESS )\r
+       {\r
+               ASSERT(FALSE);\r
+               __adapter_free( &p_adapter->obj );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ipoib_get_adapter_guids returned 0x%.8X.\n", status) );\r
+               return IB_ERROR;\r
+       }\r
+\r
+       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+                       ("Port %016I64x (CA %016I64x port %d) initializing\n",\r
+                       p_adapter->guids.port_guid.guid, p_adapter->guids.ca_guid,\r
+                       p_adapter->guids.port_num) );\r
+\r
+       cl_status = cl_obj_init( &p_adapter->obj, CL_DESTROY_SYNC,\r
+               __adapter_destroying, NULL, __adapter_free );\r
+       if( cl_status != CL_SUCCESS )\r
+       {\r
+               __adapter_free( &p_adapter->obj );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("cl_obj_init returned %#x\n", cl_status) );\r
+               return IB_ERROR;\r
+       }\r
+\r
+       /* Read configuration parameters. */\r
+       status = ipoib_get_adapter_params( p_adapter , &mac, &len );\r
+       if( status != NDIS_STATUS_SUCCESS )\r
+       {\r
+               cl_obj_destroy( &p_adapter->obj );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ipoib_get_adapter_params returned 0x%.8x.\n", status) );\r
+               return IB_ERROR;\r
+       }\r
+               \r
+       ib_status = adapter_init( p_adapter );\r
+       if( ib_status != IB_SUCCESS )\r
+       {\r
+               cl_obj_destroy( &p_adapter->obj );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("adapter_init returned %s.\n", \r
+                       p_adapter->p_ifc->get_err_str( ib_status )) );\r
+               return ib_status;\r
+       }\r
+\r
+       ETH_COPY_NETWORK_ADDRESS( p_adapter->params.conf_mac.addr, p_adapter->mac.addr );\r
+       /* If there is a NetworkAddress override in registry, use it */\r
+       if( (status == NDIS_STATUS_SUCCESS) && (len == HW_ADDR_LEN) )\r
+       {\r
+               if( ETH_IS_MULTICAST(mac) || ETH_IS_BROADCAST(mac) ||\r
+                       !ETH_IS_LOCALLY_ADMINISTERED(mac) )\r
+               {\r
+                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_INIT,\r
+                               ("Overriding NetworkAddress is invalid - "\r
+                               "%02x-%02x-%02x-%02x-%02x-%02x\n",\r
+                               mac[0], mac[1], mac[2],\r
+                               mac[3], mac[4], mac[5]) );\r
+               }\r
+               else\r
+       {\r
+                       ETH_COPY_NETWORK_ADDRESS( p_adapter->params.conf_mac.addr, mac );\r
+               }\r
+       }\r
+\r
+       *pp_adapter = p_adapter;\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+       return IB_SUCCESS;\r
+}\r
+\r
+\r
+ib_api_status_t\r
+ipoib_start_adapter(\r
+       IN                              ipoib_adapter_t* const          p_adapter )\r
+{\r
+       ib_api_status_t status;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       status = __ipoib_pnp_reg( p_adapter,\r
+               IB_PNP_FLAG_REG_SYNC | IB_PNP_FLAG_REG_COMPLETE );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+       return status;\r
+}\r
+\r
+\r
+void\r
+ipoib_destroy_adapter(\r
+       IN                              ipoib_adapter_t* const          p_adapter )\r
+{\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       CL_ASSERT( p_adapter );\r
+\r
+       /*\r
+        * Flag the adapter as being removed.  We use the IB_PNP_PORT_REMOVE state\r
+        * for this purpose.  Note that we protect this state change with both the\r
+        * mutex and the lock.  The mutex provides synchronization as a whole\r
+        * between destruction and AL callbacks (PnP, Query, Destruction).\r
+        * The lock provides protection\r
+        */\r
+       KeWaitForMutexObject(\r
+               &p_adapter->mutex, Executive, KernelMode, FALSE, NULL );\r
+       cl_obj_lock( &p_adapter->obj );\r
+       p_adapter->state = IB_PNP_PORT_REMOVE;\r
+\r
+       /*\r
+        * Clear the pointer to the port object since the object destruction\r
+        * will cascade to child objects.  This prevents potential duplicate\r
+        * destruction (or worse, stale pointer usage).\r
+        */\r
+       p_adapter->p_port = NULL;\r
+\r
+       cl_obj_unlock( &p_adapter->obj );\r
+\r
+       KeReleaseMutex( &p_adapter->mutex, FALSE );\r
+\r
+       cl_obj_destroy( &p_adapter->obj );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+}\r
+\r
+\r
+static void\r
+adapter_construct(\r
+       IN                              ipoib_adapter_t* const          p_adapter )\r
+{\r
+       cl_obj_construct( &p_adapter->obj, IPOIB_OBJ_INSTANCE );\r
+       cl_spinlock_construct( &p_adapter->send_stat_lock );\r
+       cl_spinlock_construct( &p_adapter->recv_stat_lock );\r
+       cl_qpool_construct( &p_adapter->item_pool );\r
+       KeInitializeMutex( &p_adapter->mutex, 0 );\r
+\r
+       cl_thread_construct(&p_adapter->destroy_thread);\r
+       \r
+       cl_vector_construct( &p_adapter->ip_vector );\r
+\r
+       cl_perf_construct( &p_adapter->perf );\r
+\r
+       p_adapter->state = IB_PNP_PORT_ADD;\r
+       p_adapter->port_rate = FOUR_X_IN_100BPS;\r
+}\r
+\r
+\r
+static ib_api_status_t\r
+adapter_init(\r
+       IN                              ipoib_adapter_t* const          p_adapter )\r
+{\r
+       cl_status_t                     cl_status;\r
+       ib_api_status_t         status;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       cl_status = cl_perf_init( &p_adapter->perf, MaxPerf );\r
+       if( cl_status != CL_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("cl_perf_init returned %#x\n", cl_status) );\r
+               return IB_ERROR;\r
+       }\r
+\r
+       cl_status = cl_spinlock_init( &p_adapter->send_stat_lock );\r
+       if( cl_status != CL_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("cl_spinlock_init returned %#x\n", cl_status) );\r
+               return IB_ERROR;\r
+       }\r
+\r
+       cl_status = cl_spinlock_init( &p_adapter->recv_stat_lock );\r
+       if( cl_status != CL_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("cl_spinlock_init returned %#x\n", cl_status) );\r
+               return IB_ERROR;\r
+       }\r
+\r
+       cl_status = cl_qpool_init( &p_adapter->item_pool, ITEM_POOL_START, 0,\r
+               ITEM_POOL_GROW, sizeof(cl_pool_obj_t), NULL, NULL, NULL );\r
+       if( cl_status != CL_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("cl_qpool_init returned %#x\n", cl_status) );\r
+               return IB_ERROR;\r
+       }\r
+\r
+\r
+       /* We manually manage the size and capacity of the vector. */\r
+       cl_status = cl_vector_init( &p_adapter->ip_vector, 0,\r
+               0, sizeof(net_address_item_t), NULL, NULL, p_adapter );\r
+       if( cl_status != CL_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("cl_vector_init for ip_vector returned %#x\n",\r
+                       cl_status) );\r
+               return IB_ERROR;\r
+       }\r
+\r
+       /* Validate the port GUID and generate the MAC address. */\r
+       status =\r
+               ipoib_mac_from_guid( p_adapter->guids.port_guid.guid, p_adapter->params.guid_mask, &p_adapter->mac);\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               if( status == IB_INVALID_GUID_MASK )\r
+               {\r
+                       IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_ERROR,\r
+                               ("Invalid GUID mask received, rejecting it") );\r
+                       ipoib_create_log(p_adapter->h_adapter, GUID_MASK_LOG_INDEX, EVENT_IPOIB_WRONG_PARAMETER_WRN);\r
+               }\r
+\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ipoib_mac_from_guid returned %s\n", \r
+                       p_adapter->p_ifc->get_err_str( status )) );\r
+               return status;\r
+       }\r
+\r
+       /* Open AL. */\r
+       status = p_adapter->p_ifc->open_al( &p_adapter->h_al );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ib_open_al returned %s\n", \r
+                       p_adapter->p_ifc->get_err_str( status )) );\r
+               return status;\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+       return status;\r
+}\r
+\r
+\r
+static ib_api_status_t\r
+__ipoib_pnp_reg(\r
+       IN                              ipoib_adapter_t* const          p_adapter,\r
+       IN                              ib_pnp_class_t                          flags )\r
+{\r
+       ib_api_status_t         status;\r
+       ib_pnp_req_t            pnp_req;\r
+       \r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       CL_ASSERT( !p_adapter->h_pnp );\r
+       CL_ASSERT( !p_adapter->registering );\r
+\r
+       p_adapter->registering = TRUE;\r
+       \r
+       /* Register for PNP events. */\r
+       cl_memclr( &pnp_req, sizeof(pnp_req) );\r
+       pnp_req.pnp_class = IB_PNP_PORT | flags;\r
+       /*\r
+        * Context is the cl_obj of the adapter to allow passing cl_obj_deref\r
+        * to ib_dereg_pnp.\r
+        */\r
+       pnp_req.pnp_context = &p_adapter->obj;\r
+       pnp_req.pfn_pnp_cb = __ipoib_pnp_cb;\r
+       status = p_adapter->p_ifc->reg_pnp( p_adapter->h_al, &pnp_req, &p_adapter->h_pnp );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               ASSERT(FALSE);\r
+               p_adapter->registering = FALSE;\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ib_reg_pnp returned %s\n", \r
+                       p_adapter->p_ifc->get_err_str( status )) );\r
+               return status;\r
+       }\r
+       /*\r
+        * Reference the adapter on behalf of the PNP registration.\r
+        * This allows the destruction to block until the PNP deregistration\r
+        * completes.\r
+        */\r
+       cl_obj_ref( &p_adapter->obj );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+       return status;\r
+}\r
+\r
+\r
+static void\r
+__adapter_destroying(\r
+       IN                              cl_obj_t* const                         p_obj )\r
+{\r
+       ipoib_adapter_t         *p_adapter;\r
+       KLOCK_QUEUE_HANDLE      hdl;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       p_adapter = PARENT_STRUCT( p_obj, ipoib_adapter_t, obj );\r
+\r
+       /*\r
+        * The adapter's object will be dereferenced when the deregistration\r
+        * completes.  No need to lock here since all PnP related API calls\r
+        * are driven by NDIS (via the Init/Reset/Destroy paths).\r
+        */\r
+       if( p_adapter->h_pnp )\r
+       {\r
+               p_adapter->p_ifc->dereg_pnp( p_adapter->h_pnp, (ib_pfn_destroy_cb_t) cl_obj_deref );\r
+               p_adapter->h_pnp = NULL;\r
+       }\r
+\r
+       if( p_adapter->packet_filter )\r
+       {\r
+               KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
+               cl_obj_lock( &p_adapter->obj );\r
+\r
+               ASSERT( cl_qlist_count( &g_ipoib.adapter_list ) );\r
+               cl_qlist_remove_item( &g_ipoib.adapter_list, &p_adapter->entry );\r
+\r
+               p_adapter->packet_filter = 0;\r
+\r
+               cl_obj_unlock( &p_adapter->obj );\r
+               KeReleaseInStackQueuedSpinLock( &hdl );\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+}\r
+\r
+\r
+static void\r
+__adapter_free(\r
+       IN                              cl_obj_t* const                         p_obj )\r
+{\r
+       ipoib_adapter_t *p_adapter;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       p_adapter = PARENT_STRUCT( p_obj, ipoib_adapter_t, obj );\r
+\r
+       if( p_adapter->p_ifc )\r
+       {\r
+               if( p_adapter->h_al )\r
+                       p_adapter->p_ifc->close_al( p_adapter->h_al );\r
+\r
+               cl_free( p_adapter->p_ifc );\r
+               p_adapter->p_ifc = NULL;\r
+       }\r
+\r
+       cl_vector_destroy( &p_adapter->ip_vector );\r
+       cl_qpool_destroy( &p_adapter->item_pool );\r
+       cl_spinlock_destroy( &p_adapter->recv_stat_lock );\r
+       cl_spinlock_destroy( &p_adapter->send_stat_lock );\r
+       cl_obj_deinit( p_obj );\r
+\r
+       cl_perf_destroy( &p_adapter->perf, TRUE );\r
+\r
+       cl_free( p_adapter );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+}\r
+\r
+\r
+static ib_api_status_t\r
+ipoib_query_pkey_index(ipoib_adapter_t *p_adapter)\r
+{\r
+       ib_api_status_t                 status;\r
+       ib_ca_attr_t                *ca_attr;\r
+       uint32_t                            ca_size;\r
+       uint16_t index = 0;\r
+\r
+       /* Query the CA for Pkey table */\r
+       status = p_adapter->p_ifc->query_ca(p_adapter->p_port->ib_mgr.h_ca, NULL, &ca_size);\r
+       if(status != IB_INSUFFICIENT_MEMORY)\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                               ("ib_query_ca failed\n"));\r
+               return status;\r
+       }\r
+\r
+       ca_attr = (ib_ca_attr_t*)cl_zalloc(ca_size);\r
+       if      (!ca_attr)\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                               ("cl_zalloc can't allocate %d\n",ca_size));\r
+               return IB_INSUFFICIENT_MEMORY;\r
+       }\r
+\r
+       status = p_adapter->p_ifc->query_ca(p_adapter->p_port->ib_mgr.h_ca, ca_attr,&ca_size);  \r
+       if( status != IB_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                               ("ib_query_ca returned %s\n", \r
+                                                p_adapter->p_ifc->get_err_str( status )) );\r
+               goto pkey_end;\r
+       }\r
+       CL_ASSERT(ca_attr->p_port_attr[p_adapter->p_port->port_num -1].p_pkey_table[0] == IB_DEFAULT_PKEY);\r
+       for(index = 0; index < ca_attr->p_port_attr[p_adapter->p_port->port_num -1].num_pkeys; index++)\r
+       {\r
+               if(cl_hton16(p_adapter->guids.port_guid.pkey) == ca_attr->p_port_attr[p_adapter->p_port->port_num -1].p_pkey_table[index])\r
+                       break;\r
+       }\r
+       if(index >= ca_attr->p_port_attr[p_adapter->p_port->port_num -1].num_pkeys)\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                               ("Pkey table is invalid, index not found\n"));\r
+               NdisWriteErrorLogEntry( p_adapter->h_adapter,\r
+                       EVENT_IPOIB_PARTITION_ERR, 1, p_adapter->guids.port_guid.pkey );\r
+               status = IB_NOT_FOUND;\r
+               p_adapter->p_port->pkey_index = PKEY_INVALID_INDEX;\r
+               goto pkey_end;\r
+       }\r
+\r
+       p_adapter->p_port->pkey_index = index;\r
+       IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_IB,\r
+                                       ("for PKEY = 0x%04X got index = %d\n",p_adapter->guids.port_guid.pkey,index));\r
+\r
+pkey_end:\r
+       if(ca_attr)\r
+               cl_free(ca_attr);\r
+       return status;\r
+}\r
+\r
+static ib_api_status_t\r
+__ipoib_pnp_cb(\r
+       IN                              ib_pnp_rec_t                            *p_pnp_rec )\r
+{\r
+       ipoib_adapter_t         *p_adapter;\r
+       ipoib_port_t            *p_port;\r
+       ib_pnp_event_t          old_state;\r
+       ib_pnp_port_rec_t       *p_port_rec;\r
+       ib_api_status_t         status = IB_SUCCESS;\r
+       NDIS_LINK_STATE         link_state;\r
+       NDIS_STATUS_INDICATION  status_indication;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_PNP );\r
+\r
+       CL_ASSERT( p_pnp_rec );\r
+       NdisZeroMemory(&link_state, sizeof(NDIS_LINK_STATE));\r
+       p_adapter =\r
+               PARENT_STRUCT( p_pnp_rec->pnp_context, ipoib_adapter_t, obj );\r
+\r
+       CL_ASSERT( p_adapter );\r
+\r
+       /* Synchronize with destruction */\r
+       KeWaitForMutexObject(\r
+               &p_adapter->mutex, Executive, KernelMode, FALSE, NULL );\r
+       cl_obj_lock( &p_adapter->obj );\r
+       old_state = p_adapter->state;\r
+       cl_obj_unlock( &p_adapter->obj );\r
+       if( old_state == IB_PNP_PORT_REMOVE )\r
+       {\r
+               KeReleaseMutex( &p_adapter->mutex, FALSE );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_PNP,\r
+                       ("Aborting - Adapter destroying.\n") );\r
+               return IB_NOT_DONE;\r
+       }\r
+\r
+       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_PNP,\r
+               ("p_pnp_rec->pnp_event = 0x%x (%s)\n",\r
+               p_pnp_rec->pnp_event, ib_get_pnp_event_str( p_pnp_rec->pnp_event )) );\r
+\r
+       p_port_rec = (ib_pnp_port_rec_t*)p_pnp_rec;\r
+\r
+       switch( p_pnp_rec->pnp_event )\r
+       {\r
+       case IB_PNP_PORT_ADD:\r
+               CL_ASSERT( !p_pnp_rec->context );\r
+               /* Only process our port GUID. */\r
+               if( p_pnp_rec->guid != p_adapter->guids.port_guid.guid )\r
+               {\r
+                       status = IB_NOT_DONE;\r
+                       break;\r
+               }\r
+\r
+               /* Don't process if we're destroying. */\r
+               if( p_adapter->obj.state == CL_DESTROYING )\r
+               {\r
+                       status = IB_NOT_DONE;\r
+                       break;\r
+               }\r
+\r
+               CL_ASSERT( !p_adapter->p_port );\r
+               /* Allocate all IB resources. */\r
+               cl_obj_lock( &p_adapter->obj );\r
+               p_adapter->state = IB_PNP_PORT_ADD;\r
+               cl_obj_unlock( &p_adapter->obj );\r
+               status = ipoib_create_port( p_adapter, p_port_rec, &p_port );\r
+               cl_obj_lock( &p_adapter->obj );\r
+               if( status != IB_SUCCESS )\r
+               {\r
+                       p_adapter->state = old_state;\r
+                       cl_obj_unlock( &p_adapter->obj );\r
+                       p_adapter->hung = TRUE;\r
+                       break;\r
+               }\r
+\r
+               p_pnp_rec->context = p_port;\r
+\r
+               p_adapter->p_port = p_port;\r
+               cl_obj_unlock( &p_adapter->obj );\r
+               break;\r
+\r
+       case IB_PNP_PORT_REMOVE:\r
+               /* Release all IB resources. */\r
+               CL_ASSERT( p_pnp_rec->context );\r
+\r
+               cl_obj_lock( &p_adapter->obj );\r
+               p_adapter->state = IB_PNP_PORT_REMOVE;\r
+               p_port = p_adapter->p_port;\r
+               p_adapter->p_port = NULL;\r
+               cl_obj_unlock( &p_adapter->obj );\r
+               ipoib_port_destroy( p_port );\r
+               p_pnp_rec->context = NULL;\r
+               status = IB_SUCCESS;\r
+               break;\r
+\r
+       case IB_PNP_PORT_ACTIVE:\r
+               /* Join multicast groups and put QP in RTS. */\r
+               CL_ASSERT( p_pnp_rec->context );\r
+\r
+               cl_obj_lock( &p_adapter->obj );\r
+               p_adapter->state = IB_PNP_PORT_INIT;\r
+               cl_obj_unlock( &p_adapter->obj );\r
+               ipoib_port_up( p_adapter->p_port, p_port_rec );\r
+\r
+               status = IB_SUCCESS;\r
+               break;\r
+\r
+       case IB_PNP_PORT_ARMED:\r
+               status = IB_SUCCESS;\r
+               break;\r
+\r
+       case IB_PNP_PORT_INIT:\r
+               /*\r
+                * Init could happen if the SM brings the port down\r
+                * without changing the physical link.\r
+                */\r
+       case IB_PNP_PORT_DOWN:\r
+               CL_ASSERT( p_pnp_rec->context );\r
+\r
+               cl_obj_lock( &p_adapter->obj );\r
+               old_state = p_adapter->state;\r
+               p_adapter->state = IB_PNP_PORT_DOWN;\r
+               cl_obj_unlock( &p_adapter->obj );\r
+               status = IB_SUCCESS;\r
+\r
+               if( !p_adapter->registering && old_state != IB_PNP_PORT_DOWN )\r
+               {\r
+                       link_state.Header.Revision = NDIS_LINK_STATE_REVISION_1;\r
+                       link_state.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;\r
+                       link_state.Header.Size = sizeof(NDIS_LINK_STATE);\r
+                       link_state.MediaConnectState = MediaConnectStateDisconnected;\r
+                       //link_state.MediaConnectState = MediaConnectStateConnected;\r
+                       link_state.MediaDuplexState = MediaDuplexStateFull;\r
+                       link_state.XmitLinkSpeed = link_state.RcvLinkSpeed = IPOIB_MEDIA_MAX_SPEED;\r
+\r
+                       IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,\r
+                                   p_adapter->h_adapter,\r
+                                   NDIS_STATUS_LINK_STATE,\r
+                                   (PVOID)&link_state,\r
+                                   sizeof(link_state));\r
+\r
+                       NdisMIndicateStatusEx(p_adapter->h_adapter,&status_indication);\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+                               ("Link DOWN!\n") );\r
+\r
+                       ipoib_port_down( p_adapter->p_port );\r
+               }\r
+               break;\r
+\r
+       case IB_PNP_REG_COMPLETE:\r
+               if( p_adapter->registering )\r
+               {\r
+                       p_adapter->registering = FALSE;\r
+                       cl_obj_lock( &p_adapter->obj );\r
+                       old_state = p_adapter->state;\r
+                       cl_obj_unlock( &p_adapter->obj );\r
+\r
+                       if( old_state == IB_PNP_PORT_DOWN )\r
+                       {\r
+                               /* If we were initializing, we might have pended some OIDs. */\r
+                               ipoib_resume_oids( p_adapter );\r
+\r
+                               link_state.Header.Revision = NDIS_LINK_STATE_REVISION_1;\r
+                               link_state.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;\r
+                               link_state.Header.Size = sizeof(NDIS_LINK_STATE);\r
+                               link_state.MediaConnectState = MediaConnectStateDisconnected;\r
+                               //link_state.MediaConnectState = MediaConnectStateConnected;\r
+                               link_state.MediaDuplexState = MediaDuplexStateFull;\r
+                               link_state.XmitLinkSpeed = link_state.RcvLinkSpeed = IPOIB_MEDIA_MAX_SPEED;\r
+\r
+                               IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,\r
+                                                                          p_adapter->h_adapter,\r
+                                                                          NDIS_STATUS_LINK_STATE,\r
+                                                                          (PVOID)&link_state,\r
+                                                                          sizeof(link_state));\r
+                               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_INIT,\r
+                       ("Indicate DISCONNECT\n") );\r
+                               NdisMIndicateStatusEx(p_adapter->h_adapter,&status_indication);                 \r
+                       }\r
+               }\r
+\r
+               if( p_adapter->reset && p_adapter->state != IB_PNP_PORT_INIT )\r
+               {\r
+                       p_adapter->reset = FALSE;\r
+                       NdisMResetComplete(\r
+                               p_adapter->h_adapter, NDIS_STATUS_SUCCESS, TRUE );\r
+               }\r
+               status = IB_SUCCESS;\r
+               break;\r
+\r
+       default:\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+                       ("IPOIB: Received unhandled PnP event 0x%x (%s)\n",\r
+                       p_pnp_rec->pnp_event, ib_get_pnp_event_str( p_pnp_rec->pnp_event )) );\r
+               /* Fall through. */\r
+\r
+               status = IB_SUCCESS;\r
+\r
+               /* We ignore events below if the link is not active. */\r
+               if( p_port_rec->p_port_attr->link_state != IB_LINK_ACTIVE )\r
+                       break;\r
+\r
+               case IB_PNP_PKEY_CHANGE:\r
+                       if(p_pnp_rec->pnp_event == IB_PNP_PKEY_CHANGE && \r
+                          p_adapter->guids.port_guid.pkey != IB_DEFAULT_PKEY)\r
+                       {\r
+                               status = ipoib_query_pkey_index(p_adapter);\r
+                               if(status != IB_SUCCESS)\r
+                               {\r
+                                  cl_obj_lock( &p_adapter->obj );\r
+                                  p_adapter->state = IB_PNP_PORT_INIT;\r
+                                  cl_obj_unlock( &p_adapter->obj );\r
+                               }\r
+                       }\r
+\r
+               case IB_PNP_SM_CHANGE:\r
+               case IB_PNP_GID_CHANGE:\r
+               case IB_PNP_LID_CHANGE:\r
+\r
+               cl_obj_lock( &p_adapter->obj );\r
+               old_state = p_adapter->state;\r
+               switch( old_state )\r
+               {\r
+               case IB_PNP_PORT_DOWN:\r
+                       p_adapter->state = IB_PNP_PORT_INIT;\r
+                       break;\r
+\r
+               default:\r
+                       p_adapter->state = IB_PNP_PORT_DOWN;\r
+               }\r
+               cl_obj_unlock( &p_adapter->obj );\r
+               \r
+               if( p_adapter->registering )\r
+                       break;\r
+\r
+               switch( old_state )\r
+               {\r
+               case IB_PNP_PORT_ACTIVE:\r
+               case IB_PNP_PORT_INIT:\r
+                       link_state.Header.Revision = NDIS_LINK_STATE_REVISION_1;\r
+                       link_state.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;\r
+                       link_state.Header.Size = sizeof(NDIS_LINK_STATE);\r
+                       link_state.MediaConnectState = MediaConnectStateDisconnected;\r
+                       //link_state.MediaConnectState = MediaConnectStateConnected;\r
+                       link_state.MediaDuplexState = MediaDuplexStateFull;\r
+                       link_state.XmitLinkSpeed = link_state.RcvLinkSpeed = IPOIB_MEDIA_MAX_SPEED;\r
+\r
+                       IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,\r
+                                                                  p_adapter->h_adapter,\r
+                                                                  NDIS_STATUS_LINK_STATE,\r
+                                                                  (PVOID)&link_state,\r
+                                                                  sizeof(link_state));\r
+\r
+                       NdisMIndicateStatusEx(p_adapter->h_adapter,&status_indication);         \r
+\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+                               ("Link DOWN!\n") );\r
+                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_INIT,\r
+                       ("Indicate DISCONNECT\n") );\r
+\r
+                       ipoib_port_down( p_adapter->p_port );\r
+                       /* Fall through. */\r
+\r
+               case IB_PNP_PORT_DOWN:\r
+                       cl_obj_lock( &p_adapter->obj );\r
+                       p_adapter->state = IB_PNP_PORT_INIT;\r
+                       cl_obj_unlock( &p_adapter->obj );\r
+                       ipoib_port_up( p_adapter->p_port, (ib_pnp_port_rec_t*)p_pnp_rec );\r
+               }\r
+               break;\r
+       }\r
+\r
+       KeReleaseMutex( &p_adapter->mutex, FALSE );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_PNP );\r
+       return status;\r
+}\r
+\r
+\r
+/* Joins/leaves mcast groups based on currently programmed mcast MACs. */\r
+void\r
+ipoib_refresh_mcast(\r
+       IN                              ipoib_adapter_t* const          p_adapter,\r
+       IN                              mac_addr_t* const                       p_mac_array,\r
+       IN              const   uint8_t                                         num_macs )\r
+{\r
+       uint8_t                         i, j;\r
+       ipoib_port_t            *p_port = NULL;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_MCAST );\r
+       cl_obj_lock( &p_adapter->obj );\r
+       if( p_adapter->state == IB_PNP_PORT_ACTIVE )\r
+       {\r
+               p_port = p_adapter->p_port;\r
+               ipoib_port_ref( p_port, ref_refresh_mcast );\r
+       }\r
+       cl_obj_unlock( &p_adapter->obj );\r
+\r
+       if( p_port )\r
+       {\r
+               /* Purge old entries. */\r
+               for( i = 0; i < p_adapter->mcast_array_size; i++ )\r
+               {\r
+                       for( j = 0; j < num_macs; j++ )\r
+                       {\r
+                               if( !cl_memcmp( &p_adapter->mcast_array[i], &p_mac_array[j],\r
+                                       sizeof(mac_addr_t) ) )\r
+                               {\r
+                                       break;\r
+                               }\r
+                       }\r
+                       if( j != num_macs )\r
+                               continue;\r
+\r
+                       ipoib_port_remove_endpt( p_port, p_adapter->mcast_array[i] );\r
+               }\r
+\r
+               /* Add new entries */\r
+               for( i = 0; i < num_macs; i++ )\r
+               {\r
+                       for( j = 0; j < p_adapter->mcast_array_size; j++ )\r
+                       {\r
+                               if( !cl_memcmp( &p_adapter->mcast_array[j], &p_mac_array[i],\r
+                                       sizeof(mac_addr_t) ) )\r
+                               {\r
+                                       break;\r
+                               }\r
+                       }\r
+\r
+                       if( j != p_adapter->mcast_array_size )\r
+                               continue;\r
+                       if ( ( p_mac_array[i].addr[0] == 1 && p_mac_array[i].addr[1] == 0 && p_mac_array[i].addr[2] == 0x5e &&\r
+                                  p_mac_array[i].addr[3] == 0 && p_mac_array[i].addr[4] == 0 && p_mac_array[i].addr[5] == 1 ) ||\r
+                                 !( p_mac_array[i].addr[0] == 1 && p_mac_array[i].addr[1] == 0 && p_mac_array[i].addr[2] == 0x5e )\r
+                               )\r
+                       {\r
+                               ipoib_port_join_mcast( p_port, p_mac_array[i], IB_MC_REC_STATE_FULL_MEMBER );\r
+                       }\r
+               }\r
+       }\r
+\r
+       /* Copy the MAC array. */\r
+       NdisMoveMemory( p_adapter->mcast_array, p_mac_array,\r
+               num_macs * sizeof(mac_addr_t) );\r
+       p_adapter->mcast_array_size = num_macs;\r
+\r
+       if( p_port )\r
+               ipoib_port_deref( p_port, ref_refresh_mcast );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_MCAST );\r
+}\r
+\r
+\r
+ib_api_status_t\r
+ipoib_reset_adapter(\r
+       IN                              ipoib_adapter_t* const          p_adapter )\r
+{\r
+       ib_api_status_t         status;\r
+       ib_pnp_handle_t         h_pnp;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       if( p_adapter->reset )\r
+               return IB_INVALID_STATE;\r
+\r
+       p_adapter->hung = FALSE;\r
+       p_adapter->reset = TRUE;\r
+\r
+       if( p_adapter->h_pnp )\r
+       {\r
+               h_pnp = p_adapter->h_pnp;\r
+               p_adapter->h_pnp  = NULL;\r
+               status = p_adapter->p_ifc->dereg_pnp( h_pnp, __ipoib_pnp_dereg );\r
+               if( status == IB_SUCCESS )\r
+                       status = IB_NOT_DONE;\r
+       }\r
+       else\r
+       {\r
+               status = __ipoib_pnp_reg( p_adapter, IB_PNP_FLAG_REG_COMPLETE );\r
+               if( status == IB_SUCCESS )\r
+                       p_adapter->hung = FALSE;\r
+       }\r
+       if (status == IB_NOT_DONE) {\r
+               p_adapter->reset = TRUE;\r
+       }\r
+       else {\r
+               p_adapter->reset = FALSE;\r
+       }\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+       return status;\r
+}\r
+\r
+\r
+static void\r
+__ipoib_pnp_dereg(\r
+       IN                              void*                                           context )\r
+{\r
+       ipoib_adapter_t*        p_adapter;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       p_adapter = PARENT_STRUCT( context, ipoib_adapter_t, obj );\r
+\r
+       cl_thread_init(&p_adapter->destroy_thread, __ipoib_adapter_reset, (void*)p_adapter, "destroy_thread");\r
+       \r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+}\r
+\r
+static void\r
+__ipoib_adapter_reset(\r
+       IN                              void*   context)\r
+{\r
+\r
+       ipoib_adapter_t *p_adapter;\r
+       ipoib_port_t            *p_port;\r
+       ib_api_status_t         status;\r
+       ib_pnp_event_t          state;\r
+       \r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Got RESET\n") );\r
+//     return;\r
+       p_adapter = (ipoib_adapter_t*)context;\r
+       \r
+       /* Synchronize with destruction */\r
+       KeWaitForMutexObject(\r
+               &p_adapter->mutex, Executive, KernelMode, FALSE, NULL );\r
+\r
+       cl_obj_lock( &p_adapter->obj );\r
+\r
+       CL_ASSERT( !p_adapter->h_pnp );\r
+\r
+       if( p_adapter->state != IB_PNP_PORT_REMOVE )\r
+               p_adapter->state = IB_PNP_PORT_ADD;\r
+\r
+       state = p_adapter->state;\r
+\r
+       /* Destroy the current port instance if it still exists. */\r
+       p_port = p_adapter->p_port;\r
+       p_adapter->p_port = NULL;\r
+       cl_obj_unlock( &p_adapter->obj );\r
+\r
+       if( p_port )\r
+               ipoib_port_destroy( p_port );\r
+       ASSERT(p_adapter->reset == TRUE);\r
+       if( state != IB_PNP_PORT_REMOVE )\r
+       {\r
+               status = __ipoib_pnp_reg( p_adapter, IB_PNP_FLAG_REG_COMPLETE );\r
+               if( status != IB_SUCCESS )\r
+               {\r
+                       p_adapter->reset = FALSE;\r
+                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("__ipoib_pnp_reg returned %s\n",\r
+                               p_adapter->p_ifc->get_err_str( status )) );\r
+                       NdisMResetComplete( \r
+                               p_adapter->h_adapter, NDIS_STATUS_HARD_ERRORS, TRUE );\r
+               }\r
+       }\r
+       else\r
+       {\r
+               p_adapter->reset = FALSE;\r
+               NdisMResetComplete(\r
+                       p_adapter->h_adapter, NDIS_STATUS_SUCCESS, TRUE );\r
+               status = IB_SUCCESS;\r
+       }\r
+\r
+       /* Dereference the adapter since the previous registration is now gone. */\r
+       cl_obj_deref( &p_adapter->obj );\r
+\r
+       KeReleaseMutex( &p_adapter->mutex, FALSE );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+}\r
+\r
+\r
+void\r
+ipoib_set_rate(\r
+       IN                              ipoib_adapter_t* const          p_adapter,\r
+       IN              const   uint8_t                                         link_width, \r
+       IN              const   uint8_t                                         link_speed )\r
+{\r
+       uint32_t        rate;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       /* Set the link speed based on the IB link speed (1x vs 4x, etc). */\r
+       switch( link_speed )\r
+       {\r
+       case IB_LINK_SPEED_ACTIVE_2_5:\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+                       ("Link speed is 2.5Gs\n") );\r
+               rate = IB_LINK_SPEED_ACTIVE_2_5;\r
+               break;\r
+\r
+       case IB_LINK_SPEED_ACTIVE_5:\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+                       ("Link speed is 5G\n") );\r
+               rate = IB_LINK_SPEED_ACTIVE_5;\r
+               break;\r
+\r
+       case IB_LINK_SPEED_ACTIVE_10:\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+                       ("Link speed is 10G\n") );\r
+               rate = IB_LINK_SPEED_ACTIVE_10;\r
+               break;\r
+\r
+       default:\r
+               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Invalid link speed %d.\n", link_speed) );\r
+               rate = 0;\r
+       }\r
+\r
+       switch( link_width )\r
+       {\r
+       case IB_LINK_WIDTH_ACTIVE_1X:\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+                       ("Link width is 1X\n") );\r
+               rate *= ONE_X_IN_100BPS;\r
+               break;\r
+\r
+       case IB_LINK_WIDTH_ACTIVE_4X:\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+                       ("Link width is 4X\n") );\r
+               rate *= FOUR_X_IN_100BPS;\r
+               break;\r
+\r
+       case IB_LINK_WIDTH_ACTIVE_12X:\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+                       ("Link width is 12X\n") );\r
+               rate *= TWELVE_X_IN_100BPS;\r
+               break;\r
+\r
+       default:\r
+               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Invalid link rate (%d).\n", link_width) );\r
+               rate = 0;\r
+       }\r
+\r
+       p_adapter->port_rate = rate;\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+}\r
+\r
+\r
+ib_api_status_t\r
+ipoib_set_active(\r
+       IN                              ipoib_adapter_t* const          p_adapter )\r
+{\r
+       ib_pnp_event_t  old_state;\r
+       uint8_t                 i;\r
+       ib_api_status_t status = IB_SUCCESS;\r
+       NDIS_LINK_STATE         link_state;\r
+       NDIS_STATUS_INDICATION  status_indication;\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       NdisZeroMemory(&link_state, sizeof(NDIS_LINK_STATE));\r
+       cl_obj_lock( &p_adapter->obj );\r
+       old_state = p_adapter->state;\r
+\r
+       /* Change the state to indicate that we are now connected and live. */\r
+       if( old_state == IB_PNP_PORT_INIT )\r
+               p_adapter->state = IB_PNP_PORT_ACTIVE;\r
+\r
+       cl_obj_unlock( &p_adapter->obj );\r
+\r
+       /*\r
+        * If we had a pending OID request for OID_GEN_LINK_SPEED,\r
+        * complete it now.\r
+        */\r
+       switch( old_state )\r
+       {\r
+       case IB_PNP_PORT_ADD:\r
+               ipoib_reg_addrs( p_adapter );\r
+               /* Fall through. */\r
+\r
+       case IB_PNP_PORT_REMOVE:\r
+               ipoib_resume_oids( p_adapter );\r
+               break;\r
+\r
+       default:\r
+               if (p_adapter->guids.port_guid.pkey != IB_DEFAULT_PKEY)\r
+               {\r
+                       status = ipoib_query_pkey_index(p_adapter);\r
+                       if( IB_SUCCESS != status)\r
+                       {\r
+                               break;\r
+                       }\r
+               }\r
+               /* Join all programmed multicast groups. */\r
+               for( i = 0; i < p_adapter->mcast_array_size; i++ )\r
+               {\r
+                       ipoib_port_join_mcast(\r
+                               p_adapter->p_port, p_adapter->mcast_array[i] ,IB_MC_REC_STATE_FULL_MEMBER);\r
+               }\r
+\r
+               /* Register all existing addresses. */\r
+               ipoib_reg_addrs( p_adapter );\r
+\r
+               ipoib_resume_oids( p_adapter );\r
+\r
+               /*\r
+                * Now that we're in the broadcast group, notify that\r
+                * we have a link.\r
+                */\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, ("Link UP!\n") );\r
+               NdisWriteErrorLogEntry( p_adapter->h_adapter,\r
+                       EVENT_IPOIB_PORT_UP + (p_adapter->port_rate/ONE_X_IN_100BPS),\r
+                       1, p_adapter->port_rate );\r
+\r
+               if( !p_adapter->reset )\r
+               {\r
+                       link_state.Header.Revision = NDIS_LINK_STATE_REVISION_1;\r
+                       link_state.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;\r
+                       link_state.Header.Size = sizeof(NDIS_LINK_STATE);\r
+                       link_state.MediaConnectState = MediaConnectStateConnected;\r
+                       link_state.MediaDuplexState = MediaDuplexStateFull;\r
+                       link_state.XmitLinkSpeed = \r
+                       link_state.RcvLinkSpeed = IPOIB_MEDIA_MAX_SPEED;\r
+                       link_state.PauseFunctions = NdisPauseFunctionsSendAndReceive;\r
+                       IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,\r
+                                                                  p_adapter->h_adapter,\r
+                                                                  NDIS_STATUS_LINK_STATE,\r
+                                                                  (PVOID)&link_state,\r
+                                                                  sizeof(link_state));\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, ("***************Indicate connect!\n") );\r
+                       NdisMIndicateStatusEx(p_adapter->h_adapter,&status_indication);\r
+               }\r
+       }\r
+\r
+       if( p_adapter->reset )\r
+       {\r
+               ASSERT(FALSE);\r
+               p_adapter->reset = FALSE;\r
+               NdisMResetComplete(\r
+                       p_adapter->h_adapter, NDIS_STATUS_SUCCESS, TRUE );\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+       return  status;\r
+}\r
+\r
+/*\r
+ * If something goes wrong after the port goes active, e.g.\r
+ *     - PortInfo query failure\r
+ *     - MC Join timeout\r
+ *     - etc\r
+ * Mark the port state as down, resume any pended OIDS, etc.\r
+ */\r
+void\r
+ipoib_set_inactive(\r
+       IN                              ipoib_adapter_t* const          p_adapter )\r
+{\r
+       ib_pnp_event_t  old_state;\r
+       NDIS_LINK_STATE         link_state;\r
+       NDIS_STATUS_INDICATION  status_indication;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       NdisZeroMemory(&link_state, sizeof(NDIS_LINK_STATE));\r
+       cl_obj_lock( &p_adapter->obj );\r
+       old_state = p_adapter->state;\r
+       if( old_state != IB_PNP_PORT_REMOVE )\r
+               p_adapter->state = IB_PNP_PORT_DOWN;\r
+       cl_obj_unlock( &p_adapter->obj );\r
+\r
+       /*\r
+        * If we had a pending OID request for OID_GEN_LINK_SPEED,\r
+        * complete it now.\r
+        */\r
+       if( old_state == IB_PNP_PORT_INIT )\r
+       {\r
+               link_state.Header.Revision = NDIS_LINK_STATE_REVISION_1;\r
+               link_state.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;\r
+               link_state.Header.Size = sizeof(NDIS_LINK_STATE);\r
+               link_state.MediaConnectState = MediaConnectStateDisconnected;\r
+               //link_state.MediaConnectState = MediaConnectStateConnected;\r
+               \r
+               link_state.MediaDuplexState = MediaDuplexStateFull;\r
+               link_state.XmitLinkSpeed = link_state.RcvLinkSpeed = IPOIB_MEDIA_MAX_SPEED;\r
+\r
+               IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,\r
+                                                          p_adapter->h_adapter,\r
+                                                          NDIS_STATUS_LINK_STATE,\r
+                                                          (PVOID)&link_state,\r
+                                                          sizeof(link_state));\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, ("Indicate Disconnect!\n") );\r
+               NdisMIndicateStatusEx(p_adapter->h_adapter,&status_indication);\r
+\r
+               ipoib_resume_oids( p_adapter );\r
+       }\r
+\r
+       if( p_adapter->reset )\r
+       {\r
+               p_adapter->reset = FALSE;\r
+               NdisMResetComplete(\r
+                       p_adapter->h_adapter, NDIS_STATUS_SUCCESS, TRUE );\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+}\r
+\r
+NDIS_STATUS\r
+ipoib_get_gen_stat(\r
+       IN                              ipoib_adapter_t* const          p_adapter,\r
+       OUT             pending_oid_t* const            p_oid_info)\r
+{\r
+       PNDIS_STATISTICS_INFO StatisticsInfo;\r
+       IPOIB_ENTER( IPOIB_DBG_STAT );\r
+\r
+       if (p_oid_info->buf_len < sizeof(StatisticsInfo))\r
+       {\r
+               *p_oid_info->p_bytes_needed = sizeof(NDIS_STATISTICS_INFO);\r
+               return NDIS_STATUS_INVALID_LENGTH;\r
+       }\r
+\r
+       StatisticsInfo = (PNDIS_STATISTICS_INFO)p_oid_info->p_buf;\r
+    StatisticsInfo->Header.Revision = NDIS_OBJECT_REVISION_1;\r
+    StatisticsInfo->Header.Type = NDIS_OBJECT_TYPE_DEFAULT;\r
+    StatisticsInfo->Header.Size = sizeof(NDIS_STATISTICS_INFO);\r
+    /*StatisticsInfo->SupportedStatistics = NDIS_STATISTICS_FLAGS_VALID_RCV_DISCARDS          |\r
+                                          NDIS_STATISTICS_FLAGS_VALID_RCV_ERROR             |\r
+                                                                                 NDIS_STATISTICS_FLAGS_VALID_DIRECTED_FRAMES_RCV   |\r
+                                          NDIS_STATISTICS_FLAGS_VALID_MULTICAST_FRAMES_RCV  |\r
+                                                                                 NDIS_STATISTICS_FLAGS_VALID_BROADCAST_FRAMES_RCV  |\r
+                                          NDIS_STATISTICS_FLAGS_VALID_BYTES_RCV             | \r
+                                          NDIS_STATISTICS_FLAGS_VALID_MULTICAST_BYTES_RCV   |\r
+                                                                                 NDIS_STATISTICS_FLAGS_VALID_BROADCAST_BYTES_RCV       |\r
+                                                                                 NDIS_STATISTICS_FLAGS_VALID_DIRECTED_BYTES_RCV        |\r
+\r
+                                                                                 NDIS_STATISTICS_FLAGS_VALID_XMIT_DISCARDS                     |\r
+                                                                                 NDIS_STATISTICS_FLAGS_VALID_XMIT_ERROR            |\r
+                                                                                 NDIS_STATISTICS_FLAGS_VALID_DIRECTED_FRAMES_XMIT  | \r
+                                          NDIS_STATISTICS_FLAGS_VALID_MULTICAST_FRAMES_XMIT |\r
+                                                                                 NDIS_STATISTICS_FLAGS_VALID_BROADCAST_FRAMES_XMIT |\r
+                                                                                 NDIS_STATISTICS_FLAGS_VALID_BYTES_XMIT                        |\r
+                                                                                 NDIS_STATISTICS_FLAGS_VALID_DIRECTED_BYTES_XMIT       |\r
+                                                                                 NDIS_STATISTICS_FLAGS_VALID_MULTICAST_BYTES_XMIT      |\r
+                                                                                 NDIS_STATISTICS_FLAGS_VALID_BROADCAST_BYTES_XMIT; */\r
+                                                                                 \r
+                                                                                 \r
+       StatisticsInfo->SupportedStatistics =  NDIS_STATISTICS_FLAGS_VALID_DIRECTED_FRAMES_RCV |\r
+                                                                                       //The data in the ifHCInUcastPkts member is valid. \r
+                                                                                       NDIS_STATISTICS_FLAGS_VALID_MULTICAST_FRAMES_RCV |\r
+                                                                                       //The data in the ifHCInMulticastPkts member is valid. \r
+                                                                                       NDIS_STATISTICS_FLAGS_VALID_BROADCAST_FRAMES_RCV |\r
+                                                                                       //The data in the ifHCInBroadcastPkts member is valid. \r
+                                                                                       NDIS_STATISTICS_FLAGS_VALID_BYTES_RCV |\r
+                                                                                       //The data in the ifHCInOctets member is valid. \r
+                                                                                       NDIS_STATISTICS_FLAGS_VALID_RCV_DISCARDS |\r
+                                                                                       //The data in the ifInDiscards member is valid. \r
+                                                                                       NDIS_STATISTICS_FLAGS_VALID_RCV_ERROR |\r
+                                                                                       //The data in the ifInErrors member is valid. \r
+                                                                                       NDIS_STATISTICS_FLAGS_VALID_DIRECTED_FRAMES_XMIT |\r
+                                                                                       //The data in the ifHCOutUcastPkts member is valid. \r
+                                                                                       NDIS_STATISTICS_FLAGS_VALID_MULTICAST_FRAMES_XMIT |\r
+                                                                                       //The data in the ifHCOutMulticastPkts member is valid. \r
+                                                                                       NDIS_STATISTICS_FLAGS_VALID_BROADCAST_FRAMES_XMIT |\r
+                                                                                       //The data in the ifHCOutBroadcastPkts member is valid. \r
+                                                                                       NDIS_STATISTICS_FLAGS_VALID_BYTES_XMIT |\r
+                                                                                       //The data in the ifHCOutOctets member is valid. \r
+                                                                                       NDIS_STATISTICS_FLAGS_VALID_XMIT_ERROR |\r
+                                                                                       //The data in the ifOutErrors member is valid. \r
+                                                                                       NDIS_STATISTICS_FLAGS_VALID_XMIT_DISCARDS |\r
+                                                                                       //The data in the ifOutDiscards member is valid. \r
+                                                                                       NDIS_STATISTICS_FLAGS_VALID_DIRECTED_BYTES_RCV |\r
+                                                                                       //The data in the ifHCInUcastOctets member is valid. \r
+                                                                                       NDIS_STATISTICS_FLAGS_VALID_MULTICAST_BYTES_RCV |\r
+                                                                                       //The data in the ifHCInMulticastOctets member is valid. \r
+                                                                                       NDIS_STATISTICS_FLAGS_VALID_BROADCAST_BYTES_RCV |\r
+                                                                                       //The data in the ifHCInBroadcastOctets member is valid. \r
+                                                                                       NDIS_STATISTICS_FLAGS_VALID_DIRECTED_BYTES_XMIT |\r
+                                                                                       //The data in the ifHCOutUcastOctets member is valid. \r
+                                                                                       NDIS_STATISTICS_FLAGS_VALID_MULTICAST_BYTES_XMIT |\r
+                                                                                       //The data in the ifHCOutMulticastOctets member is valid. \r
+                                                                                       NDIS_STATISTICS_FLAGS_VALID_BROADCAST_BYTES_XMIT ;\r
+                                                                                       //The data in the ifHCOutBroadcastOctets member is valid\r
+\r
+    cl_spinlock_acquire( &p_adapter->recv_stat_lock );\r
+    StatisticsInfo->ifInDiscards = p_adapter->recv_stats.comp.dropped +\r
+                                   p_adapter->recv_stats.comp.error;            \r
+    StatisticsInfo->ifInErrors = p_adapter->recv_stats.comp.error;\r
+    StatisticsInfo->ifHCInOctets = p_adapter->recv_stats.ucast.bytes + \r
+                                                                  p_adapter->recv_stats.bcast.bytes + \r
+                                                                  p_adapter->recv_stats.mcast.bytes;       \r
+    StatisticsInfo->ifHCInUcastPkts       = p_adapter->recv_stats.ucast.frames;\r
+    StatisticsInfo->ifHCInMulticastPkts   = p_adapter->recv_stats.mcast.frames;  \r
+    StatisticsInfo->ifHCInBroadcastPkts   = p_adapter->recv_stats.bcast.frames;  \r
+       StatisticsInfo->ifHCInMulticastOctets = p_adapter->recv_stats.mcast.bytes;\r
+       StatisticsInfo->ifHCInBroadcastOctets = p_adapter->recv_stats.bcast.bytes;\r
+       StatisticsInfo->ifHCInUcastOctets     = p_adapter->recv_stats.ucast.bytes;\r
+       cl_spinlock_release( &p_adapter->recv_stat_lock );\r
+\r
+    cl_spinlock_acquire( &p_adapter->send_stat_lock ); \r
+    StatisticsInfo->ifHCOutOctets = p_adapter->send_stats.ucast.bytes + \r
+                                                                       p_adapter->send_stats.mcast.bytes + \r
+                                                                       p_adapter->send_stats.bcast.bytes;        \r
+    StatisticsInfo->ifHCOutUcastPkts       = p_adapter->send_stats.ucast.frames;     \r
+    StatisticsInfo->ifHCOutMulticastPkts   = p_adapter->send_stats.mcast.frames; \r
+    StatisticsInfo->ifHCOutBroadcastPkts   = p_adapter->send_stats.bcast.frames; \r
+    StatisticsInfo->ifOutErrors            = p_adapter->send_stats.comp.error;                                      \r
+    StatisticsInfo->ifOutDiscards          = p_adapter->send_stats.comp.dropped;\r
+       StatisticsInfo->ifHCOutUcastOctets     = p_adapter->send_stats.ucast.bytes;\r
+       StatisticsInfo->ifHCOutMulticastOctets = p_adapter->send_stats.mcast.bytes;\r
+       StatisticsInfo->ifHCOutBroadcastOctets = p_adapter->send_stats.bcast.bytes;\r
+    cl_spinlock_release( &p_adapter->send_stat_lock );\r
+\r
+       *p_oid_info->p_bytes_used = sizeof(NDIS_STATISTICS_INFO);\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+       return NDIS_STATUS_SUCCESS;\r
+}\r
+\r
+NDIS_STATUS\r
+ipoib_get_recv_stat(\r
+       IN                              ipoib_adapter_t* const          p_adapter,\r
+       IN              const   ip_stat_sel_t                           stat_sel,\r
+       IN                              pending_oid_t* const            p_oid_info )\r
+{\r
+       uint64_t        stat;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_STAT );\r
+\r
+       CL_ASSERT( p_adapter );\r
+\r
+       cl_spinlock_acquire( &p_adapter->recv_stat_lock );\r
+       switch( stat_sel )\r
+       {\r
+       case IP_STAT_SUCCESS:\r
+               stat = p_adapter->recv_stats.comp.success;\r
+               break;\r
+\r
+       case IP_STAT_ERROR:\r
+               stat = p_adapter->recv_stats.comp.error;\r
+               break;\r
+\r
+       case IP_STAT_DROPPED:\r
+               stat = p_adapter->recv_stats.comp.dropped;\r
+               break;\r
+\r
+       case IP_STAT_UCAST_BYTES:\r
+               stat = p_adapter->recv_stats.ucast.bytes;\r
+               break;\r
+\r
+       case IP_STAT_UCAST_FRAMES:\r
+               stat = p_adapter->recv_stats.ucast.frames;\r
+               break;\r
+\r
+       case IP_STAT_BCAST_BYTES:\r
+               stat = p_adapter->recv_stats.bcast.bytes;\r
+               break;\r
+\r
+       case IP_STAT_BCAST_FRAMES:\r
+               stat = p_adapter->recv_stats.bcast.frames;\r
+               break;\r
+\r
+       case IP_STAT_MCAST_BYTES:\r
+               stat = p_adapter->recv_stats.mcast.bytes;\r
+               break;\r
+\r
+       case IP_STAT_MCAST_FRAMES:\r
+               stat = p_adapter->recv_stats.mcast.frames;\r
+               break;\r
+\r
+       default:\r
+               stat = 0;\r
+       }\r
+       cl_spinlock_release( &p_adapter->recv_stat_lock );\r
+\r
+       *p_oid_info->p_bytes_needed = sizeof(uint64_t);\r
+\r
+       if( p_oid_info->buf_len >= sizeof(uint64_t) )\r
+       {\r
+               *((uint64_t*)p_oid_info->p_buf) = stat;\r
+               *p_oid_info->p_bytes_used = sizeof(uint64_t);\r
+       }\r
+       else if( p_oid_info->buf_len >= sizeof(uint32_t) )\r
+       {\r
+               *((uint32_t*)p_oid_info->p_buf) = (uint32_t)stat;\r
+               *p_oid_info->p_bytes_used = sizeof(uint32_t);\r
+       }\r
+       else\r
+       {\r
+               *p_oid_info->p_bytes_used = 0;\r
+               IPOIB_EXIT( IPOIB_DBG_STAT );\r
+               return NDIS_STATUS_INVALID_LENGTH;\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_STAT );\r
+       return NDIS_STATUS_SUCCESS;\r
+}\r
+\r
+\r
+void\r
+ipoib_inc_recv_stat(\r
+       IN                              ipoib_adapter_t* const          p_adapter,\r
+       IN              const   ip_stat_sel_t                           stat_sel,\r
+       IN              const   size_t                                          bytes OPTIONAL,\r
+       IN              const   size_t                                          packets OPTIONAL )\r
+{\r
+       IPOIB_ENTER( IPOIB_DBG_STAT );\r
+\r
+       cl_spinlock_acquire( &p_adapter->recv_stat_lock );\r
+       switch( stat_sel )\r
+       {\r
+       case IP_STAT_ERROR:\r
+               p_adapter->recv_stats.comp.error++;\r
+               break;\r
+\r
+       case IP_STAT_DROPPED:\r
+               p_adapter->recv_stats.comp.dropped++;\r
+               break;\r
+\r
+       case IP_STAT_UCAST_BYTES:\r
+       case IP_STAT_UCAST_FRAMES:\r
+               p_adapter->recv_stats.comp.success++;\r
+               p_adapter->recv_stats.ucast.frames += packets;\r
+               p_adapter->recv_stats.ucast.bytes += bytes;\r
+               break;\r
+\r
+       case IP_STAT_BCAST_BYTES:\r
+       case IP_STAT_BCAST_FRAMES:\r
+               p_adapter->recv_stats.comp.success++;\r
+               p_adapter->recv_stats.bcast.frames += packets;\r
+               p_adapter->recv_stats.bcast.bytes += bytes;\r
+               break;\r
+\r
+       case IP_STAT_MCAST_BYTES:\r
+       case IP_STAT_MCAST_FRAMES:\r
+               p_adapter->recv_stats.comp.success++;\r
+               p_adapter->recv_stats.mcast.frames += packets;\r
+               p_adapter->recv_stats.mcast.bytes += bytes;\r
+               break;\r
+\r
+       default:\r
+               break;\r
+       }\r
+       cl_spinlock_release( &p_adapter->recv_stat_lock );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_STAT );\r
+}\r
+\r
+NDIS_STATUS\r
+ipoib_get_send_stat(\r
+       IN                              ipoib_adapter_t* const          p_adapter,\r
+       IN              const   ip_stat_sel_t                           stat_sel,\r
+       IN                              pending_oid_t* const            p_oid_info )\r
+{\r
+       uint64_t        stat;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_STAT );\r
+\r
+       CL_ASSERT( p_adapter );\r
+\r
+       cl_spinlock_acquire( &p_adapter->send_stat_lock );\r
+       switch( stat_sel )\r
+       {\r
+       case IP_STAT_SUCCESS:\r
+               stat = p_adapter->send_stats.comp.success;\r
+               break;\r
+\r
+       case IP_STAT_ERROR:\r
+               stat = p_adapter->send_stats.comp.error;\r
+               break;\r
+\r
+       case IP_STAT_DROPPED:\r
+               stat = p_adapter->send_stats.comp.dropped;\r
+               break;\r
+\r
+       case IP_STAT_UCAST_BYTES:\r
+               stat = p_adapter->send_stats.ucast.bytes;\r
+               break;\r
+\r
+       case IP_STAT_UCAST_FRAMES:\r
+               stat = p_adapter->send_stats.ucast.frames;\r
+               break;\r
+\r
+       case IP_STAT_BCAST_BYTES:\r
+               stat = p_adapter->send_stats.bcast.bytes;\r
+               break;\r
+\r
+       case IP_STAT_BCAST_FRAMES:\r
+               stat = p_adapter->send_stats.bcast.frames;\r
+               break;\r
+\r
+       case IP_STAT_MCAST_BYTES:\r
+               stat = p_adapter->send_stats.mcast.bytes;\r
+               break;\r
+\r
+       case IP_STAT_MCAST_FRAMES:\r
+               stat = p_adapter->send_stats.mcast.frames;\r
+               break;\r
+\r
+       default:\r
+               stat = 0;\r
+       }\r
+       cl_spinlock_release( &p_adapter->send_stat_lock );\r
+\r
+       *p_oid_info->p_bytes_needed = sizeof(uint64_t);\r
+\r
+       if( p_oid_info->buf_len >= sizeof(uint64_t) )\r
+       {\r
+               *((uint64_t*)p_oid_info->p_buf) = stat;\r
+               *p_oid_info->p_bytes_used = sizeof(uint64_t);\r
+       }\r
+       else if( p_oid_info->buf_len >= sizeof(uint32_t) )\r
+       {\r
+               *((uint32_t*)p_oid_info->p_buf) = (uint32_t)stat;\r
+               *p_oid_info->p_bytes_used = sizeof(uint32_t);\r
+       }\r
+       else\r
+       {\r
+               *p_oid_info->p_bytes_used = 0;\r
+               IPOIB_EXIT( IPOIB_DBG_STAT );\r
+               return NDIS_STATUS_INVALID_LENGTH;\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_STAT );\r
+       return NDIS_STATUS_SUCCESS;\r
+}\r
+\r
+\r
+void\r
+ipoib_inc_send_stat(\r
+       IN                              ipoib_adapter_t* const          p_adapter,\r
+       IN              const   ip_stat_sel_t                           stat_sel,\r
+       IN              const   size_t                                          bytes OPTIONAL )\r
+{\r
+       IPOIB_ENTER( IPOIB_DBG_STAT );\r
+\r
+       cl_spinlock_acquire( &p_adapter->send_stat_lock );\r
+       switch( stat_sel )\r
+       {\r
+       case IP_STAT_ERROR:\r
+               p_adapter->send_stats.comp.error++;\r
+               break;\r
+\r
+       case IP_STAT_DROPPED:\r
+               p_adapter->send_stats.comp.dropped++;\r
+               break;\r
+\r
+       case IP_STAT_UCAST_BYTES:\r
+       case IP_STAT_UCAST_FRAMES:\r
+               p_adapter->send_stats.comp.success++;\r
+               p_adapter->send_stats.ucast.frames++;\r
+               p_adapter->send_stats.ucast.bytes += bytes;\r
+               break;\r
+\r
+       case IP_STAT_BCAST_BYTES:\r
+       case IP_STAT_BCAST_FRAMES:\r
+               p_adapter->send_stats.comp.success++;\r
+               p_adapter->send_stats.bcast.frames++;\r
+               p_adapter->send_stats.bcast.bytes += bytes;\r
+               break;\r
+\r
+       case IP_STAT_MCAST_BYTES:\r
+       case IP_STAT_MCAST_FRAMES:\r
+               p_adapter->send_stats.comp.success++;\r
+               p_adapter->send_stats.mcast.frames++;\r
+               p_adapter->send_stats.mcast.bytes += bytes;\r
+               break;\r
+\r
+       default:\r
+               break;\r
+       }\r
+       cl_spinlock_release( &p_adapter->send_stat_lock );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_STAT );\r
+}\r
index 2254f399e3c08a80ed4e76a0c71ab4782b01959b..0d3c106b342b0d3bd765c9d91c0b753ca4d50c59 100644 (file)
@@ -372,7 +372,6 @@ typedef struct _net_address_item
 \r
 ib_api_status_t\r
 ipoib_create_adapter(\r
-       IN              NDIS_HANDLE                     wrapper_config_context,\r
        IN              void* const                     h_adapter,\r
        OUT             ipoib_adapter_t**  const        pp_adapter );\r
 \r
diff --git a/branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.c b/branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.c
deleted file mode 100644 (file)
index 0bc3ebd..0000000
+++ /dev/null
@@ -1,4708 +0,0 @@
-/*\r
- * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
- * Copyright (c) 2006 Mellanox Technologies.  All rights reserved.\r
- * Portions Copyright (c) 2008 Microsoft Corporation.  All rights reserved.\r
- *\r
- * This software is available to you under the OpenIB.org BSD license\r
- * below:\r
- *\r
- *     Redistribution and use in source and binary forms, with or\r
- *     without modification, are permitted provided that the following\r
- *     conditions are met:\r
- *\r
- *      - Redistributions of source code must retain the above\r
- *        copyright notice, this list of conditions and the following\r
- *        disclaimer.\r
- *\r
- *      - Redistributions in binary form must reproduce the above\r
- *        copyright notice, this list of conditions and the following\r
- *        disclaimer in the documentation and/or other materials\r
- *        provided with the distribution.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
- * SOFTWARE.\r
- *\r
- * $Id: ipoib_driver.c 4506 2009-06-23 14:40:54Z xalex $\r
- */\r
-\r
-#include "limits.h"\r
-#include "ipoib_driver.h"\r
-#include "ipoib_debug.h"\r
-\r
-#if defined(EVENT_TRACING)\r
-#ifdef offsetof\r
-#undef offsetof\r
-#endif\r
-#include "ipoib_driver.tmh"\r
-#endif\r
-\r
-#include "ipoib_port.h"\r
-#include "ipoib_ibat.h"\r
-#include <complib/cl_bus_ifc.h>\r
-#include <complib/cl_init.h>\r
-#include <initguid.h>\r
-#include <iba/ipoib_ifc.h>\r
-#include "ntstrsafe.h"\r
-#include "strsafe.h"\r
-#include <offload.h>\r
-\r
-\r
-\r
-#define MAJOR_DRIVER_VERSION 2\r
-#define MINOR_DRIVER_VERSION 1\r
-#if defined(NDIS60_MINIPORT)\r
-#define MAJOR_NDIS_VERSION 6\r
-#define MINOR_NDIS_VERSION 0\r
-\r
-#else\r
-#error NDIS Version not defined, try defining NDIS60_MINIPORT\r
-#endif\r
-\r
-PDRIVER_OBJECT                         g_p_drv_obj;\r
-\r
-\r
-#if 0\r
-static const NDIS_OID SUPPORTED_OIDS[] =\r
-{\r
-       OID_GEN_SUPPORTED_LIST,\r
-       OID_GEN_HARDWARE_STATUS,\r
-       OID_GEN_MEDIA_SUPPORTED,\r
-       OID_GEN_MEDIA_IN_USE,\r
-       OID_GEN_MAXIMUM_LOOKAHEAD,\r
-       OID_GEN_MAXIMUM_FRAME_SIZE,\r
-       OID_GEN_LINK_SPEED,\r
-       OID_GEN_TRANSMIT_BUFFER_SPACE,\r
-       OID_GEN_RECEIVE_BUFFER_SPACE,\r
-       OID_GEN_TRANSMIT_BLOCK_SIZE,\r
-       OID_GEN_RECEIVE_BLOCK_SIZE,\r
-       OID_GEN_VENDOR_ID,\r
-       OID_GEN_VENDOR_DESCRIPTION,\r
-       OID_GEN_CURRENT_PACKET_FILTER,\r
-       OID_GEN_CURRENT_LOOKAHEAD,\r
-       OID_GEN_DRIVER_VERSION,\r
-       OID_GEN_MAXIMUM_TOTAL_SIZE,\r
-       OID_GEN_PROTOCOL_OPTIONS,\r
-       OID_GEN_MAC_OPTIONS,\r
-       OID_GEN_MEDIA_CONNECT_STATUS,\r
-       OID_GEN_MAXIMUM_SEND_PACKETS,\r
-       OID_GEN_NETWORK_LAYER_ADDRESSES,\r
-       OID_GEN_VENDOR_DRIVER_VERSION,\r
-       OID_GEN_PHYSICAL_MEDIUM,\r
-       OID_GEN_XMIT_OK,\r
-       OID_GEN_RCV_OK,\r
-       OID_GEN_XMIT_ERROR,\r
-       OID_GEN_RCV_ERROR,\r
-       OID_GEN_RCV_NO_BUFFER,\r
-       OID_GEN_DIRECTED_BYTES_XMIT,\r
-       OID_GEN_DIRECTED_FRAMES_XMIT,\r
-       OID_GEN_MULTICAST_BYTES_XMIT,\r
-       OID_GEN_MULTICAST_FRAMES_XMIT,\r
-       OID_GEN_BROADCAST_BYTES_XMIT,\r
-       OID_GEN_BROADCAST_FRAMES_XMIT,\r
-       OID_GEN_DIRECTED_BYTES_RCV,\r
-       OID_GEN_DIRECTED_FRAMES_RCV,\r
-       OID_GEN_MULTICAST_BYTES_RCV,\r
-       OID_GEN_MULTICAST_FRAMES_RCV,\r
-       OID_GEN_BROADCAST_BYTES_RCV,\r
-       OID_GEN_BROADCAST_FRAMES_RCV,\r
-       OID_802_3_PERMANENT_ADDRESS,\r
-       OID_802_3_CURRENT_ADDRESS,\r
-       OID_802_3_MULTICAST_LIST,\r
-       OID_802_3_MAXIMUM_LIST_SIZE,\r
-       OID_802_3_MAC_OPTIONS,\r
-       OID_802_3_RCV_ERROR_ALIGNMENT,\r
-       OID_802_3_XMIT_ONE_COLLISION,\r
-       OID_802_3_XMIT_MORE_COLLISIONS,\r
-       OID_TCP_TASK_OFFLOAD\r
-};\r
-#endif\r
-\r
-NDIS_OID NICSupportedOidsTest[] =\r
-{\r
-    OID_GEN_SUPPORTED_LIST,\r
-    OID_GEN_HARDWARE_STATUS,\r
-    OID_GEN_MEDIA_SUPPORTED,\r
-    OID_GEN_MEDIA_IN_USE,\r
-    OID_GEN_MAXIMUM_LOOKAHEAD,\r
-    OID_GEN_MAXIMUM_FRAME_SIZE,\r
-    OID_GEN_TRANSMIT_BUFFER_SPACE,\r
-    OID_GEN_RECEIVE_BUFFER_SPACE,\r
-    OID_GEN_TRANSMIT_BLOCK_SIZE,\r
-    OID_GEN_RECEIVE_BLOCK_SIZE,\r
-    OID_GEN_VENDOR_ID,\r
-    OID_GEN_VENDOR_DESCRIPTION,\r
-    OID_GEN_VENDOR_DRIVER_VERSION,\r
-    OID_GEN_CURRENT_PACKET_FILTER,\r
-    OID_GEN_CURRENT_LOOKAHEAD,\r
-    OID_GEN_DRIVER_VERSION,\r
-    OID_GEN_MAXIMUM_TOTAL_SIZE,\r
-    OID_GEN_MAC_OPTIONS,\r
-    OID_GEN_MAXIMUM_SEND_PACKETS,\r
-    OID_GEN_XMIT_OK,\r
-    OID_GEN_RCV_OK,\r
-    OID_GEN_XMIT_ERROR,\r
-    OID_GEN_RCV_ERROR,\r
-    OID_GEN_RCV_NO_BUFFER,\r
-    OID_GEN_RCV_CRC_ERROR,\r
-    OID_GEN_TRANSMIT_QUEUE_LENGTH,\r
-    OID_802_3_PERMANENT_ADDRESS,\r
-    OID_802_3_CURRENT_ADDRESS,\r
-    OID_802_3_MULTICAST_LIST,\r
-    OID_802_3_MAXIMUM_LIST_SIZE,\r
-    OID_802_3_RCV_ERROR_ALIGNMENT,\r
-    OID_802_3_XMIT_ONE_COLLISION,\r
-    OID_802_3_XMIT_MORE_COLLISIONS,\r
-    OID_802_3_XMIT_DEFERRED,\r
-    OID_802_3_XMIT_MAX_COLLISIONS,\r
-    OID_802_3_RCV_OVERRUN,\r
-    OID_802_3_XMIT_UNDERRUN,\r
-    OID_802_3_XMIT_HEARTBEAT_FAILURE,\r
-    OID_802_3_XMIT_TIMES_CRS_LOST,\r
-    OID_802_3_XMIT_LATE_COLLISIONS,\r
-\r
-#if !BUILD_W2K\r
-    OID_GEN_PHYSICAL_MEDIUM,\r
-#endif\r
-\r
-    OID_TCP_TASK_OFFLOAD,\r
-    \r
-/* powermanagement */\r
-\r
-    OID_PNP_CAPABILITIES,\r
-    OID_PNP_SET_POWER,\r
-    OID_PNP_QUERY_POWER,\r
-    OID_PNP_ADD_WAKE_UP_PATTERN,\r
-    OID_PNP_REMOVE_WAKE_UP_PATTERN,\r
-    OID_PNP_ENABLE_WAKE_UP,\r
-\r
-\r
-/* custom oid WMI support */\r
-//    OID_CUSTOM_PERF_COUNTERS,\r
- //   OID_CUSTOM_STRING,\r
-\r
-    OID_GEN_RECEIVE_SCALE_CAPABILITIES,\r
-    OID_GEN_RECEIVE_SCALE_PARAMETERS,\r
-\r
-//\r
-// new and required for NDIS 6 miniports\r
-//\r
-    OID_GEN_LINK_PARAMETERS,\r
-    OID_GEN_INTERRUPT_MODERATION,\r
-    OID_GEN_STATISTICS,\r
-\r
-/* Offload */\r
-    OID_TCP_OFFLOAD_CURRENT_CONFIG,\r
-    OID_TCP_OFFLOAD_PARAMETERS,\r
-    OID_TCP_OFFLOAD_HARDWARE_CAPABILITIES,\r
-    OID_OFFLOAD_ENCAPSULATION,\r
-\r
-/* Header - Data seperation */\r
-   // OID_GEN_HD_SPLIT_PARAMETERS,\r
- //   OID_GEN_HD_SPLIT_CURRENT_CONFIG,\r
-    \r
-/* VLAN */\r
-  //  OID_ADD_VALN_ID,\r
- //   OID_DELETE_VLAN_ID,\r
-\r
-/* Set MAC */\r
-  //  OID_SET_MAC_ADDRESS\r
-\r
-};\r
-\r
-static const NDIS_OID SUPPORTED_OIDS[] =\r
-{\r
-    OID_GEN_SUPPORTED_LIST,\r
-    OID_GEN_HARDWARE_STATUS,\r
-    OID_GEN_MEDIA_SUPPORTED,\r
-    OID_GEN_MEDIA_IN_USE,\r
-    OID_GEN_MAXIMUM_LOOKAHEAD,\r
-    OID_GEN_MAXIMUM_FRAME_SIZE,\r
-    OID_GEN_TRANSMIT_BUFFER_SPACE,\r
-    OID_GEN_RECEIVE_BUFFER_SPACE,\r
-    OID_GEN_TRANSMIT_BLOCK_SIZE,\r
-    OID_GEN_RECEIVE_BLOCK_SIZE,\r
-    OID_GEN_VENDOR_ID,\r
-    OID_GEN_VENDOR_DESCRIPTION,\r
-    OID_GEN_VENDOR_DRIVER_VERSION,\r
-    OID_GEN_CURRENT_PACKET_FILTER,\r
-    OID_GEN_CURRENT_LOOKAHEAD,\r
-    OID_GEN_DRIVER_VERSION,\r
-    OID_GEN_MAXIMUM_TOTAL_SIZE,\r
-    OID_GEN_MAC_OPTIONS,\r
-    OID_GEN_MAXIMUM_SEND_PACKETS,\r
-    OID_GEN_XMIT_OK,\r
-    OID_GEN_RCV_OK,\r
-    OID_GEN_XMIT_ERROR,\r
-    OID_GEN_RCV_ERROR,\r
-    OID_GEN_RCV_NO_BUFFER,\r
-    OID_GEN_RCV_CRC_ERROR,\r
-    OID_GEN_TRANSMIT_QUEUE_LENGTH,\r
-    OID_802_3_PERMANENT_ADDRESS,\r
-    OID_802_3_CURRENT_ADDRESS,\r
-    OID_802_3_MULTICAST_LIST,\r
-    OID_802_3_MAXIMUM_LIST_SIZE,\r
-    OID_802_3_RCV_ERROR_ALIGNMENT,\r
-    OID_802_3_XMIT_ONE_COLLISION,\r
-    OID_802_3_XMIT_MORE_COLLISIONS,\r
-    OID_802_3_XMIT_DEFERRED,\r
-    OID_802_3_XMIT_MAX_COLLISIONS,\r
-    OID_802_3_RCV_OVERRUN,\r
-    OID_802_3_XMIT_UNDERRUN,\r
-    OID_802_3_XMIT_HEARTBEAT_FAILURE,\r
-    OID_802_3_XMIT_TIMES_CRS_LOST,\r
-    OID_802_3_XMIT_LATE_COLLISIONS,\r
-\r
-#if !BUILD_W2K\r
-    OID_GEN_PHYSICAL_MEDIUM,\r
-#endif\r
-\r
-    OID_TCP_TASK_OFFLOAD,\r
-    \r
-/* powermanagement */\r
-\r
-    OID_PNP_CAPABILITIES,\r
-    OID_PNP_SET_POWER,\r
-    OID_PNP_QUERY_POWER,\r
-    OID_PNP_ADD_WAKE_UP_PATTERN,\r
-    OID_PNP_REMOVE_WAKE_UP_PATTERN,\r
-    OID_PNP_ENABLE_WAKE_UP,\r
-\r
-#if 0\r
-/* custom oid WMI support */\r
-    OID_CUSTOM_PERF_COUNTERS,\r
-    OID_CUSTOM_STRING,\r
-#endif\r
-\r
-    OID_GEN_RECEIVE_SCALE_CAPABILITIES,\r
-    OID_GEN_RECEIVE_SCALE_PARAMETERS,\r
-   \r
-\r
-//\r
-// new and required for NDIS 6 miniports\r
-//\r
-    OID_GEN_LINK_PARAMETERS,\r
-    OID_GEN_INTERRUPT_MODERATION,\r
-    OID_GEN_STATISTICS,\r
-\r
-/* Offload */\r
-    OID_TCP_OFFLOAD_CURRENT_CONFIG,\r
-    OID_TCP_OFFLOAD_PARAMETERS,\r
-    OID_TCP_OFFLOAD_HARDWARE_CAPABILITIES,\r
-    OID_OFFLOAD_ENCAPSULATION,\r
-    \r
-#if 0\r
-\r
-/* Header - Data seperation */\r
-    OID_GEN_HD_SPLIT_PARAMETERS,\r
-    OID_GEN_HD_SPLIT_CURRENT_CONFIG,\r
-\r
-/* VLAN */\r
-    OID_ADD_VALN_ID,\r
-    OID_DELETE_VLAN_ID,\r
-\r
-\r
-/* Set MAC */\r
-    OID_SET_MAC_ADDRESS\r
-#endif\r
-\r
-};\r
-\r
-static const unsigned char VENDOR_ID[] = {0x00, 0x06, 0x6A, 0x00};\r
-\r
-#define VENDOR_DESCRIPTION "Internet Protocol over InfiniBand"\r
-\r
-#define IB_INFINITE_SERVICE_LEASE      0xFFFFFFFF\r
-\r
-//The mask is 8 bit and can't contain more than 6 non-zero bits\r
-#define MAX_GUID_MAX 0xFC\r
-\r
-\r
-/* Global driver debug level */\r
-uint32_t               g_ipoib_dbg_level = TRACE_LEVEL_ERROR;\r
-uint32_t               g_ipoib_dbg_flags = 0x00000fff;\r
-ipoib_globals_t        g_ipoib = {0};\r
-NDIS_HANDLE            g_IpoibMiniportDriverHandle = NULL;\r
-NDIS_HANDLE            g_IpoibDriverContext = NULL;\r
-\r
-\r
-\r
-typedef struct _IPOIB_REG_ENTRY\r
-{\r
-       NDIS_STRING RegName;                // variable name text\r
-       BOOLEAN     bRequired;              // 1 -> required, 0 -> optional\r
-       UINT        FieldOffset;            // offset in parent struct\r
-       UINT        FieldSize;              // size (in bytes) of the field\r
-       UINT        Default;                // default value to use\r
-       UINT        Min;                    // minimum value allowed\r
-       UINT        Max;                    // maximum value allowed\r
-} IPOIB_REG_ENTRY, *PIPOIB_REG_ENTRY;\r
-\r
-IPOIB_REG_ENTRY HCARegTable[] = {\r
-       // reg value name             If Required  Offset in parentr struct             Field size                  Default         Min     Max\r
-       {NDIS_STRING_CONST("GUIDMask"),         0, IPOIB_OFFSET(guid_mask),             IPOIB_SIZE(guid_mask),          0,          0,    MAX_GUID_MAX},\r
-       /* GUIDMask should be the first element */\r
-       {NDIS_STRING_CONST("RqDepth"),          1, IPOIB_OFFSET(rq_depth),              IPOIB_SIZE(rq_depth),           512,        128,    1024},\r
-       {NDIS_STRING_CONST("RqLowWatermark"),   0, IPOIB_OFFSET(rq_low_watermark),      IPOIB_SIZE(rq_low_watermark),   4,          2,      8},\r
-       {NDIS_STRING_CONST("SqDepth"),          1, IPOIB_OFFSET(sq_depth),              IPOIB_SIZE(sq_depth),           512,        128,    1024},\r
-       {NDIS_STRING_CONST("SendChksum"),       1, IPOIB_OFFSET(send_chksum_offload),   IPOIB_SIZE(send_chksum_offload),CSUM_ENABLED,CSUM_DISABLED,CSUM_BYPASS},\r
-       {NDIS_STRING_CONST("RecvChksum"),       1, IPOIB_OFFSET(recv_chksum_offload),   IPOIB_SIZE(recv_chksum_offload),CSUM_ENABLED,CSUM_DISABLED,CSUM_BYPASS},\r
-       {NDIS_STRING_CONST("SaTimeout"),        1, IPOIB_OFFSET(sa_timeout),            IPOIB_SIZE(sa_timeout),         1000,       250,    UINT_MAX},\r
-       {NDIS_STRING_CONST("SaRetries"),        1, IPOIB_OFFSET(sa_retry_cnt),          IPOIB_SIZE(sa_retry_cnt),       10,         1,      UINT_MAX},\r
-       {NDIS_STRING_CONST("RecvRatio"),        1, IPOIB_OFFSET(recv_pool_ratio),       IPOIB_SIZE(recv_pool_ratio),    1,          1,      10},\r
-       {NDIS_STRING_CONST("PayloadMtu"),       1, IPOIB_OFFSET(payload_mtu),           IPOIB_SIZE(payload_mtu),        2044,       512,   MAX_UD_PAYLOAD_MTU},\r
-       {NDIS_STRING_CONST("lso"),              0, IPOIB_OFFSET(lso),                   IPOIB_SIZE(lso),                0,          0,      1},\r
-       {NDIS_STRING_CONST("MCLeaveRescan"),    1, IPOIB_OFFSET(mc_leave_rescan),       IPOIB_SIZE(mc_leave_rescan),    260,        1,    3600},\r
-       {NDIS_STRING_CONST("BCJoinRetry"),          1, IPOIB_OFFSET(bc_join_retry),                 IPOIB_SIZE(bc_join_retry),      50,         0,    1000},\r
-       {NDIS_STRING_CONST("CmEnabled"),        0, IPOIB_OFFSET(cm_enabled),            IPOIB_SIZE(cm_enabled),         FALSE,     FALSE, TRUE},\r
-       {NDIS_STRING_CONST("CmPayloadMtu"),     1, IPOIB_OFFSET(cm_payload_mtu),        IPOIB_SIZE(cm_payload_mtu),     MAX_CM_PAYLOAD_MTU, 512, MAX_CM_PAYLOAD_MTU}\r
-\r
-};  \r
-\r
-#define IPOIB_NUM_REG_PARAMS (sizeof (HCARegTable) / sizeof(IPOIB_REG_ENTRY))\r
-\r
-\r
-void\r
-ipoib_create_log(\r
-       NDIS_HANDLE h_adapter,\r
-       UINT ind,\r
-       ULONG eventLogMsgId)\r
-\r
-{\r
-#define cMaxStrLen  40\r
-#define cArrLen  3\r
-\r
-       PWCHAR logMsgArray[cArrLen]; \r
-       WCHAR strVal[cMaxStrLen];\r
-       NDIS_STRING AdapterInstanceName;\r
-\r
-       IPOIB_INIT_NDIS_STRING(&AdapterInstanceName);\r
-       if (NdisMQueryAdapterInstanceName(&AdapterInstanceName, h_adapter)!= NDIS_STATUS_SUCCESS ){\r
-               ASSERT(FALSE);\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR,IPOIB_DBG_ERROR, ("[IPoIB] Init:Failed to retreive adapter name.\n"));\r
-               return;\r
-       }\r
-       logMsgArray[0] = AdapterInstanceName.Buffer;\r
-       \r
-       if (RtlStringCbPrintfW(strVal, sizeof(strVal), L"0x%x", HCARegTable[ind].Default) != STATUS_SUCCESS) {\r
-               ASSERT(FALSE);\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR,IPOIB_DBG_ERROR,\r
-               ("[IPoIB] Init: Problem copying string value: exiting\n"));   \r
-               return;\r
-       }\r
-       \r
-       logMsgArray[0] = AdapterInstanceName.Buffer;\r
-       logMsgArray[1] = HCARegTable[ind].RegName.Buffer;\r
-       logMsgArray[2] = strVal;\r
-       \r
-       NdisWriteEventLogEntry(g_p_drv_obj, eventLogMsgId, 0, cArrLen, &logMsgArray, 0, NULL);\r
-\r
-}\r
-\r
-\r
-\r
-NTSTATUS\r
-DriverEntry(\r
-       IN                              PDRIVER_OBJECT                          p_drv_obj,\r
-       IN                              PUNICODE_STRING                         p_reg_path );\r
-\r
-VOID\r
-ipoib_unload(\r
-       IN                              PDRIVER_OBJECT                          p_drv_obj );\r
-\r
-NDIS_STATUS\r
-ipoib_initialize_ex(\r
-       IN                              NDIS_HANDLE                     h_adapter,\r
-    IN                                 NDIS_HANDLE             config_context,\r
-    IN PNDIS_MINIPORT_INIT_PARAMETERS  MiniportInitParameters);\r
-\r
-NDIS_STATUS \r
-MPInitializeTest(\r
-    IN  NDIS_HANDLE                        MiniportAdapterHandle,\r
-    IN  NDIS_HANDLE                        MiniportDriverContext,\r
-    IN  PNDIS_MINIPORT_INIT_PARAMETERS     MiniportInitParameters\r
-    );\r
-\r
-\r
-\r
-BOOLEAN\r
-ipoib_check_for_hang(\r
-       IN                              NDIS_HANDLE                                     adapter_context );\r
-\r
-void\r
-ipoib_halt_ex(\r
-       IN NDIS_HANDLE  adapter_context,\r
-       IN                      NDIS_HALT_ACTION            HaltAction);\r
-\r
-NDIS_STATUS\r
-ipoib_query_info(\r
-       IN                              NDIS_HANDLE                                     adapter_context,\r
-       IN                              NDIS_OID                                        oid,\r
-       IN                              PVOID                                           info_buf,\r
-       IN                              ULONG                                           info_buf_len,\r
-               OUT                     PULONG                                          p_bytes_written,\r
-               OUT                     PULONG                                          p_bytes_needed );\r
-\r
-\r
-\r
-NDIS_STATUS\r
-ipoib_reset(\r
-    IN  NDIS_HANDLE     adapter_context,\r
-    OUT PBOOLEAN        p_addr_reset);\r
-\r
-NDIS_STATUS\r
-ipoib_set_info(\r
-       IN                              NDIS_HANDLE                                     adapter_context,\r
-       IN                              NDIS_OID                                        oid,\r
-       IN                              PVOID                                           info_buf,\r
-       IN                              ULONG                                           info_buf_length,\r
-               OUT                     PULONG                                          p_bytes_read,\r
-               OUT                     PULONG                                          p_bytes_needed );\r
-\r
-//NDIS60\r
-void\r
-ipoib_send_net_buffer_list(\r
-    IN  NDIS_HANDLE         adapter_context,\r
-    IN  PNET_BUFFER_LIST    net_buffer_list,\r
-    IN  NDIS_PORT_NUMBER    port_num,\r
-    IN  ULONG               send_flags);\r
-\r
-void\r
-ipoib_pnp_notify(\r
-       IN                              NDIS_HANDLE                                     adapter_context,\r
-       IN PNET_DEVICE_PNP_EVENT  pnp_event);\r
-\r
-VOID\r
-ipoib_shutdown_ex(\r
-       IN NDIS_HANDLE  adapter_context,\r
-       IN NDIS_SHUTDOWN_ACTION  shutdown_action);\r
-\r
-\r
-void\r
-ipoib_cancel_xmit(\r
-       IN                              NDIS_HANDLE                                     adapter_context,\r
-       IN                              PVOID                                           cancel_id );\r
-\r
-\r
-static void\r
-ipoib_complete_query(\r
-       IN                              ipoib_adapter_t* const          p_adapter,\r
-       IN                              pending_oid_t* const            p_oid_info,\r
-       IN              const   NDIS_STATUS                                     status,\r
-       IN              const   void* const                                     p_buf,\r
-       IN              const   ULONG                                           buf_len );\r
-\r
-static NDIS_STATUS\r
-__ipoib_set_net_addr(\r
-       IN              ipoib_adapter_t *       p_adapter,\r
-       IN              PVOID                           info_buf,\r
-       IN              ULONG                           info_buf_len,\r
-               OUT     PULONG                          p_bytes_read,\r
-               OUT     PULONG                          p_bytes_needed );\r
-\r
-static NDIS_STATUS\r
-__ipoib_get_tcp_task_offload(\r
-       IN                              ipoib_adapter_t*                        p_adapter,\r
-       OUT                             pending_oid_t                           *pNdisRequest);\r
-\r
-static void\r
-__ipoib_ats_reg_cb(\r
-       IN                              ib_reg_svc_rec_t                        *p_reg_svc_rec );\r
-\r
-static void\r
-__ipoib_ats_dereg_cb(\r
-       IN                              void                                            *context );\r
-\r
-static NTSTATUS\r
-__ipoib_read_registry(\r
-       IN                              UNICODE_STRING* const           p_registry_path );\r
-\r
-static NDIS_STATUS\r
-ipoib_set_options(\r
-    IN NDIS_HANDLE  NdisMiniportDriverHandle,\r
-    IN NDIS_HANDLE  MiniportDriverContext);\r
-\r
-static NDIS_STATUS\r
-ipoib_oid_handler(\r
-    IN  NDIS_HANDLE         adapter_context,\r
-    IN  PNDIS_OID_REQUEST   pNdisRequest);\r
-\r
-static void\r
-ipoib_cancel_oid_request(\r
-    IN  NDIS_HANDLE            adapter_context,\r
-    IN  PVOID                  requestId);\r
-        \r
-static NDIS_STATUS \r
-ipoib_pause(\r
-    IN  NDIS_HANDLE                         adapter_context,    \r
-    IN  PNDIS_MINIPORT_PAUSE_PARAMETERS     pause_parameters);\r
-\r
-static NDIS_STATUS \r
-ipoib_restart(\r
-    IN  NDIS_HANDLE                         adapter_context,    \r
-    IN  PNDIS_MINIPORT_RESTART_PARAMETERS   restart_parameters);\r
-\r
-\r
-\r
-//! Standard Windows Device Driver Entry Point\r
-/*! DriverEntry is the first routine called after a driver is loaded, and\r
-is responsible for initializing the driver.  On W2k this occurs when the PnP\r
-Manager matched a PnP ID to one in an INF file that references this driver.\r
-Any not success return value will cause the driver to fail to load.\r
-IRQL = PASSIVE_LEVEL\r
-\r
-@param p_drv_obj Pointer to Driver Object for this device driver\r
-@param p_registry_path Pointer to unicode string containing path to this driver's registry area\r
-@return STATUS_SUCCESS, NDIS_STATUS_BAD_CHARACTERISTICS, NDIS_STATUS_BAD_VERSION,\r
-NDIS_STATUS_RESOURCES, or NDIS_STATUS_FAILURE\r
-*/\r
-NTSTATUS\r
-DriverEntry(\r
-       IN                              PDRIVER_OBJECT                          p_drv_obj,\r
-       IN                              PUNICODE_STRING                         p_registry_path )\r
-{\r
-       NDIS_STATUS                                             status;\r
-       NDIS_MINIPORT_DRIVER_CHARACTERISTICS characteristics;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-       g_p_drv_obj = p_drv_obj;\r
-\r
-#ifdef _DEBUG_\r
-       PAGED_CODE();\r
-#endif\r
-#if defined(EVENT_TRACING)\r
-       WPP_INIT_TRACING(p_drv_obj, p_registry_path);\r
-#endif\r
-       status = CL_INIT;\r
-       if( !NT_SUCCESS( status ) )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("cl_init failed.\n") );\r
-               return status;\r
-       }\r
-\r
-       __ipoib_read_registry(p_registry_path);\r
-       \r
-       KeInitializeSpinLock( &g_ipoib.lock );\r
-       cl_qlist_init( &g_ipoib.adapter_list );\r
-\r
-    NdisZeroMemory(&characteristics, sizeof(characteristics));\r
-\r
-    characteristics.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_DRIVER_CHARACTERISTICS,\r
-    characteristics.Header.Size = sizeof(NDIS_MINIPORT_DRIVER_CHARACTERISTICS);\r
-    characteristics.Header.Revision = NDIS_MINIPORT_DRIVER_CHARACTERISTICS_REVISION_1;\r
-\r
-       characteristics.MajorNdisVersion                = MAJOR_NDIS_VERSION;\r
-       characteristics.MinorNdisVersion                = MINOR_NDIS_VERSION;\r
-    characteristics.MajorDriverVersion         = MAJOR_DRIVER_VERSION;\r
-    characteristics.MinorDriverVersion         = MINOR_DRIVER_VERSION;\r
-\r
-\r
-       characteristics.CheckForHangHandlerEx           = ipoib_check_for_hang;\r
-       characteristics.HaltHandlerEx                           = ipoib_halt_ex;\r
-       characteristics.InitializeHandlerEx             = ipoib_initialize_ex;// MPInitializeTest\r
-       characteristics.OidRequestHandler                       = ipoib_oid_handler;\r
-       characteristics.CancelOidRequestHandler         = ipoib_cancel_oid_request;\r
-       characteristics.ResetHandlerEx                          = ipoib_reset;\r
-       characteristics.DevicePnPEventNotifyHandler     = ipoib_pnp_notify;\r
-       characteristics.ReturnNetBufferListsHandler     = ipoib_return_net_buffer_list;\r
-       characteristics.SendNetBufferListsHandler       = ipoib_send_net_buffer_list;\r
-\r
-       characteristics.SetOptionsHandler                       = ipoib_set_options;\r
-       characteristics.PauseHandler                            = ipoib_pause;\r
-       characteristics.RestartHandler                          = ipoib_restart;\r
-       characteristics.UnloadHandler                           = ipoib_unload;\r
-       characteristics.CancelSendHandler                       = ipoib_cancel_xmit;\r
-       characteristics.ShutdownHandlerEx                       = ipoib_shutdown_ex;\r
-\r
-\r
-\r
-//TODO NDIS60 set g_ prefix to global variables\r
-       status = NdisMRegisterMiniportDriver(\r
-               p_drv_obj, p_registry_path,(PNDIS_HANDLE)&g_IpoibDriverContext, &characteristics,&g_IpoibMiniportDriverHandle );\r
-       if( status != NDIS_STATUS_SUCCESS )\r
-       {\r
-               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, \r
-                       ("NdisMRegisterMiniportDriver failed with status of %d\n", status) );\r
-               CL_DEINIT;\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-       return status;\r
-}\r
-\r
-static NDIS_STATUS\r
-ipoib_set_options(\r
-    IN NDIS_HANDLE  NdisMiniportDriverHandle,\r
-    IN NDIS_HANDLE  MiniportDriverContext\r
-    )\r
-{\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-    UNREFERENCED_PARAMETER(NdisMiniportDriverHandle);\r
-    UNREFERENCED_PARAMETER(MiniportDriverContext);\r
-   \r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-    return NDIS_STATUS_SUCCESS;\r
-}\r
-\r
-static NTSTATUS\r
-__ipoib_read_registry(\r
-       IN                              UNICODE_STRING* const           p_registry_path )\r
-{\r
-       NTSTATUS                                                status;\r
-       /* Remember the terminating entry in the table below. */\r
-       RTL_QUERY_REGISTRY_TABLE                table[4];\r
-       UNICODE_STRING                                  param_path;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-       RtlInitUnicodeString( &param_path, NULL );\r
-       param_path.MaximumLength = p_registry_path->Length + \r
-               sizeof(L"\\Parameters");\r
-       param_path.Buffer = cl_zalloc( param_path.MaximumLength );\r
-       if( !param_path.Buffer )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, \r
-                       ("Failed to allocate parameters path buffer.\n") );\r
-               return STATUS_INSUFFICIENT_RESOURCES;\r
-       }\r
-\r
-       RtlAppendUnicodeStringToString( &param_path, p_registry_path );\r
-       RtlAppendUnicodeToString( &param_path, L"\\Parameters" );\r
-\r
-       /*\r
-        * Clear the table.  This clears all the query callback pointers,\r
-        * and sets up the terminating table entry.\r
-        */\r
-       cl_memclr( table, sizeof(table) );\r
-\r
-       /* Setup the table entries. */\r
-       table[0].Flags = RTL_QUERY_REGISTRY_DIRECT;\r
-       table[0].Name = L"DebugLevel";\r
-       table[0].EntryContext = &g_ipoib_dbg_level;\r
-       table[0].DefaultType = REG_DWORD;\r
-       table[0].DefaultData = &g_ipoib_dbg_level;\r
-       table[0].DefaultLength = sizeof(ULONG);\r
-\r
-       table[1].Flags = RTL_QUERY_REGISTRY_DIRECT;\r
-       table[1].Name = L"DebugFlags";\r
-       table[1].EntryContext = &g_ipoib_dbg_flags;\r
-       table[1].DefaultType = REG_DWORD;\r
-       table[1].DefaultData = &g_ipoib_dbg_flags;\r
-       table[1].DefaultLength = sizeof(ULONG);\r
-\r
-       table[2].Flags = RTL_QUERY_REGISTRY_DIRECT;\r
-       table[2].Name = L"bypass_check_bcast_rate";\r
-       table[2].EntryContext = &g_ipoib.bypass_check_bcast_rate;\r
-       table[2].DefaultType = REG_DWORD;\r
-       table[2].DefaultData = &g_ipoib.bypass_check_bcast_rate;\r
-       table[2].DefaultLength = sizeof(ULONG);\r
-\r
-       /* Have at it! */\r
-       status = RtlQueryRegistryValues( RTL_REGISTRY_ABSOLUTE, \r
-               param_path.Buffer, table, NULL, NULL );\r
-\r
-       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("debug level %d debug flags 0x%.8x\n",\r
-                       g_ipoib_dbg_level,\r
-                       g_ipoib_dbg_flags));\r
-\r
-#if DBG\r
-       if( g_ipoib_dbg_flags & IPOIB_DBG_ERR )\r
-               g_ipoib_dbg_flags |= CL_DBG_ERROR;\r
-#endif\r
-\r
-       cl_free( param_path.Buffer );\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-       return status;\r
-}\r
-\r
-\r
-VOID\r
-ipoib_unload(\r
-       IN                              PDRIVER_OBJECT                          p_drv_obj )\r
-{\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-       UNREFERENCED_PARAMETER(p_drv_obj);\r
-       #if defined(EVENT_TRACING)\r
-       WPP_CLEANUP(p_drv_obj);\r
-       #endif\r
-       //NDIS6.0\r
-       NdisMDeregisterMiniportDriver(g_IpoibMiniportDriverHandle);\r
-       UNREFERENCED_PARAMETER( p_drv_obj );\r
-       CL_DEINIT;\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-}\r
-\r
-\r
-\r
-NDIS_STATUS\r
-ipoib_get_adapter_params(\r
-       IN                              NDIS_HANDLE* const                      wrapper_config_context,\r
-       IN      OUT                     ipoib_adapter_t                         *p_adapter,\r
-       OUT                             PUCHAR                                          *p_mac,\r
-       OUT                             UINT                                            *p_len)\r
-{\r
-       NDIS_STATUS                                             status;\r
-       NDIS_HANDLE                                             h_config;\r
-    NDIS_CONFIGURATION_OBJECT          config_obj;\r
-       NDIS_CONFIGURATION_PARAMETER    *p_param;\r
-       UINT                                                    value;\r
-       PIPOIB_REG_ENTRY                                pRegEntry;\r
-       UINT                                                    i;\r
-       PUCHAR                                                  structPointer;\r
-       \r
-       int sq_depth_step = 128;\r
-\r
-       UNUSED_PARAM(wrapper_config_context);\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-    config_obj.Header.Type = NDIS_OBJECT_TYPE_CONFIGURATION_OBJECT;\r
-    config_obj.Header.Revision = NDIS_CONFIGURATION_OBJECT_REVISION_1;\r
-    config_obj.Header.Size = sizeof(NDIS_CONFIGURATION_OBJECT);\r
-    config_obj.NdisHandle = p_adapter->h_adapter;\r
-    config_obj.Flags = 0;\r
-\r
-       status = NdisOpenConfigurationEx( &config_obj, &h_config);\r
-       if( status != NDIS_STATUS_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("NdisOpenConfigurationEx returned 0x%.8x\n", status) );\r
-               return status;\r
-       }\r
-\r
-       // read all the registry values \r
-       for (i = 0, pRegEntry = HCARegTable; i < IPOIB_NUM_REG_PARAMS; ++i)\r
-       {\r
-               // initialize pointer to appropriate place inside 'params'\r
-               structPointer = (PUCHAR) &p_adapter->params + pRegEntry[i].FieldOffset;\r
-\r
-               // Get the configuration value for a specific parameter.  Under NT the\r
-               // parameters are all read in as DWORDs.\r
-               NdisReadConfiguration(\r
-                       &status,\r
-                       &p_param,\r
-                       h_config,\r
-                       &pRegEntry[i].RegName,\r
-                       NdisParameterInteger);\r
-\r
-               // If the parameter was present, then check its value for validity.\r
-               if (status == NDIS_STATUS_SUCCESS)\r
-               {\r
-                       // Check that param value is not too small or too large\r
-                       if (p_param->ParameterData.IntegerData < pRegEntry[i].Min ||\r
-                               p_param->ParameterData.IntegerData > pRegEntry[i].Max)\r
-                       {\r
-                               value = pRegEntry[i].Default;\r
-                               ipoib_create_log(p_adapter->h_adapter, i, EVENT_IPOIB_WRONG_PARAMETER_WRN);\r
-                               IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_INIT, ("Read configuration.Registry %S value is out of range, setting default value= 0x%x\n", pRegEntry[i].RegName.Buffer, value));                                \r
-\r
-                       }\r
-                       else\r
-                       {\r
-                               value = p_param->ParameterData.IntegerData;\r
-                               IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_INIT, ("Read configuration. Registry %S, Value= 0x%x\n", pRegEntry[i].RegName.Buffer, value));\r
-                       }\r
-               }\r
-\r
-               else\r
-               {\r
-                       value = pRegEntry[i].Default;\r
-                       status = NDIS_STATUS_SUCCESS;\r
-                       if (pRegEntry[i].bRequired)\r
-                       {\r
-                               ipoib_create_log(p_adapter->h_adapter, i, EVENT_IPOIB_WRONG_PARAMETER_ERR);\r
-                               IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_INIT, ("Read configuration.Registry %S value not found, setting default value= 0x%x\n", pRegEntry[i].RegName.Buffer, value));\r
-                       }\r
-                       else\r
-                       {\r
-                               ipoib_create_log(p_adapter->h_adapter, i, EVENT_IPOIB_WRONG_PARAMETER_INFO);\r
-                               IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_INIT, ("Read configuration. Registry %S value not found, Value= 0x%x\n", pRegEntry[i].RegName.Buffer, value));\r
-                       }\r
-\r
-               }\r
-               //\r
-               // Store the value in the adapter structure.\r
-               //\r
-               switch(pRegEntry[i].FieldSize)\r
-               {\r
-                       case 1:\r
-                               *((PUCHAR) structPointer) = (UCHAR) value;\r
-                               break;\r
-\r
-                       case 2:\r
-                               *((PUSHORT) structPointer) = (USHORT) value;\r
-                               break;\r
-\r
-                       case 4:\r
-                               *((PULONG) structPointer) = (ULONG) value;\r
-                               break;\r
-\r
-                       default:\r
-                               IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Bogus field size %d\n", pRegEntry[i].FieldSize));\r
-                               break;\r
-               }\r
-       }\r
-\r
-       // Send queue depth needs to be a power of two\r
-       //static const INT sq_depth_step = 128;\r
-\r
-       if (p_adapter->params.sq_depth % sq_depth_step) {\r
-               static const c_sq_ind = 2;\r
-               p_adapter->params.sq_depth = sq_depth_step *(\r
-                       p_adapter->params.sq_depth / sq_depth_step + !!( (p_adapter->params.sq_depth % sq_depth_step) > (sq_depth_step/2) ));\r
-               ipoib_create_log(p_adapter->h_adapter, c_sq_ind, EVENT_IPOIB_WRONG_PARAMETER_WRN);\r
-               IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_INIT, ("SQ DEPTH value was rounded to the closest acceptable value of  0x%x\n", p_adapter->params.sq_depth ));\r
-\r
-       }\r
-\r
-\r
-       // Adjusting the low watermark parameter\r
-       p_adapter->params.rq_low_watermark =\r
-                       p_adapter->params.rq_depth / p_adapter->params.rq_low_watermark;\r
-       \r
-       /* disable CM if LSO is active */\r
-       if( p_adapter->params.cm_enabled )\r
-       {\r
-               p_adapter->params.cm_enabled = !p_adapter->params.lso;\r
-               if( !p_adapter->params.cm_enabled )\r
-               {\r
-                       NdisWriteErrorLogEntry( p_adapter->h_adapter,\r
-                               EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de0 );\r
-               }\r
-       }\r
-\r
-       if( p_adapter->params.cm_enabled )\r
-       {\r
-               p_adapter->params.cm_xfer_block_size = \r
-                       (sizeof(eth_hdr_t) + p_adapter->params.cm_payload_mtu);\r
-       }\r
-\r
-               p_adapter->params.xfer_block_size = \r
-                       (sizeof(eth_hdr_t) + p_adapter->params.payload_mtu);\r
-\r
-       NdisReadNetworkAddress( &status, p_mac, p_len, h_config );\r
-\r
-       NdisCloseConfiguration( h_config );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-       return NDIS_STATUS_SUCCESS;\r
-}\r
-\r
-\r
-NDIS_STATUS\r
-ipoib_get_adapter_guids(\r
-       IN                              NDIS_HANDLE* const                      h_adapter,\r
-       IN      OUT                     ipoib_adapter_t                         *p_adapter )\r
-{\r
-       NTSTATUS                        status;\r
-       ib_al_ifc_data_t        data;\r
-       IO_STACK_LOCATION       io_stack, *p_fwd_io_stack;\r
-       DEVICE_OBJECT           *p_pdo;\r
-       IRP                                     *p_irp;\r
-       KEVENT                          event;\r
-       IO_STATUS_BLOCK         io_status;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       NdisMGetDeviceProperty( h_adapter, &p_pdo, NULL, NULL, NULL, NULL );\r
-\r
-       /* Query for our interface */\r
-       data.size = sizeof(ipoib_ifc_data_t);\r
-       data.version = IPOIB_INTERFACE_DATA_VERSION;\r
-       data.type = &GUID_IPOIB_INTERFACE_DATA;\r
-       data.p_data = &p_adapter->guids;\r
-\r
-       io_stack.MinorFunction = IRP_MN_QUERY_INTERFACE;\r
-       io_stack.Parameters.QueryInterface.Version = AL_INTERFACE_VERSION;\r
-       io_stack.Parameters.QueryInterface.Size = sizeof(ib_al_ifc_t);\r
-       io_stack.Parameters.QueryInterface.Interface =\r
-               (INTERFACE*)p_adapter->p_ifc;\r
-       io_stack.Parameters.QueryInterface.InterfaceSpecificData = &data;\r
-       io_stack.Parameters.QueryInterface.InterfaceType = \r
-               &GUID_IB_AL_INTERFACE;\r
-\r
-       KeInitializeEvent( &event, NotificationEvent, FALSE );\r
-\r
-       /* Build the IRP for the HCA. */\r
-       p_irp = IoBuildSynchronousFsdRequest( IRP_MJ_PNP, p_pdo,\r
-               NULL, 0, NULL, &event, &io_status );\r
-       if( !p_irp )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Failed to allocate query interface IRP.\n") );\r
-               return STATUS_INSUFFICIENT_RESOURCES;\r
-       }\r
-\r
-       /* Copy the request query parameters. */\r
-       p_fwd_io_stack = IoGetNextIrpStackLocation( p_irp );\r
-       p_fwd_io_stack->MinorFunction = IRP_MN_QUERY_INTERFACE;\r
-       p_fwd_io_stack->Parameters.QueryInterface =\r
-               io_stack.Parameters.QueryInterface;\r
-       p_irp->IoStatus.Status = STATUS_NOT_SUPPORTED;\r
-\r
-       /* Send the IRP. */\r
-       status = IoCallDriver( p_pdo, p_irp );\r
-       if( status == STATUS_PENDING )\r
-       {\r
-               KeWaitForSingleObject( &event, Executive, KernelMode,\r
-                       FALSE, NULL );\r
-               status = io_status.Status;\r
-       }\r
-\r
-       if( !NT_SUCCESS( status ) )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Query interface for IPOIB interface returned %08x.\n", status) );\r
-               return status;\r
-       }\r
-\r
-       /*\r
-        * Dereference the interface now so that the bus driver doesn't fail a\r
-        * query remove IRP.  We will always get unloaded before the bus driver\r
-        * since we're a child device.\r
-        */\r
-       if (p_adapter->p_ifc)\r
-       p_adapter->p_ifc->wdm.InterfaceDereference(\r
-               p_adapter->p_ifc->wdm.Context );\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-       return NDIS_STATUS_SUCCESS;\r
-}\r
-\r
-\r
-//! Initialization function called for each IOC discovered\r
-/*  The MiniportInitialize function is a required function that sets up a\r
-NIC (or virtual NIC) for network I/O operations, claims all hardware\r
-resources necessary to the NIC in the registry, and allocates resources\r
-the driver needs to carry out network I/O operations.\r
-IRQL = PASSIVE_LEVEL\r
-\r
-@param p_open_status Pointer to a status field set if this function returns NDIS_STATUS_OPEN_ERROR\r
-@param p_selected_medium_index Pointer to unsigned integer noting index into medium_array for this NIC\r
-@param medium_array Array of mediums for this NIC\r
-@param medium_array_size Number of elements in medium_array\r
-@param h_adapter Handle assigned by NDIS for this NIC\r
-@param wrapper_config_context Handle used for Ndis initialization functions\r
-@return NDIS_STATUS_SUCCESS, NDIS_STATUS_UNSUPPORTED_MEDIA, NDIS_STATUS_RESOURCES,\r
-NDIS_STATUS_NOT_SUPPORTED \r
-*/\r
-\r
-/*void foo1(int i)\r
-{\r
-               char temp[5200];\r
-               if (i ==0) return;\r
-               cl_msg_out("i = %d\n", i);\r
-               foo1(i-1);\r
-        \r
-}*/\r
-       \r
-NDIS_STATUS\r
-SetDeviceRegistrationAttributes(\r
-       ipoib_adapter_t *p_adapter,\r
-    NDIS_HANDLE        h_adapter\r
-    )\r
-{\r
-    NDIS_MINIPORT_ADD_DEVICE_REGISTRATION_ATTRIBUTES atr;\r
-    NTSTATUS Status;\r
-\r
-    NdisZeroMemory(&atr, sizeof(NDIS_MINIPORT_ADD_DEVICE_REGISTRATION_ATTRIBUTES));\r
-\r
-    //\r
-    // setting registration attributes\r
-    //\r
-    atr.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADD_DEVICE_REGISTRATION_ATTRIBUTES;\r
-    atr.Header.Revision = NDIS_MINIPORT_ADD_DEVICE_REGISTRATION_ATTRIBUTES_REVISION_1;\r
-    atr.Header.Size = NDIS_SIZEOF_MINIPORT_ADD_DEVICE_REGISTRATION_ATTRIBUTES_REVISION_1;\r
-\r
-\r
-    atr.MiniportAddDeviceContext = (NDIS_HANDLE)p_adapter;\r
-    atr.Flags = 0; \r
-\r
-    Status = NdisMSetMiniportAttributes(h_adapter,\r
-                    (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&atr);\r
-\r
-    return Status;\r
-}\r
-\r
-//NDIS 6.1\r
-#if 0\r
-NDIS_STATUS\r
-SetHardwareAssistAttributes(\r
-    ipoib_adapter_t *p_adapter,\r
-    NDIS_HANDLE        h_adapter\r
-    )\r
-{\r
-    NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES atr;\r
-    NTSTATUS Status;\r
-\r
-    NdisZeroMemory(&atr, sizeof(NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES));\r
-\r
-    //\r
-    // setting registration attributes\r
-    //\r
-    atr.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES;\r
-    atr.Header.Revision = NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES_REVISION_1;\r
-    atr.Header.Size = NDIS_SIZEOF_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES_REVISION_1;\r
-\r
-    NDIS_HD_SPLIT_ATTRIBUTES nhsa;\r
-    NdisZeroMemory(&nhsa, sizeof(nhsa));\r
-\r
-    nhsa.Header.Type = NDIS_OBJECT_TYPE_HD_SPLIT_ATTRIBUTES;\r
-    nhsa.Header.Revision = NDIS_OFFLOAD_REVISION_1;\r
-    nhsa.Header.Size = NDIS_SIZEOF_HD_SPLIT_ATTRIBUTES_REVISION_1;\r
-\r
-    // BUGBUG: We are just cheating here ...\r
-    nhsa.HardwareCapabilities = NDIS_HD_SPLIT_CAPS_SUPPORTS_HEADER_DATA_SPLIT;\r
-#if 0\r
-    ... Only supported on B0\r
-\r
-                                 NDIS_HD_SPLIT_CAPS_SUPPORTS_IPV4_OPTIONS |\r
-                                 NDIS_HD_SPLIT_CAPS_SUPPORTS_IPV6_EXTENSION_HEADERS |\r
-                                 NDIS_HD_SPLIT_CAPS_SUPPORTS_TCP_OPTIONS;\r
-#endif\r
-\r
-    // The bellow should be left zero\r
-    if (pPort->Config.HeaderDataSplit) {\r
-        nhsa.CurrentCapabilities = NDIS_HD_SPLIT_CAPS_SUPPORTS_HEADER_DATA_SPLIT;\r
-    } else {\r
-        nhsa.CurrentCapabilities = 0;\r
-    }\r
-\r
-    nhsa.HDSplitFlags = 0;\r
-    nhsa.BackfillSize = 0;\r
-    nhsa.MaxHeaderSize = 0;    \r
-\r
-    atr.HDSplitAttributes = &nhsa;\r
-\r
-    Status = NdisMSetMiniportAttributes(h_adapter,\r
-                    (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&atr);\r
-\r
-    if (nhsa.HDSplitFlags & NDIS_HD_SPLIT_ENABLE_HEADER_DATA_SPLIT) {\r
-        ASSERT(pPort->Config.HeaderDataSplit == TRUE);\r
-        pPort->Config.HeaderDataSplit = TRUE;\r
-    } \r
-    else {\r
-        ASSERT(pPort->Config.HeaderDataSplit == FALSE);\r
-        pPort->Config.HeaderDataSplit = FALSE;\r
-    }\r
-\r
-    return Status;\r
-}\r
-#endif\r
-\r
-/*++\r
-Routine Description:\r
-    the routine sets attributes that are associated with a miniport adapter.\r
-\r
-Arguments:\r
-    pPort - Pointer to port object\r
-\r
-Return Value:\r
-    NDIS_STATUS\r
-\r
-Note:\r
-    Should be called in PASSIVE_LEVEL\r
-    \r
---*/\r
-NDIS_STATUS\r
-SetAdapterRegistrationAttributes(\r
-       ipoib_adapter_t *p_adapter,\r
-       NDIS_HANDLE     h_adapter\r
-       )\r
-       {\r
-       NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES atr;\r
-       NTSTATUS Status;\r
-\r
-       NdisZeroMemory(&atr, sizeof(NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES));\r
-\r
-       /* setting registration attributes */\r
-\r
-       atr.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES;\r
-       atr.Header.Revision = NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES_REVISION_1;\r
-       atr.Header.Size = NDIS_SIZEOF_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES_REVISION_1;\r
-       //TODO NDIS60 Port or adapter\r
-       atr.MiniportAdapterContext = (NDIS_HANDLE)p_adapter; //(NDIS_HANDLE)pPort->p_adapter;\r
-       atr.AttributeFlags = NDIS_MINIPORT_ATTRIBUTES_BUS_MASTER;\r
-       atr.CheckForHangTimeInSeconds = 10;\r
-       atr.InterfaceType = NdisInterfacePci ;   // ???? UH\r
-       //TODO NDIS60 PNP or PCI ?\r
-       //RegistrationAttributes.InterfaceType = NdisInterfacePNPBus;\r
-\r
-       Status = NdisMSetMiniportAttributes(h_adapter,\r
-                       (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&atr);\r
-\r
-       return Status;\r
-}\r
-\r
-\r
-/*++\r
-Routine Description:\r
-    the routine sets generic attributes that are associated with a miniport \r
-    adapter.\r
-\r
-Arguments:\r
-    pPort - Pointer to port object\r
-\r
-Return Value:\r
-    NDIS_STATUS\r
-\r
-Note:\r
-    Should be called in PASSIVE_LEVEL\r
-    \r
---*/\r
-NDIS_STATUS\r
-SetGenericAttributes(\r
-    ipoib_adapter_t *p_adapter,\r
-    NDIS_HANDLE        h_adapter\r
-    )\r
-{\r
-    NDIS_STATUS Status;\r
-\r
-    NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES gat;\r
-    NdisZeroMemory(&gat, sizeof(NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES));\r
-\r
-       /* set up generic attributes */\r
-\r
-       gat.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES;\r
-       gat.Header.Revision = NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES_REVISION_1;\r
-       gat.Header.Size = sizeof(NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES);\r
-\r
-       gat.MediaType = NdisMedium802_3;    \r
-       gat.MaxXmitLinkSpeed = IPOIB_MEDIA_MAX_SPEED;\r
-       gat.MaxRcvLinkSpeed = IPOIB_MEDIA_MAX_SPEED;\r
-       gat.XmitLinkSpeed = IPOIB_MEDIA_MAX_SPEED; //TODO NDIS60 NDIS_LINK_SPEED_UNKNOWN\r
-       gat.RcvLinkSpeed = IPOIB_MEDIA_MAX_SPEED; // TODO NDIS60 NDIS_LINK_SPEED_UNKNOWN ???\r
-\r
-       gat.MediaConnectState = MediaConnectStateConnected; //TODO NDIS60 Check the current state\r
-       gat.MediaDuplexState = MediaDuplexStateFull;\r
-\r
-       gat.MtuSize = MAX_IB_MTU;\r
-       gat.LookaheadSize = MAX_XFER_BLOCK_SIZE;\r
-       gat.MacOptions = NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA | \r
-                                        NDIS_MAC_OPTION_TRANSFERS_NOT_PEND |\r
-                                        NDIS_MAC_OPTION_NO_LOOPBACK |\r
-                                        NDIS_MAC_OPTION_FULL_DUPLEX;\r
-                                       //NDIS_MAC_OPTION_8021P_PRIORITY; //TODO NDIS60\r
-                                       // DT: Enable for Header Data Split WHQL\r
-                                       // |  NDIS_MAC_OPTION_8021Q_VLAN;\r
-\r
-       gat.SupportedPacketFilters =    NDIS_PACKET_TYPE_DIRECTED |\r
-                                                                       NDIS_PACKET_TYPE_MULTICAST |\r
-                                                                       //NDIS_PACKET_TYPE_ALL_MULTICAST |\r
-                                                                       NDIS_PACKET_TYPE_BROADCAST;\r
-                                        \r
-       gat.MaxMulticastListSize = MAX_MCAST;\r
-\r
-       gat.MacAddressLength = HW_ADDR_LEN;\r
-       \r
-       NdisMoveMemory(gat.PermanentMacAddress,\r
-                                       p_adapter->mac.addr,\r
-                                       HW_ADDR_LEN);\r
-\r
-       NdisMoveMemory(gat.CurrentMacAddress,\r
-                                       p_adapter->params.conf_mac.addr,\r
-                                       HW_ADDR_LEN);\r
-\r
-\r
-       gat.PhysicalMediumType = NdisPhysicalMedium802_3;\r
-       gat.AccessType = NET_IF_ACCESS_BROADCAST; \r
-\r
-       gat.SupportedOidList = (PNDIS_OID)SUPPORTED_OIDS;\r
-       gat.SupportedOidListLength = sizeof(SUPPORTED_OIDS);\r
-\r
-\r
-       gat.DirectionType = NET_IF_DIRECTION_SENDRECEIVE; \r
-       gat.ConnectionType = NET_IF_CONNECTION_DEDICATED; \r
-       gat.IfType = IF_TYPE_ETHERNET_CSMACD; \r
-       gat.IfConnectorPresent = TRUE; \r
-       //TODO NDIS60 This value is absent for ETH driver\r
-       gat.AccessType = NET_IF_ACCESS_BROADCAST; // NET_IF_ACCESS_BROADCAST for a typical ethernet adapter\r
-\r
-\r
-       //TODO NDIS60 is it possible to reduce unsupported statistics\r
-       gat.SupportedStatistics = \r
-                               NDIS_STATISTICS_XMIT_OK_SUPPORTED |\r
-                               NDIS_STATISTICS_RCV_OK_SUPPORTED |\r
-                               NDIS_STATISTICS_XMIT_ERROR_SUPPORTED |\r
-                               NDIS_STATISTICS_RCV_ERROR_SUPPORTED |\r
-                               NDIS_STATISTICS_RCV_CRC_ERROR_SUPPORTED |\r
-                               NDIS_STATISTICS_RCV_NO_BUFFER_SUPPORTED |\r
-                               NDIS_STATISTICS_TRANSMIT_QUEUE_LENGTH_SUPPORTED;\r
-\r
-       //SupportedStatistics = NDIS_STATISTICS_XMIT_OK_SUPPORTED |\r
-                                                       // NDIS_STATISTICS_GEN_STATISTICS_SUPPORTED;\r
-\r
-\r
-    //\r
-    // Set power management capabilities\r
-    //\r
-    gat.PowerManagementCapabilities = NULL;\r
-#if 0\r
-    NDIS_PNP_CAPABILITIES PowerManagementCapabilities;\r
-    NdisZeroMemory(&PowerManagementCapabilities, sizeof(NDIS_PNP_CAPABILITIES));\r
-    if (MPIsPoMgmtSupported(pPort))\r
-    {\r
-        MPFillPoMgmtCaps(pPort, &PowerManagementCapabilities, &Status, &unUsed);\r
-        ASSERT(NT_SUCCESS(Status)); \r
-        gat.PowerManagementCapabilities = &PowerManagementCapabilities;\r
-    } \r
-    else\r
-    {\r
-        \r
-    }\r
-#endif\r
-\r
-    //\r
-    // Set RSS attributes\r
-    //\r
-    gat.RecvScaleCapabilities = NULL;\r
-#if 0\r
-    NDIS_RECEIVE_SCALE_CAPABILITIES RssCapabilities;\r
-    NdisZeroMemory(&RssCapabilities, sizeof(PNDIS_RECEIVE_SCALE_CAPABILITIES));\r
-    Status = MPFillRssCapabilities(pPort, &RssCapabilities, &unUsed);\r
-    if (NT_SUCCESS(Status)) \r
-    {\r
-        gat.RecvScaleCapabilities = &RssCapabilities;\r
-    } \r
-    else\r
-    {\r
-        //\r
-        // do not fail the call because of failure to get PM caps\r
-        //\r
-        Status = NDIS_STATUS_SUCCESS;\r
-        gat.RecvScaleCapabilities = NULL;\r
-    }\r
-#endif\r
-\r
-       Status = NdisMSetMiniportAttributes(h_adapter,\r
-                       (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&gat);\r
-\r
-       return Status;\r
-}\r
-\r
-\r
-/*++\r
-Routine Description:\r
-    The routine sets an NDIS_OFFLOAD structure indicates the current offload \r
-    capabilities that are provided by the miniport adapter \r
-    \r
-Arguments:\r
-    pPort - a pointer to port object\r
-    offload - reference to NDIS_OFFLOAD object that should be filled\r
-\r
-Return Value:\r
-    None.\r
-    \r
---*/\r
-static\r
-void\r
-OffloadConfig(\r
-       ipoib_adapter_t *p_adapter,\r
-       NDIS_OFFLOAD *p_offload\r
-       )\r
-{ \r
-\r
-       ULONG ulEncapsulation = NDIS_ENCAPSULATION_IEEE_802_3 | NDIS_ENCAPSULATION_IEEE_802_3_P_AND_Q;\r
-\r
-       NdisZeroMemory(p_offload, NDIS_SIZEOF_NDIS_OFFLOAD_REVISION_1);\r
-\r
-       p_offload->Header.Type = NDIS_OBJECT_TYPE_OFFLOAD;\r
-       p_offload->Header.Revision = NDIS_OFFLOAD_REVISION_1; // BUGBUG: do we need to support revision 2? UH 17-May-2008\r
-       p_offload->Header.Size = NDIS_SIZEOF_NDIS_OFFLOAD_REVISION_1;\r
-\r
-       p_offload->Checksum.IPv4Transmit.Encapsulation = ulEncapsulation;\r
-       p_offload->Checksum.IPv4Transmit.IpOptionsSupported = \r
-       p_offload->Checksum.IPv4Transmit.TcpOptionsSupported = \r
-       p_offload->Checksum.IPv4Transmit.TcpChecksum = \r
-       p_offload->Checksum.IPv4Transmit.UdpChecksum = \r
-       p_offload->Checksum.IPv4Transmit.IpChecksum =!!(p_adapter->params.send_chksum_offload);\r
-\r
-       p_offload->Checksum.IPv4Receive.Encapsulation = ulEncapsulation;\r
-       p_offload->Checksum.IPv4Receive.IpOptionsSupported = \r
-       p_offload->Checksum.IPv4Receive.TcpOptionsSupported = \r
-       p_offload->Checksum.IPv4Receive.TcpChecksum = \r
-       p_offload->Checksum.IPv4Receive.UdpChecksum = \r
-       p_offload->Checksum.IPv4Receive.IpChecksum = !!(p_adapter->params.recv_chksum_offload); //TODO NDIS60\r
-\r
-\r
-       p_offload->Checksum.IPv6Transmit.Encapsulation = ulEncapsulation;\r
-       p_offload->Checksum.IPv6Transmit.IpExtensionHeadersSupported = \r
-       p_offload->Checksum.IPv6Transmit.TcpOptionsSupported =\r
-       p_offload->Checksum.IPv6Transmit.TcpChecksum = \r
-       p_offload->Checksum.IPv6Transmit.UdpChecksum = FALSE;\r
-\r
-\r
-       p_offload->Checksum.IPv6Receive.Encapsulation = ulEncapsulation;\r
-       p_offload->Checksum.IPv6Receive.IpExtensionHeadersSupported = \r
-       p_offload->Checksum.IPv6Receive.TcpOptionsSupported = \r
-       p_offload->Checksum.IPv6Receive.TcpChecksum = \r
-       p_offload->Checksum.IPv6Receive.UdpChecksum = FALSE;\r
-\r
-       if (p_adapter->params.lso)\r
-       {\r
-               p_offload->LsoV1.IPv4.Encapsulation = ulEncapsulation;\r
-               p_offload->LsoV1.IPv4.MaxOffLoadSize = LARGE_SEND_OFFLOAD_SIZE;\r
-#define LSO_MIN_SEG_COUNT 2\r
-               p_offload->LsoV1.IPv4.MinSegmentCount = LSO_MIN_SEG_COUNT;\r
-       \r
-               \r
-               p_offload->LsoV1.IPv4.TcpOptions = NDIS_OFFLOAD_SUPPORTED;\r
-               p_offload->LsoV1.IPv4.IpOptions = NDIS_OFFLOAD_SUPPORTED;\r
-\r
-               p_offload->LsoV2.IPv4.Encapsulation = ulEncapsulation;\r
-               p_offload->LsoV2.IPv4.MaxOffLoadSize = LARGE_SEND_OFFLOAD_SIZE;\r
-               p_offload->LsoV2.IPv4.MinSegmentCount = LSO_MIN_SEG_COUNT;\r
-\r
-               p_offload->LsoV2.IPv6.Encapsulation = ulEncapsulation;\r
-               p_offload->LsoV2.IPv6.MaxOffLoadSize = LARGE_SEND_OFFLOAD_SIZE;\r
-               p_offload->LsoV2.IPv6.MinSegmentCount = LSO_MIN_SEG_COUNT;\r
-\r
-               p_offload->LsoV2.IPv6.IpExtensionHeadersSupported = NDIS_OFFLOAD_NOT_SUPPORTED;\r
-               p_offload->LsoV2.IPv6.TcpOptionsSupported = NDIS_OFFLOAD_SUPPORTED;\r
-       }\r
-\r
-}\r
-\r
-\r
-/*++\r
-Routine Description:\r
-    The routine sets an NDIS_OFFLOAD structure that indicates all the task \r
-    offload capabilites that are supported by the NIC. These capabilities include\r
-    capabilities that are currently disabled by standardized keywords in the registry. \r
-    \r
-Arguments:\r
-    offload - reference to NDIS_OFFLOAD object that should be filled\r
-\r
-Return Value:\r
-    None.\r
-    \r
---*/\r
-static\r
-void\r
-OffloadCapabilities(\r
-       NDIS_OFFLOAD    *p_offload\r
-       )\r
-{ \r
-       ULONG ulEncapsulation = NDIS_ENCAPSULATION_IEEE_802_3 | NDIS_ENCAPSULATION_IEEE_802_3_P_AND_Q ;\r
-       NdisZeroMemory(p_offload, NDIS_SIZEOF_NDIS_OFFLOAD_REVISION_1);    \r
-\r
-       p_offload->Header.Type = NDIS_OBJECT_TYPE_OFFLOAD;\r
-       p_offload->Header.Revision = NDIS_OFFLOAD_REVISION_1; // BUGBUG: do we need to support revision 2? UH 17-May-2008\r
-       p_offload->Header.Size = NDIS_SIZEOF_NDIS_OFFLOAD_REVISION_1;\r
-\r
-       p_offload->Checksum.IPv4Transmit.Encapsulation = ulEncapsulation;\r
-       p_offload->Checksum.IPv4Transmit.IpOptionsSupported = TRUE;\r
-       p_offload->Checksum.IPv4Transmit.TcpOptionsSupported = TRUE;\r
-       p_offload->Checksum.IPv4Transmit.TcpChecksum = TRUE;\r
-       p_offload->Checksum.IPv4Transmit.UdpChecksum = TRUE;\r
-       p_offload->Checksum.IPv4Transmit.IpChecksum = TRUE;\r
-\r
-       p_offload->Checksum.IPv4Receive.Encapsulation = ulEncapsulation;\r
-       p_offload->Checksum.IPv4Receive.IpOptionsSupported = TRUE;\r
-       p_offload->Checksum.IPv4Receive.TcpOptionsSupported = TRUE;\r
-       p_offload->Checksum.IPv4Receive.TcpChecksum = TRUE;\r
-       p_offload->Checksum.IPv4Receive.UdpChecksum = TRUE; \r
-       p_offload->Checksum.IPv4Receive.IpChecksum = TRUE;\r
-\r
-\r
-       //\r
-       //  BUGBUG::\r
-       //  During a HW bug that didn't handle correctly packets with \r
-       //  IPv6 Extension Headers -> we set IpExtensionHeadersSupported to TRUE\r
-       //\r
-       p_offload->Checksum.IPv6Transmit.Encapsulation = ulEncapsulation;\r
-       p_offload->Checksum.IPv6Transmit.IpExtensionHeadersSupported = TRUE;\r
-       p_offload->Checksum.IPv6Transmit.TcpOptionsSupported = TRUE;\r
-       p_offload->Checksum.IPv6Transmit.TcpChecksum = TRUE;\r
-       p_offload->Checksum.IPv6Transmit.UdpChecksum = TRUE;\r
-\r
-\r
-       p_offload->Checksum.IPv6Receive.Encapsulation = ulEncapsulation;\r
-       p_offload->Checksum.IPv6Receive.IpExtensionHeadersSupported = TRUE;\r
-       p_offload->Checksum.IPv6Receive.TcpOptionsSupported = TRUE;\r
-       p_offload->Checksum.IPv6Receive.TcpChecksum = TRUE;\r
-       p_offload->Checksum.IPv6Receive.UdpChecksum = TRUE;\r
-\r
-       p_offload->LsoV1.IPv4.Encapsulation = ulEncapsulation;\r
-       p_offload->LsoV1.IPv4.MaxOffLoadSize = LARGE_SEND_OFFLOAD_SIZE;\r
-       p_offload->LsoV1.IPv4.MinSegmentCount = 2;\r
-       p_offload->LsoV1.IPv4.TcpOptions = NDIS_OFFLOAD_SUPPORTED;\r
-       p_offload->LsoV1.IPv4.IpOptions = NDIS_OFFLOAD_SUPPORTED;\r
-\r
-       p_offload->LsoV2.IPv4.Encapsulation = ulEncapsulation;\r
-       p_offload->LsoV2.IPv4.MaxOffLoadSize = LARGE_SEND_OFFLOAD_SIZE;\r
-       p_offload->LsoV2.IPv4.MinSegmentCount = 2;\r
-\r
-       p_offload->LsoV2.IPv6.Encapsulation = ulEncapsulation;\r
-       p_offload->LsoV2.IPv6.MaxOffLoadSize = LARGE_SEND_OFFLOAD_SIZE;\r
-       p_offload->LsoV2.IPv6.MinSegmentCount = 2;\r
-\r
-       p_offload->LsoV2.IPv6.IpExtensionHeadersSupported = NDIS_OFFLOAD_NOT_SUPPORTED;\r
-       p_offload->LsoV2.IPv6.TcpOptionsSupported = NDIS_OFFLOAD_SUPPORTED;\r
-\r
-       }\r
-\r
-\r
-/*++\r
-Routine Description:\r
-    The routine sets offload attributes that are associated with a miniport \r
-    adapter.\r
-\r
-Arguments:\r
-    pPort - Pointer to port object\r
-\r
-Return Value:\r
-    NDIS_STATUS\r
-\r
-Note:\r
-    Should be called in PASSIVE_LEVEL\r
-    \r
---*/\r
-NDIS_STATUS\r
-SetOffloadAttributes(\r
-       ipoib_adapter_t *p_adapter,\r
-       NDIS_HANDLE     h_adapter\r
-       )\r
-{\r
-       NDIS_STATUS Status;\r
-       NDIS_OFFLOAD offload,hwOffload;\r
-       //ULONG ulEncapsulation = NDIS_ENCAPSULATION_IEEE_802_3 | NDIS_ENCAPSULATION_IEEE_802_3_P_AND_Q;\r
-\r
-       NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES oat;    \r
-       NdisZeroMemory(&oat, sizeof(NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES));\r
-\r
-       oat.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES;\r
-       oat.Header.Revision = NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES_REVISION_1;\r
-       oat.Header.Size = NDIS_SIZEOF_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES_REVISION_1;\r
-\r
-\r
-       OffloadConfig(p_adapter, &offload);\r
-\r
-\r
-       OffloadCapabilities(&hwOffload);\r
-\r
-       oat.DefaultOffloadConfiguration = &offload;\r
-       oat.HardwareOffloadCapabilities = &hwOffload;\r
-\r
-       Status = NdisMSetMiniportAttributes(h_adapter,\r
-                               (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&oat);\r
-\r
-       return Status;\r
-}\r
-\r
-\r
-/*++\r
-\r
-Routine Description:\r
-    An NDIS 6.0 miniport driver must call NdisMSetMiniportAttributes\r
-    at least twice. The first call is to register itself with NDIS.\r
-    The second call is to register the miniport driver's general\r
-    attributes with NDIS.\r
-\r
-    NdisMSetMiniportAttributes takes a parameter of type\r
-    NDIS_MINIPORT_ADAPTER_ATTRIBUTES, which is a union of several miniport\r
-    adapter attributes. Miniport drivers must first call\r
-    NdisMSetMiniportAttributes and pass in an\r
-    NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES structure\r
-    that contains the pointer to its own context area, attribute flags,\r
-    check-for-hang time, and interface type.\r
-\r
-    All NDIS 6.0 miniport drivers are deserialized by default.\r
-\r
-Arguments:\r
-    pPort - Pointer to port object\r
-\r
-Return Value:\r
-    NDIS_STATUS\r
-\r
-Note:\r
-    Should be called in PASSIVE_LEVEL\r
-    \r
---*/\r
-       NDIS_STATUS\r
-       SetAttributes(\r
-       ipoib_adapter_t *p_adapter,\r
-       NDIS_HANDLE     h_adapter\r
-       )\r
-       {\r
-       NTSTATUS Status;\r
-\r
-\r
-       Status = SetDeviceRegistrationAttributes(p_adapter, h_adapter);\r
-       if (Status != NDIS_STATUS_SUCCESS)\r
-       {\r
-               //ETH_PRINT(TRACE_LEVEL_ERROR, ETH_INIT, "Set device registration failed Error=0x%x\n", Status);\r
-               return Status;\r
-       }\r
-\r
-\r
-       Status = SetAdapterRegistrationAttributes(p_adapter, h_adapter);\r
-       if (Status != NDIS_STATUS_SUCCESS)\r
-       {\r
-               //ETH_PRINT(TRACE_LEVEL_ERROR, ETH_INIT, "Set adapter attributes failed Error=0x%x\n", Status);\r
-               return Status;\r
-       }\r
-\r
-       Status = SetOffloadAttributes(p_adapter, h_adapter);\r
-       if (Status != NDIS_STATUS_SUCCESS)\r
-       {\r
-               //ETH_PRINT(TRACE_LEVEL_ERROR, ETH_INIT, "Set OFFLOAD attributes failed Error=0x%x\n", Status);\r
-               return Status;\r
-       }\r
-       \r
-#if 0\r
-       if(!pPort->Config.fWHQL)\r
-       {\r
-               Status = SetHardwareAssistAttributes(pPort);\r
-               if (Status != NDIS_STATUS_SUCCESS)\r
-               {\r
-                   //ETH_PRINT(TRACE_LEVEL_ERROR, ETH_INIT, "Set Hardware Assist Attributes failed Error=0x%x\n", Status);\r
-                   return Status;\r
-               }\r
-       }\r
-#endif\r
-\r
-       Status = SetGenericAttributes(p_adapter, h_adapter);\r
-       if (Status != NDIS_STATUS_SUCCESS)\r
-       {\r
-           //ETH_PRINT(TRACE_LEVEL_ERROR, ETH_INIT, "Set generic attributes failed Error=0x%x\n", Status);\r
-           return Status;\r
-       }\r
-\r
-       return Status;\r
-}\r
-\r
-\r
-\r
-NDIS_STATUS\r
-InitNdisScatterGatherDma(\r
-       ipoib_adapter_t *p_adapter,\r
-       NDIS_HANDLE             h_adapter\r
-       )\r
-{\r
-       NDIS_STATUS                                             status;\r
-       NDIS_SG_DMA_DESCRIPTION                 DmaDescription;\r
-       \r
-       NdisZeroMemory(&DmaDescription, sizeof(DmaDescription));\r
-\r
-       DmaDescription.Header.Type = NDIS_OBJECT_TYPE_SG_DMA_DESCRIPTION;\r
-       DmaDescription.Header.Revision = NDIS_SG_DMA_DESCRIPTION_REVISION_1;\r
-       DmaDescription.Header.Size = sizeof(NDIS_SG_DMA_DESCRIPTION);\r
-       DmaDescription.Flags = NDIS_SG_DMA_64_BIT_ADDRESS; \r
-       //\r
-       // Even if offload is enabled, the packet size for mapping shouldn't change\r
-       //\r
-       DmaDescription.MaximumPhysicalMapping = LARGE_SEND_OFFLOAD_SIZE + LSO_MAX_HEADER;\r
-\r
-       DmaDescription.ProcessSGListHandler = ipoib_process_sg_list;\r
-       DmaDescription.SharedMemAllocateCompleteHandler = NULL;\r
-\r
-       DmaDescription.Header.Type = NDIS_OBJECT_TYPE_SG_DMA_DESCRIPTION;\r
-       DmaDescription.Header.Revision = NDIS_SG_DMA_DESCRIPTION_REVISION_1;\r
-       DmaDescription.Header.Size = sizeof(NDIS_SG_DMA_DESCRIPTION);//NDIS_SIZEOF_SG_DMA_DESCRIPTION_REVISION_1;\r
-\r
-       DmaDescription.Flags = NDIS_SG_DMA_64_BIT_ADDRESS;\r
-       //DmaDescription.MaximumPhysicalMapping = pPort->p_adapter->params.xfer_block_size;\r
-\r
-       DmaDescription.ProcessSGListHandler = ipoib_process_sg_list;\r
-       DmaDescription.SharedMemAllocateCompleteHandler = NULL;\r
-       \r
-       status = NdisMRegisterScatterGatherDma(\r
-                                       h_adapter,\r
-                                       &DmaDescription,\r
-                                       &p_adapter->NdisMiniportDmaHandle);\r
-\r
-       if( status != NDIS_STATUS_SUCCESS )\r
-       {\r
-               //TODO NDIS60\r
-               //ipoib_destroy_adapter( p_adapter );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                                ("NdisMRegisterScatterGatherDma returned 0x%.8x.\n", status) );\r
-               \r
-       }\r
-       //NDIS sets this value before it returns from NdisMRegisterScatterGatherDma. \r
-               //Miniport drivers should use this size to preallocate memory for each scatter/gather list. \r
-       p_adapter->sg_list_size = DmaDescription.ScatterGatherListSize ;\r
-       \r
-       return status;\r
-}\r
-\r
-\r
-NDIS_STATUS \r
-MPInitializeTest(\r
-    IN  NDIS_HANDLE                        MiniportAdapterHandle,\r
-    IN  NDIS_HANDLE                        MiniportDriverContext,\r
-    IN  PNDIS_MINIPORT_INIT_PARAMETERS     MiniportInitParameters\r
-    )\r
-/*++\r
-Routine Description:\r
-\r
-    MiniportInitialize handler\r
-\r
-Arguments:\r
-\r
-    MiniportAdapterHandle   The handle NDIS uses to refer to us\r
-    MiniportDriverContext   Handle passed to NDIS when we registered the driver\r
-    MiniportInitParameters  Initialization parameters\r
-    \r
-Return Value:\r
-\r
-    NDIS_STATUS_SUCCESS unless something goes wrong\r
-\r
---*/\r
-{\r
-\r
-       NDIS_STATUS Status = NDIS_STATUS_SUCCESS;\r
-    //PMP_PORT pPort = NULL;\r
-    ipoib_adapter_t    *p_adapter;\r
-//    NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS  Interrupt;\r
-    NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES   RegistrationAttributes;\r
-    NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES        GeneralAttributes;\r
-    //NDIS_TIMER_CHARACTERISTICS                      Timer;               \r
-    NDIS_PNP_CAPABILITIES          PowerManagementCapabilities;    \r
-    //PMP_ADAPTER     Adapter = NULL;\r
-    //PVOID           NetworkAddress;\r
-//    UINT            index;\r
-//    UINT            uiPnpCommandValue;\r
-//    ULONG           ulInfoLen;\r
-    //ULONG           InterruptVersion;\r
-//    LARGE_INTEGER   liDueTime;\r
-    //BOOLEAN         isTimerAlreadyInQueue = FALSE;\r
-//     uint8_t portId;\r
-       ib_api_status_t         ib_status;\r
-#if 0   \r
-#if DBG\r
-    LARGE_INTEGER   TS, TD, TE;\r
-#endif\r
-#endif\r
-\r
-    cl_dbg_out ("====> MPInitialize\n");\r
-\r
-    UNREFERENCED_PARAMETER(MiniportDriverContext);\r
-    UNREFERENCED_PARAMETER(MiniportInitParameters);\r
-  \r
-\r
-\r
-       \r
-\r
-    {\r
-\r
-               ib_status = ipoib_create_adapter(MiniportDriverContext, MiniportAdapterHandle, &p_adapter );\r
-               if( ib_status != IB_SUCCESS )\r
-               {\r
-                       ASSERT(FALSE);\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("ipoib_create_adapter returned status %d.\n", ib_status ) );\r
-                       return NDIS_STATUS_FAILURE;\r
-               }\r
-\r
-       \r
-\r
-        NdisZeroMemory(&RegistrationAttributes, sizeof(NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES));\r
-        NdisZeroMemory(&GeneralAttributes, sizeof(NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES));\r
-\r
-        //\r
-        // setting registration attributes\r
-        //\r
-        RegistrationAttributes.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES;\r
-        RegistrationAttributes.Header.Revision = NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES_REVISION_1;\r
-        RegistrationAttributes.Header.Size = sizeof(NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES);\r
-\r
-        RegistrationAttributes.MiniportAdapterContext = (NDIS_HANDLE)p_adapter;\r
-        RegistrationAttributes.AttributeFlags = NDIS_MINIPORT_ATTRIBUTES_HARDWARE_DEVICE | \r
-                                                NDIS_MINIPORT_ATTRIBUTES_BUS_MASTER;\r
-        \r
-        RegistrationAttributes.CheckForHangTimeInSeconds = 2;\r
-        RegistrationAttributes.InterfaceType = NdisInterfacePci;\r
-\r
-        Status = NdisMSetMiniportAttributes(MiniportAdapterHandle,\r
-                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&RegistrationAttributes);\r
-\r
-        if (Status != NDIS_STATUS_SUCCESS)\r
-        {\r
-            //break;\r
-            return Status;\r
-        }\r
-\r
-#if 0         \r
-        //\r
-        // Read the registry parameters\r
-        //\r
-        Status = NICReadRegParameters(Adapter);\r
-        \r
-        if (Status != NDIS_STATUS_SUCCESS) \r
-        {\r
-            break;\r
-        }\r
-\r
-       \r
-        //\r
-        // Find the physical adapter\r
-        //\r
-        Status = MpFindAdapter(Adapter, MiniportInitParameters->AllocatedResources);\r
-        if (Status != NDIS_STATUS_SUCCESS)\r
-        {\r
-            break;\r
-        }\r
-\r
-        //\r
-        // Map bus-relative IO range to system IO space\r
-        //\r
-        Status = NdisMRegisterIoPortRange(\r
-                     (PVOID *)&Adapter->PortOffset,\r
-                     Adapter->AdapterHandle,\r
-                     Adapter->IoBaseAddress,\r
-                     Adapter->IoRange);\r
-        if (Status != NDIS_STATUS_SUCCESS)\r
-        {\r
-            DBGPRINT(MP_ERROR, ("NdisMRegisterioPortRange failed\n"));\r
-    \r
-            NdisWriteErrorLogEntry(\r
-                Adapter->AdapterHandle,\r
-                NDIS_ERROR_CODE_BAD_IO_BASE_ADDRESS,\r
-                0);\r
-        \r
-            break;\r
-        }\r
-        \r
-        //\r
-        // Read additional info from NIC such as MAC address\r
-        //\r
-        Status = NICReadAdapterInfo(Adapter);\r
-        if (Status != NDIS_STATUS_SUCCESS) \r
-        {\r
-            break;\r
-        }\r
-\r
-#endif\r
-        //\r
-        // set up generic attributes\r
-        //\r
-               \r
-\r
-        GeneralAttributes.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES;\r
-        GeneralAttributes.Header.Revision = NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES_REVISION_1;\r
-        GeneralAttributes.Header.Size = sizeof(NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES);\r
-\r
-        GeneralAttributes.MediaType = NdisMedium802_3;\r
-\r
-        GeneralAttributes.MtuSize = DEFAULT_MTU;\r
-#define LINE_SPEED_10_GBTS 10000000000\r
-        GeneralAttributes.MaxXmitLinkSpeed = LINE_SPEED_10_GBTS;\r
-        GeneralAttributes.MaxRcvLinkSpeed = LINE_SPEED_10_GBTS;\r
-        GeneralAttributes.XmitLinkSpeed = NDIS_LINK_SPEED_UNKNOWN;\r
-        GeneralAttributes.RcvLinkSpeed = NDIS_LINK_SPEED_UNKNOWN;\r
-        GeneralAttributes.MediaConnectState = MediaConnectStateUnknown;\r
-        GeneralAttributes.MediaDuplexState = MediaDuplexStateUnknown;\r
-        GeneralAttributes.LookaheadSize = MAX_XFER_BLOCK_SIZE;\r
-#if 0\r
-        MPFillPoMgmtCaps (Adapter, \r
-                          &PowerManagementCapabilities, \r
-                          &Status,\r
-                          &ulInfoLen);\r
-#endif\r
-               NdisZeroMemory(&PowerManagementCapabilities, sizeof(NDIS_PNP_CAPABILITIES));\r
-        Status = NDIS_STATUS_NOT_SUPPORTED;\r
-       // ulInfoLen = 0;\r
-\r
-        if (Status == NDIS_STATUS_SUCCESS)\r
-        {\r
-            GeneralAttributes.PowerManagementCapabilities = &PowerManagementCapabilities;\r
-        }\r
-        else\r
-        {\r
-            GeneralAttributes.PowerManagementCapabilities = NULL;\r
-        }\r
-\r
-        //\r
-        // do not fail the call because of failure to get PM caps\r
-        //\r
-        Status = NDIS_STATUS_SUCCESS;\r
-\r
-        GeneralAttributes.MacOptions = NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA | \r
-                                       NDIS_MAC_OPTION_TRANSFERS_NOT_PEND |\r
-                                       NDIS_MAC_OPTION_NO_LOOPBACK;\r
-\r
-        GeneralAttributes.SupportedPacketFilters = NDIS_PACKET_TYPE_DIRECTED |\r
-                                                   NDIS_PACKET_TYPE_MULTICAST |\r
-                                                   NDIS_PACKET_TYPE_ALL_MULTICAST |\r
-                                                   NDIS_PACKET_TYPE_BROADCAST;\r
-        \r
-        GeneralAttributes.MaxMulticastListSize = MAX_MCAST;\r
-        GeneralAttributes.MacAddressLength = HW_ADDR_LEN;\r
-      NdisMoveMemory(GeneralAttributes.PermanentMacAddress,\r
-                               p_adapter->mac.addr,\r
-                               HW_ADDR_LEN);\r
-\r
-       NdisMoveMemory(GeneralAttributes.CurrentMacAddress,\r
-                               p_adapter->params.conf_mac.addr,\r
-                               HW_ADDR_LEN);\r
-        GeneralAttributes.RecvScaleCapabilities = NULL;\r
-        GeneralAttributes.AccessType = NET_IF_ACCESS_BROADCAST; // NET_IF_ACCESS_BROADCAST for a typical ethernet adapter\r
-        GeneralAttributes.DirectionType = NET_IF_DIRECTION_SENDRECEIVE; // NET_IF_DIRECTION_SENDRECEIVE for a typical ethernet adapter\r
-        GeneralAttributes.ConnectionType = NET_IF_CONNECTION_DEDICATED;  // NET_IF_CONNECTION_DEDICATED for a typical ethernet adapter\r
-        GeneralAttributes.IfType = IF_TYPE_ETHERNET_CSMACD; // IF_TYPE_ETHERNET_CSMACD for a typical ethernet adapter (regardless of speed)\r
-        GeneralAttributes.IfConnectorPresent = TRUE; // RFC 2665 TRUE if physical adapter\r
-\r
-        GeneralAttributes.SupportedStatistics = NDIS_STATISTICS_XMIT_OK_SUPPORTED |\r
-                                                NDIS_STATISTICS_RCV_OK_SUPPORTED |\r
-                                                NDIS_STATISTICS_XMIT_ERROR_SUPPORTED |\r
-                                                NDIS_STATISTICS_RCV_ERROR_SUPPORTED |\r
-                                                NDIS_STATISTICS_RCV_CRC_ERROR_SUPPORTED |\r
-                                                NDIS_STATISTICS_RCV_NO_BUFFER_SUPPORTED |\r
-                                                NDIS_STATISTICS_TRANSMIT_QUEUE_LENGTH_SUPPORTED |\r
-                                                NDIS_STATISTICS_GEN_STATISTICS_SUPPORTED;\r
-                      \r
-        GeneralAttributes.SupportedOidList = NICSupportedOidsTest;\r
-        GeneralAttributes.SupportedOidListLength = sizeof(NICSupportedOidsTest);\r
-\r
-        Status = NdisMSetMiniportAttributes(MiniportAdapterHandle,\r
-                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&GeneralAttributes);\r
-\r
-\r
-#if 0        \r
-        //\r
-        // Allocate all other memory blocks including shared memory\r
-        //\r
-        Status = NICAllocAdapterMemory(Adapter);\r
-        if (Status != NDIS_STATUS_SUCCESS) \r
-        {\r
-            break;\r
-        }\r
-        //\r
-        // Init send data structures\r
-        //\r
-        NICInitSend(Adapter);\r
-\r
-        //\r
-        // Init receive data structures\r
-        //\r
-        Status = NICInitRecv(Adapter);\r
-        if (Status != NDIS_STATUS_SUCCESS)\r
-        {\r
-            break;\r
-        }\r
-        //\r
-        // Map bus-relative registers to virtual system-space\r
-        // \r
-        Status = NdisMMapIoSpace(\r
-                     (PVOID *) &(Adapter->CSRAddress),\r
-                     Adapter->AdapterHandle,\r
-                     Adapter->MemPhysAddress,\r
-                     NIC_MAP_IOSPACE_LENGTH);\r
-        if (Status != NDIS_STATUS_SUCCESS)\r
-        {\r
-            DBGPRINT(MP_ERROR, ("NdisMMapIoSpace failed\n"));\r
-    \r
-            NdisWriteErrorLogEntry(\r
-                Adapter->AdapterHandle,\r
-                NDIS_ERROR_CODE_RESOURCE_CONFLICT,\r
-                1,\r
-                ERRLOG_MAP_IO_SPACE);\r
-        \r
-            break;\r
-        }\r
-\r
-        DBGPRINT(MP_INFO, ("CSRAddress="PTR_FORMAT"\n", Adapter->CSRAddress));\r
-\r
-        //\r
-        // Disable interrupts here which is as soon as possible\r
-        //\r
-        NICDisableInterrupt(Adapter);\r
-#endif\r
-                     \r
-        //\r
-        // Register the interrupt\r
-        //\r
-        //\r
-        \r
-        //\r
-        // the embeded NDIS interrupt structure is already zero'ed out\r
-        // as part of the adapter structure\r
-        //\r
- #if 0\r
-        NdisZeroMemory(&Interrupt, sizeof(NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS));\r
-        \r
-        Interrupt.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_INTERRUPT;\r
-        Interrupt.Header.Revision = NDIS_MINIPORT_INTERRUPT_REVISION_1;\r
-        Interrupt.Header.Size = sizeof(NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS);\r
-\r
-        Interrupt.InterruptHandler = MPIsr;\r
-        Interrupt.InterruptDpcHandler = MPHandleInterrupt;\r
-        Interrupt.DisableInterruptHandler = NULL;\r
-        Interrupt.EnableInterruptHandler = NULL;\r
-\r
-\r
-\r
-        Status = NdisMRegisterInterruptEx(Adapter->AdapterHandle,\r
-                                          Adapter,\r
-                                          &Interrupt,\r
-                                          &Adapter->NdisInterruptHandle\r
-                                          );\r
-        \r
-                                        \r
-        if (Status != NDIS_STATUS_SUCCESS)\r
-        {\r
-            DBGPRINT(MP_ERROR, ("NdisMRegisterInterrupt failed\n"));\r
-    \r
-            NdisWriteErrorLogEntry(\r
-                Adapter->AdapterHandle,\r
-                NDIS_ERROR_CODE_INTERRUPT_CONNECT,\r
-                0);\r
-        \r
-            break;\r
-        }\r
-        \r
-        //\r
-        // If the driver support MSI\r
-        //\r
-        Adapter->InterruptType = Interrupt.InterruptType;\r
-\r
-        if (Adapter->InterruptType == NDIS_CONNECT_MESSAGE_BASED)\r
-        {\r
-            Adapter->MessageInfoTable = Interrupt.MessageInfoTable;\r
-        }\r
-        \r
-        //\r
-        // If the driver supports MSI, here it should what kind of interrupt is granted. If MSI is granted,\r
-        // the driver can check Adapter->MessageInfoTable to get MSI information\r
-        //\r
-        \r
-        \r
-        MP_SET_FLAG(Adapter, fMP_ADAPTER_INTERRUPT_IN_USE);\r
-\r
-        //\r
-        // Test our adapter hardware\r
-        //\r
-        Status = NICSelfTest(Adapter);\r
-        if (Status != NDIS_STATUS_SUCCESS)\r
-        {\r
-            break;\r
-        }\r
-        \r
-        //\r
-        // Init the hardware and set up everything\r
-        //\r
-        Status = NICInitializeAdapter(Adapter);\r
-        if (Status != NDIS_STATUS_SUCCESS)\r
-        {\r
-            break;\r
-        }\r
-        \r
-        //\r
-        // initial state is paused\r
-        //\r
-        Adapter->AdapterState = NicPaused;\r
-        \r
-        //\r
-        // Set the link detection flag\r
-        //\r
-        MP_SET_FLAG(Adapter, fMP_ADAPTER_LINK_DETECTION);\r
-      \r
-        //\r
-        // Increment the reference count so halt handler will wait \r
-        //\r
-        MP_INC_REF(Adapter);        \r
-\r
-        //\r
-        // Enable the interrupt\r
-        //\r
-        NICEnableInterrupt(Adapter);\r
-\r
-        \r
-        NdisZeroMemory(&Timer, sizeof(NDIS_TIMER_CHARACTERISTICS));\r
-        \r
-        Timer.Header.Type = NDIS_OBJECT_TYPE_TIMER_CHARACTERISTICS;\r
-        Timer.Header.Revision = NDIS_TIMER_CHARACTERISTICS_REVISION_1;\r
-        Timer.Header.Size = sizeof(NDIS_TIMER_CHARACTERISTICS);\r
-\r
-        Timer.AllocationTag = NIC_TAG;\r
-        Timer.TimerFunction = MpLinkDetectionDpc;\r
-        Timer.FunctionContext = Adapter;\r
-\r
-        //\r
-        // Minimize init-time\r
-        //\r
-        Status = NdisAllocateTimerObject(\r
-            Adapter->AdapterHandle,\r
-            &Timer,\r
-            &Adapter->LinkDetectionTimerHandle);\r
-\r
-        if (Status != NDIS_STATUS_SUCCESS)\r
-        {\r
-            break;\r
-        }\r
-\r
-        liDueTime.QuadPart = NIC_LINK_DETECTION_DELAY;\r
-        isTimerAlreadyInQueue =NdisSetTimerObject(Adapter->LinkDetectionTimerHandle, liDueTime, 0, NULL);\r
-        ASSERT(!isTimerAlreadyInQueue);\r
-#endif       \r
-       }  \r
-#if 0\r
-    if (Adapter && (Status != NDIS_STATUS_SUCCESS))\r
-    {\r
-        //\r
-        // Undo everything if it failed\r
-        //\r
-        MP_DEC_REF(Adapter);\r
-        MpFreeAdapter(Adapter);\r
-    }\r
-\r
-    DBGPRINT_S(Status, ("<==== MPInitialize, Status=%x\n", Status));\r
-#endif\r
-               /* Create the adapter adapter */\r
-               ib_status = ipoib_start_adapter( p_adapter );\r
-               if( ib_status != IB_SUCCESS )\r
-               {\r
-                       ASSERT(FALSE);\r
-\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("ipoib_start_adapter returned status %d.\n", ib_status ) );\r
-                       return NDIS_STATUS_FAILURE;\r
-               }\r
-       \r
-               ipoib_ref_ibat();\r
-    return NDIS_STATUS_SUCCESS;\r
-}\r
-\r
-\r
-\r
-NDIS_STATUS\r
-ipoib_initialize_ex(\r
-               IN NDIS_HANDLE  h_adapter,\r
-               IN NDIS_HANDLE  config_context,\r
-               IN PNDIS_MINIPORT_INIT_PARAMETERS  MiniportInitParameters)\r
-       {\r
-               NDIS_STATUS             status;\r
-               ib_api_status_t         ib_status;\r
-               ipoib_adapter_t         *p_adapter;\r
-               //NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES RegistrationAttributes;\r
-               //NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES              GeneralAttributes;\r
-#if IPOIB_USE_DMA\r
-               //NDIS_SG_DMA_DESCRIPTION       DmaDescription;\r
-#endif\r
-               IPOIB_ENTER( IPOIB_DBG_INIT );\r
-       \r
-#ifdef _DEBUG_\r
-               PAGED_CODE();\r
-#endif\r
-               \r
-               UNUSED_PARAM( config_context );\r
-               UNUSED_PARAM( MiniportInitParameters );\r
-               \r
-               //foo1(100);\r
-               /* Create the adapter adapter */\r
-               ib_status = ipoib_create_adapter(config_context, h_adapter, &p_adapter );\r
-               if( ib_status != IB_SUCCESS )\r
-               {\r
-                       ASSERT(FALSE);\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("ipoib_create_adapter returned status %d.\n", ib_status ) );\r
-                       return NDIS_STATUS_FAILURE;\r
-               }\r
-               p_adapter->ipoib_state = IPOIB_PAUSED;\r
-               status  = SetAttributes(p_adapter, h_adapter);\r
-               if (status != NDIS_STATUS_SUCCESS) {\r
-                       ASSERT(FALSE);\r
-               }\r
-#if 0\r
-               NdisZeroMemory(&RegistrationAttributes, sizeof(NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES));\r
-               NdisZeroMemory(&GeneralAttributes, sizeof(NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES));\r
-       \r
-               /* setting registration attributes */\r
-               RegistrationAttributes.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES;\r
-               RegistrationAttributes.Header.Revision = NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES_REVISION_1;\r
-               RegistrationAttributes.Header.Size = NDIS_SIZEOF_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES_REVISION_1;\r
-       \r
-               RegistrationAttributes.MiniportAdapterContext = (NDIS_HANDLE)p_adapter;\r
-               RegistrationAttributes.AttributeFlags = NDIS_MINIPORT_ATTRIBUTES_BUS_MASTER;\r
-                                                                                                               \r
-               RegistrationAttributes.CheckForHangTimeInSeconds = 10;\r
-               RegistrationAttributes.InterfaceType = NdisInterfacePNPBus;\r
-       \r
-               status = NdisMSetMiniportAttributes(h_adapter,\r
-                                                                                  (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&RegistrationAttributes);\r
-       \r
-               if (status != NDIS_STATUS_SUCCESS)\r
-               {\r
-                       ipoib_destroy_adapter( p_adapter );\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("NdisMSetMiniportAttributes returned 0x%.8x.\n", status) );\r
-                       return status;\r
-               }\r
-       \r
-               /* set up generic attributes */\r
-       \r
-                GeneralAttributes.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES;\r
-                GeneralAttributes.Header.Revision = NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES_REVISION_1;\r
-                GeneralAttributes.Header.Size = sizeof(NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES);\r
-       \r
-                GeneralAttributes.MediaType = NdisMedium802_3;\r
-               //TODO\r
-                GeneralAttributes.MtuSize = MAX_IB_MTU;\r
-                GeneralAttributes.MaxXmitLinkSpeed = IPOIB_MEDIA_MAX_SPEED;\r
-                GeneralAttributes.MaxRcvLinkSpeed = IPOIB_MEDIA_MAX_SPEED;\r
-                GeneralAttributes.XmitLinkSpeed = NDIS_LINK_SPEED_UNKNOWN;\r
-                GeneralAttributes.RcvLinkSpeed = NDIS_LINK_SPEED_UNKNOWN;\r
-                GeneralAttributes.MediaConnectState = MediaConnectStateUnknown;\r
-                GeneralAttributes.MediaDuplexState = MediaDuplexStateUnknown;\r
-                GeneralAttributes.LookaheadSize = MAX_XFER_BLOCK_SIZE;\r
-       \r
-                GeneralAttributes.PowerManagementCapabilities = NULL;\r
-       \r
-                GeneralAttributes.MacOptions = NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA |\r
-                                                                               NDIS_MAC_OPTION_TRANSFERS_NOT_PEND |\r
-                                                                               NDIS_MAC_OPTION_NO_LOOPBACK |\r
-                                                                               NDIS_MAC_OPTION_FULL_DUPLEX;\r
-       \r
-                GeneralAttributes.SupportedPacketFilters = NDIS_PACKET_TYPE_DIRECTED |\r
-                                                                                                       NDIS_PACKET_TYPE_MULTICAST |\r
-                                                                                                       NDIS_PACKET_TYPE_ALL_MULTICAST |\r
-                                                                                                       NDIS_PACKET_TYPE_BROADCAST;\r
-                       \r
-                GeneralAttributes.MaxMulticastListSize = MAX_MCAST;\r
-                GeneralAttributes.MacAddressLength = HW_ADDR_LEN;\r
-       \r
-                NdisMoveMemory(GeneralAttributes.PermanentMacAddress,\r
-                                               p_adapter->mac.addr,\r
-                                               HW_ADDR_LEN);\r
-       \r
-                NdisMoveMemory(GeneralAttributes.CurrentMacAddress,\r
-                                               p_adapter->params.conf_mac.addr,\r
-                                               HW_ADDR_LEN);\r
-       \r
-                       \r
-                GeneralAttributes.PhysicalMediumType = NdisPhysicalMediumUnspecified;\r
-                GeneralAttributes.RecvScaleCapabilities = NULL;\r
-                GeneralAttributes.AccessType = NET_IF_ACCESS_BROADCAST; // NET_IF_ACCESS_BROADCAST for a typical ethernet adapter\r
-                GeneralAttributes.DirectionType = NET_IF_DIRECTION_SENDRECEIVE; // NET_IF_DIRECTION_SENDRECEIVE for a typical ethernet adapter\r
-                GeneralAttributes.ConnectionType = NET_IF_CONNECTION_DEDICATED;  // NET_IF_CONNECTION_DEDICATED for a typical ethernet adapter\r
-                GeneralAttributes.IfType = IF_TYPE_ETHERNET_CSMACD; // IF_TYPE_ETHERNET_CSMACD for a typical ethernet adapter (regardless of speed)\r
-                GeneralAttributes.IfConnectorPresent = TRUE; // RFC 2665 TRUE if physical adapter\r
-       \r
-                GeneralAttributes.SupportedStatistics = NDIS_STATISTICS_XMIT_OK_SUPPORTED |\r
-                                                                                                NDIS_STATISTICS_RCV_OK_SUPPORTED |\r
-                                                                                                NDIS_STATISTICS_XMIT_ERROR_SUPPORTED |\r
-                                                                                                NDIS_STATISTICS_RCV_ERROR_SUPPORTED |\r
-                                                                                                NDIS_STATISTICS_RCV_CRC_ERROR_SUPPORTED |\r
-                                                                                                NDIS_STATISTICS_RCV_NO_BUFFER_SUPPORTED |\r
-                                                                                                NDIS_STATISTICS_TRANSMIT_QUEUE_LENGTH_SUPPORTED |\r
-                                                                                                NDIS_STATISTICS_GEN_STATISTICS_SUPPORTED;\r
-                                                 \r
-                GeneralAttributes.SupportedOidList = (PNDIS_OID)SUPPORTED_OIDS;\r
-                GeneralAttributes.SupportedOidListLength = sizeof(SUPPORTED_OIDS);\r
-       \r
-                status = NdisMSetMiniportAttributes(h_adapter,\r
-                                                                                       (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&GeneralAttributes);\r
-       \r
-                if (status != NDIS_STATUS_SUCCESS)\r
-                {\r
-                        IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                ("NdisMSetMiniportAttributes returned 0x%.8x.\n", status) );\r
-                }\r
-       \r
-#if IPOIB_USE_DMA\r
-       \r
-                NdisZeroMemory(&DmaDescription, sizeof(DmaDescription));\r
-       \r
-                DmaDescription.Header.Type = NDIS_OBJECT_TYPE_SG_DMA_DESCRIPTION;\r
-                DmaDescription.Header.Revision = NDIS_SG_DMA_DESCRIPTION_REVISION_1;\r
-                DmaDescription.Header.Size = sizeof(NDIS_SG_DMA_DESCRIPTION);//NDIS_SIZEOF_SG_DMA_DESCRIPTION_REVISION_1;\r
-       \r
-                DmaDescription.Flags = NDIS_SG_DMA_64_BIT_ADDRESS;\r
-                DmaDescription.MaximumPhysicalMapping = p_adapter->params.xfer_block_size;\r
-               \r
-                DmaDescription.ProcessSGListHandler = ipoib_process_sg_list;\r
-                DmaDescription.SharedMemAllocateCompleteHandler = NULL;\r
-       \r
-                status = NdisMRegisterScatterGatherDma(\r
-                                               p_adapter->h_adapter,\r
-                                               &DmaDescription,\r
-                                               &p_adapter->NdisMiniportDmaHandle);\r
-                                               \r
-                if( status != NDIS_STATUS_SUCCESS )\r
-                {\r
-                        ipoib_destroy_adapter( p_adapter );\r
-                        IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                                        ("NdisMRegisterScatterGatherDma returned 0x%.8x.\n", status) );\r
-                        return status;\r
-                }\r
-\r
-               \r
-               \r
-#endif\r
-#endif //if 0\r
-\r
-\r
-\r
-#if IPOIB_USE_DMA\r
-\r
-               InitNdisScatterGatherDma(p_adapter, h_adapter);\r
-\r
-\r
-\r
-#endif\r
-               /* Create the adapter adapter */\r
-               ib_status = ipoib_start_adapter( p_adapter );\r
-               if( ib_status != IB_SUCCESS )\r
-               {\r
-                       ASSERT(FALSE);\r
-                       NdisWriteErrorLogEntry( h_adapter,\r
-                               NDIS_ERROR_CODE_HARDWARE_FAILURE, 0 );\r
-#if  IPOIB_USE_DMA\r
-                       NdisMDeregisterScatterGatherDma(p_adapter->NdisMiniportDmaHandle);\r
-#endif\r
-                       ipoib_destroy_adapter( p_adapter );\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("ipoib_start_adapter returned status %d.\n", ib_status ) );\r
-                       return NDIS_STATUS_FAILURE;\r
-               }\r
-       \r
-               ipoib_ref_ibat();\r
-       \r
-               IPOIB_EXIT( IPOIB_DBG_INIT );\r
-               return status;\r
-       }\r
-\r
-\r
-//! Deallocates resources when the NIC is removed and halts the NIC..\r
-//TODO: Dispatch or Passive ?\r
-/*  IRQL = DISPATCH_LEVEL\r
-\r
-@param adapter_context The adapter context allocated at start\r
-*/\r
-void\r
-ipoib_halt_ex(\r
-       IN                              NDIS_HANDLE                                     adapter_context,\r
-       IN                      NDIS_HALT_ACTION            HaltAction )\r
-{\r
-       ipoib_adapter_t *p_adapter;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       UNUSED_PARAM(HaltAction);\r
-//return;              \r
-       ipoib_deref_ibat();\r
-\r
-       CL_ASSERT( adapter_context );\r
-       p_adapter = (ipoib_adapter_t*)adapter_context;\r
-\r
-       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
-                       ("Port %016I64x (CA %016I64x port %d) halting\n",\r
-                       p_adapter->guids.port_guid.guid, p_adapter->guids.ca_guid,\r
-                       p_adapter->guids.port_num) );\r
-\r
-#if IPOIB_USE_DMA\r
-       if (p_adapter->NdisMiniportDmaHandle != NULL)\r
-       {\r
-               NdisMDeregisterScatterGatherDma(p_adapter->NdisMiniportDmaHandle);\r
-               p_adapter->NdisMiniportDmaHandle = NULL;\r
-       }\r
-#endif\r
-       ipoib_destroy_adapter( p_adapter );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-}\r
-\r
-\r
-//! Reports the state of the NIC, or monitors the responsiveness of an underlying device driver.\r
-/*  IRQL = DISPATCH_LEVEL\r
-\r
-@param adapter_context The adapter context allocated at start\r
-@return TRUE if the driver determines that its NIC is not operating\r
-*/\r
-BOOLEAN\r
-ipoib_check_for_hang(\r
-       IN                              NDIS_HANDLE                                     adapter_context )\r
-{\r
-       ipoib_adapter_t *p_adapter;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-//return FALSE;\r
-       CL_ASSERT( adapter_context );\r
-       p_adapter = (ipoib_adapter_t*)adapter_context;\r
-\r
-       if( p_adapter->reset )\r
-       {\r
-               IPOIB_EXIT( IPOIB_DBG_INIT );\r
-               return FALSE;\r
-       }\r
-       if (p_adapter->hung) {\r
-               ipoib_resume_oids(p_adapter);\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-       return (p_adapter->hung? TRUE:FALSE);\r
-}\r
-\r
-\r
-/*++\r
-Routine Description:\r
-       The routine sets an NDIS_OFFLOAD structure indicates the current offload \r
-       capabilities that are provided by the miniport adapter \r
-\r
-Arguments:\r
-       pPort - a pointer to port object\r
-       offload - reference to NDIS_OFFLOAD object that should be filled\r
-\r
-Return Value:\r
-       None.\r
-\r
---*/\r
-//TODO\r
-#if 0\r
-static\r
-void\r
-__ipoib_get_offload_config(\r
-       ipoib_port_t *pPort,\r
-       NDIS_OFFLOAD *p_offload\r
-       )\r
-{\r
-       NDIS_STATUS Status;\r
-       ULONG TxChksumOffload = ((MP_GET_PORT_CONFIG(pPort, TxChksumOffload) == TRUE) ? NDIS_OFFLOAD_SET_ON : NDIS_OFFLOAD_SET_OFF);\r
-       ULONG RxChksumOffload = ((MP_GET_PORT_CONFIG(pPort, RxChksumOffload) == TRUE) ? NDIS_OFFLOAD_SET_ON : NDIS_OFFLOAD_SET_OFF);\r
-       BOOLEAN fLargeSendOffload = MP_GET_PORT_CONFIG(pPort, LargeSendOffload);\r
-       ULONG ulEncapsulation = NDIS_ENCAPSULATION_IEEE_802_3 | NDIS_ENCAPSULATION_IEEE_802_3_P_AND_Q;\r
-           \r
-       NdisZeroMemory(&*p_offload, sizeof(NDIS_OFFLOAD));\r
-       *p_offload.Header.Type = NDIS_OBJECT_TYPE_OFFLOAD;\r
-       *p_offload.Header.Revision = NDIS_OFFLOAD_REVISION_1; // BUGBUG: do we need to support revision 2? UH 17-May-2008\r
-       *p_offload.Header.Size = NDIS_SIZEOF_NDIS_OFFLOAD_REVISION_1;\r
-\r
-       *p_offload.Checksum.IPv4Transmit.Encapsulation = ulEncapsulation;\r
-       *p_offload.Checksum.IPv4Transmit.IpOptionsSupported = TxChksumOffload;\r
-       *p_offload.Checksum.IPv4Transmit.TcpOptionsSupported = TxChksumOffload;\r
-       *p_offload.Checksum.IPv4Transmit.TcpChecksum = TxChksumOffload;\r
-       *p_offload.Checksum.IPv4Transmit.UdpChecksum = NDIS_OFFLOAD_NOT_SUPPORTED;\r
-       *p_offload.Checksum.IPv4Transmit.IpChecksum = TxChksumOffload;\r
-\r
-       *p_offload.Checksum.IPv4Receive.Encapsulation = ulEncapsulation;\r
-       *p_offload.Checksum.IPv4Receive.IpOptionsSupported = RxChksumOffload;\r
-       *p_offload.Checksum.IPv4Receive.TcpOptionsSupported = RxChksumOffload;\r
-       *p_offload.Checksum.IPv4Receive.TcpChecksum = RxChksumOffload;\r
-       *p_offload.Checksum.IPv4Receive.UdpChecksum = NDIS_OFFLOAD_NOT_SUPPORTED; \r
-       *p_offload.Checksum.IPv4Receive.IpChecksum = RxChksumOffload;\r
-\r
-       *p_offload.Checksum.IPv6Transmit.Encapsulation = ulEncapsulation;\r
-       *p_offload.Checksum.IPv6Transmit.IpExtensionHeadersSupported = TxChksumOffload;\r
-       *p_offload.Checksum.IPv6Transmit.TcpOptionsSupported = TxChksumOffload;\r
-       *p_offload.Checksum.IPv6Transmit.TcpChecksum = TxChksumOffload;\r
-       *p_offload.Checksum.IPv6Transmit.UdpChecksum = NDIS_OFFLOAD_NOT_SUPPORTED;\r
-\r
-\r
-       *p_offload.Checksum.IPv6Receive.Encapsulation = ulEncapsulation;\r
-       *p_offload.Checksum.IPv6Receive.IpExtensionHeadersSupported = RxChksumOffload;\r
-       *p_offload.Checksum.IPv6Receive.TcpOptionsSupported = RxChksumOffload;\r
-       *p_offload.Checksum.IPv6Receive.TcpChecksum = RxChksumOffload;\r
-       *p_offload.Checksum.IPv6Receive.UdpChecksum = NDIS_OFFLOAD_NOT_SUPPORTED;\r
-\r
-       if (fLargeSendOffload)\r
-       {\r
-           *p_offload.LsoV1.IPv4.Encapsulation = ulEncapsulation;\r
-           *p_offload.LsoV1.IPv4.MaxOffLoadSize = LARGE_SEND_OFFLOAD_SIZE;\r
-           *p_offload.LsoV1.IPv4.MinSegmentCount = 1;\r
-           *p_offload.LsoV1.IPv4.TcpOptions = NDIS_OFFLOAD_SUPPORTED;\r
-           *p_offload.LsoV1.IPv4.IpOptions = NDIS_OFFLOAD_SUPPORTED;\r
-       }\r
-}\r
-#endif\r
-\r
-//! Returns information about the capabilities and status of the driver and/or its NIC.\r
-/*  IRQL = DISPATCH_LEVEL\r
-\r
-@param adapter_context The adapter context allocated at start\r
-@param oid Object ID representing the query operation to be carried out\r
-@param info_buf Buffer containing any input for this query and location for output\r
-@param info_buf_len Number of bytes available in info_buf\r
-@param p_bytes_written Pointer to number of bytes written into info_buf\r
-@param p_bytes_needed Pointer to number of bytes needed to satisfy this oid\r
-@return NDIS_STATUS_SUCCESS, NDIS_STATUS_PENDING, NDIS_STATUS_INVALID_OID,\r
-NDIS_STATUS_INVALID_LENGTH, NDIS_STATUS_NOT_ACCEPTED, NDIS_STATUS_NOT_SUPPORTED,\r
-NDIS_STATUS_RESOURCES\r
-*/\r
-       NDIS_STATUS\r
-ipoib_query_info(\r
-       IN                              NDIS_HANDLE                                     adapter_context,\r
-       IN                              NDIS_OID                                        oid,\r
-       IN                              PVOID                                           info_buf,\r
-       IN                              ULONG                                           info_buf_len,\r
-               OUT                     PULONG                                          p_bytes_written,\r
-               OUT                     PULONG                                          p_bytes_needed )\r
-       {\r
-       ipoib_adapter_t         *p_adapter;\r
-               NDIS_STATUS             status;\r
-               USHORT                          version;\r
-       ULONG                           info;\r
-               PVOID                           src_buf;\r
-               ULONG                           buf_len;\r
-               pending_oid_t           oid_info;\r
-       uint8_t                         port_num;\r
-               \r
-               IPOIB_ENTER( IPOIB_DBG_OID );\r
-               \r
-               oid_info.oid = oid;\r
-               oid_info.p_buf = info_buf;\r
-               oid_info.buf_len = info_buf_len;\r
-               oid_info.p_bytes_used = p_bytes_written;\r
-               oid_info.p_bytes_needed = p_bytes_needed;\r
-               \r
-               CL_ASSERT( adapter_context );\r
-               p_adapter = (ipoib_adapter_t*)adapter_context;\r
-\r
-               CL_ASSERT( p_bytes_written );\r
-               CL_ASSERT( p_bytes_needed );\r
-               CL_ASSERT( !p_adapter->pending_query );\r
-               \r
-                       status = NDIS_STATUS_SUCCESS;\r
-                       src_buf = &info;\r
-               buf_len = sizeof(info);\r
-       \r
-               port_num = p_adapter->guids.port_num;\r
-       \r
-               switch( oid )\r
-               {\r
-               /* Required General */\r
-               case OID_GEN_SUPPORTED_LIST:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_SUPPORTED_LIST\n", port_num) );\r
-                       src_buf = (PVOID)SUPPORTED_OIDS;\r
-                       buf_len = sizeof(SUPPORTED_OIDS);\r
-                       break;\r
-       \r
-               case OID_GEN_HARDWARE_STATUS:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_HARDWARE_STATUS\n", port_num) );\r
-                       cl_obj_lock( &p_adapter->obj );\r
-                       switch( p_adapter->state )\r
-                       {\r
-                       case IB_PNP_PORT_ADD:\r
-                               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                                       ("Port %d returning NdisHardwareStatusInitializing\n", port_num) );\r
-                               info = NdisHardwareStatusInitializing;\r
-                               break;\r
-                               \r
-                       case IB_PNP_PORT_ACTIVE:\r
-                               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                                       ("Port %d returning NdisHardwareStatusReady\n", port_num) );\r
-                               info = NdisHardwareStatusReady;\r
-                               break;\r
-       \r
-                       default:\r
-                               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                                       ("Port %d returning NdisHardwareStatusNotReady\n", port_num) );\r
-                               info = NdisHardwareStatusNotReady;\r
-                       }\r
-                       cl_obj_unlock( &p_adapter->obj );\r
-                       break;\r
-       \r
-               case OID_GEN_MEDIA_SUPPORTED:\r
-               case OID_GEN_MEDIA_IN_USE:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_MEDIA_SUPPORTED "\r
-                               "or OID_GEN_MEDIA_IN_USE\n", port_num) );\r
-                       info = NdisMedium802_3;\r
-                       break;\r
-       \r
-               case OID_GEN_MAXIMUM_FRAME_SIZE:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_MAXIMUM_FRAME_SIZE\n", port_num) );\r
-                       if( p_adapter->params.cm_enabled )\r
-                       {\r
-                               info = p_adapter->params.cm_payload_mtu;\r
-                       }\r
-                       else\r
-                       {\r
-                               info = p_adapter->params.payload_mtu;\r
-                       }\r
-                       break;\r
-       \r
-               case OID_GEN_LINK_SPEED:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_LINK_SPEED\n", port_num) );\r
-                       if (info_buf_len < buf_len)\r
-                       {\r
-                               break;\r
-                       }\r
-       \r
-                       cl_obj_lock( &p_adapter->obj );\r
-                       switch( p_adapter->state )\r
-                       {\r
-                       case IB_PNP_PORT_ADD:\r
-                               /* Mark the adapter as pending an OID */\r
-                               p_adapter->pending_query = TRUE;\r
-       \r
-                               /* Save the request parameters. */\r
-                               p_adapter->query_oid = oid_info;\r
-       \r
-                               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                                       ("Port %d returning NDIS_STATUS_PENDING\n", port_num) );\r
-                               status = NDIS_STATUS_PENDING;\r
-                               break;\r
-       \r
-                       case IB_PNP_PORT_REMOVE:\r
-                               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                                       ("Port %d returning NDIS_STATUS_NOT_ACCEPTED\n", port_num) );\r
-                               status = NDIS_STATUS_NOT_ACCEPTED;\r
-                               break;\r
-       \r
-                       default:\r
-                               CL_ASSERT( p_adapter->p_port );\r
-                               info = p_adapter->port_rate;\r
-                               break;\r
-                       }\r
-                       cl_obj_unlock( &p_adapter->obj );\r
-                       break;\r
-       \r
-               case OID_GEN_TRANSMIT_BUFFER_SPACE:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_TRANSMIT_BUFFER_SPACE\n", port_num) );\r
-                       if( p_adapter->params.cm_enabled )\r
-                               info = p_adapter->params.sq_depth * p_adapter->params.cm_xfer_block_size;\r
-                       else\r
-                               info = p_adapter->params.sq_depth * p_adapter->params.xfer_block_size;\r
-                       break;\r
-       \r
-               case OID_GEN_RECEIVE_BUFFER_SPACE:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_TRANSMIT_BUFFER_SPACE "\r
-                               "or OID_GEN_RECEIVE_BUFFER_SPACE\n", port_num) );\r
-                       if( p_adapter->params.cm_enabled )\r
-                               info = p_adapter->params.rq_depth * p_adapter->params.cm_xfer_block_size;\r
-                       else\r
-                               info = p_adapter->params.rq_depth * p_adapter->params.xfer_block_size;\r
-                       break;\r
-       \r
-               case OID_GEN_MAXIMUM_LOOKAHEAD:\r
-               case OID_GEN_CURRENT_LOOKAHEAD:\r
-               case OID_GEN_TRANSMIT_BLOCK_SIZE:\r
-               case OID_GEN_RECEIVE_BLOCK_SIZE:\r
-               case OID_GEN_MAXIMUM_TOTAL_SIZE:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_MAXIMUM_LOOKAHEAD "\r
-                               "or OID_GEN_CURRENT_LOOKAHEAD or "\r
-                               "OID_GEN_TRANSMIT_BLOCK_SIZE or "\r
-                               "OID_GEN_RECEIVE_BLOCK_SIZE or "\r
-                               "OID_GEN_MAXIMUM_TOTAL_SIZE\n", port_num) );\r
-                       if( p_adapter->params.cm_enabled )\r
-                               info = p_adapter->params.cm_xfer_block_size;\r
-                       else\r
-                               info = p_adapter->params.xfer_block_size;\r
-                       break;\r
-       \r
-               case OID_GEN_VENDOR_ID:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_VENDOR_ID\n", port_num) );\r
-                       src_buf = (void*)VENDOR_ID;\r
-               buf_len = sizeof(VENDOR_ID);\r
-                       break;\r
-       \r
-               case OID_GEN_VENDOR_DESCRIPTION:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, \r
-                               ("Port %d received query for OID_GEN_VENDOR_DESCRIPTION\n", port_num) );\r
-                       src_buf = VENDOR_DESCRIPTION;\r
-               buf_len = sizeof(VENDOR_DESCRIPTION);\r
-                       break;\r
-       \r
-               case OID_GEN_VENDOR_DRIVER_VERSION:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_VENDOR_DRIVER_VERSION\n", port_num) );\r
-                       src_buf = &version;\r
-               buf_len = sizeof(version);\r
-                       //TODO: Figure out what the right version is.\r
-                       version = 1 << 8 | 1;\r
-                       break;\r
-       \r
-               case OID_GEN_PHYSICAL_MEDIUM:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_PHYSICAL_MEDIUM\n", port_num) );\r
-                       info = NdisPhysicalMediumUnspecified;\r
-                       break;\r
-       \r
-               case OID_GEN_CURRENT_PACKET_FILTER:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_CURRENT_PACKET_FILTER\n", port_num) );\r
-                       info = p_adapter->packet_filter;\r
-                       break;\r
-       \r
-               case OID_GEN_DRIVER_VERSION:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_DRIVER_VERSION\n", port_num) );\r
-                       src_buf = &version;\r
-               buf_len = sizeof(version);\r
-                       version = MAJOR_NDIS_VERSION << 8 | MINOR_NDIS_VERSION;\r
-                       break;\r
-       \r
-               case OID_GEN_MAC_OPTIONS:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_MAC_OPTIONS\n", port_num) );\r
-                       info = NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA |\r
-                               NDIS_MAC_OPTION_TRANSFERS_NOT_PEND |\r
-                               NDIS_MAC_OPTION_NO_LOOPBACK |\r
-                               NDIS_MAC_OPTION_FULL_DUPLEX;\r
-       //TODO: Figure out if we will support priority and VLANs.\r
-       //                              NDIS_MAC_OPTION_8021P_PRIORITY;\r
-       //#ifdef NDIS51_MINIPORT\r
-       //                      info |= NDIS_MAC_OPTION_8021Q_VLAN;\r
-       //#endif\r
-                       break;\r
-       \r
-               case OID_GEN_MEDIA_CONNECT_STATUS:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_MEDIA_CONNECT_STATUS\n", port_num) );\r
-                       cl_obj_lock( &p_adapter->obj );\r
-                       switch( p_adapter->state )\r
-                       {\r
-                       case IB_PNP_PORT_ADD:\r
-                       case IB_PNP_PORT_INIT:\r
-                               /*\r
-                                * Delay reporting media state until we know whether the port is\r
-                                * either up or down.\r
-                                */\r
-                               p_adapter->pending_query = TRUE;\r
-                               p_adapter->query_oid = oid_info;\r
-       \r
-                               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                                       ("Port %d returning NDIS_STATUS_PENDING\n", port_num) );\r
-                               status = NDIS_STATUS_PENDING;\r
-                               break;\r
-       \r
-                       case IB_PNP_PORT_ACTIVE:\r
-                               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                                       ("Port %d returning NdisMediaStateConnected\n", port_num) );\r
-                               info = NdisMediaStateConnected;\r
-                               break;\r
-       \r
-                       case IB_PNP_PORT_REMOVE:\r
-                               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                                       ("Port %d returning NDIS_STATUS_NOT_ACCEPTED\n", port_num) );\r
-                               status = NDIS_STATUS_NOT_ACCEPTED;\r
-                               break;\r
-       \r
-                       default:\r
-                               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                                       ("Port %d returning NdisMediaStateDisconnected\n", port_num) );\r
-                               info = NdisMediaStateDisconnected;\r
-                       }\r
-                       cl_obj_unlock( &p_adapter->obj );\r
-                       break;\r
-       \r
-               case OID_GEN_MAXIMUM_SEND_PACKETS:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_MAXIMUM_SEND_PACKETS\n", port_num) );\r
-                       info = MINIPORT_MAX_SEND_PACKETS;\r
-                       break;\r
-       \r
-               /* Required General Statistics */\r
-               case OID_GEN_STATISTICS:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_STATISTICS\n", port_num) );\r
-                       src_buf = NULL;   \r
-                        buf_len =  sizeof(NDIS_STATISTICS_INFO);\r
-                       if (info_buf_len < buf_len)\r
-                       {\r
-                          break;\r
-                       } \r
-                       status = ipoib_get_gen_stat(p_adapter, &oid_info );\r
-                       break;\r
-       \r
-               case OID_GEN_XMIT_OK:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_XMIT_OK\n", port_num) );\r
-                       src_buf = NULL;\r
-                       status = ipoib_get_send_stat( p_adapter, IP_STAT_SUCCESS, &oid_info );\r
-                       break;\r
-       \r
-               case OID_GEN_RCV_OK:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_RCV_OK\n", port_num) );\r
-                       src_buf = NULL;\r
-                       status = ipoib_get_recv_stat( p_adapter, IP_STAT_SUCCESS, &oid_info );\r
-                       break;\r
-       \r
-               case OID_GEN_XMIT_ERROR:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_XMIT_ERROR\n", port_num) );\r
-                       src_buf = NULL;\r
-                       status = ipoib_get_send_stat( p_adapter, IP_STAT_ERROR, &oid_info );\r
-                       break;\r
-       \r
-               case OID_GEN_RCV_ERROR:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_RCV_ERROR\n", port_num) );\r
-                       src_buf = NULL;\r
-                       status = ipoib_get_recv_stat( p_adapter, IP_STAT_ERROR, &oid_info );\r
-                       break;\r
-       \r
-               case OID_GEN_RCV_NO_BUFFER:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_RCV_NO_BUFFER\n", port_num) );\r
-                       src_buf = NULL;\r
-                       status = ipoib_get_recv_stat( p_adapter, IP_STAT_DROPPED, &oid_info );\r
-                       break;\r
-       \r
-               case OID_GEN_DIRECTED_BYTES_XMIT:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_DIRECTED_BYTES_XMIT\n", port_num) );\r
-                       src_buf = NULL;\r
-                       status = ipoib_get_send_stat( p_adapter, IP_STAT_UCAST_BYTES, &oid_info );\r
-                       break;\r
-       \r
-               case OID_GEN_DIRECTED_FRAMES_XMIT:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_DIRECTED_FRAMES_XMIT\n", port_num) );\r
-                       src_buf = NULL;\r
-                       status = ipoib_get_send_stat( p_adapter, IP_STAT_UCAST_FRAMES, &oid_info );\r
-                       break;\r
-       \r
-               case OID_GEN_MULTICAST_BYTES_XMIT:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_MULTICAST_BYTES_XMIT\n", port_num) );\r
-                       src_buf = NULL;\r
-                       status = ipoib_get_send_stat( p_adapter, IP_STAT_MCAST_BYTES, &oid_info );\r
-                       break;\r
-       \r
-               case OID_GEN_MULTICAST_FRAMES_XMIT:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_MULTICAST_FRAMES_XMIT\n", port_num) );\r
-                       src_buf = NULL;\r
-                       status = ipoib_get_send_stat( p_adapter, IP_STAT_MCAST_FRAMES, &oid_info );\r
-                       break;\r
-       \r
-               case OID_GEN_BROADCAST_BYTES_XMIT:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_BROADCAST_BYTES_XMIT\n", port_num) );\r
-                       src_buf = NULL;\r
-                       status = ipoib_get_send_stat( p_adapter, IP_STAT_BCAST_BYTES, &oid_info );\r
-                       break;\r
-       \r
-               case OID_GEN_BROADCAST_FRAMES_XMIT:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_BROADCAST_FRAMES_XMIT\n", port_num) );\r
-                       src_buf = NULL;\r
-                       status = ipoib_get_send_stat( p_adapter, IP_STAT_BCAST_FRAMES, &oid_info );\r
-                       break;\r
-       \r
-               case OID_GEN_DIRECTED_BYTES_RCV:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_DIRECTED_BYTES_RCV\n", port_num) );\r
-                       src_buf = NULL;\r
-                       status = ipoib_get_recv_stat( p_adapter, IP_STAT_UCAST_BYTES, &oid_info );\r
-                       break;\r
-       \r
-               case OID_GEN_DIRECTED_FRAMES_RCV:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_DIRECTED_FRAMES_RCV\n", port_num) );\r
-                       src_buf = NULL;\r
-                       status = ipoib_get_recv_stat( p_adapter, IP_STAT_UCAST_FRAMES, &oid_info );\r
-                       break;\r
-       \r
-               case OID_GEN_MULTICAST_BYTES_RCV:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_MULTICAST_BYTES_RCV\n", port_num) );\r
-                       src_buf = NULL;\r
-                       status = ipoib_get_recv_stat( p_adapter, IP_STAT_MCAST_BYTES, &oid_info );\r
-                       break;\r
-       \r
-               case OID_GEN_MULTICAST_FRAMES_RCV:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_MULTICAST_FRAMES_RCV\n", port_num) );\r
-                       src_buf = NULL;\r
-                       status = ipoib_get_recv_stat( p_adapter, IP_STAT_MCAST_FRAMES, &oid_info );\r
-                       break;\r
-       \r
-               case OID_GEN_BROADCAST_BYTES_RCV:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_BROADCAST_BYTES_RCV\n", port_num) );\r
-                       src_buf = NULL;\r
-                       status = ipoib_get_recv_stat( p_adapter, IP_STAT_BCAST_BYTES, &oid_info );\r
-                       break;\r
-       \r
-               case OID_GEN_BROADCAST_FRAMES_RCV:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_BROADCAST_FRAMES_RCV\n", port_num) );\r
-                       src_buf = NULL;\r
-                       status = ipoib_get_recv_stat( p_adapter, IP_STAT_BCAST_FRAMES, &oid_info );\r
-                       break;\r
-       \r
-               /* Required Ethernet operational characteristics */\r
-               case OID_802_3_PERMANENT_ADDRESS:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_802_3_PERMANENT_ADDRESS\n", port_num) );\r
-                       src_buf = &p_adapter->mac;\r
-               buf_len = sizeof(p_adapter->mac);\r
-                       break;\r
-       \r
-               case OID_802_3_CURRENT_ADDRESS:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_802_3_CURRENT_ADDRESS\n", port_num) );\r
-                       src_buf = &p_adapter->params.conf_mac;\r
-               buf_len = sizeof(p_adapter->params.conf_mac);\r
-                       break;\r
-       \r
-               case OID_802_3_MULTICAST_LIST:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_802_3_MULTICAST_LIST\n", port_num) );\r
-                       src_buf = p_adapter->mcast_array;\r
-               buf_len = p_adapter->mcast_array_size * sizeof(mac_addr_t);\r
-                       break;\r
-       \r
-               case OID_802_3_MAXIMUM_LIST_SIZE:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_802_3_MAXIMUM_LIST_SIZE\n", port_num) );\r
-                       info = MAX_MCAST;\r
-                       break;\r
-       \r
-               case OID_802_3_MAC_OPTIONS:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_802_3_MAC_OPTIONS\n", port_num) );\r
-                       info = 0;\r
-                       break;\r
-       \r
-               /* Required Ethernet stats */\r
-               case OID_802_3_RCV_ERROR_ALIGNMENT:\r
-               case OID_802_3_XMIT_ONE_COLLISION:\r
-               case OID_802_3_XMIT_MORE_COLLISIONS:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_802_3_RCV_ERROR_ALIGNMENT or "\r
-                               "OID_802_3_XMIT_ONE_COLLISION or "\r
-                               "OID_802_3_XMIT_MORE_COLLISIONS\n", port_num) );\r
-                       info = 0;\r
-                       break;\r
-       \r
-               case OID_TCP_TASK_OFFLOAD:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_TCP_TASK_OFFLOAD\n", port_num) );\r
-                       src_buf = NULL;\r
-                       status = __ipoib_get_tcp_task_offload( p_adapter, &oid_info );\r
-                       break;\r
-       \r
-               /* Optional General */\r
-               case OID_GEN_SUPPORTED_GUIDS:\r
-#ifdef NDIS51_MINIPORT\r
-               case OID_GEN_VLAN_ID:\r
-#endif\r
-       \r
-               /* Optional General Stats */\r
-               case OID_GEN_RCV_CRC_ERROR:\r
-               case OID_GEN_TRANSMIT_QUEUE_LENGTH:\r
-       \r
-               /* Optional Ethernet Stats */\r
-               case OID_802_3_XMIT_DEFERRED:\r
-               case OID_802_3_XMIT_MAX_COLLISIONS:\r
-               case OID_802_3_RCV_OVERRUN:\r
-               case OID_802_3_XMIT_UNDERRUN:\r
-               case OID_802_3_XMIT_HEARTBEAT_FAILURE:\r
-               case OID_802_3_XMIT_TIMES_CRS_LOST:\r
-               case OID_802_3_XMIT_LATE_COLLISIONS:\r
-               case OID_PNP_CAPABILITIES:\r
-                       status = NDIS_STATUS_NOT_SUPPORTED;\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received an unsupported oid of 0x%.8X!\n", port_num, oid) );\r
-                       break;\r
-       \r
-               case OID_GEN_PROTOCOL_OPTIONS:\r
-               case OID_GEN_NETWORK_LAYER_ADDRESSES:\r
-               case OID_GEN_TRANSPORT_HEADER_OFFSET:\r
-               case OID_PNP_ENABLE_WAKE_UP:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_GEN_PROTOCOL_OPTIONS or OID_GEN_NETWORK_LAYER_ADDRESSES or OID_GEN_TRANSPORT_HEADER_OFFSET  OID_PNP_ENABLE_WAKE_UPn", port_num) );\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Number of OID: 0x%.8X!\n", oid) );\r
-                       status = NDIS_STATUS_SUCCESS; \r
-                       break;\r
-                       \r
-               case OID_PNP_QUERY_POWER:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_TCP_TASK_OFFLOAD\n", port_num) );\r
-                       // Status is pre-set in this routine to Success\r
-                       status = NDIS_STATUS_SUCCESS; \r
-                       break;\r
-       \r
-               case OID_TCP_OFFLOAD_CURRENT_CONFIG:\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d received query for OID_PNP_QUERY_POWER\n", port_num) );\r
-                               //ulBytesAvailable = ulInfoLen = sizeof(NDIS_OFFLOAD);\r
-                               if (info_buf_len <  sizeof(NDIS_OFFLOAD))\r
-                               {\r
-                                       status = NDIS_STATUS_BUFFER_TOO_SHORT;\r
-                                       *p_bytes_needed = sizeof(NDIS_OFFLOAD) ;\r
-                                       break;\r
-                               }\r
-       \r
-                               //ipoib_offload_config(pPort, &offload);\r
-                               //pInfo = &offload;\r
-                               break;\r
-       \r
-               default:\r
-                       status = NDIS_STATUS_INVALID_OID;\r
-               //      IPOIB_PRINT( TRACE_LEVEL_ERROR,IPOIB_DBG_OID,\r
-                       //      ("Port %d received an invalid oid of 0x%.8X!\n", port_num, oid) );\r
-                       break;\r
-               }\r
-       \r
-               /*\r
-                * Complete the request as if it was handled asynchronously to maximize\r
-                * code reuse for when we really handle the requests asynchronously.\r
-                * Note that this requires the QueryInformation entry point to always\r
-                * return NDIS_STATUS_PENDING\r
-                */\r
-               if( status != NDIS_STATUS_PENDING )\r
-               {\r
-                       ipoib_complete_query(\r
-                               p_adapter, &oid_info, status, src_buf, buf_len );\r
-                       return status;\r
-               }\r
-       \r
-               IPOIB_EXIT( IPOIB_DBG_OID );\r
-               return NDIS_STATUS_PENDING;\r
-       }\r
-       \r
-\r
-static void\r
-ipoib_complete_query(\r
-       IN                              ipoib_adapter_t* const          p_adapter,\r
-       IN                              pending_oid_t* const            p_oid_info,\r
-       IN              const   NDIS_STATUS                                     status,\r
-       IN              const   void* const                                     p_buf,\r
-       IN              const   ULONG                                           buf_len )\r
-{\r
-       NDIS_STATUS             oid_status = status;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_OID );\r
-\r
-       CL_ASSERT( status != NDIS_STATUS_PENDING );\r
-\r
-       if( status == NDIS_STATUS_SUCCESS )\r
-       {\r
-               if( p_oid_info->buf_len < buf_len )\r
-               {\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Insufficient buffer space.  "\r
-                               "Returning NDIS_STATUS_INVALID_LENGTH.\n") );\r
-                       oid_status = NDIS_STATUS_INVALID_LENGTH;\r
-                       *p_oid_info->p_bytes_needed = buf_len;\r
-                       *p_oid_info->p_bytes_used = 0;\r
-               }\r
-               else if( p_oid_info->p_buf )\r
-               {\r
-                       /* Only copy if we have a distinct source buffer. */\r
-                       if( p_buf )\r
-                       {\r
-                               NdisMoveMemory( p_oid_info->p_buf, p_buf, buf_len );\r
-                               *p_oid_info->p_bytes_used = buf_len;\r
-                       }\r
-               }\r
-               else\r
-               {\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Returning NDIS_NOT_ACCEPTED") );\r
-                       oid_status = NDIS_STATUS_NOT_ACCEPTED;\r
-               }\r
-       }\r
-       else\r
-       {\r
-               *p_oid_info->p_bytes_used = 0;\r
-       }\r
-\r
-       if (p_adapter->query_oid.p_pending_oid)\r
-       {\r
-               NdisMOidRequestComplete(p_adapter->h_adapter,p_adapter->query_oid.p_pending_oid,oid_status); \r
-               p_adapter->query_oid.p_pending_oid = NULL;\r
-       }\r
-       p_adapter->pending_query = FALSE;\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_OID );\r
-}\r
-\r
-\r
-static NDIS_STATUS\r
-__ipoib_get_tcp_task_offload(\r
-       IN                              ipoib_adapter_t*                        p_adapter,\r
-       OUT                             pending_oid_t                           *pNdisRequest )\r
-{\r
-#ifndef NDIS60_MINIPORT\r
-       NDIS_TASK_OFFLOAD_HEADER        *p_offload_hdr;\r
-       NDIS_TASK_OFFLOAD                       *p_offload_task;\r
-       NDIS_TASK_TCP_IP_CHECKSUM       *p_offload_chksum;\r
-\r
-       NDIS_TASK_TCP_LARGE_SEND        *p_offload_lso;\r
-       ULONG                                           buf_len;\r
-\r
-       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-               ("Port %d received query for OID_TCP_TASK_OFFLOAD\n",\r
-               p_adapter->guids.port_num) );\r
-\r
-       buf_len = sizeof(NDIS_TASK_OFFLOAD_HEADER) +\r
-               offsetof( NDIS_TASK_OFFLOAD, TaskBuffer ) +\r
-               sizeof(NDIS_TASK_TCP_IP_CHECKSUM) +\r
-               (p_adapter->params.lso  ? \r
-                       sizeof(NDIS_TASK_OFFLOAD) + sizeof(NDIS_TASK_TCP_LARGE_SEND)\r
-                       : 0);\r
-\r
-       pNdisRequest->DATA.QUERY_INFORMATION.BytesNeeded = buf_len;\r
-\r
-       if( pNdisRequest->DATA.QUERY_INFORMATION.InformationBufferLength < buf_len )\r
-               return NDIS_STATUS_INVALID_LENGTH;\r
-\r
-       p_offload_hdr = (NDIS_TASK_OFFLOAD_HEADER*)pNdisRequest->DATA.QUERY_INFORMATION.InformationBuffer;\r
-       if( p_offload_hdr->Version != NDIS_TASK_OFFLOAD_VERSION )\r
-               return NDIS_STATUS_INVALID_DATA;\r
-\r
-       if( p_offload_hdr->EncapsulationFormat.Encapsulation !=\r
-               IEEE_802_3_Encapsulation )\r
-       {\r
-               return NDIS_STATUS_INVALID_DATA;\r
-       }\r
-\r
-       p_offload_hdr->OffsetFirstTask = sizeof(NDIS_TASK_OFFLOAD_HEADER);\r
-       p_offload_task = (NDIS_TASK_OFFLOAD*)(p_offload_hdr + 1);\r
-       p_offload_task->Version = NDIS_TASK_OFFLOAD_VERSION;\r
-       p_offload_task->Size = sizeof(NDIS_TASK_OFFLOAD);\r
-       p_offload_task->Task = TcpIpChecksumNdisTask;\r
-       p_offload_task->OffsetNextTask = 0;\r
-       p_offload_task->TaskBufferLength = sizeof(NDIS_TASK_TCP_IP_CHECKSUM);\r
-       p_offload_chksum =\r
-               (NDIS_TASK_TCP_IP_CHECKSUM*)p_offload_task->TaskBuffer;\r
-       \r
-       p_offload_chksum->V4Transmit.IpOptionsSupported =\r
-       p_offload_chksum->V4Transmit.TcpOptionsSupported =\r
-       p_offload_chksum->V4Transmit.TcpChecksum =\r
-       p_offload_chksum->V4Transmit.UdpChecksum =\r
-       p_offload_chksum->V4Transmit.IpChecksum =\r
-               !!(p_adapter->params.send_chksum_offload);\r
-\r
-       p_offload_chksum->V4Receive.IpOptionsSupported =\r
-       p_offload_chksum->V4Receive.TcpOptionsSupported =\r
-       p_offload_chksum->V4Receive.TcpChecksum =\r
-       p_offload_chksum->V4Receive.UdpChecksum =\r
-       p_offload_chksum->V4Receive.IpChecksum =\r
-               !!(p_adapter->params.recv_chksum_offload);\r
-\r
-       p_offload_chksum->V6Transmit.IpOptionsSupported = FALSE;\r
-       p_offload_chksum->V6Transmit.TcpOptionsSupported = FALSE;\r
-       p_offload_chksum->V6Transmit.TcpChecksum = FALSE;\r
-       p_offload_chksum->V6Transmit.UdpChecksum = FALSE;\r
-\r
-       p_offload_chksum->V6Receive.IpOptionsSupported = FALSE;\r
-       p_offload_chksum->V6Receive.TcpOptionsSupported = FALSE;\r
-       p_offload_chksum->V6Receive.TcpChecksum = FALSE;\r
-       p_offload_chksum->V6Receive.UdpChecksum = FALSE;\r
-\r
-\r
-       if (p_adapter->params.lso) {\r
-               // set the previous pointer to the correct place\r
-               p_offload_task->OffsetNextTask = FIELD_OFFSET(NDIS_TASK_OFFLOAD, TaskBuffer) +\r
-                                               p_offload_task->TaskBufferLength;\r
-               // set the LSO packet\r
-               p_offload_task = (PNDIS_TASK_OFFLOAD)\r
-                                               ((PUCHAR)p_offload_task + p_offload_task->OffsetNextTask);\r
-\r
-               p_offload_task->Version = NDIS_TASK_OFFLOAD_VERSION;\r
-               p_offload_task->Size = sizeof(NDIS_TASK_OFFLOAD);\r
-               p_offload_task->Task = TcpLargeSendNdisTask;\r
-               p_offload_task->OffsetNextTask = 0;\r
-               p_offload_task->TaskBufferLength = sizeof(NDIS_TASK_TCP_LARGE_SEND);\r
-\r
-               p_offload_lso = (PNDIS_TASK_TCP_LARGE_SEND) p_offload_task->TaskBuffer;\r
-\r
-               p_offload_lso->Version = 0;\r
-               //TODO optimal size: 60000, 64000 or 65536\r
-               //TODO LSO_MIN_SEG_COUNT to be 1\r
-               p_offload_lso->MaxOffLoadSize = LARGE_SEND_OFFLOAD_SIZE; \r
-#define LSO_MIN_SEG_COUNT 2\r
-               p_offload_lso->MinSegmentCount = LSO_MIN_SEG_COUNT;\r
-               p_offload_lso->TcpOptions = TRUE;\r
-               p_offload_lso->IpOptions = TRUE;\r
-       }\r
-\r
-               pNdisRequest->DATA.QUERY_INFORMATION.BytesWritten = buf_len\r
-\r
-       return NDIS_STATUS_SUCCESS;\r
-#endif\r
-       UNUSED_PARAM(p_adapter);\r
-       UNUSED_PARAM(pNdisRequest);\r
-       return NDIS_STATUS_NOT_SUPPORTED;\r
-\r
-}\r
-\r
-\r
-static NDIS_STATUS\r
-__ipoib_set_tcp_task_offload(\r
-       IN                              ipoib_adapter_t*                        p_adapter,\r
-       IN                              void* const                                     p_info_buf,\r
-       IN                              ULONG* const                            p_info_len )\r
-{\r
-#ifndef NDIS60_MINIPORT\r
-       NDIS_TASK_OFFLOAD_HEADER        *p_offload_hdr;\r
-       NDIS_TASK_OFFLOAD                       *p_offload_task;\r
-       NDIS_TASK_TCP_IP_CHECKSUM       *p_offload_chksum;\r
-\r
-       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-               ("Port %d received set for OID_TCP_TASK_OFFLOAD\n",\r
-               p_adapter->guids.port_num) );\r
-\r
-       p_offload_hdr = (NDIS_TASK_OFFLOAD_HEADER*)p_info_buf;\r
-\r
-       if( *p_info_len < sizeof(NDIS_TASK_OFFLOAD_HEADER) )\r
-               return NDIS_STATUS_INVALID_LENGTH;\r
-\r
-       if( p_offload_hdr->Version != NDIS_TASK_OFFLOAD_VERSION )\r
-               return NDIS_STATUS_INVALID_DATA;\r
-\r
-       if( p_offload_hdr->Size != sizeof(NDIS_TASK_OFFLOAD_HEADER) )\r
-               return NDIS_STATUS_INVALID_LENGTH;\r
-\r
-       if( !p_offload_hdr->OffsetFirstTask )\r
-               return NDIS_STATUS_SUCCESS;\r
-\r
-       if( p_offload_hdr->EncapsulationFormat.Encapsulation !=\r
-               IEEE_802_3_Encapsulation )\r
-       {\r
-               return NDIS_STATUS_INVALID_DATA;\r
-       }\r
-\r
-       p_offload_task = (NDIS_TASK_OFFLOAD*)\r
-               (((UCHAR*)p_offload_hdr) + p_offload_hdr->OffsetFirstTask);\r
-\r
-       if( *p_info_len < sizeof(NDIS_TASK_OFFLOAD_HEADER) +\r
-               offsetof( NDIS_TASK_OFFLOAD, TaskBuffer ) +\r
-               sizeof(NDIS_TASK_TCP_IP_CHECKSUM) )\r
-       {\r
-               return NDIS_STATUS_INVALID_LENGTH;\r
-       }\r
-\r
-       if( p_offload_task->Version != NDIS_TASK_OFFLOAD_VERSION )\r
-               return NDIS_STATUS_INVALID_DATA;\r
-       p_offload_chksum =\r
-               (NDIS_TASK_TCP_IP_CHECKSUM*)p_offload_task->TaskBuffer;\r
-\r
-       if( !p_adapter->params.send_chksum_offload &&\r
-               (p_offload_chksum->V4Transmit.IpOptionsSupported ||\r
-               p_offload_chksum->V4Transmit.TcpOptionsSupported ||\r
-               p_offload_chksum->V4Transmit.TcpChecksum ||\r
-               p_offload_chksum->V4Transmit.UdpChecksum ||\r
-               p_offload_chksum->V4Transmit.IpChecksum) )\r
-       {\r
-               return NDIS_STATUS_NOT_SUPPORTED;\r
-       }\r
-\r
-       if( !p_adapter->params.recv_chksum_offload &&\r
-               (p_offload_chksum->V4Receive.IpOptionsSupported ||\r
-               p_offload_chksum->V4Receive.TcpOptionsSupported ||\r
-               p_offload_chksum->V4Receive.TcpChecksum ||\r
-               p_offload_chksum->V4Receive.UdpChecksum ||\r
-               p_offload_chksum->V4Receive.IpChecksum) )\r
-       {\r
-               return NDIS_STATUS_NOT_SUPPORTED;\r
-       }\r
-\r
-       return NDIS_STATUS_SUCCESS;\r
-#endif \r
-       UNUSED_PARAM(p_adapter);\r
-       UNUSED_PARAM(p_info_buf);\r
-       UNUSED_PARAM(p_info_len);\r
-       return NDIS_STATUS_NOT_SUPPORTED;\r
-}\r
-\r
-\r
-//! Issues a hardware reset to the NIC and/or resets the driver's software state.\r
-/*  Tear down the connection and start over again.  This is only called when there is a problem.\r
-For example, if a send, query info, or set info had a time out.  MiniportCheckForHang will\r
-be called first.\r
-IRQL = DISPATCH_LEVEL\r
-\r
-@param p_addr_resetPointer to BOOLLEAN that is set to TRUE if the NDIS\r
-library should call MiniportSetInformation to restore addressing information to the current values.\r
-@param adapter_context The adapter context allocated at start\r
-@return NDIS_STATUS_SUCCESS, NDIS_STATUS_PENDING, NDIS_STATUS_NOT_RESETTABLE,\r
-NDIS_STATUS_RESET_IN_PROGRESS, NDIS_STATUS_SOFT_ERRORS, NDIS_STATUS_HARD_ERRORS\r
-*/\r
-NDIS_STATUS\r
-ipoib_reset(\r
-    IN  NDIS_HANDLE     adapter_context,\r
-    OUT PBOOLEAN        p_addr_reset)\r
-{\r
-       ipoib_adapter_t* p_adapter;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-//return NDIS_STATUS_SUCCESS;\r
-       CL_ASSERT( p_addr_reset );\r
-       CL_ASSERT( adapter_context );\r
-       p_adapter = (ipoib_adapter_t*)adapter_context;\r
-\r
-       switch( ipoib_reset_adapter( p_adapter ) )\r
-       {\r
-       case IB_NOT_DONE:\r
-               IPOIB_EXIT( IPOIB_DBG_INIT );\r
-               return NDIS_STATUS_PENDING;\r
-\r
-       case IB_SUCCESS:\r
-               IPOIB_EXIT( IPOIB_DBG_INIT );\r
-               *p_addr_reset = TRUE;\r
-               return NDIS_STATUS_SUCCESS;\r
-\r
-       case IB_INVALID_STATE:\r
-               IPOIB_EXIT( IPOIB_DBG_INIT );\r
-               return NDIS_STATUS_RESET_IN_PROGRESS;\r
-\r
-       default:\r
-               IPOIB_EXIT( IPOIB_DBG_INIT );\r
-               return NDIS_STATUS_HARD_ERRORS;\r
-       }\r
-}\r
-\r
-\r
-//! Request changes in the state information that the miniport driver maintains\r
-/*  For example, this is used to set multicast addresses and the packet filter.\r
-IRQL = DISPATCH_LEVEL\r
-\r
-@param adapter_context The adapter context allocated at start\r
-@param oid Object ID representing the set operation to be carried out\r
-@param info_buf Buffer containing input for this set and location for any output\r
-@param info_buf_len Number of bytes available in info_buf\r
-@param p_bytes_read Pointer to number of bytes read from info_buf\r
-@param p_bytes_needed Pointer to number of bytes needed to satisfy this oid\r
-@return NDIS_STATUS_SUCCESS, NDIS_STATUS_PENDING, NDIS_STATUS_INVALID_OID,\r
-NDIS_STATUS_INVALID_LENGTH, NDIS_STATUS_INVALID_DATA, NDIS_STATUS_NOT_ACCEPTED,\r
-NDIS_STATUS_NOT_SUPPORTED, NDIS_STATUS_RESOURCES\r
-*/\r
-NDIS_STATUS\r
-ipoib_set_info(\r
-       IN                              NDIS_HANDLE                                     adapter_context,\r
-       IN                              NDIS_OID                                        oid,\r
-       IN                              PVOID                                           info_buf,\r
-       IN                              ULONG                                           info_buf_len,\r
-               OUT                     PULONG                                          p_bytes_read,\r
-               OUT                     PULONG                                          p_bytes_needed )\r
-{\r
-       ipoib_adapter_t*        p_adapter;\r
-       NDIS_STATUS                     status;\r
-\r
-       ULONG                           buf_len;\r
-       uint8_t                         port_num;\r
-\r
-       KLOCK_QUEUE_HANDLE      hdl;\r
-       \r
-       IPOIB_ENTER( IPOIB_DBG_OID );\r
-\r
-       CL_ASSERT( adapter_context );\r
-       p_adapter = (ipoib_adapter_t*)adapter_context;\r
-\r
-       CL_ASSERT( p_bytes_read );\r
-       CL_ASSERT( p_bytes_needed );\r
-       CL_ASSERT( !p_adapter->pending_set );\r
-\r
-       status = NDIS_STATUS_SUCCESS;\r
-       *p_bytes_needed = 0;\r
-       buf_len = sizeof(ULONG);\r
-\r
-       port_num = p_adapter->guids.port_num;\r
-       \r
-       cl_obj_lock( &p_adapter->obj );\r
-\r
-       if( p_adapter->state == IB_PNP_PORT_REMOVE )\r
-       {\r
-               *p_bytes_read = 0;\r
-               cl_obj_unlock( &p_adapter->obj );\r
-               return NDIS_STATUS_NOT_ACCEPTED;\r
-       }\r
-\r
-       cl_obj_unlock( &p_adapter->obj );\r
-\r
-       switch( oid )\r
-       {\r
-       /* Required General */\r
-       case OID_GEN_CURRENT_PACKET_FILTER:\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                       ("Port %d received set for OID_GEN_CURRENT_PACKET_FILTER\n", port_num));\r
-               if( info_buf_len < sizeof(p_adapter->packet_filter) )\r
-               {\r
-                       status = NDIS_STATUS_INVALID_LENGTH;\r
-               }\r
-               else if( !info_buf )\r
-               {\r
-                       status = NDIS_STATUS_INVALID_DATA;\r
-               }\r
-               else\r
-               {\r
-                       KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
-                       cl_obj_lock( &p_adapter->obj );\r
-                       switch( p_adapter->state )\r
-                       {\r
-                       case IB_PNP_PORT_ADD:\r
-                               p_adapter->set_oid.oid = oid;\r
-                               p_adapter->set_oid.p_buf = info_buf;\r
-                               p_adapter->set_oid.buf_len = info_buf_len;\r
-                               p_adapter->set_oid.p_bytes_used = p_bytes_read;\r
-                               p_adapter->set_oid.p_bytes_needed = p_bytes_needed;\r
-                               p_adapter->pending_set = TRUE;\r
-                               status = NDIS_STATUS_PENDING;\r
-                               break;\r
-\r
-                       case IB_PNP_PORT_REMOVE:\r
-                               status = NDIS_STATUS_NOT_ACCEPTED;\r
-                               break;\r
-\r
-                       default:\r
-                               if( !p_adapter->packet_filter && (*(uint32_t*)info_buf) )\r
-                               {\r
-                                       cl_qlist_insert_tail(\r
-                                               &g_ipoib.adapter_list, &p_adapter->entry );\r
-\r
-                                       /*\r
-                                        * Filter was zero, now non-zero.  Register IP addresses\r
-                                        * with SA.\r
-                                        */\r
-                                       ipoib_reg_addrs( p_adapter );\r
-                               }\r
-                               else if( p_adapter->packet_filter && !(*(uint32_t*)info_buf) )\r
-                               {\r
-                                       /*\r
-                                        * Filter was non-zero, now zero.  Deregister IP addresses.\r
-                                        */\r
-                                       ipoib_dereg_addrs( p_adapter );\r
-\r
-                                       ASSERT( cl_qlist_count( &g_ipoib.adapter_list ) );\r
-                                       cl_qlist_remove_item(\r
-                                               &g_ipoib.adapter_list, &p_adapter->entry );\r
-                               }\r
-\r
-                               p_adapter->packet_filter = *(uint32_t*)info_buf;\r
-                       }\r
-                       cl_obj_unlock( &p_adapter->obj );\r
-                       KeReleaseInStackQueuedSpinLock( &hdl );\r
-               }\r
-               break;\r
-\r
-       case OID_GEN_CURRENT_LOOKAHEAD:\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                       ("Port %d received set for OID_GEN_CURRENT_LOOKAHEAD\n", port_num));\r
-               if( info_buf_len < buf_len )\r
-                       status = NDIS_STATUS_INVALID_LENGTH;\r
-               break;\r
-\r
-       case OID_GEN_PROTOCOL_OPTIONS:\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                       ("Port %d received set for OID_GEN_PROTOCOL_OPTIONS\n", port_num));\r
-               if( info_buf_len < buf_len )\r
-                       status = NDIS_STATUS_INVALID_LENGTH;\r
-               break;\r
-\r
-       case OID_GEN_NETWORK_LAYER_ADDRESSES:\r
-               status = __ipoib_set_net_addr( p_adapter, info_buf, info_buf_len, p_bytes_read, p_bytes_needed);\r
-               break;\r
-\r
-#ifdef NDIS51_MINIPORT\r
-       case OID_GEN_MACHINE_NAME:\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OID,\r
-                       ("Port %d received set for OID_GEN_MACHINE_NAME\n", port_num) );\r
-               break;\r
-#endif\r
-\r
-       /* Required Ethernet operational characteristics */\r
-       case OID_802_3_MULTICAST_LIST:\r
-               IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_OID,\r
-                       ("Port %d received set for OID_802_3_MULTICAST_LIST\n", port_num) );\r
-               if( info_buf_len > MAX_MCAST * sizeof(mac_addr_t) )\r
-               {\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d OID_802_3_MULTICAST_LIST - Multicast list full.\n", port_num) );\r
-                       status = NDIS_STATUS_MULTICAST_FULL;\r
-                       *p_bytes_needed = MAX_MCAST * sizeof(mac_addr_t);\r
-               }\r
-               else if( info_buf_len % sizeof(mac_addr_t) )\r
-               {\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d OID_802_3_MULTICAST_LIST - Invalid input buffer.\n", port_num) );\r
-                       status = NDIS_STATUS_INVALID_DATA;\r
-               }\r
-               else if( !info_buf && info_buf_len )\r
-               {\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d OID_802_3_MULTICAST_LIST - Invalid input buffer.\n", port_num) );\r
-                       status = NDIS_STATUS_INVALID_DATA;\r
-               }\r
-               else\r
-               {\r
-                       ipoib_refresh_mcast( p_adapter, (mac_addr_t*)info_buf,\r
-                               (uint8_t)(info_buf_len / sizeof(mac_addr_t)) );\r
-\r
-                       buf_len = info_buf_len;\r
-                       /*\r
-                        * Note that we don't return pending.  It will likely take longer\r
-                        * for our SA transactions to complete than NDIS will give us\r
-                        * before reseting the adapter.  If an SA failure is encountered,\r
-                        * the adapter will be marked as hung and we will get reset.\r
-                        */\r
-                       status = NDIS_STATUS_SUCCESS;\r
-               }\r
-               break;\r
-\r
-       case OID_TCP_TASK_OFFLOAD:\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                       ("Port %d received set for OID_TCP_TASK_OFFLOAD\n", port_num) );\r
-\r
-               buf_len = info_buf_len;\r
-               status =\r
-                       __ipoib_set_tcp_task_offload( p_adapter, info_buf, &buf_len );\r
-               break;\r
-\r
-       /* Optional General */\r
-       case OID_GEN_TRANSPORT_HEADER_OFFSET:\r
-#ifdef NDIS51_MINIPORT\r
-       case OID_GEN_RNDIS_CONFIG_PARAMETER:\r
-       case OID_GEN_VLAN_ID:\r
-#endif\r
-               status = NDIS_STATUS_NOT_SUPPORTED;\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                       ("Port %d received an unsupported oid of 0x%.8X!\n", port_num, oid));\r
-               break;\r
-\r
-       case OID_GEN_SUPPORTED_LIST:\r
-       case OID_GEN_HARDWARE_STATUS:\r
-       case OID_GEN_MEDIA_SUPPORTED:\r
-       case OID_GEN_MEDIA_IN_USE:\r
-       case OID_GEN_MAXIMUM_FRAME_SIZE:\r
-       case OID_GEN_LINK_SPEED:\r
-       case OID_GEN_TRANSMIT_BUFFER_SPACE:\r
-       case OID_GEN_RECEIVE_BUFFER_SPACE:\r
-       case OID_GEN_MAXIMUM_LOOKAHEAD:\r
-       case OID_GEN_TRANSMIT_BLOCK_SIZE:\r
-       case OID_GEN_RECEIVE_BLOCK_SIZE:\r
-       case OID_GEN_MAXIMUM_TOTAL_SIZE:\r
-       case OID_GEN_VENDOR_ID:\r
-       case OID_GEN_VENDOR_DESCRIPTION:\r
-       case OID_GEN_VENDOR_DRIVER_VERSION:\r
-       case OID_GEN_DRIVER_VERSION:\r
-       case OID_GEN_MAC_OPTIONS:\r
-       case OID_GEN_MEDIA_CONNECT_STATUS:\r
-       case OID_GEN_MAXIMUM_SEND_PACKETS:\r
-       case OID_GEN_SUPPORTED_GUIDS:\r
-       case OID_GEN_PHYSICAL_MEDIUM:\r
-       default:\r
-               status = NDIS_STATUS_INVALID_OID;\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                       ("Port %d received an invalid oid of 0x%.8X!\n", port_num, oid));\r
-               break;\r
-       }\r
-\r
-       if( status == NDIS_STATUS_SUCCESS )\r
-       {\r
-               *p_bytes_read = buf_len;\r
-       }\r
-       else\r
-       {\r
-               if( status == NDIS_STATUS_INVALID_LENGTH )\r
-               {\r
-                       if ( !*p_bytes_needed )\r
-                       {\r
-                               *p_bytes_needed = buf_len;\r
-                       }\r
-               }\r
-\r
-               *p_bytes_read = 0;\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_OID );\r
-       return status;\r
-}\r
-\r
-#ifdef NNN\r
-NDIS_STATUS\r
-ipoib_set_info(\r
-       ipoib_adapter_t*           p_adapter,\r
-       IN PNDIS_OID_REQUEST   pNdisRequest)\r
-{\r
-       NDIS_STATUS                     status;\r
-       NDIS_OID            oid;\r
-       UINT                            info_buf_len;\r
-       UINT                            buf_len;\r
-       uint8_t                         port_num;\r
-       PVOID                           info_buf;\r
-       UINT                            *p_bytes_needed;\r
-       KLOCK_QUEUE_HANDLE      hdl;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_OID );\r
-\r
-    oid                        = pNdisRequest->DATA.SET_INFORMATION.Oid;\r
-    info_buf           = pNdisRequest->DATA.QUERY_INFORMATION.InformationBuffer;\r
-    info_buf_len       = pNdisRequest->DATA.QUERY_INFORMATION.InformationBufferLength;\r
-       p_bytes_needed  = &pNdisRequest->DATA.QUERY_INFORMATION.BytesNeeded;\r
-       status = NDIS_STATUS_SUCCESS;\r
-\r
-       buf_len = sizeof(UINT);\r
-       port_num = p_adapter->guids.port_num;\r
-\r
-       switch( oid )\r
-       {\r
-       /* Required General */\r
-       case OID_GEN_CURRENT_PACKET_FILTER:\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                       ("Port %d received set for OID_GEN_CURRENT_PACKET_FILTER\n", port_num));\r
-               if( info_buf_len < sizeof(p_adapter->packet_filter) )\r
-               {\r
-                       status = NDIS_STATUS_INVALID_LENGTH;\r
-               }\r
-               else if( !info_buf )\r
-               {\r
-                       status = NDIS_STATUS_INVALID_DATA;\r
-               }\r
-               else\r
-               {\r
-                       KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
-                       cl_obj_lock( &p_adapter->obj );\r
-                       switch( p_adapter->state )\r
-                       {\r
-                       case IB_PNP_PORT_ADD:\r
-                               p_adapter->p_oid_request = pNdisRequest;\r
-                               status = NDIS_STATUS_PENDING;\r
-                               break;\r
-\r
-                       case IB_PNP_PORT_REMOVE:\r
-                               status = NDIS_STATUS_NOT_ACCEPTED;\r
-                               break;\r
-\r
-                       default:\r
-                               if( !p_adapter->packet_filter && (*(uint32_t*)info_buf) )\r
-                               {\r
-                                       cl_qlist_insert_tail(\r
-                                               &g_ipoib.adapter_list, &p_adapter->entry );\r
-\r
-                                       /*\r
-                                        * Filter was zero, now non-zero.  Register IP addresses\r
-                                        * with SA.\r
-                                        */\r
-                                       ipoib_reg_addrs( p_adapter );\r
-                               }\r
-                               else if( p_adapter->packet_filter && !(*(uint32_t*)info_buf) )\r
-                               {\r
-                                       /*\r
-                                        * Filter was non-zero, now zero.  Deregister IP addresses.\r
-                                        */\r
-                                       ipoib_dereg_addrs( p_adapter );\r
-\r
-                                       ASSERT( cl_qlist_count( &g_ipoib.adapter_list ) );\r
-                                       cl_qlist_remove_item(\r
-                                               &g_ipoib.adapter_list, &p_adapter->entry );\r
-                               }\r
-\r
-                               p_adapter->packet_filter = *(uint32_t*)info_buf;\r
-                       }\r
-                       cl_obj_unlock( &p_adapter->obj );\r
-                       KeReleaseInStackQueuedSpinLock( &hdl );\r
-               }\r
-               break;\r
-\r
-       case OID_GEN_CURRENT_LOOKAHEAD:\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                       ("Port %d received set for OID_GEN_CURRENT_LOOKAHEAD\n", port_num));\r
-               if( info_buf_len < buf_len )\r
-                       status = NDIS_STATUS_INVALID_LENGTH;\r
-               break;\r
-\r
-       case OID_GEN_PROTOCOL_OPTIONS:\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                       ("Port %d received set for OID_GEN_PROTOCOL_OPTIONS\n", port_num));\r
-               if( info_buf_len < buf_len )\r
-                       status = NDIS_STATUS_INVALID_LENGTH;\r
-               break;\r
-\r
-       case OID_GEN_NETWORK_LAYER_ADDRESSES:\r
-               status = __ipoib_set_net_addr( p_adapter, pNdisRequest);\r
-               break;\r
-\r
-       case OID_GEN_MACHINE_NAME:\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OID,\r
-                       ("Port %d received set for OID_GEN_MACHINE_NAME\n", port_num) );\r
-               break;\r
-\r
-\r
-       /* Required Ethernet operational characteristics */\r
-       case OID_802_3_MULTICAST_LIST:\r
-               IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_OID,\r
-                       ("Port %d received set for OID_802_3_MULTICAST_LIST\n", port_num) );\r
-               if( info_buf_len > MAX_MCAST * sizeof(mac_addr_t) )\r
-               {\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d OID_802_3_MULTICAST_LIST - Multicast list full.\n", port_num) );\r
-                       status = NDIS_STATUS_MULTICAST_FULL;\r
-                       *p_bytes_needed = MAX_MCAST * sizeof(mac_addr_t);\r
-               }\r
-               else if( info_buf_len % sizeof(mac_addr_t) )\r
-               {\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d OID_802_3_MULTICAST_LIST - Invalid input buffer.\n", port_num) );\r
-                       status = NDIS_STATUS_INVALID_DATA;\r
-               }\r
-               else if( !info_buf && info_buf_len )\r
-               {\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d OID_802_3_MULTICAST_LIST - Invalid input buffer.\n", port_num) );\r
-                       status = NDIS_STATUS_INVALID_DATA;\r
-               }\r
-               else\r
-               {\r
-                       ipoib_refresh_mcast( p_adapter, (mac_addr_t*)info_buf,\r
-                               (uint8_t)(info_buf_len / sizeof(mac_addr_t)) );\r
-\r
-                       buf_len = info_buf_len;\r
-                       /*\r
-                        * Note that we don't return pending.  It will likely take longer\r
-                        * for our SA transactions to complete than NDIS will give us\r
-                        * before reseting the adapter.  If an SA failure is encountered,\r
-                        * the adapter will be marked as hung and we will get reset.\r
-                        */\r
-                       status = NDIS_STATUS_SUCCESS;\r
-               }\r
-               break;\r
-\r
-       case OID_TCP_TASK_OFFLOAD:\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                       ("Port %d received set for OID_TCP_TASK_OFFLOAD\n", port_num) );\r
-\r
-               buf_len = info_buf_len;\r
-               status =\r
-                       __ipoib_set_tcp_task_offload( p_adapter, pNdisRequest );\r
-               break;\r
-\r
-       /* Optional General */\r
-       case OID_GEN_TRANSPORT_HEADER_OFFSET:\r
-#ifdef NDIS51_MINIPORT\r
-       case OID_GEN_RNDIS_CONFIG_PARAMETER:\r
-       case OID_GEN_VLAN_ID:\r
-#endif\r
-               status = NDIS_STATUS_NOT_SUPPORTED;\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                       ("Port %d received an unsupported oid of 0x%.8X!\n", port_num, oid));\r
-               break;\r
-\r
-       case OID_GEN_SUPPORTED_LIST:\r
-       case OID_GEN_HARDWARE_STATUS:\r
-       case OID_GEN_MEDIA_SUPPORTED:\r
-       case OID_GEN_MEDIA_IN_USE:\r
-       case OID_GEN_MAXIMUM_FRAME_SIZE:\r
-       case OID_GEN_LINK_SPEED:\r
-       case OID_GEN_TRANSMIT_BUFFER_SPACE:\r
-       case OID_GEN_RECEIVE_BUFFER_SPACE:\r
-       case OID_GEN_MAXIMUM_LOOKAHEAD:\r
-       case OID_GEN_TRANSMIT_BLOCK_SIZE:\r
-       case OID_GEN_RECEIVE_BLOCK_SIZE:\r
-       case OID_GEN_MAXIMUM_TOTAL_SIZE:\r
-       case OID_GEN_VENDOR_ID:\r
-       case OID_GEN_VENDOR_DESCRIPTION:\r
-       case OID_GEN_VENDOR_DRIVER_VERSION:\r
-       case OID_GEN_DRIVER_VERSION:\r
-       case OID_GEN_MAC_OPTIONS:\r
-       case OID_GEN_MEDIA_CONNECT_STATUS:\r
-       case OID_GEN_MAXIMUM_SEND_PACKETS:\r
-       case OID_GEN_SUPPORTED_GUIDS:\r
-       case OID_GEN_PHYSICAL_MEDIUM:\r
-       default:\r
-               status = NDIS_STATUS_INVALID_OID;\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                       ("Port %d received an invalid oid of 0x%.8X!\n", port_num, oid));\r
-               break;\r
-       }\r
-\r
-       if( status == NDIS_STATUS_SUCCESS )\r
-       {\r
-               pNdisRequest->DATA.SET_INFORMATION.BytesRead = buf_len;\r
-       }\r
-       else\r
-       {\r
-               if( status == NDIS_STATUS_INVALID_LENGTH )\r
-               {\r
-                       if ( !*p_bytes_needed )\r
-                       {\r
-                               *p_bytes_needed = buf_len;\r
-                       }\r
-               }\r
-\r
-               pNdisRequest->DATA.SET_INFORMATION.BytesRead = 0;\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_OID );\r
-       return status;\r
-}\r
-#endif\r
-static NDIS_STATUS\r
-ipoib_oid_handler(\r
-    IN  NDIS_HANDLE         adapter_context,\r
-    IN  PNDIS_OID_REQUEST   pNdisRequest)\r
-{\r
-    NDIS_REQUEST_TYPE       RequestType;\r
-       NDIS_STATUS     status = NDIS_STATUS_SUCCESS;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_OID );\r
-\r
-       RequestType = pNdisRequest->RequestType;\r
-\r
-       switch(RequestType)\r
-       {\r
-        case NdisRequestSetInformation:            \r
-            status = ipoib_set_info(adapter_context,\r
-                                               pNdisRequest->DATA.SET_INFORMATION.Oid,\r
-                                               pNdisRequest->DATA.SET_INFORMATION.InformationBuffer,\r
-                                               pNdisRequest->DATA.SET_INFORMATION.InformationBufferLength,\r
-                                               (PULONG)&pNdisRequest->DATA.SET_INFORMATION.BytesRead,\r
-                                               (PULONG)&pNdisRequest->DATA.SET_INFORMATION.BytesNeeded);\r
-            break;\r
-                \r
-        case NdisRequestQueryInformation:\r
-        case NdisRequestQueryStatistics:\r
-            status = ipoib_query_info(adapter_context,\r
-                                               pNdisRequest->DATA.QUERY_INFORMATION.Oid,\r
-                                               pNdisRequest->DATA.QUERY_INFORMATION.InformationBuffer,\r
-                                               pNdisRequest->DATA.QUERY_INFORMATION.InformationBufferLength,\r
-                                               (PULONG)&pNdisRequest->DATA.QUERY_INFORMATION.BytesWritten,\r
-                                               (PULONG)&pNdisRequest->DATA.QUERY_INFORMATION.BytesNeeded);\r
-                                               \r
-            break;\r
-\r
-        default:\r
-            status = NDIS_STATUS_NOT_SUPPORTED;\r
-            break;\r
-       }\r
-       IPOIB_EXIT( IPOIB_DBG_OID );\r
-       return status;\r
-}\r
-\r
-//! Transfers some number of packets, specified as an array of packet pointers, over the network. \r
-/*  For a deserialized driver, these packets are completed asynchronously\r
-using NdisMSendComplete.\r
-IRQL <= DISPATCH_LEVEL\r
-\r
-@param adapter_context Pointer to ipoib_adapter_t structure with per NIC state\r
-@param packet_array Array of packets to send\r
-@param numPackets Number of packets in the array\r
-*/\r
-void\r
-ipoib_send_net_buffer_list(\r
-    IN  NDIS_HANDLE         adapter_context,\r
-    IN  PNET_BUFFER_LIST    net_buffer_list,\r
-    IN  NDIS_PORT_NUMBER    port_num,\r
-    IN  ULONG               send_flags\r
-    )\r
-{\r
-       ipoib_adapter_t         *p_adapter;\r
-       ipoib_port_t            *p_port;\r
-       ULONG                           send_complete_flags;\r
-    PNET_BUFFER_LIST    curr_net_buffer_list;\r
-    PNET_BUFFER_LIST    next_net_buffer_list;\r
-       NDIS_STATUS     status = NDIS_STATUS_SUCCESS;\r
-       \r
-       UNREFERENCED_PARAMETER(port_num);\r
-       PERF_DECLARE( SendPackets );\r
-       PERF_DECLARE( PortSend );\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_SEND );\r
-       cl_perf_start( SendPackets );\r
-\r
-       CL_ASSERT( adapter_context );\r
-       p_adapter = (ipoib_adapter_t*)adapter_context;\r
-       p_port = p_adapter->p_port;\r
-\r
-       cl_obj_lock( &p_adapter->obj );\r
-       if( p_adapter->ipoib_state == IPOIB_PAUSING ||\r
-               p_adapter->ipoib_state == IPOIB_PAUSED)\r
-       {\r
-               status = NDIS_STATUS_PAUSED; \r
-               cl_obj_unlock( &p_adapter->obj );\r
-               goto compl_status;\r
-       }\r
-\r
-       if( p_adapter->state != IB_PNP_PORT_ACTIVE || !p_adapter->p_port )\r
-       {\r
-               cl_obj_unlock( &p_adapter->obj );\r
-               status = NDIS_STATUS_FAILURE; \r
-               goto compl_status;\r
-       }\r
-\r
-       p_port = p_adapter->p_port;\r
-       ipoib_port_ref( p_port, ref_send_packets );\r
-       cl_obj_unlock( &p_adapter->obj );\r
-       //IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-       //                      ("Starting NET BUFFER LIST \n") );\r
-       for (curr_net_buffer_list = net_buffer_list;\r
-               curr_net_buffer_list != NULL;\r
-               curr_net_buffer_list = next_net_buffer_list)\r
-       {\r
-               next_net_buffer_list = NET_BUFFER_LIST_NEXT_NBL(curr_net_buffer_list);\r
-               cl_perf_start( PortSend );\r
-               \r
-               ipoib_port_send( p_port, curr_net_buffer_list, send_flags);\r
-               cl_perf_stop( &adapter->perf, PortSend );\r
-       }\r
-       ipoib_port_deref( p_port, ref_send_packets );\r
-\r
-       cl_perf_stop( &p_adapter->perf, SendPackets );\r
-\r
-       cl_perf_log( &p_adapter->perf, SendBundle, num_packets );\r
-\r
-compl_status:\r
-    if (status != NDIS_STATUS_SUCCESS)\r
-       {\r
-               //ASSERT(FALSE); //????\r
-               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Got bad status \n") );\r
-               send_complete_flags = 0;\r
-           \r
-               for (curr_net_buffer_list = net_buffer_list;\r
-                                curr_net_buffer_list != NULL;\r
-                                curr_net_buffer_list = next_net_buffer_list)\r
-               {\r
-                       next_net_buffer_list = NET_BUFFER_LIST_NEXT_NBL(curr_net_buffer_list);\r
-                       NET_BUFFER_LIST_STATUS(curr_net_buffer_list) = status;\r
-                       ipoib_inc_send_stat( p_adapter, IP_STAT_DROPPED, 0 );\r
-               }\r
-\r
-\r
-               if (NDIS_TEST_SEND_AT_DISPATCH_LEVEL(send_flags))\r
-               {\r
-                       NDIS_SET_SEND_COMPLETE_FLAG(send_complete_flags, NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL);\r
-               }\r
-                     \r
-               NdisMSendNetBufferListsComplete(\r
-                       p_adapter->h_adapter,\r
-                       net_buffer_list,\r
-                       send_complete_flags);  \r
-       }\r
-       IPOIB_EXIT( IPOIB_DBG_SEND );\r
-}\r
-\r
-void\r
-ipoib_pnp_notify(\r
-       IN                              NDIS_HANDLE                                     adapter_context,\r
-       IN PNET_DEVICE_PNP_EVENT  pnp_event)\r
-{\r
-       ipoib_adapter_t *p_adapter;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_PNP );\r
-\r
-       p_adapter = (ipoib_adapter_t*)adapter_context;\r
-\r
-       IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_PNP, ("Event %d\n", pnp_event->DevicePnPEvent) );\r
-       if( pnp_event->DevicePnPEvent != NdisDevicePnPEventPowerProfileChanged )\r
-       {\r
-               cl_obj_lock( &p_adapter->obj );\r
-               p_adapter->state = IB_PNP_PORT_REMOVE;\r
-               cl_obj_unlock( &p_adapter->obj );\r
-\r
-               ipoib_resume_oids( p_adapter );\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_PNP );\r
-}\r
-\r
-\r
-VOID\r
-ipoib_shutdown_ex(\r
-       IN NDIS_HANDLE  adapter_context,\r
-       IN NDIS_SHUTDOWN_ACTION  shutdown_action)\r
-{\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-       UNUSED_PARAM( adapter_context );\r
-       UNUSED_PARAM( shutdown_action );\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-}\r
-\r
-\r
-void\r
-ipoib_resume_oids(\r
-       IN                              ipoib_adapter_t* const          p_adapter )\r
-{\r
-       ULONG                           info;\r
-       NDIS_STATUS                     status;\r
-       boolean_t                       pending_query, pending_set;\r
-       pending_oid_t           query_oid = {0};\r
-       pending_oid_t           set_oid = {0};\r
-       KLOCK_QUEUE_HANDLE      hdl;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       cl_obj_lock( &p_adapter->obj );\r
-       /*\r
-        * Set the status depending on our state.  Fail OID requests that\r
-        * are pending while we reset the adapter.\r
-        */\r
-       switch( p_adapter->state )\r
-       {\r
-       case IB_PNP_PORT_ADD:\r
-               status = NDIS_STATUS_FAILURE;\r
-               break;\r
-\r
-       case IB_PNP_PORT_REMOVE:\r
-               status = NDIS_STATUS_NOT_ACCEPTED;\r
-               break;\r
-               \r
-       default:\r
-               status = NDIS_STATUS_SUCCESS;\r
-       }\r
-\r
-       pending_query = p_adapter->pending_query;\r
-       if( pending_query )\r
-       {\r
-               query_oid = p_adapter->query_oid;\r
-               p_adapter->pending_query = FALSE;\r
-       }\r
-       pending_set = p_adapter->pending_set;\r
-       if( pending_set )\r
-       {\r
-               set_oid = p_adapter->set_oid;\r
-               p_adapter->pending_set = FALSE;\r
-       }\r
-       cl_obj_unlock( &p_adapter->obj );\r
-\r
-       /*\r
-        * If we had a pending OID request for OID_GEN_LINK_SPEED,\r
-        * complete it now.  Note that we hold the object lock since\r
-        * NdisMQueryInformationComplete is called at DISPATCH_LEVEL.\r
-        */\r
-       if( pending_query )\r
-       {\r
-               switch( query_oid.oid )\r
-               {\r
-               case OID_GEN_LINK_SPEED:\r
-                       ipoib_complete_query( p_adapter, &query_oid,\r
-                               status, &p_adapter->port_rate, sizeof(p_adapter->port_rate) );\r
-                       break;\r
-\r
-               case OID_GEN_MEDIA_CONNECT_STATUS:\r
-                       info = NdisMediaStateConnected;\r
-                       ipoib_complete_query( p_adapter, &query_oid,\r
-                               status, &info, sizeof(info) );\r
-                       break;\r
-\r
-               default:\r
-                       CL_ASSERT( query_oid.oid == OID_GEN_LINK_SPEED ||\r
-                               query_oid.oid == OID_GEN_MEDIA_CONNECT_STATUS );\r
-                       break;\r
-               }\r
-       }\r
-\r
-       if( pending_set )\r
-       {\r
-               switch( set_oid.oid )\r
-               {\r
-               case OID_GEN_CURRENT_PACKET_FILTER:\r
-                       /* Validation already performed in the SetInformation path. */\r
-\r
-                       KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
-                       cl_obj_lock( &p_adapter->obj );\r
-                       if( !p_adapter->packet_filter && (*(PULONG)set_oid.p_buf) )\r
-                       {\r
-                               cl_qlist_insert_tail(\r
-                                       &g_ipoib.adapter_list, &p_adapter->entry );\r
-                               /*\r
-                                * Filter was zero, now non-zero.  Register IP addresses\r
-                                * with SA.\r
-                                */\r
-                               ipoib_reg_addrs( p_adapter );\r
-                       }\r
-                       else if( p_adapter->packet_filter && !(*(PULONG)set_oid.p_buf) )\r
-                       {\r
-                               /* Filter was non-zero, now zero.  Deregister IP addresses. */\r
-                               ipoib_dereg_addrs( p_adapter );\r
-\r
-                               ASSERT( cl_qlist_count( &g_ipoib.adapter_list ) );\r
-                               cl_qlist_remove_item(\r
-                                       &g_ipoib.adapter_list, &p_adapter->entry );\r
-                       }\r
-                       p_adapter->packet_filter = *(PULONG)set_oid.p_buf;\r
-\r
-                       cl_obj_unlock( &p_adapter->obj );\r
-                       KeReleaseInStackQueuedSpinLock( &hdl );\r
-                       p_adapter->set_oid.p_pending_oid = NULL;\r
-                       NdisMOidRequestComplete( p_adapter->h_adapter, set_oid.p_pending_oid, status );\r
-                       break;\r
-\r
-               case OID_GEN_NETWORK_LAYER_ADDRESSES:\r
-                       status = __ipoib_set_net_addr( p_adapter,\r
-                                                                                  p_adapter->set_oid.p_buf,\r
-                                                                                  p_adapter->set_oid.buf_len,\r
-                                                                                  p_adapter->set_oid.p_bytes_used,\r
-                                                                                  p_adapter->set_oid.p_bytes_needed );\r
-\r
-                       if( status != NDIS_STATUS_PENDING )\r
-                       {\r
-                               p_adapter->set_oid.p_pending_oid = NULL;\r
-                               NdisMOidRequestComplete( p_adapter->h_adapter, set_oid.p_pending_oid, status );\r
-                       }\r
-                       break;\r
-\r
-               default:\r
-                       CL_ASSERT( set_oid.oid && 0 );\r
-                       break;\r
-               }\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-}\r
-\r
-\r
-static NDIS_STATUS\r
-__ipoib_set_net_addr(\r
-       IN              ipoib_adapter_t *       p_adapter,\r
-       IN              PVOID                           info_buf,\r
-       IN              ULONG                           info_buf_len,\r
-               OUT     PULONG                          p_bytes_read,\r
-               OUT     PULONG                          p_bytes_needed )\r
-{\r
-       NDIS_STATUS                             status;\r
-       PNETWORK_ADDRESS_LIST   p_net_addrs;\r
-       PNETWORK_ADDRESS                p_net_addr_oid;\r
-       PNETWORK_ADDRESS_IP             p_ip_addr;\r
-\r
-       net_address_item_t              *p_addr_item;\r
-\r
-       cl_status_t                             cl_status;\r
-\r
-       size_t                                  idx;\r
-       LONG                                    i;\r
-       ULONG                                   addr_size;\r
-       ULONG                                   total_size;\r
-\r
-       uint8_t                                 port_num;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_OID );\r
-\r
-       status = NDIS_STATUS_SUCCESS;\r
-       port_num = p_adapter->guids.port_num;\r
-\r
-       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-               ("Port %d received set for OID_GEN_NETWORK_LAYER_ADDRESSES\n",\r
-               port_num) );\r
-\r
-       if( !info_buf )\r
-       {\r
-               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Port %d - OID_GEN_NETWORK_LAYER_ADDRESSES - "\r
-                       "NULL buffer\n", port_num) );\r
-               IPOIB_EXIT( IPOIB_DBG_OID );\r
-               return NDIS_STATUS_INVALID_DATA;\r
-       }\r
-\r
-       /*\r
-        * Must use field offset because the structures define array's of size one\r
-        * of a the incorrect type for what is really stored.\r
-        */\r
-       if( info_buf_len < FIELD_OFFSET(NETWORK_ADDRESS_LIST, Address) )\r
-       {\r
-               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, \r
-                       ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - "\r
-                       "bad length of %d, not enough "\r
-                       "for NETWORK_ADDRESS_LIST (%d)\n", port_num, info_buf_len,\r
-                       FIELD_OFFSET(NETWORK_ADDRESS_LIST, Address)) );\r
-               *p_bytes_needed = FIELD_OFFSET(NETWORK_ADDRESS_LIST, Address);\r
-               IPOIB_EXIT( IPOIB_DBG_OID );\r
-               return NDIS_STATUS_INVALID_LENGTH;\r
-       }\r
-\r
-       p_net_addrs = (PNETWORK_ADDRESS_LIST)info_buf;\r
-       if( p_net_addrs->AddressCount == 0)\r
-       {\r
-               if( p_net_addrs->AddressType == NDIS_PROTOCOL_ID_TCP_IP )\r
-               {\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OID,\r
-                               ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - "\r
-                               "clear TCP/IP addresses\n", port_num) );\r
-               }\r
-               else\r
-               {\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OID,\r
-                               ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - "\r
-                               "Non TCP/IP address type of 0x%.4X on clear\n",\r
-                               port_num, p_net_addrs->AddressType) );\r
-                       IPOIB_EXIT( IPOIB_DBG_OID );\r
-                       return NDIS_STATUS_SUCCESS;\r
-               }\r
-       }\r
-\r
-       addr_size = FIELD_OFFSET(NETWORK_ADDRESS, Address) +\r
-               NETWORK_ADDRESS_LENGTH_IP;\r
-       total_size = FIELD_OFFSET(NETWORK_ADDRESS_LIST, Address) +\r
-               addr_size * p_net_addrs->AddressCount;\r
-\r
-       if( info_buf_len < total_size )\r
-       {\r
-               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - "\r
-                       "bad length of %d, %d required for %d addresses\n",\r
-                       port_num, info_buf_len, total_size, p_net_addrs->AddressCount) );\r
-               *p_bytes_needed = total_size;\r
-               IPOIB_EXIT( IPOIB_DBG_OID );\r
-               return NDIS_STATUS_INVALID_LENGTH;\r
-       }\r
-\r
-       /* Lock lists for duration since SA callbacks can occur on other CPUs */\r
-       cl_obj_lock( &p_adapter->obj );\r
-\r
-       /* Set the capacity of the vector to accomodate all assinged addresses. */\r
-       cl_status = cl_vector_set_capacity(\r
-               &p_adapter->ip_vector, p_net_addrs->AddressCount );\r
-       if( cl_status != CL_SUCCESS )\r
-       {\r
-               cl_obj_unlock( &p_adapter->obj );\r
-               IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Port %d - OID_GEN_NETWORK_LAYER_ADDRESSES - "\r
-                       "Failed to set IP vector capacity: %#x\n", port_num,\r
-                       cl_status) );\r
-               IPOIB_EXIT( IPOIB_DBG_OID );\r
-               return NDIS_STATUS_RESOURCES;\r
-       }\r
-\r
-       *p_bytes_read = total_size;\r
-\r
-       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-               ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - List contains %d addresses\n",\r
-                       port_num, p_net_addrs->AddressCount));\r
-\r
-       /* First look for addresses we had that should be removed */\r
-       for( idx = 0; idx != cl_vector_get_size( &p_adapter->ip_vector ); idx++ )\r
-       {\r
-               p_addr_item = (net_address_item_t*)\r
-                       cl_vector_get_ptr( &p_adapter->ip_vector, idx );\r
-               p_net_addr_oid = (PNETWORK_ADDRESS)p_net_addrs->Address;\r
-\r
-               for( i = 0; i < p_net_addrs->AddressCount; ++i, p_net_addr_oid =\r
-                       (PNETWORK_ADDRESS)((uint8_t *)p_net_addr_oid +\r
-                       FIELD_OFFSET(NETWORK_ADDRESS, Address) +\r
-                       p_net_addr_oid->AddressLength) )\r
-               {\r
-\r
-                       if( p_net_addr_oid->AddressType != NDIS_PROTOCOL_ID_TCP_IP )\r
-                       {\r
-                               IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_OID,\r
-                                       ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - Address %d is wrong type of 0x%.4X, "\r
-                                               "should be 0x%.4X\n", port_num, i, p_net_addr_oid->AddressType,\r
-                                               NDIS_PROTOCOL_ID_TCP_IP));\r
-                               continue;\r
-                       }\r
-\r
-                       if( p_net_addr_oid->AddressLength != NETWORK_ADDRESS_LENGTH_IP)\r
-                       {\r
-                               IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_OID,\r
-                                       ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - Address %d is wrong size of %d, "\r
-                                               "should be %d\n", port_num, i, p_net_addr_oid->AddressLength,\r
-                                               NETWORK_ADDRESS_LENGTH_IP));\r
-                               continue;\r
-                       }\r
-\r
-                       p_ip_addr = (PNETWORK_ADDRESS_IP)p_net_addr_oid->Address;\r
-                       if( !cl_memcmp( &p_ip_addr->in_addr,\r
-                               &p_addr_item->address.as_ulong, sizeof(ULONG) ) )\r
-                       {\r
-                               break;\r
-                       }\r
-               }\r
-\r
-               if( i == p_net_addrs->AddressCount )\r
-               {\r
-                       /* Didn't find a match, delete from SA */\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                               ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - Deleting Address %d.%d.%d.%d\n",\r
-                                       port_num,\r
-                                       p_addr_item->address.as_bytes[0],\r
-                                       p_addr_item->address.as_bytes[1],\r
-                                       p_addr_item->address.as_bytes[2],\r
-                                       p_addr_item->address.as_bytes[3]));\r
-\r
-                       if( p_addr_item->p_reg )\r
-                       {\r
-                               if( p_addr_item->p_reg->h_reg_svc )\r
-                               {\r
-                                       p_adapter->p_ifc->dereg_svc(\r
-                                               p_addr_item->p_reg->h_reg_svc, __ipoib_ats_dereg_cb );\r
-                               }\r
-                               else\r
-                               {\r
-                                       cl_free( p_addr_item->p_reg );\r
-                               }\r
-                               p_addr_item->p_reg = NULL;\r
-                       }\r
-                       p_addr_item->address.as_ulong = 0;\r
-               }\r
-       }\r
-\r
-       /* Now look for new addresses */\r
-       p_net_addr_oid = (NETWORK_ADDRESS *)p_net_addrs->Address;\r
-       idx = 0;\r
-       for( i = 0; i < p_net_addrs->AddressCount; i++, p_net_addr_oid =\r
-               (PNETWORK_ADDRESS)((uint8_t *)p_net_addr_oid +\r
-               FIELD_OFFSET(NETWORK_ADDRESS, Address) + p_net_addr_oid->AddressLength) )\r
-       {\r
-\r
-               if( p_net_addr_oid->AddressType != NDIS_PROTOCOL_ID_TCP_IP )\r
-               {\r
-                       IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_OID,\r
-                               ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - Address %d is wrong type of 0x%.4X, "\r
-                                       "should be 0x%.4X\n", port_num, i, p_net_addr_oid->AddressType,\r
-                                       NDIS_PROTOCOL_ID_TCP_IP));\r
-                       continue;\r
-               }\r
-\r
-               if( p_net_addr_oid->AddressLength != NETWORK_ADDRESS_LENGTH_IP)\r
-               {\r
-                       IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_OID,\r
-                               ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - Address %d is wrong size of %d, "\r
-                                       "should be %d\n", port_num, i, p_net_addr_oid->AddressLength,\r
-                                       NETWORK_ADDRESS_LENGTH_IP));\r
-                       continue;\r
-               }\r
-\r
-               p_ip_addr = (PNETWORK_ADDRESS_IP)p_net_addr_oid->Address;\r
-\r
-               /* Size the vector as needed. */\r
-               if( cl_vector_get_size( &p_adapter->ip_vector ) <= idx )\r
-                       cl_vector_set_size( &p_adapter->ip_vector, idx + 1 );\r
-\r
-               p_addr_item = cl_vector_get_ptr( &p_adapter->ip_vector, idx );\r
-               if( !cl_memcmp( &p_ip_addr->in_addr, &p_addr_item->address.as_ulong,\r
-                       sizeof(ULONG) ) )\r
-               {\r
-                       idx++;\r
-                       /* Already have this address - no change needed */\r
-                       continue;\r
-               }\r
-\r
-               /*\r
-                * Copy the address information, but don't register yet - the port\r
-                * could be down.\r
-                */\r
-               if( p_addr_item->p_reg )\r
-               {\r
-                       /* If in use by some other address, deregister. */\r
-                       if( p_addr_item->p_reg->h_reg_svc )\r
-                       {\r
-                               p_adapter->p_ifc->dereg_svc(\r
-                                       p_addr_item->p_reg->h_reg_svc, __ipoib_ats_dereg_cb );\r
-                       }\r
-                       else\r
-                       {\r
-                               cl_free( p_addr_item->p_reg );\r
-                       }\r
-                       p_addr_item->p_reg = NULL;\r
-               }\r
-               memcpy ((void *)&p_addr_item->address.as_ulong, (const void *)&p_ip_addr->in_addr, sizeof(ULONG) );\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                       ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - Adding Address %d.%d.%d.%d\n",\r
-                       port_num,\r
-                       p_addr_item->address.as_bytes[0],\r
-                       p_addr_item->address.as_bytes[1],\r
-                       p_addr_item->address.as_bytes[2],\r
-                       p_addr_item->address.as_bytes[3]) );\r
-               idx++;\r
-       }\r
-\r
-       /* Now clear any extra entries that shouldn't be there. */\r
-       while( idx < cl_vector_get_size( &p_adapter->ip_vector ) )\r
-       {\r
-               p_addr_item = (net_address_item_t*)\r
-                       cl_vector_get_ptr( &p_adapter->ip_vector,\r
-                       cl_vector_get_size( &p_adapter->ip_vector ) - 1 );\r
-\r
-               if( p_addr_item->p_reg )\r
-               {\r
-                       if( p_addr_item->p_reg->h_reg_svc )\r
-                       {\r
-                               p_adapter->p_ifc->dereg_svc(\r
-                                       p_addr_item->p_reg->h_reg_svc, __ipoib_ats_dereg_cb );\r
-                       }\r
-                       else\r
-                       {\r
-                               cl_free( p_addr_item->p_reg );\r
-                       }\r
-                       p_addr_item->p_reg = NULL;\r
-                       p_addr_item->address.as_ulong = 0;\r
-               }\r
-\r
-               /* No need to check return value - shrinking always succeeds. */\r
-               cl_vector_set_size( &p_adapter->ip_vector,\r
-                       cl_vector_get_size( &p_adapter->ip_vector ) - 1 );\r
-       }\r
-\r
-       if( p_adapter->state == IB_PNP_PORT_ACTIVE && p_adapter->packet_filter )\r
-               ipoib_reg_addrs( p_adapter );\r
-\r
-       cl_obj_unlock( &p_adapter->obj );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_OID );\r
-       return NDIS_STATUS_SUCCESS;\r
-}\r
-\r
-\r
-/* Object lock is held when this function is called. */\r
-void\r
-ipoib_reg_addrs(\r
-       IN                              ipoib_adapter_t* const          p_adapter )\r
-{\r
-       net_address_item_t              *p_addr_item;\r
-\r
-       size_t                                  idx;\r
-\r
-       uint8_t                                 port_num;\r
-\r
-       ib_api_status_t                 ib_status;\r
-       ib_reg_svc_req_t                ib_service;\r
-       ib_gid_t                                port_gid;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_OID );\r
-\r
-       if(p_adapter->guids.port_guid.pkey != IB_DEFAULT_PKEY)\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR,IPOIB_DBG_ERROR,\r
-               ("ATS Service available for default pkey only\n"));      \r
-               return;\r
-       }\r
-       port_num = p_adapter->guids.port_num;\r
-\r
-       /* Setup our service call with things common to all calls */\r
-       cl_memset( &ib_service, 0, sizeof(ib_service) );\r
-\r
-       /* BUGBUG Only register local subnet GID prefix for now */\r
-       ib_gid_set_default( &port_gid, p_adapter->guids.port_guid.guid );\r
-       ib_service.svc_rec.service_gid          = port_gid;\r
-\r
-       ib_service.svc_rec.service_pkey         = IB_DEFAULT_PKEY;\r
-       ib_service.svc_rec.service_lease        = IB_INFINITE_SERVICE_LEASE;\r
-\r
-       /* Must cast here because the service name is an array of unsigned chars but\r
-        * strcpy want a pointer to a signed char */\r
-       if ( StringCchCopy( (char *)ib_service.svc_rec.service_name, \r
-               sizeof(ib_service.svc_rec.service_name) / sizeof(char), ATS_NAME ) != S_OK) {\r
-               ASSERT(FALSE);\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR,IPOIB_DBG_ERROR,\r
-               ("Problem copying ATS name: exiting\n"));\r
-               return;\r
-       }\r
-    \r
-       /* IP Address in question will be put in below */\r
-       ib_service.port_guid            = p_adapter->guids.port_guid.guid;\r
-       ib_service.timeout_ms           = p_adapter->params.sa_timeout;\r
-       ib_service.retry_cnt            = p_adapter->params.sa_retry_cnt;\r
-\r
-       /* Can't set IB_FLAGS_SYNC here because I can't wait at dispatch */\r
-       ib_service.flags                        = 0;\r
-\r
-       /* Service context will be put in below */\r
-\r
-       ib_service.svc_data_mask        = IB_SR_COMPMASK_SID            |\r
-                                                                 IB_SR_COMPMASK_SGID           |\r
-                                                                 IB_SR_COMPMASK_SPKEY          |\r
-                                                                 IB_SR_COMPMASK_SLEASE         |\r
-                                                                 IB_SR_COMPMASK_SNAME          |\r
-                                                                 IB_SR_COMPMASK_SDATA8_12      |\r
-                                                                 IB_SR_COMPMASK_SDATA8_13      |\r
-                                                                 IB_SR_COMPMASK_SDATA8_14      |\r
-                                                                 IB_SR_COMPMASK_SDATA8_15;\r
-       ib_service.pfn_reg_svc_cb = __ipoib_ats_reg_cb;\r
-\r
-       for( idx = 0; idx < cl_vector_get_size( &p_adapter->ip_vector); idx++ )\r
-       {\r
-               p_addr_item = (net_address_item_t*)\r
-                       cl_vector_get_ptr(  &p_adapter->ip_vector, idx );\r
-\r
-               if( p_addr_item->p_reg )\r
-                       continue;\r
-\r
-               p_addr_item->p_reg = cl_zalloc( sizeof(ats_reg_t) );\r
-               if( !p_addr_item->p_reg )\r
-                       break;\r
-\r
-               p_addr_item->p_reg->p_adapter = p_adapter;\r
-\r
-               ib_service.svc_context          = p_addr_item->p_reg;\r
-\r
-               ib_service.svc_rec.service_id =\r
-                       ATS_SERVICE_ID & CL_HTON64(0xFFFFFFFFFFFFFF00);\r
-               /* ATS service IDs start at 0x10000CE100415453 */\r
-               ib_service.svc_rec.service_id |= ((uint64_t)(idx + 0x53)) << 56;\r
-\r
-               cl_memcpy( &ib_service.svc_rec.service_data8[ATS_IPV4_OFFSET],\r
-                       p_addr_item->address.as_bytes, IPV4_ADDR_SIZE );\r
-\r
-               /* Take a reference for each service request. */\r
-               cl_obj_ref(&p_adapter->obj);\r
-               ib_status = p_adapter->p_ifc->reg_svc(\r
-                       p_adapter->h_al, &ib_service, &p_addr_item->p_reg->h_reg_svc );\r
-               if( ib_status != IB_SUCCESS )\r
-               {\r
-                       if( ib_status == IB_INVALID_GUID )\r
-                       {\r
-                               /* If this occurs, we log the error but do not fail the OID yet */\r
-                               IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_OID,\r
-                                       ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - "\r
-                                       "Failed to register IP Address "\r
-                                       "of %d.%d.%d.%d with error IB_INVALID_GUID\n",\r
-                                       port_num,\r
-                                       p_addr_item->address.as_bytes[0],\r
-                                       p_addr_item->address.as_bytes[1],\r
-                                       p_addr_item->address.as_bytes[2],\r
-                                       p_addr_item->address.as_bytes[3]) );\r
-                       }\r
-                       else\r
-                       {\r
-                               /* Fatal error. */\r
-                               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                       ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - Failed to register IP Address "\r
-                                       "of %d.%d.%d.%d with error %s\n",\r
-                                       port_num,\r
-                                       p_addr_item->address.as_bytes[0],\r
-                                       p_addr_item->address.as_bytes[1],\r
-                                       p_addr_item->address.as_bytes[2],\r
-                                       p_addr_item->address.as_bytes[3],\r
-                                       p_adapter->p_ifc->get_err_str( ib_status )) );\r
-                               p_adapter->hung = TRUE;\r
-                       }\r
-                       cl_obj_deref(&p_adapter->obj);\r
-                       cl_free( p_addr_item->p_reg );\r
-                       p_addr_item->p_reg = NULL;\r
-               }\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_OID );\r
-}\r
-\r
-\r
-/* Object lock is held when this function is called. */\r
-void\r
-ipoib_dereg_addrs(\r
-       IN                              ipoib_adapter_t* const          p_adapter )\r
-{\r
-       net_address_item_t              *p_addr_item;\r
-\r
-       size_t                                  idx;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_OID );\r
-\r
-       for( idx = 0; idx < cl_vector_get_size( &p_adapter->ip_vector); idx++ )\r
-       {\r
-               p_addr_item = (net_address_item_t*)\r
-                       cl_vector_get_ptr( &p_adapter->ip_vector, idx );\r
-\r
-               if( !p_addr_item->p_reg )\r
-                       continue;\r
-\r
-               if( p_addr_item->p_reg->h_reg_svc )\r
-               {\r
-                       p_adapter->p_ifc->dereg_svc(\r
-                               p_addr_item->p_reg->h_reg_svc, __ipoib_ats_dereg_cb );\r
-               }\r
-               else\r
-               {\r
-                       cl_free( p_addr_item->p_reg );\r
-               }\r
-               p_addr_item->p_reg = NULL;\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_OID );\r
-}\r
-\r
-\r
-void\r
-ipoib_cancel_xmit(\r
-       IN                              NDIS_HANDLE             adapter_context,\r
-       IN                              PVOID                   cancel_id )\r
-{\r
-/*     ipoib_adapter_t* const p_adapter =\r
-               (ipoib_adapter_t* const )adapter_context;\r
-       \r
-\r
-if 0\r
-       if( p_adapter && p_adapter->p_port )\r
-       {\r
-               ipoib_port_cancel_xmit( p_adapter->p_port, cancel_id );\r
-       }\r
-endif\r
-*/\r
-\r
-       UNUSED_PARAM(adapter_context);\r
-       UNUSED_PARAM(cancel_id);\r
-\r
-       return; //TODO return this functionality\r
-\r
-}\r
-\r
-\r
-static void\r
-__ipoib_ats_reg_cb(\r
-       IN                              ib_reg_svc_rec_t                        *p_reg_svc_rec )\r
-{\r
-       ats_reg_t                               *p_reg;\r
-       uint8_t                                 port_num;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_OID );\r
-\r
-       CL_ASSERT( p_reg_svc_rec );\r
-       CL_ASSERT( p_reg_svc_rec->svc_context );\r
-\r
-       p_reg = (ats_reg_t*)p_reg_svc_rec->svc_context;\r
-       port_num = p_reg->p_adapter->guids.port_num;\r
-\r
-       cl_obj_lock( &p_reg->p_adapter->obj );\r
-\r
-       if( p_reg_svc_rec->req_status == IB_SUCCESS &&\r
-               !p_reg_svc_rec->resp_status )\r
-       {\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
-                                        ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - Registered IP Address "\r
-                                         "of %d.%d.%d.%d\n",\r
-                                         port_num,\r
-                                         p_reg_svc_rec->svc_rec.service_data8[ATS_IPV4_OFFSET],\r
-                                         p_reg_svc_rec->svc_rec.service_data8[ATS_IPV4_OFFSET+1],\r
-                                         p_reg_svc_rec->svc_rec.service_data8[ATS_IPV4_OFFSET+2],\r
-                                         p_reg_svc_rec->svc_rec.service_data8[ATS_IPV4_OFFSET+3]) );\r
-       }\r
-       else if( p_reg_svc_rec->req_status != IB_CANCELED )\r
-       {\r
-               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_OID,\r
-                                        ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - Failed to register IP Address "\r
-                                         "of %d.%d.%d.%d with error %s\n",\r
-                                         port_num,\r
-                                         p_reg_svc_rec->svc_rec.service_data8[ATS_IPV4_OFFSET],\r
-                                         p_reg_svc_rec->svc_rec.service_data8[ATS_IPV4_OFFSET+1],\r
-                                         p_reg_svc_rec->svc_rec.service_data8[ATS_IPV4_OFFSET+2],\r
-                                         p_reg_svc_rec->svc_rec.service_data8[ATS_IPV4_OFFSET+3],\r
-                                         p_reg->p_adapter->p_ifc->get_err_str( p_reg_svc_rec->resp_status )) );\r
-               p_reg->p_adapter->hung = TRUE;\r
-               p_reg->h_reg_svc = NULL;\r
-       }\r
-\r
-       cl_obj_unlock( &p_reg->p_adapter->obj );\r
-       cl_obj_deref(&p_reg->p_adapter->obj);\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_OID );\r
-}\r
-\r
-\r
-static void\r
-__ipoib_ats_dereg_cb(\r
-       IN                              void                                            *context )\r
-{\r
-       cl_free( context );\r
-}\r
-\r
-static NDIS_STATUS \r
-ipoib_pause(\r
-    IN  NDIS_HANDLE                         adapter_context,    \r
-    IN  PNDIS_MINIPORT_PAUSE_PARAMETERS     pause_parameters)\r
-{\r
-       ipoib_adapter_t         *p_adapter;\r
-       KLOCK_QUEUE_HANDLE      hdl;\r
-\r
-       UNREFERENCED_PARAMETER(pause_parameters);\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-//return NDIS_STATUS_SUCCESS;\r
-       CL_ASSERT(adapter_context);\r
-       p_adapter = (ipoib_adapter_t*)adapter_context;\r
-       CL_ASSERT(p_adapter->ipoib_state == IPOIB_RUNNING);\r
-\r
-       KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
-       p_adapter->ipoib_state = IPOIB_PAUSING;\r
-       KeReleaseInStackQueuedSpinLock( &hdl );\r
-\r
-       //TODO: \r
-       ipoib_port_resume(p_adapter->p_port,FALSE);\r
-//     ASSERT(FALSE);\r
-\r
-       KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
-       p_adapter->ipoib_state = IPOIB_PAUSED;\r
-       KeReleaseInStackQueuedSpinLock( &hdl );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-       return NDIS_STATUS_SUCCESS;\r
-}\r
-\r
-static NDIS_STATUS \r
-ipoib_restart(\r
-    IN  NDIS_HANDLE                         adapter_context,    \r
-    IN  PNDIS_MINIPORT_RESTART_PARAMETERS   restart_parameters)\r
-{\r
-       ipoib_adapter_t         *p_adapter;\r
-       KLOCK_QUEUE_HANDLE      hdl;\r
-    PNDIS_RESTART_ATTRIBUTES     NdisRestartAttributes;\r
-    PNDIS_RESTART_GENERAL_ATTRIBUTES  NdisGeneralAttributes;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-       p_adapter = (ipoib_adapter_t*)adapter_context;\r
-\r
-       NdisRestartAttributes = restart_parameters->RestartAttributes;\r
-\r
-    if (NdisRestartAttributes != NULL)\r
-    {\r
-        CL_ASSERT(NdisRestartAttributes->Oid == OID_GEN_MINIPORT_RESTART_ATTRIBUTES);\r
-        NdisGeneralAttributes = (PNDIS_RESTART_GENERAL_ATTRIBUTES)NdisRestartAttributes->Data;   \r
-        //\r
-        // Check to see if we need to change any attributes\r
-    }\r
-\r
-       KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
-       p_adapter->ipoib_state = IPOIB_RUNNING;\r
-       KeReleaseInStackQueuedSpinLock( &hdl );\r
-\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-    return NDIS_STATUS_SUCCESS;\r
-}\r
-\r
-/*++\r
-Routine Description:\r
-\r
-    This function aborts the request pending in the miniport.\r
-\r
-Arguments:\r
-\r
-    MiniportAdapterContext  Pointer to the adapter structure\r
-    RequestId               Specify the request to be cancelled.\r
-    \r
-Return Value:\r
-    \r
---*/\r
-static void\r
-ipoib_cancel_oid_request(\r
-    IN  NDIS_HANDLE            adapter_context,\r
-    IN  PVOID                  requestId\r
-    )\r
-{\r
-    PNDIS_OID_REQUEST    pending_request;\r
-       ipoib_adapter_t          *p_adapter;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_OID );\r
-       p_adapter = (ipoib_adapter_t*)adapter_context;\r
-\r
-    cl_obj_lock( &p_adapter->obj );\r
-    \r
-    if ( p_adapter->query_oid.p_pending_oid &&\r
-               p_adapter->query_oid.p_pending_oid->RequestId == requestId)\r
-       {\r
-               pending_request = p_adapter->query_oid.p_pending_oid;\r
-               p_adapter->query_oid.p_pending_oid = NULL;\r
-               p_adapter->pending_query = FALSE;\r
-       }\r
-       else if(p_adapter->set_oid.p_pending_oid && \r
-                       p_adapter->set_oid.p_pending_oid->RequestId == requestId)\r
-       {\r
-                pending_request = p_adapter->set_oid.p_pending_oid;\r
-                p_adapter->set_oid.p_pending_oid = NULL;\r
-                p_adapter->pending_set = FALSE;\r
-       }\r
-       else\r
-       {\r
-               cl_obj_unlock( &p_adapter->obj );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-               ("No Pending OID found\n") );\r
-               return;\r
-       }\r
-    cl_obj_unlock( &p_adapter->obj );\r
-\r
-    NdisMOidRequestComplete(p_adapter->h_adapter, \r
-                            pending_request, \r
-                            NDIS_STATUS_REQUEST_ABORTED);\r
-\r
-    IPOIB_EXIT( IPOIB_DBG_OID );\r
-}\r
diff --git a/branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp b/branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp
new file mode 100644 (file)
index 0000000..236a81f
--- /dev/null
@@ -0,0 +1,4570 @@
+/*\r
+ * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
+ * Copyright (c) 2006 Mellanox Technologies.  All rights reserved.\r
+ * Portions Copyright (c) 2008 Microsoft Corporation.  All rights reserved.\r
+ *\r
+ * This software is available to you under the OpenIB.org BSD license\r
+ * below:\r
+ *\r
+ *     Redistribution and use in source and binary forms, with or\r
+ *     without modification, are permitted provided that the following\r
+ *     conditions are met:\r
+ *\r
+ *      - Redistributions of source code must retain the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer.\r
+ *\r
+ *      - Redistributions in binary form must reproduce the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer in the documentation and/or other materials\r
+ *        provided with the distribution.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
+ * SOFTWARE.\r
+ *\r
+ * $Id: ipoib_driver.c 4506 2009-06-23 14:40:54Z xalex $\r
+ */\r
+\r
+#include "limits.h"\r
+#include "ipoib_driver.h"\r
+#include "ipoib_debug.h"\r
+\r
+#if defined(EVENT_TRACING)\r
+#ifdef offsetof\r
+#undef offsetof\r
+#endif\r
+#include "ipoib_driver.tmh"\r
+#endif\r
+\r
+#include "ipoib_port.h"\r
+#include "ipoib_ibat.h"\r
+#include <complib/cl_bus_ifc.h>\r
+#include <complib/cl_init.h>\r
+#include <initguid.h>\r
+#include <iba/ipoib_ifc.h>\r
+#include "ntstrsafe.h"\r
+#include "strsafe.h"\r
+#include <offload.h>\r
+\r
+\r
+\r
+#define MAJOR_DRIVER_VERSION 2\r
+#define MINOR_DRIVER_VERSION 1\r
+#if defined(NDIS60_MINIPORT)\r
+#define MAJOR_NDIS_VERSION 6\r
+#define MINOR_NDIS_VERSION 0\r
+\r
+#else\r
+#error NDIS Version not defined, try defining NDIS60_MINIPORT\r
+#endif\r
+\r
+PDRIVER_OBJECT                         g_p_drv_obj;\r
+\r
+\r
+#if 0\r
+static const NDIS_OID SUPPORTED_OIDS[] =\r
+{\r
+       OID_GEN_SUPPORTED_LIST,\r
+       OID_GEN_HARDWARE_STATUS,\r
+       OID_GEN_MEDIA_SUPPORTED,\r
+       OID_GEN_MEDIA_IN_USE,\r
+       OID_GEN_MAXIMUM_LOOKAHEAD,\r
+       OID_GEN_MAXIMUM_FRAME_SIZE,\r
+       OID_GEN_LINK_SPEED,\r
+       OID_GEN_TRANSMIT_BUFFER_SPACE,\r
+       OID_GEN_RECEIVE_BUFFER_SPACE,\r
+       OID_GEN_TRANSMIT_BLOCK_SIZE,\r
+       OID_GEN_RECEIVE_BLOCK_SIZE,\r
+       OID_GEN_VENDOR_ID,\r
+       OID_GEN_VENDOR_DESCRIPTION,\r
+       OID_GEN_CURRENT_PACKET_FILTER,\r
+       OID_GEN_CURRENT_LOOKAHEAD,\r
+       OID_GEN_DRIVER_VERSION,\r
+       OID_GEN_MAXIMUM_TOTAL_SIZE,\r
+       OID_GEN_PROTOCOL_OPTIONS,\r
+       OID_GEN_MAC_OPTIONS,\r
+       OID_GEN_MEDIA_CONNECT_STATUS,\r
+       OID_GEN_MAXIMUM_SEND_PACKETS,\r
+       OID_GEN_NETWORK_LAYER_ADDRESSES,\r
+       OID_GEN_VENDOR_DRIVER_VERSION,\r
+       OID_GEN_PHYSICAL_MEDIUM,\r
+       OID_GEN_XMIT_OK,\r
+       OID_GEN_RCV_OK,\r
+       OID_GEN_XMIT_ERROR,\r
+       OID_GEN_RCV_ERROR,\r
+       OID_GEN_RCV_NO_BUFFER,\r
+       OID_GEN_DIRECTED_BYTES_XMIT,\r
+       OID_GEN_DIRECTED_FRAMES_XMIT,\r
+       OID_GEN_MULTICAST_BYTES_XMIT,\r
+       OID_GEN_MULTICAST_FRAMES_XMIT,\r
+       OID_GEN_BROADCAST_BYTES_XMIT,\r
+       OID_GEN_BROADCAST_FRAMES_XMIT,\r
+       OID_GEN_DIRECTED_BYTES_RCV,\r
+       OID_GEN_DIRECTED_FRAMES_RCV,\r
+       OID_GEN_MULTICAST_BYTES_RCV,\r
+       OID_GEN_MULTICAST_FRAMES_RCV,\r
+       OID_GEN_BROADCAST_BYTES_RCV,\r
+       OID_GEN_BROADCAST_FRAMES_RCV,\r
+       OID_802_3_PERMANENT_ADDRESS,\r
+       OID_802_3_CURRENT_ADDRESS,\r
+       OID_802_3_MULTICAST_LIST,\r
+       OID_802_3_MAXIMUM_LIST_SIZE,\r
+       OID_802_3_MAC_OPTIONS,\r
+       OID_802_3_RCV_ERROR_ALIGNMENT,\r
+       OID_802_3_XMIT_ONE_COLLISION,\r
+       OID_802_3_XMIT_MORE_COLLISIONS,\r
+       OID_TCP_TASK_OFFLOAD\r
+};\r
+#endif\r
+\r
+NDIS_OID NICSupportedOidsTest[] =\r
+{\r
+    OID_GEN_SUPPORTED_LIST,\r
+    OID_GEN_HARDWARE_STATUS,\r
+    OID_GEN_MEDIA_SUPPORTED,\r
+    OID_GEN_MEDIA_IN_USE,\r
+    OID_GEN_MAXIMUM_LOOKAHEAD,\r
+    OID_GEN_MAXIMUM_FRAME_SIZE,\r
+    OID_GEN_TRANSMIT_BUFFER_SPACE,\r
+    OID_GEN_RECEIVE_BUFFER_SPACE,\r
+    OID_GEN_TRANSMIT_BLOCK_SIZE,\r
+    OID_GEN_RECEIVE_BLOCK_SIZE,\r
+    OID_GEN_VENDOR_ID,\r
+    OID_GEN_VENDOR_DESCRIPTION,\r
+    OID_GEN_VENDOR_DRIVER_VERSION,\r
+    OID_GEN_CURRENT_PACKET_FILTER,\r
+    OID_GEN_CURRENT_LOOKAHEAD,\r
+    OID_GEN_DRIVER_VERSION,\r
+    OID_GEN_MAXIMUM_TOTAL_SIZE,\r
+    OID_GEN_MAC_OPTIONS,\r
+    OID_GEN_MAXIMUM_SEND_PACKETS,\r
+    OID_GEN_XMIT_OK,\r
+    OID_GEN_RCV_OK,\r
+    OID_GEN_XMIT_ERROR,\r
+    OID_GEN_RCV_ERROR,\r
+    OID_GEN_RCV_NO_BUFFER,\r
+    OID_GEN_RCV_CRC_ERROR,\r
+    OID_GEN_TRANSMIT_QUEUE_LENGTH,\r
+    OID_802_3_PERMANENT_ADDRESS,\r
+    OID_802_3_CURRENT_ADDRESS,\r
+    OID_802_3_MULTICAST_LIST,\r
+    OID_802_3_MAXIMUM_LIST_SIZE,\r
+    OID_802_3_RCV_ERROR_ALIGNMENT,\r
+    OID_802_3_XMIT_ONE_COLLISION,\r
+    OID_802_3_XMIT_MORE_COLLISIONS,\r
+    OID_802_3_XMIT_DEFERRED,\r
+    OID_802_3_XMIT_MAX_COLLISIONS,\r
+    OID_802_3_RCV_OVERRUN,\r
+    OID_802_3_XMIT_UNDERRUN,\r
+    OID_802_3_XMIT_HEARTBEAT_FAILURE,\r
+    OID_802_3_XMIT_TIMES_CRS_LOST,\r
+    OID_802_3_XMIT_LATE_COLLISIONS,\r
+\r
+#if !BUILD_W2K\r
+    OID_GEN_PHYSICAL_MEDIUM,\r
+#endif\r
+\r
+    OID_TCP_TASK_OFFLOAD,\r
+    \r
+/* powermanagement */\r
+\r
+    OID_PNP_CAPABILITIES,\r
+    OID_PNP_SET_POWER,\r
+    OID_PNP_QUERY_POWER,\r
+    OID_PNP_ADD_WAKE_UP_PATTERN,\r
+    OID_PNP_REMOVE_WAKE_UP_PATTERN,\r
+    OID_PNP_ENABLE_WAKE_UP,\r
+\r
+\r
+/* custom oid WMI support */\r
+//    OID_CUSTOM_PERF_COUNTERS,\r
+ //   OID_CUSTOM_STRING,\r
+\r
+    OID_GEN_RECEIVE_SCALE_CAPABILITIES,\r
+    OID_GEN_RECEIVE_SCALE_PARAMETERS,\r
+\r
+//\r
+// new and required for NDIS 6 miniports\r
+//\r
+    OID_GEN_LINK_PARAMETERS,\r
+    OID_GEN_INTERRUPT_MODERATION,\r
+    OID_GEN_STATISTICS,\r
+\r
+/* Offload */\r
+    OID_TCP_OFFLOAD_CURRENT_CONFIG,\r
+    OID_TCP_OFFLOAD_PARAMETERS,\r
+    OID_TCP_OFFLOAD_HARDWARE_CAPABILITIES,\r
+    OID_OFFLOAD_ENCAPSULATION,\r
+\r
+/* Header - Data seperation */\r
+   // OID_GEN_HD_SPLIT_PARAMETERS,\r
+ //   OID_GEN_HD_SPLIT_CURRENT_CONFIG,\r
+    \r
+/* VLAN */\r
+  //  OID_ADD_VALN_ID,\r
+ //   OID_DELETE_VLAN_ID,\r
+\r
+/* Set MAC */\r
+  //  OID_SET_MAC_ADDRESS\r
+\r
+};\r
+\r
+static const NDIS_OID SUPPORTED_OIDS[] =\r
+{\r
+    OID_GEN_SUPPORTED_LIST,\r
+    OID_GEN_HARDWARE_STATUS,\r
+    OID_GEN_MEDIA_SUPPORTED,\r
+    OID_GEN_MEDIA_IN_USE,\r
+    OID_GEN_MAXIMUM_LOOKAHEAD,\r
+    OID_GEN_MAXIMUM_FRAME_SIZE,\r
+    OID_GEN_TRANSMIT_BUFFER_SPACE,\r
+    OID_GEN_RECEIVE_BUFFER_SPACE,\r
+    OID_GEN_TRANSMIT_BLOCK_SIZE,\r
+    OID_GEN_RECEIVE_BLOCK_SIZE,\r
+    OID_GEN_VENDOR_ID,\r
+    OID_GEN_VENDOR_DESCRIPTION,\r
+    OID_GEN_VENDOR_DRIVER_VERSION,\r
+    OID_GEN_CURRENT_PACKET_FILTER,\r
+    OID_GEN_CURRENT_LOOKAHEAD,\r
+    OID_GEN_DRIVER_VERSION,\r
+    OID_GEN_MAXIMUM_TOTAL_SIZE,\r
+    OID_GEN_MAC_OPTIONS,\r
+    OID_GEN_MAXIMUM_SEND_PACKETS,\r
+    OID_GEN_XMIT_OK,\r
+    OID_GEN_RCV_OK,\r
+    OID_GEN_XMIT_ERROR,\r
+    OID_GEN_RCV_ERROR,\r
+    OID_GEN_RCV_NO_BUFFER,\r
+    OID_GEN_RCV_CRC_ERROR,\r
+    OID_GEN_TRANSMIT_QUEUE_LENGTH,\r
+    OID_802_3_PERMANENT_ADDRESS,\r
+    OID_802_3_CURRENT_ADDRESS,\r
+    OID_802_3_MULTICAST_LIST,\r
+    OID_802_3_MAXIMUM_LIST_SIZE,\r
+    OID_802_3_RCV_ERROR_ALIGNMENT,\r
+    OID_802_3_XMIT_ONE_COLLISION,\r
+    OID_802_3_XMIT_MORE_COLLISIONS,\r
+    OID_802_3_XMIT_DEFERRED,\r
+    OID_802_3_XMIT_MAX_COLLISIONS,\r
+    OID_802_3_RCV_OVERRUN,\r
+    OID_802_3_XMIT_UNDERRUN,\r
+    OID_802_3_XMIT_HEARTBEAT_FAILURE,\r
+    OID_802_3_XMIT_TIMES_CRS_LOST,\r
+    OID_802_3_XMIT_LATE_COLLISIONS,\r
+\r
+#if !BUILD_W2K\r
+    OID_GEN_PHYSICAL_MEDIUM,\r
+#endif\r
+\r
+    OID_TCP_TASK_OFFLOAD,\r
+    \r
+/* powermanagement */\r
+\r
+    OID_PNP_CAPABILITIES,\r
+    OID_PNP_SET_POWER,\r
+    OID_PNP_QUERY_POWER,\r
+    OID_PNP_ADD_WAKE_UP_PATTERN,\r
+    OID_PNP_REMOVE_WAKE_UP_PATTERN,\r
+    OID_PNP_ENABLE_WAKE_UP,\r
+\r
+#if 0\r
+/* custom oid WMI support */\r
+    OID_CUSTOM_PERF_COUNTERS,\r
+    OID_CUSTOM_STRING,\r
+#endif\r
+\r
+    OID_GEN_RECEIVE_SCALE_CAPABILITIES,\r
+    OID_GEN_RECEIVE_SCALE_PARAMETERS,\r
+   \r
+\r
+//\r
+// new and required for NDIS 6 miniports\r
+//\r
+    OID_GEN_LINK_PARAMETERS,\r
+    OID_GEN_INTERRUPT_MODERATION,\r
+    OID_GEN_STATISTICS,\r
+\r
+/* Offload */\r
+    OID_TCP_OFFLOAD_CURRENT_CONFIG,\r
+    OID_TCP_OFFLOAD_PARAMETERS,\r
+    OID_TCP_OFFLOAD_HARDWARE_CAPABILITIES,\r
+    OID_OFFLOAD_ENCAPSULATION,\r
+    \r
+#if 0\r
+\r
+/* Header - Data seperation */\r
+    OID_GEN_HD_SPLIT_PARAMETERS,\r
+    OID_GEN_HD_SPLIT_CURRENT_CONFIG,\r
+\r
+/* VLAN */\r
+    OID_ADD_VALN_ID,\r
+    OID_DELETE_VLAN_ID,\r
+\r
+\r
+/* Set MAC */\r
+    OID_SET_MAC_ADDRESS\r
+#endif\r
+\r
+};\r
+\r
+static const unsigned char VENDOR_ID[] = {0x00, 0x06, 0x6A, 0x00};\r
+\r
+#define VENDOR_DESCRIPTION "Internet Protocol over InfiniBand"\r
+\r
+#define IB_INFINITE_SERVICE_LEASE      0xFFFFFFFF\r
+\r
+//The mask is 8 bit and can't contain more than 6 non-zero bits\r
+#define MAX_GUID_MAX 0xFC\r
+\r
+\r
+/* Global driver debug level */\r
+uint32_t               g_ipoib_dbg_level = TRACE_LEVEL_ERROR;\r
+uint32_t               g_ipoib_dbg_flags = 0x00000fff;\r
+ipoib_globals_t        g_ipoib = {0};\r
+NDIS_HANDLE            g_IpoibMiniportDriverHandle = NULL;\r
+NDIS_HANDLE            g_IpoibDriverContext = NULL;\r
+\r
+\r
+\r
+typedef struct _IPOIB_REG_ENTRY\r
+{\r
+       NDIS_STRING RegName;                // variable name text\r
+       BOOLEAN     bRequired;              // 1 -> required, 0 -> optional\r
+       UINT        FieldOffset;            // offset in parent struct\r
+       UINT        FieldSize;              // size (in bytes) of the field\r
+       UINT        Default;                // default value to use\r
+       UINT        Min;                    // minimum value allowed\r
+       UINT        Max;                    // maximum value allowed\r
+} IPOIB_REG_ENTRY, *PIPOIB_REG_ENTRY;\r
+\r
+IPOIB_REG_ENTRY HCARegTable[] = {\r
+       // reg value name             If Required  Offset in parentr struct             Field size                  Default         Min     Max\r
+       {NDIS_STRING_CONST("GUIDMask"),         0, IPOIB_OFFSET(guid_mask),             IPOIB_SIZE(guid_mask),          0,          0,    MAX_GUID_MAX},\r
+       /* GUIDMask should be the first element */\r
+       {NDIS_STRING_CONST("RqDepth"),          1, IPOIB_OFFSET(rq_depth),              IPOIB_SIZE(rq_depth),           512,        128,    1024},\r
+       {NDIS_STRING_CONST("RqLowWatermark"),   0, IPOIB_OFFSET(rq_low_watermark),      IPOIB_SIZE(rq_low_watermark),   4,          2,      8},\r
+       {NDIS_STRING_CONST("SqDepth"),          1, IPOIB_OFFSET(sq_depth),              IPOIB_SIZE(sq_depth),           512,        128,    1024},\r
+       {NDIS_STRING_CONST("SendChksum"),       1, IPOIB_OFFSET(send_chksum_offload),   IPOIB_SIZE(send_chksum_offload),CSUM_ENABLED,CSUM_DISABLED,CSUM_BYPASS},\r
+       {NDIS_STRING_CONST("RecvChksum"),       1, IPOIB_OFFSET(recv_chksum_offload),   IPOIB_SIZE(recv_chksum_offload),CSUM_ENABLED,CSUM_DISABLED,CSUM_BYPASS},\r
+       {NDIS_STRING_CONST("SaTimeout"),        1, IPOIB_OFFSET(sa_timeout),            IPOIB_SIZE(sa_timeout),         1000,       250,    UINT_MAX},\r
+       {NDIS_STRING_CONST("SaRetries"),        1, IPOIB_OFFSET(sa_retry_cnt),          IPOIB_SIZE(sa_retry_cnt),       10,         1,      UINT_MAX},\r
+       {NDIS_STRING_CONST("RecvRatio"),        1, IPOIB_OFFSET(recv_pool_ratio),       IPOIB_SIZE(recv_pool_ratio),    1,          1,      10},\r
+       {NDIS_STRING_CONST("PayloadMtu"),       1, IPOIB_OFFSET(payload_mtu),           IPOIB_SIZE(payload_mtu),        2044,       512,   MAX_UD_PAYLOAD_MTU},\r
+       {NDIS_STRING_CONST("lso"),              0, IPOIB_OFFSET(lso),                   IPOIB_SIZE(lso),                0,          0,      1},\r
+       {NDIS_STRING_CONST("MCLeaveRescan"),    1, IPOIB_OFFSET(mc_leave_rescan),       IPOIB_SIZE(mc_leave_rescan),    260,        1,    3600},\r
+       {NDIS_STRING_CONST("BCJoinRetry"),          1, IPOIB_OFFSET(bc_join_retry),                 IPOIB_SIZE(bc_join_retry),      50,         0,    1000},\r
+       {NDIS_STRING_CONST("CmEnabled"),        0, IPOIB_OFFSET(cm_enabled),            IPOIB_SIZE(cm_enabled),         FALSE,     FALSE, TRUE},\r
+       {NDIS_STRING_CONST("CmPayloadMtu"),     1, IPOIB_OFFSET(cm_payload_mtu),        IPOIB_SIZE(cm_payload_mtu),     MAX_CM_PAYLOAD_MTU, 512, MAX_CM_PAYLOAD_MTU}\r
+\r
+};  \r
+\r
+#define IPOIB_NUM_REG_PARAMS (sizeof (HCARegTable) / sizeof(IPOIB_REG_ENTRY))\r
+\r
+\r
+void\r
+ipoib_create_log(\r
+       NDIS_HANDLE h_adapter,\r
+       UINT ind,\r
+       ULONG eventLogMsgId)\r
+\r
+{\r
+#define cMaxStrLen  40\r
+#define cArrLen  3\r
+\r
+       PWCHAR logMsgArray[cArrLen]; \r
+       WCHAR strVal[cMaxStrLen];\r
+       NDIS_STRING AdapterInstanceName;\r
+\r
+       IPOIB_INIT_NDIS_STRING(&AdapterInstanceName);\r
+       if (NdisMQueryAdapterInstanceName(&AdapterInstanceName, h_adapter)!= NDIS_STATUS_SUCCESS ){\r
+               ASSERT(FALSE);\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR,IPOIB_DBG_ERROR, ("[IPoIB] Init:Failed to retreive adapter name.\n"));\r
+               return;\r
+       }\r
+       logMsgArray[0] = AdapterInstanceName.Buffer;\r
+       \r
+       if (RtlStringCbPrintfW(strVal, sizeof(strVal), L"0x%x", HCARegTable[ind].Default) != STATUS_SUCCESS) {\r
+               ASSERT(FALSE);\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR,IPOIB_DBG_ERROR,\r
+               ("[IPoIB] Init: Problem copying string value: exiting\n"));   \r
+               return;\r
+       }\r
+       \r
+       logMsgArray[0] = AdapterInstanceName.Buffer;\r
+       logMsgArray[1] = HCARegTable[ind].RegName.Buffer;\r
+       logMsgArray[2] = strVal;\r
+       \r
+       NdisWriteEventLogEntry(g_p_drv_obj, eventLogMsgId, 0, cArrLen, &logMsgArray, 0, NULL);\r
+\r
+}\r
+\r
+\r
+extern "C"\r
+NTSTATUS\r
+DriverEntry(\r
+       IN                              PDRIVER_OBJECT                          p_drv_obj,\r
+       IN                              PUNICODE_STRING                         p_reg_path );\r
+\r
+VOID\r
+ipoib_unload(\r
+       IN                              PDRIVER_OBJECT                          p_drv_obj );\r
+\r
+NDIS_STATUS\r
+ipoib_initialize_ex(\r
+       IN                              NDIS_HANDLE                     h_adapter,\r
+    IN                                 NDIS_HANDLE             config_context,\r
+    IN PNDIS_MINIPORT_INIT_PARAMETERS  MiniportInitParameters);\r
+\r
+NDIS_STATUS \r
+MPInitializeTest(\r
+    IN  NDIS_HANDLE                        MiniportAdapterHandle,\r
+    IN  NDIS_HANDLE                        MiniportDriverContext,\r
+    IN  PNDIS_MINIPORT_INIT_PARAMETERS     MiniportInitParameters\r
+    );\r
+\r
+\r
+\r
+BOOLEAN\r
+ipoib_check_for_hang(\r
+       IN                              NDIS_HANDLE                                     adapter_context );\r
+\r
+void\r
+ipoib_halt_ex(\r
+       IN NDIS_HANDLE  adapter_context,\r
+       IN                      NDIS_HALT_ACTION            HaltAction);\r
+\r
+NDIS_STATUS\r
+ipoib_query_info(\r
+       IN                              NDIS_HANDLE                                     adapter_context,\r
+       IN                              NDIS_OID                                        oid,\r
+       IN                              PVOID                                           info_buf,\r
+       IN                              ULONG                                           info_buf_len,\r
+               OUT                     PULONG                                          p_bytes_written,\r
+               OUT                     PULONG                                          p_bytes_needed );\r
+\r
+\r
+\r
+NDIS_STATUS\r
+ipoib_reset(\r
+    IN  NDIS_HANDLE     adapter_context,\r
+    OUT PBOOLEAN        p_addr_reset);\r
+\r
+NDIS_STATUS\r
+ipoib_set_info(\r
+       IN                              NDIS_HANDLE                                     adapter_context,\r
+       IN                              NDIS_OID                                        oid,\r
+       IN                              PVOID                                           info_buf,\r
+       IN                              ULONG                                           info_buf_length,\r
+               OUT                     PULONG                                          p_bytes_read,\r
+               OUT                     PULONG                                          p_bytes_needed );\r
+\r
+//NDIS60\r
+void\r
+ipoib_send_net_buffer_list(\r
+    IN  NDIS_HANDLE         adapter_context,\r
+    IN  PNET_BUFFER_LIST    net_buffer_list,\r
+    IN  NDIS_PORT_NUMBER    port_num,\r
+    IN  ULONG               send_flags);\r
+\r
+void\r
+ipoib_pnp_notify(\r
+       IN                              NDIS_HANDLE                                     adapter_context,\r
+       IN PNET_DEVICE_PNP_EVENT  pnp_event);\r
+\r
+VOID\r
+ipoib_shutdown_ex(\r
+       IN NDIS_HANDLE  adapter_context,\r
+       IN NDIS_SHUTDOWN_ACTION  shutdown_action);\r
+\r
+\r
+void\r
+ipoib_cancel_xmit(\r
+       IN                              NDIS_HANDLE                                     adapter_context,\r
+       IN                              PVOID                                           cancel_id );\r
+\r
+\r
+static void\r
+ipoib_complete_query(\r
+       IN                              ipoib_adapter_t* const          p_adapter,\r
+       IN                              pending_oid_t* const            p_oid_info,\r
+       IN              const   NDIS_STATUS                                     status,\r
+       IN              const   void* const                                     p_buf,\r
+       IN              const   ULONG                                           buf_len );\r
+\r
+static NDIS_STATUS\r
+__ipoib_set_net_addr(\r
+       IN              ipoib_adapter_t *       p_adapter,\r
+       IN              PVOID                           info_buf,\r
+       IN              ULONG                           info_buf_len,\r
+               OUT     PULONG                          p_bytes_read,\r
+               OUT     PULONG                          p_bytes_needed );\r
+\r
+static NDIS_STATUS\r
+__ipoib_get_tcp_task_offload(\r
+       IN                              ipoib_adapter_t*                        p_adapter,\r
+       OUT                             pending_oid_t                           *pNdisRequest);\r
+\r
+static void\r
+__ipoib_ats_reg_cb(\r
+       IN                              ib_reg_svc_rec_t                        *p_reg_svc_rec );\r
+\r
+static void\r
+__ipoib_ats_dereg_cb(\r
+       IN                              void                                            *context );\r
+\r
+static NTSTATUS\r
+__ipoib_read_registry(\r
+       IN                              UNICODE_STRING* const           p_registry_path );\r
+\r
+static NDIS_STATUS\r
+ipoib_set_options(\r
+    IN NDIS_HANDLE  NdisMiniportDriverHandle,\r
+    IN NDIS_HANDLE  MiniportDriverContext);\r
+\r
+static NDIS_STATUS\r
+ipoib_oid_handler(\r
+    IN  NDIS_HANDLE         adapter_context,\r
+    IN  PNDIS_OID_REQUEST   pNdisRequest);\r
+\r
+static void\r
+ipoib_cancel_oid_request(\r
+    IN  NDIS_HANDLE            adapter_context,\r
+    IN  PVOID                  requestId);\r
+        \r
+static NDIS_STATUS \r
+ipoib_pause(\r
+    IN  NDIS_HANDLE                         adapter_context,    \r
+    IN  PNDIS_MINIPORT_PAUSE_PARAMETERS     pause_parameters);\r
+\r
+static NDIS_STATUS \r
+ipoib_restart(\r
+    IN  NDIS_HANDLE                         adapter_context,    \r
+    IN  PNDIS_MINIPORT_RESTART_PARAMETERS   restart_parameters);\r
+\r
+\r
+\r
+//! Standard Windows Device Driver Entry Point\r
+/*! DriverEntry is the first routine called after a driver is loaded, and\r
+is responsible for initializing the driver.  On W2k this occurs when the PnP\r
+Manager matched a PnP ID to one in an INF file that references this driver.\r
+Any not success return value will cause the driver to fail to load.\r
+IRQL = PASSIVE_LEVEL\r
+\r
+@param p_drv_obj Pointer to Driver Object for this device driver\r
+@param p_registry_path Pointer to unicode string containing path to this driver's registry area\r
+@return STATUS_SUCCESS, NDIS_STATUS_BAD_CHARACTERISTICS, NDIS_STATUS_BAD_VERSION,\r
+NDIS_STATUS_RESOURCES, or NDIS_STATUS_FAILURE\r
+*/\r
+extern "C" \r
+NTSTATUS\r
+DriverEntry(\r
+       IN                              PDRIVER_OBJECT                          p_drv_obj,\r
+       IN                              PUNICODE_STRING                         p_registry_path )\r
+{\r
+       NDIS_STATUS                                             status;\r
+       NDIS_MINIPORT_DRIVER_CHARACTERISTICS characteristics;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+       g_p_drv_obj = p_drv_obj;\r
+\r
+#ifdef _DEBUG_\r
+       PAGED_CODE();\r
+#endif\r
+#if defined(EVENT_TRACING)\r
+       WPP_INIT_TRACING(p_drv_obj, p_registry_path);\r
+#endif\r
+       status = CL_INIT;\r
+       if( !NT_SUCCESS( status ) )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("cl_init failed.\n") );\r
+               return status;\r
+       }\r
+\r
+       __ipoib_read_registry(p_registry_path);\r
+       \r
+       KeInitializeSpinLock( &g_ipoib.lock );\r
+       cl_qlist_init( &g_ipoib.adapter_list );\r
+\r
+    NdisZeroMemory(&characteristics, sizeof(characteristics));\r
+\r
+    characteristics.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_DRIVER_CHARACTERISTICS,\r
+    characteristics.Header.Size = sizeof(NDIS_MINIPORT_DRIVER_CHARACTERISTICS);\r
+    characteristics.Header.Revision = NDIS_MINIPORT_DRIVER_CHARACTERISTICS_REVISION_1;\r
+\r
+       characteristics.MajorNdisVersion                = MAJOR_NDIS_VERSION;\r
+       characteristics.MinorNdisVersion                = MINOR_NDIS_VERSION;\r
+    characteristics.MajorDriverVersion         = MAJOR_DRIVER_VERSION;\r
+    characteristics.MinorDriverVersion         = MINOR_DRIVER_VERSION;\r
+\r
+\r
+       characteristics.CheckForHangHandlerEx           = ipoib_check_for_hang;\r
+       characteristics.HaltHandlerEx                           = ipoib_halt_ex;\r
+       characteristics.InitializeHandlerEx             = ipoib_initialize_ex;// MPInitializeTest\r
+       characteristics.OidRequestHandler                       = ipoib_oid_handler;\r
+       characteristics.CancelOidRequestHandler         = ipoib_cancel_oid_request;\r
+       characteristics.ResetHandlerEx                          = ipoib_reset;\r
+       characteristics.DevicePnPEventNotifyHandler     = ipoib_pnp_notify;\r
+       characteristics.ReturnNetBufferListsHandler     = ipoib_return_net_buffer_list;\r
+       characteristics.SendNetBufferListsHandler       = ipoib_send_net_buffer_list;\r
+\r
+       characteristics.SetOptionsHandler                       = ipoib_set_options;\r
+       characteristics.PauseHandler                            = ipoib_pause;\r
+       characteristics.RestartHandler                          = ipoib_restart;\r
+       characteristics.UnloadHandler                           = ipoib_unload;\r
+       characteristics.CancelSendHandler                       = ipoib_cancel_xmit;\r
+       characteristics.ShutdownHandlerEx                       = ipoib_shutdown_ex;\r
+\r
+\r
+\r
+//TODO NDIS60 set g_ prefix to global variables\r
+       status = NdisMRegisterMiniportDriver(\r
+               p_drv_obj, p_registry_path,(PNDIS_HANDLE)&g_IpoibDriverContext, &characteristics,&g_IpoibMiniportDriverHandle );\r
+       if( status != NDIS_STATUS_SUCCESS )\r
+       {\r
+               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, \r
+                       ("NdisMRegisterMiniportDriver failed with status of %d\n", status) );\r
+               CL_DEINIT;\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+       return status;\r
+}\r
+\r
+static NDIS_STATUS\r
+ipoib_set_options(\r
+    IN NDIS_HANDLE  NdisMiniportDriverHandle,\r
+    IN NDIS_HANDLE  MiniportDriverContext\r
+    )\r
+{\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+    UNREFERENCED_PARAMETER(NdisMiniportDriverHandle);\r
+    UNREFERENCED_PARAMETER(MiniportDriverContext);\r
+   \r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+    return NDIS_STATUS_SUCCESS;\r
+}\r
+\r
+static NTSTATUS\r
+__ipoib_read_registry(\r
+       IN                              UNICODE_STRING* const           p_registry_path )\r
+{\r
+       NTSTATUS                                                status;\r
+       /* Remember the terminating entry in the table below. */\r
+       RTL_QUERY_REGISTRY_TABLE                table[4];\r
+       UNICODE_STRING                                  param_path;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+       RtlInitUnicodeString( &param_path, NULL );\r
+       param_path.MaximumLength = p_registry_path->Length + \r
+               sizeof(L"\\Parameters");\r
+       param_path.Buffer = (PWCH) cl_zalloc( param_path.MaximumLength );\r
+       if( !param_path.Buffer )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, \r
+                       ("Failed to allocate parameters path buffer.\n") );\r
+               return STATUS_INSUFFICIENT_RESOURCES;\r
+       }\r
+\r
+       RtlAppendUnicodeStringToString( &param_path, p_registry_path );\r
+       RtlAppendUnicodeToString( &param_path, L"\\Parameters" );\r
+\r
+       /*\r
+        * Clear the table.  This clears all the query callback pointers,\r
+        * and sets up the terminating table entry.\r
+        */\r
+       cl_memclr( table, sizeof(table) );\r
+\r
+       /* Setup the table entries. */\r
+       table[0].Flags = RTL_QUERY_REGISTRY_DIRECT;\r
+       table[0].Name = L"DebugLevel";\r
+       table[0].EntryContext = &g_ipoib_dbg_level;\r
+       table[0].DefaultType = REG_DWORD;\r
+       table[0].DefaultData = &g_ipoib_dbg_level;\r
+       table[0].DefaultLength = sizeof(ULONG);\r
+\r
+       table[1].Flags = RTL_QUERY_REGISTRY_DIRECT;\r
+       table[1].Name = L"DebugFlags";\r
+       table[1].EntryContext = &g_ipoib_dbg_flags;\r
+       table[1].DefaultType = REG_DWORD;\r
+       table[1].DefaultData = &g_ipoib_dbg_flags;\r
+       table[1].DefaultLength = sizeof(ULONG);\r
+\r
+       table[2].Flags = RTL_QUERY_REGISTRY_DIRECT;\r
+       table[2].Name = L"bypass_check_bcast_rate";\r
+       table[2].EntryContext = &g_ipoib.bypass_check_bcast_rate;\r
+       table[2].DefaultType = REG_DWORD;\r
+       table[2].DefaultData = &g_ipoib.bypass_check_bcast_rate;\r
+       table[2].DefaultLength = sizeof(ULONG);\r
+\r
+       /* Have at it! */\r
+       status = RtlQueryRegistryValues( RTL_REGISTRY_ABSOLUTE, \r
+               param_path.Buffer, table, NULL, NULL );\r
+\r
+       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("debug level %d debug flags 0x%.8x\n",\r
+                       g_ipoib_dbg_level,\r
+                       g_ipoib_dbg_flags));\r
+\r
+#if DBG\r
+       if( g_ipoib_dbg_flags & IPOIB_DBG_ERR )\r
+               g_ipoib_dbg_flags |= CL_DBG_ERROR;\r
+#endif\r
+\r
+       cl_free( param_path.Buffer );\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+       return status;\r
+}\r
+\r
+\r
+VOID\r
+ipoib_unload(\r
+       IN                              PDRIVER_OBJECT                          p_drv_obj )\r
+{\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+       UNREFERENCED_PARAMETER(p_drv_obj);\r
+       #if defined(EVENT_TRACING)\r
+       WPP_CLEANUP(p_drv_obj);\r
+       #endif\r
+       //NDIS6.0\r
+       NdisMDeregisterMiniportDriver(g_IpoibMiniportDriverHandle);\r
+       UNREFERENCED_PARAMETER( p_drv_obj );\r
+       CL_DEINIT;\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+}\r
+\r
+\r
+\r
+NDIS_STATUS\r
+ipoib_get_adapter_params(\r
+       IN      OUT                     ipoib_adapter_t                         *p_adapter,\r
+       OUT                             PUCHAR                                          *p_mac,\r
+       OUT                             UINT                                            *p_len)\r
+{\r
+       NDIS_STATUS                                             status;\r
+       NDIS_HANDLE                                             h_config;\r
+    NDIS_CONFIGURATION_OBJECT          config_obj;\r
+       NDIS_CONFIGURATION_PARAMETER    *p_param;\r
+       UINT                                                    value;\r
+       PIPOIB_REG_ENTRY                                pRegEntry;\r
+       UINT                                                    i;\r
+       PUCHAR                                                  structPointer;\r
+       \r
+       int sq_depth_step = 128;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+    config_obj.Header.Type = NDIS_OBJECT_TYPE_CONFIGURATION_OBJECT;\r
+    config_obj.Header.Revision = NDIS_CONFIGURATION_OBJECT_REVISION_1;\r
+    config_obj.Header.Size = sizeof(NDIS_CONFIGURATION_OBJECT);\r
+    config_obj.NdisHandle = p_adapter->h_adapter;\r
+    config_obj.Flags = 0;\r
+\r
+       status = NdisOpenConfigurationEx( &config_obj, &h_config);\r
+       if( status != NDIS_STATUS_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("NdisOpenConfigurationEx returned 0x%.8x\n", status) );\r
+               return status;\r
+       }\r
+\r
+       // read all the registry values \r
+       for (i = 0, pRegEntry = HCARegTable; i < IPOIB_NUM_REG_PARAMS; ++i)\r
+       {\r
+               // initialize pointer to appropriate place inside 'params'\r
+               structPointer = (PUCHAR) &p_adapter->params + pRegEntry[i].FieldOffset;\r
+\r
+               // Get the configuration value for a specific parameter.  Under NT the\r
+               // parameters are all read in as DWORDs.\r
+               NdisReadConfiguration(\r
+                       &status,\r
+                       &p_param,\r
+                       h_config,\r
+                       &pRegEntry[i].RegName,\r
+                       NdisParameterInteger);\r
+\r
+               // If the parameter was present, then check its value for validity.\r
+               if (status == NDIS_STATUS_SUCCESS)\r
+               {\r
+                       // Check that param value is not too small or too large\r
+                       if (p_param->ParameterData.IntegerData < pRegEntry[i].Min ||\r
+                               p_param->ParameterData.IntegerData > pRegEntry[i].Max)\r
+                       {\r
+                               value = pRegEntry[i].Default;\r
+                               ipoib_create_log(p_adapter->h_adapter, i, EVENT_IPOIB_WRONG_PARAMETER_WRN);\r
+                               IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_INIT, ("Read configuration.Registry %S value is out of range, setting default value= 0x%x\n", pRegEntry[i].RegName.Buffer, value));                                \r
+\r
+                       }\r
+                       else\r
+                       {\r
+                               value = p_param->ParameterData.IntegerData;\r
+                               IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_INIT, ("Read configuration. Registry %S, Value= 0x%x\n", pRegEntry[i].RegName.Buffer, value));\r
+                       }\r
+               }\r
+\r
+               else\r
+               {\r
+                       value = pRegEntry[i].Default;\r
+                       status = NDIS_STATUS_SUCCESS;\r
+                       if (pRegEntry[i].bRequired)\r
+                       {\r
+                               ipoib_create_log(p_adapter->h_adapter, i, EVENT_IPOIB_WRONG_PARAMETER_ERR);\r
+                               IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_INIT, ("Read configuration.Registry %S value not found, setting default value= 0x%x\n", pRegEntry[i].RegName.Buffer, value));\r
+                       }\r
+                       else\r
+                       {\r
+                               ipoib_create_log(p_adapter->h_adapter, i, EVENT_IPOIB_WRONG_PARAMETER_INFO);\r
+                               IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_INIT, ("Read configuration. Registry %S value not found, Value= 0x%x\n", pRegEntry[i].RegName.Buffer, value));\r
+                       }\r
+\r
+               }\r
+               //\r
+               // Store the value in the adapter structure.\r
+               //\r
+               switch(pRegEntry[i].FieldSize)\r
+               {\r
+                       case 1:\r
+                               *((PUCHAR) structPointer) = (UCHAR) value;\r
+                               break;\r
+\r
+                       case 2:\r
+                               *((PUSHORT) structPointer) = (USHORT) value;\r
+                               break;\r
+\r
+                       case 4:\r
+                               *((PULONG) structPointer) = (ULONG) value;\r
+                               break;\r
+\r
+                       default:\r
+                               IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Bogus field size %d\n", pRegEntry[i].FieldSize));\r
+                               break;\r
+               }\r
+       }\r
+\r
+       // Send queue depth needs to be a power of two\r
+       //static const INT sq_depth_step = 128;\r
+\r
+       if (p_adapter->params.sq_depth % sq_depth_step) {\r
+               static const c_sq_ind = 2;\r
+               p_adapter->params.sq_depth = sq_depth_step *(\r
+                       p_adapter->params.sq_depth / sq_depth_step + !!( (p_adapter->params.sq_depth % sq_depth_step) > (sq_depth_step/2) ));\r
+               ipoib_create_log(p_adapter->h_adapter, c_sq_ind, EVENT_IPOIB_WRONG_PARAMETER_WRN);\r
+               IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_INIT, ("SQ DEPTH value was rounded to the closest acceptable value of  0x%x\n", p_adapter->params.sq_depth ));\r
+\r
+       }\r
+\r
+\r
+       // Adjusting the low watermark parameter\r
+       p_adapter->params.rq_low_watermark =\r
+                       p_adapter->params.rq_depth / p_adapter->params.rq_low_watermark;\r
+       \r
+       /* disable CM if LSO is active */\r
+       if( p_adapter->params.cm_enabled )\r
+       {\r
+               p_adapter->params.cm_enabled = !p_adapter->params.lso;\r
+               if( !p_adapter->params.cm_enabled )\r
+               {\r
+                       NdisWriteErrorLogEntry( p_adapter->h_adapter,\r
+                               EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de0 );\r
+               }\r
+       }\r
+\r
+       if( p_adapter->params.cm_enabled )\r
+       {\r
+               p_adapter->params.cm_xfer_block_size = \r
+                       (sizeof(eth_hdr_t) + p_adapter->params.cm_payload_mtu);\r
+       }\r
+\r
+               p_adapter->params.xfer_block_size = \r
+                       (sizeof(eth_hdr_t) + p_adapter->params.payload_mtu);\r
+\r
+       NdisReadNetworkAddress( &status, (PVOID *) p_mac, p_len, h_config );\r
+\r
+       NdisCloseConfiguration( h_config );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+       return NDIS_STATUS_SUCCESS;\r
+}\r
+\r
+\r
+NDIS_STATUS\r
+ipoib_get_adapter_guids(\r
+       IN                              NDIS_HANDLE* const                      h_adapter,\r
+       IN      OUT                     ipoib_adapter_t                         *p_adapter )\r
+{\r
+       NTSTATUS                        status;\r
+       ib_al_ifc_data_t        data;\r
+       IO_STACK_LOCATION       io_stack, *p_fwd_io_stack;\r
+       DEVICE_OBJECT           *p_pdo;\r
+       IRP                                     *p_irp;\r
+       KEVENT                          event;\r
+       IO_STATUS_BLOCK         io_status;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       NdisMGetDeviceProperty( h_adapter, &p_pdo, NULL, NULL, NULL, NULL );\r
+\r
+       /* Query for our interface */\r
+       data.size = sizeof(ipoib_ifc_data_t);\r
+       data.version = IPOIB_INTERFACE_DATA_VERSION;\r
+       data.type = &GUID_IPOIB_INTERFACE_DATA;\r
+       data.p_data = &p_adapter->guids;\r
+\r
+       io_stack.MinorFunction = IRP_MN_QUERY_INTERFACE;\r
+       io_stack.Parameters.QueryInterface.Version = AL_INTERFACE_VERSION;\r
+       io_stack.Parameters.QueryInterface.Size = sizeof(ib_al_ifc_t);\r
+       io_stack.Parameters.QueryInterface.Interface =\r
+               (INTERFACE*)p_adapter->p_ifc;\r
+       io_stack.Parameters.QueryInterface.InterfaceSpecificData = &data;\r
+       io_stack.Parameters.QueryInterface.InterfaceType = \r
+               &GUID_IB_AL_INTERFACE;\r
+\r
+       KeInitializeEvent( &event, NotificationEvent, FALSE );\r
+\r
+       /* Build the IRP for the HCA. */\r
+       p_irp = IoBuildSynchronousFsdRequest( IRP_MJ_PNP, p_pdo,\r
+               NULL, 0, NULL, &event, &io_status );\r
+       if( !p_irp )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Failed to allocate query interface IRP.\n") );\r
+               return STATUS_INSUFFICIENT_RESOURCES;\r
+       }\r
+\r
+       /* Copy the request query parameters. */\r
+       p_fwd_io_stack = IoGetNextIrpStackLocation( p_irp );\r
+       p_fwd_io_stack->MinorFunction = IRP_MN_QUERY_INTERFACE;\r
+       p_fwd_io_stack->Parameters.QueryInterface =\r
+               io_stack.Parameters.QueryInterface;\r
+       p_irp->IoStatus.Status = STATUS_NOT_SUPPORTED;\r
+\r
+       /* Send the IRP. */\r
+       status = IoCallDriver( p_pdo, p_irp );\r
+       if( status == STATUS_PENDING )\r
+       {\r
+               KeWaitForSingleObject( &event, Executive, KernelMode,\r
+                       FALSE, NULL );\r
+               status = io_status.Status;\r
+       }\r
+\r
+       if( !NT_SUCCESS( status ) )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Query interface for IPOIB interface returned %08x.\n", status) );\r
+               return status;\r
+       }\r
+\r
+       /*\r
+        * Dereference the interface now so that the bus driver doesn't fail a\r
+        * query remove IRP.  We will always get unloaded before the bus driver\r
+        * since we're a child device.\r
+        */\r
+       if (p_adapter->p_ifc)\r
+       p_adapter->p_ifc->wdm.InterfaceDereference(\r
+               p_adapter->p_ifc->wdm.Context );\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+       return NDIS_STATUS_SUCCESS;\r
+}\r
+\r
+\r
+//! Initialization function called for each IOC discovered\r
+/*  The MiniportInitialize function is a required function that sets up a\r
+NIC (or virtual NIC) for network I/O operations, claims all hardware\r
+resources necessary to the NIC in the registry, and allocates resources\r
+the driver needs to carry out network I/O operations.\r
+IRQL = PASSIVE_LEVEL\r
+\r
+@param p_open_status Pointer to a status field set if this function returns NDIS_STATUS_OPEN_ERROR\r
+@param p_selected_medium_index Pointer to unsigned integer noting index into medium_array for this NIC\r
+@param medium_array Array of mediums for this NIC\r
+@param medium_array_size Number of elements in medium_array\r
+@param h_adapter Handle assigned by NDIS for this NIC\r
+@param wrapper_config_context Handle used for Ndis initialization functions\r
+@return NDIS_STATUS_SUCCESS, NDIS_STATUS_UNSUPPORTED_MEDIA, NDIS_STATUS_RESOURCES,\r
+NDIS_STATUS_NOT_SUPPORTED \r
+*/\r
+\r
+/*void foo1(int i)\r
+{\r
+               char temp[5200];\r
+               if (i ==0) return;\r
+               cl_msg_out("i = %d\n", i);\r
+               foo1(i-1);\r
+        \r
+}*/\r
+       \r
+NDIS_STATUS\r
+SetDeviceRegistrationAttributes(\r
+       ipoib_adapter_t *p_adapter,\r
+    NDIS_HANDLE        h_adapter\r
+    )\r
+{\r
+    NDIS_MINIPORT_ADD_DEVICE_REGISTRATION_ATTRIBUTES atr;\r
+    NTSTATUS Status;\r
+\r
+    NdisZeroMemory(&atr, sizeof(NDIS_MINIPORT_ADD_DEVICE_REGISTRATION_ATTRIBUTES));\r
+\r
+    //\r
+    // setting registration attributes\r
+    //\r
+    atr.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADD_DEVICE_REGISTRATION_ATTRIBUTES;\r
+    atr.Header.Revision = NDIS_MINIPORT_ADD_DEVICE_REGISTRATION_ATTRIBUTES_REVISION_1;\r
+    atr.Header.Size = NDIS_SIZEOF_MINIPORT_ADD_DEVICE_REGISTRATION_ATTRIBUTES_REVISION_1;\r
+\r
+\r
+    atr.MiniportAddDeviceContext = (NDIS_HANDLE)p_adapter;\r
+    atr.Flags = 0; \r
+\r
+    Status = NdisMSetMiniportAttributes(h_adapter,\r
+                    (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&atr);\r
+\r
+    return Status;\r
+}\r
+\r
+//NDIS 6.1\r
+#if 0\r
+NDIS_STATUS\r
+SetHardwareAssistAttributes(\r
+    ipoib_adapter_t *p_adapter,\r
+    NDIS_HANDLE        h_adapter\r
+    )\r
+{\r
+    NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES atr;\r
+    NTSTATUS Status;\r
+\r
+    NdisZeroMemory(&atr, sizeof(NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES));\r
+\r
+    //\r
+    // setting registration attributes\r
+    //\r
+    atr.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES;\r
+    atr.Header.Revision = NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES_REVISION_1;\r
+    atr.Header.Size = NDIS_SIZEOF_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES_REVISION_1;\r
+\r
+    NDIS_HD_SPLIT_ATTRIBUTES nhsa;\r
+    NdisZeroMemory(&nhsa, sizeof(nhsa));\r
+\r
+    nhsa.Header.Type = NDIS_OBJECT_TYPE_HD_SPLIT_ATTRIBUTES;\r
+    nhsa.Header.Revision = NDIS_OFFLOAD_REVISION_1;\r
+    nhsa.Header.Size = NDIS_SIZEOF_HD_SPLIT_ATTRIBUTES_REVISION_1;\r
+\r
+    // BUGBUG: We are just cheating here ...\r
+    nhsa.HardwareCapabilities = NDIS_HD_SPLIT_CAPS_SUPPORTS_HEADER_DATA_SPLIT;\r
+#if 0\r
+    ... Only supported on B0\r
+\r
+                                 NDIS_HD_SPLIT_CAPS_SUPPORTS_IPV4_OPTIONS |\r
+                                 NDIS_HD_SPLIT_CAPS_SUPPORTS_IPV6_EXTENSION_HEADERS |\r
+                                 NDIS_HD_SPLIT_CAPS_SUPPORTS_TCP_OPTIONS;\r
+#endif\r
+\r
+    // The bellow should be left zero\r
+    if (pPort->Config.HeaderDataSplit) {\r
+        nhsa.CurrentCapabilities = NDIS_HD_SPLIT_CAPS_SUPPORTS_HEADER_DATA_SPLIT;\r
+    } else {\r
+        nhsa.CurrentCapabilities = 0;\r
+    }\r
+\r
+    nhsa.HDSplitFlags = 0;\r
+    nhsa.BackfillSize = 0;\r
+    nhsa.MaxHeaderSize = 0;    \r
+\r
+    atr.HDSplitAttributes = &nhsa;\r
+\r
+    Status = NdisMSetMiniportAttributes(h_adapter,\r
+                    (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&atr);\r
+\r
+    if (nhsa.HDSplitFlags & NDIS_HD_SPLIT_ENABLE_HEADER_DATA_SPLIT) {\r
+        ASSERT(pPort->Config.HeaderDataSplit == TRUE);\r
+        pPort->Config.HeaderDataSplit = TRUE;\r
+    } \r
+    else {\r
+        ASSERT(pPort->Config.HeaderDataSplit == FALSE);\r
+        pPort->Config.HeaderDataSplit = FALSE;\r
+    }\r
+\r
+    return Status;\r
+}\r
+#endif\r
+\r
+/*++\r
+Routine Description:\r
+    the routine sets attributes that are associated with a miniport adapter.\r
+\r
+Arguments:\r
+    pPort - Pointer to port object\r
+\r
+Return Value:\r
+    NDIS_STATUS\r
+\r
+Note:\r
+    Should be called in PASSIVE_LEVEL\r
+    \r
+--*/\r
+NDIS_STATUS\r
+SetAdapterRegistrationAttributes(\r
+       ipoib_adapter_t *p_adapter,\r
+       NDIS_HANDLE     h_adapter\r
+       )\r
+       {\r
+       NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES atr;\r
+       NTSTATUS Status;\r
+\r
+       NdisZeroMemory(&atr, sizeof(NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES));\r
+\r
+       /* setting registration attributes */\r
+\r
+       atr.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES;\r
+       atr.Header.Revision = NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES_REVISION_1;\r
+       atr.Header.Size = NDIS_SIZEOF_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES_REVISION_1;\r
+       //TODO NDIS60 Port or adapter\r
+       atr.MiniportAdapterContext = (NDIS_HANDLE)p_adapter; //(NDIS_HANDLE)pPort->p_adapter;\r
+       atr.AttributeFlags = NDIS_MINIPORT_ATTRIBUTES_BUS_MASTER;\r
+       atr.CheckForHangTimeInSeconds = 10;\r
+       atr.InterfaceType = NdisInterfacePci ;   // ???? UH\r
+       //TODO NDIS60 PNP or PCI ?\r
+       //RegistrationAttributes.InterfaceType = NdisInterfacePNPBus;\r
+\r
+       Status = NdisMSetMiniportAttributes(h_adapter,\r
+                       (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&atr);\r
+\r
+       return Status;\r
+}\r
+\r
+\r
+/*++\r
+Routine Description:\r
+    the routine sets generic attributes that are associated with a miniport \r
+    adapter.\r
+\r
+Arguments:\r
+    pPort - Pointer to port object\r
+\r
+Return Value:\r
+    NDIS_STATUS\r
+\r
+Note:\r
+    Should be called in PASSIVE_LEVEL\r
+    \r
+--*/\r
+NDIS_STATUS\r
+SetGenericAttributes(\r
+    ipoib_adapter_t *p_adapter,\r
+    NDIS_HANDLE        h_adapter\r
+    )\r
+{\r
+    NDIS_STATUS Status;\r
+\r
+    NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES gat;\r
+    NdisZeroMemory(&gat, sizeof(NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES));\r
+\r
+       /* set up generic attributes */\r
+\r
+       gat.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES;\r
+       gat.Header.Revision = NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES_REVISION_1;\r
+       gat.Header.Size = sizeof(NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES);\r
+\r
+       gat.MediaType = NdisMedium802_3;    \r
+       gat.MaxXmitLinkSpeed = IPOIB_MEDIA_MAX_SPEED;\r
+       gat.MaxRcvLinkSpeed = IPOIB_MEDIA_MAX_SPEED;\r
+       gat.XmitLinkSpeed = IPOIB_MEDIA_MAX_SPEED; //TODO NDIS60 NDIS_LINK_SPEED_UNKNOWN\r
+       gat.RcvLinkSpeed = IPOIB_MEDIA_MAX_SPEED; // TODO NDIS60 NDIS_LINK_SPEED_UNKNOWN ???\r
+\r
+       gat.MediaConnectState = MediaConnectStateConnected; //TODO NDIS60 Check the current state\r
+       gat.MediaDuplexState = MediaDuplexStateFull;\r
+\r
+       gat.MtuSize = MAX_IB_MTU;\r
+       gat.LookaheadSize = MAX_XFER_BLOCK_SIZE;\r
+       gat.MacOptions = NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA | \r
+                                        NDIS_MAC_OPTION_TRANSFERS_NOT_PEND |\r
+                                        NDIS_MAC_OPTION_NO_LOOPBACK |\r
+                                        NDIS_MAC_OPTION_FULL_DUPLEX;\r
+                                       //NDIS_MAC_OPTION_8021P_PRIORITY; //TODO NDIS60\r
+                                       // DT: Enable for Header Data Split WHQL\r
+                                       // |  NDIS_MAC_OPTION_8021Q_VLAN;\r
+\r
+       gat.SupportedPacketFilters =    NDIS_PACKET_TYPE_DIRECTED |\r
+                                                                       NDIS_PACKET_TYPE_MULTICAST |\r
+                                                                       //NDIS_PACKET_TYPE_ALL_MULTICAST |\r
+                                                                       NDIS_PACKET_TYPE_BROADCAST;\r
+                                        \r
+       gat.MaxMulticastListSize = MAX_MCAST;\r
+\r
+       gat.MacAddressLength = HW_ADDR_LEN;\r
+       \r
+       NdisMoveMemory(gat.PermanentMacAddress,\r
+                                       p_adapter->mac.addr,\r
+                                       HW_ADDR_LEN);\r
+\r
+       NdisMoveMemory(gat.CurrentMacAddress,\r
+                                       p_adapter->params.conf_mac.addr,\r
+                                       HW_ADDR_LEN);\r
+\r
+\r
+       gat.PhysicalMediumType = NdisPhysicalMedium802_3;\r
+       gat.AccessType = NET_IF_ACCESS_BROADCAST; \r
+\r
+       gat.SupportedOidList = (PNDIS_OID)SUPPORTED_OIDS;\r
+       gat.SupportedOidListLength = sizeof(SUPPORTED_OIDS);\r
+\r
+\r
+       gat.DirectionType = NET_IF_DIRECTION_SENDRECEIVE; \r
+       gat.ConnectionType = NET_IF_CONNECTION_DEDICATED; \r
+       gat.IfType = IF_TYPE_ETHERNET_CSMACD; \r
+       gat.IfConnectorPresent = TRUE; \r
+       //TODO NDIS60 This value is absent for ETH driver\r
+       gat.AccessType = NET_IF_ACCESS_BROADCAST; // NET_IF_ACCESS_BROADCAST for a typical ethernet adapter\r
+\r
+\r
+       //TODO NDIS60 is it possible to reduce unsupported statistics\r
+       gat.SupportedStatistics = \r
+                               NDIS_STATISTICS_XMIT_OK_SUPPORTED |\r
+                               NDIS_STATISTICS_RCV_OK_SUPPORTED |\r
+                               NDIS_STATISTICS_XMIT_ERROR_SUPPORTED |\r
+                               NDIS_STATISTICS_RCV_ERROR_SUPPORTED |\r
+                               NDIS_STATISTICS_RCV_CRC_ERROR_SUPPORTED |\r
+                               NDIS_STATISTICS_RCV_NO_BUFFER_SUPPORTED |\r
+                               NDIS_STATISTICS_TRANSMIT_QUEUE_LENGTH_SUPPORTED;\r
+\r
+       //SupportedStatistics = NDIS_STATISTICS_XMIT_OK_SUPPORTED |\r
+                                                       // NDIS_STATISTICS_GEN_STATISTICS_SUPPORTED;\r
+\r
+\r
+    //\r
+    // Set power management capabilities\r
+    //\r
+    gat.PowerManagementCapabilities = NULL;\r
+#if 0\r
+    NDIS_PNP_CAPABILITIES PowerManagementCapabilities;\r
+    NdisZeroMemory(&PowerManagementCapabilities, sizeof(NDIS_PNP_CAPABILITIES));\r
+    if (MPIsPoMgmtSupported(pPort))\r
+    {\r
+        MPFillPoMgmtCaps(pPort, &PowerManagementCapabilities, &Status, &unUsed);\r
+        ASSERT(NT_SUCCESS(Status)); \r
+        gat.PowerManagementCapabilities = &PowerManagementCapabilities;\r
+    } \r
+    else\r
+    {\r
+        \r
+    }\r
+#endif\r
+\r
+    //\r
+    // Set RSS attributes\r
+    //\r
+    gat.RecvScaleCapabilities = NULL;\r
+#if 0\r
+    NDIS_RECEIVE_SCALE_CAPABILITIES RssCapabilities;\r
+    NdisZeroMemory(&RssCapabilities, sizeof(PNDIS_RECEIVE_SCALE_CAPABILITIES));\r
+    Status = MPFillRssCapabilities(pPort, &RssCapabilities, &unUsed);\r
+    if (NT_SUCCESS(Status)) \r
+    {\r
+        gat.RecvScaleCapabilities = &RssCapabilities;\r
+    } \r
+    else\r
+    {\r
+        //\r
+        // do not fail the call because of failure to get PM caps\r
+        //\r
+        Status = NDIS_STATUS_SUCCESS;\r
+        gat.RecvScaleCapabilities = NULL;\r
+    }\r
+#endif\r
+\r
+       Status = NdisMSetMiniportAttributes(h_adapter,\r
+                       (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&gat);\r
+\r
+       return Status;\r
+}\r
+\r
+\r
+/*++\r
+Routine Description:\r
+    The routine sets an NDIS_OFFLOAD structure indicates the current offload \r
+    capabilities that are provided by the miniport adapter \r
+    \r
+Arguments:\r
+    pPort - a pointer to port object\r
+    offload - reference to NDIS_OFFLOAD object that should be filled\r
+\r
+Return Value:\r
+    None.\r
+    \r
+--*/\r
+static\r
+void\r
+OffloadConfig(\r
+       ipoib_adapter_t *p_adapter,\r
+       NDIS_OFFLOAD *p_offload\r
+       )\r
+{ \r
+\r
+       ULONG ulEncapsulation = NDIS_ENCAPSULATION_IEEE_802_3 | NDIS_ENCAPSULATION_IEEE_802_3_P_AND_Q;\r
+\r
+       NdisZeroMemory(p_offload, NDIS_SIZEOF_NDIS_OFFLOAD_REVISION_1);\r
+\r
+       p_offload->Header.Type = NDIS_OBJECT_TYPE_OFFLOAD;\r
+       p_offload->Header.Revision = NDIS_OFFLOAD_REVISION_1; // BUGBUG: do we need to support revision 2? UH 17-May-2008\r
+       p_offload->Header.Size = NDIS_SIZEOF_NDIS_OFFLOAD_REVISION_1;\r
+\r
+       p_offload->Checksum.IPv4Transmit.Encapsulation = ulEncapsulation;\r
+       p_offload->Checksum.IPv4Transmit.IpOptionsSupported = \r
+       p_offload->Checksum.IPv4Transmit.TcpOptionsSupported = \r
+       p_offload->Checksum.IPv4Transmit.TcpChecksum = \r
+       p_offload->Checksum.IPv4Transmit.UdpChecksum = \r
+       p_offload->Checksum.IPv4Transmit.IpChecksum =!!(p_adapter->params.send_chksum_offload);\r
+\r
+       p_offload->Checksum.IPv4Receive.Encapsulation = ulEncapsulation;\r
+       p_offload->Checksum.IPv4Receive.IpOptionsSupported = \r
+       p_offload->Checksum.IPv4Receive.TcpOptionsSupported = \r
+       p_offload->Checksum.IPv4Receive.TcpChecksum = \r
+       p_offload->Checksum.IPv4Receive.UdpChecksum = \r
+       p_offload->Checksum.IPv4Receive.IpChecksum = !!(p_adapter->params.recv_chksum_offload); //TODO NDIS60\r
+\r
+\r
+       p_offload->Checksum.IPv6Transmit.Encapsulation = ulEncapsulation;\r
+       p_offload->Checksum.IPv6Transmit.IpExtensionHeadersSupported = \r
+       p_offload->Checksum.IPv6Transmit.TcpOptionsSupported =\r
+       p_offload->Checksum.IPv6Transmit.TcpChecksum = \r
+       p_offload->Checksum.IPv6Transmit.UdpChecksum = FALSE;\r
+\r
+\r
+       p_offload->Checksum.IPv6Receive.Encapsulation = ulEncapsulation;\r
+       p_offload->Checksum.IPv6Receive.IpExtensionHeadersSupported = \r
+       p_offload->Checksum.IPv6Receive.TcpOptionsSupported = \r
+       p_offload->Checksum.IPv6Receive.TcpChecksum = \r
+       p_offload->Checksum.IPv6Receive.UdpChecksum = FALSE;\r
+\r
+       if (p_adapter->params.lso)\r
+       {\r
+               p_offload->LsoV1.IPv4.Encapsulation = ulEncapsulation;\r
+               p_offload->LsoV1.IPv4.MaxOffLoadSize = LARGE_SEND_OFFLOAD_SIZE;\r
+#define LSO_MIN_SEG_COUNT 2\r
+               p_offload->LsoV1.IPv4.MinSegmentCount = LSO_MIN_SEG_COUNT;\r
+       \r
+               \r
+               p_offload->LsoV1.IPv4.TcpOptions = NDIS_OFFLOAD_SUPPORTED;\r
+               p_offload->LsoV1.IPv4.IpOptions = NDIS_OFFLOAD_SUPPORTED;\r
+\r
+               p_offload->LsoV2.IPv4.Encapsulation = ulEncapsulation;\r
+               p_offload->LsoV2.IPv4.MaxOffLoadSize = LARGE_SEND_OFFLOAD_SIZE;\r
+               p_offload->LsoV2.IPv4.MinSegmentCount = LSO_MIN_SEG_COUNT;\r
+\r
+               p_offload->LsoV2.IPv6.Encapsulation = ulEncapsulation;\r
+               p_offload->LsoV2.IPv6.MaxOffLoadSize = LARGE_SEND_OFFLOAD_SIZE;\r
+               p_offload->LsoV2.IPv6.MinSegmentCount = LSO_MIN_SEG_COUNT;\r
+\r
+               p_offload->LsoV2.IPv6.IpExtensionHeadersSupported = NDIS_OFFLOAD_NOT_SUPPORTED;\r
+               p_offload->LsoV2.IPv6.TcpOptionsSupported = NDIS_OFFLOAD_SUPPORTED;\r
+       }\r
+\r
+}\r
+\r
+\r
+/*++\r
+Routine Description:\r
+    The routine sets an NDIS_OFFLOAD structure that indicates all the task \r
+    offload capabilites that are supported by the NIC. These capabilities include\r
+    capabilities that are currently disabled by standardized keywords in the registry. \r
+    \r
+Arguments:\r
+    offload - reference to NDIS_OFFLOAD object that should be filled\r
+\r
+Return Value:\r
+    None.\r
+    \r
+--*/\r
+static\r
+void\r
+OffloadCapabilities(\r
+       NDIS_OFFLOAD    *p_offload\r
+       )\r
+{ \r
+       ULONG ulEncapsulation = NDIS_ENCAPSULATION_IEEE_802_3 | NDIS_ENCAPSULATION_IEEE_802_3_P_AND_Q ;\r
+       NdisZeroMemory(p_offload, NDIS_SIZEOF_NDIS_OFFLOAD_REVISION_1);    \r
+\r
+       p_offload->Header.Type = NDIS_OBJECT_TYPE_OFFLOAD;\r
+       p_offload->Header.Revision = NDIS_OFFLOAD_REVISION_1; // BUGBUG: do we need to support revision 2? UH 17-May-2008\r
+       p_offload->Header.Size = NDIS_SIZEOF_NDIS_OFFLOAD_REVISION_1;\r
+\r
+       p_offload->Checksum.IPv4Transmit.Encapsulation = ulEncapsulation;\r
+       p_offload->Checksum.IPv4Transmit.IpOptionsSupported = TRUE;\r
+       p_offload->Checksum.IPv4Transmit.TcpOptionsSupported = TRUE;\r
+       p_offload->Checksum.IPv4Transmit.TcpChecksum = TRUE;\r
+       p_offload->Checksum.IPv4Transmit.UdpChecksum = TRUE;\r
+       p_offload->Checksum.IPv4Transmit.IpChecksum = TRUE;\r
+\r
+       p_offload->Checksum.IPv4Receive.Encapsulation = ulEncapsulation;\r
+       p_offload->Checksum.IPv4Receive.IpOptionsSupported = TRUE;\r
+       p_offload->Checksum.IPv4Receive.TcpOptionsSupported = TRUE;\r
+       p_offload->Checksum.IPv4Receive.TcpChecksum = TRUE;\r
+       p_offload->Checksum.IPv4Receive.UdpChecksum = TRUE; \r
+       p_offload->Checksum.IPv4Receive.IpChecksum = TRUE;\r
+\r
+\r
+       //\r
+       //  BUGBUG::\r
+       //  During a HW bug that didn't handle correctly packets with \r
+       //  IPv6 Extension Headers -> we set IpExtensionHeadersSupported to TRUE\r
+       //\r
+       p_offload->Checksum.IPv6Transmit.Encapsulation = ulEncapsulation;\r
+       p_offload->Checksum.IPv6Transmit.IpExtensionHeadersSupported = TRUE;\r
+       p_offload->Checksum.IPv6Transmit.TcpOptionsSupported = TRUE;\r
+       p_offload->Checksum.IPv6Transmit.TcpChecksum = TRUE;\r
+       p_offload->Checksum.IPv6Transmit.UdpChecksum = TRUE;\r
+\r
+\r
+       p_offload->Checksum.IPv6Receive.Encapsulation = ulEncapsulation;\r
+       p_offload->Checksum.IPv6Receive.IpExtensionHeadersSupported = TRUE;\r
+       p_offload->Checksum.IPv6Receive.TcpOptionsSupported = TRUE;\r
+       p_offload->Checksum.IPv6Receive.TcpChecksum = TRUE;\r
+       p_offload->Checksum.IPv6Receive.UdpChecksum = TRUE;\r
+\r
+       p_offload->LsoV1.IPv4.Encapsulation = ulEncapsulation;\r
+       p_offload->LsoV1.IPv4.MaxOffLoadSize = LARGE_SEND_OFFLOAD_SIZE;\r
+       p_offload->LsoV1.IPv4.MinSegmentCount = 2;\r
+       p_offload->LsoV1.IPv4.TcpOptions = NDIS_OFFLOAD_SUPPORTED;\r
+       p_offload->LsoV1.IPv4.IpOptions = NDIS_OFFLOAD_SUPPORTED;\r
+\r
+       p_offload->LsoV2.IPv4.Encapsulation = ulEncapsulation;\r
+       p_offload->LsoV2.IPv4.MaxOffLoadSize = LARGE_SEND_OFFLOAD_SIZE;\r
+       p_offload->LsoV2.IPv4.MinSegmentCount = 2;\r
+\r
+       p_offload->LsoV2.IPv6.Encapsulation = ulEncapsulation;\r
+       p_offload->LsoV2.IPv6.MaxOffLoadSize = LARGE_SEND_OFFLOAD_SIZE;\r
+       p_offload->LsoV2.IPv6.MinSegmentCount = 2;\r
+\r
+       p_offload->LsoV2.IPv6.IpExtensionHeadersSupported = NDIS_OFFLOAD_NOT_SUPPORTED;\r
+       p_offload->LsoV2.IPv6.TcpOptionsSupported = NDIS_OFFLOAD_SUPPORTED;\r
+\r
+       }\r
+\r
+\r
+/*++\r
+Routine Description:\r
+    The routine sets offload attributes that are associated with a miniport \r
+    adapter.\r
+\r
+Arguments:\r
+    pPort - Pointer to port object\r
+\r
+Return Value:\r
+    NDIS_STATUS\r
+\r
+Note:\r
+    Should be called in PASSIVE_LEVEL\r
+    \r
+--*/\r
+NDIS_STATUS\r
+SetOffloadAttributes(\r
+       ipoib_adapter_t *p_adapter,\r
+       NDIS_HANDLE     h_adapter\r
+       )\r
+{\r
+       NDIS_STATUS Status;\r
+       NDIS_OFFLOAD offload,hwOffload;\r
+       //ULONG ulEncapsulation = NDIS_ENCAPSULATION_IEEE_802_3 | NDIS_ENCAPSULATION_IEEE_802_3_P_AND_Q;\r
+\r
+       NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES oat;    \r
+       NdisZeroMemory(&oat, sizeof(NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES));\r
+\r
+       oat.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES;\r
+       oat.Header.Revision = NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES_REVISION_1;\r
+       oat.Header.Size = NDIS_SIZEOF_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES_REVISION_1;\r
+\r
+\r
+       OffloadConfig(p_adapter, &offload);\r
+\r
+\r
+       OffloadCapabilities(&hwOffload);\r
+\r
+       oat.DefaultOffloadConfiguration = &offload;\r
+       oat.HardwareOffloadCapabilities = &hwOffload;\r
+\r
+       Status = NdisMSetMiniportAttributes(h_adapter,\r
+                               (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&oat);\r
+\r
+       return Status;\r
+}\r
+\r
+\r
+/*++\r
+\r
+Routine Description:\r
+    An NDIS 6.0 miniport driver must call NdisMSetMiniportAttributes\r
+    at least twice. The first call is to register itself with NDIS.\r
+    The second call is to register the miniport driver's general\r
+    attributes with NDIS.\r
+\r
+    NdisMSetMiniportAttributes takes a parameter of type\r
+    NDIS_MINIPORT_ADAPTER_ATTRIBUTES, which is a union of several miniport\r
+    adapter attributes. Miniport drivers must first call\r
+    NdisMSetMiniportAttributes and pass in an\r
+    NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES structure\r
+    that contains the pointer to its own context area, attribute flags,\r
+    check-for-hang time, and interface type.\r
+\r
+    All NDIS 6.0 miniport drivers are deserialized by default.\r
+\r
+Arguments:\r
+    pPort - Pointer to port object\r
+\r
+Return Value:\r
+    NDIS_STATUS\r
+\r
+Note:\r
+    Should be called in PASSIVE_LEVEL\r
+    \r
+--*/\r
+       NDIS_STATUS\r
+       SetAttributes(\r
+       ipoib_adapter_t *p_adapter,\r
+       NDIS_HANDLE     h_adapter\r
+       )\r
+       {\r
+       NTSTATUS Status;\r
+\r
+\r
+       Status = SetDeviceRegistrationAttributes(p_adapter, h_adapter);\r
+       if (Status != NDIS_STATUS_SUCCESS)\r
+       {\r
+               //ETH_PRINT(TRACE_LEVEL_ERROR, ETH_INIT, "Set device registration failed Error=0x%x\n", Status);\r
+               return Status;\r
+       }\r
+\r
+\r
+       Status = SetAdapterRegistrationAttributes(p_adapter, h_adapter);\r
+       if (Status != NDIS_STATUS_SUCCESS)\r
+       {\r
+               //ETH_PRINT(TRACE_LEVEL_ERROR, ETH_INIT, "Set adapter attributes failed Error=0x%x\n", Status);\r
+               return Status;\r
+       }\r
+\r
+       Status = SetOffloadAttributes(p_adapter, h_adapter);\r
+       if (Status != NDIS_STATUS_SUCCESS)\r
+       {\r
+               //ETH_PRINT(TRACE_LEVEL_ERROR, ETH_INIT, "Set OFFLOAD attributes failed Error=0x%x\n", Status);\r
+               return Status;\r
+       }\r
+       \r
+#if 0\r
+       if(!pPort->Config.fWHQL)\r
+       {\r
+               Status = SetHardwareAssistAttributes(pPort);\r
+               if (Status != NDIS_STATUS_SUCCESS)\r
+               {\r
+                   //ETH_PRINT(TRACE_LEVEL_ERROR, ETH_INIT, "Set Hardware Assist Attributes failed Error=0x%x\n", Status);\r
+                   return Status;\r
+               }\r
+       }\r
+#endif\r
+\r
+       Status = SetGenericAttributes(p_adapter, h_adapter);\r
+       if (Status != NDIS_STATUS_SUCCESS)\r
+       {\r
+           //ETH_PRINT(TRACE_LEVEL_ERROR, ETH_INIT, "Set generic attributes failed Error=0x%x\n", Status);\r
+           return Status;\r
+       }\r
+\r
+       return Status;\r
+}\r
+\r
+\r
+\r
+NDIS_STATUS\r
+InitNdisScatterGatherDma(\r
+       ipoib_adapter_t *p_adapter,\r
+       NDIS_HANDLE             h_adapter\r
+       )\r
+{\r
+       NDIS_STATUS                                             status;\r
+       NDIS_SG_DMA_DESCRIPTION                 DmaDescription;\r
+       \r
+       NdisZeroMemory(&DmaDescription, sizeof(DmaDescription));\r
+\r
+       DmaDescription.Header.Type = NDIS_OBJECT_TYPE_SG_DMA_DESCRIPTION;\r
+       DmaDescription.Header.Revision = NDIS_SG_DMA_DESCRIPTION_REVISION_1;\r
+       DmaDescription.Header.Size = sizeof(NDIS_SG_DMA_DESCRIPTION);\r
+       DmaDescription.Flags = NDIS_SG_DMA_64_BIT_ADDRESS; \r
+       //\r
+       // Even if offload is enabled, the packet size for mapping shouldn't change\r
+       //\r
+       DmaDescription.MaximumPhysicalMapping = LARGE_SEND_OFFLOAD_SIZE + LSO_MAX_HEADER;\r
+\r
+       DmaDescription.ProcessSGListHandler = ipoib_process_sg_list;\r
+       DmaDescription.SharedMemAllocateCompleteHandler = NULL;\r
+\r
+       DmaDescription.Header.Type = NDIS_OBJECT_TYPE_SG_DMA_DESCRIPTION;\r
+       DmaDescription.Header.Revision = NDIS_SG_DMA_DESCRIPTION_REVISION_1;\r
+       DmaDescription.Header.Size = sizeof(NDIS_SG_DMA_DESCRIPTION);//NDIS_SIZEOF_SG_DMA_DESCRIPTION_REVISION_1;\r
+\r
+       DmaDescription.Flags = NDIS_SG_DMA_64_BIT_ADDRESS;\r
+       //DmaDescription.MaximumPhysicalMapping = pPort->p_adapter->params.xfer_block_size;\r
+\r
+       DmaDescription.ProcessSGListHandler = ipoib_process_sg_list;\r
+       DmaDescription.SharedMemAllocateCompleteHandler = NULL;\r
+       \r
+       status = NdisMRegisterScatterGatherDma(\r
+                                       h_adapter,\r
+                                       &DmaDescription,\r
+                                       &p_adapter->NdisMiniportDmaHandle);\r
+\r
+       if( status != NDIS_STATUS_SUCCESS )\r
+       {\r
+               //TODO NDIS60\r
+               //ipoib_destroy_adapter( p_adapter );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                                ("NdisMRegisterScatterGatherDma returned 0x%.8x.\n", status) );\r
+               \r
+       }\r
+       //NDIS sets this value before it returns from NdisMRegisterScatterGatherDma. \r
+               //Miniport drivers should use this size to preallocate memory for each scatter/gather list. \r
+       p_adapter->sg_list_size = DmaDescription.ScatterGatherListSize ;\r
+       \r
+       return status;\r
+}\r
+\r
+\r
+NDIS_STATUS \r
+MPInitializeTest(\r
+    IN  NDIS_HANDLE                        MiniportAdapterHandle,\r
+    IN  NDIS_HANDLE                        MiniportDriverContext,\r
+    IN  PNDIS_MINIPORT_INIT_PARAMETERS     MiniportInitParameters\r
+    )\r
+/*++\r
+Routine Description:\r
+\r
+    MiniportInitialize handler\r
+\r
+Arguments:\r
+\r
+    MiniportAdapterHandle   The handle NDIS uses to refer to us\r
+    MiniportDriverContext   Handle passed to NDIS when we registered the driver\r
+    MiniportInitParameters  Initialization parameters\r
+    \r
+Return Value:\r
+\r
+    NDIS_STATUS_SUCCESS unless something goes wrong\r
+\r
+--*/\r
+{\r
+\r
+       NDIS_STATUS Status = NDIS_STATUS_SUCCESS;\r
+    //PMP_PORT pPort = NULL;\r
+    ipoib_adapter_t    *p_adapter;\r
+//    NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS  Interrupt;\r
+    NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES   RegistrationAttributes;\r
+    NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES        GeneralAttributes;\r
+    //NDIS_TIMER_CHARACTERISTICS                      Timer;               \r
+    NDIS_PNP_CAPABILITIES          PowerManagementCapabilities;    \r
+    //PMP_ADAPTER     Adapter = NULL;\r
+    //PVOID           NetworkAddress;\r
+//    UINT            index;\r
+//    UINT            uiPnpCommandValue;\r
+//    ULONG           ulInfoLen;\r
+    //ULONG           InterruptVersion;\r
+//    LARGE_INTEGER   liDueTime;\r
+    //BOOLEAN         isTimerAlreadyInQueue = FALSE;\r
+//     uint8_t portId;\r
+       ib_api_status_t         ib_status;\r
+#if 0   \r
+#if DBG\r
+    LARGE_INTEGER   TS, TD, TE;\r
+#endif\r
+#endif\r
+\r
+    cl_dbg_out ("====> MPInitialize\n");\r
+\r
+    UNREFERENCED_PARAMETER(MiniportDriverContext);\r
+    UNREFERENCED_PARAMETER(MiniportInitParameters);\r
+  \r
+\r
+\r
+       \r
+\r
+    {\r
+\r
+               ib_status = ipoib_create_adapter( MiniportAdapterHandle, &p_adapter );\r
+               if( ib_status != IB_SUCCESS )\r
+               {\r
+                       ASSERT(FALSE);\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("ipoib_create_adapter returned status %d.\n", ib_status ) );\r
+                       return NDIS_STATUS_FAILURE;\r
+               }\r
+\r
+       \r
+\r
+        NdisZeroMemory(&RegistrationAttributes, sizeof(NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES));\r
+        NdisZeroMemory(&GeneralAttributes, sizeof(NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES));\r
+\r
+        //\r
+        // setting registration attributes\r
+        //\r
+        RegistrationAttributes.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES;\r
+        RegistrationAttributes.Header.Revision = NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES_REVISION_1;\r
+        RegistrationAttributes.Header.Size = sizeof(NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES);\r
+\r
+        RegistrationAttributes.MiniportAdapterContext = (NDIS_HANDLE)p_adapter;\r
+        RegistrationAttributes.AttributeFlags = NDIS_MINIPORT_ATTRIBUTES_HARDWARE_DEVICE | \r
+                                                NDIS_MINIPORT_ATTRIBUTES_BUS_MASTER;\r
+        \r
+        RegistrationAttributes.CheckForHangTimeInSeconds = 2;\r
+        RegistrationAttributes.InterfaceType = NdisInterfacePci;\r
+\r
+        Status = NdisMSetMiniportAttributes(MiniportAdapterHandle,\r
+                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&RegistrationAttributes);\r
+\r
+        if (Status != NDIS_STATUS_SUCCESS)\r
+        {\r
+            //break;\r
+            return Status;\r
+        }\r
+\r
+#if 0         \r
+        //\r
+        // Read the registry parameters\r
+        //\r
+        Status = NICReadRegParameters(Adapter);\r
+        \r
+        if (Status != NDIS_STATUS_SUCCESS) \r
+        {\r
+            break;\r
+        }\r
+\r
+       \r
+        //\r
+        // Find the physical adapter\r
+        //\r
+        Status = MpFindAdapter(Adapter, MiniportInitParameters->AllocatedResources);\r
+        if (Status != NDIS_STATUS_SUCCESS)\r
+        {\r
+            break;\r
+        }\r
+\r
+        //\r
+        // Map bus-relative IO range to system IO space\r
+        //\r
+        Status = NdisMRegisterIoPortRange(\r
+                     (PVOID *)&Adapter->PortOffset,\r
+                     Adapter->AdapterHandle,\r
+                     Adapter->IoBaseAddress,\r
+                     Adapter->IoRange);\r
+        if (Status != NDIS_STATUS_SUCCESS)\r
+        {\r
+            DBGPRINT(MP_ERROR, ("NdisMRegisterioPortRange failed\n"));\r
+    \r
+            NdisWriteErrorLogEntry(\r
+                Adapter->AdapterHandle,\r
+                NDIS_ERROR_CODE_BAD_IO_BASE_ADDRESS,\r
+                0);\r
+        \r
+            break;\r
+        }\r
+        \r
+        //\r
+        // Read additional info from NIC such as MAC address\r
+        //\r
+        Status = NICReadAdapterInfo(Adapter);\r
+        if (Status != NDIS_STATUS_SUCCESS) \r
+        {\r
+            break;\r
+        }\r
+\r
+#endif\r
+        //\r
+        // set up generic attributes\r
+        //\r
+               \r
+\r
+        GeneralAttributes.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES;\r
+        GeneralAttributes.Header.Revision = NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES_REVISION_1;\r
+        GeneralAttributes.Header.Size = sizeof(NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES);\r
+\r
+        GeneralAttributes.MediaType = NdisMedium802_3;\r
+\r
+        GeneralAttributes.MtuSize = DEFAULT_MTU;\r
+#define LINE_SPEED_10_GBTS 10000000000\r
+        GeneralAttributes.MaxXmitLinkSpeed = LINE_SPEED_10_GBTS;\r
+        GeneralAttributes.MaxRcvLinkSpeed = LINE_SPEED_10_GBTS;\r
+        GeneralAttributes.XmitLinkSpeed = NDIS_LINK_SPEED_UNKNOWN;\r
+        GeneralAttributes.RcvLinkSpeed = NDIS_LINK_SPEED_UNKNOWN;\r
+        GeneralAttributes.MediaConnectState = MediaConnectStateUnknown;\r
+        GeneralAttributes.MediaDuplexState = MediaDuplexStateUnknown;\r
+        GeneralAttributes.LookaheadSize = MAX_XFER_BLOCK_SIZE;\r
+#if 0\r
+        MPFillPoMgmtCaps (Adapter, \r
+                          &PowerManagementCapabilities, \r
+                          &Status,\r
+                          &ulInfoLen);\r
+#endif\r
+               NdisZeroMemory(&PowerManagementCapabilities, sizeof(NDIS_PNP_CAPABILITIES));\r
+        Status = NDIS_STATUS_NOT_SUPPORTED;\r
+       // ulInfoLen = 0;\r
+\r
+        if (Status == NDIS_STATUS_SUCCESS)\r
+        {\r
+            GeneralAttributes.PowerManagementCapabilities = &PowerManagementCapabilities;\r
+        }\r
+        else\r
+        {\r
+            GeneralAttributes.PowerManagementCapabilities = NULL;\r
+        }\r
+\r
+        //\r
+        // do not fail the call because of failure to get PM caps\r
+        //\r
+        Status = NDIS_STATUS_SUCCESS;\r
+\r
+        GeneralAttributes.MacOptions = NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA | \r
+                                       NDIS_MAC_OPTION_TRANSFERS_NOT_PEND |\r
+                                       NDIS_MAC_OPTION_NO_LOOPBACK;\r
+\r
+        GeneralAttributes.SupportedPacketFilters = NDIS_PACKET_TYPE_DIRECTED |\r
+                                                   NDIS_PACKET_TYPE_MULTICAST |\r
+                                                   NDIS_PACKET_TYPE_ALL_MULTICAST |\r
+                                                   NDIS_PACKET_TYPE_BROADCAST;\r
+        \r
+        GeneralAttributes.MaxMulticastListSize = MAX_MCAST;\r
+        GeneralAttributes.MacAddressLength = HW_ADDR_LEN;\r
+      NdisMoveMemory(GeneralAttributes.PermanentMacAddress,\r
+                               p_adapter->mac.addr,\r
+                               HW_ADDR_LEN);\r
+\r
+       NdisMoveMemory(GeneralAttributes.CurrentMacAddress,\r
+                               p_adapter->params.conf_mac.addr,\r
+                               HW_ADDR_LEN);\r
+        GeneralAttributes.RecvScaleCapabilities = NULL;\r
+        GeneralAttributes.AccessType = NET_IF_ACCESS_BROADCAST; // NET_IF_ACCESS_BROADCAST for a typical ethernet adapter\r
+        GeneralAttributes.DirectionType = NET_IF_DIRECTION_SENDRECEIVE; // NET_IF_DIRECTION_SENDRECEIVE for a typical ethernet adapter\r
+        GeneralAttributes.ConnectionType = NET_IF_CONNECTION_DEDICATED;  // NET_IF_CONNECTION_DEDICATED for a typical ethernet adapter\r
+        GeneralAttributes.IfType = IF_TYPE_ETHERNET_CSMACD; // IF_TYPE_ETHERNET_CSMACD for a typical ethernet adapter (regardless of speed)\r
+        GeneralAttributes.IfConnectorPresent = TRUE; // RFC 2665 TRUE if physical adapter\r
+\r
+        GeneralAttributes.SupportedStatistics = NDIS_STATISTICS_XMIT_OK_SUPPORTED |\r
+                                                NDIS_STATISTICS_RCV_OK_SUPPORTED |\r
+                                                NDIS_STATISTICS_XMIT_ERROR_SUPPORTED |\r
+                                                NDIS_STATISTICS_RCV_ERROR_SUPPORTED |\r
+                                                NDIS_STATISTICS_RCV_CRC_ERROR_SUPPORTED |\r
+                                                NDIS_STATISTICS_RCV_NO_BUFFER_SUPPORTED |\r
+                                                NDIS_STATISTICS_TRANSMIT_QUEUE_LENGTH_SUPPORTED |\r
+                                                NDIS_STATISTICS_GEN_STATISTICS_SUPPORTED;\r
+                      \r
+        GeneralAttributes.SupportedOidList = NICSupportedOidsTest;\r
+        GeneralAttributes.SupportedOidListLength = sizeof(NICSupportedOidsTest);\r
+\r
+        Status = NdisMSetMiniportAttributes(MiniportAdapterHandle,\r
+                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&GeneralAttributes);\r
+\r
+\r
+#if 0        \r
+        //\r
+        // Allocate all other memory blocks including shared memory\r
+        //\r
+        Status = NICAllocAdapterMemory(Adapter);\r
+        if (Status != NDIS_STATUS_SUCCESS) \r
+        {\r
+            break;\r
+        }\r
+        //\r
+        // Init send data structures\r
+        //\r
+        NICInitSend(Adapter);\r
+\r
+        //\r
+        // Init receive data structures\r
+        //\r
+        Status = NICInitRecv(Adapter);\r
+        if (Status != NDIS_STATUS_SUCCESS)\r
+        {\r
+            break;\r
+        }\r
+        //\r
+        // Map bus-relative registers to virtual system-space\r
+        // \r
+        Status = NdisMMapIoSpace(\r
+                     (PVOID *) &(Adapter->CSRAddress),\r
+                     Adapter->AdapterHandle,\r
+                     Adapter->MemPhysAddress,\r
+                     NIC_MAP_IOSPACE_LENGTH);\r
+        if (Status != NDIS_STATUS_SUCCESS)\r
+        {\r
+            DBGPRINT(MP_ERROR, ("NdisMMapIoSpace failed\n"));\r
+    \r
+            NdisWriteErrorLogEntry(\r
+                Adapter->AdapterHandle,\r
+                NDIS_ERROR_CODE_RESOURCE_CONFLICT,\r
+                1,\r
+                ERRLOG_MAP_IO_SPACE);\r
+        \r
+            break;\r
+        }\r
+\r
+        DBGPRINT(MP_INFO, ("CSRAddress="PTR_FORMAT"\n", Adapter->CSRAddress));\r
+\r
+        //\r
+        // Disable interrupts here which is as soon as possible\r
+        //\r
+        NICDisableInterrupt(Adapter);\r
+#endif\r
+                     \r
+        //\r
+        // Register the interrupt\r
+        //\r
+        //\r
+        \r
+        //\r
+        // the embeded NDIS interrupt structure is already zero'ed out\r
+        // as part of the adapter structure\r
+        //\r
+ #if 0\r
+        NdisZeroMemory(&Interrupt, sizeof(NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS));\r
+        \r
+        Interrupt.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_INTERRUPT;\r
+        Interrupt.Header.Revision = NDIS_MINIPORT_INTERRUPT_REVISION_1;\r
+        Interrupt.Header.Size = sizeof(NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS);\r
+\r
+        Interrupt.InterruptHandler = MPIsr;\r
+        Interrupt.InterruptDpcHandler = MPHandleInterrupt;\r
+        Interrupt.DisableInterruptHandler = NULL;\r
+        Interrupt.EnableInterruptHandler = NULL;\r
+\r
+\r
+\r
+        Status = NdisMRegisterInterruptEx(Adapter->AdapterHandle,\r
+                                          Adapter,\r
+                                          &Interrupt,\r
+                                          &Adapter->NdisInterruptHandle\r
+                                          );\r
+        \r
+                                        \r
+        if (Status != NDIS_STATUS_SUCCESS)\r
+        {\r
+            DBGPRINT(MP_ERROR, ("NdisMRegisterInterrupt failed\n"));\r
+    \r
+            NdisWriteErrorLogEntry(\r
+                Adapter->AdapterHandle,\r
+                NDIS_ERROR_CODE_INTERRUPT_CONNECT,\r
+                0);\r
+        \r
+            break;\r
+        }\r
+        \r
+        //\r
+        // If the driver support MSI\r
+        //\r
+        Adapter->InterruptType = Interrupt.InterruptType;\r
+\r
+        if (Adapter->InterruptType == NDIS_CONNECT_MESSAGE_BASED)\r
+        {\r
+            Adapter->MessageInfoTable = Interrupt.MessageInfoTable;\r
+        }\r
+        \r
+        //\r
+        // If the driver supports MSI, here it should what kind of interrupt is granted. If MSI is granted,\r
+        // the driver can check Adapter->MessageInfoTable to get MSI information\r
+        //\r
+        \r
+        \r
+        MP_SET_FLAG(Adapter, fMP_ADAPTER_INTERRUPT_IN_USE);\r
+\r
+        //\r
+        // Test our adapter hardware\r
+        //\r
+        Status = NICSelfTest(Adapter);\r
+        if (Status != NDIS_STATUS_SUCCESS)\r
+        {\r
+            break;\r
+        }\r
+        \r
+        //\r
+        // Init the hardware and set up everything\r
+        //\r
+        Status = NICInitializeAdapter(Adapter);\r
+        if (Status != NDIS_STATUS_SUCCESS)\r
+        {\r
+            break;\r
+        }\r
+        \r
+        //\r
+        // initial state is paused\r
+        //\r
+        Adapter->AdapterState = NicPaused;\r
+        \r
+        //\r
+        // Set the link detection flag\r
+        //\r
+        MP_SET_FLAG(Adapter, fMP_ADAPTER_LINK_DETECTION);\r
+      \r
+        //\r
+        // Increment the reference count so halt handler will wait \r
+        //\r
+        MP_INC_REF(Adapter);        \r
+\r
+        //\r
+        // Enable the interrupt\r
+        //\r
+        NICEnableInterrupt(Adapter);\r
+\r
+        \r
+        NdisZeroMemory(&Timer, sizeof(NDIS_TIMER_CHARACTERISTICS));\r
+        \r
+        Timer.Header.Type = NDIS_OBJECT_TYPE_TIMER_CHARACTERISTICS;\r
+        Timer.Header.Revision = NDIS_TIMER_CHARACTERISTICS_REVISION_1;\r
+        Timer.Header.Size = sizeof(NDIS_TIMER_CHARACTERISTICS);\r
+\r
+        Timer.AllocationTag = NIC_TAG;\r
+        Timer.TimerFunction = MpLinkDetectionDpc;\r
+        Timer.FunctionContext = Adapter;\r
+\r
+        //\r
+        // Minimize init-time\r
+        //\r
+        Status = NdisAllocateTimerObject(\r
+            Adapter->AdapterHandle,\r
+            &Timer,\r
+            &Adapter->LinkDetectionTimerHandle);\r
+\r
+        if (Status != NDIS_STATUS_SUCCESS)\r
+        {\r
+            break;\r
+        }\r
+\r
+        liDueTime.QuadPart = NIC_LINK_DETECTION_DELAY;\r
+        isTimerAlreadyInQueue =NdisSetTimerObject(Adapter->LinkDetectionTimerHandle, liDueTime, 0, NULL);\r
+        ASSERT(!isTimerAlreadyInQueue);\r
+#endif       \r
+       }  \r
+#if 0\r
+    if (Adapter && (Status != NDIS_STATUS_SUCCESS))\r
+    {\r
+        //\r
+        // Undo everything if it failed\r
+        //\r
+        MP_DEC_REF(Adapter);\r
+        MpFreeAdapter(Adapter);\r
+    }\r
+\r
+    DBGPRINT_S(Status, ("<==== MPInitialize, Status=%x\n", Status));\r
+#endif\r
+               /* Create the adapter adapter */\r
+               ib_status = ipoib_start_adapter( p_adapter );\r
+               if( ib_status != IB_SUCCESS )\r
+               {\r
+                       ASSERT(FALSE);\r
+\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("ipoib_start_adapter returned status %d.\n", ib_status ) );\r
+                       return NDIS_STATUS_FAILURE;\r
+               }\r
+       \r
+               ipoib_ref_ibat();\r
+    return NDIS_STATUS_SUCCESS;\r
+}\r
+\r
+\r
+\r
+NDIS_STATUS\r
+ipoib_initialize_ex(\r
+               IN NDIS_HANDLE  h_adapter,\r
+               IN NDIS_HANDLE  config_context,\r
+               IN PNDIS_MINIPORT_INIT_PARAMETERS  MiniportInitParameters)\r
+       {\r
+               NDIS_STATUS             status;\r
+               ib_api_status_t         ib_status;\r
+               ipoib_adapter_t         *p_adapter;\r
+\r
+               IPOIB_ENTER( IPOIB_DBG_INIT );\r
+       \r
+#ifdef _DEBUG_\r
+               PAGED_CODE();\r
+#endif\r
+               \r
+               UNUSED_PARAM( config_context );\r
+               UNUSED_PARAM( MiniportInitParameters );\r
+               \r
+               /* Create the adapter adapter */\r
+               ib_status = ipoib_create_adapter( h_adapter, &p_adapter );\r
+               if( ib_status != IB_SUCCESS )\r
+               {\r
+                       ASSERT(FALSE);\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("ipoib_create_adapter returned status %d.\n", ib_status ) );\r
+                       return NDIS_STATUS_FAILURE;\r
+               }\r
+               p_adapter->ipoib_state = IPOIB_PAUSED;\r
+               status  = SetAttributes(p_adapter, h_adapter);\r
+               if (status != NDIS_STATUS_SUCCESS) {\r
+                       ASSERT(FALSE);\r
+               }\r
+\r
+#if IPOIB_USE_DMA\r
+               InitNdisScatterGatherDma(p_adapter, h_adapter);\r
+#endif\r
+\r
+               /* Create the adapter adapter */\r
+               ib_status = ipoib_start_adapter( p_adapter );\r
+               if( ib_status != IB_SUCCESS )\r
+               {\r
+                       ASSERT(FALSE);\r
+                       NdisWriteErrorLogEntry( h_adapter,\r
+                               NDIS_ERROR_CODE_HARDWARE_FAILURE, 0 );\r
+#if  IPOIB_USE_DMA\r
+                       NdisMDeregisterScatterGatherDma(p_adapter->NdisMiniportDmaHandle);\r
+#endif\r
+                       ipoib_destroy_adapter( p_adapter );\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("ipoib_start_adapter returned status %d.\n", ib_status ) );\r
+                       return NDIS_STATUS_FAILURE;\r
+               }\r
+       \r
+               ipoib_ref_ibat();\r
+       \r
+               IPOIB_EXIT( IPOIB_DBG_INIT );\r
+               return status;\r
+       }\r
+\r
+\r
+//! Deallocates resources when the NIC is removed and halts the NIC..\r
+//TODO: Dispatch or Passive ?\r
+/*  IRQL = DISPATCH_LEVEL\r
+\r
+@param adapter_context The adapter context allocated at start\r
+*/\r
+void\r
+ipoib_halt_ex(\r
+       IN                              NDIS_HANDLE                                     adapter_context,\r
+       IN                      NDIS_HALT_ACTION            HaltAction )\r
+{\r
+       ipoib_adapter_t *p_adapter;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       UNUSED_PARAM(HaltAction);\r
+//return;              \r
+       ipoib_deref_ibat();\r
+\r
+       CL_ASSERT( adapter_context );\r
+       p_adapter = (ipoib_adapter_t*)adapter_context;\r
+\r
+       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+                       ("Port %016I64x (CA %016I64x port %d) halting\n",\r
+                       p_adapter->guids.port_guid.guid, p_adapter->guids.ca_guid,\r
+                       p_adapter->guids.port_num) );\r
+\r
+#if IPOIB_USE_DMA\r
+       if (p_adapter->NdisMiniportDmaHandle != NULL)\r
+       {\r
+               NdisMDeregisterScatterGatherDma(p_adapter->NdisMiniportDmaHandle);\r
+               p_adapter->NdisMiniportDmaHandle = NULL;\r
+       }\r
+#endif\r
+       ipoib_destroy_adapter( p_adapter );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+}\r
+\r
+\r
+//! Reports the state of the NIC, or monitors the responsiveness of an underlying device driver.\r
+/*  IRQL = DISPATCH_LEVEL\r
+\r
+@param adapter_context The adapter context allocated at start\r
+@return TRUE if the driver determines that its NIC is not operating\r
+*/\r
+BOOLEAN\r
+ipoib_check_for_hang(\r
+       IN                              NDIS_HANDLE                                     adapter_context )\r
+{\r
+       ipoib_adapter_t *p_adapter;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+//return FALSE;\r
+       CL_ASSERT( adapter_context );\r
+       p_adapter = (ipoib_adapter_t*)adapter_context;\r
+\r
+       if( p_adapter->reset )\r
+       {\r
+               IPOIB_EXIT( IPOIB_DBG_INIT );\r
+               return FALSE;\r
+       }\r
+       if (p_adapter->hung) {\r
+               ipoib_resume_oids(p_adapter);\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+       return (p_adapter->hung? TRUE:FALSE);\r
+}\r
+\r
+\r
+/*++\r
+Routine Description:\r
+       The routine sets an NDIS_OFFLOAD structure indicates the current offload \r
+       capabilities that are provided by the miniport adapter \r
+\r
+Arguments:\r
+       pPort - a pointer to port object\r
+       offload - reference to NDIS_OFFLOAD object that should be filled\r
+\r
+Return Value:\r
+       None.\r
+\r
+--*/\r
+//TODO\r
+#if 0\r
+static\r
+void\r
+__ipoib_get_offload_config(\r
+       ipoib_port_t *pPort,\r
+       NDIS_OFFLOAD *p_offload\r
+       )\r
+{\r
+       NDIS_STATUS Status;\r
+       ULONG TxChksumOffload = ((MP_GET_PORT_CONFIG(pPort, TxChksumOffload) == TRUE) ? NDIS_OFFLOAD_SET_ON : NDIS_OFFLOAD_SET_OFF);\r
+       ULONG RxChksumOffload = ((MP_GET_PORT_CONFIG(pPort, RxChksumOffload) == TRUE) ? NDIS_OFFLOAD_SET_ON : NDIS_OFFLOAD_SET_OFF);\r
+       BOOLEAN fLargeSendOffload = MP_GET_PORT_CONFIG(pPort, LargeSendOffload);\r
+       ULONG ulEncapsulation = NDIS_ENCAPSULATION_IEEE_802_3 | NDIS_ENCAPSULATION_IEEE_802_3_P_AND_Q;\r
+           \r
+       NdisZeroMemory(&*p_offload, sizeof(NDIS_OFFLOAD));\r
+       *p_offload.Header.Type = NDIS_OBJECT_TYPE_OFFLOAD;\r
+       *p_offload.Header.Revision = NDIS_OFFLOAD_REVISION_1; // BUGBUG: do we need to support revision 2? UH 17-May-2008\r
+       *p_offload.Header.Size = NDIS_SIZEOF_NDIS_OFFLOAD_REVISION_1;\r
+\r
+       *p_offload.Checksum.IPv4Transmit.Encapsulation = ulEncapsulation;\r
+       *p_offload.Checksum.IPv4Transmit.IpOptionsSupported = TxChksumOffload;\r
+       *p_offload.Checksum.IPv4Transmit.TcpOptionsSupported = TxChksumOffload;\r
+       *p_offload.Checksum.IPv4Transmit.TcpChecksum = TxChksumOffload;\r
+       *p_offload.Checksum.IPv4Transmit.UdpChecksum = NDIS_OFFLOAD_NOT_SUPPORTED;\r
+       *p_offload.Checksum.IPv4Transmit.IpChecksum = TxChksumOffload;\r
+\r
+       *p_offload.Checksum.IPv4Receive.Encapsulation = ulEncapsulation;\r
+       *p_offload.Checksum.IPv4Receive.IpOptionsSupported = RxChksumOffload;\r
+       *p_offload.Checksum.IPv4Receive.TcpOptionsSupported = RxChksumOffload;\r
+       *p_offload.Checksum.IPv4Receive.TcpChecksum = RxChksumOffload;\r
+       *p_offload.Checksum.IPv4Receive.UdpChecksum = NDIS_OFFLOAD_NOT_SUPPORTED; \r
+       *p_offload.Checksum.IPv4Receive.IpChecksum = RxChksumOffload;\r
+\r
+       *p_offload.Checksum.IPv6Transmit.Encapsulation = ulEncapsulation;\r
+       *p_offload.Checksum.IPv6Transmit.IpExtensionHeadersSupported = TxChksumOffload;\r
+       *p_offload.Checksum.IPv6Transmit.TcpOptionsSupported = TxChksumOffload;\r
+       *p_offload.Checksum.IPv6Transmit.TcpChecksum = TxChksumOffload;\r
+       *p_offload.Checksum.IPv6Transmit.UdpChecksum = NDIS_OFFLOAD_NOT_SUPPORTED;\r
+\r
+\r
+       *p_offload.Checksum.IPv6Receive.Encapsulation = ulEncapsulation;\r
+       *p_offload.Checksum.IPv6Receive.IpExtensionHeadersSupported = RxChksumOffload;\r
+       *p_offload.Checksum.IPv6Receive.TcpOptionsSupported = RxChksumOffload;\r
+       *p_offload.Checksum.IPv6Receive.TcpChecksum = RxChksumOffload;\r
+       *p_offload.Checksum.IPv6Receive.UdpChecksum = NDIS_OFFLOAD_NOT_SUPPORTED;\r
+\r
+       if (fLargeSendOffload)\r
+       {\r
+           *p_offload.LsoV1.IPv4.Encapsulation = ulEncapsulation;\r
+           *p_offload.LsoV1.IPv4.MaxOffLoadSize = LARGE_SEND_OFFLOAD_SIZE;\r
+           *p_offload.LsoV1.IPv4.MinSegmentCount = 1;\r
+           *p_offload.LsoV1.IPv4.TcpOptions = NDIS_OFFLOAD_SUPPORTED;\r
+           *p_offload.LsoV1.IPv4.IpOptions = NDIS_OFFLOAD_SUPPORTED;\r
+       }\r
+}\r
+#endif\r
+\r
+//! Returns information about the capabilities and status of the driver and/or its NIC.\r
+/*  IRQL = DISPATCH_LEVEL\r
+\r
+@param adapter_context The adapter context allocated at start\r
+@param oid Object ID representing the query operation to be carried out\r
+@param info_buf Buffer containing any input for this query and location for output\r
+@param info_buf_len Number of bytes available in info_buf\r
+@param p_bytes_written Pointer to number of bytes written into info_buf\r
+@param p_bytes_needed Pointer to number of bytes needed to satisfy this oid\r
+@return NDIS_STATUS_SUCCESS, NDIS_STATUS_PENDING, NDIS_STATUS_INVALID_OID,\r
+NDIS_STATUS_INVALID_LENGTH, NDIS_STATUS_NOT_ACCEPTED, NDIS_STATUS_NOT_SUPPORTED,\r
+NDIS_STATUS_RESOURCES\r
+*/\r
+       NDIS_STATUS\r
+ipoib_query_info(\r
+       IN                              NDIS_HANDLE                                     adapter_context,\r
+       IN                              NDIS_OID                                        oid,\r
+       IN                              PVOID                                           info_buf,\r
+       IN                              ULONG                                           info_buf_len,\r
+               OUT                     PULONG                                          p_bytes_written,\r
+               OUT                     PULONG                                          p_bytes_needed )\r
+       {\r
+       ipoib_adapter_t         *p_adapter;\r
+               NDIS_STATUS             status;\r
+               USHORT                          version;\r
+       ULONG                           info;\r
+               PVOID                           src_buf;\r
+               ULONG                           buf_len;\r
+               pending_oid_t           oid_info;\r
+       uint8_t                         port_num;\r
+               \r
+               IPOIB_ENTER( IPOIB_DBG_OID );\r
+               \r
+               oid_info.oid = oid;\r
+               oid_info.p_buf = info_buf;\r
+               oid_info.buf_len = info_buf_len;\r
+               oid_info.p_bytes_used = p_bytes_written;\r
+               oid_info.p_bytes_needed = p_bytes_needed;\r
+               \r
+               CL_ASSERT( adapter_context );\r
+               p_adapter = (ipoib_adapter_t*)adapter_context;\r
+\r
+               CL_ASSERT( p_bytes_written );\r
+               CL_ASSERT( p_bytes_needed );\r
+               CL_ASSERT( !p_adapter->pending_query );\r
+               \r
+                       status = NDIS_STATUS_SUCCESS;\r
+                       src_buf = &info;\r
+               buf_len = sizeof(info);\r
+       \r
+               port_num = p_adapter->guids.port_num;\r
+       \r
+               switch( oid )\r
+               {\r
+               /* Required General */\r
+               case OID_GEN_SUPPORTED_LIST:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_SUPPORTED_LIST\n", port_num) );\r
+                       src_buf = (PVOID)SUPPORTED_OIDS;\r
+                       buf_len = sizeof(SUPPORTED_OIDS);\r
+                       break;\r
+       \r
+               case OID_GEN_HARDWARE_STATUS:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_HARDWARE_STATUS\n", port_num) );\r
+                       cl_obj_lock( &p_adapter->obj );\r
+                       switch( p_adapter->state )\r
+                       {\r
+                       case IB_PNP_PORT_ADD:\r
+                               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                                       ("Port %d returning NdisHardwareStatusInitializing\n", port_num) );\r
+                               info = NdisHardwareStatusInitializing;\r
+                               break;\r
+                               \r
+                       case IB_PNP_PORT_ACTIVE:\r
+                               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                                       ("Port %d returning NdisHardwareStatusReady\n", port_num) );\r
+                               info = NdisHardwareStatusReady;\r
+                               break;\r
+       \r
+                       default:\r
+                               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                                       ("Port %d returning NdisHardwareStatusNotReady\n", port_num) );\r
+                               info = NdisHardwareStatusNotReady;\r
+                       }\r
+                       cl_obj_unlock( &p_adapter->obj );\r
+                       break;\r
+       \r
+               case OID_GEN_MEDIA_SUPPORTED:\r
+               case OID_GEN_MEDIA_IN_USE:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_MEDIA_SUPPORTED "\r
+                               "or OID_GEN_MEDIA_IN_USE\n", port_num) );\r
+                       info = NdisMedium802_3;\r
+                       break;\r
+       \r
+               case OID_GEN_MAXIMUM_FRAME_SIZE:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_MAXIMUM_FRAME_SIZE\n", port_num) );\r
+                       if( p_adapter->params.cm_enabled )\r
+                       {\r
+                               info = p_adapter->params.cm_payload_mtu;\r
+                       }\r
+                       else\r
+                       {\r
+                               info = p_adapter->params.payload_mtu;\r
+                       }\r
+                       break;\r
+       \r
+               case OID_GEN_LINK_SPEED:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_LINK_SPEED\n", port_num) );\r
+                       if (info_buf_len < buf_len)\r
+                       {\r
+                               break;\r
+                       }\r
+       \r
+                       cl_obj_lock( &p_adapter->obj );\r
+                       switch( p_adapter->state )\r
+                       {\r
+                       case IB_PNP_PORT_ADD:\r
+                               /* Mark the adapter as pending an OID */\r
+                               p_adapter->pending_query = TRUE;\r
+       \r
+                               /* Save the request parameters. */\r
+                               p_adapter->query_oid = oid_info;\r
+       \r
+                               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                                       ("Port %d returning NDIS_STATUS_PENDING\n", port_num) );\r
+                               status = NDIS_STATUS_PENDING;\r
+                               break;\r
+       \r
+                       case IB_PNP_PORT_REMOVE:\r
+                               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                                       ("Port %d returning NDIS_STATUS_NOT_ACCEPTED\n", port_num) );\r
+                               status = NDIS_STATUS_NOT_ACCEPTED;\r
+                               break;\r
+       \r
+                       default:\r
+                               CL_ASSERT( p_adapter->p_port );\r
+                               info = p_adapter->port_rate;\r
+                               break;\r
+                       }\r
+                       cl_obj_unlock( &p_adapter->obj );\r
+                       break;\r
+       \r
+               case OID_GEN_TRANSMIT_BUFFER_SPACE:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_TRANSMIT_BUFFER_SPACE\n", port_num) );\r
+                       if( p_adapter->params.cm_enabled )\r
+                               info = p_adapter->params.sq_depth * p_adapter->params.cm_xfer_block_size;\r
+                       else\r
+                               info = p_adapter->params.sq_depth * p_adapter->params.xfer_block_size;\r
+                       break;\r
+       \r
+               case OID_GEN_RECEIVE_BUFFER_SPACE:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_TRANSMIT_BUFFER_SPACE "\r
+                               "or OID_GEN_RECEIVE_BUFFER_SPACE\n", port_num) );\r
+                       if( p_adapter->params.cm_enabled )\r
+                               info = p_adapter->params.rq_depth * p_adapter->params.cm_xfer_block_size;\r
+                       else\r
+                               info = p_adapter->params.rq_depth * p_adapter->params.xfer_block_size;\r
+                       break;\r
+       \r
+               case OID_GEN_MAXIMUM_LOOKAHEAD:\r
+               case OID_GEN_CURRENT_LOOKAHEAD:\r
+               case OID_GEN_TRANSMIT_BLOCK_SIZE:\r
+               case OID_GEN_RECEIVE_BLOCK_SIZE:\r
+               case OID_GEN_MAXIMUM_TOTAL_SIZE:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_MAXIMUM_LOOKAHEAD "\r
+                               "or OID_GEN_CURRENT_LOOKAHEAD or "\r
+                               "OID_GEN_TRANSMIT_BLOCK_SIZE or "\r
+                               "OID_GEN_RECEIVE_BLOCK_SIZE or "\r
+                               "OID_GEN_MAXIMUM_TOTAL_SIZE\n", port_num) );\r
+                       if( p_adapter->params.cm_enabled )\r
+                               info = p_adapter->params.cm_xfer_block_size;\r
+                       else\r
+                               info = p_adapter->params.xfer_block_size;\r
+                       break;\r
+       \r
+               case OID_GEN_VENDOR_ID:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_VENDOR_ID\n", port_num) );\r
+                       src_buf = (void*)VENDOR_ID;\r
+               buf_len = sizeof(VENDOR_ID);\r
+                       break;\r
+       \r
+               case OID_GEN_VENDOR_DESCRIPTION:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID, \r
+                               ("Port %d received query for OID_GEN_VENDOR_DESCRIPTION\n", port_num) );\r
+                       src_buf = VENDOR_DESCRIPTION;\r
+               buf_len = sizeof(VENDOR_DESCRIPTION);\r
+                       break;\r
+       \r
+               case OID_GEN_VENDOR_DRIVER_VERSION:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_VENDOR_DRIVER_VERSION\n", port_num) );\r
+                       src_buf = &version;\r
+               buf_len = sizeof(version);\r
+                       //TODO: Figure out what the right version is.\r
+                       version = 1 << 8 | 1;\r
+                       break;\r
+       \r
+               case OID_GEN_PHYSICAL_MEDIUM:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_PHYSICAL_MEDIUM\n", port_num) );\r
+                       info = NdisPhysicalMediumUnspecified;\r
+                       break;\r
+       \r
+               case OID_GEN_CURRENT_PACKET_FILTER:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_CURRENT_PACKET_FILTER\n", port_num) );\r
+                       info = p_adapter->packet_filter;\r
+                       break;\r
+       \r
+               case OID_GEN_DRIVER_VERSION:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_DRIVER_VERSION\n", port_num) );\r
+                       src_buf = &version;\r
+               buf_len = sizeof(version);\r
+                       version = MAJOR_NDIS_VERSION << 8 | MINOR_NDIS_VERSION;\r
+                       break;\r
+       \r
+               case OID_GEN_MAC_OPTIONS:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_MAC_OPTIONS\n", port_num) );\r
+                       info = NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA |\r
+                               NDIS_MAC_OPTION_TRANSFERS_NOT_PEND |\r
+                               NDIS_MAC_OPTION_NO_LOOPBACK |\r
+                               NDIS_MAC_OPTION_FULL_DUPLEX;\r
+       //TODO: Figure out if we will support priority and VLANs.\r
+       //                              NDIS_MAC_OPTION_8021P_PRIORITY;\r
+       //#ifdef NDIS51_MINIPORT\r
+       //                      info |= NDIS_MAC_OPTION_8021Q_VLAN;\r
+       //#endif\r
+                       break;\r
+       \r
+               case OID_GEN_MEDIA_CONNECT_STATUS:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_MEDIA_CONNECT_STATUS\n", port_num) );\r
+                       cl_obj_lock( &p_adapter->obj );\r
+                       switch( p_adapter->state )\r
+                       {\r
+                       case IB_PNP_PORT_ADD:\r
+                       case IB_PNP_PORT_INIT:\r
+                               /*\r
+                                * Delay reporting media state until we know whether the port is\r
+                                * either up or down.\r
+                                */\r
+                               p_adapter->pending_query = TRUE;\r
+                               p_adapter->query_oid = oid_info;\r
+       \r
+                               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                                       ("Port %d returning NDIS_STATUS_PENDING\n", port_num) );\r
+                               status = NDIS_STATUS_PENDING;\r
+                               break;\r
+       \r
+                       case IB_PNP_PORT_ACTIVE:\r
+                               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                                       ("Port %d returning NdisMediaStateConnected\n", port_num) );\r
+                               info = NdisMediaStateConnected;\r
+                               break;\r
+       \r
+                       case IB_PNP_PORT_REMOVE:\r
+                               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                                       ("Port %d returning NDIS_STATUS_NOT_ACCEPTED\n", port_num) );\r
+                               status = NDIS_STATUS_NOT_ACCEPTED;\r
+                               break;\r
+       \r
+                       default:\r
+                               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                                       ("Port %d returning NdisMediaStateDisconnected\n", port_num) );\r
+                               info = NdisMediaStateDisconnected;\r
+                       }\r
+                       cl_obj_unlock( &p_adapter->obj );\r
+                       break;\r
+       \r
+               case OID_GEN_MAXIMUM_SEND_PACKETS:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_MAXIMUM_SEND_PACKETS\n", port_num) );\r
+                       info = MINIPORT_MAX_SEND_PACKETS;\r
+                       break;\r
+       \r
+               /* Required General Statistics */\r
+               case OID_GEN_STATISTICS:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_STATISTICS\n", port_num) );\r
+                       src_buf = NULL;   \r
+                        buf_len =  sizeof(NDIS_STATISTICS_INFO);\r
+                       if (info_buf_len < buf_len)\r
+                       {\r
+                          break;\r
+                       } \r
+                       status = ipoib_get_gen_stat(p_adapter, &oid_info );\r
+                       break;\r
+       \r
+               case OID_GEN_XMIT_OK:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_XMIT_OK\n", port_num) );\r
+                       src_buf = NULL;\r
+                       status = ipoib_get_send_stat( p_adapter, IP_STAT_SUCCESS, &oid_info );\r
+                       break;\r
+       \r
+               case OID_GEN_RCV_OK:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_RCV_OK\n", port_num) );\r
+                       src_buf = NULL;\r
+                       status = ipoib_get_recv_stat( p_adapter, IP_STAT_SUCCESS, &oid_info );\r
+                       break;\r
+       \r
+               case OID_GEN_XMIT_ERROR:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_XMIT_ERROR\n", port_num) );\r
+                       src_buf = NULL;\r
+                       status = ipoib_get_send_stat( p_adapter, IP_STAT_ERROR, &oid_info );\r
+                       break;\r
+       \r
+               case OID_GEN_RCV_ERROR:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_RCV_ERROR\n", port_num) );\r
+                       src_buf = NULL;\r
+                       status = ipoib_get_recv_stat( p_adapter, IP_STAT_ERROR, &oid_info );\r
+                       break;\r
+       \r
+               case OID_GEN_RCV_NO_BUFFER:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_RCV_NO_BUFFER\n", port_num) );\r
+                       src_buf = NULL;\r
+                       status = ipoib_get_recv_stat( p_adapter, IP_STAT_DROPPED, &oid_info );\r
+                       break;\r
+       \r
+               case OID_GEN_DIRECTED_BYTES_XMIT:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_DIRECTED_BYTES_XMIT\n", port_num) );\r
+                       src_buf = NULL;\r
+                       status = ipoib_get_send_stat( p_adapter, IP_STAT_UCAST_BYTES, &oid_info );\r
+                       break;\r
+       \r
+               case OID_GEN_DIRECTED_FRAMES_XMIT:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_DIRECTED_FRAMES_XMIT\n", port_num) );\r
+                       src_buf = NULL;\r
+                       status = ipoib_get_send_stat( p_adapter, IP_STAT_UCAST_FRAMES, &oid_info );\r
+                       break;\r
+       \r
+               case OID_GEN_MULTICAST_BYTES_XMIT:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_MULTICAST_BYTES_XMIT\n", port_num) );\r
+                       src_buf = NULL;\r
+                       status = ipoib_get_send_stat( p_adapter, IP_STAT_MCAST_BYTES, &oid_info );\r
+                       break;\r
+       \r
+               case OID_GEN_MULTICAST_FRAMES_XMIT:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_MULTICAST_FRAMES_XMIT\n", port_num) );\r
+                       src_buf = NULL;\r
+                       status = ipoib_get_send_stat( p_adapter, IP_STAT_MCAST_FRAMES, &oid_info );\r
+                       break;\r
+       \r
+               case OID_GEN_BROADCAST_BYTES_XMIT:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_BROADCAST_BYTES_XMIT\n", port_num) );\r
+                       src_buf = NULL;\r
+                       status = ipoib_get_send_stat( p_adapter, IP_STAT_BCAST_BYTES, &oid_info );\r
+                       break;\r
+       \r
+               case OID_GEN_BROADCAST_FRAMES_XMIT:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_BROADCAST_FRAMES_XMIT\n", port_num) );\r
+                       src_buf = NULL;\r
+                       status = ipoib_get_send_stat( p_adapter, IP_STAT_BCAST_FRAMES, &oid_info );\r
+                       break;\r
+       \r
+               case OID_GEN_DIRECTED_BYTES_RCV:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_DIRECTED_BYTES_RCV\n", port_num) );\r
+                       src_buf = NULL;\r
+                       status = ipoib_get_recv_stat( p_adapter, IP_STAT_UCAST_BYTES, &oid_info );\r
+                       break;\r
+       \r
+               case OID_GEN_DIRECTED_FRAMES_RCV:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_DIRECTED_FRAMES_RCV\n", port_num) );\r
+                       src_buf = NULL;\r
+                       status = ipoib_get_recv_stat( p_adapter, IP_STAT_UCAST_FRAMES, &oid_info );\r
+                       break;\r
+       \r
+               case OID_GEN_MULTICAST_BYTES_RCV:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_MULTICAST_BYTES_RCV\n", port_num) );\r
+                       src_buf = NULL;\r
+                       status = ipoib_get_recv_stat( p_adapter, IP_STAT_MCAST_BYTES, &oid_info );\r
+                       break;\r
+       \r
+               case OID_GEN_MULTICAST_FRAMES_RCV:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_MULTICAST_FRAMES_RCV\n", port_num) );\r
+                       src_buf = NULL;\r
+                       status = ipoib_get_recv_stat( p_adapter, IP_STAT_MCAST_FRAMES, &oid_info );\r
+                       break;\r
+       \r
+               case OID_GEN_BROADCAST_BYTES_RCV:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_BROADCAST_BYTES_RCV\n", port_num) );\r
+                       src_buf = NULL;\r
+                       status = ipoib_get_recv_stat( p_adapter, IP_STAT_BCAST_BYTES, &oid_info );\r
+                       break;\r
+       \r
+               case OID_GEN_BROADCAST_FRAMES_RCV:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_BROADCAST_FRAMES_RCV\n", port_num) );\r
+                       src_buf = NULL;\r
+                       status = ipoib_get_recv_stat( p_adapter, IP_STAT_BCAST_FRAMES, &oid_info );\r
+                       break;\r
+       \r
+               /* Required Ethernet operational characteristics */\r
+               case OID_802_3_PERMANENT_ADDRESS:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_802_3_PERMANENT_ADDRESS\n", port_num) );\r
+                       src_buf = &p_adapter->mac;\r
+               buf_len = sizeof(p_adapter->mac);\r
+                       break;\r
+       \r
+               case OID_802_3_CURRENT_ADDRESS:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_802_3_CURRENT_ADDRESS\n", port_num) );\r
+                       src_buf = &p_adapter->params.conf_mac;\r
+               buf_len = sizeof(p_adapter->params.conf_mac);\r
+                       break;\r
+       \r
+               case OID_802_3_MULTICAST_LIST:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_802_3_MULTICAST_LIST\n", port_num) );\r
+                       src_buf = p_adapter->mcast_array;\r
+               buf_len = p_adapter->mcast_array_size * sizeof(mac_addr_t);\r
+                       break;\r
+       \r
+               case OID_802_3_MAXIMUM_LIST_SIZE:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_802_3_MAXIMUM_LIST_SIZE\n", port_num) );\r
+                       info = MAX_MCAST;\r
+                       break;\r
+       \r
+               case OID_802_3_MAC_OPTIONS:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_802_3_MAC_OPTIONS\n", port_num) );\r
+                       info = 0;\r
+                       break;\r
+       \r
+               /* Required Ethernet stats */\r
+               case OID_802_3_RCV_ERROR_ALIGNMENT:\r
+               case OID_802_3_XMIT_ONE_COLLISION:\r
+               case OID_802_3_XMIT_MORE_COLLISIONS:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_802_3_RCV_ERROR_ALIGNMENT or "\r
+                               "OID_802_3_XMIT_ONE_COLLISION or "\r
+                               "OID_802_3_XMIT_MORE_COLLISIONS\n", port_num) );\r
+                       info = 0;\r
+                       break;\r
+       \r
+               case OID_TCP_TASK_OFFLOAD:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_TCP_TASK_OFFLOAD\n", port_num) );\r
+                       src_buf = NULL;\r
+                       status = __ipoib_get_tcp_task_offload( p_adapter, &oid_info );\r
+                       break;\r
+       \r
+               /* Optional General */\r
+               case OID_GEN_SUPPORTED_GUIDS:\r
+#ifdef NDIS51_MINIPORT\r
+               case OID_GEN_VLAN_ID:\r
+#endif\r
+       \r
+               /* Optional General Stats */\r
+               case OID_GEN_RCV_CRC_ERROR:\r
+               case OID_GEN_TRANSMIT_QUEUE_LENGTH:\r
+       \r
+               /* Optional Ethernet Stats */\r
+               case OID_802_3_XMIT_DEFERRED:\r
+               case OID_802_3_XMIT_MAX_COLLISIONS:\r
+               case OID_802_3_RCV_OVERRUN:\r
+               case OID_802_3_XMIT_UNDERRUN:\r
+               case OID_802_3_XMIT_HEARTBEAT_FAILURE:\r
+               case OID_802_3_XMIT_TIMES_CRS_LOST:\r
+               case OID_802_3_XMIT_LATE_COLLISIONS:\r
+               case OID_PNP_CAPABILITIES:\r
+                       status = NDIS_STATUS_NOT_SUPPORTED;\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received an unsupported oid of 0x%.8X!\n", port_num, oid) );\r
+                       break;\r
+       \r
+               case OID_GEN_PROTOCOL_OPTIONS:\r
+               case OID_GEN_NETWORK_LAYER_ADDRESSES:\r
+               case OID_GEN_TRANSPORT_HEADER_OFFSET:\r
+               case OID_PNP_ENABLE_WAKE_UP:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_GEN_PROTOCOL_OPTIONS or OID_GEN_NETWORK_LAYER_ADDRESSES or OID_GEN_TRANSPORT_HEADER_OFFSET  OID_PNP_ENABLE_WAKE_UPn", port_num) );\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Number of OID: 0x%.8X!\n", oid) );\r
+                       status = NDIS_STATUS_SUCCESS; \r
+                       break;\r
+                       \r
+               case OID_PNP_QUERY_POWER:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_TCP_TASK_OFFLOAD\n", port_num) );\r
+                       // Status is pre-set in this routine to Success\r
+                       status = NDIS_STATUS_SUCCESS; \r
+                       break;\r
+       \r
+               case OID_TCP_OFFLOAD_CURRENT_CONFIG:\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d received query for OID_PNP_QUERY_POWER\n", port_num) );\r
+                               //ulBytesAvailable = ulInfoLen = sizeof(NDIS_OFFLOAD);\r
+                               if (info_buf_len <  sizeof(NDIS_OFFLOAD))\r
+                               {\r
+                                       status = NDIS_STATUS_BUFFER_TOO_SHORT;\r
+                                       *p_bytes_needed = sizeof(NDIS_OFFLOAD) ;\r
+                                       break;\r
+                               }\r
+       \r
+                               //ipoib_offload_config(pPort, &offload);\r
+                               //pInfo = &offload;\r
+                               break;\r
+       \r
+               default:\r
+                       status = NDIS_STATUS_INVALID_OID;\r
+               //      IPOIB_PRINT( TRACE_LEVEL_ERROR,IPOIB_DBG_OID,\r
+                       //      ("Port %d received an invalid oid of 0x%.8X!\n", port_num, oid) );\r
+                       break;\r
+               }\r
+       \r
+               /*\r
+                * Complete the request as if it was handled asynchronously to maximize\r
+                * code reuse for when we really handle the requests asynchronously.\r
+                * Note that this requires the QueryInformation entry point to always\r
+                * return NDIS_STATUS_PENDING\r
+                */\r
+               if( status != NDIS_STATUS_PENDING )\r
+               {\r
+                       ipoib_complete_query(\r
+                               p_adapter, &oid_info, status, src_buf, buf_len );\r
+                       return status;\r
+               }\r
+       \r
+               IPOIB_EXIT( IPOIB_DBG_OID );\r
+               return NDIS_STATUS_PENDING;\r
+       }\r
+       \r
+\r
+static void\r
+ipoib_complete_query(\r
+       IN                              ipoib_adapter_t* const          p_adapter,\r
+       IN                              pending_oid_t* const            p_oid_info,\r
+       IN              const   NDIS_STATUS                                     status,\r
+       IN              const   void* const                                     p_buf,\r
+       IN              const   ULONG                                           buf_len )\r
+{\r
+       NDIS_STATUS             oid_status = status;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_OID );\r
+\r
+       CL_ASSERT( status != NDIS_STATUS_PENDING );\r
+\r
+       if( status == NDIS_STATUS_SUCCESS )\r
+       {\r
+               if( p_oid_info->buf_len < buf_len )\r
+               {\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Insufficient buffer space.  "\r
+                               "Returning NDIS_STATUS_INVALID_LENGTH.\n") );\r
+                       oid_status = NDIS_STATUS_INVALID_LENGTH;\r
+                       *p_oid_info->p_bytes_needed = buf_len;\r
+                       *p_oid_info->p_bytes_used = 0;\r
+               }\r
+               else if( p_oid_info->p_buf )\r
+               {\r
+                       /* Only copy if we have a distinct source buffer. */\r
+                       if( p_buf )\r
+                       {\r
+                               NdisMoveMemory( p_oid_info->p_buf, p_buf, buf_len );\r
+                               *p_oid_info->p_bytes_used = buf_len;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Returning NDIS_NOT_ACCEPTED") );\r
+                       oid_status = NDIS_STATUS_NOT_ACCEPTED;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               *p_oid_info->p_bytes_used = 0;\r
+       }\r
+\r
+       if (p_adapter->query_oid.p_pending_oid)\r
+       {\r
+               NdisMOidRequestComplete(p_adapter->h_adapter,p_adapter->query_oid.p_pending_oid,oid_status); \r
+               p_adapter->query_oid.p_pending_oid = NULL;\r
+       }\r
+       p_adapter->pending_query = FALSE;\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_OID );\r
+}\r
+\r
+\r
+static NDIS_STATUS\r
+__ipoib_get_tcp_task_offload(\r
+       IN                              ipoib_adapter_t*                        p_adapter,\r
+       OUT                             pending_oid_t                           *pNdisRequest )\r
+{\r
+#ifndef NDIS60_MINIPORT\r
+       NDIS_TASK_OFFLOAD_HEADER        *p_offload_hdr;\r
+       NDIS_TASK_OFFLOAD                       *p_offload_task;\r
+       NDIS_TASK_TCP_IP_CHECKSUM       *p_offload_chksum;\r
+\r
+       NDIS_TASK_TCP_LARGE_SEND        *p_offload_lso;\r
+       ULONG                                           buf_len;\r
+\r
+       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+               ("Port %d received query for OID_TCP_TASK_OFFLOAD\n",\r
+               p_adapter->guids.port_num) );\r
+\r
+       buf_len = sizeof(NDIS_TASK_OFFLOAD_HEADER) +\r
+               offsetof( NDIS_TASK_OFFLOAD, TaskBuffer ) +\r
+               sizeof(NDIS_TASK_TCP_IP_CHECKSUM) +\r
+               (p_adapter->params.lso  ? \r
+                       sizeof(NDIS_TASK_OFFLOAD) + sizeof(NDIS_TASK_TCP_LARGE_SEND)\r
+                       : 0);\r
+\r
+       pNdisRequest->DATA.QUERY_INFORMATION.BytesNeeded = buf_len;\r
+\r
+       if( pNdisRequest->DATA.QUERY_INFORMATION.InformationBufferLength < buf_len )\r
+               return NDIS_STATUS_INVALID_LENGTH;\r
+\r
+       p_offload_hdr = (NDIS_TASK_OFFLOAD_HEADER*)pNdisRequest->DATA.QUERY_INFORMATION.InformationBuffer;\r
+       if( p_offload_hdr->Version != NDIS_TASK_OFFLOAD_VERSION )\r
+               return NDIS_STATUS_INVALID_DATA;\r
+\r
+       if( p_offload_hdr->EncapsulationFormat.Encapsulation !=\r
+               IEEE_802_3_Encapsulation )\r
+       {\r
+               return NDIS_STATUS_INVALID_DATA;\r
+       }\r
+\r
+       p_offload_hdr->OffsetFirstTask = sizeof(NDIS_TASK_OFFLOAD_HEADER);\r
+       p_offload_task = (NDIS_TASK_OFFLOAD*)(p_offload_hdr + 1);\r
+       p_offload_task->Version = NDIS_TASK_OFFLOAD_VERSION;\r
+       p_offload_task->Size = sizeof(NDIS_TASK_OFFLOAD);\r
+       p_offload_task->Task = TcpIpChecksumNdisTask;\r
+       p_offload_task->OffsetNextTask = 0;\r
+       p_offload_task->TaskBufferLength = sizeof(NDIS_TASK_TCP_IP_CHECKSUM);\r
+       p_offload_chksum =\r
+               (NDIS_TASK_TCP_IP_CHECKSUM*)p_offload_task->TaskBuffer;\r
+       \r
+       p_offload_chksum->V4Transmit.IpOptionsSupported =\r
+       p_offload_chksum->V4Transmit.TcpOptionsSupported =\r
+       p_offload_chksum->V4Transmit.TcpChecksum =\r
+       p_offload_chksum->V4Transmit.UdpChecksum =\r
+       p_offload_chksum->V4Transmit.IpChecksum =\r
+               !!(p_adapter->params.send_chksum_offload);\r
+\r
+       p_offload_chksum->V4Receive.IpOptionsSupported =\r
+       p_offload_chksum->V4Receive.TcpOptionsSupported =\r
+       p_offload_chksum->V4Receive.TcpChecksum =\r
+       p_offload_chksum->V4Receive.UdpChecksum =\r
+       p_offload_chksum->V4Receive.IpChecksum =\r
+               !!(p_adapter->params.recv_chksum_offload);\r
+\r
+       p_offload_chksum->V6Transmit.IpOptionsSupported = FALSE;\r
+       p_offload_chksum->V6Transmit.TcpOptionsSupported = FALSE;\r
+       p_offload_chksum->V6Transmit.TcpChecksum = FALSE;\r
+       p_offload_chksum->V6Transmit.UdpChecksum = FALSE;\r
+\r
+       p_offload_chksum->V6Receive.IpOptionsSupported = FALSE;\r
+       p_offload_chksum->V6Receive.TcpOptionsSupported = FALSE;\r
+       p_offload_chksum->V6Receive.TcpChecksum = FALSE;\r
+       p_offload_chksum->V6Receive.UdpChecksum = FALSE;\r
+\r
+\r
+       if (p_adapter->params.lso) {\r
+               // set the previous pointer to the correct place\r
+               p_offload_task->OffsetNextTask = FIELD_OFFSET(NDIS_TASK_OFFLOAD, TaskBuffer) +\r
+                                               p_offload_task->TaskBufferLength;\r
+               // set the LSO packet\r
+               p_offload_task = (PNDIS_TASK_OFFLOAD)\r
+                                               ((PUCHAR)p_offload_task + p_offload_task->OffsetNextTask);\r
+\r
+               p_offload_task->Version = NDIS_TASK_OFFLOAD_VERSION;\r
+               p_offload_task->Size = sizeof(NDIS_TASK_OFFLOAD);\r
+               p_offload_task->Task = TcpLargeSendNdisTask;\r
+               p_offload_task->OffsetNextTask = 0;\r
+               p_offload_task->TaskBufferLength = sizeof(NDIS_TASK_TCP_LARGE_SEND);\r
+\r
+               p_offload_lso = (PNDIS_TASK_TCP_LARGE_SEND) p_offload_task->TaskBuffer;\r
+\r
+               p_offload_lso->Version = 0;\r
+               //TODO optimal size: 60000, 64000 or 65536\r
+               //TODO LSO_MIN_SEG_COUNT to be 1\r
+               p_offload_lso->MaxOffLoadSize = LARGE_SEND_OFFLOAD_SIZE; \r
+#define LSO_MIN_SEG_COUNT 2\r
+               p_offload_lso->MinSegmentCount = LSO_MIN_SEG_COUNT;\r
+               p_offload_lso->TcpOptions = TRUE;\r
+               p_offload_lso->IpOptions = TRUE;\r
+       }\r
+\r
+               pNdisRequest->DATA.QUERY_INFORMATION.BytesWritten = buf_len\r
+\r
+       return NDIS_STATUS_SUCCESS;\r
+#endif\r
+       UNUSED_PARAM(p_adapter);\r
+       UNUSED_PARAM(pNdisRequest);\r
+       return NDIS_STATUS_NOT_SUPPORTED;\r
+\r
+}\r
+\r
+\r
+static NDIS_STATUS\r
+__ipoib_set_tcp_task_offload(\r
+       IN                              ipoib_adapter_t*                        p_adapter,\r
+       IN                              void* const                                     p_info_buf,\r
+       IN                              ULONG* const                            p_info_len )\r
+{\r
+#ifndef NDIS60_MINIPORT\r
+       NDIS_TASK_OFFLOAD_HEADER        *p_offload_hdr;\r
+       NDIS_TASK_OFFLOAD                       *p_offload_task;\r
+       NDIS_TASK_TCP_IP_CHECKSUM       *p_offload_chksum;\r
+\r
+       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+               ("Port %d received set for OID_TCP_TASK_OFFLOAD\n",\r
+               p_adapter->guids.port_num) );\r
+\r
+       p_offload_hdr = (NDIS_TASK_OFFLOAD_HEADER*)p_info_buf;\r
+\r
+       if( *p_info_len < sizeof(NDIS_TASK_OFFLOAD_HEADER) )\r
+               return NDIS_STATUS_INVALID_LENGTH;\r
+\r
+       if( p_offload_hdr->Version != NDIS_TASK_OFFLOAD_VERSION )\r
+               return NDIS_STATUS_INVALID_DATA;\r
+\r
+       if( p_offload_hdr->Size != sizeof(NDIS_TASK_OFFLOAD_HEADER) )\r
+               return NDIS_STATUS_INVALID_LENGTH;\r
+\r
+       if( !p_offload_hdr->OffsetFirstTask )\r
+               return NDIS_STATUS_SUCCESS;\r
+\r
+       if( p_offload_hdr->EncapsulationFormat.Encapsulation !=\r
+               IEEE_802_3_Encapsulation )\r
+       {\r
+               return NDIS_STATUS_INVALID_DATA;\r
+       }\r
+\r
+       p_offload_task = (NDIS_TASK_OFFLOAD*)\r
+               (((UCHAR*)p_offload_hdr) + p_offload_hdr->OffsetFirstTask);\r
+\r
+       if( *p_info_len < sizeof(NDIS_TASK_OFFLOAD_HEADER) +\r
+               offsetof( NDIS_TASK_OFFLOAD, TaskBuffer ) +\r
+               sizeof(NDIS_TASK_TCP_IP_CHECKSUM) )\r
+       {\r
+               return NDIS_STATUS_INVALID_LENGTH;\r
+       }\r
+\r
+       if( p_offload_task->Version != NDIS_TASK_OFFLOAD_VERSION )\r
+               return NDIS_STATUS_INVALID_DATA;\r
+       p_offload_chksum =\r
+               (NDIS_TASK_TCP_IP_CHECKSUM*)p_offload_task->TaskBuffer;\r
+\r
+       if( !p_adapter->params.send_chksum_offload &&\r
+               (p_offload_chksum->V4Transmit.IpOptionsSupported ||\r
+               p_offload_chksum->V4Transmit.TcpOptionsSupported ||\r
+               p_offload_chksum->V4Transmit.TcpChecksum ||\r
+               p_offload_chksum->V4Transmit.UdpChecksum ||\r
+               p_offload_chksum->V4Transmit.IpChecksum) )\r
+       {\r
+               return NDIS_STATUS_NOT_SUPPORTED;\r
+       }\r
+\r
+       if( !p_adapter->params.recv_chksum_offload &&\r
+               (p_offload_chksum->V4Receive.IpOptionsSupported ||\r
+               p_offload_chksum->V4Receive.TcpOptionsSupported ||\r
+               p_offload_chksum->V4Receive.TcpChecksum ||\r
+               p_offload_chksum->V4Receive.UdpChecksum ||\r
+               p_offload_chksum->V4Receive.IpChecksum) )\r
+       {\r
+               return NDIS_STATUS_NOT_SUPPORTED;\r
+       }\r
+\r
+       return NDIS_STATUS_SUCCESS;\r
+#endif \r
+       UNUSED_PARAM(p_adapter);\r
+       UNUSED_PARAM(p_info_buf);\r
+       UNUSED_PARAM(p_info_len);\r
+       return NDIS_STATUS_NOT_SUPPORTED;\r
+}\r
+\r
+\r
+//! Issues a hardware reset to the NIC and/or resets the driver's software state.\r
+/*  Tear down the connection and start over again.  This is only called when there is a problem.\r
+For example, if a send, query info, or set info had a time out.  MiniportCheckForHang will\r
+be called first.\r
+IRQL = DISPATCH_LEVEL\r
+\r
+@param p_addr_resetPointer to BOOLLEAN that is set to TRUE if the NDIS\r
+library should call MiniportSetInformation to restore addressing information to the current values.\r
+@param adapter_context The adapter context allocated at start\r
+@return NDIS_STATUS_SUCCESS, NDIS_STATUS_PENDING, NDIS_STATUS_NOT_RESETTABLE,\r
+NDIS_STATUS_RESET_IN_PROGRESS, NDIS_STATUS_SOFT_ERRORS, NDIS_STATUS_HARD_ERRORS\r
+*/\r
+NDIS_STATUS\r
+ipoib_reset(\r
+    IN  NDIS_HANDLE     adapter_context,\r
+    OUT PBOOLEAN        p_addr_reset)\r
+{\r
+       ipoib_adapter_t* p_adapter;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+//return NDIS_STATUS_SUCCESS;\r
+       CL_ASSERT( p_addr_reset );\r
+       CL_ASSERT( adapter_context );\r
+       p_adapter = (ipoib_adapter_t*)adapter_context;\r
+\r
+       switch( ipoib_reset_adapter( p_adapter ) )\r
+       {\r
+       case IB_NOT_DONE:\r
+               IPOIB_EXIT( IPOIB_DBG_INIT );\r
+               return NDIS_STATUS_PENDING;\r
+\r
+       case IB_SUCCESS:\r
+               IPOIB_EXIT( IPOIB_DBG_INIT );\r
+               *p_addr_reset = TRUE;\r
+               return NDIS_STATUS_SUCCESS;\r
+\r
+       case IB_INVALID_STATE:\r
+               IPOIB_EXIT( IPOIB_DBG_INIT );\r
+               return NDIS_STATUS_RESET_IN_PROGRESS;\r
+\r
+       default:\r
+               IPOIB_EXIT( IPOIB_DBG_INIT );\r
+               return NDIS_STATUS_HARD_ERRORS;\r
+       }\r
+}\r
+\r
+\r
+//! Request changes in the state information that the miniport driver maintains\r
+/*  For example, this is used to set multicast addresses and the packet filter.\r
+IRQL = DISPATCH_LEVEL\r
+\r
+@param adapter_context The adapter context allocated at start\r
+@param oid Object ID representing the set operation to be carried out\r
+@param info_buf Buffer containing input for this set and location for any output\r
+@param info_buf_len Number of bytes available in info_buf\r
+@param p_bytes_read Pointer to number of bytes read from info_buf\r
+@param p_bytes_needed Pointer to number of bytes needed to satisfy this oid\r
+@return NDIS_STATUS_SUCCESS, NDIS_STATUS_PENDING, NDIS_STATUS_INVALID_OID,\r
+NDIS_STATUS_INVALID_LENGTH, NDIS_STATUS_INVALID_DATA, NDIS_STATUS_NOT_ACCEPTED,\r
+NDIS_STATUS_NOT_SUPPORTED, NDIS_STATUS_RESOURCES\r
+*/\r
+NDIS_STATUS\r
+ipoib_set_info(\r
+       IN                              NDIS_HANDLE                                     adapter_context,\r
+       IN                              NDIS_OID                                        oid,\r
+       IN                              PVOID                                           info_buf,\r
+       IN                              ULONG                                           info_buf_len,\r
+               OUT                     PULONG                                          p_bytes_read,\r
+               OUT                     PULONG                                          p_bytes_needed )\r
+{\r
+       ipoib_adapter_t*        p_adapter;\r
+       NDIS_STATUS                     status;\r
+\r
+       ULONG                           buf_len;\r
+       uint8_t                         port_num;\r
+\r
+       KLOCK_QUEUE_HANDLE      hdl;\r
+       \r
+       IPOIB_ENTER( IPOIB_DBG_OID );\r
+\r
+       CL_ASSERT( adapter_context );\r
+       p_adapter = (ipoib_adapter_t*)adapter_context;\r
+\r
+       CL_ASSERT( p_bytes_read );\r
+       CL_ASSERT( p_bytes_needed );\r
+       CL_ASSERT( !p_adapter->pending_set );\r
+\r
+       status = NDIS_STATUS_SUCCESS;\r
+       *p_bytes_needed = 0;\r
+       buf_len = sizeof(ULONG);\r
+\r
+       port_num = p_adapter->guids.port_num;\r
+       \r
+       cl_obj_lock( &p_adapter->obj );\r
+\r
+       if( p_adapter->state == IB_PNP_PORT_REMOVE )\r
+       {\r
+               *p_bytes_read = 0;\r
+               cl_obj_unlock( &p_adapter->obj );\r
+               return NDIS_STATUS_NOT_ACCEPTED;\r
+       }\r
+\r
+       cl_obj_unlock( &p_adapter->obj );\r
+\r
+       switch( oid )\r
+       {\r
+       /* Required General */\r
+       case OID_GEN_CURRENT_PACKET_FILTER:\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                       ("Port %d received set for OID_GEN_CURRENT_PACKET_FILTER\n", port_num));\r
+               if( info_buf_len < sizeof(p_adapter->packet_filter) )\r
+               {\r
+                       status = NDIS_STATUS_INVALID_LENGTH;\r
+               }\r
+               else if( !info_buf )\r
+               {\r
+                       status = NDIS_STATUS_INVALID_DATA;\r
+               }\r
+               else\r
+               {\r
+                       KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
+                       cl_obj_lock( &p_adapter->obj );\r
+                       switch( p_adapter->state )\r
+                       {\r
+                       case IB_PNP_PORT_ADD:\r
+                               p_adapter->set_oid.oid = oid;\r
+                               p_adapter->set_oid.p_buf = info_buf;\r
+                               p_adapter->set_oid.buf_len = info_buf_len;\r
+                               p_adapter->set_oid.p_bytes_used = p_bytes_read;\r
+                               p_adapter->set_oid.p_bytes_needed = p_bytes_needed;\r
+                               p_adapter->pending_set = TRUE;\r
+                               status = NDIS_STATUS_PENDING;\r
+                               break;\r
+\r
+                       case IB_PNP_PORT_REMOVE:\r
+                               status = NDIS_STATUS_NOT_ACCEPTED;\r
+                               break;\r
+\r
+                       default:\r
+                               if( !p_adapter->packet_filter && (*(uint32_t*)info_buf) )\r
+                               {\r
+                                       cl_qlist_insert_tail(\r
+                                               &g_ipoib.adapter_list, &p_adapter->entry );\r
+\r
+                                       /*\r
+                                        * Filter was zero, now non-zero.  Register IP addresses\r
+                                        * with SA.\r
+                                        */\r
+                                       ipoib_reg_addrs( p_adapter );\r
+                               }\r
+                               else if( p_adapter->packet_filter && !(*(uint32_t*)info_buf) )\r
+                               {\r
+                                       /*\r
+                                        * Filter was non-zero, now zero.  Deregister IP addresses.\r
+                                        */\r
+                                       ipoib_dereg_addrs( p_adapter );\r
+\r
+                                       ASSERT( cl_qlist_count( &g_ipoib.adapter_list ) );\r
+                                       cl_qlist_remove_item(\r
+                                               &g_ipoib.adapter_list, &p_adapter->entry );\r
+                               }\r
+\r
+                               p_adapter->packet_filter = *(uint32_t*)info_buf;\r
+                       }\r
+                       cl_obj_unlock( &p_adapter->obj );\r
+                       KeReleaseInStackQueuedSpinLock( &hdl );\r
+               }\r
+               break;\r
+\r
+       case OID_GEN_CURRENT_LOOKAHEAD:\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                       ("Port %d received set for OID_GEN_CURRENT_LOOKAHEAD\n", port_num));\r
+               if( info_buf_len < buf_len )\r
+                       status = NDIS_STATUS_INVALID_LENGTH;\r
+               break;\r
+\r
+       case OID_GEN_PROTOCOL_OPTIONS:\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                       ("Port %d received set for OID_GEN_PROTOCOL_OPTIONS\n", port_num));\r
+               if( info_buf_len < buf_len )\r
+                       status = NDIS_STATUS_INVALID_LENGTH;\r
+               break;\r
+\r
+       case OID_GEN_NETWORK_LAYER_ADDRESSES:\r
+               status = __ipoib_set_net_addr( p_adapter, info_buf, info_buf_len, p_bytes_read, p_bytes_needed);\r
+               break;\r
+\r
+#ifdef NDIS51_MINIPORT\r
+       case OID_GEN_MACHINE_NAME:\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OID,\r
+                       ("Port %d received set for OID_GEN_MACHINE_NAME\n", port_num) );\r
+               break;\r
+#endif\r
+\r
+       /* Required Ethernet operational characteristics */\r
+       case OID_802_3_MULTICAST_LIST:\r
+               IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_OID,\r
+                       ("Port %d received set for OID_802_3_MULTICAST_LIST\n", port_num) );\r
+               if( info_buf_len > MAX_MCAST * sizeof(mac_addr_t) )\r
+               {\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d OID_802_3_MULTICAST_LIST - Multicast list full.\n", port_num) );\r
+                       status = NDIS_STATUS_MULTICAST_FULL;\r
+                       *p_bytes_needed = MAX_MCAST * sizeof(mac_addr_t);\r
+               }\r
+               else if( info_buf_len % sizeof(mac_addr_t) )\r
+               {\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d OID_802_3_MULTICAST_LIST - Invalid input buffer.\n", port_num) );\r
+                       status = NDIS_STATUS_INVALID_DATA;\r
+               }\r
+               else if( !info_buf && info_buf_len )\r
+               {\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d OID_802_3_MULTICAST_LIST - Invalid input buffer.\n", port_num) );\r
+                       status = NDIS_STATUS_INVALID_DATA;\r
+               }\r
+               else\r
+               {\r
+                       ipoib_refresh_mcast( p_adapter, (mac_addr_t*)info_buf,\r
+                               (uint8_t)(info_buf_len / sizeof(mac_addr_t)) );\r
+\r
+                       buf_len = info_buf_len;\r
+                       /*\r
+                        * Note that we don't return pending.  It will likely take longer\r
+                        * for our SA transactions to complete than NDIS will give us\r
+                        * before reseting the adapter.  If an SA failure is encountered,\r
+                        * the adapter will be marked as hung and we will get reset.\r
+                        */\r
+                       status = NDIS_STATUS_SUCCESS;\r
+               }\r
+               break;\r
+\r
+       case OID_TCP_TASK_OFFLOAD:\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                       ("Port %d received set for OID_TCP_TASK_OFFLOAD\n", port_num) );\r
+\r
+               buf_len = info_buf_len;\r
+               status =\r
+                       __ipoib_set_tcp_task_offload( p_adapter, info_buf, &buf_len );\r
+               break;\r
+\r
+       /* Optional General */\r
+       case OID_GEN_TRANSPORT_HEADER_OFFSET:\r
+#ifdef NDIS51_MINIPORT\r
+       case OID_GEN_RNDIS_CONFIG_PARAMETER:\r
+       case OID_GEN_VLAN_ID:\r
+#endif\r
+               status = NDIS_STATUS_NOT_SUPPORTED;\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                       ("Port %d received an unsupported oid of 0x%.8X!\n", port_num, oid));\r
+               break;\r
+\r
+       case OID_GEN_SUPPORTED_LIST:\r
+       case OID_GEN_HARDWARE_STATUS:\r
+       case OID_GEN_MEDIA_SUPPORTED:\r
+       case OID_GEN_MEDIA_IN_USE:\r
+       case OID_GEN_MAXIMUM_FRAME_SIZE:\r
+       case OID_GEN_LINK_SPEED:\r
+       case OID_GEN_TRANSMIT_BUFFER_SPACE:\r
+       case OID_GEN_RECEIVE_BUFFER_SPACE:\r
+       case OID_GEN_MAXIMUM_LOOKAHEAD:\r
+       case OID_GEN_TRANSMIT_BLOCK_SIZE:\r
+       case OID_GEN_RECEIVE_BLOCK_SIZE:\r
+       case OID_GEN_MAXIMUM_TOTAL_SIZE:\r
+       case OID_GEN_VENDOR_ID:\r
+       case OID_GEN_VENDOR_DESCRIPTION:\r
+       case OID_GEN_VENDOR_DRIVER_VERSION:\r
+       case OID_GEN_DRIVER_VERSION:\r
+       case OID_GEN_MAC_OPTIONS:\r
+       case OID_GEN_MEDIA_CONNECT_STATUS:\r
+       case OID_GEN_MAXIMUM_SEND_PACKETS:\r
+       case OID_GEN_SUPPORTED_GUIDS:\r
+       case OID_GEN_PHYSICAL_MEDIUM:\r
+       default:\r
+               status = NDIS_STATUS_INVALID_OID;\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                       ("Port %d received an invalid oid of 0x%.8X!\n", port_num, oid));\r
+               break;\r
+       }\r
+\r
+       if( status == NDIS_STATUS_SUCCESS )\r
+       {\r
+               *p_bytes_read = buf_len;\r
+       }\r
+       else\r
+       {\r
+               if( status == NDIS_STATUS_INVALID_LENGTH )\r
+               {\r
+                       if ( !*p_bytes_needed )\r
+                       {\r
+                               *p_bytes_needed = buf_len;\r
+                       }\r
+               }\r
+\r
+               *p_bytes_read = 0;\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_OID );\r
+       return status;\r
+}\r
+\r
+#ifdef NNN\r
+NDIS_STATUS\r
+ipoib_set_info(\r
+       ipoib_adapter_t*           p_adapter,\r
+       IN PNDIS_OID_REQUEST   pNdisRequest)\r
+{\r
+       NDIS_STATUS                     status;\r
+       NDIS_OID            oid;\r
+       UINT                            info_buf_len;\r
+       UINT                            buf_len;\r
+       uint8_t                         port_num;\r
+       PVOID                           info_buf;\r
+       UINT                            *p_bytes_needed;\r
+       KLOCK_QUEUE_HANDLE      hdl;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_OID );\r
+\r
+    oid                        = pNdisRequest->DATA.SET_INFORMATION.Oid;\r
+    info_buf           = pNdisRequest->DATA.QUERY_INFORMATION.InformationBuffer;\r
+    info_buf_len       = pNdisRequest->DATA.QUERY_INFORMATION.InformationBufferLength;\r
+       p_bytes_needed  = &pNdisRequest->DATA.QUERY_INFORMATION.BytesNeeded;\r
+       status = NDIS_STATUS_SUCCESS;\r
+\r
+       buf_len = sizeof(UINT);\r
+       port_num = p_adapter->guids.port_num;\r
+\r
+       switch( oid )\r
+       {\r
+       /* Required General */\r
+       case OID_GEN_CURRENT_PACKET_FILTER:\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                       ("Port %d received set for OID_GEN_CURRENT_PACKET_FILTER\n", port_num));\r
+               if( info_buf_len < sizeof(p_adapter->packet_filter) )\r
+               {\r
+                       status = NDIS_STATUS_INVALID_LENGTH;\r
+               }\r
+               else if( !info_buf )\r
+               {\r
+                       status = NDIS_STATUS_INVALID_DATA;\r
+               }\r
+               else\r
+               {\r
+                       KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
+                       cl_obj_lock( &p_adapter->obj );\r
+                       switch( p_adapter->state )\r
+                       {\r
+                       case IB_PNP_PORT_ADD:\r
+                               p_adapter->p_oid_request = pNdisRequest;\r
+                               status = NDIS_STATUS_PENDING;\r
+                               break;\r
+\r
+                       case IB_PNP_PORT_REMOVE:\r
+                               status = NDIS_STATUS_NOT_ACCEPTED;\r
+                               break;\r
+\r
+                       default:\r
+                               if( !p_adapter->packet_filter && (*(uint32_t*)info_buf) )\r
+                               {\r
+                                       cl_qlist_insert_tail(\r
+                                               &g_ipoib.adapter_list, &p_adapter->entry );\r
+\r
+                                       /*\r
+                                        * Filter was zero, now non-zero.  Register IP addresses\r
+                                        * with SA.\r
+                                        */\r
+                                       ipoib_reg_addrs( p_adapter );\r
+                               }\r
+                               else if( p_adapter->packet_filter && !(*(uint32_t*)info_buf) )\r
+                               {\r
+                                       /*\r
+                                        * Filter was non-zero, now zero.  Deregister IP addresses.\r
+                                        */\r
+                                       ipoib_dereg_addrs( p_adapter );\r
+\r
+                                       ASSERT( cl_qlist_count( &g_ipoib.adapter_list ) );\r
+                                       cl_qlist_remove_item(\r
+                                               &g_ipoib.adapter_list, &p_adapter->entry );\r
+                               }\r
+\r
+                               p_adapter->packet_filter = *(uint32_t*)info_buf;\r
+                       }\r
+                       cl_obj_unlock( &p_adapter->obj );\r
+                       KeReleaseInStackQueuedSpinLock( &hdl );\r
+               }\r
+               break;\r
+\r
+       case OID_GEN_CURRENT_LOOKAHEAD:\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                       ("Port %d received set for OID_GEN_CURRENT_LOOKAHEAD\n", port_num));\r
+               if( info_buf_len < buf_len )\r
+                       status = NDIS_STATUS_INVALID_LENGTH;\r
+               break;\r
+\r
+       case OID_GEN_PROTOCOL_OPTIONS:\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                       ("Port %d received set for OID_GEN_PROTOCOL_OPTIONS\n", port_num));\r
+               if( info_buf_len < buf_len )\r
+                       status = NDIS_STATUS_INVALID_LENGTH;\r
+               break;\r
+\r
+       case OID_GEN_NETWORK_LAYER_ADDRESSES:\r
+               status = __ipoib_set_net_addr( p_adapter, pNdisRequest);\r
+               break;\r
+\r
+       case OID_GEN_MACHINE_NAME:\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OID,\r
+                       ("Port %d received set for OID_GEN_MACHINE_NAME\n", port_num) );\r
+               break;\r
+\r
+\r
+       /* Required Ethernet operational characteristics */\r
+       case OID_802_3_MULTICAST_LIST:\r
+               IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_OID,\r
+                       ("Port %d received set for OID_802_3_MULTICAST_LIST\n", port_num) );\r
+               if( info_buf_len > MAX_MCAST * sizeof(mac_addr_t) )\r
+               {\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d OID_802_3_MULTICAST_LIST - Multicast list full.\n", port_num) );\r
+                       status = NDIS_STATUS_MULTICAST_FULL;\r
+                       *p_bytes_needed = MAX_MCAST * sizeof(mac_addr_t);\r
+               }\r
+               else if( info_buf_len % sizeof(mac_addr_t) )\r
+               {\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d OID_802_3_MULTICAST_LIST - Invalid input buffer.\n", port_num) );\r
+                       status = NDIS_STATUS_INVALID_DATA;\r
+               }\r
+               else if( !info_buf && info_buf_len )\r
+               {\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d OID_802_3_MULTICAST_LIST - Invalid input buffer.\n", port_num) );\r
+                       status = NDIS_STATUS_INVALID_DATA;\r
+               }\r
+               else\r
+               {\r
+                       ipoib_refresh_mcast( p_adapter, (mac_addr_t*)info_buf,\r
+                               (uint8_t)(info_buf_len / sizeof(mac_addr_t)) );\r
+\r
+                       buf_len = info_buf_len;\r
+                       /*\r
+                        * Note that we don't return pending.  It will likely take longer\r
+                        * for our SA transactions to complete than NDIS will give us\r
+                        * before reseting the adapter.  If an SA failure is encountered,\r
+                        * the adapter will be marked as hung and we will get reset.\r
+                        */\r
+                       status = NDIS_STATUS_SUCCESS;\r
+               }\r
+               break;\r
+\r
+       case OID_TCP_TASK_OFFLOAD:\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                       ("Port %d received set for OID_TCP_TASK_OFFLOAD\n", port_num) );\r
+\r
+               buf_len = info_buf_len;\r
+               status =\r
+                       __ipoib_set_tcp_task_offload( p_adapter, pNdisRequest );\r
+               break;\r
+\r
+       /* Optional General */\r
+       case OID_GEN_TRANSPORT_HEADER_OFFSET:\r
+#ifdef NDIS51_MINIPORT\r
+       case OID_GEN_RNDIS_CONFIG_PARAMETER:\r
+       case OID_GEN_VLAN_ID:\r
+#endif\r
+               status = NDIS_STATUS_NOT_SUPPORTED;\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                       ("Port %d received an unsupported oid of 0x%.8X!\n", port_num, oid));\r
+               break;\r
+\r
+       case OID_GEN_SUPPORTED_LIST:\r
+       case OID_GEN_HARDWARE_STATUS:\r
+       case OID_GEN_MEDIA_SUPPORTED:\r
+       case OID_GEN_MEDIA_IN_USE:\r
+       case OID_GEN_MAXIMUM_FRAME_SIZE:\r
+       case OID_GEN_LINK_SPEED:\r
+       case OID_GEN_TRANSMIT_BUFFER_SPACE:\r
+       case OID_GEN_RECEIVE_BUFFER_SPACE:\r
+       case OID_GEN_MAXIMUM_LOOKAHEAD:\r
+       case OID_GEN_TRANSMIT_BLOCK_SIZE:\r
+       case OID_GEN_RECEIVE_BLOCK_SIZE:\r
+       case OID_GEN_MAXIMUM_TOTAL_SIZE:\r
+       case OID_GEN_VENDOR_ID:\r
+       case OID_GEN_VENDOR_DESCRIPTION:\r
+       case OID_GEN_VENDOR_DRIVER_VERSION:\r
+       case OID_GEN_DRIVER_VERSION:\r
+       case OID_GEN_MAC_OPTIONS:\r
+       case OID_GEN_MEDIA_CONNECT_STATUS:\r
+       case OID_GEN_MAXIMUM_SEND_PACKETS:\r
+       case OID_GEN_SUPPORTED_GUIDS:\r
+       case OID_GEN_PHYSICAL_MEDIUM:\r
+       default:\r
+               status = NDIS_STATUS_INVALID_OID;\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                       ("Port %d received an invalid oid of 0x%.8X!\n", port_num, oid));\r
+               break;\r
+       }\r
+\r
+       if( status == NDIS_STATUS_SUCCESS )\r
+       {\r
+               pNdisRequest->DATA.SET_INFORMATION.BytesRead = buf_len;\r
+       }\r
+       else\r
+       {\r
+               if( status == NDIS_STATUS_INVALID_LENGTH )\r
+               {\r
+                       if ( !*p_bytes_needed )\r
+                       {\r
+                               *p_bytes_needed = buf_len;\r
+                       }\r
+               }\r
+\r
+               pNdisRequest->DATA.SET_INFORMATION.BytesRead = 0;\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_OID );\r
+       return status;\r
+}\r
+#endif\r
+static NDIS_STATUS\r
+ipoib_oid_handler(\r
+    IN  NDIS_HANDLE         adapter_context,\r
+    IN  PNDIS_OID_REQUEST   pNdisRequest)\r
+{\r
+    NDIS_REQUEST_TYPE       RequestType;\r
+       NDIS_STATUS     status = NDIS_STATUS_SUCCESS;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_OID );\r
+\r
+       RequestType = pNdisRequest->RequestType;\r
+\r
+       switch(RequestType)\r
+       {\r
+        case NdisRequestSetInformation:            \r
+            status = ipoib_set_info(adapter_context,\r
+                                               pNdisRequest->DATA.SET_INFORMATION.Oid,\r
+                                               pNdisRequest->DATA.SET_INFORMATION.InformationBuffer,\r
+                                               pNdisRequest->DATA.SET_INFORMATION.InformationBufferLength,\r
+                                               (PULONG)&pNdisRequest->DATA.SET_INFORMATION.BytesRead,\r
+                                               (PULONG)&pNdisRequest->DATA.SET_INFORMATION.BytesNeeded);\r
+            break;\r
+                \r
+        case NdisRequestQueryInformation:\r
+        case NdisRequestQueryStatistics:\r
+            status = ipoib_query_info(adapter_context,\r
+                                               pNdisRequest->DATA.QUERY_INFORMATION.Oid,\r
+                                               pNdisRequest->DATA.QUERY_INFORMATION.InformationBuffer,\r
+                                               pNdisRequest->DATA.QUERY_INFORMATION.InformationBufferLength,\r
+                                               (PULONG)&pNdisRequest->DATA.QUERY_INFORMATION.BytesWritten,\r
+                                               (PULONG)&pNdisRequest->DATA.QUERY_INFORMATION.BytesNeeded);\r
+                                               \r
+            break;\r
+\r
+        default:\r
+            status = NDIS_STATUS_NOT_SUPPORTED;\r
+            break;\r
+       }\r
+       IPOIB_EXIT( IPOIB_DBG_OID );\r
+       return status;\r
+}\r
+\r
+//! Transfers some number of packets, specified as an array of packet pointers, over the network. \r
+/*  For a deserialized driver, these packets are completed asynchronously\r
+using NdisMSendComplete.\r
+IRQL <= DISPATCH_LEVEL\r
+\r
+@param adapter_context Pointer to ipoib_adapter_t structure with per NIC state\r
+@param packet_array Array of packets to send\r
+@param numPackets Number of packets in the array\r
+*/\r
+void\r
+ipoib_send_net_buffer_list(\r
+    IN  NDIS_HANDLE         adapter_context,\r
+    IN  PNET_BUFFER_LIST    net_buffer_list,\r
+    IN  NDIS_PORT_NUMBER    port_num,\r
+    IN  ULONG               send_flags\r
+    )\r
+{\r
+       ipoib_adapter_t         *p_adapter;\r
+       ipoib_port_t            *p_port;\r
+       ULONG                           send_complete_flags;\r
+    PNET_BUFFER_LIST    curr_net_buffer_list;\r
+    PNET_BUFFER_LIST    next_net_buffer_list;\r
+       NDIS_STATUS     status = NDIS_STATUS_SUCCESS;\r
+       \r
+       UNREFERENCED_PARAMETER(port_num);\r
+       PERF_DECLARE( SendPackets );\r
+       PERF_DECLARE( PortSend );\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_SEND );\r
+       cl_perf_start( SendPackets );\r
+\r
+       CL_ASSERT( adapter_context );\r
+       p_adapter = (ipoib_adapter_t*)adapter_context;\r
+       p_port = p_adapter->p_port;\r
+\r
+       cl_obj_lock( &p_adapter->obj );\r
+       if( p_adapter->ipoib_state == IPOIB_PAUSING ||\r
+               p_adapter->ipoib_state == IPOIB_PAUSED)\r
+       {\r
+               status = NDIS_STATUS_PAUSED; \r
+               cl_obj_unlock( &p_adapter->obj );\r
+               goto compl_status;\r
+       }\r
+\r
+       if( p_adapter->state != IB_PNP_PORT_ACTIVE || !p_adapter->p_port )\r
+       {\r
+               cl_obj_unlock( &p_adapter->obj );\r
+               status = NDIS_STATUS_FAILURE; \r
+               goto compl_status;\r
+       }\r
+\r
+       p_port = p_adapter->p_port;\r
+       ipoib_port_ref( p_port, ref_send_packets );\r
+       cl_obj_unlock( &p_adapter->obj );\r
+       //IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+       //                      ("Starting NET BUFFER LIST \n") );\r
+       for (curr_net_buffer_list = net_buffer_list;\r
+               curr_net_buffer_list != NULL;\r
+               curr_net_buffer_list = next_net_buffer_list)\r
+       {\r
+               next_net_buffer_list = NET_BUFFER_LIST_NEXT_NBL(curr_net_buffer_list);\r
+               cl_perf_start( PortSend );\r
+               \r
+               ipoib_port_send( p_port, curr_net_buffer_list, send_flags);\r
+               cl_perf_stop( &adapter->perf, PortSend );\r
+       }\r
+       ipoib_port_deref( p_port, ref_send_packets );\r
+\r
+       cl_perf_stop( &p_adapter->perf, SendPackets );\r
+\r
+       cl_perf_log( &p_adapter->perf, SendBundle, num_packets );\r
+\r
+compl_status:\r
+    if (status != NDIS_STATUS_SUCCESS)\r
+       {\r
+               //ASSERT(FALSE); //????\r
+               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Got bad status \n") );\r
+               send_complete_flags = 0;\r
+           \r
+               for (curr_net_buffer_list = net_buffer_list;\r
+                                curr_net_buffer_list != NULL;\r
+                                curr_net_buffer_list = next_net_buffer_list)\r
+               {\r
+                       next_net_buffer_list = NET_BUFFER_LIST_NEXT_NBL(curr_net_buffer_list);\r
+                       NET_BUFFER_LIST_STATUS(curr_net_buffer_list) = status;\r
+                       ipoib_inc_send_stat( p_adapter, IP_STAT_DROPPED, 0 );\r
+               }\r
+\r
+\r
+               if (NDIS_TEST_SEND_AT_DISPATCH_LEVEL(send_flags))\r
+               {\r
+                       NDIS_SET_SEND_COMPLETE_FLAG(send_complete_flags, NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL);\r
+               }\r
+                     \r
+               NdisMSendNetBufferListsComplete(\r
+                       p_adapter->h_adapter,\r
+                       net_buffer_list,\r
+                       send_complete_flags);  \r
+       }\r
+       IPOIB_EXIT( IPOIB_DBG_SEND );\r
+}\r
+\r
+void\r
+ipoib_pnp_notify(\r
+       IN                              NDIS_HANDLE                                     adapter_context,\r
+       IN PNET_DEVICE_PNP_EVENT  pnp_event)\r
+{\r
+       ipoib_adapter_t *p_adapter;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_PNP );\r
+\r
+       p_adapter = (ipoib_adapter_t*)adapter_context;\r
+\r
+       IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_PNP, ("Event %d\n", pnp_event->DevicePnPEvent) );\r
+       if( pnp_event->DevicePnPEvent != NdisDevicePnPEventPowerProfileChanged )\r
+       {\r
+               cl_obj_lock( &p_adapter->obj );\r
+               p_adapter->state = IB_PNP_PORT_REMOVE;\r
+               cl_obj_unlock( &p_adapter->obj );\r
+\r
+               ipoib_resume_oids( p_adapter );\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_PNP );\r
+}\r
+\r
+\r
+VOID\r
+ipoib_shutdown_ex(\r
+       IN NDIS_HANDLE  adapter_context,\r
+       IN NDIS_SHUTDOWN_ACTION  shutdown_action)\r
+{\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+       UNUSED_PARAM( adapter_context );\r
+       UNUSED_PARAM( shutdown_action );\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+}\r
+\r
+\r
+void\r
+ipoib_resume_oids(\r
+       IN                              ipoib_adapter_t* const          p_adapter )\r
+{\r
+       ULONG                           info;\r
+       NDIS_STATUS                     status;\r
+       boolean_t                       pending_query, pending_set;\r
+       pending_oid_t           query_oid = {0};\r
+       pending_oid_t           set_oid = {0};\r
+       KLOCK_QUEUE_HANDLE      hdl;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       cl_obj_lock( &p_adapter->obj );\r
+       /*\r
+        * Set the status depending on our state.  Fail OID requests that\r
+        * are pending while we reset the adapter.\r
+        */\r
+       switch( p_adapter->state )\r
+       {\r
+       case IB_PNP_PORT_ADD:\r
+               status = NDIS_STATUS_FAILURE;\r
+               break;\r
+\r
+       case IB_PNP_PORT_REMOVE:\r
+               status = NDIS_STATUS_NOT_ACCEPTED;\r
+               break;\r
+               \r
+       default:\r
+               status = NDIS_STATUS_SUCCESS;\r
+       }\r
+\r
+       pending_query = p_adapter->pending_query;\r
+       if( pending_query )\r
+       {\r
+               query_oid = p_adapter->query_oid;\r
+               p_adapter->pending_query = FALSE;\r
+       }\r
+       pending_set = p_adapter->pending_set;\r
+       if( pending_set )\r
+       {\r
+               set_oid = p_adapter->set_oid;\r
+               p_adapter->pending_set = FALSE;\r
+       }\r
+       cl_obj_unlock( &p_adapter->obj );\r
+\r
+       /*\r
+        * If we had a pending OID request for OID_GEN_LINK_SPEED,\r
+        * complete it now.  Note that we hold the object lock since\r
+        * NdisMQueryInformationComplete is called at DISPATCH_LEVEL.\r
+        */\r
+       if( pending_query )\r
+       {\r
+               switch( query_oid.oid )\r
+               {\r
+               case OID_GEN_LINK_SPEED:\r
+                       ipoib_complete_query( p_adapter, &query_oid,\r
+                               status, &p_adapter->port_rate, sizeof(p_adapter->port_rate) );\r
+                       break;\r
+\r
+               case OID_GEN_MEDIA_CONNECT_STATUS:\r
+                       info = NdisMediaStateConnected;\r
+                       ipoib_complete_query( p_adapter, &query_oid,\r
+                               status, &info, sizeof(info) );\r
+                       break;\r
+\r
+               default:\r
+                       CL_ASSERT( query_oid.oid == OID_GEN_LINK_SPEED ||\r
+                               query_oid.oid == OID_GEN_MEDIA_CONNECT_STATUS );\r
+                       break;\r
+               }\r
+       }\r
+\r
+       if( pending_set )\r
+       {\r
+               switch( set_oid.oid )\r
+               {\r
+               case OID_GEN_CURRENT_PACKET_FILTER:\r
+                       /* Validation already performed in the SetInformation path. */\r
+\r
+                       KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
+                       cl_obj_lock( &p_adapter->obj );\r
+                       if( !p_adapter->packet_filter && (*(PULONG)set_oid.p_buf) )\r
+                       {\r
+                               cl_qlist_insert_tail(\r
+                                       &g_ipoib.adapter_list, &p_adapter->entry );\r
+                               /*\r
+                                * Filter was zero, now non-zero.  Register IP addresses\r
+                                * with SA.\r
+                                */\r
+                               ipoib_reg_addrs( p_adapter );\r
+                       }\r
+                       else if( p_adapter->packet_filter && !(*(PULONG)set_oid.p_buf) )\r
+                       {\r
+                               /* Filter was non-zero, now zero.  Deregister IP addresses. */\r
+                               ipoib_dereg_addrs( p_adapter );\r
+\r
+                               ASSERT( cl_qlist_count( &g_ipoib.adapter_list ) );\r
+                               cl_qlist_remove_item(\r
+                                       &g_ipoib.adapter_list, &p_adapter->entry );\r
+                       }\r
+                       p_adapter->packet_filter = *(PULONG)set_oid.p_buf;\r
+\r
+                       cl_obj_unlock( &p_adapter->obj );\r
+                       KeReleaseInStackQueuedSpinLock( &hdl );\r
+                       p_adapter->set_oid.p_pending_oid = NULL;\r
+                       NdisMOidRequestComplete( p_adapter->h_adapter, set_oid.p_pending_oid, status );\r
+                       break;\r
+\r
+               case OID_GEN_NETWORK_LAYER_ADDRESSES:\r
+                       status = __ipoib_set_net_addr( p_adapter,\r
+                                                                                  p_adapter->set_oid.p_buf,\r
+                                                                                  p_adapter->set_oid.buf_len,\r
+                                                                                  p_adapter->set_oid.p_bytes_used,\r
+                                                                                  p_adapter->set_oid.p_bytes_needed );\r
+\r
+                       if( status != NDIS_STATUS_PENDING )\r
+                       {\r
+                               p_adapter->set_oid.p_pending_oid = NULL;\r
+                               NdisMOidRequestComplete( p_adapter->h_adapter, set_oid.p_pending_oid, status );\r
+                       }\r
+                       break;\r
+\r
+               default:\r
+                       CL_ASSERT( set_oid.oid && 0 );\r
+                       break;\r
+               }\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+}\r
+\r
+\r
+static NDIS_STATUS\r
+__ipoib_set_net_addr(\r
+       IN              ipoib_adapter_t *       p_adapter,\r
+       IN              PVOID                           info_buf,\r
+       IN              ULONG                           info_buf_len,\r
+               OUT     PULONG                          p_bytes_read,\r
+               OUT     PULONG                          p_bytes_needed )\r
+{\r
+       NDIS_STATUS                             status;\r
+       PNETWORK_ADDRESS_LIST   p_net_addrs;\r
+       PNETWORK_ADDRESS                p_net_addr_oid;\r
+       PNETWORK_ADDRESS_IP             p_ip_addr;\r
+\r
+       net_address_item_t              *p_addr_item;\r
+\r
+       cl_status_t                             cl_status;\r
+\r
+       size_t                                  idx;\r
+       LONG                                    i;\r
+       ULONG                                   addr_size;\r
+       ULONG                                   total_size;\r
+\r
+       uint8_t                                 port_num;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_OID );\r
+\r
+       status = NDIS_STATUS_SUCCESS;\r
+       port_num = p_adapter->guids.port_num;\r
+\r
+       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+               ("Port %d received set for OID_GEN_NETWORK_LAYER_ADDRESSES\n",\r
+               port_num) );\r
+\r
+       if( !info_buf )\r
+       {\r
+               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Port %d - OID_GEN_NETWORK_LAYER_ADDRESSES - "\r
+                       "NULL buffer\n", port_num) );\r
+               IPOIB_EXIT( IPOIB_DBG_OID );\r
+               return NDIS_STATUS_INVALID_DATA;\r
+       }\r
+\r
+       /*\r
+        * Must use field offset because the structures define array's of size one\r
+        * of a the incorrect type for what is really stored.\r
+        */\r
+       if( info_buf_len < FIELD_OFFSET(NETWORK_ADDRESS_LIST, Address) )\r
+       {\r
+               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, \r
+                       ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - "\r
+                       "bad length of %d, not enough "\r
+                       "for NETWORK_ADDRESS_LIST (%d)\n", port_num, info_buf_len,\r
+                       FIELD_OFFSET(NETWORK_ADDRESS_LIST, Address)) );\r
+               *p_bytes_needed = FIELD_OFFSET(NETWORK_ADDRESS_LIST, Address);\r
+               IPOIB_EXIT( IPOIB_DBG_OID );\r
+               return NDIS_STATUS_INVALID_LENGTH;\r
+       }\r
+\r
+       p_net_addrs = (PNETWORK_ADDRESS_LIST)info_buf;\r
+       if( p_net_addrs->AddressCount == 0)\r
+       {\r
+               if( p_net_addrs->AddressType == NDIS_PROTOCOL_ID_TCP_IP )\r
+               {\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OID,\r
+                               ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - "\r
+                               "clear TCP/IP addresses\n", port_num) );\r
+               }\r
+               else\r
+               {\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OID,\r
+                               ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - "\r
+                               "Non TCP/IP address type of 0x%.4X on clear\n",\r
+                               port_num, p_net_addrs->AddressType) );\r
+                       IPOIB_EXIT( IPOIB_DBG_OID );\r
+                       return NDIS_STATUS_SUCCESS;\r
+               }\r
+       }\r
+\r
+       addr_size = FIELD_OFFSET(NETWORK_ADDRESS, Address) +\r
+               NETWORK_ADDRESS_LENGTH_IP;\r
+       total_size = FIELD_OFFSET(NETWORK_ADDRESS_LIST, Address) +\r
+               addr_size * p_net_addrs->AddressCount;\r
+\r
+       if( info_buf_len < total_size )\r
+       {\r
+               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - "\r
+                       "bad length of %d, %d required for %d addresses\n",\r
+                       port_num, info_buf_len, total_size, p_net_addrs->AddressCount) );\r
+               *p_bytes_needed = total_size;\r
+               IPOIB_EXIT( IPOIB_DBG_OID );\r
+               return NDIS_STATUS_INVALID_LENGTH;\r
+       }\r
+\r
+       /* Lock lists for duration since SA callbacks can occur on other CPUs */\r
+       cl_obj_lock( &p_adapter->obj );\r
+\r
+       /* Set the capacity of the vector to accomodate all assinged addresses. */\r
+       cl_status = cl_vector_set_capacity(\r
+               &p_adapter->ip_vector, p_net_addrs->AddressCount );\r
+       if( cl_status != CL_SUCCESS )\r
+       {\r
+               cl_obj_unlock( &p_adapter->obj );\r
+               IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Port %d - OID_GEN_NETWORK_LAYER_ADDRESSES - "\r
+                       "Failed to set IP vector capacity: %#x\n", port_num,\r
+                       cl_status) );\r
+               IPOIB_EXIT( IPOIB_DBG_OID );\r
+               return NDIS_STATUS_RESOURCES;\r
+       }\r
+\r
+       *p_bytes_read = total_size;\r
+\r
+       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+               ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - List contains %d addresses\n",\r
+                       port_num, p_net_addrs->AddressCount));\r
+\r
+       /* First look for addresses we had that should be removed */\r
+       for( idx = 0; idx != cl_vector_get_size( &p_adapter->ip_vector ); idx++ )\r
+       {\r
+               p_addr_item = (net_address_item_t*)\r
+                       cl_vector_get_ptr( &p_adapter->ip_vector, idx );\r
+               p_net_addr_oid = (PNETWORK_ADDRESS)p_net_addrs->Address;\r
+\r
+               for( i = 0; i < p_net_addrs->AddressCount; ++i, p_net_addr_oid =\r
+                       (PNETWORK_ADDRESS)((uint8_t *)p_net_addr_oid +\r
+                       FIELD_OFFSET(NETWORK_ADDRESS, Address) +\r
+                       p_net_addr_oid->AddressLength) )\r
+               {\r
+\r
+                       if( p_net_addr_oid->AddressType != NDIS_PROTOCOL_ID_TCP_IP )\r
+                       {\r
+                               IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_OID,\r
+                                       ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - Address %d is wrong type of 0x%.4X, "\r
+                                               "should be 0x%.4X\n", port_num, i, p_net_addr_oid->AddressType,\r
+                                               NDIS_PROTOCOL_ID_TCP_IP));\r
+                               continue;\r
+                       }\r
+\r
+                       if( p_net_addr_oid->AddressLength != NETWORK_ADDRESS_LENGTH_IP)\r
+                       {\r
+                               IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_OID,\r
+                                       ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - Address %d is wrong size of %d, "\r
+                                               "should be %d\n", port_num, i, p_net_addr_oid->AddressLength,\r
+                                               NETWORK_ADDRESS_LENGTH_IP));\r
+                               continue;\r
+                       }\r
+\r
+                       p_ip_addr = (PNETWORK_ADDRESS_IP)p_net_addr_oid->Address;\r
+                       if( !cl_memcmp( &p_ip_addr->in_addr,\r
+                               &p_addr_item->address.as_ulong, sizeof(ULONG) ) )\r
+                       {\r
+                               break;\r
+                       }\r
+               }\r
+\r
+               if( i == p_net_addrs->AddressCount )\r
+               {\r
+                       /* Didn't find a match, delete from SA */\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                               ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - Deleting Address %d.%d.%d.%d\n",\r
+                                       port_num,\r
+                                       p_addr_item->address.as_bytes[0],\r
+                                       p_addr_item->address.as_bytes[1],\r
+                                       p_addr_item->address.as_bytes[2],\r
+                                       p_addr_item->address.as_bytes[3]));\r
+\r
+                       if( p_addr_item->p_reg )\r
+                       {\r
+                               if( p_addr_item->p_reg->h_reg_svc )\r
+                               {\r
+                                       p_adapter->p_ifc->dereg_svc(\r
+                                               p_addr_item->p_reg->h_reg_svc, __ipoib_ats_dereg_cb );\r
+                               }\r
+                               else\r
+                               {\r
+                                       cl_free( p_addr_item->p_reg );\r
+                               }\r
+                               p_addr_item->p_reg = NULL;\r
+                       }\r
+                       p_addr_item->address.as_ulong = 0;\r
+               }\r
+       }\r
+\r
+       /* Now look for new addresses */\r
+       p_net_addr_oid = (NETWORK_ADDRESS *)p_net_addrs->Address;\r
+       idx = 0;\r
+       for( i = 0; i < p_net_addrs->AddressCount; i++, p_net_addr_oid =\r
+               (PNETWORK_ADDRESS)((uint8_t *)p_net_addr_oid +\r
+               FIELD_OFFSET(NETWORK_ADDRESS, Address) + p_net_addr_oid->AddressLength) )\r
+       {\r
+\r
+               if( p_net_addr_oid->AddressType != NDIS_PROTOCOL_ID_TCP_IP )\r
+               {\r
+                       IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_OID,\r
+                               ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - Address %d is wrong type of 0x%.4X, "\r
+                                       "should be 0x%.4X\n", port_num, i, p_net_addr_oid->AddressType,\r
+                                       NDIS_PROTOCOL_ID_TCP_IP));\r
+                       continue;\r
+               }\r
+\r
+               if( p_net_addr_oid->AddressLength != NETWORK_ADDRESS_LENGTH_IP)\r
+               {\r
+                       IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_OID,\r
+                               ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - Address %d is wrong size of %d, "\r
+                                       "should be %d\n", port_num, i, p_net_addr_oid->AddressLength,\r
+                                       NETWORK_ADDRESS_LENGTH_IP));\r
+                       continue;\r
+               }\r
+\r
+               p_ip_addr = (PNETWORK_ADDRESS_IP)p_net_addr_oid->Address;\r
+\r
+               /* Size the vector as needed. */\r
+               if( cl_vector_get_size( &p_adapter->ip_vector ) <= idx )\r
+                       cl_vector_set_size( &p_adapter->ip_vector, idx + 1 );\r
+\r
+               p_addr_item = (net_address_item_t *) cl_vector_get_ptr( &p_adapter->ip_vector, idx );\r
+               if( !cl_memcmp( &p_ip_addr->in_addr, &p_addr_item->address.as_ulong,\r
+                       sizeof(ULONG) ) )\r
+               {\r
+                       idx++;\r
+                       /* Already have this address - no change needed */\r
+                       continue;\r
+               }\r
+\r
+               /*\r
+                * Copy the address information, but don't register yet - the port\r
+                * could be down.\r
+                */\r
+               if( p_addr_item->p_reg )\r
+               {\r
+                       /* If in use by some other address, deregister. */\r
+                       if( p_addr_item->p_reg->h_reg_svc )\r
+                       {\r
+                               p_adapter->p_ifc->dereg_svc(\r
+                                       p_addr_item->p_reg->h_reg_svc, __ipoib_ats_dereg_cb );\r
+                       }\r
+                       else\r
+                       {\r
+                               cl_free( p_addr_item->p_reg );\r
+                       }\r
+                       p_addr_item->p_reg = NULL;\r
+               }\r
+               memcpy ((void *)&p_addr_item->address.as_ulong, (const void *)&p_ip_addr->in_addr, sizeof(ULONG) );\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                       ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - Adding Address %d.%d.%d.%d\n",\r
+                       port_num,\r
+                       p_addr_item->address.as_bytes[0],\r
+                       p_addr_item->address.as_bytes[1],\r
+                       p_addr_item->address.as_bytes[2],\r
+                       p_addr_item->address.as_bytes[3]) );\r
+               idx++;\r
+       }\r
+\r
+       /* Now clear any extra entries that shouldn't be there. */\r
+       while( idx < cl_vector_get_size( &p_adapter->ip_vector ) )\r
+       {\r
+               p_addr_item = (net_address_item_t*)\r
+                       cl_vector_get_ptr( &p_adapter->ip_vector,\r
+                       cl_vector_get_size( &p_adapter->ip_vector ) - 1 );\r
+\r
+               if( p_addr_item->p_reg )\r
+               {\r
+                       if( p_addr_item->p_reg->h_reg_svc )\r
+                       {\r
+                               p_adapter->p_ifc->dereg_svc(\r
+                                       p_addr_item->p_reg->h_reg_svc, __ipoib_ats_dereg_cb );\r
+                       }\r
+                       else\r
+                       {\r
+                               cl_free( p_addr_item->p_reg );\r
+                       }\r
+                       p_addr_item->p_reg = NULL;\r
+                       p_addr_item->address.as_ulong = 0;\r
+               }\r
+\r
+               /* No need to check return value - shrinking always succeeds. */\r
+               cl_vector_set_size( &p_adapter->ip_vector,\r
+                       cl_vector_get_size( &p_adapter->ip_vector ) - 1 );\r
+       }\r
+\r
+       if( p_adapter->state == IB_PNP_PORT_ACTIVE && p_adapter->packet_filter )\r
+               ipoib_reg_addrs( p_adapter );\r
+\r
+       cl_obj_unlock( &p_adapter->obj );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_OID );\r
+       return NDIS_STATUS_SUCCESS;\r
+}\r
+\r
+\r
+/* Object lock is held when this function is called. */\r
+void\r
+ipoib_reg_addrs(\r
+       IN                              ipoib_adapter_t* const          p_adapter )\r
+{\r
+       net_address_item_t              *p_addr_item;\r
+\r
+       size_t                                  idx;\r
+\r
+       uint8_t                                 port_num;\r
+\r
+       ib_api_status_t                 ib_status;\r
+       ib_reg_svc_req_t                ib_service;\r
+       ib_gid_t                                port_gid;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_OID );\r
+\r
+       if(p_adapter->guids.port_guid.pkey != IB_DEFAULT_PKEY)\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR,IPOIB_DBG_ERROR,\r
+               ("ATS Service available for default pkey only\n"));      \r
+               return;\r
+       }\r
+       port_num = p_adapter->guids.port_num;\r
+\r
+       /* Setup our service call with things common to all calls */\r
+       cl_memset( &ib_service, 0, sizeof(ib_service) );\r
+\r
+       /* BUGBUG Only register local subnet GID prefix for now */\r
+       ib_gid_set_default( &port_gid, p_adapter->guids.port_guid.guid );\r
+       ib_service.svc_rec.service_gid          = port_gid;\r
+\r
+       ib_service.svc_rec.service_pkey         = IB_DEFAULT_PKEY;\r
+       ib_service.svc_rec.service_lease        = IB_INFINITE_SERVICE_LEASE;\r
+\r
+       /* Must cast here because the service name is an array of unsigned chars but\r
+        * strcpy want a pointer to a signed char */\r
+       if ( StringCchCopy( (char *)ib_service.svc_rec.service_name, \r
+               sizeof(ib_service.svc_rec.service_name) / sizeof(char), ATS_NAME ) != S_OK) {\r
+               ASSERT(FALSE);\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR,IPOIB_DBG_ERROR,\r
+               ("Problem copying ATS name: exiting\n"));\r
+               return;\r
+       }\r
+    \r
+       /* IP Address in question will be put in below */\r
+       ib_service.port_guid            = p_adapter->guids.port_guid.guid;\r
+       ib_service.timeout_ms           = p_adapter->params.sa_timeout;\r
+       ib_service.retry_cnt            = p_adapter->params.sa_retry_cnt;\r
+\r
+       /* Can't set IB_FLAGS_SYNC here because I can't wait at dispatch */\r
+       ib_service.flags                        = 0;\r
+\r
+       /* Service context will be put in below */\r
+\r
+       ib_service.svc_data_mask        = IB_SR_COMPMASK_SID            |\r
+                                                                 IB_SR_COMPMASK_SGID           |\r
+                                                                 IB_SR_COMPMASK_SPKEY          |\r
+                                                                 IB_SR_COMPMASK_SLEASE         |\r
+                                                                 IB_SR_COMPMASK_SNAME          |\r
+                                                                 IB_SR_COMPMASK_SDATA8_12      |\r
+                                                                 IB_SR_COMPMASK_SDATA8_13      |\r
+                                                                 IB_SR_COMPMASK_SDATA8_14      |\r
+                                                                 IB_SR_COMPMASK_SDATA8_15;\r
+       ib_service.pfn_reg_svc_cb = __ipoib_ats_reg_cb;\r
+\r
+       for( idx = 0; idx < cl_vector_get_size( &p_adapter->ip_vector); idx++ )\r
+       {\r
+               p_addr_item = (net_address_item_t*)\r
+                       cl_vector_get_ptr(  &p_adapter->ip_vector, idx );\r
+\r
+               if( p_addr_item->p_reg )\r
+                       continue;\r
+\r
+               p_addr_item->p_reg = (ats_reg_t *) cl_zalloc( sizeof(ats_reg_t) );\r
+               if( !p_addr_item->p_reg )\r
+                       break;\r
+\r
+               p_addr_item->p_reg->p_adapter = p_adapter;\r
+\r
+               ib_service.svc_context          = p_addr_item->p_reg;\r
+\r
+               ib_service.svc_rec.service_id =\r
+                       ATS_SERVICE_ID & CL_HTON64(0xFFFFFFFFFFFFFF00);\r
+               /* ATS service IDs start at 0x10000CE100415453 */\r
+               ib_service.svc_rec.service_id |= ((uint64_t)(idx + 0x53)) << 56;\r
+\r
+               cl_memcpy( &ib_service.svc_rec.service_data8[ATS_IPV4_OFFSET],\r
+                       p_addr_item->address.as_bytes, IPV4_ADDR_SIZE );\r
+\r
+               /* Take a reference for each service request. */\r
+               cl_obj_ref(&p_adapter->obj);\r
+               ib_status = p_adapter->p_ifc->reg_svc(\r
+                       p_adapter->h_al, &ib_service, &p_addr_item->p_reg->h_reg_svc );\r
+               if( ib_status != IB_SUCCESS )\r
+               {\r
+                       if( ib_status == IB_INVALID_GUID )\r
+                       {\r
+                               /* If this occurs, we log the error but do not fail the OID yet */\r
+                               IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_OID,\r
+                                       ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - "\r
+                                       "Failed to register IP Address "\r
+                                       "of %d.%d.%d.%d with error IB_INVALID_GUID\n",\r
+                                       port_num,\r
+                                       p_addr_item->address.as_bytes[0],\r
+                                       p_addr_item->address.as_bytes[1],\r
+                                       p_addr_item->address.as_bytes[2],\r
+                                       p_addr_item->address.as_bytes[3]) );\r
+                       }\r
+                       else\r
+                       {\r
+                               /* Fatal error. */\r
+                               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                       ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - Failed to register IP Address "\r
+                                       "of %d.%d.%d.%d with error %s\n",\r
+                                       port_num,\r
+                                       p_addr_item->address.as_bytes[0],\r
+                                       p_addr_item->address.as_bytes[1],\r
+                                       p_addr_item->address.as_bytes[2],\r
+                                       p_addr_item->address.as_bytes[3],\r
+                                       p_adapter->p_ifc->get_err_str( ib_status )) );\r
+                               p_adapter->hung = TRUE;\r
+                       }\r
+                       cl_obj_deref(&p_adapter->obj);\r
+                       cl_free( p_addr_item->p_reg );\r
+                       p_addr_item->p_reg = NULL;\r
+               }\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_OID );\r
+}\r
+\r
+\r
+/* Object lock is held when this function is called. */\r
+void\r
+ipoib_dereg_addrs(\r
+       IN                              ipoib_adapter_t* const          p_adapter )\r
+{\r
+       net_address_item_t              *p_addr_item;\r
+\r
+       size_t                                  idx;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_OID );\r
+\r
+       for( idx = 0; idx < cl_vector_get_size( &p_adapter->ip_vector); idx++ )\r
+       {\r
+               p_addr_item = (net_address_item_t*)\r
+                       cl_vector_get_ptr( &p_adapter->ip_vector, idx );\r
+\r
+               if( !p_addr_item->p_reg )\r
+                       continue;\r
+\r
+               if( p_addr_item->p_reg->h_reg_svc )\r
+               {\r
+                       p_adapter->p_ifc->dereg_svc(\r
+                               p_addr_item->p_reg->h_reg_svc, __ipoib_ats_dereg_cb );\r
+               }\r
+               else\r
+               {\r
+                       cl_free( p_addr_item->p_reg );\r
+               }\r
+               p_addr_item->p_reg = NULL;\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_OID );\r
+}\r
+\r
+\r
+void\r
+ipoib_cancel_xmit(\r
+       IN                              NDIS_HANDLE             adapter_context,\r
+       IN                              PVOID                   cancel_id )\r
+{\r
+/*     ipoib_adapter_t* const p_adapter =\r
+               (ipoib_adapter_t* const )adapter_context;\r
+       \r
+\r
+if 0\r
+       if( p_adapter && p_adapter->p_port )\r
+       {\r
+               ipoib_port_cancel_xmit( p_adapter->p_port, cancel_id );\r
+       }\r
+endif\r
+*/\r
+\r
+       UNUSED_PARAM(adapter_context);\r
+       UNUSED_PARAM(cancel_id);\r
+\r
+       return; //TODO return this functionality\r
+\r
+}\r
+\r
+\r
+static void\r
+__ipoib_ats_reg_cb(\r
+       IN                              ib_reg_svc_rec_t                        *p_reg_svc_rec )\r
+{\r
+       ats_reg_t                               *p_reg;\r
+       uint8_t                                 port_num;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_OID );\r
+\r
+       CL_ASSERT( p_reg_svc_rec );\r
+       CL_ASSERT( p_reg_svc_rec->svc_context );\r
+\r
+       p_reg = (ats_reg_t*)p_reg_svc_rec->svc_context;\r
+       port_num = p_reg->p_adapter->guids.port_num;\r
+\r
+       cl_obj_lock( &p_reg->p_adapter->obj );\r
+\r
+       if( p_reg_svc_rec->req_status == IB_SUCCESS &&\r
+               !p_reg_svc_rec->resp_status )\r
+       {\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION,IPOIB_DBG_OID,\r
+                                        ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - Registered IP Address "\r
+                                         "of %d.%d.%d.%d\n",\r
+                                         port_num,\r
+                                         p_reg_svc_rec->svc_rec.service_data8[ATS_IPV4_OFFSET],\r
+                                         p_reg_svc_rec->svc_rec.service_data8[ATS_IPV4_OFFSET+1],\r
+                                         p_reg_svc_rec->svc_rec.service_data8[ATS_IPV4_OFFSET+2],\r
+                                         p_reg_svc_rec->svc_rec.service_data8[ATS_IPV4_OFFSET+3]) );\r
+       }\r
+       else if( p_reg_svc_rec->req_status != IB_CANCELED )\r
+       {\r
+               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_OID,\r
+                                        ("Port %d OID_GEN_NETWORK_LAYER_ADDRESSES - Failed to register IP Address "\r
+                                         "of %d.%d.%d.%d with error %s\n",\r
+                                         port_num,\r
+                                         p_reg_svc_rec->svc_rec.service_data8[ATS_IPV4_OFFSET],\r
+                                         p_reg_svc_rec->svc_rec.service_data8[ATS_IPV4_OFFSET+1],\r
+                                         p_reg_svc_rec->svc_rec.service_data8[ATS_IPV4_OFFSET+2],\r
+                                         p_reg_svc_rec->svc_rec.service_data8[ATS_IPV4_OFFSET+3],\r
+                                         p_reg->p_adapter->p_ifc->get_err_str((ib_api_status_t) p_reg_svc_rec->resp_status )) );\r
+               p_reg->p_adapter->hung = TRUE;\r
+               p_reg->h_reg_svc = NULL;\r
+       }\r
+\r
+       cl_obj_unlock( &p_reg->p_adapter->obj );\r
+       cl_obj_deref(&p_reg->p_adapter->obj);\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_OID );\r
+}\r
+\r
+\r
+static void\r
+__ipoib_ats_dereg_cb(\r
+       IN                              void                                            *context )\r
+{\r
+       cl_free( context );\r
+}\r
+\r
+static NDIS_STATUS \r
+ipoib_pause(\r
+    IN  NDIS_HANDLE                         adapter_context,    \r
+    IN  PNDIS_MINIPORT_PAUSE_PARAMETERS     pause_parameters)\r
+{\r
+       ipoib_adapter_t         *p_adapter;\r
+       KLOCK_QUEUE_HANDLE      hdl;\r
+\r
+       UNREFERENCED_PARAMETER(pause_parameters);\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+//return NDIS_STATUS_SUCCESS;\r
+       CL_ASSERT(adapter_context);\r
+       p_adapter = (ipoib_adapter_t*)adapter_context;\r
+       CL_ASSERT(p_adapter->ipoib_state == IPOIB_RUNNING);\r
+\r
+       KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
+       p_adapter->ipoib_state = IPOIB_PAUSING;\r
+       KeReleaseInStackQueuedSpinLock( &hdl );\r
+\r
+       //TODO: \r
+       ipoib_port_resume(p_adapter->p_port,FALSE);\r
+//     ASSERT(FALSE);\r
+\r
+       KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
+       p_adapter->ipoib_state = IPOIB_PAUSED;\r
+       KeReleaseInStackQueuedSpinLock( &hdl );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+       return NDIS_STATUS_SUCCESS;\r
+}\r
+\r
+static NDIS_STATUS \r
+ipoib_restart(\r
+    IN  NDIS_HANDLE                         adapter_context,    \r
+    IN  PNDIS_MINIPORT_RESTART_PARAMETERS   restart_parameters)\r
+{\r
+       ipoib_adapter_t         *p_adapter;\r
+       KLOCK_QUEUE_HANDLE      hdl;\r
+    PNDIS_RESTART_ATTRIBUTES     NdisRestartAttributes;\r
+    PNDIS_RESTART_GENERAL_ATTRIBUTES  NdisGeneralAttributes;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+       p_adapter = (ipoib_adapter_t*)adapter_context;\r
+\r
+       NdisRestartAttributes = restart_parameters->RestartAttributes;\r
+\r
+    if (NdisRestartAttributes != NULL)\r
+    {\r
+        CL_ASSERT(NdisRestartAttributes->Oid == OID_GEN_MINIPORT_RESTART_ATTRIBUTES);\r
+        NdisGeneralAttributes = (PNDIS_RESTART_GENERAL_ATTRIBUTES)NdisRestartAttributes->Data;   \r
+        //\r
+        // Check to see if we need to change any attributes\r
+    }\r
+\r
+       KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
+       p_adapter->ipoib_state = IPOIB_RUNNING;\r
+       KeReleaseInStackQueuedSpinLock( &hdl );\r
+\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+    return NDIS_STATUS_SUCCESS;\r
+}\r
+\r
+/*++\r
+Routine Description:\r
+\r
+    This function aborts the request pending in the miniport.\r
+\r
+Arguments:\r
+\r
+    MiniportAdapterContext  Pointer to the adapter structure\r
+    RequestId               Specify the request to be cancelled.\r
+    \r
+Return Value:\r
+    \r
+--*/\r
+static void\r
+ipoib_cancel_oid_request(\r
+    IN  NDIS_HANDLE            adapter_context,\r
+    IN  PVOID                  requestId\r
+    )\r
+{\r
+    PNDIS_OID_REQUEST    pending_request;\r
+       ipoib_adapter_t          *p_adapter;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_OID );\r
+       p_adapter = (ipoib_adapter_t*)adapter_context;\r
+\r
+    cl_obj_lock( &p_adapter->obj );\r
+    \r
+    if ( p_adapter->query_oid.p_pending_oid &&\r
+               p_adapter->query_oid.p_pending_oid->RequestId == requestId)\r
+       {\r
+               pending_request = p_adapter->query_oid.p_pending_oid;\r
+               p_adapter->query_oid.p_pending_oid = NULL;\r
+               p_adapter->pending_query = FALSE;\r
+       }\r
+       else if(p_adapter->set_oid.p_pending_oid && \r
+                       p_adapter->set_oid.p_pending_oid->RequestId == requestId)\r
+       {\r
+                pending_request = p_adapter->set_oid.p_pending_oid;\r
+                p_adapter->set_oid.p_pending_oid = NULL;\r
+                p_adapter->pending_set = FALSE;\r
+       }\r
+       else\r
+       {\r
+               cl_obj_unlock( &p_adapter->obj );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+               ("No Pending OID found\n") );\r
+               return;\r
+       }\r
+    cl_obj_unlock( &p_adapter->obj );\r
+\r
+    NdisMOidRequestComplete(p_adapter->h_adapter, \r
+                            pending_request, \r
+                            NDIS_STATUS_REQUEST_ABORTED);\r
+\r
+    IPOIB_EXIT( IPOIB_DBG_OID );\r
+}\r
diff --git a/branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_endpoint.c b/branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_endpoint.c
deleted file mode 100644 (file)
index 1e82e5a..0000000
+++ /dev/null
@@ -1,1170 +0,0 @@
-/*\r
- * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
- * Copyright (c) 2006 Mellanox Technologies.  All rights reserved.\r
- * Portions Copyright (c) 2008 Microsoft Corporation.  All rights reserved.\r
- *\r
- * This software is available to you under the OpenIB.org BSD license\r
- * below:\r
- *\r
- *     Redistribution and use in source and binary forms, with or\r
- *     without modification, are permitted provided that the following\r
- *     conditions are met:\r
- *\r
- *      - Redistributions of source code must retain the above\r
- *        copyright notice, this list of conditions and the following\r
- *        disclaimer.\r
- *\r
- *      - Redistributions in binary form must reproduce the above\r
- *        copyright notice, this list of conditions and the following\r
- *        disclaimer in the documentation and/or other materials\r
- *        provided with the distribution.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
- * SOFTWARE.\r
- *\r
- * $Id: ipoib_endpoint.c 4226 2009-04-06 06:01:03Z xalex $\r
- */\r
-\r
-\r
-\r
-#include "ipoib_endpoint.h"\r
-#include "ipoib_port.h"\r
-#include "ipoib_debug.h"\r
-#if defined(EVENT_TRACING)\r
-#ifdef offsetof\r
-#undef offsetof\r
-#endif\r
-#include "ipoib_endpoint.tmh"\r
-#endif\r
-#include <complib/cl_atomic.h>\r
-#include <complib/cl_math.h>\r
-\r
-\r
-static void\r
-__endpt_destroying(\r
-       IN                              cl_obj_t*                                       p_obj );\r
-\r
-static void\r
-__endpt_cleanup(\r
-       IN                              cl_obj_t*                                       p_obj );\r
-\r
-static void\r
-__endpt_free(\r
-       IN                              cl_obj_t*                                       p_obj );\r
-\r
-static ib_api_status_t\r
-__create_mcast_av(\r
-       IN                              ib_pd_handle_t                          h_pd,\r
-       IN                              uint8_t                                         port_num,\r
-       IN                              ib_member_rec_t* const          p_member_rec,\r
-               OUT                     ib_av_handle_t* const           ph_av );\r
-\r
-static inline ipoib_port_t*\r
-__endpt_parent(\r
-       IN                              ipoib_endpt_t* const            p_endpt );\r
-\r
-static void\r
-__path_query_cb(\r
-       IN                              ib_query_rec_t                          *p_query_rec );\r
-\r
-static void\r
-__endpt_resolve(\r
-       IN                              ipoib_endpt_t* const            p_endpt );\r
-\r
-static void\r
-__endpt_cm_send_cb(\r
-       IN              const   ib_cq_handle_t                  h_cq,\r
-       IN                              void                                    *cq_context );\r
-static void\r
-__endpt_cm_recv_cb(\r
-       IN              const   ib_cq_handle_t                  h_cq,\r
-       IN                              void                                    *cq_context );\r
-\r
-static void\r
-__endpt_cm_buf_mgr_construct(\r
-       IN              endpt_buf_mgr_t * const         p_buf_mgr );\r
-static void\r
-__conn_reply_cb(\r
-       IN              ib_cm_rep_rec_t                 *p_cm_rep );\r
-\r
-static void\r
-__conn_mra_cb(\r
-       IN              ib_cm_mra_rec_t                 *p_mra_rec );\r
-\r
-static void\r
-__conn_rej_cb(\r
-       IN              ib_cm_rej_rec_t                 *p_rej_rec );\r
-\r
-static void\r
-__conn_dreq_cb(\r
-        IN     ib_cm_dreq_rec_t                        *p_dreq_rec );\r
-\r
-#if 0 //CM\r
-static cl_status_t\r
-__cm_recv_desc_ctor(\r
-       IN              void* const                                     p_object,\r
-       IN              void*                                           context,\r
-       OUT             cl_pool_item_t** const          pp_pool_item );\r
-\r
-static void\r
-__cm_recv_desc_dtor(\r
-       IN              const   cl_pool_item_t* const           p_pool_item,\r
-       IN                              void                                            *context );\r
-\r
-static NDIS_PACKET*\r
-__endpt_cm_get_ndis_pkt(\r
-       IN              ipoib_port_t* const                     p_port,\r
-       IN              ipoib_cm_desc_t* const          p_desc );\r
-\r
-static inline ipoib_cm_desc_t*\r
-__endpt_cm_buf_mgr_get_recv(\r
-       IN              endpt_buf_mgr_t * const         p_buf_mgr );\r
-\r
-static boolean_t\r
-__cm_recv_is_dhcp(\r
-       IN              const ipoib_pkt_t* const        p_ipoib );\r
-\r
-static ib_api_status_t\r
-__endpt_cm_recv_arp(\r
-       IN              ipoib_port_t* const                     p_port,\r
-       IN              const   ipoib_pkt_t* const      p_ipoib,\r
-       OUT             eth_pkt_t* const                        p_eth,\r
-       IN              ipoib_endpt_t* const            p_src_endpt );\r
-\r
-static ib_api_status_t\r
-__endpt_cm_recv_udp(\r
-       IN              ipoib_port_t* const                     p_port,\r
-       IN              ib_wc_t* const                          p_wc,\r
-       IN              const   ipoib_pkt_t* const      p_ipoib,\r
-       OUT             eth_pkt_t* const                        p_eth,\r
-       IN              ipoib_endpt_t* const            p_src_endpt );\r
-#endif\r
-\r
-ipoib_endpt_t*\r
-ipoib_endpt_create(\r
-       IN              const   ib_gid_t* const                         p_dgid,\r
-       IN              const   net16_t                                         dlid,\r
-       IN              const   net32_t                                         qpn )\r
-{\r
-       ipoib_endpt_t   *p_endpt;\r
-       cl_status_t             status;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
-\r
-       p_endpt = cl_zalloc( sizeof(ipoib_endpt_t) );\r
-       if( !p_endpt )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Failed to allocate endpoint (%d bytes)\n",\r
-                       sizeof(ipoib_endpt_t)) );\r
-               return NULL;\r
-       }\r
-\r
-       cl_obj_construct( &p_endpt->obj, IPOIB_OBJ_ENDPOINT );\r
-\r
-       status = cl_obj_init( &p_endpt->obj, CL_DESTROY_ASYNC,\r
-               __endpt_destroying, __endpt_cleanup, __endpt_free );\r
-\r
-       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,\r
-               ("Created endpoint: [ %p ] DLID: %#x QPN: %#x \n", \r
-               p_endpt, cl_ntoh16(dlid), cl_ntoh32(qpn) ) );\r
-\r
-       p_endpt->dgid = *p_dgid;\r
-       p_endpt->dlid = dlid;\r
-       p_endpt->qpn = qpn;\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
-       return p_endpt;\r
-}\r
-\r
-\r
-static ib_api_status_t\r
-__create_mcast_av(\r
-       IN                              ib_pd_handle_t                          h_pd,\r
-       IN                              uint8_t                                         port_num,\r
-       IN                              ib_member_rec_t* const          p_member_rec,\r
-               OUT                     ib_av_handle_t* const           ph_av )\r
-{\r
-       ib_av_attr_t    av_attr;\r
-       uint32_t                flow_lbl;\r
-       uint8_t                 hop_lmt;\r
-       ib_api_status_t status;\r
-       ipoib_endpt_t   *p_endpt;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_MCAST );\r
-\r
-       p_endpt = PARENT_STRUCT(ph_av, ipoib_endpt_t, h_av );\r
-\r
-       cl_memclr( &av_attr, sizeof(ib_av_attr_t) );\r
-       av_attr.port_num = port_num;\r
-       ib_member_get_sl_flow_hop( p_member_rec->sl_flow_hop,\r
-               &av_attr.sl, &flow_lbl, &hop_lmt );\r
-       av_attr.dlid = p_member_rec->mlid;\r
-       av_attr.grh_valid = TRUE;\r
-       av_attr.grh.hop_limit = hop_lmt;\r
-       av_attr.grh.dest_gid = p_member_rec->mgid;\r
-       av_attr.grh.src_gid = p_member_rec->port_gid;\r
-       av_attr.grh.ver_class_flow =\r
-               ib_grh_set_ver_class_flow( 6, p_member_rec->tclass, flow_lbl );\r
-       av_attr.static_rate = p_member_rec->rate & IB_PATH_REC_BASE_MASK;\r
-       av_attr.path_bits = 0;\r
-       /* port is not attached to endpoint at this point, so use endpt ifc reference */\r
-       status = p_endpt->p_ifc->create_av( h_pd, &av_attr, ph_av );\r
-\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ib_create_av returned %s\n",\r
-                       p_endpt->p_ifc->get_err_str( status )) );\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_MCAST );\r
-       return status;\r
-}\r
-\r
-\r
-ib_api_status_t\r
-ipoib_endpt_set_mcast(\r
-       IN                              ipoib_endpt_t* const            p_endpt,\r
-       IN                              ib_pd_handle_t                          h_pd,\r
-       IN                              uint8_t                                         port_num,\r
-       IN                              ib_mcast_rec_t* const           p_mcast_rec )\r
-{\r
-       ib_api_status_t status;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
-\r
-       IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,\r
-               ("Create av for MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",\r
-               p_endpt->mac.addr[0], p_endpt->mac.addr[1],\r
-               p_endpt->mac.addr[2], p_endpt->mac.addr[3],\r
-               p_endpt->mac.addr[4], p_endpt->mac.addr[5]) );\r
-               \r
-       status = __create_mcast_av( h_pd, port_num, p_mcast_rec->p_member_rec,\r
-               &p_endpt->h_av );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("__create_mcast_av returned %s\n", \r
-                       p_endpt->p_ifc->get_err_str( status )) );\r
-               return status;\r
-       }\r
-       p_endpt->h_mcast = p_mcast_rec->h_mcast;\r
-       CL_ASSERT(p_endpt->dlid == 0);\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
-       return IB_SUCCESS;\r
-}\r
-\r
-\r
-static void\r
-__endpt_destroying(\r
-       IN                              cl_obj_t*                                       p_obj )\r
-{\r
-       ipoib_endpt_t   *p_endpt;\r
-       ipoib_port_t    *p_port;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
-\r
-       p_endpt = PARENT_STRUCT( p_obj, ipoib_endpt_t, obj );\r
-       p_port = __endpt_parent( p_endpt );\r
-\r
-       cl_obj_lock( p_obj );\r
-       if( p_endpt->h_query )\r
-       {\r
-               p_port->p_adapter->p_ifc->cancel_query(\r
-                       p_port->p_adapter->h_al, p_endpt->h_query );\r
-               p_endpt->h_query = NULL;\r
-       }\r
-\r
-       /* Leave the multicast group if it exists. */\r
-       if( p_endpt->h_mcast )\r
-       {\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,\r
-                       ("Leaving MCast group\n") );\r
-               ipoib_port_ref(p_port, ref_leave_mcast);\r
-               p_port->p_adapter->p_ifc->leave_mcast( p_endpt->h_mcast, ipoib_leave_mcast_cb );\r
-       }\r
-#if 0\r
-       else if( p_port->p_adapter->params.cm_enabled )\r
-       {\r
-               p_endpt->cm_flag = 0;\r
-               CL_ASSERT( endpt_cm_get_state( p_endpt ) == IPOIB_CM_DISCONNECTED );\r
-       }\r
-#endif\r
-\r
-       cl_obj_unlock( p_obj );\r
-       \r
-       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
-}\r
-\r
-\r
-static void\r
-__endpt_cleanup(\r
-       IN                              cl_obj_t*                                       p_obj )\r
-{\r
-       ipoib_endpt_t   *p_endpt;\r
-       ipoib_port_t    *p_port;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
-\r
-       p_endpt = PARENT_STRUCT( p_obj, ipoib_endpt_t, obj );\r
-       p_port = __endpt_parent( p_endpt );\r
-\r
-       /* Destroy the AV if it exists. */\r
-       if( p_endpt->h_av )\r
-               p_port->p_adapter->p_ifc->destroy_av( p_endpt->h_av );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
-}\r
-\r
-\r
-static void\r
-__endpt_free(\r
-       IN                              cl_obj_t*                                       p_obj )\r
-{\r
-       ipoib_endpt_t   *p_endpt;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
-\r
-       p_endpt = PARENT_STRUCT( p_obj, ipoib_endpt_t, obj );\r
-\r
-       cl_obj_deinit( p_obj );\r
-       cl_free( p_endpt );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
-}\r
-\r
-\r
-static inline ipoib_port_t*\r
-__endpt_parent(\r
-       IN                              ipoib_endpt_t* const            p_endpt )\r
-{\r
-       return PARENT_STRUCT( p_endpt->rel.p_parent_obj, ipoib_port_t, obj );\r
-}\r
-\r
-ipoib_port_t*\r
-ipoib_endpt_parent(\r
-       IN                              ipoib_endpt_t* const            p_endpt )\r
-{\r
-       return __endpt_parent( p_endpt );\r
-}\r
-\r
-/*\r
- * This function is called with the port object's send lock held and\r
- * a reference held on the endpoint.  If we fail, we release the reference.\r
- */\r
-NDIS_STATUS\r
-ipoib_endpt_queue(\r
-       IN                              ipoib_endpt_t* const            p_endpt )\r
-{\r
-       ib_api_status_t status;\r
-       ipoib_port_t    *p_port;\r
-       ib_av_attr_t    av_attr;\r
-       net32_t                 flow_lbl;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
-\r
-       if( p_endpt->h_av )\r
-       {\r
-               IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
-               return NDIS_STATUS_SUCCESS;\r
-       }\r
-\r
-       if( p_endpt->qpn == CL_HTON32(0x00FFFFFF) )\r
-       {\r
-               /*\r
-                * Handle a race between the mcast callback and a receive/send.  The QP\r
-                * is joined to the MC group before the MC callback is received, so it\r
-                * can receive packets, and NDIS can try to respond.  We need to delay\r
-                * a response until the MC callback runs and sets the AV.\r
-                */\r
-               ipoib_endpt_deref( p_endpt );\r
-               IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
-               return NDIS_STATUS_PENDING;\r
-       }\r
-\r
-       /* This is the first packet for this endpoint.  Create the AV. */\r
-       p_port = __endpt_parent( p_endpt );\r
-\r
-       cl_memclr( &av_attr, sizeof(ib_av_attr_t) );\r
-\r
-       av_attr.port_num = p_port->port_num;\r
-\r
-       ib_member_get_sl_flow_hop(\r
-               p_port->ib_mgr.bcast_rec.sl_flow_hop,\r
-               &av_attr.sl,\r
-               &flow_lbl,\r
-               &av_attr.grh.hop_limit\r
-               );\r
-\r
-       av_attr.dlid = p_endpt->dlid;\r
-\r
-       /*\r
-        * We always send the GRH so that we preferably lookup endpoints\r
-        * by GID rather than by LID.  This allows certain WHQL tests\r
-        * such as the 2c_MediaCheck test to succeed since they don't use\r
-        * IP.  This allows endpoints to be created on the fly for requests\r
-        * for which there is no match, something that doesn't work when\r
-        * using LIDs only.\r
-        */\r
-       av_attr.grh_valid = TRUE;\r
-       av_attr.grh.ver_class_flow = ib_grh_set_ver_class_flow(\r
-               6, p_port->ib_mgr.bcast_rec.tclass, flow_lbl );\r
-       av_attr.grh.resv1 = 0;\r
-       av_attr.grh.resv2 = 0;\r
-       ib_gid_set_default( &av_attr.grh.src_gid, p_port->p_adapter->guids.port_guid.guid );\r
-       av_attr.grh.dest_gid = p_endpt->dgid;\r
-\r
-       av_attr.static_rate = p_port->ib_mgr.bcast_rec.rate;\r
-       av_attr.path_bits = 0;\r
-\r
-       /* Create the AV. */\r
-       status = p_port->p_adapter->p_ifc->create_av(\r
-               p_port->ib_mgr.h_pd, &av_attr, &p_endpt->h_av );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               p_port->p_adapter->hung = TRUE;\r
-               ipoib_endpt_deref( p_endpt );\r
-               cl_obj_unlock( &p_endpt->obj );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ib_create_av failed with %s\n", \r
-                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-               return NDIS_STATUS_FAILURE;\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
-       return NDIS_STATUS_SUCCESS;\r
-}\r
-\r
-#if 0\r
-\r
-static void\r
-__endpt_cm_buf_mgr_construct(\r
-       IN              endpt_buf_mgr_t * const         p_buf_mgr )\r
-{\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       cl_qpool_construct( &p_buf_mgr->recv_pool );\r
-\r
-       p_buf_mgr->h_packet_pool = NULL;\r
-       p_buf_mgr->h_buffer_pool = NULL;\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-}\r
-\r
-ib_api_status_t\r
-endpt_cm_buf_mgr_init(\r
-       IN                              ipoib_port_t* const                             p_port )\r
-{\r
-       cl_status_t             cl_status;\r
-       NDIS_STATUS             ndis_status;\r
-       ib_api_status_t ib_status = IB_SUCCESS;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       if( p_port->cm_buf_mgr.pool_init )\r
-               return ib_status;\r
-\r
-       cl_qlist_init( &p_port->cm_buf_mgr.posted_list );\r
-\r
-       __endpt_cm_buf_mgr_construct( &p_port->cm_buf_mgr );\r
-       p_port->cm_recv_mgr.rq_depth = \r
-               min( (uint32_t)p_port->p_adapter->params.rq_depth * 8,\r
-                               p_port->p_ca_attrs->max_srq_wrs/2 );\r
-       p_port->cm_recv_mgr.depth = 0;\r
-       /* Allocate the receive descriptors pool */\r
-       cl_status = cl_qpool_init( &p_port->cm_buf_mgr.recv_pool,\r
-               p_port->cm_recv_mgr.rq_depth ,\r
-               0,\r
-               0,\r
-               sizeof( ipoib_cm_desc_t ),\r
-               __cm_recv_desc_ctor,\r
-               __cm_recv_desc_dtor,\r
-               p_port );\r
-\r
-       if( cl_status != CL_SUCCESS )\r
-       {\r
-               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
-                       EVENT_IPOIB_RECV_POOL, 1, cl_status );\r
-               \r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("cl_qpool_init for cm recvs returned %#x\n", cl_status) );\r
-               \r
-               return IB_INSUFFICIENT_MEMORY;\r
-       }\r
-\r
-       /* Allocate the NDIS buffer and packet pools for receive indication. */\r
-       NdisAllocatePacketPool( &ndis_status, \r
-                                                       &p_port->cm_buf_mgr.h_packet_pool,\r
-                                                       p_port->cm_recv_mgr.rq_depth, \r
-                                                       PROTOCOL_RESERVED_SIZE_IN_PACKET );\r
-       if( ndis_status != NDIS_STATUS_SUCCESS )\r
-       {\r
-               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
-                       EVENT_IPOIB_RECV_PKT_POOL, 1, ndis_status );\r
-\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("NdisAllocatePacketPool returned %08X\n", ndis_status) );\r
-               \r
-               ib_status = IB_INSUFFICIENT_RESOURCES;\r
-               goto pkt_pool_failed;\r
-       }\r
-\r
-       NdisAllocateBufferPool( &ndis_status, \r
-                                                       &p_port->cm_buf_mgr.h_buffer_pool,\r
-                                                       p_port->cm_recv_mgr.rq_depth );\r
-       if( ndis_status != NDIS_STATUS_SUCCESS )\r
-       {\r
-               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
-                       EVENT_IPOIB_RECV_BUF_POOL, 1, ndis_status );\r
-               \r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("NdisAllocateBufferPool returned %08X\n", ndis_status) );\r
-               \r
-               ib_status = IB_INSUFFICIENT_RESOURCES;\r
-               goto buf_pool_failed;\r
-       }\r
-       //NDIS60\r
-       //p_port->cm_recv_mgr.recv_pkt_array = \r
-               //cl_zalloc( sizeof(NDIS_PACKET*) * p_port->cm_recv_mgr.rq_depth );\r
-       p_port->cm_recv_mgr.recv_lst_array = \r
-               cl_zalloc( sizeof(NET_BUFFER_LIST*) * p_port->cm_recv_mgr.rq_depth );\r
-       \r
-               \r
-\r
-       if( !p_port->cm_recv_mgr.recv_pkt_array )\r
-       {\r
-               //NDIS60\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("cl_zalloc for NET_BUFFER_LIST array failed.\n") );\r
-               \r
-               ib_status = IB_INSUFFICIENT_MEMORY;\r
-               goto pkt_array_failed;\r
-       }\r
-\r
-       p_port->cm_buf_mgr.pool_init = TRUE;\r
-       return IB_SUCCESS;\r
-\r
-pkt_array_failed:\r
-       if( p_port->cm_buf_mgr.h_buffer_pool )\r
-               NdisFreeBufferPool( p_port->cm_buf_mgr.h_buffer_pool );\r
-buf_pool_failed:\r
-       if( p_port->cm_buf_mgr.h_packet_pool )\r
-               NdisFreePacketPool( p_port->cm_buf_mgr.h_packet_pool );\r
-pkt_pool_failed:\r
-               cl_qpool_destroy( &p_port->cm_buf_mgr.recv_pool );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-       return ib_status;\r
-}\r
-\r
-void\r
-endpt_cm_buf_mgr_reset(\r
-       IN              ipoib_port_t* const             p_port )\r
-{\r
-       cl_list_item_t          *p_item;\r
-\r
-       if( !p_port->cm_buf_mgr.pool_init )\r
-               return;\r
-\r
-       if( cl_qlist_count( &p_port->cm_buf_mgr.posted_list ) )\r
-       {\r
-               for( p_item = cl_qlist_remove_head( &p_port->cm_buf_mgr.posted_list );\r
-                       p_item != cl_qlist_end( &p_port->cm_buf_mgr.posted_list );\r
-                       p_item =  cl_qlist_remove_head( &p_port->cm_buf_mgr.posted_list ) )\r
-               {\r
-                       cl_qpool_put( &p_port->cm_buf_mgr.recv_pool, \r
-                               &( PARENT_STRUCT( p_item, ipoib_cm_desc_t, list_item ))->item );\r
-               }\r
-       }\r
-}\r
-\r
-void\r
-endpt_cm_buf_mgr_destroy(\r
-       IN              ipoib_port_t* const             p_port )\r
-{\r
-\r
-       IPOIB_ENTER(IPOIB_DBG_INIT );\r
-\r
-       CL_ASSERT( p_port );\r
-       \r
-       /* Free the receive descriptors. */\r
-       if( !p_port->cm_buf_mgr.pool_init )\r
-               return;\r
-\r
-       endpt_cm_buf_mgr_reset( p_port );\r
-\r
-       p_port->cm_buf_mgr.pool_init = FALSE;\r
-       \r
-       if( p_port->cm_recv_mgr.recv_pkt_array )\r
-       {\r
-               cl_free( p_port->cm_recv_mgr.recv_pkt_array );\r
-       }\r
-\r
-       /* Destroy the receive packet and buffer pools. */\r
-       if( p_port->cm_buf_mgr.h_buffer_pool )\r
-               NdisFreeBufferPool( p_port->cm_buf_mgr.h_buffer_pool );\r
-       if( p_port->cm_buf_mgr.h_packet_pool )\r
-               NdisFreePacketPool( p_port->cm_buf_mgr.h_packet_pool );\r
-\r
-       cl_qpool_destroy( &p_port->cm_buf_mgr.recv_pool );\r
-       \r
-       IPOIB_EXIT(  IPOIB_DBG_INIT );\r
-}\r
-\r
-static cl_status_t\r
-__cm_recv_desc_ctor(\r
-       IN                              void* const                                     p_object,\r
-       IN                              void*                                           context,\r
-               OUT                     cl_pool_item_t** const          pp_pool_item )\r
-{\r
-       ipoib_cm_desc_t*        p_desc;\r
-       ipoib_port_t*           p_port;\r
-       ib_mr_create_t          create_mr;\r
-       net32_t                         rkey;\r
-\r
-       CL_ASSERT( p_object );\r
-       CL_ASSERT( context );\r
-\r
-       p_desc = (ipoib_cm_desc_t*)p_object;\r
-       p_port = (ipoib_port_t*)context;\r
-\r
-#define BUF_ALIGN              (16)\r
-\r
-       p_desc->alloc_buf_size = \r
-               ROUNDUP( p_port->p_adapter->params.cm_xfer_block_size, BUF_ALIGN );\r
-       \r
-       p_desc->p_alloc_buf = (uint8_t *)ExAllocatePoolWithTag( \r
-               NonPagedPool, p_desc->alloc_buf_size, 'DOMC' );\r
-\r
-       if( p_desc->p_alloc_buf == NULL )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Failed to allocate receive buffer size %d bytes.\n", p_desc->alloc_buf_size ) );\r
-               return CL_INSUFFICIENT_MEMORY;\r
-       }\r
-\r
-       create_mr.vaddr  = p_desc->p_alloc_buf;\r
-       create_mr.length  = p_desc->alloc_buf_size;\r
-       create_mr.access_ctrl = IB_AC_LOCAL_WRITE;\r
-\r
-       \r
-       if( p_port->p_adapter->p_ifc->reg_mem( \r
-                                                       p_port->ib_mgr.h_pd,\r
-                                                       &create_mr,\r
-                                                       &p_desc->lkey,\r
-                                                       &rkey,\r
-                                                       &p_desc->h_mr ) != IB_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Failed to create Memory Region size %d bytes.\n", p_desc->alloc_buf_size ) );\r
-               goto ctor_failed;\r
-       }\r
-       p_desc->p_buf = p_desc->p_alloc_buf + (BUF_ALIGN - sizeof( ipoib_hdr_t));\r
-       p_desc->buf_size = p_desc->alloc_buf_size - (BUF_ALIGN - sizeof( ipoib_hdr_t));\r
-\r
-       /* Setup the local data segment. */\r
-       p_desc->local_ds[0].vaddr = (uint64_t)(uintn_t)p_desc->p_buf;\r
-       p_desc->local_ds[0].length = p_desc->buf_size;\r
-       p_desc->local_ds[0].lkey = p_desc->lkey;\r
-\r
-       /* Setup the work request. */\r
-       p_desc->wr.wr_id = (uintn_t)p_desc;\r
-       p_desc->wr.ds_array = p_desc->local_ds;\r
-       p_desc->wr.num_ds = 1;\r
-       p_desc->type = PKT_TYPE_CM_UCAST;\r
-       \r
-       *pp_pool_item = &p_desc->item;\r
-       return CL_SUCCESS;\r
-\r
-ctor_failed:\r
-       ExFreePoolWithTag( p_desc->p_alloc_buf, 'DOMC' );\r
-       return CL_INSUFFICIENT_MEMORY;\r
-}\r
-\r
-static void\r
-__cm_recv_desc_dtor(\r
-       IN              const   cl_pool_item_t* const           p_pool_item,\r
-       IN                              void                                            *context )\r
-{\r
-       ipoib_cm_desc_t *p_desc;\r
-       ipoib_port_t*   p_port;\r
-\r
-       if( p_pool_item == NULL || context == NULL )\r
-               return;\r
-\r
-       p_port = (ipoib_port_t*)context;\r
-       p_desc = PARENT_STRUCT( p_pool_item, ipoib_cm_desc_t, item );\r
-\r
-       if( p_desc->h_mr )\r
-               p_port->p_adapter->p_ifc->dereg_mr( p_desc->h_mr );\r
-\r
-       if( p_desc->p_alloc_buf )\r
-               ExFreePoolWithTag( p_desc->p_alloc_buf, 'DOMC' );\r
-}\r
-\r
-\r
-static NDIS_PACKET*\r
-__endpt_cm_get_ndis_pkt(\r
-       IN              ipoib_port_t* const                     p_port,\r
-       IN              ipoib_cm_desc_t* const  p_desc )\r
-{\r
-       NDIS_STATUS                             status;\r
-       NDIS_PACKET                             *p_packet;\r
-       NDIS_BUFFER                             *p_buffer;\r
-       \r
-       IPOIB_ENTER(  IPOIB_DBG_RECV );\r
-\r
-       NdisDprAllocatePacketNonInterlocked( &status, &p_packet,\r
-                       p_port->cm_buf_mgr.h_packet_pool );\r
-       if( status != NDIS_STATUS_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Failed to allocate NDIS_PACKET: %08x\n", status) );\r
-               return NULL;\r
-       }\r
-\r
-       IPOIB_PORT_FROM_PACKET( p_packet ) = p_port;\r
-       IPOIB_RECV_FROM_PACKET( p_packet ) = p_desc;\r
-\r
-       NdisAllocateBuffer( \r
-                       &status, \r
-                       &p_buffer,\r
-                       p_port->cm_buf_mgr.h_buffer_pool, \r
-                       (void *)(p_desc->p_buf - DATA_OFFSET),\r
-                       p_desc->len + DATA_OFFSET );\r
-\r
-       if( status != NDIS_STATUS_SUCCESS )\r
-       {\r
-               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Failed to allocate NDIS_BUFFER: %08x\n", status) );\r
-               NdisDprFreePacketNonInterlocked( p_packet );\r
-               return NULL;\r
-       }\r
-\r
-       NdisChainBufferAtFront( p_packet, p_buffer );\r
-       NDIS_SET_PACKET_HEADER_SIZE( p_packet, sizeof(eth_hdr_t) );\r
-\r
-       IPOIB_EXIT(  IPOIB_DBG_RECV );\r
-       return p_packet;\r
-}\r
-\r
-static inline ipoib_cm_desc_t*\r
-__endpt_cm_buf_mgr_get_recv(\r
-       IN              endpt_buf_mgr_t * const         p_buf_mgr )\r
-{\r
-       ipoib_cm_desc_t *p_desc;\r
-\r
-       p_desc = (ipoib_cm_desc_t*)cl_qpool_get( &p_buf_mgr->recv_pool );\r
-       if( p_desc )\r
-               cl_qlist_insert_tail( &p_buf_mgr->posted_list, &p_desc->list_item );\r
-\r
-       return p_desc;\r
-}\r
-\r
-void\r
-endpt_cm_buf_mgr_put_recv(\r
-       IN              endpt_buf_mgr_t * const         p_buf_mgr,\r
-       IN              ipoib_cm_desc_t* const  p_desc )\r
-{\r
-\r
-       IPOIB_ENTER(IPOIB_DBG_RECV );\r
-\r
-       /* Return the descriptor to it's pool. */\r
-       cl_qlist_remove_item( &p_buf_mgr->posted_list, &p_desc->list_item );\r
-       cl_qpool_put( &p_buf_mgr->recv_pool, &p_desc->item );\r
-\r
-       IPOIB_EXIT(  IPOIB_DBG_RECV );\r
-}\r
-\r
-void\r
-endpt_cm_buf_mgr_put_recv_list(\r
-       IN              endpt_buf_mgr_t * const         p_buf_mgr,\r
-       IN              cl_qlist_t* const                       p_list )\r
-{\r
-       cl_qpool_put_list( &p_buf_mgr->recv_pool, p_list );\r
-}\r
-\r
-uint32_t\r
-endpt_cm_recv_mgr_build_pkt_array(\r
-       IN                      ipoib_port_t* const                     p_port,\r
-       IN                      ipoib_endpt_t* const            p_endpt,\r
-       IN                      cl_qlist_t* const                       p_done_list,\r
-       IN OUT          uint32_t*                                       p_bytes_recv )\r
-{\r
-       cl_list_item_t                  *p_item;\r
-       ipoib_cm_desc_t         *p_desc;\r
-       uint32_t                                i = 0;\r
-       NDIS_PACKET                             *p_packet;\r
-       NDIS_TCP_IP_CHECKSUM_PACKET_INFO        chksum;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_RECV );\r
-       UNUSED_PARAM( p_endpt );\r
-\r
-       p_item = cl_qlist_remove_head( p_done_list );\r
-       \r
-       *p_bytes_recv = 0;\r
-\r
-       for( p_item; p_item != cl_qlist_end( p_done_list );\r
-               p_item = cl_qlist_remove_head( p_done_list ) )\r
-       {\r
-               p_desc = (ipoib_cm_desc_t*)p_item;\r
-\r
-               p_packet = __endpt_cm_get_ndis_pkt( p_port, p_desc );\r
-               if( !p_packet )\r
-               {\r
-                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Failed to get Packet from descriptor\n" ) );\r
-                       endpt_cm_buf_mgr_put_recv( &p_port->cm_buf_mgr, p_desc );\r
-                       p_port->cm_recv_mgr.depth--;\r
-                       continue;\r
-               }\r
-               chksum.Value = 0;\r
-               switch( p_port->p_adapter->params.recv_chksum_offload )\r
-               {\r
-               default:\r
-                       CL_ASSERT( FALSE );\r
-               case CSUM_DISABLED:\r
-               case CSUM_ENABLED:\r
-               NDIS_PER_PACKET_INFO_FROM_PACKET( p_packet, TcpIpChecksumPacketInfo ) =\r
-                               (void*)(uintn_t)chksum.Value;\r
-                       break;\r
-               case CSUM_BYPASS:\r
-                       /* Flag the checksums as having been calculated. */\r
-                       chksum.Receive.NdisPacketTcpChecksumSucceeded = TRUE;\r
-                       chksum.Receive.NdisPacketUdpChecksumSucceeded = TRUE;\r
-                       chksum.Receive.NdisPacketIpChecksumSucceeded = TRUE;\r
-                       NDIS_PER_PACKET_INFO_FROM_PACKET( p_packet, TcpIpChecksumPacketInfo ) =\r
-                               (void*)(uintn_t)chksum.Value;\r
-                       break;\r
-               }\r
-\r
-               NDIS_SET_PACKET_STATUS( p_packet, NDIS_STATUS_SUCCESS );\r
-               p_port->cm_recv_mgr.recv_pkt_array[i] = p_packet;\r
-               i++;            \r
-               *p_bytes_recv += p_desc->len;\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_RECV );\r
-       return i;\r
-}\r
-void\r
-endpt_cm_flush_recv(\r
-       IN                              ipoib_port_t* const             p_port,\r
-       IN                              ipoib_endpt_t* const    p_endpt )\r
-{\r
-       ib_api_status_t         ib_status = IB_SUCCESS;\r
-       ib_qp_mod_t                     mod_attr;\r
-       ib_wc_t                         wc[MAX_RECV_WC];\r
-       ib_wc_t                         *p_free_wc;\r
-       ib_wc_t                         *p_done_wc;\r
-       ib_wc_t                         *p_wc;\r
-       ipoib_cm_desc_t         *p_desc;\r
-       size_t                          i;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_RECV );\r
-\r
-       CL_ASSERT( p_endpt );\r
-\r
-       if( p_endpt->conn.h_recv_qp )\r
-       {\r
-               cl_memclr( &mod_attr, sizeof( mod_attr ) );\r
-               mod_attr.req_state = IB_QPS_ERROR;\r
-               p_port->p_adapter->p_ifc->modify_qp( p_endpt->conn.h_send_qp, &mod_attr );\r
-               p_port->p_adapter->p_ifc->modify_qp( p_endpt->conn.h_recv_qp, &mod_attr );\r
-\r
-               for( i = 0; i < MAX_RECV_WC; i++ )\r
-                       wc[i].p_next = &wc[i + 1];\r
-               wc[MAX_RECV_WC - 1].p_next = NULL;\r
-\r
-               do\r
-               {\r
-                       p_free_wc = wc;\r
-                       ib_status = \r
-                               p_port->p_adapter->p_ifc->poll_cq( p_endpt->conn.h_recv_cq, \r
-                               &p_free_wc, &p_done_wc );\r
-                       if( ib_status != IB_SUCCESS && \r
-                               ib_status != IB_NOT_FOUND )\r
-                       {\r
-                               /* connection CQ failed */\r
-                               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                       ("Poll Recv CQ failed status %#x\n", ib_status ) );\r
-                               break;\r
-                       }\r
-                       cl_spinlock_acquire( &p_port->recv_lock );\r
-                       for( p_wc = p_done_wc; p_wc; p_wc = p_wc->p_next )\r
-                       {\r
-                               p_desc = (ipoib_cm_desc_t *)(uintn_t)p_wc->wr_id;\r
-                               endpt_cm_buf_mgr_put_recv( &p_port->cm_buf_mgr, p_desc );\r
-                               p_port->cm_recv_mgr.depth--;\r
-                       }\r
-                       cl_spinlock_release( &p_port->recv_lock );\r
-               } while( !p_free_wc );\r
-\r
-               ib_status = p_port->p_adapter->p_ifc->destroy_qp( p_endpt->conn.h_recv_qp, NULL );\r
-               if( ib_status != IB_SUCCESS )\r
-               {\r
-                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Destroy Recv QP failed status %#x\n", ib_status ) );\r
-               }\r
-               p_endpt->conn.h_recv_qp = NULL;\r
-       }\r
-\r
-       if( p_endpt->conn.h_send_qp )\r
-       {\r
-               ib_status = p_port->p_adapter->p_ifc->destroy_qp( p_endpt->conn.h_send_qp, NULL );\r
-               if( ib_status != IB_SUCCESS )\r
-               {\r
-                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Destroy Send QP failed status %#x\n", ib_status ) );\r
-               }\r
-               p_endpt->conn.h_send_qp = NULL;\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_RECV );\r
-}\r
-\r
-int32_t\r
-endpt_cm_recv_mgr_filter(\r
-       IN              ipoib_endpt_t* const            p_endpt,\r
-       IN              ib_wc_t* const                          p_done_wc_list,\r
-       OUT             cl_qlist_t* const                       p_done_list,\r
-       OUT             cl_qlist_t* const                       p_bad_list )\r
-{\r
-       ib_api_status_t                 ib_status;\r
-       ipoib_cm_desc_t                 *p_desc;\r
-       ib_wc_t                                 *p_wc;\r
-       ipoib_pkt_t                             *p_ipoib;\r
-       eth_pkt_t                               *p_eth;\r
-       ipoib_port_t*                   p_port;\r
-       int32_t                                 recv_cnt;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_RECV );\r
-\r
-       p_port = ipoib_endpt_parent( p_endpt );\r
-\r
-       for( p_wc = p_done_wc_list, recv_cnt = 0; p_wc; p_wc = p_wc->p_next )\r
-       {\r
-               p_desc = (ipoib_cm_desc_t *)(uintn_t)p_wc->wr_id;\r
-               recv_cnt++;\r
-               if(  p_wc->status != IB_WCS_SUCCESS )\r
-               {\r
-                       if( p_wc->status != IB_WCS_WR_FLUSHED_ERR )\r
-                       {\r
-                               \r
-                               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                       ("Failed completion %s  (vendor specific %#x)\n",\r
-                                       p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status ),\r
-                                       (int)p_wc->vendor_specific) );\r
-                       }\r
-                       else\r
-                       {\r
-                               IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,\r
-                                       ("Flushed completion %s\n",\r
-                                       p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status )) );\r
-                       }\r
-                       \r
-                       ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );\r
-\r
-                       cl_qlist_remove_item( &p_port->cm_buf_mgr.posted_list,&p_desc->list_item );\r
-                       cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );\r
-                       continue;\r
-               }\r
-\r
-               /* Successful completion                \r
-                Setup the ethernet/ip/arp header and queue descriptor for report. */\r
-               ib_status = IB_SUCCESS;\r
-               p_ipoib = (ipoib_pkt_t *)((uint8_t*)p_desc->p_buf );\r
-               p_eth = (eth_pkt_t *)((uint8_t*)p_desc->p_buf - DATA_OFFSET );\r
-               \r
-               switch( p_ipoib->hdr.type )\r
-               {\r
-               case ETH_PROT_TYPE_ARP:\r
-                       if( p_wc->length < (sizeof(ipoib_hdr_t) + sizeof(ipoib_arp_pkt_t)) )\r
-                       {\r
-                               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Received ARP packet too short\n") );\r
-                               ib_status = IB_ERROR;\r
-                               break;\r
-                       }\r
-                       ib_status = \r
-                               __endpt_cm_recv_arp( p_port, p_ipoib, p_eth, p_endpt );\r
-                       break;\r
-               case ETH_PROT_TYPE_IP:\r
-                       if( p_wc->length < (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t)) )\r
-                       {\r
-                               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                       ("Received IP packet too short\n") );\r
-                               ib_status = IB_ERROR;\r
-                               break;\r
-                       }\r
-                       if( p_ipoib->type.ip.hdr.prot == IP_PROT_UDP )\r
-                       {\r
-                               ib_status = \r
-                                       __endpt_cm_recv_udp( p_port, p_wc, p_ipoib, p_eth, p_endpt );\r
-                       }\r
-               \r
-                       break;\r
-               }\r
-\r
-               if( ib_status != IB_SUCCESS )\r
-               {\r
-                       ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );\r
-                       cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );\r
-                       continue;\r
-               }\r
-\r
-               p_eth->hdr.type = p_ipoib->hdr.type;\r
-               p_eth->hdr.src = p_endpt->mac;\r
-               p_eth->hdr.dst = p_port->p_adapter->mac;\r
-\r
-               /* save payload length */\r
-               p_desc->len = p_wc->length;\r
-               \r
-               cl_qlist_insert_tail( p_done_list, &p_desc->item.list_item );\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_RECV );\r
-       return recv_cnt;\r
-}\r
-\r
-ib_api_status_t\r
-endpt_cm_post_recv(\r
-       IN              ipoib_port_t* const                     p_port )\r
-{\r
-       ib_api_status_t         ib_status = IB_SUCCESS;\r
-       ipoib_cm_desc_t         *p_head_desc = NULL;\r
-       ipoib_cm_desc_t         *p_tail_desc = NULL;\r
-       ipoib_cm_desc_t         *p_next_desc;\r
-       ib_recv_wr_t            *p_failed_wc = NULL;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_RECV );\r
-\r
-       while( cl_qpool_count( &p_port->cm_buf_mgr.recv_pool )  > 1  )\r
-       {\r
-                       /* Pull receives out of the pool and chain them up. */\r
-               p_next_desc = __endpt_cm_buf_mgr_get_recv( \r
-                                                                       &p_port->cm_buf_mgr );\r
-               if( !p_next_desc )\r
-               {\r
-                       IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,\r
-                               ("Out of receive descriptors! Endpt recv queue depth 0x%x\n",\r
-                               p_port->cm_recv_mgr.depth ) );\r
-                       break;\r
-               }\r
-\r
-               if( !p_tail_desc )\r
-               {\r
-                       p_tail_desc = p_next_desc;\r
-                       p_next_desc->wr.p_next = NULL;\r
-               }\r
-               else\r
-               {\r
-                       p_next_desc->wr.p_next = &p_head_desc->wr;\r
-               }\r
-\r
-               p_head_desc = p_next_desc;\r
-\r
-               p_port->cm_recv_mgr.depth++;\r
-       }\r
-\r
-       if( p_head_desc )\r
-       {\r
-               ib_status = p_port->p_adapter->p_ifc->post_srq_recv(\r
-                       p_port->ib_mgr.h_srq, &p_head_desc->wr, &p_failed_wc );\r
-\r
-               if( ib_status != IB_SUCCESS )\r
-               {\r
-                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("ip_post_recv returned %s\n", \r
-                               p_port->p_adapter->p_ifc->get_err_str( ib_status )) );\r
-                       \r
-                       /* put descriptors back to the pool */\r
-                       while( p_failed_wc )\r
-                       {\r
-                               p_head_desc = PARENT_STRUCT( p_failed_wc, ipoib_cm_desc_t, wr );\r
-                               p_failed_wc = p_failed_wc->p_next;\r
-                               endpt_cm_buf_mgr_put_recv( &p_port->cm_buf_mgr, p_head_desc );\r
-                               p_port->cm_recv_mgr.depth--;\r
-                       }\r
-               }\r
-       }\r
-\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_RECV );\r
-       return( ib_status );\r
-}\r
-\r
-static ib_api_status_t\r
-__endpt_cm_recv_arp(\r
-       IN              ipoib_port_t* const                             p_port,\r
-       IN              const   ipoib_pkt_t* const              p_ipoib,\r
-       OUT             eth_pkt_t* const                                p_eth,\r
-       IN              ipoib_endpt_t* const                    p_src_endpt )\r
-{\r
-       const ipoib_arp_pkt_t   *p_ib_arp;\r
-       arp_pkt_t                               *p_arp;\r
-       \r
-       p_ib_arp = &p_ipoib->type.arp;\r
-       p_arp = &p_eth->type.arp;\r
-       \r
-       if( p_ib_arp->hw_type != ARP_HW_TYPE_IB ||\r
-               p_ib_arp->hw_size != sizeof(ipoib_hw_addr_t) ||\r
-               p_ib_arp->prot_type != ETH_PROT_TYPE_IP )\r
-       {\r
-               return IB_ERROR;\r
-       }\r
-       \r
-       p_arp->hw_type = ARP_HW_TYPE_ETH;\r
-       p_arp->hw_size = sizeof(mac_addr_t);\r
-       p_arp->src_hw = p_src_endpt->mac;\r
-       p_arp->src_ip = p_ib_arp->src_ip;\r
-       p_arp->dst_hw = p_port->p_local_endpt->mac;\r
-       p_arp->dst_ip = p_ib_arp->dst_ip;\r
-\r
-       return IB_SUCCESS;      \r
-}\r
-\r
-static ib_api_status_t\r
-__endpt_cm_recv_udp(\r
-       IN      ipoib_port_t* const     p_port,\r
-       IN                      ib_wc_t* const                          p_wc,\r
-       IN              const   ipoib_pkt_t* const              p_ipoib,\r
-       OUT                     eth_pkt_t* const                        p_eth,\r
-       IN                      ipoib_endpt_t* const            p_src_endpt )\r
-{\r
-       ib_api_status_t                 ib_status = IB_SUCCESS;\r
-\r
-       if( p_wc->length <\r
-               (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t) + sizeof(udp_hdr_t)) )\r
-       {\r
-               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Received UDP packet too short\n") );\r
-               return IB_ERROR;\r
-       }\r
-       if( __cm_recv_is_dhcp( p_ipoib ) )\r
-       {\r
-               ib_status = ipoib_recv_dhcp(\r
-                       p_port, p_ipoib, p_eth, p_src_endpt, p_port->p_local_endpt );\r
-       }\r
-\r
-       return ib_status;\r
-}\r
-\r
-static boolean_t\r
-__cm_recv_is_dhcp(\r
-       IN      const ipoib_pkt_t* const        p_ipoib )\r
-{\r
-       return( (p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_SERVER &&\r
-                               p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_CLIENT) ||\r
-                               (p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_CLIENT &&\r
-                               p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_SERVER) );\r
-}\r
-#endif\r
diff --git a/branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_endpoint.cpp b/branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_endpoint.cpp
new file mode 100644 (file)
index 0000000..58a2b5c
--- /dev/null
@@ -0,0 +1,1170 @@
+/*\r
+ * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
+ * Copyright (c) 2006 Mellanox Technologies.  All rights reserved.\r
+ * Portions Copyright (c) 2008 Microsoft Corporation.  All rights reserved.\r
+ *\r
+ * This software is available to you under the OpenIB.org BSD license\r
+ * below:\r
+ *\r
+ *     Redistribution and use in source and binary forms, with or\r
+ *     without modification, are permitted provided that the following\r
+ *     conditions are met:\r
+ *\r
+ *      - Redistributions of source code must retain the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer.\r
+ *\r
+ *      - Redistributions in binary form must reproduce the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer in the documentation and/or other materials\r
+ *        provided with the distribution.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
+ * SOFTWARE.\r
+ *\r
+ * $Id: ipoib_endpoint.c 4226 2009-04-06 06:01:03Z xalex $\r
+ */\r
+\r
+\r
+\r
+#include "ipoib_endpoint.h"\r
+#include "ipoib_port.h"\r
+#include "ipoib_debug.h"\r
+#if defined(EVENT_TRACING)\r
+#ifdef offsetof\r
+#undef offsetof\r
+#endif\r
+#include "ipoib_endpoint.tmh"\r
+#endif\r
+#include <complib/cl_atomic.h>\r
+#include <complib/cl_math.h>\r
+\r
+\r
+static void\r
+__endpt_destroying(\r
+       IN                              cl_obj_t*                                       p_obj );\r
+\r
+static void\r
+__endpt_cleanup(\r
+       IN                              cl_obj_t*                                       p_obj );\r
+\r
+static void\r
+__endpt_free(\r
+       IN                              cl_obj_t*                                       p_obj );\r
+\r
+static ib_api_status_t\r
+__create_mcast_av(\r
+       IN                              ib_pd_handle_t                          h_pd,\r
+       IN                              uint8_t                                         port_num,\r
+       IN                              ib_member_rec_t* const          p_member_rec,\r
+               OUT                     ib_av_handle_t* const           ph_av );\r
+\r
+static inline ipoib_port_t*\r
+__endpt_parent(\r
+       IN                              ipoib_endpt_t* const            p_endpt );\r
+\r
+static void\r
+__path_query_cb(\r
+       IN                              ib_query_rec_t                          *p_query_rec );\r
+\r
+static void\r
+__endpt_resolve(\r
+       IN                              ipoib_endpt_t* const            p_endpt );\r
+\r
+static void\r
+__endpt_cm_send_cb(\r
+       IN              const   ib_cq_handle_t                  h_cq,\r
+       IN                              void                                    *cq_context );\r
+static void\r
+__endpt_cm_recv_cb(\r
+       IN              const   ib_cq_handle_t                  h_cq,\r
+       IN                              void                                    *cq_context );\r
+\r
+static void\r
+__endpt_cm_buf_mgr_construct(\r
+       IN              endpt_buf_mgr_t * const         p_buf_mgr );\r
+static void\r
+__conn_reply_cb(\r
+       IN              ib_cm_rep_rec_t                 *p_cm_rep );\r
+\r
+static void\r
+__conn_mra_cb(\r
+       IN              ib_cm_mra_rec_t                 *p_mra_rec );\r
+\r
+static void\r
+__conn_rej_cb(\r
+       IN              ib_cm_rej_rec_t                 *p_rej_rec );\r
+\r
+static void\r
+__conn_dreq_cb(\r
+        IN     ib_cm_dreq_rec_t                        *p_dreq_rec );\r
+\r
+#if 0 //CM\r
+static cl_status_t\r
+__cm_recv_desc_ctor(\r
+       IN              void* const                                     p_object,\r
+       IN              void*                                           context,\r
+       OUT             cl_pool_item_t** const          pp_pool_item );\r
+\r
+static void\r
+__cm_recv_desc_dtor(\r
+       IN              const   cl_pool_item_t* const           p_pool_item,\r
+       IN                              void                                            *context );\r
+\r
+static NDIS_PACKET*\r
+__endpt_cm_get_ndis_pkt(\r
+       IN              ipoib_port_t* const                     p_port,\r
+       IN              ipoib_cm_desc_t* const          p_desc );\r
+\r
+static inline ipoib_cm_desc_t*\r
+__endpt_cm_buf_mgr_get_recv(\r
+       IN              endpt_buf_mgr_t * const         p_buf_mgr );\r
+\r
+static boolean_t\r
+__cm_recv_is_dhcp(\r
+       IN              const ipoib_pkt_t* const        p_ipoib );\r
+\r
+static ib_api_status_t\r
+__endpt_cm_recv_arp(\r
+       IN              ipoib_port_t* const                     p_port,\r
+       IN              const   ipoib_pkt_t* const      p_ipoib,\r
+       OUT             eth_pkt_t* const                        p_eth,\r
+       IN              ipoib_endpt_t* const            p_src_endpt );\r
+\r
+static ib_api_status_t\r
+__endpt_cm_recv_udp(\r
+       IN              ipoib_port_t* const                     p_port,\r
+       IN              ib_wc_t* const                          p_wc,\r
+       IN              const   ipoib_pkt_t* const      p_ipoib,\r
+       OUT             eth_pkt_t* const                        p_eth,\r
+       IN              ipoib_endpt_t* const            p_src_endpt );\r
+#endif\r
+\r
+ipoib_endpt_t*\r
+ipoib_endpt_create(\r
+       IN              const   ib_gid_t* const                         p_dgid,\r
+       IN              const   net16_t                                         dlid,\r
+       IN              const   net32_t                                         qpn )\r
+{\r
+       ipoib_endpt_t   *p_endpt;\r
+       cl_status_t             status;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
+\r
+       p_endpt = (ipoib_endpt_t *) cl_zalloc( sizeof(ipoib_endpt_t) );\r
+       if( !p_endpt )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Failed to allocate endpoint (%d bytes)\n",\r
+                       sizeof(ipoib_endpt_t)) );\r
+               return NULL;\r
+       }\r
+\r
+       cl_obj_construct( &p_endpt->obj, IPOIB_OBJ_ENDPOINT );\r
+\r
+       status = cl_obj_init( &p_endpt->obj, CL_DESTROY_ASYNC,\r
+               __endpt_destroying, __endpt_cleanup, __endpt_free );\r
+\r
+       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,\r
+               ("Created endpoint: [ %p ] DLID: %#x QPN: %#x \n", \r
+               p_endpt, cl_ntoh16(dlid), cl_ntoh32(qpn) ) );\r
+\r
+       p_endpt->dgid = *p_dgid;\r
+       p_endpt->dlid = dlid;\r
+       p_endpt->qpn = qpn;\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
+       return p_endpt;\r
+}\r
+\r
+\r
+static ib_api_status_t\r
+__create_mcast_av(\r
+       IN                              ib_pd_handle_t                          h_pd,\r
+       IN                              uint8_t                                         port_num,\r
+       IN                              ib_member_rec_t* const          p_member_rec,\r
+               OUT                     ib_av_handle_t* const           ph_av )\r
+{\r
+       ib_av_attr_t    av_attr;\r
+       uint32_t                flow_lbl;\r
+       uint8_t                 hop_lmt;\r
+       ib_api_status_t status;\r
+       ipoib_endpt_t   *p_endpt;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_MCAST );\r
+\r
+       p_endpt = PARENT_STRUCT(ph_av, ipoib_endpt_t, h_av );\r
+\r
+       cl_memclr( &av_attr, sizeof(ib_av_attr_t) );\r
+       av_attr.port_num = port_num;\r
+       ib_member_get_sl_flow_hop( p_member_rec->sl_flow_hop,\r
+               &av_attr.sl, &flow_lbl, &hop_lmt );\r
+       av_attr.dlid = p_member_rec->mlid;\r
+       av_attr.grh_valid = TRUE;\r
+       av_attr.grh.hop_limit = hop_lmt;\r
+       av_attr.grh.dest_gid = p_member_rec->mgid;\r
+       av_attr.grh.src_gid = p_member_rec->port_gid;\r
+       av_attr.grh.ver_class_flow =\r
+               ib_grh_set_ver_class_flow( 6, p_member_rec->tclass, flow_lbl );\r
+       av_attr.static_rate = p_member_rec->rate & IB_PATH_REC_BASE_MASK;\r
+       av_attr.path_bits = 0;\r
+       /* port is not attached to endpoint at this point, so use endpt ifc reference */\r
+       status = p_endpt->p_ifc->create_av( h_pd, &av_attr, ph_av );\r
+\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ib_create_av returned %s\n",\r
+                       p_endpt->p_ifc->get_err_str( status )) );\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_MCAST );\r
+       return status;\r
+}\r
+\r
+\r
+ib_api_status_t\r
+ipoib_endpt_set_mcast(\r
+       IN                              ipoib_endpt_t* const            p_endpt,\r
+       IN                              ib_pd_handle_t                          h_pd,\r
+       IN                              uint8_t                                         port_num,\r
+       IN                              ib_mcast_rec_t* const           p_mcast_rec )\r
+{\r
+       ib_api_status_t status;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
+\r
+       IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,\r
+               ("Create av for MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",\r
+               p_endpt->mac.addr[0], p_endpt->mac.addr[1],\r
+               p_endpt->mac.addr[2], p_endpt->mac.addr[3],\r
+               p_endpt->mac.addr[4], p_endpt->mac.addr[5]) );\r
+               \r
+       status = __create_mcast_av( h_pd, port_num, p_mcast_rec->p_member_rec,\r
+               &p_endpt->h_av );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("__create_mcast_av returned %s\n", \r
+                       p_endpt->p_ifc->get_err_str( status )) );\r
+               return status;\r
+       }\r
+       p_endpt->h_mcast = p_mcast_rec->h_mcast;\r
+       CL_ASSERT(p_endpt->dlid == 0);\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
+       return IB_SUCCESS;\r
+}\r
+\r
+\r
+static void\r
+__endpt_destroying(\r
+       IN                              cl_obj_t*                                       p_obj )\r
+{\r
+       ipoib_endpt_t   *p_endpt;\r
+       ipoib_port_t    *p_port;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
+\r
+       p_endpt = PARENT_STRUCT( p_obj, ipoib_endpt_t, obj );\r
+       p_port = __endpt_parent( p_endpt );\r
+\r
+       cl_obj_lock( p_obj );\r
+       if( p_endpt->h_query )\r
+       {\r
+               p_port->p_adapter->p_ifc->cancel_query(\r
+                       p_port->p_adapter->h_al, p_endpt->h_query );\r
+               p_endpt->h_query = NULL;\r
+       }\r
+\r
+       /* Leave the multicast group if it exists. */\r
+       if( p_endpt->h_mcast )\r
+       {\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,\r
+                       ("Leaving MCast group\n") );\r
+               ipoib_port_ref(p_port, ref_leave_mcast);\r
+               p_port->p_adapter->p_ifc->leave_mcast( p_endpt->h_mcast, ipoib_leave_mcast_cb );\r
+       }\r
+#if 0\r
+       else if( p_port->p_adapter->params.cm_enabled )\r
+       {\r
+               p_endpt->cm_flag = 0;\r
+               CL_ASSERT( endpt_cm_get_state( p_endpt ) == IPOIB_CM_DISCONNECTED );\r
+       }\r
+#endif\r
+\r
+       cl_obj_unlock( p_obj );\r
+       \r
+       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
+}\r
+\r
+\r
+static void\r
+__endpt_cleanup(\r
+       IN                              cl_obj_t*                                       p_obj )\r
+{\r
+       ipoib_endpt_t   *p_endpt;\r
+       ipoib_port_t    *p_port;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
+\r
+       p_endpt = PARENT_STRUCT( p_obj, ipoib_endpt_t, obj );\r
+       p_port = __endpt_parent( p_endpt );\r
+\r
+       /* Destroy the AV if it exists. */\r
+       if( p_endpt->h_av )\r
+               p_port->p_adapter->p_ifc->destroy_av( p_endpt->h_av );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
+}\r
+\r
+\r
+static void\r
+__endpt_free(\r
+       IN                              cl_obj_t*                                       p_obj )\r
+{\r
+       ipoib_endpt_t   *p_endpt;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
+\r
+       p_endpt = PARENT_STRUCT( p_obj, ipoib_endpt_t, obj );\r
+\r
+       cl_obj_deinit( p_obj );\r
+       cl_free( p_endpt );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
+}\r
+\r
+\r
+static inline ipoib_port_t*\r
+__endpt_parent(\r
+       IN                              ipoib_endpt_t* const            p_endpt )\r
+{\r
+       return PARENT_STRUCT( p_endpt->rel.p_parent_obj, ipoib_port_t, obj );\r
+}\r
+\r
+ipoib_port_t*\r
+ipoib_endpt_parent(\r
+       IN                              ipoib_endpt_t* const            p_endpt )\r
+{\r
+       return __endpt_parent( p_endpt );\r
+}\r
+\r
+/*\r
+ * This function is called with the port object's send lock held and\r
+ * a reference held on the endpoint.  If we fail, we release the reference.\r
+ */\r
+NDIS_STATUS\r
+ipoib_endpt_queue(\r
+       IN                              ipoib_endpt_t* const            p_endpt )\r
+{\r
+       ib_api_status_t status;\r
+       ipoib_port_t    *p_port;\r
+       ib_av_attr_t    av_attr;\r
+       net32_t                 flow_lbl;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
+\r
+       if( p_endpt->h_av )\r
+       {\r
+               IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
+               return NDIS_STATUS_SUCCESS;\r
+       }\r
+\r
+       if( p_endpt->qpn == CL_HTON32(0x00FFFFFF) )\r
+       {\r
+               /*\r
+                * Handle a race between the mcast callback and a receive/send.  The QP\r
+                * is joined to the MC group before the MC callback is received, so it\r
+                * can receive packets, and NDIS can try to respond.  We need to delay\r
+                * a response until the MC callback runs and sets the AV.\r
+                */\r
+               ipoib_endpt_deref( p_endpt );\r
+               IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
+               return NDIS_STATUS_PENDING;\r
+       }\r
+\r
+       /* This is the first packet for this endpoint.  Create the AV. */\r
+       p_port = __endpt_parent( p_endpt );\r
+\r
+       cl_memclr( &av_attr, sizeof(ib_av_attr_t) );\r
+\r
+       av_attr.port_num = p_port->port_num;\r
+\r
+       ib_member_get_sl_flow_hop(\r
+               p_port->ib_mgr.bcast_rec.sl_flow_hop,\r
+               &av_attr.sl,\r
+               &flow_lbl,\r
+               &av_attr.grh.hop_limit\r
+               );\r
+\r
+       av_attr.dlid = p_endpt->dlid;\r
+\r
+       /*\r
+        * We always send the GRH so that we preferably lookup endpoints\r
+        * by GID rather than by LID.  This allows certain WHQL tests\r
+        * such as the 2c_MediaCheck test to succeed since they don't use\r
+        * IP.  This allows endpoints to be created on the fly for requests\r
+        * for which there is no match, something that doesn't work when\r
+        * using LIDs only.\r
+        */\r
+       av_attr.grh_valid = TRUE;\r
+       av_attr.grh.ver_class_flow = ib_grh_set_ver_class_flow(\r
+               6, p_port->ib_mgr.bcast_rec.tclass, flow_lbl );\r
+       av_attr.grh.resv1 = 0;\r
+       av_attr.grh.resv2 = 0;\r
+       ib_gid_set_default( &av_attr.grh.src_gid, p_port->p_adapter->guids.port_guid.guid );\r
+       av_attr.grh.dest_gid = p_endpt->dgid;\r
+\r
+       av_attr.static_rate = p_port->ib_mgr.bcast_rec.rate;\r
+       av_attr.path_bits = 0;\r
+\r
+       /* Create the AV. */\r
+       status = p_port->p_adapter->p_ifc->create_av(\r
+               p_port->ib_mgr.h_pd, &av_attr, &p_endpt->h_av );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               p_port->p_adapter->hung = TRUE;\r
+               ipoib_endpt_deref( p_endpt );\r
+               cl_obj_unlock( &p_endpt->obj );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ib_create_av failed with %s\n", \r
+                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+               return NDIS_STATUS_FAILURE;\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
+       return NDIS_STATUS_SUCCESS;\r
+}\r
+\r
+#if 0\r
+\r
+static void\r
+__endpt_cm_buf_mgr_construct(\r
+       IN              endpt_buf_mgr_t * const         p_buf_mgr )\r
+{\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       cl_qpool_construct( &p_buf_mgr->recv_pool );\r
+\r
+       p_buf_mgr->h_packet_pool = NULL;\r
+       p_buf_mgr->h_buffer_pool = NULL;\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+}\r
+\r
+ib_api_status_t\r
+endpt_cm_buf_mgr_init(\r
+       IN                              ipoib_port_t* const                             p_port )\r
+{\r
+       cl_status_t             cl_status;\r
+       NDIS_STATUS             ndis_status;\r
+       ib_api_status_t ib_status = IB_SUCCESS;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       if( p_port->cm_buf_mgr.pool_init )\r
+               return ib_status;\r
+\r
+       cl_qlist_init( &p_port->cm_buf_mgr.posted_list );\r
+\r
+       __endpt_cm_buf_mgr_construct( &p_port->cm_buf_mgr );\r
+       p_port->cm_recv_mgr.rq_depth = \r
+               min( (uint32_t)p_port->p_adapter->params.rq_depth * 8,\r
+                               p_port->p_ca_attrs->max_srq_wrs/2 );\r
+       p_port->cm_recv_mgr.depth = 0;\r
+       /* Allocate the receive descriptors pool */\r
+       cl_status = cl_qpool_init( &p_port->cm_buf_mgr.recv_pool,\r
+               p_port->cm_recv_mgr.rq_depth ,\r
+               0,\r
+               0,\r
+               sizeof( ipoib_cm_desc_t ),\r
+               __cm_recv_desc_ctor,\r
+               __cm_recv_desc_dtor,\r
+               p_port );\r
+\r
+       if( cl_status != CL_SUCCESS )\r
+       {\r
+               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
+                       EVENT_IPOIB_RECV_POOL, 1, cl_status );\r
+               \r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("cl_qpool_init for cm recvs returned %#x\n", cl_status) );\r
+               \r
+               return IB_INSUFFICIENT_MEMORY;\r
+       }\r
+\r
+       /* Allocate the NDIS buffer and packet pools for receive indication. */\r
+       NdisAllocatePacketPool( &ndis_status, \r
+                                                       &p_port->cm_buf_mgr.h_packet_pool,\r
+                                                       p_port->cm_recv_mgr.rq_depth, \r
+                                                       PROTOCOL_RESERVED_SIZE_IN_PACKET );\r
+       if( ndis_status != NDIS_STATUS_SUCCESS )\r
+       {\r
+               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
+                       EVENT_IPOIB_RECV_PKT_POOL, 1, ndis_status );\r
+\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("NdisAllocatePacketPool returned %08X\n", ndis_status) );\r
+               \r
+               ib_status = IB_INSUFFICIENT_RESOURCES;\r
+               goto pkt_pool_failed;\r
+       }\r
+\r
+       NdisAllocateBufferPool( &ndis_status, \r
+                                                       &p_port->cm_buf_mgr.h_buffer_pool,\r
+                                                       p_port->cm_recv_mgr.rq_depth );\r
+       if( ndis_status != NDIS_STATUS_SUCCESS )\r
+       {\r
+               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
+                       EVENT_IPOIB_RECV_BUF_POOL, 1, ndis_status );\r
+               \r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("NdisAllocateBufferPool returned %08X\n", ndis_status) );\r
+               \r
+               ib_status = IB_INSUFFICIENT_RESOURCES;\r
+               goto buf_pool_failed;\r
+       }\r
+       //NDIS60\r
+       //p_port->cm_recv_mgr.recv_pkt_array = \r
+               //cl_zalloc( sizeof(NDIS_PACKET*) * p_port->cm_recv_mgr.rq_depth );\r
+       p_port->cm_recv_mgr.recv_lst_array = \r
+               cl_zalloc( sizeof(NET_BUFFER_LIST*) * p_port->cm_recv_mgr.rq_depth );\r
+       \r
+               \r
+\r
+       if( !p_port->cm_recv_mgr.recv_pkt_array )\r
+       {\r
+               //NDIS60\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("cl_zalloc for NET_BUFFER_LIST array failed.\n") );\r
+               \r
+               ib_status = IB_INSUFFICIENT_MEMORY;\r
+               goto pkt_array_failed;\r
+       }\r
+\r
+       p_port->cm_buf_mgr.pool_init = TRUE;\r
+       return IB_SUCCESS;\r
+\r
+pkt_array_failed:\r
+       if( p_port->cm_buf_mgr.h_buffer_pool )\r
+               NdisFreeBufferPool( p_port->cm_buf_mgr.h_buffer_pool );\r
+buf_pool_failed:\r
+       if( p_port->cm_buf_mgr.h_packet_pool )\r
+               NdisFreePacketPool( p_port->cm_buf_mgr.h_packet_pool );\r
+pkt_pool_failed:\r
+               cl_qpool_destroy( &p_port->cm_buf_mgr.recv_pool );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+       return ib_status;\r
+}\r
+\r
+void\r
+endpt_cm_buf_mgr_reset(\r
+       IN              ipoib_port_t* const             p_port )\r
+{\r
+       cl_list_item_t          *p_item;\r
+\r
+       if( !p_port->cm_buf_mgr.pool_init )\r
+               return;\r
+\r
+       if( cl_qlist_count( &p_port->cm_buf_mgr.posted_list ) )\r
+       {\r
+               for( p_item = cl_qlist_remove_head( &p_port->cm_buf_mgr.posted_list );\r
+                       p_item != cl_qlist_end( &p_port->cm_buf_mgr.posted_list );\r
+                       p_item =  cl_qlist_remove_head( &p_port->cm_buf_mgr.posted_list ) )\r
+               {\r
+                       cl_qpool_put( &p_port->cm_buf_mgr.recv_pool, \r
+                               &( PARENT_STRUCT( p_item, ipoib_cm_desc_t, list_item ))->item );\r
+               }\r
+       }\r
+}\r
+\r
+void\r
+endpt_cm_buf_mgr_destroy(\r
+       IN              ipoib_port_t* const             p_port )\r
+{\r
+\r
+       IPOIB_ENTER(IPOIB_DBG_INIT );\r
+\r
+       CL_ASSERT( p_port );\r
+       \r
+       /* Free the receive descriptors. */\r
+       if( !p_port->cm_buf_mgr.pool_init )\r
+               return;\r
+\r
+       endpt_cm_buf_mgr_reset( p_port );\r
+\r
+       p_port->cm_buf_mgr.pool_init = FALSE;\r
+       \r
+       if( p_port->cm_recv_mgr.recv_pkt_array )\r
+       {\r
+               cl_free( p_port->cm_recv_mgr.recv_pkt_array );\r
+       }\r
+\r
+       /* Destroy the receive packet and buffer pools. */\r
+       if( p_port->cm_buf_mgr.h_buffer_pool )\r
+               NdisFreeBufferPool( p_port->cm_buf_mgr.h_buffer_pool );\r
+       if( p_port->cm_buf_mgr.h_packet_pool )\r
+               NdisFreePacketPool( p_port->cm_buf_mgr.h_packet_pool );\r
+\r
+       cl_qpool_destroy( &p_port->cm_buf_mgr.recv_pool );\r
+       \r
+       IPOIB_EXIT(  IPOIB_DBG_INIT );\r
+}\r
+\r
+static cl_status_t\r
+__cm_recv_desc_ctor(\r
+       IN                              void* const                                     p_object,\r
+       IN                              void*                                           context,\r
+               OUT                     cl_pool_item_t** const          pp_pool_item )\r
+{\r
+       ipoib_cm_desc_t*        p_desc;\r
+       ipoib_port_t*           p_port;\r
+       ib_mr_create_t          create_mr;\r
+       net32_t                         rkey;\r
+\r
+       CL_ASSERT( p_object );\r
+       CL_ASSERT( context );\r
+\r
+       p_desc = (ipoib_cm_desc_t*)p_object;\r
+       p_port = (ipoib_port_t*)context;\r
+\r
+#define BUF_ALIGN              (16)\r
+\r
+       p_desc->alloc_buf_size = \r
+               ROUNDUP( p_port->p_adapter->params.cm_xfer_block_size, BUF_ALIGN );\r
+       \r
+       p_desc->p_alloc_buf = (uint8_t *)ExAllocatePoolWithTag( \r
+               NonPagedPool, p_desc->alloc_buf_size, 'DOMC' );\r
+\r
+       if( p_desc->p_alloc_buf == NULL )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Failed to allocate receive buffer size %d bytes.\n", p_desc->alloc_buf_size ) );\r
+               return CL_INSUFFICIENT_MEMORY;\r
+       }\r
+\r
+       create_mr.vaddr  = p_desc->p_alloc_buf;\r
+       create_mr.length  = p_desc->alloc_buf_size;\r
+       create_mr.access_ctrl = IB_AC_LOCAL_WRITE;\r
+\r
+       \r
+       if( p_port->p_adapter->p_ifc->reg_mem( \r
+                                                       p_port->ib_mgr.h_pd,\r
+                                                       &create_mr,\r
+                                                       &p_desc->lkey,\r
+                                                       &rkey,\r
+                                                       &p_desc->h_mr ) != IB_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Failed to create Memory Region size %d bytes.\n", p_desc->alloc_buf_size ) );\r
+               goto ctor_failed;\r
+       }\r
+       p_desc->p_buf = p_desc->p_alloc_buf + (BUF_ALIGN - sizeof( ipoib_hdr_t));\r
+       p_desc->buf_size = p_desc->alloc_buf_size - (BUF_ALIGN - sizeof( ipoib_hdr_t));\r
+\r
+       /* Setup the local data segment. */\r
+       p_desc->local_ds[0].vaddr = (uint64_t)(uintn_t)p_desc->p_buf;\r
+       p_desc->local_ds[0].length = p_desc->buf_size;\r
+       p_desc->local_ds[0].lkey = p_desc->lkey;\r
+\r
+       /* Setup the work request. */\r
+       p_desc->wr.wr_id = (uintn_t)p_desc;\r
+       p_desc->wr.ds_array = p_desc->local_ds;\r
+       p_desc->wr.num_ds = 1;\r
+       p_desc->type = PKT_TYPE_CM_UCAST;\r
+       \r
+       *pp_pool_item = &p_desc->item;\r
+       return CL_SUCCESS;\r
+\r
+ctor_failed:\r
+       ExFreePoolWithTag( p_desc->p_alloc_buf, 'DOMC' );\r
+       return CL_INSUFFICIENT_MEMORY;\r
+}\r
+\r
+static void\r
+__cm_recv_desc_dtor(\r
+       IN              const   cl_pool_item_t* const           p_pool_item,\r
+       IN                              void                                            *context )\r
+{\r
+       ipoib_cm_desc_t *p_desc;\r
+       ipoib_port_t*   p_port;\r
+\r
+       if( p_pool_item == NULL || context == NULL )\r
+               return;\r
+\r
+       p_port = (ipoib_port_t*)context;\r
+       p_desc = PARENT_STRUCT( p_pool_item, ipoib_cm_desc_t, item );\r
+\r
+       if( p_desc->h_mr )\r
+               p_port->p_adapter->p_ifc->dereg_mr( p_desc->h_mr );\r
+\r
+       if( p_desc->p_alloc_buf )\r
+               ExFreePoolWithTag( p_desc->p_alloc_buf, 'DOMC' );\r
+}\r
+\r
+\r
+static NDIS_PACKET*\r
+__endpt_cm_get_ndis_pkt(\r
+       IN              ipoib_port_t* const                     p_port,\r
+       IN              ipoib_cm_desc_t* const  p_desc )\r
+{\r
+       NDIS_STATUS                             status;\r
+       NDIS_PACKET                             *p_packet;\r
+       NDIS_BUFFER                             *p_buffer;\r
+       \r
+       IPOIB_ENTER(  IPOIB_DBG_RECV );\r
+\r
+       NdisDprAllocatePacketNonInterlocked( &status, &p_packet,\r
+                       p_port->cm_buf_mgr.h_packet_pool );\r
+       if( status != NDIS_STATUS_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Failed to allocate NDIS_PACKET: %08x\n", status) );\r
+               return NULL;\r
+       }\r
+\r
+       IPOIB_PORT_FROM_PACKET( p_packet ) = p_port;\r
+       IPOIB_RECV_FROM_PACKET( p_packet ) = p_desc;\r
+\r
+       NdisAllocateBuffer( \r
+                       &status, \r
+                       &p_buffer,\r
+                       p_port->cm_buf_mgr.h_buffer_pool, \r
+                       (void *)(p_desc->p_buf - DATA_OFFSET),\r
+                       p_desc->len + DATA_OFFSET );\r
+\r
+       if( status != NDIS_STATUS_SUCCESS )\r
+       {\r
+               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Failed to allocate NDIS_BUFFER: %08x\n", status) );\r
+               NdisDprFreePacketNonInterlocked( p_packet );\r
+               return NULL;\r
+       }\r
+\r
+       NdisChainBufferAtFront( p_packet, p_buffer );\r
+       NDIS_SET_PACKET_HEADER_SIZE( p_packet, sizeof(eth_hdr_t) );\r
+\r
+       IPOIB_EXIT(  IPOIB_DBG_RECV );\r
+       return p_packet;\r
+}\r
+\r
+static inline ipoib_cm_desc_t*\r
+__endpt_cm_buf_mgr_get_recv(\r
+       IN              endpt_buf_mgr_t * const         p_buf_mgr )\r
+{\r
+       ipoib_cm_desc_t *p_desc;\r
+\r
+       p_desc = (ipoib_cm_desc_t*)cl_qpool_get( &p_buf_mgr->recv_pool );\r
+       if( p_desc )\r
+               cl_qlist_insert_tail( &p_buf_mgr->posted_list, &p_desc->list_item );\r
+\r
+       return p_desc;\r
+}\r
+\r
+void\r
+endpt_cm_buf_mgr_put_recv(\r
+       IN              endpt_buf_mgr_t * const         p_buf_mgr,\r
+       IN              ipoib_cm_desc_t* const  p_desc )\r
+{\r
+\r
+       IPOIB_ENTER(IPOIB_DBG_RECV );\r
+\r
+       /* Return the descriptor to it's pool. */\r
+       cl_qlist_remove_item( &p_buf_mgr->posted_list, &p_desc->list_item );\r
+       cl_qpool_put( &p_buf_mgr->recv_pool, &p_desc->item );\r
+\r
+       IPOIB_EXIT(  IPOIB_DBG_RECV );\r
+}\r
+\r
+void\r
+endpt_cm_buf_mgr_put_recv_list(\r
+       IN              endpt_buf_mgr_t * const         p_buf_mgr,\r
+       IN              cl_qlist_t* const                       p_list )\r
+{\r
+       cl_qpool_put_list( &p_buf_mgr->recv_pool, p_list );\r
+}\r
+\r
+uint32_t\r
+endpt_cm_recv_mgr_build_pkt_array(\r
+       IN                      ipoib_port_t* const                     p_port,\r
+       IN                      ipoib_endpt_t* const            p_endpt,\r
+       IN                      cl_qlist_t* const                       p_done_list,\r
+       IN OUT          uint32_t*                                       p_bytes_recv )\r
+{\r
+       cl_list_item_t                  *p_item;\r
+       ipoib_cm_desc_t         *p_desc;\r
+       uint32_t                                i = 0;\r
+       NDIS_PACKET                             *p_packet;\r
+       NDIS_TCP_IP_CHECKSUM_PACKET_INFO        chksum;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_RECV );\r
+       UNUSED_PARAM( p_endpt );\r
+\r
+       p_item = cl_qlist_remove_head( p_done_list );\r
+       \r
+       *p_bytes_recv = 0;\r
+\r
+       for( p_item; p_item != cl_qlist_end( p_done_list );\r
+               p_item = cl_qlist_remove_head( p_done_list ) )\r
+       {\r
+               p_desc = (ipoib_cm_desc_t*)p_item;\r
+\r
+               p_packet = __endpt_cm_get_ndis_pkt( p_port, p_desc );\r
+               if( !p_packet )\r
+               {\r
+                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Failed to get Packet from descriptor\n" ) );\r
+                       endpt_cm_buf_mgr_put_recv( &p_port->cm_buf_mgr, p_desc );\r
+                       p_port->cm_recv_mgr.depth--;\r
+                       continue;\r
+               }\r
+               chksum.Value = 0;\r
+               switch( p_port->p_adapter->params.recv_chksum_offload )\r
+               {\r
+               default:\r
+                       CL_ASSERT( FALSE );\r
+               case CSUM_DISABLED:\r
+               case CSUM_ENABLED:\r
+               NDIS_PER_PACKET_INFO_FROM_PACKET( p_packet, TcpIpChecksumPacketInfo ) =\r
+                               (void*)(uintn_t)chksum.Value;\r
+                       break;\r
+               case CSUM_BYPASS:\r
+                       /* Flag the checksums as having been calculated. */\r
+                       chksum.Receive.NdisPacketTcpChecksumSucceeded = TRUE;\r
+                       chksum.Receive.NdisPacketUdpChecksumSucceeded = TRUE;\r
+                       chksum.Receive.NdisPacketIpChecksumSucceeded = TRUE;\r
+                       NDIS_PER_PACKET_INFO_FROM_PACKET( p_packet, TcpIpChecksumPacketInfo ) =\r
+                               (void*)(uintn_t)chksum.Value;\r
+                       break;\r
+               }\r
+\r
+               NDIS_SET_PACKET_STATUS( p_packet, NDIS_STATUS_SUCCESS );\r
+               p_port->cm_recv_mgr.recv_pkt_array[i] = p_packet;\r
+               i++;            \r
+               *p_bytes_recv += p_desc->len;\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_RECV );\r
+       return i;\r
+}\r
+void\r
+endpt_cm_flush_recv(\r
+       IN                              ipoib_port_t* const             p_port,\r
+       IN                              ipoib_endpt_t* const    p_endpt )\r
+{\r
+       ib_api_status_t         ib_status = IB_SUCCESS;\r
+       ib_qp_mod_t                     mod_attr;\r
+       ib_wc_t                         wc[MAX_RECV_WC];\r
+       ib_wc_t                         *p_free_wc;\r
+       ib_wc_t                         *p_done_wc;\r
+       ib_wc_t                         *p_wc;\r
+       ipoib_cm_desc_t         *p_desc;\r
+       size_t                          i;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_RECV );\r
+\r
+       CL_ASSERT( p_endpt );\r
+\r
+       if( p_endpt->conn.h_recv_qp )\r
+       {\r
+               cl_memclr( &mod_attr, sizeof( mod_attr ) );\r
+               mod_attr.req_state = IB_QPS_ERROR;\r
+               p_port->p_adapter->p_ifc->modify_qp( p_endpt->conn.h_send_qp, &mod_attr );\r
+               p_port->p_adapter->p_ifc->modify_qp( p_endpt->conn.h_recv_qp, &mod_attr );\r
+\r
+               for( i = 0; i < MAX_RECV_WC; i++ )\r
+                       wc[i].p_next = &wc[i + 1];\r
+               wc[MAX_RECV_WC - 1].p_next = NULL;\r
+\r
+               do\r
+               {\r
+                       p_free_wc = wc;\r
+                       ib_status = \r
+                               p_port->p_adapter->p_ifc->poll_cq( p_endpt->conn.h_recv_cq, \r
+                               &p_free_wc, &p_done_wc );\r
+                       if( ib_status != IB_SUCCESS && \r
+                               ib_status != IB_NOT_FOUND )\r
+                       {\r
+                               /* connection CQ failed */\r
+                               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                       ("Poll Recv CQ failed status %#x\n", ib_status ) );\r
+                               break;\r
+                       }\r
+                       cl_spinlock_acquire( &p_port->recv_lock );\r
+                       for( p_wc = p_done_wc; p_wc; p_wc = p_wc->p_next )\r
+                       {\r
+                               p_desc = (ipoib_cm_desc_t *)(uintn_t)p_wc->wr_id;\r
+                               endpt_cm_buf_mgr_put_recv( &p_port->cm_buf_mgr, p_desc );\r
+                               p_port->cm_recv_mgr.depth--;\r
+                       }\r
+                       cl_spinlock_release( &p_port->recv_lock );\r
+               } while( !p_free_wc );\r
+\r
+               ib_status = p_port->p_adapter->p_ifc->destroy_qp( p_endpt->conn.h_recv_qp, NULL );\r
+               if( ib_status != IB_SUCCESS )\r
+               {\r
+                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Destroy Recv QP failed status %#x\n", ib_status ) );\r
+               }\r
+               p_endpt->conn.h_recv_qp = NULL;\r
+       }\r
+\r
+       if( p_endpt->conn.h_send_qp )\r
+       {\r
+               ib_status = p_port->p_adapter->p_ifc->destroy_qp( p_endpt->conn.h_send_qp, NULL );\r
+               if( ib_status != IB_SUCCESS )\r
+               {\r
+                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Destroy Send QP failed status %#x\n", ib_status ) );\r
+               }\r
+               p_endpt->conn.h_send_qp = NULL;\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_RECV );\r
+}\r
+\r
+int32_t\r
+endpt_cm_recv_mgr_filter(\r
+       IN              ipoib_endpt_t* const            p_endpt,\r
+       IN              ib_wc_t* const                          p_done_wc_list,\r
+       OUT             cl_qlist_t* const                       p_done_list,\r
+       OUT             cl_qlist_t* const                       p_bad_list )\r
+{\r
+       ib_api_status_t                 ib_status;\r
+       ipoib_cm_desc_t                 *p_desc;\r
+       ib_wc_t                                 *p_wc;\r
+       ipoib_pkt_t                             *p_ipoib;\r
+       eth_pkt_t                               *p_eth;\r
+       ipoib_port_t*                   p_port;\r
+       int32_t                                 recv_cnt;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_RECV );\r
+\r
+       p_port = ipoib_endpt_parent( p_endpt );\r
+\r
+       for( p_wc = p_done_wc_list, recv_cnt = 0; p_wc; p_wc = p_wc->p_next )\r
+       {\r
+               p_desc = (ipoib_cm_desc_t *)(uintn_t)p_wc->wr_id;\r
+               recv_cnt++;\r
+               if(  p_wc->status != IB_WCS_SUCCESS )\r
+               {\r
+                       if( p_wc->status != IB_WCS_WR_FLUSHED_ERR )\r
+                       {\r
+                               \r
+                               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                       ("Failed completion %s  (vendor specific %#x)\n",\r
+                                       p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status ),\r
+                                       (int)p_wc->vendor_specific) );\r
+                       }\r
+                       else\r
+                       {\r
+                               IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,\r
+                                       ("Flushed completion %s\n",\r
+                                       p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status )) );\r
+                       }\r
+                       \r
+                       ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );\r
+\r
+                       cl_qlist_remove_item( &p_port->cm_buf_mgr.posted_list,&p_desc->list_item );\r
+                       cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );\r
+                       continue;\r
+               }\r
+\r
+               /* Successful completion                \r
+                Setup the ethernet/ip/arp header and queue descriptor for report. */\r
+               ib_status = IB_SUCCESS;\r
+               p_ipoib = (ipoib_pkt_t *)((uint8_t*)p_desc->p_buf );\r
+               p_eth = (eth_pkt_t *)((uint8_t*)p_desc->p_buf - DATA_OFFSET );\r
+               \r
+               switch( p_ipoib->hdr.type )\r
+               {\r
+               case ETH_PROT_TYPE_ARP:\r
+                       if( p_wc->length < (sizeof(ipoib_hdr_t) + sizeof(ipoib_arp_pkt_t)) )\r
+                       {\r
+                               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Received ARP packet too short\n") );\r
+                               ib_status = IB_ERROR;\r
+                               break;\r
+                       }\r
+                       ib_status = \r
+                               __endpt_cm_recv_arp( p_port, p_ipoib, p_eth, p_endpt );\r
+                       break;\r
+               case ETH_PROT_TYPE_IP:\r
+                       if( p_wc->length < (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t)) )\r
+                       {\r
+                               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                       ("Received IP packet too short\n") );\r
+                               ib_status = IB_ERROR;\r
+                               break;\r
+                       }\r
+                       if( p_ipoib->type.ip.hdr.prot == IP_PROT_UDP )\r
+                       {\r
+                               ib_status = \r
+                                       __endpt_cm_recv_udp( p_port, p_wc, p_ipoib, p_eth, p_endpt );\r
+                       }\r
+               \r
+                       break;\r
+               }\r
+\r
+               if( ib_status != IB_SUCCESS )\r
+               {\r
+                       ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );\r
+                       cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );\r
+                       continue;\r
+               }\r
+\r
+               p_eth->hdr.type = p_ipoib->hdr.type;\r
+               p_eth->hdr.src = p_endpt->mac;\r
+               p_eth->hdr.dst = p_port->p_adapter->mac;\r
+\r
+               /* save payload length */\r
+               p_desc->len = p_wc->length;\r
+               \r
+               cl_qlist_insert_tail( p_done_list, &p_desc->item.list_item );\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_RECV );\r
+       return recv_cnt;\r
+}\r
+\r
+ib_api_status_t\r
+endpt_cm_post_recv(\r
+       IN              ipoib_port_t* const                     p_port )\r
+{\r
+       ib_api_status_t         ib_status = IB_SUCCESS;\r
+       ipoib_cm_desc_t         *p_head_desc = NULL;\r
+       ipoib_cm_desc_t         *p_tail_desc = NULL;\r
+       ipoib_cm_desc_t         *p_next_desc;\r
+       ib_recv_wr_t            *p_failed_wc = NULL;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_RECV );\r
+\r
+       while( cl_qpool_count( &p_port->cm_buf_mgr.recv_pool )  > 1  )\r
+       {\r
+                       /* Pull receives out of the pool and chain them up. */\r
+               p_next_desc = __endpt_cm_buf_mgr_get_recv( \r
+                                                                       &p_port->cm_buf_mgr );\r
+               if( !p_next_desc )\r
+               {\r
+                       IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,\r
+                               ("Out of receive descriptors! Endpt recv queue depth 0x%x\n",\r
+                               p_port->cm_recv_mgr.depth ) );\r
+                       break;\r
+               }\r
+\r
+               if( !p_tail_desc )\r
+               {\r
+                       p_tail_desc = p_next_desc;\r
+                       p_next_desc->wr.p_next = NULL;\r
+               }\r
+               else\r
+               {\r
+                       p_next_desc->wr.p_next = &p_head_desc->wr;\r
+               }\r
+\r
+               p_head_desc = p_next_desc;\r
+\r
+               p_port->cm_recv_mgr.depth++;\r
+       }\r
+\r
+       if( p_head_desc )\r
+       {\r
+               ib_status = p_port->p_adapter->p_ifc->post_srq_recv(\r
+                       p_port->ib_mgr.h_srq, &p_head_desc->wr, &p_failed_wc );\r
+\r
+               if( ib_status != IB_SUCCESS )\r
+               {\r
+                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("ip_post_recv returned %s\n", \r
+                               p_port->p_adapter->p_ifc->get_err_str( ib_status )) );\r
+                       \r
+                       /* put descriptors back to the pool */\r
+                       while( p_failed_wc )\r
+                       {\r
+                               p_head_desc = PARENT_STRUCT( p_failed_wc, ipoib_cm_desc_t, wr );\r
+                               p_failed_wc = p_failed_wc->p_next;\r
+                               endpt_cm_buf_mgr_put_recv( &p_port->cm_buf_mgr, p_head_desc );\r
+                               p_port->cm_recv_mgr.depth--;\r
+                       }\r
+               }\r
+       }\r
+\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_RECV );\r
+       return( ib_status );\r
+}\r
+\r
+static ib_api_status_t\r
+__endpt_cm_recv_arp(\r
+       IN              ipoib_port_t* const                             p_port,\r
+       IN              const   ipoib_pkt_t* const              p_ipoib,\r
+       OUT             eth_pkt_t* const                                p_eth,\r
+       IN              ipoib_endpt_t* const                    p_src_endpt )\r
+{\r
+       const ipoib_arp_pkt_t   *p_ib_arp;\r
+       arp_pkt_t                               *p_arp;\r
+       \r
+       p_ib_arp = &p_ipoib->type.arp;\r
+       p_arp = &p_eth->type.arp;\r
+       \r
+       if( p_ib_arp->hw_type != ARP_HW_TYPE_IB ||\r
+               p_ib_arp->hw_size != sizeof(ipoib_hw_addr_t) ||\r
+               p_ib_arp->prot_type != ETH_PROT_TYPE_IP )\r
+       {\r
+               return IB_ERROR;\r
+       }\r
+       \r
+       p_arp->hw_type = ARP_HW_TYPE_ETH;\r
+       p_arp->hw_size = sizeof(mac_addr_t);\r
+       p_arp->src_hw = p_src_endpt->mac;\r
+       p_arp->src_ip = p_ib_arp->src_ip;\r
+       p_arp->dst_hw = p_port->p_local_endpt->mac;\r
+       p_arp->dst_ip = p_ib_arp->dst_ip;\r
+\r
+       return IB_SUCCESS;      \r
+}\r
+\r
+static ib_api_status_t\r
+__endpt_cm_recv_udp(\r
+       IN      ipoib_port_t* const     p_port,\r
+       IN                      ib_wc_t* const                          p_wc,\r
+       IN              const   ipoib_pkt_t* const              p_ipoib,\r
+       OUT                     eth_pkt_t* const                        p_eth,\r
+       IN                      ipoib_endpt_t* const            p_src_endpt )\r
+{\r
+       ib_api_status_t                 ib_status = IB_SUCCESS;\r
+\r
+       if( p_wc->length <\r
+               (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t) + sizeof(udp_hdr_t)) )\r
+       {\r
+               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Received UDP packet too short\n") );\r
+               return IB_ERROR;\r
+       }\r
+       if( __cm_recv_is_dhcp( p_ipoib ) )\r
+       {\r
+               ib_status = ipoib_recv_dhcp(\r
+                       p_port, p_ipoib, p_eth, p_src_endpt, p_port->p_local_endpt );\r
+       }\r
+\r
+       return ib_status;\r
+}\r
+\r
+static boolean_t\r
+__cm_recv_is_dhcp(\r
+       IN      const ipoib_pkt_t* const        p_ipoib )\r
+{\r
+       return( (p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_SERVER &&\r
+                               p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_CLIENT) ||\r
+                               (p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_CLIENT &&\r
+                               p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_SERVER) );\r
+}\r
+#endif\r
diff --git a/branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_ibat.c b/branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_ibat.c
deleted file mode 100644 (file)
index a770366..0000000
+++ /dev/null
@@ -1,693 +0,0 @@
-/*\r
- * Copyright (c) 2005 Mellanox Technologies.  All rights reserved.\r
- * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
- * Portions Copyright (c) 2008 Microsoft Corporation.  All rights reserved.\r
- *\r
- * This software is available to you under the OpenIB.org BSD license\r
- * below:\r
- *\r
- *     Redistribution and use in source and binary forms, with or\r
- *     without modification, are permitted provided that the following\r
- *     conditions are met:\r
- *\r
- *      - Redistributions of source code must retain the above\r
- *        copyright notice, this list of conditions and the following\r
- *        disclaimer.\r
- *\r
- *      - Redistributions in binary form must reproduce the above\r
- *        copyright notice, this list of conditions and the following\r
- *        disclaimer in the documentation and/or other materials\r
- *        provided with the distribution.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
- * SOFTWARE.\r
- *\r
- * $Id: ipoib_ibat.c 4494 2009-06-22 14:31:08Z xalex $\r
- */\r
-\r
-\r
-#include "ipoib_driver.h"\r
-#include "ipoib_adapter.h"\r
-#include "ipoib_port.h"\r
-#include "ipoib_debug.h"\r
-#if defined(EVENT_TRACING)\r
-#ifdef offsetof\r
-#undef offsetof\r
-#endif\r
-#include "ipoib_ibat.tmh"\r
-#endif\r
-#include <iba/ib_at_ioctl.h>\r
-\r
-extern PDRIVER_OBJECT                          g_p_drv_obj;\r
-\r
-static NTSTATUS\r
-__ipoib_create(\r
-       IN                              DEVICE_OBJECT* const            pDevObj,\r
-       IN                              IRP* const                                      pIrp );\r
-\r
-static NTSTATUS\r
-__ipoib_cleanup(\r
-       IN                              DEVICE_OBJECT* const            pDevObj,\r
-       IN                              IRP* const                                      pIrp );\r
-\r
-static NTSTATUS\r
-__ipoib_close(\r
-       IN                              DEVICE_OBJECT* const            pDevObj,\r
-       IN                              IRP* const                                      pIrp );\r
-\r
-static NTSTATUS\r
-__ipoib_dispatch(\r
-       IN                              DEVICE_OBJECT* const            pDevObj,\r
-       IN                              IRP* const                                      pIrp );\r
-\r
-\r
-static NTSTATUS\r
-__ibat_get_ports(\r
-       IN                              IRP                                                     *pIrp,\r
-       IN                              IO_STACK_LOCATION                       *pIoStack )\r
-{\r
-       IOCTL_IBAT_PORTS_IN             *pIn;\r
-       IOCTL_IBAT_PORTS_OUT    *pOut;\r
-       KLOCK_QUEUE_HANDLE              hdl;\r
-       cl_list_item_t                  *pItem;\r
-       ipoib_adapter_t                 *pAdapter;\r
-       LONG                                    nPorts;\r
-\r
-       IPOIB_ENTER(IPOIB_DBG_IOCTL);\r
-\r
-       if( pIoStack->Parameters.DeviceIoControl.InputBufferLength !=\r
-               sizeof(IOCTL_IBAT_PORTS_IN) )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Invalid input buffer size.\n") );\r
-               return STATUS_INVALID_PARAMETER;\r
-       }\r
-       \r
-       if( pIoStack->Parameters.DeviceIoControl.OutputBufferLength <\r
-               sizeof(IOCTL_IBAT_PORTS_OUT) )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Invalid output buffer size.\n") );\r
-               return STATUS_INVALID_PARAMETER;\r
-       }\r
-\r
-       pIn = pIrp->AssociatedIrp.SystemBuffer;\r
-       pOut = pIrp->AssociatedIrp.SystemBuffer;\r
-\r
-       if( pIn->Version != IBAT_IOCTL_VERSION )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Invalid version.\n") );\r
-               return STATUS_INVALID_PARAMETER;\r
-       }\r
-\r
-       KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
-       nPorts = (LONG)cl_qlist_count( &g_ipoib.adapter_list );\r
-       switch( nPorts )\r
-       {\r
-       case 0:\r
-               cl_memclr( pOut->Ports, sizeof(pOut->Ports) );\r
-               /* Fall through */\r
-       case 1:\r
-               pOut->Size = sizeof(IOCTL_IBAT_PORTS_OUT);\r
-               break;\r
-\r
-       default:\r
-               pOut->Size = sizeof(IOCTL_IBAT_PORTS_OUT) + \r
-                       (sizeof(IBAT_PORT_RECORD) * (nPorts - 1));\r
-               break;\r
-       }\r
-\r
-       pIrp->IoStatus.Information = pOut->Size;\r
-\r
-       if( pOut->Size > pIoStack->Parameters.DeviceIoControl.OutputBufferLength )\r
-       {\r
-               nPorts = 1 +\r
-                       (pIoStack->Parameters.DeviceIoControl.OutputBufferLength -\r
-                       sizeof(IOCTL_IBAT_PORTS_OUT)) / sizeof(IBAT_PORT_RECORD);\r
-\r
-               pIrp->IoStatus.Information = sizeof(IOCTL_IBAT_PORTS_OUT) +\r
-                       ((nPorts - 1) * sizeof(IBAT_PORT_RECORD));\r
-       }\r
-\r
-       pOut->NumPorts = 0;\r
-       pItem = cl_qlist_head( &g_ipoib.adapter_list );\r
-       while( pOut->NumPorts != nPorts )\r
-       {\r
-               pAdapter = CONTAINING_RECORD( pItem, ipoib_adapter_t, entry );\r
-               pOut->Ports[pOut->NumPorts].CaGuid = pAdapter->guids.ca_guid;\r
-               pOut->Ports[pOut->NumPorts].PortGuid = pAdapter->guids.port_guid.guid;\r
-               pOut->Ports[pOut->NumPorts].PKey = IB_DEFAULT_PKEY;\r
-               pOut->Ports[pOut->NumPorts].PortNum = pAdapter->guids.port_num;\r
-               pOut->NumPorts++;\r
-\r
-               pItem = cl_qlist_next( pItem );\r
-       }\r
-\r
-       KeReleaseInStackQueuedSpinLock( &hdl );\r
-       IPOIB_EXIT( IPOIB_DBG_IOCTL );\r
-       return STATUS_SUCCESS;\r
-}\r
-\r
-\r
-static NTSTATUS\r
-__ibat_get_ips(\r
-       IN                              IRP                                                     *pIrp,\r
-       IN                              IO_STACK_LOCATION                       *pIoStack )\r
-{\r
-       IOCTL_IBAT_IP_ADDRESSES_IN      *pIn;\r
-       IOCTL_IBAT_IP_ADDRESSES_OUT     *pOut;\r
-       KLOCK_QUEUE_HANDLE                      hdl;\r
-       cl_list_item_t                          *pItem;\r
-       ipoib_adapter_t                         *pAdapter;\r
-       LONG                                            nIps, maxIps;\r
-       size_t                                          idx;\r
-       net_address_item_t                      *pAddr;\r
-       UINT64                                          PortGuid;\r
-\r
-       IPOIB_ENTER(IPOIB_DBG_IOCTL);\r
-\r
-       if( pIoStack->Parameters.DeviceIoControl.InputBufferLength !=\r
-               sizeof(IOCTL_IBAT_IP_ADDRESSES_IN) )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Invalid input buffer size.\n") );\r
-               return STATUS_INVALID_PARAMETER;\r
-       }\r
-       \r
-       if( pIoStack->Parameters.DeviceIoControl.OutputBufferLength <\r
-               sizeof(IOCTL_IBAT_IP_ADDRESSES_OUT) )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Invalid output buffer size.\n") );\r
-               return STATUS_INVALID_PARAMETER;\r
-       }\r
-\r
-       pIn = pIrp->AssociatedIrp.SystemBuffer;\r
-       pOut = pIrp->AssociatedIrp.SystemBuffer;\r
-\r
-       if( pIn->Version != IBAT_IOCTL_VERSION )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Invalid version.\n") );\r
-               return STATUS_INVALID_PARAMETER;\r
-       }\r
-\r
-       PortGuid = pIn->PortGuid;\r
-\r
-       nIps = 0;\r
-       pOut->AddressCount = 0;\r
-       maxIps = 1 +\r
-               ((pIoStack->Parameters.DeviceIoControl.OutputBufferLength -\r
-               sizeof(IOCTL_IBAT_IP_ADDRESSES_OUT)) / sizeof(IP_ADDRESS));\r
-\r
-       KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
-       for( pItem = cl_qlist_head( &g_ipoib.adapter_list );\r
-               pItem != cl_qlist_end( &g_ipoib.adapter_list );\r
-               pItem = cl_qlist_next( pItem ) )\r
-       {\r
-               pAdapter = CONTAINING_RECORD( pItem, ipoib_adapter_t, entry );\r
-               if( PortGuid && pAdapter->guids.port_guid.guid != PortGuid )\r
-                       continue;\r
-\r
-               cl_obj_lock( &pAdapter->obj );\r
-               nIps += (LONG)cl_vector_get_size( &pAdapter->ip_vector );\r
-\r
-               for( idx = 0;\r
-                       idx < cl_vector_get_size( &pAdapter->ip_vector );\r
-                       idx++ )\r
-               {\r
-                       if( pOut->AddressCount == maxIps )\r
-                               break;\r
-\r
-                       pAddr = (net_address_item_t*)\r
-                               cl_vector_get_ptr( &pAdapter->ip_vector, idx );\r
-\r
-                       pOut->Address[pOut->AddressCount].IpVersion = 4;\r
-                       cl_memclr( &pOut->Address[pOut->AddressCount].Address,\r
-                               sizeof(IP_ADDRESS) );\r
-                       cl_memcpy( &pOut->Address[pOut->AddressCount].Address[12],\r
-                               pAddr->address.as_bytes, IPV4_ADDR_SIZE );\r
-\r
-                       pOut->AddressCount++;\r
-               }\r
-               cl_obj_unlock( &pAdapter->obj );\r
-       }\r
-\r
-       pOut->Size = sizeof(IOCTL_IBAT_IP_ADDRESSES_OUT);\r
-       if( --nIps )\r
-               pOut->Size += sizeof(IP_ADDRESS) * nIps;\r
-\r
-       pIrp->IoStatus.Information = sizeof(IOCTL_IBAT_IP_ADDRESSES_OUT);\r
-       if( --maxIps < nIps )\r
-               pIrp->IoStatus.Information += (sizeof(IP_ADDRESS) * maxIps);\r
-       else\r
-               pIrp->IoStatus.Information += (sizeof(IP_ADDRESS) * nIps);\r
-\r
-       KeReleaseInStackQueuedSpinLock( &hdl );\r
-       IPOIB_EXIT( IPOIB_DBG_IOCTL );\r
-       return STATUS_SUCCESS;\r
-}\r
-\r
-\r
-static NTSTATUS\r
-__ibat_mac_to_gid(\r
-       IN                              IRP                                                     *pIrp,\r
-       IN                              IO_STACK_LOCATION                       *pIoStack )\r
-{\r
-       NTSTATUS                                        status = STATUS_INVALID_PARAMETER;\r
-       IOCTL_IBAT_MAC_TO_GID_IN        *pIn;\r
-       IOCTL_IBAT_MAC_TO_GID_OUT       *pOut;\r
-       KLOCK_QUEUE_HANDLE                      hdl;\r
-       cl_list_item_t                          *pItem;\r
-       ipoib_adapter_t                         *pAdapter;\r
-\r
-       IPOIB_ENTER(IPOIB_DBG_IOCTL);\r
-\r
-       if( pIoStack->Parameters.DeviceIoControl.InputBufferLength !=\r
-               sizeof(IOCTL_IBAT_MAC_TO_GID_IN) )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Invalid input buffer size.\n") );\r
-               return STATUS_INVALID_PARAMETER;\r
-       }\r
-       \r
-       if( pIoStack->Parameters.DeviceIoControl.OutputBufferLength !=\r
-               sizeof(IOCTL_IBAT_MAC_TO_GID_OUT) )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Invalid output buffer size.\n") );\r
-               return STATUS_INVALID_PARAMETER;\r
-       }\r
-\r
-       pIn = pIrp->AssociatedIrp.SystemBuffer;\r
-       pOut = pIrp->AssociatedIrp.SystemBuffer;\r
-\r
-       if( pIn->Version != IBAT_IOCTL_VERSION )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Invalid version.\n") );\r
-               return STATUS_INVALID_PARAMETER;\r
-       }\r
-\r
-       KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
-\r
-       for( pItem = cl_qlist_head( &g_ipoib.adapter_list );\r
-               pItem != cl_qlist_end( &g_ipoib.adapter_list );\r
-               pItem = cl_qlist_next( pItem ) )\r
-       {\r
-               pAdapter = CONTAINING_RECORD( pItem, ipoib_adapter_t, entry );\r
-               if( pIn->PortGuid != pAdapter->guids.port_guid.guid )\r
-                       continue;\r
-\r
-               /* Found the port - lookup the MAC. */\r
-               cl_obj_lock( &pAdapter->obj );\r
-               if( pAdapter->p_port )\r
-               {\r
-                       status = ipoib_mac_to_gid(\r
-                               pAdapter->p_port, *(mac_addr_t*)pIn->DestMac, &pOut->DestGid );\r
-                       if( NT_SUCCESS( status ) )\r
-                       {\r
-                               pIrp->IoStatus.Information =\r
-                                       sizeof(IOCTL_IBAT_MAC_TO_GID_OUT);\r
-                       }\r
-               }\r
-               cl_obj_unlock( &pAdapter->obj );\r
-               break;\r
-       }\r
-\r
-       KeReleaseInStackQueuedSpinLock( &hdl );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_IOCTL );\r
-       return status;\r
-}\r
-\r
-\r
-static NTSTATUS\r
-__ibat_mac_to_path(\r
-       IN                              IRP                                                     *pIrp,\r
-       IN                              IO_STACK_LOCATION                       *pIoStack )\r
-{\r
-       NTSTATUS                                        status = STATUS_INVALID_PARAMETER;\r
-       IOCTL_IBAT_MAC_TO_PATH_IN       *pIn;\r
-       IOCTL_IBAT_MAC_TO_PATH_OUT      *pOut;\r
-       KLOCK_QUEUE_HANDLE                      hdl;\r
-       cl_list_item_t                          *pItem;\r
-       ipoib_adapter_t                         *pAdapter;\r
-\r
-       IPOIB_ENTER(IPOIB_DBG_IOCTL);\r
-\r
-       if( pIoStack->Parameters.DeviceIoControl.InputBufferLength !=\r
-               sizeof(IOCTL_IBAT_MAC_TO_PATH_IN) )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Invalid input buffer size.\n") );\r
-               return STATUS_INVALID_PARAMETER;\r
-       }\r
-       \r
-       if( pIoStack->Parameters.DeviceIoControl.OutputBufferLength !=\r
-               sizeof(IOCTL_IBAT_MAC_TO_PATH_OUT) )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Invalid output buffer size.\n") );\r
-               return STATUS_INVALID_PARAMETER;\r
-       }\r
-\r
-       pIn = pIrp->AssociatedIrp.SystemBuffer;\r
-       pOut = pIrp->AssociatedIrp.SystemBuffer;\r
-\r
-       if( pIn->Version != IBAT_IOCTL_VERSION )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Invalid version.\n") );\r
-               return STATUS_INVALID_PARAMETER;\r
-       }\r
-\r
-       KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
-\r
-       for( pItem = cl_qlist_head( &g_ipoib.adapter_list );\r
-               pItem != cl_qlist_end( &g_ipoib.adapter_list );\r
-               pItem = cl_qlist_next( pItem ) )\r
-       {\r
-               pAdapter = CONTAINING_RECORD( pItem, ipoib_adapter_t, entry );\r
-               if( pIn->PortGuid != pAdapter->guids.port_guid.guid )\r
-                       continue;\r
-\r
-               /* Found the port - lookup the MAC. */\r
-               cl_obj_lock( &pAdapter->obj );\r
-               if( pAdapter->p_port )\r
-               {\r
-                       status = ipoib_mac_to_path(\r
-                               pAdapter->p_port, *(mac_addr_t*)pIn->DestMac, &pOut->Path );\r
-\r
-                       if( NT_SUCCESS( status ) )\r
-                       {\r
-                               pIrp->IoStatus.Information =\r
-                                       sizeof(IOCTL_IBAT_MAC_TO_PATH_OUT);\r
-                       }\r
-               }\r
-               cl_obj_unlock( &pAdapter->obj );\r
-               break;\r
-       }\r
-\r
-       KeReleaseInStackQueuedSpinLock( &hdl );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_IOCTL );\r
-       return status;\r
-}\r
-\r
-\r
-static NTSTATUS\r
-__ibat_ip_to_port(\r
-       IN                              IRP                                                     *pIrp,\r
-       IN                              IO_STACK_LOCATION                       *pIoStack )\r
-{\r
-       IOCTL_IBAT_IP_TO_PORT_IN        *pIn;\r
-       IOCTL_IBAT_IP_TO_PORT_OUT       *pOut;\r
-       KLOCK_QUEUE_HANDLE                      hdl;\r
-       cl_list_item_t                                  *pItem;\r
-       ipoib_adapter_t                         *pAdapter;\r
-       size_t                                          idx;\r
-       net_address_item_t                      *pAddr;\r
-       NTSTATUS status = STATUS_NOT_FOUND;\r
-\r
-       IPOIB_ENTER(IPOIB_DBG_IOCTL);\r
-\r
-       if( pIoStack->Parameters.DeviceIoControl.InputBufferLength !=\r
-               sizeof(IOCTL_IBAT_IP_TO_PORT_IN) )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Invalid input buffer size.\n") );\r
-               return STATUS_INVALID_PARAMETER;\r
-       }\r
-       \r
-       if( pIoStack->Parameters.DeviceIoControl.OutputBufferLength !=\r
-               sizeof(IOCTL_IBAT_IP_TO_PORT_OUT) )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Invalid output buffer size.\n") );\r
-               return STATUS_INVALID_PARAMETER;\r
-       }\r
-\r
-       pIn = pIrp->AssociatedIrp.SystemBuffer;\r
-       pOut = pIrp->AssociatedIrp.SystemBuffer;\r
-\r
-       if( pIn->Version != IBAT_IOCTL_VERSION )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Invalid version.\n") );\r
-               return STATUS_INVALID_PARAMETER;\r
-       }\r
-\r
-       if (pIn->Address.IpVersion != 4)\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Invalid IP version (%d). Supported only 4\n", pIn->Address.IpVersion) );\r
-               return STATUS_INVALID_PARAMETER;\r
-       }\r
-\r
-       KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
-       for( pItem = cl_qlist_head( &g_ipoib.adapter_list );\r
-               pItem != cl_qlist_end( &g_ipoib.adapter_list );\r
-               pItem = cl_qlist_next( pItem ) )\r
-       {\r
-               pAdapter = CONTAINING_RECORD( pItem, ipoib_adapter_t, entry );\r
-\r
-               cl_obj_lock( &pAdapter->obj );\r
-\r
-               for( idx = 0;\r
-                       idx < cl_vector_get_size( &pAdapter->ip_vector );\r
-                       idx++ )\r
-               {\r
-                       pAddr = (net_address_item_t*)\r
-                               cl_vector_get_ptr( &pAdapter->ip_vector, idx );\r
-\r
-                       if (!memcmp( &pIn->Address.Address[12], pAddr->address.as_bytes, IPV4_ADDR_SIZE))\r
-                       {\r
-                               pOut->Port.CaGuid = pAdapter->guids.ca_guid;\r
-                               pOut->Port.PortGuid = pAdapter->guids.port_guid.guid;\r
-                               pOut->Port.PKey = IB_DEFAULT_PKEY;\r
-                               pOut->Port.PortNum = pAdapter->guids.port_num;\r
-                               pIrp->IoStatus.Information = sizeof(IOCTL_IBAT_IP_TO_PORT_OUT);\r
-                               status = STATUS_SUCCESS;\r
-                               break;\r
-                       }\r
-               }\r
-               cl_obj_unlock( &pAdapter->obj );\r
-               if (status == STATUS_SUCCESS)\r
-                       break;\r
-       }\r
-\r
-       KeReleaseInStackQueuedSpinLock( &hdl );\r
-       IPOIB_EXIT( IPOIB_DBG_IOCTL );\r
-       return status;\r
-}\r
-\r
-void\r
-ipoib_ref_ibat()\r
-{\r
-       UNICODE_STRING      DeviceName;\r
-    UNICODE_STRING      DeviceLinkUnicodeString;\r
-    NDIS_DEVICE_OBJECT_ATTRIBUTES   DeviceObjectAttributes;\r
-    PDRIVER_DISPATCH    DispatchTable[IRP_MJ_MAXIMUM_FUNCTION+1];\r
-\r
-       NDIS_STATUS         Status = NDIS_STATUS_SUCCESS;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_IOCTL );\r
-\r
-       if( InterlockedIncrement( &g_ipoib.ibat_ref ) == 1 )\r
-       {\r
-\r
-               NdisZeroMemory(DispatchTable, (IRP_MJ_MAXIMUM_FUNCTION+1) * sizeof(PDRIVER_DISPATCH));\r
-                               \r
-               DispatchTable[IRP_MJ_CREATE]                                    = __ipoib_create;\r
-               DispatchTable[IRP_MJ_CLEANUP]                                   = __ipoib_cleanup;\r
-               DispatchTable[IRP_MJ_CLOSE]                                             = __ipoib_close;\r
-               DispatchTable[IRP_MJ_DEVICE_CONTROL]                    = __ipoib_dispatch;\r
-               DispatchTable[IRP_MJ_INTERNAL_DEVICE_CONTROL]   = __ipoib_dispatch;             \r
-               \r
-                               \r
-               NdisInitUnicodeString( &DeviceName, IBAT_DEV_NAME );\r
-               NdisInitUnicodeString( &DeviceLinkUnicodeString, IBAT_DOS_DEV_NAME );\r
-                               \r
-               \r
-               NdisZeroMemory(&DeviceObjectAttributes, sizeof(NDIS_DEVICE_OBJECT_ATTRIBUTES));\r
-               \r
-               DeviceObjectAttributes.Header.Type = NDIS_OBJECT_TYPE_DEFAULT; // type implicit from the context\r
-               DeviceObjectAttributes.Header.Revision = NDIS_DEVICE_OBJECT_ATTRIBUTES_REVISION_1;\r
-               DeviceObjectAttributes.Header.Size = sizeof(NDIS_DEVICE_OBJECT_ATTRIBUTES);\r
-               DeviceObjectAttributes.DeviceName = &DeviceName;\r
-               DeviceObjectAttributes.SymbolicName = &DeviceLinkUnicodeString;\r
-               DeviceObjectAttributes.MajorFunctions = &DispatchTable[0];\r
-               DeviceObjectAttributes.ExtensionSize = 0;\r
-               DeviceObjectAttributes.DefaultSDDLString = NULL;\r
-               DeviceObjectAttributes.DeviceClassGuid = 0;\r
-               \r
-               Status = NdisRegisterDeviceEx(\r
-                                                       g_IpoibMiniportDriverHandle,\r
-                                                       &DeviceObjectAttributes,\r
-                                                       &g_ipoib.h_ibat_dev,\r
-                                                       &g_ipoib.h_ibat_dev_handle);\r
-\r
-\r
-       \r
-               if( Status != NDIS_STATUS_SUCCESS )\r
-               {\r
-                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, \r
-                               ("NdisRegisterDeviceEx failed with status of %d\n", Status) );\r
-               }\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_IOCTL );\r
-}\r
-\r
-\r
-void\r
-ipoib_deref_ibat()\r
-{\r
-       IPOIB_ENTER( IPOIB_DBG_IOCTL );\r
-\r
-       if( InterlockedDecrement( &g_ipoib.ibat_ref ) )\r
-       {\r
-               IPOIB_EXIT( IPOIB_DBG_IOCTL );\r
-               return;\r
-       }\r
-\r
-       if( g_ipoib.h_ibat_dev )\r
-       {\r
-               NdisDeregisterDeviceEx( g_ipoib.h_ibat_dev_handle );\r
-               g_ipoib.h_ibat_dev = NULL;\r
-               g_ipoib.h_ibat_dev_handle = NULL; //TODO set here INVALID_HANDLE_VALUE\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_IOCTL );\r
-}\r
-\r
-\r
-static NTSTATUS\r
-__ipoib_create(\r
-       IN                              DEVICE_OBJECT* const            pDevObj,\r
-       IN                              IRP* const                                      pIrp )\r
-{\r
-       IPOIB_ENTER( IPOIB_DBG_IOCTL );\r
-\r
-       UNREFERENCED_PARAMETER( pDevObj );\r
-\r
-       ipoib_ref_ibat();\r
-\r
-       pIrp->IoStatus.Status = STATUS_SUCCESS;\r
-       pIrp->IoStatus.Information = 0;\r
-       IoCompleteRequest( pIrp, IO_NO_INCREMENT );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_IOCTL );\r
-       return STATUS_SUCCESS;\r
-}\r
-\r
-\r
-static NTSTATUS\r
-__ipoib_cleanup(\r
-       IN                              DEVICE_OBJECT* const            pDevObj,\r
-       IN                              IRP* const                                      pIrp )\r
-{\r
-       IPOIB_ENTER( IPOIB_DBG_IOCTL );\r
-\r
-       UNREFERENCED_PARAMETER( pDevObj );\r
-\r
-       ipoib_deref_ibat();\r
-\r
-       pIrp->IoStatus.Status = STATUS_SUCCESS;\r
-       pIrp->IoStatus.Information = 0;\r
-       IoCompleteRequest( pIrp, IO_NO_INCREMENT );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_IOCTL );\r
-       return STATUS_SUCCESS;\r
-}\r
-\r
-\r
-static NTSTATUS\r
-__ipoib_close(\r
-       IN                              DEVICE_OBJECT* const            pDevObj,\r
-       IN                              IRP* const                                      pIrp )\r
-{\r
-       IPOIB_ENTER( IPOIB_DBG_IOCTL );\r
-\r
-       UNREFERENCED_PARAMETER( pDevObj );\r
-\r
-       pIrp->IoStatus.Status = STATUS_SUCCESS;\r
-       pIrp->IoStatus.Information = 0;\r
-       IoCompleteRequest( pIrp, IO_NO_INCREMENT );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_IOCTL );\r
-       return STATUS_SUCCESS;\r
-}\r
-\r
-\r
-static NTSTATUS\r
-__ipoib_dispatch(\r
-       IN                              DEVICE_OBJECT* const            pDevObj,\r
-       IN                              IRP* const                                      pIrp )\r
-{\r
-       IO_STACK_LOCATION       *pIoStack;\r
-       NTSTATUS                        status = STATUS_SUCCESS;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_IOCTL );\r
-\r
-       UNREFERENCED_PARAMETER( pDevObj );\r
-\r
-       pIoStack = IoGetCurrentIrpStackLocation( pIrp );\r
-\r
-       pIrp->IoStatus.Information = 0;\r
-\r
-       switch( pIoStack->Parameters.DeviceIoControl.IoControlCode )\r
-       {\r
-       case IOCTL_IBAT_PORTS:\r
-               IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_IOCTL,\r
-                       ("IOCTL_IBAT_PORTS received\n") );\r
-               status = __ibat_get_ports( pIrp, pIoStack );\r
-               break;\r
-\r
-       case IOCTL_IBAT_IP_ADDRESSES:\r
-               IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_IOCTL,\r
-                       ("IOCTL_IBAT_IP_ADDRESSES received\n" ));\r
-               status = __ibat_get_ips( pIrp, pIoStack );\r
-               break;\r
-\r
-       case IOCTL_IBAT_MAC_TO_GID:\r
-               IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_IOCTL,\r
-                       ("IOCTL_IBAT_MAC_TO_GID received\n" ));\r
-               status = __ibat_mac_to_gid( pIrp, pIoStack );\r
-               break;\r
-\r
-       case IOCTL_IBAT_IP_TO_PORT:\r
-               IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_IOCTL,\r
-                       ("IOCTL_IBAT_IP_TO_PORT received\n" ));\r
-               status = __ibat_ip_to_port( pIrp, pIoStack );\r
-               break;\r
-\r
-       case IOCTL_IBAT_MAC_TO_PATH:\r
-               IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_IOCTL,\r
-                       ("IOCTL_IBAT_MAC_TO_PATH received\n" ));\r
-               status = __ibat_mac_to_path( pIrp, pIoStack );\r
-               break;\r
-\r
-       default:\r
-               IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_IOCTL,\r
-                       ("unknow IOCTL code = 0x%x\n",\r
-                       pIoStack->Parameters.DeviceIoControl.IoControlCode) );\r
-               status = STATUS_INVALID_PARAMETER;\r
-       }\r
-\r
-       pIrp->IoStatus.Status = status;\r
-       IoCompleteRequest( pIrp, IO_NO_INCREMENT );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_IOCTL );\r
-       return status;\r
-}\r
-\r
-\r
diff --git a/branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_ibat.cpp b/branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_ibat.cpp
new file mode 100644 (file)
index 0000000..1e207bc
--- /dev/null
@@ -0,0 +1,693 @@
+/*\r
+ * Copyright (c) 2005 Mellanox Technologies.  All rights reserved.\r
+ * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
+ * Portions Copyright (c) 2008 Microsoft Corporation.  All rights reserved.\r
+ *\r
+ * This software is available to you under the OpenIB.org BSD license\r
+ * below:\r
+ *\r
+ *     Redistribution and use in source and binary forms, with or\r
+ *     without modification, are permitted provided that the following\r
+ *     conditions are met:\r
+ *\r
+ *      - Redistributions of source code must retain the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer.\r
+ *\r
+ *      - Redistributions in binary form must reproduce the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer in the documentation and/or other materials\r
+ *        provided with the distribution.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
+ * SOFTWARE.\r
+ *\r
+ * $Id: ipoib_ibat.c 4494 2009-06-22 14:31:08Z xalex $\r
+ */\r
+\r
+\r
+#include "ipoib_driver.h"\r
+#include "ipoib_adapter.h"\r
+#include "ipoib_port.h"\r
+#include "ipoib_debug.h"\r
+#if defined(EVENT_TRACING)\r
+#ifdef offsetof\r
+#undef offsetof\r
+#endif\r
+#include "ipoib_ibat.tmh"\r
+#endif\r
+#include <iba/ib_at_ioctl.h>\r
+\r
+extern PDRIVER_OBJECT                          g_p_drv_obj;\r
+\r
+static NTSTATUS\r
+__ipoib_create(\r
+       IN                              DEVICE_OBJECT* const            pDevObj,\r
+       IN                              IRP* const                                      pIrp );\r
+\r
+static NTSTATUS\r
+__ipoib_cleanup(\r
+       IN                              DEVICE_OBJECT* const            pDevObj,\r
+       IN                              IRP* const                                      pIrp );\r
+\r
+static NTSTATUS\r
+__ipoib_close(\r
+       IN                              DEVICE_OBJECT* const            pDevObj,\r
+       IN                              IRP* const                                      pIrp );\r
+\r
+static NTSTATUS\r
+__ipoib_dispatch(\r
+       IN                              DEVICE_OBJECT* const            pDevObj,\r
+       IN                              IRP* const                                      pIrp );\r
+\r
+\r
+static NTSTATUS\r
+__ibat_get_ports(\r
+       IN                              IRP                                                     *pIrp,\r
+       IN                              IO_STACK_LOCATION                       *pIoStack )\r
+{\r
+       IOCTL_IBAT_PORTS_IN             *pIn;\r
+       IOCTL_IBAT_PORTS_OUT    *pOut;\r
+       KLOCK_QUEUE_HANDLE              hdl;\r
+       cl_list_item_t                  *pItem;\r
+       ipoib_adapter_t                 *pAdapter;\r
+       LONG                                    nPorts;\r
+\r
+       IPOIB_ENTER(IPOIB_DBG_IOCTL);\r
+\r
+       if( pIoStack->Parameters.DeviceIoControl.InputBufferLength !=\r
+               sizeof(IOCTL_IBAT_PORTS_IN) )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Invalid input buffer size.\n") );\r
+               return STATUS_INVALID_PARAMETER;\r
+       }\r
+       \r
+       if( pIoStack->Parameters.DeviceIoControl.OutputBufferLength <\r
+               sizeof(IOCTL_IBAT_PORTS_OUT) )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Invalid output buffer size.\n") );\r
+               return STATUS_INVALID_PARAMETER;\r
+       }\r
+\r
+       pIn = (IOCTL_IBAT_PORTS_IN *) pIrp->AssociatedIrp.SystemBuffer;\r
+       pOut = (IOCTL_IBAT_PORTS_OUT *) pIrp->AssociatedIrp.SystemBuffer;\r
+\r
+       if( pIn->Version != IBAT_IOCTL_VERSION )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Invalid version.\n") );\r
+               return STATUS_INVALID_PARAMETER;\r
+       }\r
+\r
+       KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
+       nPorts = (LONG)cl_qlist_count( &g_ipoib.adapter_list );\r
+       switch( nPorts )\r
+       {\r
+       case 0:\r
+               cl_memclr( pOut->Ports, sizeof(pOut->Ports) );\r
+               /* Fall through */\r
+       case 1:\r
+               pOut->Size = sizeof(IOCTL_IBAT_PORTS_OUT);\r
+               break;\r
+\r
+       default:\r
+               pOut->Size = sizeof(IOCTL_IBAT_PORTS_OUT) + \r
+                       (sizeof(IBAT_PORT_RECORD) * (nPorts - 1));\r
+               break;\r
+       }\r
+\r
+       pIrp->IoStatus.Information = pOut->Size;\r
+\r
+       if( pOut->Size > pIoStack->Parameters.DeviceIoControl.OutputBufferLength )\r
+       {\r
+               nPorts = 1 +\r
+                       (pIoStack->Parameters.DeviceIoControl.OutputBufferLength -\r
+                       sizeof(IOCTL_IBAT_PORTS_OUT)) / sizeof(IBAT_PORT_RECORD);\r
+\r
+               pIrp->IoStatus.Information = sizeof(IOCTL_IBAT_PORTS_OUT) +\r
+                       ((nPorts - 1) * sizeof(IBAT_PORT_RECORD));\r
+       }\r
+\r
+       pOut->NumPorts = 0;\r
+       pItem = cl_qlist_head( &g_ipoib.adapter_list );\r
+       while( pOut->NumPorts != nPorts )\r
+       {\r
+               pAdapter = CONTAINING_RECORD( pItem, ipoib_adapter_t, entry );\r
+               pOut->Ports[pOut->NumPorts].CaGuid = pAdapter->guids.ca_guid;\r
+               pOut->Ports[pOut->NumPorts].PortGuid = pAdapter->guids.port_guid.guid;\r
+               pOut->Ports[pOut->NumPorts].PKey = IB_DEFAULT_PKEY;\r
+               pOut->Ports[pOut->NumPorts].PortNum = pAdapter->guids.port_num;\r
+               pOut->NumPorts++;\r
+\r
+               pItem = cl_qlist_next( pItem );\r
+       }\r
+\r
+       KeReleaseInStackQueuedSpinLock( &hdl );\r
+       IPOIB_EXIT( IPOIB_DBG_IOCTL );\r
+       return STATUS_SUCCESS;\r
+}\r
+\r
+\r
+static NTSTATUS\r
+__ibat_get_ips(\r
+       IN                              IRP                                                     *pIrp,\r
+       IN                              IO_STACK_LOCATION                       *pIoStack )\r
+{\r
+       IOCTL_IBAT_IP_ADDRESSES_IN      *pIn;\r
+       IOCTL_IBAT_IP_ADDRESSES_OUT     *pOut;\r
+       KLOCK_QUEUE_HANDLE                      hdl;\r
+       cl_list_item_t                          *pItem;\r
+       ipoib_adapter_t                         *pAdapter;\r
+       LONG                                            nIps, maxIps;\r
+       size_t                                          idx;\r
+       net_address_item_t                      *pAddr;\r
+       UINT64                                          PortGuid;\r
+\r
+       IPOIB_ENTER(IPOIB_DBG_IOCTL);\r
+\r
+       if( pIoStack->Parameters.DeviceIoControl.InputBufferLength !=\r
+               sizeof(IOCTL_IBAT_IP_ADDRESSES_IN) )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Invalid input buffer size.\n") );\r
+               return STATUS_INVALID_PARAMETER;\r
+       }\r
+       \r
+       if( pIoStack->Parameters.DeviceIoControl.OutputBufferLength <\r
+               sizeof(IOCTL_IBAT_IP_ADDRESSES_OUT) )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Invalid output buffer size.\n") );\r
+               return STATUS_INVALID_PARAMETER;\r
+       }\r
+\r
+       pIn = (IOCTL_IBAT_IP_ADDRESSES_IN *) pIrp->AssociatedIrp.SystemBuffer;\r
+       pOut = (IOCTL_IBAT_IP_ADDRESSES_OUT *) pIrp->AssociatedIrp.SystemBuffer;\r
+\r
+       if( pIn->Version != IBAT_IOCTL_VERSION )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Invalid version.\n") );\r
+               return STATUS_INVALID_PARAMETER;\r
+       }\r
+\r
+       PortGuid = pIn->PortGuid;\r
+\r
+       nIps = 0;\r
+       pOut->AddressCount = 0;\r
+       maxIps = 1 +\r
+               ((pIoStack->Parameters.DeviceIoControl.OutputBufferLength -\r
+               sizeof(IOCTL_IBAT_IP_ADDRESSES_OUT)) / sizeof(IP_ADDRESS));\r
+\r
+       KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
+       for( pItem = cl_qlist_head( &g_ipoib.adapter_list );\r
+               pItem != cl_qlist_end( &g_ipoib.adapter_list );\r
+               pItem = cl_qlist_next( pItem ) )\r
+       {\r
+               pAdapter = CONTAINING_RECORD( pItem, ipoib_adapter_t, entry );\r
+               if( PortGuid && pAdapter->guids.port_guid.guid != PortGuid )\r
+                       continue;\r
+\r
+               cl_obj_lock( &pAdapter->obj );\r
+               nIps += (LONG)cl_vector_get_size( &pAdapter->ip_vector );\r
+\r
+               for( idx = 0;\r
+                       idx < cl_vector_get_size( &pAdapter->ip_vector );\r
+                       idx++ )\r
+               {\r
+                       if( pOut->AddressCount == maxIps )\r
+                               break;\r
+\r
+                       pAddr = (net_address_item_t*)\r
+                               cl_vector_get_ptr( &pAdapter->ip_vector, idx );\r
+\r
+                       pOut->Address[pOut->AddressCount].IpVersion = 4;\r
+                       cl_memclr( &pOut->Address[pOut->AddressCount].Address,\r
+                               sizeof(IP_ADDRESS) );\r
+                       cl_memcpy( &pOut->Address[pOut->AddressCount].Address[12],\r
+                               pAddr->address.as_bytes, IPV4_ADDR_SIZE );\r
+\r
+                       pOut->AddressCount++;\r
+               }\r
+               cl_obj_unlock( &pAdapter->obj );\r
+       }\r
+\r
+       pOut->Size = sizeof(IOCTL_IBAT_IP_ADDRESSES_OUT);\r
+       if( --nIps )\r
+               pOut->Size += sizeof(IP_ADDRESS) * nIps;\r
+\r
+       pIrp->IoStatus.Information = sizeof(IOCTL_IBAT_IP_ADDRESSES_OUT);\r
+       if( --maxIps < nIps )\r
+               pIrp->IoStatus.Information += (sizeof(IP_ADDRESS) * maxIps);\r
+       else\r
+               pIrp->IoStatus.Information += (sizeof(IP_ADDRESS) * nIps);\r
+\r
+       KeReleaseInStackQueuedSpinLock( &hdl );\r
+       IPOIB_EXIT( IPOIB_DBG_IOCTL );\r
+       return STATUS_SUCCESS;\r
+}\r
+\r
+\r
+static NTSTATUS\r
+__ibat_mac_to_gid(\r
+       IN                              IRP                                                     *pIrp,\r
+       IN                              IO_STACK_LOCATION                       *pIoStack )\r
+{\r
+       NTSTATUS                                        status = STATUS_INVALID_PARAMETER;\r
+       IOCTL_IBAT_MAC_TO_GID_IN        *pIn;\r
+       IOCTL_IBAT_MAC_TO_GID_OUT       *pOut;\r
+       KLOCK_QUEUE_HANDLE                      hdl;\r
+       cl_list_item_t                          *pItem;\r
+       ipoib_adapter_t                         *pAdapter;\r
+\r
+       IPOIB_ENTER(IPOIB_DBG_IOCTL);\r
+\r
+       if( pIoStack->Parameters.DeviceIoControl.InputBufferLength !=\r
+               sizeof(IOCTL_IBAT_MAC_TO_GID_IN) )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Invalid input buffer size.\n") );\r
+               return STATUS_INVALID_PARAMETER;\r
+       }\r
+       \r
+       if( pIoStack->Parameters.DeviceIoControl.OutputBufferLength !=\r
+               sizeof(IOCTL_IBAT_MAC_TO_GID_OUT) )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Invalid output buffer size.\n") );\r
+               return STATUS_INVALID_PARAMETER;\r
+       }\r
+\r
+       pIn = (IOCTL_IBAT_MAC_TO_GID_IN *) pIrp->AssociatedIrp.SystemBuffer;\r
+       pOut = (IOCTL_IBAT_MAC_TO_GID_OUT *) pIrp->AssociatedIrp.SystemBuffer;\r
+\r
+       if( pIn->Version != IBAT_IOCTL_VERSION )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Invalid version.\n") );\r
+               return STATUS_INVALID_PARAMETER;\r
+       }\r
+\r
+       KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
+\r
+       for( pItem = cl_qlist_head( &g_ipoib.adapter_list );\r
+               pItem != cl_qlist_end( &g_ipoib.adapter_list );\r
+               pItem = cl_qlist_next( pItem ) )\r
+       {\r
+               pAdapter = CONTAINING_RECORD( pItem, ipoib_adapter_t, entry );\r
+               if( pIn->PortGuid != pAdapter->guids.port_guid.guid )\r
+                       continue;\r
+\r
+               /* Found the port - lookup the MAC. */\r
+               cl_obj_lock( &pAdapter->obj );\r
+               if( pAdapter->p_port )\r
+               {\r
+                       status = ipoib_mac_to_gid(\r
+                               pAdapter->p_port, *(mac_addr_t*)pIn->DestMac, &pOut->DestGid );\r
+                       if( NT_SUCCESS( status ) )\r
+                       {\r
+                               pIrp->IoStatus.Information =\r
+                                       sizeof(IOCTL_IBAT_MAC_TO_GID_OUT);\r
+                       }\r
+               }\r
+               cl_obj_unlock( &pAdapter->obj );\r
+               break;\r
+       }\r
+\r
+       KeReleaseInStackQueuedSpinLock( &hdl );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_IOCTL );\r
+       return status;\r
+}\r
+\r
+\r
+static NTSTATUS\r
+__ibat_mac_to_path(\r
+       IN                              IRP                                                     *pIrp,\r
+       IN                              IO_STACK_LOCATION                       *pIoStack )\r
+{\r
+       NTSTATUS                                        status = STATUS_INVALID_PARAMETER;\r
+       IOCTL_IBAT_MAC_TO_PATH_IN       *pIn;\r
+       IOCTL_IBAT_MAC_TO_PATH_OUT      *pOut;\r
+       KLOCK_QUEUE_HANDLE                      hdl;\r
+       cl_list_item_t                          *pItem;\r
+       ipoib_adapter_t                         *pAdapter;\r
+\r
+       IPOIB_ENTER(IPOIB_DBG_IOCTL);\r
+\r
+       if( pIoStack->Parameters.DeviceIoControl.InputBufferLength !=\r
+               sizeof(IOCTL_IBAT_MAC_TO_PATH_IN) )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Invalid input buffer size.\n") );\r
+               return STATUS_INVALID_PARAMETER;\r
+       }\r
+       \r
+       if( pIoStack->Parameters.DeviceIoControl.OutputBufferLength !=\r
+               sizeof(IOCTL_IBAT_MAC_TO_PATH_OUT) )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Invalid output buffer size.\n") );\r
+               return STATUS_INVALID_PARAMETER;\r
+       }\r
+\r
+       pIn = (IOCTL_IBAT_MAC_TO_PATH_IN *) pIrp->AssociatedIrp.SystemBuffer;\r
+       pOut = (IOCTL_IBAT_MAC_TO_PATH_OUT *) pIrp->AssociatedIrp.SystemBuffer;\r
+\r
+       if( pIn->Version != IBAT_IOCTL_VERSION )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Invalid version.\n") );\r
+               return STATUS_INVALID_PARAMETER;\r
+       }\r
+\r
+       KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
+\r
+       for( pItem = cl_qlist_head( &g_ipoib.adapter_list );\r
+               pItem != cl_qlist_end( &g_ipoib.adapter_list );\r
+               pItem = cl_qlist_next( pItem ) )\r
+       {\r
+               pAdapter = CONTAINING_RECORD( pItem, ipoib_adapter_t, entry );\r
+               if( pIn->PortGuid != pAdapter->guids.port_guid.guid )\r
+                       continue;\r
+\r
+               /* Found the port - lookup the MAC. */\r
+               cl_obj_lock( &pAdapter->obj );\r
+               if( pAdapter->p_port )\r
+               {\r
+                       status = ipoib_mac_to_path(\r
+                               pAdapter->p_port, *(mac_addr_t*)pIn->DestMac, &pOut->Path );\r
+\r
+                       if( NT_SUCCESS( status ) )\r
+                       {\r
+                               pIrp->IoStatus.Information =\r
+                                       sizeof(IOCTL_IBAT_MAC_TO_PATH_OUT);\r
+                       }\r
+               }\r
+               cl_obj_unlock( &pAdapter->obj );\r
+               break;\r
+       }\r
+\r
+       KeReleaseInStackQueuedSpinLock( &hdl );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_IOCTL );\r
+       return status;\r
+}\r
+\r
+\r
+static NTSTATUS\r
+__ibat_ip_to_port(\r
+       IN                              IRP                                                     *pIrp,\r
+       IN                              IO_STACK_LOCATION                       *pIoStack )\r
+{\r
+       IOCTL_IBAT_IP_TO_PORT_IN        *pIn;\r
+       IOCTL_IBAT_IP_TO_PORT_OUT       *pOut;\r
+       KLOCK_QUEUE_HANDLE                      hdl;\r
+       cl_list_item_t                                  *pItem;\r
+       ipoib_adapter_t                         *pAdapter;\r
+       size_t                                          idx;\r
+       net_address_item_t                      *pAddr;\r
+       NTSTATUS status = STATUS_NOT_FOUND;\r
+\r
+       IPOIB_ENTER(IPOIB_DBG_IOCTL);\r
+\r
+       if( pIoStack->Parameters.DeviceIoControl.InputBufferLength !=\r
+               sizeof(IOCTL_IBAT_IP_TO_PORT_IN) )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Invalid input buffer size.\n") );\r
+               return STATUS_INVALID_PARAMETER;\r
+       }\r
+       \r
+       if( pIoStack->Parameters.DeviceIoControl.OutputBufferLength !=\r
+               sizeof(IOCTL_IBAT_IP_TO_PORT_OUT) )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Invalid output buffer size.\n") );\r
+               return STATUS_INVALID_PARAMETER;\r
+       }\r
+\r
+       pIn = (IOCTL_IBAT_IP_TO_PORT_IN *) pIrp->AssociatedIrp.SystemBuffer;\r
+       pOut = (IOCTL_IBAT_IP_TO_PORT_OUT *) pIrp->AssociatedIrp.SystemBuffer;\r
+\r
+       if( pIn->Version != IBAT_IOCTL_VERSION )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Invalid version.\n") );\r
+               return STATUS_INVALID_PARAMETER;\r
+       }\r
+\r
+       if (pIn->Address.IpVersion != 4)\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Invalid IP version (%d). Supported only 4\n", pIn->Address.IpVersion) );\r
+               return STATUS_INVALID_PARAMETER;\r
+       }\r
+\r
+       KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl );\r
+       for( pItem = cl_qlist_head( &g_ipoib.adapter_list );\r
+               pItem != cl_qlist_end( &g_ipoib.adapter_list );\r
+               pItem = cl_qlist_next( pItem ) )\r
+       {\r
+               pAdapter = CONTAINING_RECORD( pItem, ipoib_adapter_t, entry );\r
+\r
+               cl_obj_lock( &pAdapter->obj );\r
+\r
+               for( idx = 0;\r
+                       idx < cl_vector_get_size( &pAdapter->ip_vector );\r
+                       idx++ )\r
+               {\r
+                       pAddr = (net_address_item_t*)\r
+                               cl_vector_get_ptr( &pAdapter->ip_vector, idx );\r
+\r
+                       if (!memcmp( &pIn->Address.Address[12], pAddr->address.as_bytes, IPV4_ADDR_SIZE))\r
+                       {\r
+                               pOut->Port.CaGuid = pAdapter->guids.ca_guid;\r
+                               pOut->Port.PortGuid = pAdapter->guids.port_guid.guid;\r
+                               pOut->Port.PKey = IB_DEFAULT_PKEY;\r
+                               pOut->Port.PortNum = pAdapter->guids.port_num;\r
+                               pIrp->IoStatus.Information = sizeof(IOCTL_IBAT_IP_TO_PORT_OUT);\r
+                               status = STATUS_SUCCESS;\r
+                               break;\r
+                       }\r
+               }\r
+               cl_obj_unlock( &pAdapter->obj );\r
+               if (status == STATUS_SUCCESS)\r
+                       break;\r
+       }\r
+\r
+       KeReleaseInStackQueuedSpinLock( &hdl );\r
+       IPOIB_EXIT( IPOIB_DBG_IOCTL );\r
+       return status;\r
+}\r
+\r
+void\r
+ipoib_ref_ibat()\r
+{\r
+       UNICODE_STRING      DeviceName;\r
+    UNICODE_STRING      DeviceLinkUnicodeString;\r
+    NDIS_DEVICE_OBJECT_ATTRIBUTES   DeviceObjectAttributes;\r
+    PDRIVER_DISPATCH    DispatchTable[IRP_MJ_MAXIMUM_FUNCTION+1];\r
+\r
+       NDIS_STATUS         Status = NDIS_STATUS_SUCCESS;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_IOCTL );\r
+\r
+       if( InterlockedIncrement( &g_ipoib.ibat_ref ) == 1 )\r
+       {\r
+\r
+               NdisZeroMemory(DispatchTable, (IRP_MJ_MAXIMUM_FUNCTION+1) * sizeof(PDRIVER_DISPATCH));\r
+                               \r
+               DispatchTable[IRP_MJ_CREATE]                                    = __ipoib_create;\r
+               DispatchTable[IRP_MJ_CLEANUP]                                   = __ipoib_cleanup;\r
+               DispatchTable[IRP_MJ_CLOSE]                                             = __ipoib_close;\r
+               DispatchTable[IRP_MJ_DEVICE_CONTROL]                    = __ipoib_dispatch;\r
+               DispatchTable[IRP_MJ_INTERNAL_DEVICE_CONTROL]   = __ipoib_dispatch;             \r
+               \r
+                               \r
+               NdisInitUnicodeString( &DeviceName, IBAT_DEV_NAME );\r
+               NdisInitUnicodeString( &DeviceLinkUnicodeString, IBAT_DOS_DEV_NAME );\r
+                               \r
+               \r
+               NdisZeroMemory(&DeviceObjectAttributes, sizeof(NDIS_DEVICE_OBJECT_ATTRIBUTES));\r
+               \r
+               DeviceObjectAttributes.Header.Type = NDIS_OBJECT_TYPE_DEFAULT; // type implicit from the context\r
+               DeviceObjectAttributes.Header.Revision = NDIS_DEVICE_OBJECT_ATTRIBUTES_REVISION_1;\r
+               DeviceObjectAttributes.Header.Size = sizeof(NDIS_DEVICE_OBJECT_ATTRIBUTES);\r
+               DeviceObjectAttributes.DeviceName = &DeviceName;\r
+               DeviceObjectAttributes.SymbolicName = &DeviceLinkUnicodeString;\r
+               DeviceObjectAttributes.MajorFunctions = &DispatchTable[0];\r
+               DeviceObjectAttributes.ExtensionSize = 0;\r
+               DeviceObjectAttributes.DefaultSDDLString = NULL;\r
+               DeviceObjectAttributes.DeviceClassGuid = 0;\r
+               \r
+               Status = NdisRegisterDeviceEx(\r
+                                                       g_IpoibMiniportDriverHandle,\r
+                                                       &DeviceObjectAttributes,\r
+                                                       &g_ipoib.h_ibat_dev,\r
+                                                       &g_ipoib.h_ibat_dev_handle);\r
+\r
+\r
+       \r
+               if( Status != NDIS_STATUS_SUCCESS )\r
+               {\r
+                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, \r
+                               ("NdisRegisterDeviceEx failed with status of %d\n", Status) );\r
+               }\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_IOCTL );\r
+}\r
+\r
+\r
+void\r
+ipoib_deref_ibat()\r
+{\r
+       IPOIB_ENTER( IPOIB_DBG_IOCTL );\r
+\r
+       if( InterlockedDecrement( &g_ipoib.ibat_ref ) )\r
+       {\r
+               IPOIB_EXIT( IPOIB_DBG_IOCTL );\r
+               return;\r
+       }\r
+\r
+       if( g_ipoib.h_ibat_dev )\r
+       {\r
+               NdisDeregisterDeviceEx( g_ipoib.h_ibat_dev_handle );\r
+               g_ipoib.h_ibat_dev = NULL;\r
+               g_ipoib.h_ibat_dev_handle = NULL; //TODO set here INVALID_HANDLE_VALUE\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_IOCTL );\r
+}\r
+\r
+\r
+static NTSTATUS\r
+__ipoib_create(\r
+       IN                              DEVICE_OBJECT* const            pDevObj,\r
+       IN                              IRP* const                                      pIrp )\r
+{\r
+       IPOIB_ENTER( IPOIB_DBG_IOCTL );\r
+\r
+       UNREFERENCED_PARAMETER( pDevObj );\r
+\r
+       ipoib_ref_ibat();\r
+\r
+       pIrp->IoStatus.Status = STATUS_SUCCESS;\r
+       pIrp->IoStatus.Information = 0;\r
+       IoCompleteRequest( pIrp, IO_NO_INCREMENT );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_IOCTL );\r
+       return STATUS_SUCCESS;\r
+}\r
+\r
+\r
+static NTSTATUS\r
+__ipoib_cleanup(\r
+       IN                              DEVICE_OBJECT* const            pDevObj,\r
+       IN                              IRP* const                                      pIrp )\r
+{\r
+       IPOIB_ENTER( IPOIB_DBG_IOCTL );\r
+\r
+       UNREFERENCED_PARAMETER( pDevObj );\r
+\r
+       ipoib_deref_ibat();\r
+\r
+       pIrp->IoStatus.Status = STATUS_SUCCESS;\r
+       pIrp->IoStatus.Information = 0;\r
+       IoCompleteRequest( pIrp, IO_NO_INCREMENT );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_IOCTL );\r
+       return STATUS_SUCCESS;\r
+}\r
+\r
+\r
+static NTSTATUS\r
+__ipoib_close(\r
+       IN                              DEVICE_OBJECT* const            pDevObj,\r
+       IN                              IRP* const                                      pIrp )\r
+{\r
+       IPOIB_ENTER( IPOIB_DBG_IOCTL );\r
+\r
+       UNREFERENCED_PARAMETER( pDevObj );\r
+\r
+       pIrp->IoStatus.Status = STATUS_SUCCESS;\r
+       pIrp->IoStatus.Information = 0;\r
+       IoCompleteRequest( pIrp, IO_NO_INCREMENT );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_IOCTL );\r
+       return STATUS_SUCCESS;\r
+}\r
+\r
+\r
+static NTSTATUS\r
+__ipoib_dispatch(\r
+       IN                              DEVICE_OBJECT* const            pDevObj,\r
+       IN                              IRP* const                                      pIrp )\r
+{\r
+       IO_STACK_LOCATION       *pIoStack;\r
+       NTSTATUS                        status = STATUS_SUCCESS;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_IOCTL );\r
+\r
+       UNREFERENCED_PARAMETER( pDevObj );\r
+\r
+       pIoStack = IoGetCurrentIrpStackLocation( pIrp );\r
+\r
+       pIrp->IoStatus.Information = 0;\r
+\r
+       switch( pIoStack->Parameters.DeviceIoControl.IoControlCode )\r
+       {\r
+       case IOCTL_IBAT_PORTS:\r
+               IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_IOCTL,\r
+                       ("IOCTL_IBAT_PORTS received\n") );\r
+               status = __ibat_get_ports( pIrp, pIoStack );\r
+               break;\r
+\r
+       case IOCTL_IBAT_IP_ADDRESSES:\r
+               IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_IOCTL,\r
+                       ("IOCTL_IBAT_IP_ADDRESSES received\n" ));\r
+               status = __ibat_get_ips( pIrp, pIoStack );\r
+               break;\r
+\r
+       case IOCTL_IBAT_MAC_TO_GID:\r
+               IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_IOCTL,\r
+                       ("IOCTL_IBAT_MAC_TO_GID received\n" ));\r
+               status = __ibat_mac_to_gid( pIrp, pIoStack );\r
+               break;\r
+\r
+       case IOCTL_IBAT_IP_TO_PORT:\r
+               IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_IOCTL,\r
+                       ("IOCTL_IBAT_IP_TO_PORT received\n" ));\r
+               status = __ibat_ip_to_port( pIrp, pIoStack );\r
+               break;\r
+\r
+       case IOCTL_IBAT_MAC_TO_PATH:\r
+               IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_IOCTL,\r
+                       ("IOCTL_IBAT_MAC_TO_PATH received\n" ));\r
+               status = __ibat_mac_to_path( pIrp, pIoStack );\r
+               break;\r
+\r
+       default:\r
+               IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_IOCTL,\r
+                       ("unknow IOCTL code = 0x%x\n",\r
+                       pIoStack->Parameters.DeviceIoControl.IoControlCode) );\r
+               status = STATUS_INVALID_PARAMETER;\r
+       }\r
+\r
+       pIrp->IoStatus.Status = status;\r
+       IoCompleteRequest( pIrp, IO_NO_INCREMENT );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_IOCTL );\r
+       return status;\r
+}\r
+\r
+\r
diff --git a/branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.c b/branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.c
deleted file mode 100644 (file)
index 89e1a0c..0000000
+++ /dev/null
@@ -1,8123 +0,0 @@
-/*\r
- * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
- * Copyright (c) 2006 Mellanox Technologies.  All rights reserved.\r
- * Portions Copyright (c) 2008 Microsoft Corporation.  All rights reserved.\r
- *\r
- * This software is available to you under the OpenIB.org BSD license\r
- * below:\r
- *\r
- *     Redistribution and use in source and binary forms, with or\r
- *     without modification, are permitted provided that the following\r
- *     conditions are met:\r
- *\r
- *      - Redistributions of source code must retain the above\r
- *        copyright notice, this list of conditions and the following\r
- *        disclaimer.\r
- *\r
- *      - Redistributions in binary form must reproduce the above\r
- *        copyright notice, this list of conditions and the following\r
- *        disclaimer in the documentation and/or other materials\r
- *        provided with the distribution.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
- * SOFTWARE.\r
- *\r
- * $Id: ipoib_port.c 4506 2009-06-23 14:40:54Z xalex $\r
- */\r
-\r
-\r
-\r
-#include "ipoib_endpoint.h"\r
-#include "ipoib_port.h"\r
-#include "ipoib_adapter.h"\r
-#include "ipoib_debug.h"\r
-#if defined(EVENT_TRACING)\r
-#ifdef offsetof\r
-#undef offsetof\r
-#endif\r
-#include "ipoib_port.tmh"\r
-#endif\r
-#include <offload.h>\r
-\r
-#include "wdm.h"\r
-#include <ntddk.h>\r
-\r
-\r
-\r
-ib_gid_t       bcast_mgid_template = {\r
-       0xff,                                                           /* multicast field */\r
-       0x12,                                                           /* scope (to be filled in) */\r
-       0x40, 0x1b,                                                     /* IPv4 signature */\r
-       0xff, 0xff,                                                     /* 16 bits of P_Key (to be filled in) */\r
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00,     /* 48 bits of zeros */\r
-       0xff, 0xff, 0xff, 0xff,                         /* 32 bit IPv4 broadcast address */\r
-};\r
-\r
-\r
-#ifdef _DEBUG_\r
-/* Handy pointer for debug use. */\r
-ipoib_port_t   *gp_ipoib_port;\r
-#endif\r
-\r
-static void __port_mcast_garbage_dpc(KDPC *p_gc_dpc,void *context,void *s_arg1, void *s_arg2);\r
-static void __port_do_mcast_garbage(ipoib_port_t* const        p_port );\r
-\r
-\r
-static void __recv_cb_dpc(KDPC *p_gc_dpc,void *context,void *s_arg1, void *s_arg2);\r
-\r
-\r
-/******************************************************************************\r
-*\r
-* Declarations\r
-*\r
-******************************************************************************/\r
-static void\r
-__port_construct(\r
-       IN                              ipoib_port_t* const                     p_port );\r
-\r
-static ib_api_status_t\r
-__port_init(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ipoib_adapter_t* const          p_adapter,\r
-       IN                              ib_pnp_port_rec_t* const        p_pnp_rec );\r
-\r
-static void\r
-__port_destroying(\r
-       IN                              cl_obj_t* const                         p_obj );\r
-\r
-static void\r
-__port_cleanup(\r
-       IN                              cl_obj_t* const                         p_obj );\r
-\r
-static void\r
-__port_free(\r
-       IN                              cl_obj_t* const                         p_obj );\r
-\r
-static ib_api_status_t\r
-__port_query_ca_attrs( \r
-       IN              ipoib_port_t* const                                     p_port,\r
-       IN              ib_ca_attr_t**                                          pp_ca_attrs );\r
-\r
-static void\r
-__srq_async_event_cb(\r
-IN                     ib_async_event_rec_t            *p_event_rec );\r
-\r
-/******************************************************************************\r
-*\r
-* IB resource manager operations\r
-*\r
-******************************************************************************/\r
-static void\r
-__ib_mgr_construct(\r
-       IN                              ipoib_port_t* const                     p_port );\r
-\r
-static ib_api_status_t\r
-__ib_mgr_init(\r
-       IN                              ipoib_port_t* const                     p_port );\r
-\r
-static void\r
-__ib_mgr_destroy(\r
-       IN                              ipoib_port_t* const                     p_port );\r
-\r
-static void\r
-__qp_event(\r
-       IN                              ib_async_event_rec_t            *p_event_rec );\r
-\r
-static void\r
-__cq_event(\r
-       IN                              ib_async_event_rec_t            *p_event_rec );\r
-\r
-static ib_api_status_t\r
-__ib_mgr_activate(\r
-       IN                              ipoib_port_t* const                     p_port );\r
-\r
-/******************************************************************************\r
-*\r
-* Buffer manager operations.\r
-*\r
-******************************************************************************/\r
-static void\r
-__buf_mgr_construct(\r
-       IN                              ipoib_port_t* const                     p_port );\r
-\r
-static ib_api_status_t\r
-__buf_mgr_init(\r
-       IN                              ipoib_port_t* const                     p_port );\r
-\r
-static void\r
-__buf_mgr_destroy(\r
-       IN                              ipoib_port_t* const                     p_port );\r
-\r
-static cl_status_t\r
-__recv_ctor(\r
-       IN                              void* const                                     p_object,\r
-       IN                              void*                                           context,\r
-               OUT                     cl_pool_item_t** const          pp_pool_item );\r
-\r
-#if !IPOIB_INLINE_RECV\r
-static void\r
-__recv_dtor(\r
-       IN              const   cl_pool_item_t* const           p_pool_item,\r
-       IN                              void                                            *context );\r
-#endif /* IPOIB_INLINE_RECV */\r
-\r
-static inline ipoib_send_desc_t*\r
-__buf_mgr_get_send(\r
-       IN                              ipoib_port_t* const                     p_port );\r
-\r
-static inline void\r
-__buf_mgr_put_send(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ipoib_send_desc_t* const        p_desc );\r
-\r
-static inline ipoib_recv_desc_t*\r
-__buf_mgr_get_recv(\r
-       IN                              ipoib_port_t* const                     p_port );\r
-\r
-static inline void\r
-__buf_mgr_put_recv(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ipoib_recv_desc_t* const        p_desc,\r
-       IN                              NET_BUFFER_LIST* const          p_net_buffer_list OPTIONAL );\r
-\r
-static inline void\r
-__buf_mgr_put_recv_list(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              cl_qlist_t* const                       p_list );\r
-\r
-//NDIS60\r
-static inline NET_BUFFER_LIST*\r
-__buf_mgr_get_ndis_pkt(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ipoib_recv_desc_t* const        p_desc );\r
-\r
-\r
-/******************************************************************************\r
-*\r
-* Receive manager operations.\r
-*\r
-******************************************************************************/\r
-static void\r
-__recv_mgr_construct(\r
-       IN                              ipoib_port_t* const                     p_port );\r
-\r
-static ib_api_status_t\r
-__recv_mgr_init(\r
-       IN                              ipoib_port_t* const                     p_port );\r
-\r
-static void\r
-__recv_mgr_destroy(\r
-       IN                              ipoib_port_t* const                     p_port );\r
-\r
-/* Posts receive buffers to the receive queue. */\r
-static ib_api_status_t\r
-__recv_mgr_repost(\r
-       IN                              ipoib_port_t* const                     p_port );\r
-\r
-static void\r
-__recv_cb(\r
-       IN              const   ib_cq_handle_t                          h_cq,\r
-       IN                              void                                            *cq_context );\r
-\r
-static void\r
-__recv_get_endpts(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ipoib_recv_desc_t* const        p_desc,\r
-       IN                              ib_wc_t* const                          p_wc,\r
-               OUT                     ipoib_endpt_t** const           pp_src,\r
-               OUT                     ipoib_endpt_t** const           pp_dst );\r
-\r
-static int32_t\r
-__recv_mgr_filter(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ib_wc_t* const                          p_done_wc_list,\r
-               OUT                     cl_qlist_t* const                       p_done_list,\r
-               OUT                     cl_qlist_t* const                       p_bad_list );\r
-\r
-static ib_api_status_t\r
-__recv_gen(\r
-       IN              const   ipoib_pkt_t* const                      p_ipoib,\r
-               OUT                     eth_pkt_t* const                        p_eth,\r
-       IN                              ipoib_endpt_t* const            p_src,\r
-       IN                              ipoib_endpt_t* const            p_dst );\r
-\r
-static ib_api_status_t\r
-__recv_dhcp(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   ipoib_pkt_t* const                      p_ipoib,\r
-               OUT                     eth_pkt_t* const                        p_eth,\r
-       IN                              ipoib_endpt_t* const            p_src,\r
-       IN                              ipoib_endpt_t* const            p_dst );\r
-\r
-static ib_api_status_t\r
-__recv_arp(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ib_wc_t* const                          p_wc,\r
-       IN              const   ipoib_pkt_t* const                      p_ipoib,\r
-               OUT                     eth_pkt_t* const                        p_eth,\r
-       IN                              ipoib_endpt_t** const           p_src,\r
-       IN                              ipoib_endpt_t* const            p_dst );\r
-\r
-static ib_api_status_t\r
-__recv_mgr_prepare_pkt(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ipoib_recv_desc_t* const        p_desc,\r
-               OUT                     NET_BUFFER_LIST** const         pp_net_buffer_list );\r
-\r
-static uint32_t\r
-__recv_mgr_build_pkt_array(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              int32_t                                         shortage,\r
-               OUT                     cl_qlist_t* const                       p_done_list,\r
-               OUT                     int32_t* const                          p_discarded );\r
-\r
-/******************************************************************************\r
-*\r
-* Send manager operations.\r
-*\r
-******************************************************************************/\r
-static void\r
-__send_mgr_construct(\r
-       IN                              ipoib_port_t* const                     p_port );\r
-\r
-static void\r
-__send_mgr_destroy(\r
-       IN                              ipoib_port_t* const                     p_port );\r
-\r
-static NDIS_STATUS\r
-__send_gen(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ipoib_send_desc_t* const        p_desc,\r
-       IN                              SCATTER_GATHER_LIST                     *p_sgl,\r
-       IN                              INT                                             lso_data_index);\r
-\r
-static NDIS_STATUS\r
-__send_mgr_filter_ip(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   eth_hdr_t* const                        p_eth_hdr,\r
-       IN                              MDL*                                            p_mdl,\r
-       IN                              size_t                                          buf_len,\r
-       IN                              SCATTER_GATHER_LIST                     *p_sgl,\r
-       IN      OUT                     ipoib_send_desc_t* const        p_desc );\r
-\r
-static NDIS_STATUS\r
-__send_mgr_filter_igmp_v2(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-    IN         const   ip_hdr_t* const                         p_ip_hdr,\r
-       IN                              size_t                                          iph_options_size,\r
-       IN                              MDL*                                            p_mdl,\r
-       IN                              size_t                                          buf_len );\r
-\r
-static NDIS_STATUS\r
-__send_mgr_filter_udp(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   ip_hdr_t* const                         p_ip_hdr,\r
-       IN                              MDL*                                            p_mdl,\r
-       IN                              size_t                                          buf_len,\r
-       IN                              SCATTER_GATHER_LIST                     *p_sgl,\r
-       IN      OUT                     ipoib_send_desc_t* const        p_desc );\r
-\r
-static NDIS_STATUS\r
-__send_mgr_filter_dhcp(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   udp_hdr_t* const                        p_udp_hdr,\r
-       IN                              MDL*                                            p_mdl,\r
-       IN                              size_t                                          buf_len,\r
-       IN      OUT                     ipoib_send_desc_t* const        p_desc );\r
-\r
-static NDIS_STATUS\r
-__send_mgr_filter_arp(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   eth_hdr_t* const                        p_eth_hdr,\r
-       IN                              MDL*                                            p_mdl,\r
-       IN                              size_t                                          buf_len,\r
-       IN      OUT                     ipoib_send_desc_t* const        p_desc );\r
-\r
-static void\r
-__process_failed_send(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ipoib_send_desc_t* const        p_desc,\r
-       IN              const   NDIS_STATUS                                     status,\r
-       IN              ULONG                                           send_complete_flags );\r
-\r
-static inline NDIS_STATUS\r
-__send_mgr_queue(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              eth_hdr_t* const                        p_eth_hdr,\r
-               OUT                     ipoib_endpt_t** const           pp_endpt );\r
-\r
-static NDIS_STATUS\r
-__build_send_desc(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              eth_hdr_t* const                        p_eth_hdr,\r
-       IN                              MDL* const                                      p_mdl,\r
-       IN              const   size_t                                          mdl_len,\r
-       IN                              SCATTER_GATHER_LIST                     *p_sgl,\r
-       IN      OUT                     ipoib_send_desc_t* const        p_desc );\r
-\r
-\r
-static void\r
-__send_cb(\r
-       IN              const   ib_cq_handle_t                          h_cq,\r
-       IN                              void                                            *cq_context );\r
-\r
-static NDIS_STATUS \r
-GetLsoHeaderSize(\r
-       IN              PNET_BUFFER             pNetBuffer,\r
-       IN              LsoData                 *pLsoData,\r
-       OUT     UINT                    *IndexOfData,\r
-       IN              ipoib_hdr_t *ipoib_hdr );\r
-\r
-\r
-static NDIS_STATUS\r
-__build_lso_desc(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN      OUT                     ipoib_send_desc_t* const        p_desc,\r
-       IN                              ULONG                                           mss,\r
-       IN                              SCATTER_GATHER_LIST                     *p_sgl,\r
-       IN                              int32_t                                         hdr_idx,\r
-       IN PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO p_lso_info );\r
-\r
-static NDIS_STATUS\r
-__send_fragments(\r
-       IN              ipoib_port_t* const                                     p_port,\r
-       IN              ipoib_send_desc_t* const                        p_desc,\r
-       IN              eth_hdr_t* const                                        p_eth_hdr,\r
-       IN              ip_hdr_t* const                                         p_ip_hdr,\r
-       IN              uint32_t                                                        buf_len,\r
-       IN              NDIS_BUFFER*                                            p_ndis_buf );\r
-\r
-static void\r
-__update_fragment_ip_hdr(\r
-IN             ip_hdr_t* const         p_ip_hdr,\r
-IN             uint16_t                        fragment_size, \r
-IN             uint16_t                        fragment_offset, \r
-IN             BOOLEAN                         more_fragments );\r
-\r
-static void\r
-__copy_ip_options(\r
-IN             uint8_t*                        p_buf,\r
-IN             uint8_t*                        p_options,\r
-IN             uint32_t                        options_len,\r
-IN             BOOLEAN                         copy_all );\r
-/******************************************************************************\r
-*\r
-* Endpoint manager operations\r
-*\r
-******************************************************************************/\r
-static void\r
-__endpt_mgr_construct(\r
-       IN                              ipoib_port_t* const                     p_port );\r
-\r
-static ib_api_status_t\r
-__endpt_mgr_init(\r
-       IN                              ipoib_port_t* const                     p_port );\r
-\r
-static void\r
-__endpt_mgr_destroy(\r
-       IN                              ipoib_port_t* const                     p_port );\r
-\r
-/****f* IPoIB/__endpt_mgr_remove_all\r
-* NAME\r
-*      __endpt_mgr_remove_all\r
-*\r
-* DESCRIPTION\r
-*      Removes all enpoints from the port, dereferencing them to initiate\r
-*      destruction.\r
-*\r
-* SYNOPSIS\r
-*/\r
-static void\r
-__endpt_mgr_remove_all(\r
-       IN                              ipoib_port_t* const                     p_port );\r
-/*\r
-********/\r
-\r
-static void\r
-__endpt_mgr_remove(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ipoib_endpt_t* const            p_endpt );\r
-\r
-static void\r
-__endpt_mgr_reset_all(\r
-       IN                              ipoib_port_t* const                     p_port );\r
-\r
-static inline NDIS_STATUS\r
-__endpt_mgr_ref(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   mac_addr_t                                      mac,\r
-               OUT                     ipoib_endpt_t** const           pp_endpt );\r
-\r
-static inline NDIS_STATUS\r
-__endpt_mgr_get_gid_qpn(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   mac_addr_t                                      mac,\r
-               OUT                     ib_gid_t* const                         p_gid,\r
-               OUT                     UNALIGNED net32_t* const        p_qpn );\r
-\r
-static inline ipoib_endpt_t*\r
-__endpt_mgr_get_by_gid(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   ib_gid_t* const                         p_gid );\r
-\r
-static inline ipoib_endpt_t*\r
-__endpt_mgr_get_by_lid(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   net16_t                                         lid );\r
-\r
-static inline ib_api_status_t\r
-__endpt_mgr_insert_locked(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   mac_addr_t                                      mac,\r
-       IN                              ipoib_endpt_t* const            p_endpt );\r
-\r
-static inline ib_api_status_t\r
-__endpt_mgr_insert(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   mac_addr_t                                      mac,\r
-       IN                              ipoib_endpt_t* const            p_endpt );\r
-\r
-static ib_api_status_t\r
-__endpt_mgr_add_local(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ib_port_info_t* const           p_port_info );\r
-\r
-static ib_api_status_t\r
-__endpt_mgr_add_bcast(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ib_mcast_rec_t                          *p_mcast_rec );\r
-\r
-/******************************************************************************\r
-*\r
-* MCast operations.\r
-*\r
-******************************************************************************/\r
-static ib_api_status_t\r
-__port_get_bcast(\r
-       IN                              ipoib_port_t* const                     p_port );\r
-\r
-static ib_api_status_t\r
-__port_join_bcast(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ib_member_rec_t* const          p_member_rec );\r
-\r
-static ib_api_status_t\r
-__port_create_bcast(\r
-       IN                              ipoib_port_t* const                     p_port );\r
-\r
-\r
-\r
-static void\r
-__bcast_get_cb(\r
-       IN                              ib_query_rec_t                          *p_query_rec );\r
-\r
-\r
-static void\r
-__bcast_cb(\r
-       IN                              ib_mcast_rec_t                          *p_mcast_rec );\r
-\r
-\r
-static void\r
-__mcast_cb(\r
-       IN                              ib_mcast_rec_t                          *p_mcast_rec );\r
-\r
-void\r
-__leave_error_mcast_cb(\r
-       IN                              void                            *context );\r
-\r
-\r
-static intn_t\r
-__gid_cmp(\r
-       IN              const   void* const                                     p_key1,\r
-       IN              const   void* const                                     p_key2 )\r
-{\r
-       return cl_memcmp( p_key1, p_key2, sizeof(ib_gid_t) );\r
-}\r
-\r
-\r
-inline void ipoib_port_ref( ipoib_port_t * p_port, int type )\r
-{\r
-       cl_obj_ref( &p_port->obj );\r
-#if DBG\r
-       cl_atomic_inc( &p_port->ref[type % ref_mask] );\r
-       if ((p_port->obj.ref_cnt % 20)==0)\r
-       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,\r
-               ("ref type %d ref_cnt %d\n", type, p_port->obj.ref_cnt) );\r
-       //TODO remove\r
-       //ASSERT (p_port->obj.ref_cnt < 100);\r
-#else\r
-       UNREFERENCED_PARAMETER(type);\r
-#endif\r
-}\r
-\r
-\r
-inline void ipoib_port_deref(ipoib_port_t * p_port, int type)\r
-{\r
-#if DBG\r
-       cl_atomic_dec( &p_port->ref[type % ref_mask] );\r
-       if ((p_port->obj.ref_cnt % 20) == 0)\r
-       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,\r
-               ("deref type %d ref_cnt %d\n", type, p_port->obj.ref_cnt) );\r
-#else\r
-       UNREFERENCED_PARAMETER(type);\r
-#endif\r
-       cl_obj_deref( &p_port->obj );\r
-\r
-}\r
-\r
-/* function returns pointer to payload that is going after IP header.\r
-*  asssuming that payload and IP header are in the same buffer\r
-*/\r
-static void* GetIpPayloadPtr(const     ip_hdr_t* const p_ip_hdr)\r
-{\r
-       return (void*)((uint8_t*)p_ip_hdr + IP_HEADER_LENGTH(p_ip_hdr));\r
-}\r
-\r
-/******************************************************************************\r
-*\r
-* Implementation\r
-*\r
-******************************************************************************/\r
-ib_api_status_t\r
-ipoib_create_port(\r
-       IN                              ipoib_adapter_t* const          p_adapter,\r
-       IN                              ib_pnp_port_rec_t* const        p_pnp_rec,\r
-               OUT                     ipoib_port_t** const            pp_port )\r
-{\r
-       ib_api_status_t         status;\r
-       ipoib_port_t            *p_port;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       CL_ASSERT( !p_adapter->p_port );\r
-\r
-       p_port = cl_zalloc( sizeof(ipoib_port_t) +\r
-               (sizeof(ipoib_hdr_t) * (p_adapter->params.sq_depth - 1)) );\r
-       if( !p_port )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Failed to allocate ipoib_port_t (%d bytes)\n",\r
-                       sizeof(ipoib_port_t)) );\r
-               return IB_INSUFFICIENT_MEMORY;\r
-       }\r
-\r
-#ifdef _DEBUG_\r
-       gp_ipoib_port = p_port;\r
-#endif\r
-\r
-       __port_construct( p_port );\r
-\r
-       status = __port_init( p_port, p_adapter, p_pnp_rec );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ipoib_port_init returned %s.\n", \r
-                       p_adapter->p_ifc->get_err_str( status )) );\r
-               __port_cleanup( &p_port->obj );\r
-               __port_free( &p_port->obj );\r
-               return status;\r
-       }\r
-\r
-       *pp_port = p_port;\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-       return IB_SUCCESS;\r
-}\r
-\r
-\r
-void\r
-ipoib_port_destroy(\r
-       IN                              ipoib_port_t* const                     p_port )\r
-{\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       CL_ASSERT( p_port );\r
-       CL_ASSERT( p_port->p_adapter );\r
-       CL_ASSERT( !p_port->p_adapter->p_port );\r
-\r
-       cl_obj_destroy( &p_port->obj );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-}\r
-\r
-\r
-static void\r
-__port_construct(\r
-       IN                              ipoib_port_t* const                     p_port )\r
-{\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       p_port->state = IB_QPS_RESET;\r
-\r
-       cl_obj_construct( &p_port->obj, IPOIB_OBJ_PORT );\r
-       cl_spinlock_construct( &p_port->send_lock );\r
-       cl_spinlock_construct( &p_port->recv_lock );\r
-       __ib_mgr_construct( p_port );\r
-       __buf_mgr_construct( p_port );\r
-\r
-       __recv_mgr_construct( p_port );\r
-       __send_mgr_construct( p_port );\r
-\r
-       __endpt_mgr_construct( p_port );\r
-\r
-       KeInitializeEvent( &p_port->sa_event, NotificationEvent, TRUE );\r
-       KeInitializeEvent( &p_port->leave_mcast_event, NotificationEvent, TRUE );\r
-       \r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-}\r
-\r
-\r
-static ib_api_status_t\r
-__port_init(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ipoib_adapter_t* const          p_adapter,\r
-       IN                              ib_pnp_port_rec_t* const        p_pnp_rec )\r
-{\r
-       cl_status_t                     cl_status;\r
-       ib_api_status_t         status;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       p_port->port_num = p_pnp_rec->p_port_attr->port_num;\r
-       p_port->p_adapter = p_adapter;\r
-\r
-       cl_status = cl_spinlock_init( &p_port->send_lock );\r
-       if( cl_status != CL_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("cl_spinlock_init returned %#x\n", cl_status) );\r
-               return IB_ERROR;\r
-       }\r
-\r
-       cl_status = cl_spinlock_init( &p_port->recv_lock );\r
-       if( cl_status != CL_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("cl_spinlock_init returned %#x\n", cl_status) );\r
-               return IB_ERROR;\r
-       }\r
-\r
-       /* Initialize the IB resource manager. */\r
-       status = __ib_mgr_init( p_port );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("__ib_mgr_init returned %s\n", \r
-                       p_adapter->p_ifc->get_err_str( status )) );\r
-               return status;\r
-       }\r
-\r
-       /* Initialize the buffer manager. */\r
-       status = __buf_mgr_init( p_port );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("__buf_mgr_init returned %s\n", \r
-                       p_adapter->p_ifc->get_err_str( status )) );\r
-               return status;\r
-       }\r
-\r
-       /* Initialize the receive manager. */\r
-       status = __recv_mgr_init( p_port );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("__recv_mgr_init returned %s\n", \r
-                       p_adapter->p_ifc->get_err_str( status )) );\r
-               return status;\r
-       }\r
-\r
-       /* Initialize the endpoint manager. */\r
-       status = __endpt_mgr_init( p_port );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("__endpt_mgr_init returned %s\n", \r
-                       p_adapter->p_ifc->get_err_str( status )) );\r
-               return status;\r
-       }\r
-\r
-        KeInitializeDpc(&p_port->recv_dpc,(PKDEFERRED_ROUTINE)__recv_cb_dpc,p_port);\r
-\r
-\r
-        /* Initialize multicast garbage collector timer and DPC object */\r
-        KeInitializeDpc(&p_port->gc_dpc,(PKDEFERRED_ROUTINE)__port_mcast_garbage_dpc,p_port);\r
-        KeInitializeTimerEx(&p_port->gc_timer,SynchronizationTimer);\r
-\r
-       /* We only ever destroy from the PnP callback thread. */\r
-       cl_status = cl_obj_init( &p_port->obj, CL_DESTROY_SYNC,\r
-               __port_destroying, __port_cleanup, __port_free );\r
-\r
-#if DBG\r
-       cl_atomic_inc( &p_port->ref[ref_init] );\r
-       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,\r
-               ("ref type %d ref_cnt %d\n", ref_init, p_port->obj.ref_cnt) );\r
-#endif\r
-\r
-       if( cl_status != CL_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("cl_obj_init returned %#x\n", cl_status) );\r
-               return IB_ERROR;\r
-       }\r
-\r
-       cl_status = cl_obj_insert_rel( &p_port->rel, &p_adapter->obj, &p_port->obj );\r
-       if( cl_status != CL_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("cl_obj_insert_rel returned %#x\n", cl_status) );\r
-               cl_obj_destroy( &p_port->obj );\r
-               return IB_ERROR;\r
-       }\r
-\r
-#if DBG\r
-       cl_atomic_inc( &p_port->ref[ref_init] );\r
-       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_OBJ,\r
-               ("ref type %d ref_cnt %d\n", ref_init, p_port->obj.ref_cnt) );\r
-#endif\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-       return IB_SUCCESS;\r
-}\r
-\r
-\r
-static void\r
-__port_destroying(\r
-       IN                              cl_obj_t* const                         p_obj )\r
-{\r
-       ipoib_port_t    *p_port;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       CL_ASSERT( p_obj );\r
-\r
-       p_port = PARENT_STRUCT( p_obj, ipoib_port_t, obj );\r
-\r
-       ipoib_port_down( p_port );\r
-\r
-       __endpt_mgr_remove_all( p_port );\r
-\r
-#if 0\r
-       if( p_port->p_adapter->params.cm_enabled )\r
-       {\r
-               endpt_cm_buf_mgr_destroy(  p_port );\r
-               ipoib_port_srq_destroy( p_port );\r
-               p_port->endpt_mgr.thread_is_done = 1;\r
-               cl_event_signal( &p_port->endpt_mgr.event );\r
-       }\r
-#endif\r
-       ASSERT(FALSE);\r
-       //TODO NDIS6.0\r
-       ipoib_port_resume( p_port, FALSE );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-}\r
-\r
-\r
-static void\r
-__port_cleanup(\r
-       IN                              cl_obj_t* const                         p_obj )\r
-{\r
-       ipoib_port_t    *p_port;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       CL_ASSERT( p_obj );\r
-\r
-       p_port = PARENT_STRUCT( p_obj, ipoib_port_t, obj );\r
-\r
-       /* Wait for all sends and receives to get flushed. */\r
-       while( p_port->send_mgr.depth || p_port->recv_mgr.depth )\r
-               cl_thread_suspend( 0 );\r
-\r
-       /* Destroy the send and receive managers before closing the CA. */\r
-       __ib_mgr_destroy( p_port );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-}\r
-\r
-\r
-static void\r
-__port_free(\r
-       IN                              cl_obj_t* const                         p_obj )\r
-{\r
-       ipoib_port_t    *p_port;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       CL_ASSERT( p_obj );\r
-\r
-       p_port = PARENT_STRUCT( p_obj, ipoib_port_t, obj );\r
-\r
-       KeCancelTimer(&p_port->gc_timer);\r
-       KeFlushQueuedDpcs();\r
-       __endpt_mgr_destroy( p_port );\r
-       __recv_mgr_destroy( p_port );\r
-       __send_mgr_destroy( p_port );\r
-       __buf_mgr_destroy( p_port );\r
-\r
-       cl_spinlock_destroy( &p_port->send_lock );\r
-       cl_spinlock_destroy( &p_port->recv_lock );\r
-\r
-       cl_obj_deinit( p_obj );\r
-       if( p_port->p_ca_attrs )\r
-       {\r
-               cl_free ( p_port->p_ca_attrs );\r
-       }\r
-       cl_free( p_port );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-}\r
-\r
-\r
-\r
-/******************************************************************************\r
-*\r
-* IB resource manager implementation.\r
-*\r
-******************************************************************************/\r
-static void\r
-__ib_mgr_construct(\r
-       IN                              ipoib_port_t* const                     p_port )\r
-{\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       cl_memclr( &p_port->ib_mgr, sizeof(ipoib_ib_mgr_t) );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-}\r
-\r
-\r
-static ib_api_status_t\r
-__ib_mgr_init(\r
-       IN                              ipoib_port_t* const                     p_port )\r
-{\r
-       ib_api_status_t         status;\r
-       ib_cq_create_t          cq_create;\r
-       ib_qp_create_t          qp_create;\r
-       ib_phys_create_t        phys_create;\r
-       ib_phys_range_t         phys_range;\r
-       uint64_t                        vaddr;\r
-       net32_t                         rkey;\r
-       ib_qp_attr_t            qp_attr;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       /* Open the CA. */\r
-       status = p_port->p_adapter->p_ifc->open_ca(\r
-               p_port->p_adapter->h_al, p_port->p_adapter->guids.ca_guid,\r
-               NULL, p_port, &p_port->ib_mgr.h_ca );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
-                       EVENT_IPOIB_OPEN_CA, 1, status );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ib_open_ca returned %s\n", \r
-                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-               return status;\r
-       }\r
-\r
-       status = __port_query_ca_attrs( p_port, &p_port->p_ca_attrs );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Query CA attributes failed\n" ) );\r
-               return status;\r
-       }\r
-#if 0\r
-       if( p_port->p_adapter->params.cm_enabled )\r
-       {\r
-               uint32_t payload_mtu = __port_attr_to_mtu_size( \r
-                       p_port->p_ca_attrs->p_port_attr[p_port->port_num - 1].mtu )\r
-                       - sizeof(ipoib_hdr_t);\r
-               /* adjust ipoib UD payload MTU to actual port MTU size. */\r
-               p_port->p_adapter->params.payload_mtu = \r
-                               max( DEFAULT_PAYLOAD_MTU, payload_mtu );\r
-               p_port->p_adapter->params.xfer_block_size = \r
-                       (sizeof(eth_hdr_t) + p_port->p_adapter->params.payload_mtu);\r
-       }\r
-#endif\r
-#if IPOIB_USE_DMA\r
-       /* init DMA only once while running MiniportInitialize */\r
-       if ( !p_port->p_adapter->reset )\r
-       {\r
-               ULONG max_phys_mapping;\r
-               if( p_port->p_adapter->params.cm_enabled )\r
-               {\r
-                       max_phys_mapping = p_port->p_adapter->params.cm_xfer_block_size;\r
-               }\r
-               else if( p_port->p_adapter->params.lso )\r
-               {\r
-                       max_phys_mapping = LARGE_SEND_OFFLOAD_SIZE;\r
-               }\r
-               else\r
-               {\r
-                       max_phys_mapping = p_port->p_adapter->params.xfer_block_size;\r
-               }\r
-               /*if( NdisMInitializeScatterGatherDma( p_port->p_adapter->h_adapter,\r
-                                                       TRUE, max_phys_mapping )!= NDIS_STATUS_SUCCESS )\r
-               {\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("NdisMInitializeScatterGatherDma failed\n" ) );\r
-                       return IB_INSUFFICIENT_RESOURCES;\r
-               }*/\r
-       }\r
-#endif\r
-\r
-       /* Allocate the PD. */\r
-       status = p_port->p_adapter->p_ifc->alloc_pd(\r
-               p_port->ib_mgr.h_ca, IB_PDT_UD, p_port, &p_port->ib_mgr.h_pd );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
-                       EVENT_IPOIB_ALLOC_PD, 1, status );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ib_alloc_pd returned %s\n", \r
-                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-               return status;\r
-       }\r
-\r
-       /* Allocate receive CQ. */\r
-       cq_create.size = p_port->p_adapter->params.rq_depth;\r
-       cq_create.pfn_comp_cb = __recv_cb;\r
-       cq_create.h_wait_obj = NULL;\r
-\r
-       status = p_port->p_adapter->p_ifc->create_cq(\r
-               p_port->ib_mgr.h_ca, &cq_create, p_port,\r
-               __cq_event, &p_port->ib_mgr.h_recv_cq );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
-                       EVENT_IPOIB_CREATE_RECV_CQ, 1, status );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ib_create_cq returned %s.\n", \r
-                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-               return status;\r
-       }\r
-\r
-       /* Allocate send CQ. */\r
-       cq_create.size = p_port->p_adapter->params.sq_depth;\r
-       cq_create.pfn_comp_cb = __send_cb;\r
-\r
-       status = p_port->p_adapter->p_ifc->create_cq(\r
-               p_port->ib_mgr.h_ca, &cq_create, p_port,\r
-               __cq_event, &p_port->ib_mgr.h_send_cq );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
-                       EVENT_IPOIB_CREATE_SEND_CQ, 1, status );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ib_create_cq returned %s.\n", \r
-                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-               return status;\r
-       }\r
-       \r
-       /* Allocate the QP. */\r
-       cl_memclr( &qp_create, sizeof(qp_create) );\r
-       qp_create.qp_type = IB_QPT_UNRELIABLE_DGRM;\r
-       qp_create.rq_depth = p_port->p_adapter->params.rq_depth;\r
-       qp_create.rq_sge = 2;   /* To support buffers spanning pages. */\r
-       qp_create.h_rq_cq = p_port->ib_mgr.h_recv_cq;\r
-       qp_create.sq_depth = p_port->p_adapter->params.sq_depth;\r
-\r
-#define UD_QP_USED_SGE 3\r
-       qp_create.sq_sge = MAX_SEND_SGE < p_port->p_ca_attrs->max_sges ? \r
-                       MAX_SEND_SGE  : ( p_port->p_ca_attrs->max_sges - UD_QP_USED_SGE );\r
-       if ( !p_port->p_ca_attrs->ipoib_csum ) \r
-       { \r
-               /* checksum is not supported by device\r
-               user must specify BYPASS to explicitly cancel checksum calculation */\r
-               if (p_port->p_adapter->params.send_chksum_offload == CSUM_ENABLED)\r
-                       p_port->p_adapter->params.send_chksum_offload = CSUM_DISABLED;\r
-               if (p_port->p_adapter->params.recv_chksum_offload == CSUM_ENABLED)\r
-                       p_port->p_adapter->params.recv_chksum_offload = CSUM_DISABLED;\r
-       }\r
-\r
-       qp_create.h_sq_cq = p_port->ib_mgr.h_send_cq;\r
-       qp_create.sq_signaled = FALSE;\r
-       status = p_port->p_adapter->p_ifc->create_qp(\r
-               p_port->ib_mgr.h_pd, &qp_create, p_port,\r
-               __qp_event, &p_port->ib_mgr.h_qp );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
-                       EVENT_IPOIB_CREATE_QP, 1, status );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ib_create_qp returned %s\n", \r
-                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-               return status;\r
-       }\r
-       /* Query the QP so we can get our QPN. */\r
-       status = p_port->p_adapter->p_ifc->query_qp(\r
-               p_port->ib_mgr.h_qp, &qp_attr );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
-                       EVENT_IPOIB_QUERY_QP, 1, status );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ib_query_qp returned %s\n", \r
-                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-               return status;\r
-       }\r
-       p_port->ib_mgr.qpn = qp_attr.num;\r
-\r
-       /* Register all of physical memory */\r
-       phys_create.length = MEM_REG_SIZE;\r
-       phys_create.num_ranges = 1;\r
-       phys_create.range_array = &phys_range;\r
-       phys_create.buf_offset = 0;\r
-       phys_create.hca_page_size = PAGE_SIZE;\r
-       phys_create.access_ctrl = IB_AC_LOCAL_WRITE;\r
-       phys_range.base_addr = 0;\r
-       phys_range.size = MEM_REG_SIZE;\r
-       vaddr = 0;\r
-       status = p_port->p_adapter->p_ifc->reg_phys(\r
-               p_port->ib_mgr.h_pd, &phys_create, &vaddr,\r
-               &p_port->ib_mgr.lkey, &rkey, &p_port->ib_mgr.h_mr );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
-                       EVENT_IPOIB_REG_PHYS, 1, status );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ib_reg_phys returned %s\n", \r
-                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-               return status;\r
-       }\r
-\r
-       status = ipoib_port_srq_init( p_port );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ipoib_port_srq_init failed %s\n",\r
-                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-               /* disable further CM initialization */\r
-               p_port->p_adapter->params.cm_enabled = FALSE;\r
-\r
-               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
-                               EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de1 );\r
-\r
-       }\r
-//CM\r
-#if 0\r
-       if( p_port->p_adapter->params.cm_enabled )\r
-       {\r
-               status = endpt_cm_buf_mgr_init( p_port );\r
-               if( status != IB_SUCCESS )\r
-               {\r
-                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("CM Init buf mgr failed status %#x\n", status ) );\r
-                       ipoib_port_srq_destroy( p_port );\r
-                       p_port->p_adapter->params.cm_enabled = FALSE;\r
-\r
-                       NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
-                               EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de2 );\r
-               }\r
-               else \r
-               {\r
-                       if ( p_port->p_adapter->params.send_chksum_offload )\r
-                       p_port->p_adapter->params.send_chksum_offload = CSUM_DISABLED;\r
-               }\r
-       }\r
-#endif\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-       return IB_SUCCESS;\r
-}\r
-\r
-static void\r
-__srq_async_event_cb(\r
-IN                     ib_async_event_rec_t            *p_event_rec )\r
-{\r
-       ipoib_port_t* p_port = \r
-               (ipoib_port_t *)p_event_rec->context;\r
-\r
-       switch( p_event_rec->code )\r
-       {\r
-       case IB_AE_SRQ_LIMIT_REACHED:\r
-                               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("SRQ ASYNC EVENT CODE %d: %s\n", \r
-                       p_event_rec->code, "IB_AE_SRQ_LIMIT_REACHED" ) );\r
-                       break;\r
-       case IB_AE_SRQ_CATAS_ERROR:\r
-                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("SRQ ASYNC EVENT CODE %d: %s\n", \r
-                               p_event_rec->code, "IB_AE_SRQ_CATAS_ERROR" ) );\r
-                       /*SRQ is in err state, must reinitialize */\r
-                       p_port->p_adapter->hung = TRUE;\r
-                       break;\r
-       case IB_AE_SRQ_QP_LAST_WQE_REACHED:\r
-                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("SRQ ASYNC EVENT CODE %d: %s\n", \r
-                               p_event_rec->code, "IB_AE_SRQ_QP_LAST_WQE_REACHED" ) );\r
-                       /*SRQ is in err state, must reinitialize */\r
-                       p_port->p_adapter->hung = TRUE;\r
-                       break;\r
-       default:\r
-                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("ASYNC EVENT CODE ARRIVED %d(%#x)\n", \r
-                               p_event_rec->code, p_event_rec->code ) );\r
-       }\r
-}\r
-\r
-ib_api_status_t\r
-ipoib_port_srq_init(\r
-       IN                              ipoib_port_t* const                     p_port )\r
-{\r
-       ib_api_status_t         ib_status;\r
-       ib_srq_handle_t         h_srq;\r
-       ib_srq_attr_t           srq_attr;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-       \r
-       if( !p_port->p_adapter->params.cm_enabled )\r
-               return IB_SUCCESS;\r
-\r
-       srq_attr.max_sge = min( 2, p_port->p_ca_attrs->max_srq_sges );\r
-       srq_attr.srq_limit = 10;\r
-       srq_attr.max_wr = \r
-               min( (uint32_t)p_port->p_adapter->params.rq_depth * 8,\r
-                               p_port->p_ca_attrs->max_srq_wrs/2 );\r
-\r
-       ib_status = p_port->p_adapter->p_ifc->create_srq( \r
-                                                               p_port->ib_mgr.h_pd, \r
-                                                               &srq_attr, \r
-                                                               p_port, \r
-                                                               __srq_async_event_cb, \r
-                                                               &h_srq );\r
-       if( ib_status != IB_SUCCESS )\r
-       {\r
-               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
-                       EVENT_IPOIB_CREATE_QP, 1, ib_status );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ib_create_srq failed status %s\n", \r
-                       p_port->p_adapter->p_ifc->get_err_str( ib_status )) );\r
-               return ib_status;\r
-       }\r
-       p_port->ib_mgr.h_srq = h_srq;\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-\r
-       return ib_status;\r
-}\r
-\r
-/*  __port_query_ca_attrs() \r
- *  returns a pointer to allocated memory.\r
- *  must be released by caller.\r
- */\r
-static ib_api_status_t\r
-__port_query_ca_attrs( \r
-       IN              ipoib_port_t* const             p_port,\r
-       IN              ib_ca_attr_t**                  pp_ca_attrs )\r
-{\r
-       ib_api_status_t         ib_status;\r
-       uint32_t                        attr_size;\r
-       ib_ca_attr_t*           p_ca_attrs;\r
-\r
-       *pp_ca_attrs = NULL;\r
-\r
-       ib_status = \r
-               p_port->p_adapter->p_ifc->query_ca( p_port->ib_mgr.h_ca, NULL , &attr_size );\r
-       if( ib_status != IB_INSUFFICIENT_MEMORY )\r
-       {\r
-               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ib_query_ca failed status %s\n",\r
-                       p_port->p_adapter->p_ifc->get_err_str( ib_status )) );\r
-               goto done;\r
-       }\r
-       CL_ASSERT( attr_size );\r
-\r
-       p_ca_attrs = cl_zalloc( attr_size );\r
-       if ( p_ca_attrs == NULL )\r
-       {\r
-               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Allocate %d bytes failed for CA Attributes\n", attr_size ));\r
-               ib_status = IB_INSUFFICIENT_MEMORY;\r
-               goto done;\r
-       }\r
-\r
-       ib_status = \r
-               p_port->p_adapter->p_ifc->query_ca( p_port->ib_mgr.h_ca, p_ca_attrs , &attr_size );\r
-       if ( ib_status != IB_SUCCESS )\r
-       {\r
-               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("CA attributes query failed\n") );\r
-               cl_free ( p_ca_attrs );\r
-               goto done;\r
-       }\r
-\r
-       *pp_ca_attrs = p_ca_attrs;\r
-done:\r
-       return ib_status;\r
-}\r
-\r
-void\r
-ipoib_port_srq_destroy( \r
-       IN                              ipoib_port_t* const                     p_port )\r
-{\r
-       ib_api_status_t status;\r
-\r
-       if( p_port->ib_mgr.h_srq )\r
-       {\r
-               status =\r
-                       p_port->p_adapter->p_ifc->destroy_srq( p_port->ib_mgr.h_srq, NULL );\r
-               CL_ASSERT( status == IB_SUCCESS );\r
-               p_port->ib_mgr.h_srq = NULL;\r
-       }\r
-}\r
-\r
-static void\r
-__ib_mgr_destroy(\r
-       IN                              ipoib_port_t* const                     p_port )\r
-{\r
-       ib_api_status_t status;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       if( p_port->ib_mgr.h_ca )\r
-       {\r
-               status =\r
-                       p_port->p_adapter->p_ifc->close_ca( p_port->ib_mgr.h_ca, NULL );\r
-               CL_ASSERT( status == IB_SUCCESS );\r
-               p_port->ib_mgr.h_ca = NULL;\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-}\r
-\r
-\r
-\r
-/******************************************************************************\r
-*\r
-* Buffer manager implementation.\r
-*\r
-******************************************************************************/\r
-static void\r
-__buf_mgr_construct(\r
-       IN                              ipoib_port_t* const                     p_port )\r
-{\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       cl_qpool_construct( &p_port->buf_mgr.recv_pool );\r
-\r
-       p_port->buf_mgr.h_packet_pool = NULL;\r
-       p_port->buf_mgr.h_buffer_pool = NULL;\r
-\r
-       NdisInitializeNPagedLookasideList( &p_port->buf_mgr.send_buf_list,\r
-               NULL, NULL, 0, MAX_XFER_BLOCK_SIZE, 'bipi', 0 );\r
-\r
-       p_port->buf_mgr.h_send_pkt_pool = NULL;\r
-       p_port->buf_mgr.h_send_buf_pool = NULL;\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-}\r
-\r
-\r
-static ib_api_status_t\r
-__buf_mgr_init(\r
-       IN                              ipoib_port_t* const                     p_port )\r
-{\r
-       cl_status_t             cl_status;\r
-       ipoib_params_t  *p_params;\r
-       NET_BUFFER_LIST_POOL_PARAMETERS pool_parameters;\r
-       IPOIB_ENTER(IPOIB_DBG_INIT );\r
-\r
-       CL_ASSERT( p_port );\r
-       CL_ASSERT( p_port->p_adapter );\r
-\r
-       p_params = &p_port->p_adapter->params;\r
-\r
-       /* Allocate the receive descriptor pool */\r
-       cl_status = cl_qpool_init( &p_port->buf_mgr.recv_pool,\r
-               p_params->rq_depth * p_params->recv_pool_ratio,\r
-#if IPOIB_INLINE_RECV\r
-               0, 0, sizeof(ipoib_recv_desc_t), __recv_ctor, NULL, p_port );\r
-#else  /* IPOIB_INLINE_RECV */\r
-               0, 0, sizeof(ipoib_recv_desc_t), __recv_ctor, __recv_dtor, p_port );\r
-#endif /* IPOIB_INLINE_RECV */\r
-       if( cl_status != CL_SUCCESS )\r
-       {\r
-               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
-                       EVENT_IPOIB_RECV_POOL, 1, cl_status );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("cl_qpool_init for recvs returned %#x\n",\r
-                       cl_status) );\r
-               return IB_INSUFFICIENT_MEMORY;\r
-       }\r
-\r
-       /* Allocate the NET BUFFER list pools for receive indication. */\r
-       NdisZeroMemory(&pool_parameters, sizeof(NET_BUFFER_LIST_POOL_PARAMETERS));\r
-    pool_parameters.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;\r
-    pool_parameters.Header.Revision = NET_BUFFER_LIST_POOL_PARAMETERS_REVISION_1;\r
-    pool_parameters.Header.Size = sizeof(pool_parameters);\r
-    pool_parameters.ProtocolId = 0;\r
-    pool_parameters.ContextSize = 0;\r
-    pool_parameters.fAllocateNetBuffer = TRUE;\r
-    pool_parameters.PoolTag = 'CRPI';\r
-\r
-    p_port->buf_mgr.h_packet_pool = NdisAllocateNetBufferListPool(\r
-                p_port->p_adapter->h_adapter,\r
-                &pool_parameters); \r
-\r
-       if( !p_port->buf_mgr.h_packet_pool )\r
-       {\r
-               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
-                       EVENT_IPOIB_RECV_PKT_POOL, 1, NDIS_STATUS_RESOURCES  );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("NdisAllocatePacketPool returned %08X\n", (UINT)NDIS_STATUS_RESOURCES) );\r
-               return IB_INSUFFICIENT_RESOURCES;\r
-       }\r
-/*\r
-       NdisAllocateBufferPool( &ndis_status, &p_port->buf_mgr.h_buffer_pool,\r
-               p_params->rq_depth );\r
-       if( ndis_status != NDIS_STATUS_SUCCESS )\r
-       {\r
-               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
-                       EVENT_IPOIB_RECV_BUF_POOL, 1, ndis_status );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("NdisAllocateBufferPool returned %08X\n", ndis_status) );\r
-               return IB_INSUFFICIENT_RESOURCES;\r
-       }\r
-*/\r
-       /* Allocate the NET buffer list pool for send formatting. */\r
-    pool_parameters.PoolTag = 'XTPI';\r
-\r
-    p_port->buf_mgr.h_send_pkt_pool = NdisAllocateNetBufferListPool(\r
-                p_port->p_adapter->h_adapter,\r
-                &pool_parameters); \r
-       if( !p_port->buf_mgr.h_send_pkt_pool)\r
-       {\r
-               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
-                       EVENT_IPOIB_SEND_PKT_POOL, 1, NDIS_STATUS_RESOURCES );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("NdisAllocatePacketPool returned %08X\n", (UINT)NDIS_STATUS_RESOURCES) );\r
-               return IB_INSUFFICIENT_RESOURCES;\r
-       }\r
-/*\r
-       NdisAllocateBufferPool( &ndis_status,\r
-               &p_port->buf_mgr.h_send_buf_pool, 1 );\r
-       if( ndis_status != NDIS_STATUS_SUCCESS )\r
-       {\r
-               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
-                       EVENT_IPOIB_SEND_BUF_POOL, 1, ndis_status );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("NdisAllocateBufferPool returned %08X\n", ndis_status) );\r
-               return IB_INSUFFICIENT_RESOURCES;\r
-       }\r
-*/\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-       return IB_SUCCESS;\r
-}\r
-\r
-\r
-static void\r
-__buf_mgr_destroy(\r
-       IN                              ipoib_port_t* const                     p_port )\r
-{\r
-       IPOIB_ENTER(IPOIB_DBG_INIT );\r
-\r
-       CL_ASSERT( p_port );\r
-\r
-       /* Destroy the send packet and buffer pools. \r
-       if( p_port->buf_mgr.h_send_buf_pool )\r
-               NdisFreeBufferPool( p_port->buf_mgr.h_send_buf_pool );*/\r
-       if( p_port->buf_mgr.h_send_pkt_pool )\r
-               NdisFreeNetBufferListPool ( p_port->buf_mgr.h_send_pkt_pool );\r
-\r
-       /* Destroy the receive packet and buffer pools. \r
-       if( p_port->buf_mgr.h_buffer_pool )\r
-               NdisFreeBufferPool( p_port->buf_mgr.h_buffer_pool );*/\r
-       if( p_port->buf_mgr.h_packet_pool )\r
-               NdisFreeNetBufferListPool ( p_port->buf_mgr.h_packet_pool );\r
-\r
-       /* Free the receive and send descriptors. */\r
-       cl_qpool_destroy( &p_port->buf_mgr.recv_pool );\r
-\r
-       /* Free the lookaside list of scratch buffers. */\r
-       NdisDeleteNPagedLookasideList( &p_port->buf_mgr.send_buf_list );\r
-\r
-       IPOIB_EXIT(  IPOIB_DBG_INIT );\r
-}\r
-\r
-\r
-static cl_status_t\r
-__recv_ctor(\r
-       IN                              void* const                                     p_object,\r
-       IN                              void*                                           context,\r
-               OUT                     cl_pool_item_t** const          pp_pool_item )\r
-{\r
-       ipoib_recv_desc_t       *p_desc;\r
-       ipoib_port_t            *p_port;\r
-\r
-#if IPOIB_INLINE_RECV\r
-       uint32_t                        ds0_len;\r
-#endif\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_ALLOC );\r
-\r
-       CL_ASSERT( p_object );\r
-       CL_ASSERT( context );\r
-\r
-       p_desc = (ipoib_recv_desc_t*)p_object;\r
-       p_port = (ipoib_port_t*)context;\r
-\r
-       /* Setup the work request. */\r
-       p_desc->wr.ds_array = p_desc->local_ds;\r
-       p_desc->wr.wr_id = (uintn_t)p_desc;\r
-\r
-#if IPOIB_INLINE_RECV\r
-       /* Sanity check on the receive buffer layout */\r
-       CL_ASSERT( (void*)&p_desc->buf.eth.pkt.type ==\r
-               (void*)&p_desc->buf.ib.pkt.type );\r
-       CL_ASSERT( sizeof(recv_buf_t) == sizeof(ipoib_pkt_t) + sizeof(ib_grh_t) );\r
-\r
-       /* Setup the local data segment. */\r
-       p_desc->local_ds[0].vaddr = cl_get_physaddr( &p_desc->buf );\r
-       p_desc->local_ds[0].lkey = p_port->ib_mgr.lkey;\r
-       ds0_len =\r
-               PAGE_SIZE - ((uint32_t)p_desc->local_ds[0].vaddr & (PAGE_SIZE - 1));\r
-       if( ds0_len >= sizeof(recv_buf_t) )\r
-       {\r
-               /* The whole buffer is within a page. */\r
-               p_desc->local_ds[0].length = ds0_len;\r
-               p_desc->wr.num_ds = 1;\r
-       }\r
-       else\r
-       {\r
-               /* The buffer crosses page boundaries. */\r
-               p_desc->local_ds[0].length = ds0_len;\r
-               p_desc->local_ds[1].vaddr = cl_get_physaddr( \r
-                       ((uint8_t*)&p_desc->buf) + ds0_len );\r
-               p_desc->local_ds[1].lkey = p_port->ib_mgr.lkey;\r
-               p_desc->local_ds[1].length = sizeof(recv_buf_t) - ds0_len;\r
-               p_desc->wr.num_ds = 2;\r
-       }\r
-#else  /* IPOIB_INLINE_RECV */\r
-       /* Allocate the receive buffer. */\r
-       p_desc->p_buf = (recv_buf_t*)cl_zalloc( sizeof(recv_buf_t) );\r
-       if( !p_desc->p_buf )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Failed to allocate receive buffer.\n") );\r
-               return CL_INSUFFICIENT_MEMORY;\r
-       }\r
-\r
-       /* Sanity check on the receive buffer layout */\r
-       CL_ASSERT( (void*)&p_desc->p_buf->eth.pkt.type ==\r
-               (void*)&p_desc->p_buf->ib.pkt.type );\r
-\r
-       /* Setup the local data segment. */\r
-       p_desc->local_ds[0].vaddr = cl_get_physaddr( p_desc->p_buf );\r
-       p_desc->local_ds[0].length = sizeof(ipoib_pkt_t) + sizeof(ib_grh_t);\r
-       p_desc->local_ds[0].lkey = p_port->ib_mgr.lkey;\r
-       p_desc->wr.num_ds = 1;\r
-#endif /* IPOIB_INLINE_RECV */\r
-\r
-       *pp_pool_item = &p_desc->item;\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_ALLOC );\r
-       return CL_SUCCESS;\r
-}\r
-\r
-\r
-#if !IPOIB_INLINE_RECV\r
-static void\r
-__recv_dtor(\r
-       IN              const   cl_pool_item_t* const           p_pool_item,\r
-       IN                              void                                            *context )\r
-{\r
-       ipoib_recv_desc_t       *p_desc;\r
-\r
-       IPOIB_ENTER(  IPOIB_DBG_ALLOC );\r
-\r
-       UNUSED_PARAM( context );\r
-\r
-       p_desc = PARENT_STRUCT( p_pool_item, ipoib_recv_desc_t, item );\r
-\r
-       if( p_desc->p_buf )\r
-               cl_free( p_desc->p_buf );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_ALLOC );\r
-}\r
-#endif\r
-\r
-\r
-static inline ipoib_recv_desc_t*\r
-__buf_mgr_get_recv(\r
-       IN                              ipoib_port_t* const                     p_port )\r
-{\r
-       ipoib_recv_desc_t       *p_desc;\r
-       IPOIB_ENTER( IPOIB_DBG_RECV );\r
-       p_desc = (ipoib_recv_desc_t*)cl_qpool_get( &p_port->buf_mgr.recv_pool );\r
-       /* Reference the port object for the send. */\r
-       if( p_desc )\r
-       {\r
-               ipoib_port_ref( p_port, ref_get_recv );\r
-               CL_ASSERT( p_desc->wr.wr_id == (uintn_t)p_desc );\r
-#if IPOIB_INLINE_RECV\r
-               CL_ASSERT( p_desc->local_ds[0].vaddr ==\r
-                       cl_get_physaddr( &p_desc->buf ) );\r
-#else  /* IPOIB_INLINE_RECV */\r
-               CL_ASSERT( p_desc->local_ds[0].vaddr ==\r
-                       cl_get_physaddr( p_desc->p_buf ) );\r
-               CL_ASSERT( p_desc->local_ds[0].length ==\r
-                       (sizeof(ipoib_pkt_t) + sizeof(ib_grh_t)) );\r
-#endif /* IPOIB_INLINE_RECV */\r
-               CL_ASSERT( p_desc->local_ds[0].lkey == p_port->ib_mgr.lkey );\r
-       }\r
-       IPOIB_EXIT( IPOIB_DBG_RECV );\r
-       return p_desc;\r
-}\r
-\r
-\r
-//NDIS60\r
-static inline void\r
-__buf_mgr_put_recv(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ipoib_recv_desc_t* const        p_desc,\r
-       IN                              NET_BUFFER_LIST* const          p_net_buffer_list OPTIONAL )\r
-{\r
-       NET_BUFFER              *p_buf = NULL;\r
-       MDL                             *p_mdl = NULL;\r
-       IPOIB_ENTER(IPOIB_DBG_RECV );\r
-\r
-       if( p_net_buffer_list )\r
-       {\r
-               NET_BUFFER_LIST_NEXT_NBL(p_net_buffer_list) = NULL;\r
-               p_buf = NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);\r
-               CL_ASSERT( p_buf );\r
-               p_mdl = NET_BUFFER_FIRST_MDL(p_buf);\r
-               CL_ASSERT( p_mdl );\r
-               NdisFreeMdl(p_mdl);\r
-               NdisFreeNetBufferList(p_net_buffer_list);\r
-       }\r
-\r
-       /* Return the descriptor to its pools. */\r
-       cl_qpool_put( &p_port->buf_mgr.recv_pool, &p_desc->item );\r
-\r
-       /*\r
-        * Dereference the port object since the receive is no longer outstanding.\r
-        */\r
-       ipoib_port_deref( p_port, ref_get_recv );\r
-       IPOIB_EXIT(  IPOIB_DBG_RECV );\r
-}\r
-\r
-\r
-static inline void\r
-__buf_mgr_put_recv_list(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              cl_qlist_t* const                       p_list )\r
-{\r
-       //IPOIB_ENTER(  IPOIB_DBG_RECV );\r
-       cl_qpool_put_list( &p_port->buf_mgr.recv_pool, p_list );\r
-       //IPOIB_EXIT(  IPOIB_DBG_RECV );\r
-}\r
-\r
-\r
-static inline NET_BUFFER_LIST*\r
-__buf_mgr_get_ndis_pkt(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ipoib_recv_desc_t* const        p_desc )\r
-{\r
-       NET_BUFFER_LIST                 *p_net_buffer_list;\r
-       MDL                                             *p_mdl;\r
-\r
-       IPOIB_ENTER(  IPOIB_DBG_RECV );\r
-\r
-       p_mdl = NdisAllocateMdl(p_port->p_adapter->h_adapter,\r
-                                                       &p_desc->buf.eth.pkt,\r
-                                                       p_desc->len );\r
-       if( !p_mdl )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Failed to allocate MDL\n") );\r
-               return NULL;\r
-       }\r
-\r
-       p_net_buffer_list = NdisAllocateNetBufferAndNetBufferList(\r
-                                               p_port->buf_mgr.h_packet_pool,\r
-                                               0,\r
-                                               0,\r
-                                               p_mdl,\r
-                                               0,\r
-                                               0);\r
-\r
-       if( !p_net_buffer_list )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Failed to allocate NET_BUFFER_LIST\n") );\r
-               NdisFreeMdl(p_mdl);\r
-               return NULL;\r
-       }\r
-\r
-       NET_BUFFER_LIST_NEXT_NBL(p_net_buffer_list) = NULL;\r
-       IPOIB_PORT_FROM_PACKET( p_net_buffer_list ) = p_port;\r
-       IPOIB_RECV_FROM_PACKET( p_net_buffer_list ) = p_desc;\r
-       p_net_buffer_list->SourceHandle = p_port->p_adapter->h_adapter;\r
-\r
-       IPOIB_EXIT(  IPOIB_DBG_RECV );\r
-       return p_net_buffer_list;\r
-}\r
-\r
-\r
-/******************************************************************************\r
-*\r
-* Receive manager implementation.\r
-*\r
-******************************************************************************/\r
-static void\r
-__recv_mgr_construct(\r
-       IN                              ipoib_port_t* const                     p_port )\r
-{\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       cl_qlist_init( &p_port->recv_mgr.done_list );\r
-\r
-       p_port->recv_mgr.recv_pkt_array = NULL;\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-}\r
-\r
-\r
-static ib_api_status_t\r
-__recv_mgr_init(\r
-       IN                              ipoib_port_t* const                     p_port )\r
-{\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       /* Allocate the NDIS_PACKET pointer array for indicating receives. */\r
-       p_port->recv_mgr.recv_pkt_array = cl_malloc(\r
-               sizeof(NET_BUFFER_LIST*) * p_port->p_adapter->params.rq_depth );\r
-       if( !p_port->recv_mgr.recv_pkt_array )\r
-       {\r
-               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
-                       EVENT_IPOIB_RECV_PKT_ARRAY, 0 );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("cl_malloc for PNDIS_PACKET array failed.\n") );\r
-               return IB_INSUFFICIENT_MEMORY;\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-       return IB_SUCCESS;\r
-}\r
-\r
-\r
-static void\r
-__recv_mgr_destroy(\r
-       IN                              ipoib_port_t* const                     p_port )\r
-{\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       CL_ASSERT( cl_is_qlist_empty( &p_port->recv_mgr.done_list ) );\r
-       CL_ASSERT( !p_port->recv_mgr.depth );\r
-\r
-       if( p_port->recv_mgr.recv_pkt_array )\r
-               cl_free( p_port->recv_mgr.recv_pkt_array );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-}\r
-\r
-\r
-/*\r
- * Posts receive buffers to the receive queue and returns the number\r
- * of receives needed to bring the RQ to its low water mark.  Note\r
- * that the value is signed, and can go negative.  All tests must\r
- * be for > 0.\r
- */\r
-static int32_t\r
-__recv_mgr_repost(\r
-       IN                              ipoib_port_t* const                     p_port )\r
-{\r
-       ipoib_recv_desc_t       *p_head = NULL, *p_tail = NULL, *p_next;\r
-       ib_api_status_t         status;\r
-       ib_recv_wr_t            *p_failed;\r
-       PERF_DECLARE( GetRecv );\r
-       PERF_DECLARE( PostRecv );\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_RECV );\r
-\r
-       CL_ASSERT( p_port );\r
-       cl_obj_lock( &p_port->obj );\r
-       if( p_port->state != IB_QPS_RTS )\r
-       {\r
-               cl_obj_unlock( &p_port->obj );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,\r
-                       ("Port in invalid state.  Not reposting.\n") );\r
-               return 0;\r
-       }\r
-       ipoib_port_ref( p_port, ref_repost );\r
-       cl_obj_unlock( &p_port->obj );\r
-\r
-       while( p_port->recv_mgr.depth < p_port->p_adapter->params.rq_depth )\r
-       {\r
-               /* Pull receives out of the pool and chain them up. */\r
-               cl_perf_start( GetRecv );\r
-               p_next = __buf_mgr_get_recv( p_port );\r
-               cl_perf_stop( &p_port->p_adapter->perf, GetRecv );\r
-               if( !p_next )\r
-               {\r
-                       IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,\r
-                               ("Out of receive descriptors! recv queue depth 0x%x\n",p_port->recv_mgr.depth) );\r
-                       break;\r
-               }\r
-\r
-               if( !p_tail )\r
-               {\r
-                       p_tail = p_next;\r
-                       p_next->wr.p_next = NULL;\r
-               }\r
-               else\r
-               {\r
-                       p_next->wr.p_next = &p_head->wr;\r
-               }\r
-\r
-               p_head = p_next;\r
-\r
-               p_port->recv_mgr.depth++;\r
-       }\r
-\r
-       if( p_head )\r
-       {\r
-               cl_perf_start( PostRecv );\r
-               status = p_port->p_adapter->p_ifc->post_recv(\r
-                       p_port->ib_mgr.h_qp, &p_head->wr, &p_failed );\r
-               cl_perf_stop( &p_port->p_adapter->perf, PostRecv );\r
-\r
-               if( status != IB_SUCCESS )\r
-               {\r
-                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("ip_post_recv returned %s\n", \r
-                               p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-                       /* return the descriptors to the pool */\r
-                       while( p_failed )\r
-                       {\r
-                               p_head = PARENT_STRUCT( p_failed, ipoib_recv_desc_t, wr );\r
-                               p_failed = p_failed->p_next;\r
-\r
-                               __buf_mgr_put_recv( p_port, p_head, NULL );\r
-                               p_port->recv_mgr.depth--;\r
-                       }\r
-               }\r
-       }\r
-\r
-       ipoib_port_deref( p_port, ref_repost );\r
-       IPOIB_EXIT( IPOIB_DBG_RECV );\r
-       return p_port->p_adapter->params.rq_low_watermark - p_port->recv_mgr.depth;\r
-}\r
-\r
-void\r
-ipoib_return_net_buffer_list(\r
-       IN                              NDIS_HANDLE                                     adapter_context,\r
-       IN                              NET_BUFFER_LIST                         *p_net_buffer_lists,\r
-       IN                              ULONG                                           return_flags)\r
-{\r
-//     cl_list_item_t          *p_item;\r
-       ipoib_port_t            *p_port;\r
-       ipoib_recv_desc_t       *p_desc;\r
-       NET_BUFFER_LIST         *cur_net_buffer_list,*next_net_buffer_list;\r
-//     ib_api_status_t         status = IB_NOT_DONE;\r
-//     int32_t                         shortage;\r
-//     ULONG                           complete_flags = 0;\r
-       PERF_DECLARE( ReturnPacket );\r
-       PERF_DECLARE( ReturnPutRecv );\r
-       PERF_DECLARE( ReturnRepostRecv );\r
-       PERF_DECLARE( ReturnPreparePkt );\r
-       PERF_DECLARE( ReturnNdisIndicate );\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_RECV );\r
-\r
-       UNUSED_PARAM( return_flags );\r
-\r
-       p_port = ((ipoib_adapter_t*)adapter_context)->p_port;\r
-       CL_ASSERT( p_net_buffer_lists );\r
-\r
-       cl_perf_start( ReturnPacket );\r
-       cl_spinlock_acquire( &p_port->recv_lock );\r
-       for (cur_net_buffer_list = p_net_buffer_lists;\r
-                cur_net_buffer_list != NULL;\r
-                cur_net_buffer_list = next_net_buffer_list)\r
-       {\r
-               next_net_buffer_list = NET_BUFFER_LIST_NEXT_NBL(cur_net_buffer_list);\r
-\r
-               /* Get the port and descriptor from the packet. */\r
-               CL_ASSERT(p_port == IPOIB_PORT_FROM_PACKET( cur_net_buffer_list ));\r
-               p_desc = IPOIB_RECV_FROM_PACKET( cur_net_buffer_list );\r
-\r
-               \r
-               //TODO: NDIS60, rewrite this block\r
-               /* Get descriptor from the packet. */\r
-#if 0\r
-               if( p_desc->type == PKT_TYPE_CM_UCAST )\r
-               {\r
-                       NDIS_BUFFER             *p_buf;\r
-\r
-                       /* Unchain the NDIS buffer. */\r
-                       NdisUnchainBufferAtFront( p_packet, &p_buf );\r
-                       CL_ASSERT( p_buf );\r
-                       /* Return the NDIS packet and NDIS buffer to their pools. */\r
-                       NdisDprFreePacketNonInterlocked( p_packet );\r
-                       NdisFreeBuffer( p_buf );\r
-\r
-                       endpt_cm_buf_mgr_put_recv( &p_port->cm_buf_mgr, (ipoib_cm_desc_t *)p_desc );\r
-                       status = endpt_cm_post_recv( p_port );\r
-                       if(  status != IB_SUCCESS )\r
-                       {\r
-                               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                       ("Post Recv QP failed\n" ) );\r
-                       }\r
-                       cl_spinlock_release( &p_port->recv_lock );\r
-                       return;\r
-               }\r
-#endif\r
-\r
-               cl_perf_start( ReturnPutRecv );\r
-               __buf_mgr_put_recv( p_port, p_desc, cur_net_buffer_list );\r
-               cl_perf_stop( &p_port->p_adapter->perf, ReturnPutRecv );\r
-       }\r
-#if 0           \r
-       /* Repost buffers. */\r
-       cl_perf_start( ReturnRepostRecv );\r
-       shortage = __recv_mgr_repost( p_port );\r
-       cl_perf_stop( &p_port->p_adapter->perf, ReturnRepostRecv );\r
-\r
-       for( p_item = cl_qlist_remove_head( &p_port->recv_mgr.done_list );\r
-               p_item != cl_qlist_end( &p_port->recv_mgr.done_list );\r
-               p_item = cl_qlist_remove_head( &p_port->recv_mgr.done_list ) )\r
-       {\r
-               p_desc = (ipoib_recv_desc_t*)p_item;\r
-\r
-               cl_perf_start( ReturnPreparePkt );\r
-               status = __recv_mgr_prepare_pkt( p_port, p_desc, &cur_net_buffer_list );\r
-               cl_perf_stop( &p_port->p_adapter->perf, ReturnPreparePkt );\r
-               if( status == IB_SUCCESS )\r
-               {\r
-                       if( shortage > 0 )\r
-                               NET_BUFFER_LIST_STATUS( cur_net_buffer_list) = NDIS_STATUS_RESOURCES;\r
-                       else\r
-                               NET_BUFFER_LIST_STATUS( cur_net_buffer_list) = NDIS_STATUS_SUCCESS;\r
-\r
-                       cl_spinlock_release( &p_port->recv_lock );\r
-                       NET_BUFFER_LIST_NEXT_NBL(cur_net_buffer_list) = NULL;\r
-                       cl_perf_start( ReturnNdisIndicate );\r
-                       NdisMRecvIndicate( p_port->p_adapter->h_adapter,\r
-                               cur_net_buffer_list, complete_flags );\r
-                       cl_perf_stop( &p_port->p_adapter->perf, ReturnNdisIndicate );\r
-                       cl_spinlock_acquire( &p_port->recv_lock );\r
-\r
-                       if( shortage > 0 )\r
-                       {\r
-                               cl_perf_start( ReturnPutRecv );\r
-                               __buf_mgr_put_recv( p_port, p_desc, cur_net_buffer_list );\r
-                               cl_perf_stop( &p_port->p_adapter->perf, ReturnPutRecv );\r
-\r
-                               /* Repost buffers. */\r
-                               cl_perf_start( ReturnRepostRecv );\r
-                               shortage = __recv_mgr_repost( p_port );\r
-                               cl_perf_stop( &p_port->p_adapter->perf, ReturnRepostRecv );\r
-                       }\r
-               }\r
-               else if( status != IB_NOT_DONE )\r
-               {\r
-                       IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,\r
-                               ("__recv_mgr_prepare_pkt returned %s\n",\r
-                               p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-                       /* Return the item to the head of the list. */\r
-                       cl_qlist_insert_head( &p_port->recv_mgr.done_list, p_item );\r
-                       break;\r
-               }\r
-       }\r
-       #endif\r
-       cl_spinlock_release( &p_port->recv_lock );\r
-       cl_perf_stop( &p_port->p_adapter->perf, ReturnPacket );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_RECV );\r
-}\r
-\r
-static void __recv_cb_dpc(KDPC *p_gc_dpc,void *context,void * s_arg1 , void * s_arg2)\r
-{\r
-\r
-       ipoib_port_t *p_port = context;\r
-\r
-       UNREFERENCED_PARAMETER(p_gc_dpc);\r
-       UNREFERENCED_PARAMETER(s_arg1);\r
-       UNREFERENCED_PARAMETER(s_arg2);\r
-\r
-\r
-       __recv_cb(NULL, p_port);\r
-       ipoib_port_deref( p_port, ref_recv_cb );\r
-\r
-\r
-}\r
-\r
-\r
-static void\r
-__recv_cb(\r
-       IN              const   ib_cq_handle_t                          h_cq,\r
-       IN                              void                                            *cq_context )\r
-{\r
-       ipoib_port_t            *p_port;\r
-       ib_api_status_t         status;\r
-       ib_wc_t                         wc[MAX_RECV_WC], *p_free, *p_wc;\r
-       int32_t                         pkt_cnt, recv_cnt = 0, shortage, discarded;\r
-       cl_qlist_t                      done_list, bad_list;\r
-       size_t                          i;\r
-       ULONG                           recv_complete_flags = 0;\r
-\r
-       PERF_DECLARE( RecvCompBundle );\r
-       PERF_DECLARE( RecvCb );\r
-       PERF_DECLARE( PollRecv );\r
-       PERF_DECLARE( RepostRecv );\r
-       PERF_DECLARE( FilterRecv );\r
-       PERF_DECLARE( BuildPktArray );\r
-       PERF_DECLARE( RecvNdisIndicate );\r
-       PERF_DECLARE( RearmRecv );\r
-       PERF_DECLARE( PutRecvList );\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_RECV );\r
-\r
-       cl_perf_clr( RecvCompBundle );\r
-\r
-       cl_perf_start( RecvCb );\r
-//return ;\r
-       UNUSED_PARAM( h_cq );\r
-\r
-       NDIS_SET_SEND_COMPLETE_FLAG(recv_complete_flags, NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL );\r
-\r
-       p_port = (ipoib_port_t*)cq_context;\r
-\r
-       cl_qlist_init( &done_list );\r
-       cl_qlist_init( &bad_list );\r
-\r
-       ipoib_port_ref( p_port, ref_recv_cb );\r
-       for( i = 0; i < MAX_RECV_WC; i++ )\r
-               wc[i].p_next = &wc[i + 1];\r
-       wc[MAX_RECV_WC - 1].p_next = NULL;\r
-\r
-       /*\r
-        * We'll be accessing the endpoint map so take a reference\r
-        * on it to prevent modifications.\r
-        */\r
-       cl_obj_lock( &p_port->obj );\r
-       cl_atomic_inc( &p_port->endpt_rdr );\r
-       cl_obj_unlock( &p_port->obj );\r
-\r
-       do\r
-       {\r
-               /* If we get here, then the list of WCs is intact. */\r
-               p_free = wc;\r
-\r
-               cl_perf_start( PollRecv );\r
-               status = p_port->p_adapter->p_ifc->poll_cq(\r
-                       p_port->ib_mgr.h_recv_cq, &p_free, &p_wc );\r
-               cl_perf_stop( &p_port->p_adapter->perf, PollRecv );\r
-               CL_ASSERT( status == IB_SUCCESS || status == IB_NOT_FOUND );\r
-\r
-               /* Look at the payload now and filter ARP and DHCP packets. */\r
-               cl_perf_start( FilterRecv );\r
-               recv_cnt += __recv_mgr_filter( p_port, p_wc, &done_list, &bad_list );\r
-               cl_perf_stop( &p_port->p_adapter->perf, FilterRecv );\r
-\r
-       } while( (!p_free) && (recv_cnt < 128));\r
-\r
-       /* We're done looking at the endpoint map, release the reference. */\r
-       cl_atomic_dec( &p_port->endpt_rdr );\r
-\r
-       cl_perf_log( &p_port->p_adapter->perf, RecvCompBundle, recv_cnt );\r
-\r
-       cl_spinlock_acquire( &p_port->recv_lock );\r
-\r
-       /* Update our posted depth. */\r
-       p_port->recv_mgr.depth -= recv_cnt;\r
-\r
-       /* Return any discarded receives to the pool */\r
-       cl_perf_start( PutRecvList );\r
-       __buf_mgr_put_recv_list( p_port, &bad_list );\r
-       cl_perf_stop( &p_port->p_adapter->perf, PutRecvList );\r
-\r
-       do\r
-       {\r
-               int32_t cnt;\r
-               /* Repost ASAP so we don't starve the RQ. */\r
-               cl_perf_start( RepostRecv );\r
-               shortage = __recv_mgr_repost( p_port );\r
-               cl_perf_stop( &p_port->p_adapter->perf, RepostRecv );\r
-\r
-               cl_perf_start( BuildPktArray );\r
-               /* Notify NDIS of any and all possible receive buffers. */\r
-               pkt_cnt = __recv_mgr_build_pkt_array(\r
-                       p_port, shortage, &done_list, &discarded );\r
-               cl_perf_stop( &p_port->p_adapter->perf, BuildPktArray );\r
-\r
-               /* Only indicate receives if we actually had any. */\r
-               if( discarded && shortage > 0 )\r
-               {\r
-                       /* We may have thrown away packets, and have a shortage */\r
-                       cl_perf_start( RepostRecv );\r
-                       __recv_mgr_repost( p_port );\r
-                       cl_perf_stop( &p_port->p_adapter->perf, RepostRecv );\r
-               }\r
-\r
-               if( !pkt_cnt )\r
-                       break;\r
-\r
-               cl_spinlock_release( &p_port->recv_lock );\r
-               for( cnt = 0; cnt < pkt_cnt -1; cnt++)\r
-               {\r
-                       NET_BUFFER_LIST_NEXT_NBL(p_port->recv_mgr.recv_pkt_array[cnt]) = \r
-                               p_port->recv_mgr.recv_pkt_array[cnt + 1];\r
-               }\r
-               cl_perf_start( RecvNdisIndicate );\r
-#ifndef NDIS_DEFAULT_PORT_NUMBER\r
-#define NDIS_DEFAULT_PORT_NUMBER 0\r
-#endif\r
-               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                       ("Indicate NDIS with  %d received NBs\n",\r
-                                       pkt_cnt) );\r
-               NdisMIndicateReceiveNetBufferLists(\r
-                       p_port->p_adapter->h_adapter,\r
-                       p_port->recv_mgr.recv_pkt_array[0],\r
-                       NDIS_DEFAULT_PORT_NUMBER,\r
-                       pkt_cnt,\r
-                       recv_complete_flags);\r
-\r
-               cl_perf_stop( &p_port->p_adapter->perf, RecvNdisIndicate );\r
-\r
-               /*\r
-                * Cap the number of receives to put back to what we just indicated\r
-                * with NDIS_STATUS_RESOURCES.\r
-                */\r
-               if( shortage > 0 )\r
-               {\r
-                       if( pkt_cnt < shortage )\r
-                               shortage = pkt_cnt;\r
-\r
-                       /* Return all but the last packet to the pool. */\r
-                       cl_spinlock_acquire( &p_port->recv_lock );\r
-                       while( shortage-- > 1 )\r
-                       {\r
-                               __buf_mgr_put_recv( p_port,\r
-                                       (ipoib_recv_desc_t *)IPOIB_RECV_FROM_PACKET( p_port->recv_mgr.recv_pkt_array[shortage] ),\r
-                                       p_port->recv_mgr.recv_pkt_array[shortage] );\r
-                       }\r
-                       cl_spinlock_release( &p_port->recv_lock );\r
-\r
-                       /*\r
-                        * Return the last packet as if NDIS returned it, so that we repost\r
-                        * and report any other pending receives.\r
-                        */\r
-                       ipoib_return_net_buffer_list( NULL, p_port->recv_mgr.recv_pkt_array[0],recv_complete_flags );\r
-               }\r
-               cl_spinlock_acquire( &p_port->recv_lock );\r
-\r
-       } while( pkt_cnt );\r
-       cl_spinlock_release( &p_port->recv_lock );\r
-\r
-       if (p_free ) {\r
-               /*\r
-                * Rearm after filtering to prevent contention on the enpoint maps\r
-                * and eliminate the possibility of having a call to\r
-                * __endpt_mgr_insert find a duplicate.\r
-                */\r
-               cl_perf_start( RearmRecv );\r
-               status = p_port->p_adapter->p_ifc->rearm_cq(\r
-                       p_port->ib_mgr.h_recv_cq, FALSE );\r
-               cl_perf_stop( &p_port->p_adapter->perf, RearmRecv );\r
-               CL_ASSERT( status == IB_SUCCESS );\r
-\r
-               ipoib_port_deref( p_port, ref_recv_cb );\r
-       } else {\r
-               // Please note the reference is still up\r
-               KeInsertQueueDpc(&p_port->recv_dpc, NULL, NULL);\r
-       }\r
-\r
-       cl_perf_stop( &p_port->p_adapter->perf, RecvCb );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_RECV );\r
-}\r
-\r
-\r
-static void\r
-__recv_get_endpts(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ipoib_recv_desc_t* const        p_desc,\r
-       IN                              ib_wc_t* const                          p_wc,\r
-               OUT                     ipoib_endpt_t** const           pp_src,\r
-               OUT                     ipoib_endpt_t** const           pp_dst )\r
-{\r
-       ib_api_status_t         status;\r
-       mac_addr_t                      mac;\r
-       PERF_DECLARE( GetEndptByGid );\r
-       PERF_DECLARE( GetEndptByLid );\r
-       PERF_DECLARE( EndptInsert );\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_RECV );\r
-\r
-       /* Setup our shortcut pointers based on whether GRH is valid. */\r
-       if( p_wc->recv.ud.recv_opt & IB_RECV_OPT_GRH_VALID )\r
-       {\r
-               /* Lookup the source endpoints based on GID. */\r
-               cl_perf_start( GetEndptByGid );\r
-               *pp_src =\r
-#if IPOIB_INLINE_RECV\r
-                       __endpt_mgr_get_by_gid( p_port, &p_desc->buf.ib.grh.src_gid );\r
-#else  /* IPOIB_INLINE_RECV */\r
-                       __endpt_mgr_get_by_gid( p_port, &p_desc->p_buf->ib.grh.src_gid );\r
-#endif /* IPOIB_INLINE_RECV */\r
-               cl_perf_stop( &p_port->p_adapter->perf, GetEndptByGid );\r
-\r
-               /*\r
-                * Lookup the destination endpoint based on GID.\r
-                * This is used along with the packet filter to determine\r
-                * whether to report this to NDIS.\r
-                */\r
-               cl_perf_start( GetEndptByGid );\r
-               *pp_dst =\r
-#if IPOIB_INLINE_RECV\r
-                       __endpt_mgr_get_by_gid( p_port, &p_desc->buf.ib.grh.dest_gid );\r
-#else  /* IPOIB_INLINE_RECV */\r
-                       __endpt_mgr_get_by_gid( p_port, &p_desc->p_buf->ib.grh.dest_gid );\r
-#endif /* IPOIB_INLINE_RECV */\r
-               cl_perf_stop( &p_port->p_adapter->perf, GetEndptByGid );\r
-\r
-               /*\r
-                * Create the source endpoint if it does not exist.  Note that we\r
-                * can only do this for globally routed traffic since we need the\r
-                * information from the GRH to generate the MAC.\r
-                */\r
-               if( !*pp_src )\r
-               {\r
-                       status = ipoib_mac_from_guid(\r
-#if IPOIB_INLINE_RECV\r
-                               p_desc->buf.ib.grh.src_gid.unicast.interface_id, p_port->p_adapter->params.guid_mask, &mac );\r
-#else  /* IPOIB_INLINE_RECV */\r
-                               p_desc->p_buf->ib.grh.src_gid.unicast.interface_id, p_port->p_adapter->params.guid_mask, &mac );\r
-#endif /* IPOIB_INLINE_RECV */\r
-                       if( status != IB_SUCCESS )\r
-                       {\r
-                               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                       ("ipoib_mac_from_guid returned %s\n",\r
-                                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-                               return;\r
-                       }\r
-\r
-                       /* Create the endpoint. */\r
-#if IPOIB_INLINE_RECV\r
-                       *pp_src = ipoib_endpt_create( &p_desc->buf.ib.grh.src_gid,\r
-#else  /* IPOIB_INLINE_RECV */\r
-                       *pp_src = ipoib_endpt_create( &p_desc->p_buf->ib.grh.src_gid,\r
-#endif /* IPOIB_INLINE_RECV */\r
-                               p_wc->recv.ud.remote_lid, p_wc->recv.ud.remote_qp );\r
-                       if( !*pp_src )\r
-                       {\r
-                               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                       ("ipoib_endpt_create failed\n") );\r
-                               return;\r
-                       }\r
-                       cl_perf_start( EndptInsert );\r
-                       cl_obj_lock( &p_port->obj );\r
-                       status = __endpt_mgr_insert( p_port, mac, *pp_src );\r
-                       if( status != IB_SUCCESS )\r
-                       {\r
-                               cl_obj_unlock( &p_port->obj );\r
-                               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                       ("__endpt_mgr_insert returned %s\n",\r
-                                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-                               *pp_src = NULL;\r
-                               return;\r
-                       }\r
-                       cl_obj_unlock( &p_port->obj );\r
-                       cl_perf_stop( &p_port->p_adapter->perf, EndptInsert );\r
-               }\r
-       }\r
-       else\r
-       {\r
-               /*\r
-                * Lookup the remote endpoint based on LID.  Note that only\r
-                * unicast traffic can be LID routed.\r
-                */\r
-               cl_perf_start( GetEndptByLid );\r
-               *pp_src = __endpt_mgr_get_by_lid( p_port, p_wc->recv.ud.remote_lid );\r
-               cl_perf_stop( &p_port->p_adapter->perf, GetEndptByLid );\r
-               *pp_dst = p_port->p_local_endpt;\r
-               CL_ASSERT( *pp_dst );\r
-       }\r
-\r
-       if( *pp_src && !ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) &&\r
-               (*pp_src)->qpn != p_wc->recv.ud.remote_qp )\r
-       {\r
-               /* Update the QPN for the endpoint. */\r
-               IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,\r
-                       ("Updating QPN for MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",\r
-                       (*pp_src )->mac.addr[0], (*pp_src )->mac.addr[1],\r
-                       (*pp_src )->mac.addr[2], (*pp_src )->mac.addr[3],\r
-                       (*pp_src )->mac.addr[4], (*pp_src )->mac.addr[5]) );\r
-//             (*pp_src)->qpn = p_wc->recv.ud.remote_qp;\r
-       }\r
-\r
-       if( *pp_src && *pp_dst )\r
-       {\r
-               IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,\r
-                       ("Recv:\n"\r
-                       "\tsrc MAC: %02X-%02X-%02X-%02X-%02X-%02X\n"\r
-                       "\tdst MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",\r
-                       (*pp_src )->mac.addr[0], (*pp_src )->mac.addr[1],\r
-                       (*pp_src )->mac.addr[2], (*pp_src )->mac.addr[3],\r
-                       (*pp_src )->mac.addr[4], (*pp_src )->mac.addr[5],\r
-                       (*pp_dst )->mac.addr[0], (*pp_dst )->mac.addr[1],\r
-                       (*pp_dst )->mac.addr[2], (*pp_dst )->mac.addr[3],\r
-                       (*pp_dst )->mac.addr[4], (*pp_dst )->mac.addr[5]) );\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_RECV );\r
-}\r
-\r
-\r
-static int32_t\r
-__recv_mgr_filter(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ib_wc_t* const                          p_done_wc_list,\r
-               OUT                     cl_qlist_t* const                       p_done_list,\r
-               OUT                     cl_qlist_t* const                       p_bad_list )\r
-{\r
-       ipoib_recv_desc_t               *p_desc;\r
-       ib_wc_t                                 *p_wc;\r
-       ipoib_pkt_t                             *p_ipoib;\r
-       eth_pkt_t                               *p_eth;\r
-       ipoib_endpt_t                   *p_src, *p_dst;\r
-       ib_api_status_t                 status;\r
-       uint32_t                                len;\r
-       int32_t                                 recv_cnt = 0;\r
-       PERF_DECLARE( GetRecvEndpts );\r
-       PERF_DECLARE( RecvGen );\r
-       PERF_DECLARE( RecvTcp );\r
-       PERF_DECLARE( RecvUdp );\r
-       PERF_DECLARE( RecvDhcp );\r
-       PERF_DECLARE( RecvArp );\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_RECV );\r
-\r
-       for( p_wc = p_done_wc_list; p_wc; p_wc = p_wc->p_next )\r
-       {\r
-               CL_ASSERT( p_wc->status != IB_WCS_SUCCESS || p_wc->wc_type == IB_WC_RECV );\r
-               p_desc = (ipoib_recv_desc_t*)(uintn_t)p_wc->wr_id;\r
-               recv_cnt++;\r
-\r
-               if( p_wc->status != IB_WCS_SUCCESS )\r
-               {\r
-                       if( p_wc->status != IB_WCS_WR_FLUSHED_ERR )\r
-                       {\r
-                               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                       ("Failed completion %s  (vendor specific %#x)\n",\r
-                                       p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status ),\r
-                                       (int)p_wc->vendor_specific) );\r
-                               ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );\r
-                       }\r
-                       else\r
-                       {\r
-                               IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,\r
-                                       ("Flushed completion %s\n",\r
-                                       p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status )) );\r
-                               ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_DROPPED, 0, 0 );\r
-                       }\r
-                       cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );\r
-                       /* Dereference the port object on behalf of the failed receive. */\r
-                       ipoib_port_deref( p_port, ref_failed_recv_wc );\r
-                       continue;\r
-               }\r
-\r
-               len = p_wc->length - sizeof(ib_grh_t);\r
-\r
-               if( len < sizeof(ipoib_hdr_t) )\r
-               {\r
-                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Received ETH packet < min size\n") );\r
-                       ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );\r
-                       cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );\r
-                       ipoib_port_deref( p_port, ref_recv_inv_len );\r
-                       continue;\r
-               }\r
-\r
-               if((len - sizeof(ipoib_hdr_t)) > p_port->p_adapter->params.payload_mtu)\r
-               {\r
-                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Received ETH packet len %d > payload MTU (%d)\n",\r
-                               (len - sizeof(ipoib_hdr_t)),\r
-                               p_port->p_adapter->params.payload_mtu) );\r
-                       ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );\r
-                       cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );\r
-                       ipoib_port_deref( p_port, ref_recv_inv_len );\r
-                       continue;\r
-                       \r
-               }\r
-               /* Successful completion.  Get the receive information. */\r
-               p_desc->ndis_csum.Value = ( ( p_wc->recv.ud.recv_opt & IB_RECV_OPT_CSUM_MASK ) >> 8 );\r
-               p_desc->len = len + 14 - 4 ;\r
-               cl_perf_start( GetRecvEndpts );\r
-               __recv_get_endpts( p_port, p_desc, p_wc, &p_src, &p_dst );\r
-               cl_perf_stop( &p_port->p_adapter->perf, GetRecvEndpts );\r
-\r
-#if IPOIB_INLINE_RECV\r
-               p_ipoib = &p_desc->buf.ib.pkt;\r
-               p_eth = &p_desc->buf.eth.pkt;\r
-#else  /* IPOIB_INLINE_RECV */\r
-               p_ipoib = &p_desc->p_buf->ib.pkt;\r
-               p_eth = &p_desc->p_buf->eth.pkt;\r
-#endif /*IPOIB_INLINE_RECV */\r
-\r
-               if( p_src )\r
-               {\r
-                       /* Don't report loopback traffic - we requested SW loopback. */\r
-                       if( !cl_memcmp( &p_port->p_adapter->params.conf_mac,\r
-                               &p_src->mac, sizeof(p_port->p_adapter->params.conf_mac) ) )\r
-                       {\r
-                               /*\r
-                                * "This is not the packet you're looking for" - don't update\r
-                                * receive statistics, the packet never happened.\r
-                                */\r
-                               cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );\r
-                               /* Dereference the port object on behalf of the failed recv. */\r
-                               ipoib_port_deref( p_port, ref_recv_loopback );\r
-                               continue;\r
-                       }\r
-               }\r
-\r
-               switch( p_ipoib->hdr.type )\r
-               {\r
-               case ETH_PROT_TYPE_IP:\r
-                       if( len < (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t)) )\r
-                       {\r
-                               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                       ("Received IP packet < min size\n") );\r
-                               status = IB_INVALID_SETTING;\r
-                               break;\r
-                       }\r
-\r
-                       if( p_ipoib->type.ip.hdr.offset ||\r
-                               p_ipoib->type.ip.hdr.prot != IP_PROT_UDP )\r
-                       {\r
-                               /* Unfiltered.  Setup the ethernet header and report. */\r
-                               cl_perf_start( RecvTcp );\r
-                               status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );\r
-                               cl_perf_stop( &p_port->p_adapter->perf, RecvTcp );\r
-                               break;\r
-                       }\r
-\r
-                       /* First packet of a UDP transfer. */\r
-                       if( len <\r
-                               (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t) + sizeof(udp_hdr_t)) )\r
-                       {\r
-                               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                       ("Received UDP packet < min size\n") );\r
-                               status = IB_INVALID_SETTING;\r
-                               break;\r
-                       }\r
-\r
-                       /* Check if DHCP conversion is required. */\r
-                       if( (p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_SERVER &&\r
-                               p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_CLIENT) ||\r
-                               (p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_CLIENT &&\r
-                               p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_SERVER) )\r
-                       {\r
-                               if( len < (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t) +\r
-                                       sizeof(udp_hdr_t) + DHCP_MIN_SIZE) )\r
-                               {\r
-                                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                               ("Received DHCP < min size\n") );\r
-                                       status = IB_INVALID_SETTING;\r
-                                       break;\r
-                               }\r
-                               if ((p_ipoib->type.ip.hdr.ver_hl & 0x0f) != 5 ) {\r
-                                       // If there are IP options in this message, we are in trouble in any case\r
-                                       status = IB_INVALID_SETTING;\r
-                                       break;                                  \r
-                               }\r
-                               /* UDP packet with BOOTP ports in src/dst port numbers. */\r
-                               cl_perf_start( RecvDhcp );\r
-                               status = __recv_dhcp( p_port, p_ipoib, p_eth, p_src, p_dst );\r
-                               cl_perf_stop( &p_port->p_adapter->perf, RecvDhcp );\r
-                       }\r
-                       else\r
-                       {\r
-                               /* Unfiltered.  Setup the ethernet header and report. */\r
-                               cl_perf_start( RecvUdp );\r
-                               status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );\r
-                               cl_perf_stop( &p_port->p_adapter->perf, RecvUdp );\r
-                       }\r
-                       break;\r
-\r
-               case ETH_PROT_TYPE_ARP:\r
-                       if( len < (sizeof(ipoib_hdr_t) + sizeof(ipoib_arp_pkt_t)) )\r
-                       {\r
-                               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                       ("Received ARP < min size\n") );\r
-                               status = IB_INVALID_SETTING;\r
-                               break;\r
-                       }\r
-                       cl_perf_start( RecvArp );\r
-                       status = __recv_arp( p_port, p_wc, p_ipoib, p_eth, &p_src, p_dst );\r
-                       cl_perf_stop( &p_port->p_adapter->perf, RecvArp );\r
-                       len = sizeof(ipoib_hdr_t) + sizeof(arp_pkt_t);\r
-                       break;\r
-\r
-               default:\r
-                       /* Unfiltered.  Setup the ethernet header and report. */\r
-                       cl_perf_start( RecvGen );\r
-                       status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );\r
-                       cl_perf_stop( &p_port->p_adapter->perf, RecvGen );\r
-               }\r
-\r
-               if( status != IB_SUCCESS )\r
-               {\r
-                       /* Update stats. */\r
-                       ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );\r
-                       cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );\r
-                       /* Dereference the port object on behalf of the failed receive. */\r
-                       ipoib_port_deref( p_port, ref_recv_filter );\r
-               }\r
-               else\r
-               {\r
-                       ip_stat_sel_t               ip_stat;\r
-                       p_desc->len =\r
-                               len + sizeof(eth_hdr_t) - sizeof(ipoib_hdr_t);\r
-                       if( p_dst->h_mcast)\r
-                       {\r
-                               if( p_dst->dgid.multicast.raw_group_id[10] == 0xFF &&\r
-                                       p_dst->dgid.multicast.raw_group_id[11] == 0xFF &&\r
-                                       p_dst->dgid.multicast.raw_group_id[12] == 0xFF &&\r
-                                       p_dst->dgid.multicast.raw_group_id[13] == 0xFF )\r
-                               {\r
-                                       p_desc->type = PKT_TYPE_BCAST;\r
-                                       ip_stat = IP_STAT_BCAST_BYTES;\r
-                               }\r
-                               else\r
-                               {\r
-                                       p_desc->type = PKT_TYPE_MCAST;\r
-                                       ip_stat = IP_STAT_MCAST_BYTES;\r
-                               }\r
-                       }\r
-                       else\r
-                       {\r
-                               p_desc->type = PKT_TYPE_UCAST;\r
-                               ip_stat = IP_STAT_UCAST_BYTES;\r
-                               \r
-                       }\r
-                       cl_qlist_insert_tail( p_done_list, &p_desc->item.list_item );\r
-                       ipoib_inc_recv_stat( p_port->p_adapter, ip_stat, len, 1 );  \r
-               }\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_RECV );\r
-       return recv_cnt;\r
-}\r
-\r
-\r
-static ib_api_status_t\r
-__recv_gen(\r
-       IN              const   ipoib_pkt_t* const                      p_ipoib,\r
-               OUT                     eth_pkt_t* const                        p_eth,\r
-       IN                              ipoib_endpt_t* const            p_src,\r
-       IN                              ipoib_endpt_t* const            p_dst )\r
-{\r
-       IPOIB_ENTER( IPOIB_DBG_RECV );\r
-\r
-       if( !p_src || !p_dst )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Received packet with no matching endpoints.\n") );\r
-               return IB_NOT_DONE;\r
-       }\r
-\r
-       /*\r
-        * Fill in the ethernet header.  Note that doing so will overwrite\r
-        * the IPoIB header, so start by moving the information from the IPoIB\r
-        * header.\r
-        */\r
-       p_eth->hdr.type = p_ipoib->hdr.type;\r
-       p_eth->hdr.src = p_src->mac;\r
-       p_eth->hdr.dst = p_dst->mac;\r
-\r
-       if ( p_eth->hdr.dst.addr[0] == 1 && \r
-                p_eth->hdr.type == ETH_PROT_TYPE_IP &&\r
-                p_eth->hdr.dst.addr[2] == 0x5E)  \r
-       {\r
-               p_eth->hdr.dst.addr[1] = 0;\r
-               p_eth->hdr.dst.addr[3] = p_eth->hdr.dst.addr[3] & 0x7f;\r
-       }\r
-       if (p_dst->h_mcast)\r
-               p_dst->is_in_use = TRUE;\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_RECV );\r
-       return IB_SUCCESS;\r
-}\r
-\r
-\r
-static ib_api_status_t\r
-__recv_dhcp(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   ipoib_pkt_t* const                      p_ipoib,\r
-               OUT                     eth_pkt_t* const                        p_eth,\r
-       IN                              ipoib_endpt_t* const            p_src,\r
-       IN                              ipoib_endpt_t* const            p_dst )\r
-{\r
-       ib_api_status_t         status;\r
-       dhcp_pkt_t                      *p_dhcp;\r
-       uint8_t                         *p_option;\r
-       uint8_t                         *p_cid = NULL;\r
-       ib_gid_t                        gid;\r
-       uint8_t                         msg = 0;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_RECV );\r
-\r
-       UNUSED_PARAM( p_port );\r
-\r
-       /* Create the ethernet header. */\r
-       status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("__recv_gen returned %s.\n", \r
-                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-               return status;\r
-       }\r
-\r
-       /* Fixup the payload. */\r
-       p_dhcp = &p_eth->type.ip.prot.udp.dhcp;\r
-       if( p_dhcp->op != DHCP_REQUEST && p_dhcp->op != DHCP_REPLY )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Invalid DHCP op code.\n") );\r
-               return IB_INVALID_SETTING;\r
-       }\r
-\r
-       /*\r
-        * Find the client identifier option, making sure to skip\r
-        * the "magic cookie".\r
-        */\r
-       p_option = &p_dhcp->options[0];\r
-       if ( *(uint32_t *)p_option != DHCP_COOKIE )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("DHCP cookie corrupted.\n") );\r
-               return IB_INVALID_PARAMETER;\r
-       }\r
-\r
-       p_option = &p_dhcp->options[4];\r
-       while( *p_option != DHCP_OPT_END && p_option < &p_dhcp->options[312] )\r
-       {\r
-               switch( *p_option )\r
-               {\r
-               case DHCP_OPT_PAD:\r
-                       p_option++;\r
-                       break;\r
-\r
-               case DHCP_OPT_MSG:\r
-                       msg = p_option[2];\r
-                       p_option += 3;\r
-                       break;\r
-\r
-               case DHCP_OPT_CLIENT_ID:\r
-                       p_cid = p_option;\r
-                       /* Fall through. */\r
-\r
-               default:\r
-                       /*\r
-                        * All other options have a length byte following the option code.\r
-                        * Offset by the length to get to the next option.\r
-                        */\r
-                       p_option += (p_option[1] + 2);\r
-               }\r
-       }\r
-\r
-       switch( msg )\r
-       {\r
-       /* message from client */\r
-       case DHCPDISCOVER:\r
-       case DHCPREQUEST:\r
-       case DHCPDECLINE:\r
-       case DHCPRELEASE:\r
-       case DHCPINFORM:\r
-               if( !p_cid )\r
-               {\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Failed to find required Client-identifier option.\n") );\r
-                       return IB_INVALID_SETTING;\r
-               }\r
-               if( p_dhcp->htype != DHCP_HW_TYPE_IB )\r
-               {\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Invalid hardware address type.\n") );\r
-                       return IB_INVALID_SETTING;\r
-               }\r
-               break;\r
-       /* message from DHCP server */\r
-       case DHCPOFFER:\r
-       case DHCPACK:\r
-       case DHCPNAK:\r
-               break;\r
-\r
-       default:\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Invalide message type.\n") );\r
-               return IB_INVALID_PARAMETER;\r
-       }\r
-       p_eth->type.ip.prot.udp.hdr.chksum = 0;\r
-       p_dhcp->htype = DHCP_HW_TYPE_ETH;\r
-       p_dhcp->hlen = HW_ADDR_LEN;\r
-\r
-       if( p_cid ) /* from client */\r
-       {\r
-               /* Validate that the length and type of the option is as required. */\r
-               if( p_cid[1] != 21 )\r
-               {\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Client-identifier length not 21 as required.\n") );\r
-                       return IB_INVALID_SETTING;\r
-               }\r
-               if( p_cid[2] != DHCP_HW_TYPE_IB )\r
-               {\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Client-identifier type is wrong.\n") );\r
-                       return IB_INVALID_SETTING;\r
-               }\r
-               /*\r
-                * Copy the GID value from the option so that we can make aligned\r
-                * accesses to the contents.\r
-                * Recover CID to standard type.\r
-                */\r
-               cl_memcpy( &gid, &p_cid[7], sizeof(ib_gid_t) );\r
-               p_cid[1] =  HW_ADDR_LEN +1;// CID length \r
-               p_cid[2] =  DHCP_HW_TYPE_ETH;// CID type \r
-               status = ipoib_mac_from_guid( gid.unicast.interface_id, p_port->p_adapter->params.guid_mask, (mac_addr_t*)&p_cid[3] );\r
-               if (status == IB_INVALID_GUID_MASK)\r
-               {\r
-                       IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_ERROR,\r
-                               ("Invalid GUID mask received, rejecting it") );\r
-                       ipoib_create_log(p_port->p_adapter->h_adapter, GUID_MASK_LOG_INDEX, EVENT_IPOIB_WRONG_PARAMETER_WRN);\r
-                       status = IB_SUCCESS;\r
-               }\r
-               p_cid[HW_ADDR_LEN + 3] = DHCP_OPT_END; //terminate tag\r
-       }\r
-       IPOIB_EXIT( IPOIB_DBG_RECV );\r
-       return status;\r
-}\r
-\r
-\r
-static ib_api_status_t\r
-__recv_arp(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ib_wc_t* const                          p_wc,\r
-       IN              const   ipoib_pkt_t* const                      p_ipoib,\r
-               OUT                     eth_pkt_t* const                        p_eth,\r
-       IN                              ipoib_endpt_t** const           pp_src,\r
-       IN                              ipoib_endpt_t* const            p_dst )\r
-{\r
-       ib_api_status_t                 status;\r
-       arp_pkt_t                               *p_arp;\r
-       const ipoib_arp_pkt_t   *p_ib_arp;\r
-       ib_gid_t                                gid;\r
-       mac_addr_t                              mac;\r
-       ipoib_hw_addr_t                 null_hw = {0};\r
-       uint8_t                                 cm_capable = 0;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_RECV );\r
-\r
-       if( !p_dst )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Unknown destination endpoint\n") );\r
-               return IB_INVALID_SETTING;\r
-       }\r
-\r
-       p_ib_arp = &p_ipoib->type.arp;\r
-       p_arp = &p_eth->type.arp;\r
-\r
-       if( p_ib_arp->hw_type != ARP_HW_TYPE_IB )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ARP hardware type is not IB\n") );\r
-               return IB_INVALID_SETTING;\r
-       }\r
-\r
-       if( p_ib_arp->hw_size != sizeof(ipoib_hw_addr_t) )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ARP hardware address size is not sizeof(ipoib_hw_addr_t)\n") );\r
-               return IB_INVALID_SETTING;\r
-       }\r
-\r
-       if( p_ib_arp->prot_type != ETH_PROT_TYPE_IP )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ARP protocal type not IP\n") );\r
-               return IB_INVALID_SETTING;\r
-       }\r
-\r
-       cm_capable = ipoib_addr_get_flags( &p_ib_arp->src_hw );\r
-\r
-       /*\r
-        * If we don't have a source, lookup the endpoint specified in the payload.\r
-        */\r
-       if( !*pp_src )\r
-               *pp_src = __endpt_mgr_get_by_gid( p_port, &p_ib_arp->src_hw.gid );\r
-\r
-       /*\r
-        * If the endpoint exists for the GID, make sure\r
-        * the dlid and qpn match the arp.\r
-        */\r
-       if( *pp_src )\r
-       {\r
-               if( cl_memcmp( &(*pp_src)->dgid, &p_ib_arp->src_hw.gid,\r
-                       sizeof(ib_gid_t) ) )\r
-               {\r
-                       /*\r
-                        * GIDs for the endpoint are different.  The ARP must\r
-                        * have been proxied.  Dereference it.\r
-                        */\r
-                       *pp_src = NULL;\r
-               }\r
-               else if( (*pp_src)->dlid &&\r
-                       (*pp_src)->dlid != p_wc->recv.ud.remote_lid )\r
-               {\r
-                       /* Out of date!  Destroy the endpoint and replace it. */\r
-                       __endpt_mgr_remove( p_port, *pp_src );\r
-                       *pp_src = NULL;\r
-               }\r
-               else if ( ! ((*pp_src)->dlid)) {\r
-                       /* Out of date!  Destroy the endpoint and replace it. */\r
-                       __endpt_mgr_remove( p_port, *pp_src );\r
-                       *pp_src = NULL;\r
-               }\r
-               else if( ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) )\r
-               {\r
-                       if( (*pp_src)->qpn != ipoib_addr_get_qpn( &p_ib_arp->src_hw ) &&\r
-                                p_wc->recv.ud.remote_qp !=     ipoib_addr_get_qpn( &p_ib_arp->src_hw ) )\r
-                       {\r
-                               /* Out of date!  Destroy the endpoint and replace it. */\r
-                               __endpt_mgr_remove( p_port, *pp_src );\r
-                               *pp_src = NULL;\r
-                       }\r
-               }\r
-               else if( (*pp_src)->qpn != p_wc->recv.ud.remote_qp )\r
-               {\r
-                       /* Out of date!  Destroy the endpoint and replace it. */\r
-                       __endpt_mgr_remove( p_port, *pp_src );\r
-                       *pp_src = NULL;\r
-               }\r
-       }\r
-\r
-       /* Do we need to create an endpoint for this GID? */\r
-       if( !*pp_src )\r
-       {\r
-               /* Copy the src GID to allow aligned access */\r
-               cl_memcpy( &gid, &p_ib_arp->src_hw.gid, sizeof(ib_gid_t) );\r
-               status = ipoib_mac_from_guid( gid.unicast.interface_id, p_port->p_adapter->params.guid_mask, &mac );\r
-               if (status == IB_INVALID_GUID_MASK)\r
-               {\r
-                       IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_ERROR,\r
-                               ("Invalid GUID mask received, rejecting it") );\r
-                       ipoib_create_log(p_port->p_adapter->h_adapter, GUID_MASK_LOG_INDEX, EVENT_IPOIB_WRONG_PARAMETER_WRN);\r
-               }\r
-               else if( status != IB_SUCCESS )\r
-               {\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("ipoib_mac_from_guid returned %s\n",\r
-                               p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-                       return status;\r
-               }\r
-               /*\r
-                * Create the endpoint.\r
-                */\r
-               *pp_src = ipoib_endpt_create( &p_ib_arp->src_hw.gid,\r
-                       p_wc->recv.ud.remote_lid, ipoib_addr_get_qpn( &p_ib_arp->src_hw ) );\r
-\r
-               if( !*pp_src )\r
-               {\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("ipoib_endpt_create failed\n") );\r
-                       return status;\r
-               }\r
-\r
-               cl_obj_lock( &p_port->obj );\r
-               status = __endpt_mgr_insert( p_port, mac, *pp_src );\r
-               if( status != IB_SUCCESS )\r
-               {\r
-                       cl_obj_unlock( &p_port->obj );\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("__endpt_mgr_insert return %s \n",\r
-                               p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-                       return status;\r
-               }\r
-\r
-               cl_obj_unlock( &p_port->obj );\r
-       }\r
-\r
-       (*pp_src)->cm_flag = cm_capable;\r
-\r
-       CL_ASSERT( !cl_memcmp(\r
-               &(*pp_src)->dgid, &p_ib_arp->src_hw.gid, sizeof(ib_gid_t) ) );\r
-       CL_ASSERT( ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) ||\r
-               (*pp_src)->qpn == ipoib_addr_get_qpn( &p_ib_arp->src_hw ) );\r
-#if 0\r
-       if( p_port->p_adapter->params.cm_enabled &&\r
-               p_ib_arp->op == ARP_OP_REQ &&\r
-               cm_capable == IPOIB_CM_FLAG_RC )\r
-       {\r
-               /* if we've got ARP request and RC flag is set, \r
-               save SID for connect REQ to be sent in ARP reply\r
-               when requestor's path get resolved */\r
-               if( endpt_cm_get_state( (*pp_src) ) == IPOIB_CM_DISCONNECTED )\r
-               {\r
-                       (*pp_src)->cm_flag = cm_capable;\r
-                       ipoib_addr_set_sid( \r
-                               &(*pp_src)->conn.service_id,\r
-                               ipoib_addr_get_qpn( &p_ib_arp->src_hw ) );\r
-               }\r
-       }\r
-#endif\r
-#if 0 //DBG\r
-       if( p_port->p_adapter->params.cm_enabled )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
-                       (" ARP %s from ENDPT[%p] state %d CM cap: %d QPN: %#x MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",\r
-                       ((p_ib_arp->op == ARP_OP_REQ )? "REQUEST" : "REPLY"),\r
-                       *pp_src, endpt_cm_get_state( *pp_src ), \r
-                       ((cm_capable == IPOIB_CM_FLAG_RC)? 1: 0),\r
-                       cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->src_hw ) ),\r
-                       (*pp_src)->mac.addr[0], (*pp_src)->mac.addr[1],\r
-                       (*pp_src)->mac.addr[2], (*pp_src)->mac.addr[3],\r
-                       (*pp_src)->mac.addr[4], (*pp_src)->mac.addr[5] ));\r
-       }\r
-#endif\r
-\r
-       /* Now swizzle the data. */\r
-       p_arp->hw_type = ARP_HW_TYPE_ETH;\r
-       p_arp->hw_size = sizeof(mac_addr_t);\r
-       p_arp->src_hw = (*pp_src)->mac;\r
-       p_arp->src_ip = p_ib_arp->src_ip;\r
-\r
-       if( cl_memcmp( &p_ib_arp->dst_hw, &null_hw, sizeof(ipoib_hw_addr_t) ) )\r
-       {\r
-               if( cl_memcmp( &p_dst->dgid, &p_ib_arp->dst_hw.gid, sizeof(ib_gid_t) ) )\r
-               {\r
-                       /*\r
-                        * We received bcast ARP packet that means\r
-                        * remote port lets everyone know it was changed IP/MAC\r
-                        * or just activated\r
-                        */\r
-\r
-                       /* Guy: TODO: Check why this check fails in case of Voltaire IPR */\r
-\r
-                       if ( !ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) &&\r
-                                !ib_gid_is_multicast( (const ib_gid_t*)&p_dst->dgid ) )\r
-                       {\r
-                               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                       ("ARP: is not ARP MCAST\n") );\r
-                               return IB_INVALID_SETTING;\r
-                       }\r
-\r
-                       p_arp->dst_hw = p_port->p_local_endpt->mac;\r
-                       p_dst->mac = p_port->p_local_endpt->mac;\r
-                       /*\r
-                        * we don't care what receiver ip addr is,\r
-                        * as long as OS' ARP table is global  ???\r
-                        */\r
-                       p_arp->dst_ip = (net32_t)0;\r
-               }\r
-               else /* we've got reply to our ARP request */\r
-               {\r
-                       p_arp->dst_hw = p_dst->mac;\r
-                       p_arp->dst_ip = p_ib_arp->dst_ip;\r
-                       CL_ASSERT( p_dst->qpn == ipoib_addr_get_qpn( &p_ib_arp->dst_hw ) );\r
-               }\r
-       }\r
-       else /* we got ARP reqeust */\r
-       {\r
-               cl_memclr( &p_arp->dst_hw, sizeof(mac_addr_t) );\r
-               p_arp->dst_ip = p_ib_arp->dst_ip;\r
-       }\r
-\r
-       /*\r
-        * Create the ethernet header.  Note that this is done last so that\r
-        * we have a chance to create a new endpoint.\r
-        */\r
-       status = __recv_gen( p_ipoib, p_eth, *pp_src, p_dst );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("__recv_gen returned %s.\n", \r
-                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-               return status;\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_RECV );\r
-       return IB_SUCCESS;\r
-}\r
-\r
-\r
-static ib_api_status_t\r
-__recv_mgr_prepare_pkt(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ipoib_recv_desc_t*      const   p_desc,\r
-               OUT                     NET_BUFFER_LIST** const         pp_net_buffer_list )\r
-{\r
-       NDIS_STATUS                                                     status;\r
-       uint32_t                                                        pkt_filter;\r
-       ip_stat_sel_t                                           type;\r
-       //NDIS60\r
-       NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO       chksum;\r
-       //NDIS_TCP_IP_CHECKSUM_PACKET_INFO      chksum;\r
-\r
-       PERF_DECLARE( GetNdisPkt );\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_RECV );\r
-\r
-       pkt_filter = p_port->p_adapter->packet_filter;\r
-       /* Check the packet filter. */\r
-       switch( p_desc->type )\r
-       {\r
-       default:\r
-       case PKT_TYPE_UCAST:\r
-               \r
-               if( pkt_filter & NDIS_PACKET_TYPE_PROMISCUOUS ||\r
-                       pkt_filter & NDIS_PACKET_TYPE_ALL_FUNCTIONAL ||\r
-                       pkt_filter & NDIS_PACKET_TYPE_SOURCE_ROUTING ||\r
-                       pkt_filter & NDIS_PACKET_TYPE_DIRECTED )\r
-               {\r
-                       /* OK to report. */\r
-                       type = IP_STAT_UCAST_BYTES;\r
-                       status = NDIS_STATUS_SUCCESS;\r
-                       IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR,\r
-                       ("Received UCAST PKT.\n"));\r
-               }\r
-               else\r
-               {\r
-                       type = IP_STAT_DROPPED;\r
-                       status = NDIS_STATUS_FAILURE;\r
-                       IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR,\r
-                       ("Received UCAST PKT with ERROR !!!!\n"));\r
-               }\r
-               break;\r
-       case PKT_TYPE_BCAST:\r
-               if( pkt_filter & NDIS_PACKET_TYPE_PROMISCUOUS ||\r
-                       pkt_filter & NDIS_PACKET_TYPE_BROADCAST )\r
-               {\r
-                       /* OK to report. */\r
-                       type = IP_STAT_BCAST_BYTES;\r
-                       status = NDIS_STATUS_SUCCESS;\r
-                       IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR,\r
-                       ("Received BCAST PKT.\n"));\r
-               }\r
-               else\r
-               {\r
-                       type = IP_STAT_DROPPED;\r
-                       status = NDIS_STATUS_FAILURE;\r
-                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Received BCAST PKT with ERROR !!!!\n"));\r
-               }\r
-               break;\r
-       case PKT_TYPE_MCAST:\r
-               if( pkt_filter & NDIS_PACKET_TYPE_PROMISCUOUS ||\r
-                       pkt_filter & NDIS_PACKET_TYPE_ALL_MULTICAST ||\r
-                       pkt_filter & NDIS_PACKET_TYPE_MULTICAST )\r
-               {\r
-                       /* OK to report. */\r
-                       type = IP_STAT_MCAST_BYTES;\r
-                       status = NDIS_STATUS_SUCCESS;\r
-                       IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR,\r
-                       ("Received UCAST PKT.\n"));\r
-               }\r
-               else\r
-               {\r
-                       type = IP_STAT_DROPPED;\r
-                       status = NDIS_STATUS_FAILURE;\r
-                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Received MCAST PKT with ERROR !!!!\n"));\r
-               }\r
-               break;\r
-       }\r
-\r
-       if( status != NDIS_STATUS_SUCCESS )\r
-       {\r
-               ipoib_inc_recv_stat( p_port->p_adapter, type, 0, 0 );\r
-               /* Return the receive descriptor to the pool. */\r
-               __buf_mgr_put_recv( p_port, p_desc, NULL );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_RECV,\r
-                       ("Packet filter doesn't match receive.  Dropping.\n") );\r
-               /*\r
-                * Return IB_NOT_DONE since the packet has been completed,\r
-                * but has not consumed an array entry.\r
-                */\r
-               return IB_NOT_DONE;\r
-       }\r
-\r
-       cl_perf_start( GetNdisPkt );\r
-       *pp_net_buffer_list = __buf_mgr_get_ndis_pkt( p_port, p_desc );\r
-       cl_perf_stop( &p_port->p_adapter->perf, GetNdisPkt );\r
-       if( !*pp_net_buffer_list )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("__buf_mgr_get_ndis_pkt failed\n") );\r
-               return IB_INSUFFICIENT_RESOURCES;\r
-       }\r
-\r
-       chksum.Value = 0;\r
-\r
-{\r
-       PNET_BUFFER NetBuffer = NET_BUFFER_LIST_FIRST_NB(*pp_net_buffer_list);\r
-       NET_BUFFER_DATA_LENGTH(NetBuffer) = p_desc->len;\r
-}\r
-       \r
-       switch( p_port->p_adapter->params.recv_chksum_offload )\r
-       {\r
-         default:\r
-               CL_ASSERT( FALSE );\r
-         case CSUM_DISABLED:\r
-               //NDIS60\r
-               //NDIS_PER_PACKET_INFO_FROM_PACKET( *pp_packet, TcpIpChecksumPacketInfo ) =\r
-               //(void*)(uintn_t)chksum.Value;\r
-               NET_BUFFER_LIST_INFO(*pp_net_buffer_list, TcpIpChecksumNetBufferListInfo) = \r
-               (void*)(uintn_t)chksum.Value;\r
-               break;\r
-         case CSUM_ENABLED:\r
-               /* Get the checksums directly from packet information. */\r
-               /* In this case, no one of cheksum's cat get false value */\r
-               /* If hardware checksum failed or wasn't calculated, NDIS will recalculate it again */\r
-               //NDIS60\r
-               //NDIS_PER_PACKET_INFO_FROM_PACKET( *pp_packet, TcpIpChecksumPacketInfo ) = \r
-               NET_BUFFER_LIST_INFO(*pp_net_buffer_list, TcpIpChecksumNetBufferListInfo) =\r
-                       (void*)(uintn_t)(p_desc->ndis_csum.Value);\r
-               break;\r
-         case CSUM_BYPASS:\r
-               /* Flag the checksums as having been calculated. */\r
-               chksum.Receive.TcpChecksumSucceeded = TRUE;\r
-               chksum.Receive.UdpChecksumSucceeded = TRUE;\r
-               chksum.Receive.IpChecksumSucceeded = TRUE;\r
-               //NDIS60\r
-               //NDIS_PER_PACKET_INFO_FROM_PACKET( *pp_packet, TcpIpChecksumPacketInfo ) =\r
-               NET_BUFFER_LIST_INFO(*pp_net_buffer_list, TcpIpChecksumNetBufferListInfo) =\r
-               (void*)(uintn_t)chksum.Value;\r
-               break;\r
-       }\r
-       ipoib_inc_recv_stat( p_port->p_adapter, type, p_desc->len, 1 );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_RECV );\r
-       return IB_SUCCESS;\r
-}\r
-\r
-\r
-static uint32_t\r
-__recv_mgr_build_pkt_array(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              int32_t                                         shortage,\r
-               OUT                     cl_qlist_t* const                       p_done_list,\r
-               OUT                     int32_t* const                          p_discarded )\r
-{\r
-       cl_list_item_t                  *p_item;\r
-       ipoib_recv_desc_t               *p_desc;\r
-       uint32_t                                i = 0;\r
-       ib_api_status_t                 status;\r
-       PERF_DECLARE( PreparePkt );\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_RECV );\r
-\r
-       *p_discarded = 0;\r
-\r
-       /* Move any existing receives to the head to preserve ordering. */\r
-       cl_qlist_insert_list_head( p_done_list, &p_port->recv_mgr.done_list );\r
-       p_item = cl_qlist_remove_head( p_done_list );\r
-       while( p_item != cl_qlist_end( p_done_list ) )\r
-       {\r
-               p_desc = (ipoib_recv_desc_t*)p_item;\r
-\r
-               cl_perf_start( PreparePkt );\r
-               status = __recv_mgr_prepare_pkt( p_port, p_desc,\r
-                       &p_port->recv_mgr.recv_pkt_array[i] );\r
-               cl_perf_stop( &p_port->p_adapter->perf, PreparePkt );\r
-               if( status == IB_SUCCESS )\r
-               {\r
-                       CL_ASSERT( p_port->recv_mgr.recv_pkt_array[i] );\r
-                       if( shortage-- > 0 )\r
-                       {\r
-                               NET_BUFFER_LIST_STATUS(p_port->recv_mgr.recv_pkt_array[i])= NDIS_STATUS_RESOURCES;                                      \r
-                       }\r
-                       else\r
-                       {\r
-                               NET_BUFFER_LIST_STATUS(p_port->recv_mgr.recv_pkt_array[i])=  NDIS_STATUS_SUCCESS;\r
-                       }\r
-                       i++;\r
-               }\r
-               else if( status == IB_NOT_DONE )\r
-               {\r
-                       (*p_discarded)++;\r
-               }\r
-               else\r
-               {\r
-                       IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,\r
-                               ("__recv_mgr_prepare_pkt returned %s\n",\r
-                               p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-                       /* Put all completed receives on the port's done list. */\r
-                       cl_qlist_insert_tail( &p_port->recv_mgr.done_list, p_item );\r
-                       cl_qlist_insert_list_tail( &p_port->recv_mgr.done_list, p_done_list );\r
-                       break;\r
-               }\r
-\r
-               p_item = cl_qlist_remove_head( p_done_list );\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_RECV );\r
-       return i;\r
-}\r
-\r
-\r
-\r
-\r
-/******************************************************************************\r
-*\r
-* Send manager implementation.\r
-*\r
-******************************************************************************/\r
-static void\r
-__send_mgr_construct(\r
-       IN                              ipoib_port_t* const                     p_port )\r
-{\r
-       IPOIB_ENTER( IPOIB_DBG_SEND );\r
-       p_port->send_mgr.depth = 0;\r
-       cl_qlist_init( &p_port->send_mgr.pending_list );\r
-       IPOIB_EXIT( IPOIB_DBG_SEND );\r
-}\r
-\r
-\r
-static void \r
-__pending_list_destroy(\r
-       IN                              ipoib_port_t* const                     p_port )\r
-{\r
-       cl_list_item_t  *p_item;\r
-       NET_BUFFER_LIST         **pp_net_buffer_list, *p_head;\r
-       \r
-       p_head = NULL;\r
-       cl_spinlock_acquire( &p_port->send_lock );\r
-       /* Complete any pending packets. */\r
-       pp_net_buffer_list = &p_head;\r
-       for( p_item = cl_qlist_remove_head( &p_port->send_mgr.pending_list );\r
-               p_item != cl_qlist_end( &p_port->send_mgr.pending_list );\r
-               p_item = cl_qlist_remove_head( &p_port->send_mgr.pending_list ) )\r
-       {\r
-               *pp_net_buffer_list = IPOIB_PACKET_FROM_LIST_ITEM( p_item );\r
-               NET_BUFFER_LIST_STATUS(*pp_net_buffer_list) = NDIS_STATUS_RESET_IN_PROGRESS;\r
-               pp_net_buffer_list = &(NET_BUFFER_LIST_NEXT_NBL(*pp_net_buffer_list));\r
-       }\r
-       cl_spinlock_release( &p_port->send_lock );\r
-       if(p_head)\r
-               NdisMSendNetBufferListsComplete(\r
-            p_port->p_adapter->h_adapter,\r
-            p_head,\r
-            0);   \r
-}\r
-\r
-static void\r
-__send_mgr_destroy(\r
-       IN                              ipoib_port_t* const                     p_port )\r
-{\r
-       IPOIB_ENTER( IPOIB_DBG_SEND );\r
-       __pending_list_destroy(p_port);\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_SEND );\r
-}\r
-\r
-\r
-static NDIS_STATUS\r
-__send_mgr_filter(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   eth_hdr_t* const                        p_eth_hdr,\r
-       IN                              MDL* const                                      p_mdl,\r
-       IN                              size_t                                          buf_len,\r
-       IN                              SCATTER_GATHER_LIST                     *p_sgl,\r
-       IN      OUT                     ipoib_send_desc_t* const        p_desc )\r
-{\r
-       NDIS_STATUS             status;\r
-\r
-       PERF_DECLARE( FilterIp );\r
-       PERF_DECLARE( FilterArp );\r
-       PERF_DECLARE( SendGen );\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_SEND );\r
-\r
-       /*\r
-        * We already checked the ethernet header length, so we know it's safe\r
-        * to decrement the buf_len without underflowing.\r
-        */\r
-       buf_len -= sizeof(eth_hdr_t);\r
-\r
-       switch( p_eth_hdr->type )\r
-       {\r
-       case ETH_PROT_TYPE_IP:\r
-               cl_perf_start( FilterIp );\r
-               status = __send_mgr_filter_ip(\r
-                       p_port, p_eth_hdr, p_mdl, buf_len, p_sgl, p_desc);\r
-               cl_perf_stop( &p_port->p_adapter->perf, FilterIp );\r
-               break;\r
-\r
-       case ETH_PROT_TYPE_ARP:\r
-               cl_perf_start( FilterArp );\r
-               status = __send_mgr_filter_arp(\r
-                       p_port, p_eth_hdr, p_mdl, buf_len, p_desc );\r
-               p_desc->send_dir = SEND_UD_QP;\r
-               cl_perf_stop( &p_port->p_adapter->perf, FilterArp );\r
-               break;\r
-\r
-       default:\r
-               /*\r
-                * The IPoIB spec doesn't define how to send non IP or ARP packets.\r
-                * Just send the payload and hope for the best.\r
-                */\r
-\r
-               p_desc->send_dir = SEND_UD_QP;\r
-               cl_perf_start( SendGen );\r
-               status = __send_gen( p_port, p_desc, p_sgl, 0 );\r
-               cl_perf_stop( &p_port->p_adapter->perf, SendGen );\r
-               break;\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_SEND );\r
-       return status;\r
-}\r
-\r
-\r
-static NDIS_STATUS\r
-__send_copy(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ipoib_send_desc_t* const        p_desc )\r
-{\r
-       NET_BUFFER_LIST                 *p_net_buffer_list;\r
-       NET_BUFFER                              *p_netbuffer;\r
-       MDL                                             *p_mdl;\r
-       UINT                                    tot_len = 0;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_SEND );\r
-\r
-       UNREFERENCED_PARAMETER(p_port);\r
-       UNREFERENCED_PARAMETER(p_desc);\r
-\r
-       p_desc->p_buf = \r
-               NdisAllocateFromNPagedLookasideList( &p_port->buf_mgr.send_buf_list );\r
-       if( !p_desc->p_buf )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Failed to allocate buffer for packet copy.\n") );\r
-               return NDIS_STATUS_RESOURCES;\r
-       }\r
-\r
-       p_mdl = NdisAllocateMdl(p_port->p_adapter->h_adapter,\r
-                                                       p_desc->p_buf,\r
-                                                       p_port->p_adapter->params.xfer_block_size );\r
-       if( !p_mdl )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Failed to allocate MDL\n") );\r
-               return NDIS_STATUS_RESOURCES;\r
-       }\r
-\r
-       p_net_buffer_list = NdisAllocateNetBufferAndNetBufferList(\r
-                                               p_port->buf_mgr.h_send_buf_pool,\r
-                                               0,\r
-                                               0,\r
-                                               p_mdl,\r
-                                               0,\r
-                                               0);\r
-\r
-       if( !p_net_buffer_list )\r
-       {\r
-               NdisFreeMdl(p_mdl);\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,\r
-                       ("Failed to allocate NDIS_PACKET for copy.\n") );\r
-               return NDIS_STATUS_RESOURCES;\r
-       }\r
-\r
-       for (p_netbuffer = NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list); \r
-                p_netbuffer != NULL;\r
-                p_netbuffer = NET_BUFFER_NEXT_NB(p_netbuffer))\r
-       {\r
-               tot_len +=NET_BUFFER_DATA_LENGTH(p_netbuffer);\r
-       }\r
-\r
-       /* Setup the work request. */\r
-       p_desc->send_wr[0].local_ds[1].vaddr = cl_get_physaddr(\r
-               ((uint8_t*)p_desc->p_buf) + sizeof(eth_hdr_t) );\r
-       p_desc->send_wr[0].local_ds[1].length = tot_len - sizeof(eth_hdr_t);\r
-       p_desc->send_wr[0].local_ds[1].lkey = p_port->ib_mgr.lkey;\r
-       p_desc->send_wr[0].wr.num_ds = 2;\r
-       \r
-       /* Free our temp packet now that the data is copied. */\r
-       NdisFreeMdl(p_mdl);\r
-       NdisFreeNetBufferList(p_net_buffer_list);\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_SEND );\r
-       return NDIS_STATUS_SUCCESS;\r
-}\r
-\r
-static inline NDIS_STATUS\r
-__send_mgr_get_eth_hdr(\r
-       IN                              PNET_BUFFER                                     p_net_buffer,\r
-               OUT                     MDL** const                                     pp_mdl,\r
-               OUT                     eth_hdr_t** const                       pp_eth_hdr,\r
-               OUT                     UINT*                                           p_mdl_len)\r
-{\r
-       PUCHAR  p_head = NULL;\r
-       IPOIB_ENTER( IPOIB_DBG_SEND );\r
-\r
-       *pp_mdl = NET_BUFFER_FIRST_MDL(p_net_buffer);\r
-\r
-       NdisQueryMdl(*pp_mdl,&p_head,p_mdl_len,NormalPagePriority);\r
-       if( ! p_head )\r
-       {\r
-               /* Failed to get first buffer. */\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("NdisQueryMdl failed.\n") );\r
-               return NDIS_STATUS_FAILURE;\r
-       }\r
-\r
-       if( *p_mdl_len < sizeof(eth_hdr_t) )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("First buffer in packet smaller than eth_hdr_t: %d.\n",\r
-                       *p_mdl_len) );\r
-               return NDIS_STATUS_BUFFER_TOO_SHORT;\r
-       }\r
-\r
-       *pp_eth_hdr = (eth_hdr_t*)(p_head + NET_BUFFER_CURRENT_MDL_OFFSET(p_net_buffer));\r
-\r
-       IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,\r
-               ("Ethernet header:\n"\r
-               "\tsrc MAC: %02X-%02X-%02X-%02X-%02X-%02X\n"\r
-               "\tdst MAC: %02X-%02X-%02X-%02X-%02X-%02X\n"\r
-               "\tprotocol type: %04X\n",\r
-               (*pp_eth_hdr)->src.addr[0], (*pp_eth_hdr)->src.addr[1],\r
-               (*pp_eth_hdr)->src.addr[2], (*pp_eth_hdr)->src.addr[3],\r
-               (*pp_eth_hdr)->src.addr[4], (*pp_eth_hdr)->src.addr[5],\r
-               (*pp_eth_hdr)->dst.addr[0], (*pp_eth_hdr)->dst.addr[1],\r
-               (*pp_eth_hdr)->dst.addr[2], (*pp_eth_hdr)->dst.addr[3],\r
-               (*pp_eth_hdr)->dst.addr[4], (*pp_eth_hdr)->dst.addr[5],\r
-               cl_ntoh16( (*pp_eth_hdr)->type )) );\r
-\r
-       return NDIS_STATUS_SUCCESS;\r
-}\r
-\r
-\r
-#if !IPOIB_USE_DMA\r
-/* Send using the MDL's page information rather than the SGL. */\r
-static ib_api_status_t\r
-__send_gen(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ipoib_send_desc_t* const        p_desc )\r
-{\r
-       uint32_t                                i, j = 1;\r
-       ULONG                                   offset;\r
-       MDL                                             *p_mdl;\r
-       UINT                                    num_pages, tot_len;\r
-       ULONG                                   buf_len;\r
-       PPFN_NUMBER                             page_array;\r
-       boolean_t                               hdr_done = FALSE;\r
-       ib_api_status_t                 status;\r
-       PNET_BUFFER                             p_net_buf;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_SEND );\r
-       p_net_buf = NET_BUFFER_LIST_FIRST_NB(p_desc->p_netbuf_list);\r
-       NdisQueryBuffer( p_net_buf, &num_pages, NULL, &p_mdl,\r
-               &tot_len );\r
-\r
-       if( !p_mdl )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("No buffers associated with packet.\n") );\r
-               return IB_ERROR;\r
-       }\r
-\r
-       /* Remember that one of the DS entries is reserved for the IPoIB header. */\r
-       if( num_pages >= MAX_SEND_SGE )\r
-       {\r
-               IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,\r
-                       ("Too many buffers to fit in WR ds_array.  Copying data.\n") );\r
-               status = __send_copy( p_port, p_desc );\r
-               IPOIB_EXIT( IPOIB_DBG_SEND );\r
-               return status;\r
-       }\r
-\r
-       CL_ASSERT( tot_len > sizeof(eth_hdr_t) );\r
-       CL_ASSERT( tot_len <= p_port->p_adapter->params.xfer_block_size );\r
-       /*\r
-        * Assume that the ethernet header is always fully contained\r
-        * in the first page of the first MDL.  This makes for much\r
-        * simpler code.\r
-        */\r
-       offset = MmGetMdlByteOffset( p_mdl ) + sizeof(eth_hdr_t);\r
-       CL_ASSERT( offset <= PAGE_SIZE );\r
-\r
-       while( tot_len )\r
-       {\r
-               buf_len = MmGetMdlByteCount( p_mdl );\r
-               page_array = MmGetMdlPfnArray( p_mdl );\r
-               CL_ASSERT( page_array );\r
-               i = 0;\r
-               if( !hdr_done )\r
-               {\r
-                       CL_ASSERT( buf_len >= sizeof(eth_hdr_t) );\r
-                       /* Skip the ethernet header. */\r
-                       buf_len -= sizeof(eth_hdr_t);\r
-                       CL_ASSERT( buf_len <= p_port->p_adapter->params.payload_mtu );\r
-                       if( buf_len )\r
-                       {\r
-                               /* The ethernet header is a subset of this MDL. */\r
-                               CL_ASSERT( i == 0 );\r
-                               if( offset < PAGE_SIZE )\r
-                               {\r
-                                       p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;\r
-                                       p_desc->send_wr[0].local_ds[j].vaddr = (page_array[i] << PAGE_SHIFT);\r
-                                       /* Add the byte offset since we're on the 1st page. */\r
-                                       p_desc->send_wr[0].local_ds[j].vaddr += offset;\r
-                                       if( offset + buf_len > PAGE_SIZE )\r
-                                       {\r
-                                               p_desc->send_wr[0].local_ds[j].length = PAGE_SIZE - offset;\r
-                                               buf_len -= p_desc->send_wr[0].local_ds[j].length;\r
-                                       }\r
-                                       else\r
-                                       {\r
-                                               p_desc->send_wr[0].local_ds[j].length = buf_len;\r
-                                               buf_len = 0;\r
-                                       }\r
-                                       /* This data segment is done.  Move to the next. */\r
-                                       j++;\r
-                               }\r
-                               /* This page is done.  Move to the next. */\r
-                               i++;\r
-                       }\r
-                       /* Done handling the ethernet header. */\r
-                       hdr_done = TRUE;\r
-               }\r
-\r
-               /* Finish this MDL */\r
-               while( buf_len )\r
-               {\r
-                       p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;\r
-                       p_desc->send_wr[0].local_ds[j].vaddr = (page_array[i] << PAGE_SHIFT);\r
-                       /* Add the first page's offset if we're on the first page. */\r
-                       if( i == 0 )\r
-                               p_desc->send_wr[0].local_ds[j].vaddr += MmGetMdlByteOffset( p_mdl );\r
-\r
-                       if( i == 0 && (MmGetMdlByteOffset( p_mdl ) + buf_len) > PAGE_SIZE )\r
-                       {\r
-                               /* Buffers spans pages. */\r
-                               p_desc->send_wr[0].local_ds[j].length =\r
-                                       PAGE_SIZE - MmGetMdlByteOffset( p_mdl );\r
-                               buf_len -= p_desc->send_wr[0].local_ds[j].length;\r
-                               /* This page is done.  Move to the next. */\r
-                               i++;\r
-                       }\r
-                       else\r
-                       {\r
-                               /* Last page of the buffer. */\r
-                               p_desc->send_wr[0].local_ds[j].length = buf_len;\r
-                               buf_len = 0;\r
-                       }\r
-                       /* This data segment is done.  Move to the next. */\r
-                       j++;\r
-               }\r
-\r
-               tot_len -= MmGetMdlByteCount( p_mdl );\r
-               if( !tot_len )\r
-                       break;\r
-\r
-               NdisGetNextBuffer( p_mdl, &p_mdl );\r
-               if( !p_mdl )\r
-               {\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Failed to get next buffer.\n") );\r
-                       return IB_ERROR;\r
-               }\r
-       }\r
-\r
-       /* Set the number of data segments. */\r
-       p_desc->send_wr[0].wr.num_ds = j;\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_SEND );\r
-       return IB_SUCCESS;\r
-}\r
-\r
-#else\r
-\r
-#if 0\r
-void \r
-ipoib_process_sg_list1(\r
-    IN  PDEVICE_OBJECT          pDO,\r
-    IN  PVOID                   pIrp,\r
-    IN  PSCATTER_GATHER_LIST    p_sgl,\r
-    IN  PVOID                   context\r
-    )\r
-{\r
-       int i;\r
-       char temp[200];\r
-       for (i = 0 ; i < 1;i++)\r
-               temp[i] = 5;\r
-}\r
-#endif\r
-\r
-void \r
-ipoib_process_sg_list(\r
-    IN  PDEVICE_OBJECT          pDO,\r
-    IN  PVOID                   pIrp,\r
-    IN  PSCATTER_GATHER_LIST    p_sgl,\r
-    IN  PVOID                   context\r
-    )\r
-{      \r
-       NDIS_STATUS                             status;\r
-       ipoib_port_t                    *p_port;\r
-       MDL                                             *p_mdl;\r
-       eth_hdr_t                               *p_eth_hdr;\r
-       UINT                                    mdl_len;\r
-       static ipoib_send_desc_t                *p_desc = NULL;\r
-       ib_send_wr_t                    *p_wr_failed;\r
-       NET_BUFFER_LIST                 *p_net_buffer_list;\r
-       NET_BUFFER                              *p_netbuf;\r
-       boolean_t                               from_queue;\r
-       ib_api_status_t                 ib_status;\r
-       ULONG                                   complete_flags = 0;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_SEND );\r
-\r
-       UNREFERENCED_PARAMETER(pDO);\r
-       UNREFERENCED_PARAMETER(pIrp);\r
-\r
-       PERF_DECLARE( SendCopy );\r
-       PERF_DECLARE( BuildSendDesc );\r
-       PERF_DECLARE( GetEthHdr );\r
-       PERF_DECLARE( QueuePacket );\r
-       PERF_DECLARE( SendMgrQueue );\r
-       PERF_DECLARE( PostSend );\r
-       PERF_DECLARE( ProcessFailedSends );\r
-       PERF_DECLARE( GetEndpt );\r
-\r
-\r
-       p_netbuf = (NET_BUFFER*)context;\r
-       p_net_buffer_list = (NET_BUFFER_LIST*)IPOIB_NET_BUFFER_LIST_FROM_NETBUFFER(p_netbuf);\r
-       p_port = (ipoib_port_t*)IPOIB_PORT_FROM_PACKET(p_net_buffer_list);\r
-       NDIS_SET_SEND_COMPLETE_FLAG(complete_flags, NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL);\r
-\r
-\r
-       cl_spinlock_acquire( &p_port->send_lock );\r
-       if (p_desc == NULL) {\r
-               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_SEND, ("Allocating send_desc First Time\n") );\r
-               p_desc = ExAllocatePoolWithTag(NonPagedPool ,sizeof (ipoib_send_desc_t), 'XMXA');\r
-       }\r
-       ASSERT(p_desc);\r
-       p_desc->p_netbuf_list = p_net_buffer_list;\r
-       p_desc->p_endpt = NULL;\r
-       p_desc->p_buf = NULL;\r
-       p_desc->num_wrs = 1;\r
-\r
-       //IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,\r
-               //                              ("\n*******\nRECEIVED NB= %x with SG= %x\n********\n", p_netbuf, p_sgl) );\r
-       /* Get the ethernet header so we can find the endpoint. */\r
-       cl_perf_start( GetEthHdr );\r
-       status = __send_mgr_get_eth_hdr(\r
-               p_netbuf, &p_mdl, &p_eth_hdr, &mdl_len );\r
-       cl_perf_stop( &p_port->p_adapter->perf, GetEthHdr );\r
-\r
-       if( status != NDIS_STATUS_SUCCESS )\r
-       {\r
-               cl_perf_start( ProcessFailedSends );\r
-               /* fail  net buffer list */\r
-               __process_failed_send( p_port, p_desc, status, complete_flags);\r
-               cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends );\r
-               goto send_end;\r
-       }\r
-       //from_queue = (boolean_t)(IPOIB_FROM_QUEUE(p_netbuf) == (void*)1);\r
-       from_queue = (boolean_t)(IPOIB_FROM_QUEUE(p_netbuf) != NULL);\r
-       if (from_queue)\r
-       {\r
-               cl_perf_start( GetEndpt );\r
-               status = __endpt_mgr_ref( p_port, p_eth_hdr->dst, &p_desc->p_endpt );\r
-               cl_perf_stop( &p_port->p_adapter->perf, GetEndpt );\r
-               if( status == NDIS_STATUS_PENDING )\r
-               {\r
-                       IPOIB_FROM_QUEUE(p_netbuf) = p_sgl;\r
-                       cl_qlist_insert_head( &p_port->send_mgr.pending_list,\r
-                               IPOIB_LIST_ITEM_FROM_PACKET( p_desc->p_netbuf_list ) );\r
-                       goto send_end;\r
-               }\r
-               else if( status != NDIS_STATUS_SUCCESS )\r
-               {\r
-                       ASSERT( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION );\r
-\r
-                       if( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )\r
-                       {\r
-                               if( ipoib_port_join_mcast( p_port, p_eth_hdr->dst,\r
-                                       IB_MC_REC_STATE_FULL_MEMBER) == IB_SUCCESS )\r
-                               {\r
-                                       IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,\r
-                                               ("Multicast Mac - trying to join.\n") );\r
-                                       IPOIB_FROM_QUEUE(p_netbuf) = p_sgl;\r
-                                       cl_qlist_insert_head( &p_port->send_mgr.pending_list,\r
-                                               IPOIB_LIST_ITEM_FROM_PACKET( p_desc->p_netbuf_list ) );\r
-                                       goto send_end;\r
-                               }\r
-                       }\r
-                       /*\r
-                        * Complete the send as if we sent it - WHQL tests don't like the\r
-                        * sends to fail.\r
-                        */\r
-                       cl_perf_start( ProcessFailedSends );\r
-                       __process_failed_send( p_port, p_desc, NDIS_STATUS_SUCCESS,complete_flags );\r
-                       cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends );\r
-                       goto send_end;\r
-               }\r
-       }\r
-       else\r
-       {\r
-               cl_perf_start( SendMgrQueue );\r
-               if ( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) && \r
-                        p_eth_hdr->type == ETH_PROT_TYPE_IP &&\r
-                        !ETH_IS_BROADCAST( p_eth_hdr->dst.addr ) ) \r
-               {\r
-                       ip_hdr_t                        *p_ip_hdr;\r
-                       uint8_t                         *p_tmp;\r
-                       MDL                                     *p_ip_hdr_mdl;\r
-                       UINT                            ip_hdr_mdl_len;\r
-\r
-                       if(mdl_len >= sizeof(ip_hdr_t) + sizeof(eth_hdr_t))\r
-                       {\r
-                               p_ip_hdr = (ip_hdr_t*)(p_eth_hdr + 1);\r
-                       }\r
-                       else\r
-                       {\r
-                               NdisGetNextMdl(p_mdl,&p_ip_hdr_mdl);\r
-                               // Extract the ip hdr \r
-                               if( !p_ip_hdr_mdl )\r
-                               {\r
-                                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                               ("Failed to get IP header buffer.\n") );\r
-                                       goto mc_end;\r
-                               }       \r
-                               NdisQueryMdl(p_ip_hdr_mdl,&p_tmp,&ip_hdr_mdl_len,NormalPagePriority);\r
-                               if( !p_tmp )\r
-                               {\r
-                                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                               ("Failed to get IP header.\n") );\r
-                                       goto mc_end;\r
-                               }                                       \r
-                               if( ip_hdr_mdl_len < sizeof(ip_hdr_t) )\r
-                               {\r
-                                       /* This buffer is done for.  Get the next buffer. */\r
-                                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                               ("Buffer too small for IP packet.\n") );\r
-                                       goto mc_end;\r
-                               }\r
-                               p_ip_hdr = (ip_hdr_t*)(p_tmp + NET_BUFFER_CURRENT_MDL_OFFSET(p_netbuf));\r
-                               p_eth_hdr->dst.addr[1] = ((unsigned char*)&p_ip_hdr->dst_ip)[0] & 0x0f;\r
-                               p_eth_hdr->dst.addr[3] = ((unsigned char*)&p_ip_hdr->dst_ip)[1];\r
-                       }\r
-               }\r
-mc_end:\r
-               status = __send_mgr_queue( p_port, p_eth_hdr, &p_desc->p_endpt );\r
-               cl_perf_stop( &p_port->p_adapter->perf, SendMgrQueue );\r
-               if( status == NDIS_STATUS_PENDING )\r
-               {\r
-                       /* Queue net buffer list. */\r
-                       cl_perf_start( QueuePacket );\r
-                       NET_BUFFER_LIST_NEXT_NBL(p_net_buffer_list) = NULL;\r
-                       IPOIB_FROM_QUEUE(p_netbuf) = p_sgl;\r
-                       cl_qlist_insert_tail( &p_port->send_mgr.pending_list,\r
-                                       IPOIB_LIST_ITEM_FROM_PACKET(p_net_buffer_list) );\r
-                       cl_perf_stop( &p_port->p_adapter->perf, QueuePacket );\r
-                       goto send_end;\r
-               }\r
-               if( status != NDIS_STATUS_SUCCESS )\r
-               {\r
-                       ASSERT( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION );\r
-                       /*\r
-                        * Complete the send as if we sent it - WHQL tests don't like the\r
-                        * sends to fail.\r
-                        */\r
-                       cl_perf_start( ProcessFailedSends );\r
-                       __process_failed_send( p_port, p_desc, NDIS_STATUS_SUCCESS, complete_flags );\r
-                       cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends );\r
-                       goto send_end;\r
-               }\r
-       }\r
-       cl_perf_start( BuildSendDesc );\r
-       status = __build_send_desc( p_port, p_eth_hdr, p_mdl, mdl_len, p_sgl, p_desc );\r
-       cl_perf_stop( &p_port->p_adapter->perf, BuildSendDesc );\r
-\r
-       if( status != NDIS_STATUS_SUCCESS )\r
-       {\r
-               cl_perf_start( ProcessFailedSends );\r
-               __process_failed_send( p_port, p_desc, status, complete_flags );\r
-               cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends );\r
-               goto send_end;\r
-       }\r
-\r
-       /* Post the WR. */\r
-       cl_perf_start( PostSend );\r
-       cl_msg_out("sending packet with wr-id =0x%x\n",&p_desc->send_wr[0].wr.wr_id );\r
-       ib_status = p_port->p_adapter->p_ifc->post_send( p_port->ib_mgr.h_qp, &p_desc->send_wr[0].wr, &p_wr_failed );\r
-       cl_perf_stop( &p_port->p_adapter->perf, PostSend );\r
-       if( ib_status != IB_SUCCESS )\r
-       {\r
-               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ib_post_send returned %s\n", \r
-                       p_port->p_adapter->p_ifc->get_err_str( ib_status )) );\r
-               cl_perf_start( ProcessFailedSends );\r
-               __process_failed_send( p_port, p_desc, NDIS_STATUS_FAILURE, complete_flags );\r
-               cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends );\r
-               /* Flag the adapter as hung since posting is busted. */\r
-               p_port->p_adapter->hung = TRUE;\r
-       }\r
-       cl_atomic_inc( &p_port->send_mgr.depth );\r
-\r
-send_end:\r
-       if (status != NDIS_STATUS_SUCCESS) {\r
-//             IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_SEND,\r
-       //                                      ("Free S/G List: 0x%x.\n", (UINT) (PVOID) p_sgl) );\r
-               /*NdisMFreeNetBufferSGList(\r
-                       p_port->p_adapter->NdisMiniportDmaHandle,\r
-                       p_sgl,\r
-                       p_netbuf);*/\r
-               \r
-       }\r
-                       \r
-                       \r
-       cl_spinlock_release( &p_port->send_lock );\r
-       IPOIB_EXIT( IPOIB_DBG_SEND );\r
-}\r
-\r
-static NDIS_STATUS\r
-__send_gen(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ipoib_send_desc_t* const        p_desc,\r
-       IN                              SCATTER_GATHER_LIST                     *p_sgl,\r
-       IN                              INT                                                     lso_data_index\r
-        )\r
-{\r
-       ib_api_status_t                 status;\r
-       uint32_t                                i, j = 1;\r
-       uint32_t                                offset = sizeof(eth_hdr_t);\r
-       PERF_DECLARE( SendCopy );\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_SEND );\r
-\r
-       if( !p_sgl )\r
-       {\r
-               ASSERT( p_sgl );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Failed to get SGL from packet.\n") );\r
-               return NDIS_STATUS_FAILURE;\r
-       }\r
-\r
-       /* Remember that one of the DS entries is reserved for the IPoIB header. */\r
-       if( ( p_sgl->NumberOfElements >= MAX_SEND_SGE ||\r
-               p_sgl->Elements[0].Length < sizeof(eth_hdr_t)) )\r
-       {\r
-\r
-               IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,\r
-                       ("Too many buffers %d to fit in WR ds_array[%d] \\r
-                        Or buffer[0] length %d < Eth header. Copying data.\n",\r
-                       p_sgl->NumberOfElements, MAX_SEND_SGE,  p_sgl->Elements[0].Length ) );\r
-               status = NDIS_STATUS_RESOURCES;\r
-               if( !p_port->p_adapter->params.cm_enabled )\r
-               {\r
-                       cl_perf_start( SendCopy );\r
-                       status = __send_copy( p_port, p_desc );\r
-                       cl_perf_stop( &p_port->p_adapter->perf, SendCopy );\r
-               }\r
-               IPOIB_EXIT( IPOIB_DBG_SEND );\r
-               return status;\r
-       }\r
-\r
-       /*\r
-        * Skip the ethernet header.  It is either the first element,\r
-        * or part of it.\r
-        */\r
-       i = 0;\r
-       if( lso_data_index )\r
-       { /* we have an LSO packet */\r
-               i = lso_data_index;\r
-               j = 0;\r
-       }\r
-       else while( offset )\r
-       {\r
-               if( p_sgl->Elements[i].Length <= offset )\r
-               {\r
-                       offset -= p_sgl->Elements[i++].Length;\r
-               }\r
-               else\r
-               {\r
-                       p_desc->send_wr[0].local_ds[j].vaddr =\r
-                               p_sgl->Elements[i].Address.QuadPart + offset;\r
-                       p_desc->send_wr[0].local_ds[j].length =\r
-                               p_sgl->Elements[i].Length - offset;\r
-                       p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;\r
-                       i++;\r
-                       j++;\r
-                       break;\r
-               }\r
-       }\r
-       /* Now fill in the rest of the local data segments. */\r
-       while( i < p_sgl->NumberOfElements )\r
-       {\r
-               p_desc->send_wr[0].local_ds[j].vaddr = p_sgl->Elements[i].Address.QuadPart;\r
-               p_desc->send_wr[0].local_ds[j].length = p_sgl->Elements[i].Length;\r
-               p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;\r
-               i++;\r
-               j++;\r
-       }\r
-\r
-       /* Set the number of data segments. */\r
-       p_desc->send_wr[0].wr.num_ds = j;\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_SEND );\r
-       return NDIS_STATUS_SUCCESS;\r
-}\r
-#endif\r
-\r
-\r
-static NDIS_STATUS\r
-__send_mgr_filter_ip(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   eth_hdr_t* const                        p_eth_hdr,\r
-       IN                              MDL*                                            p_mdl,\r
-       IN                              size_t                                          buf_len,\r
-       IN                              SCATTER_GATHER_LIST                     *p_sgl,\r
-       IN      OUT                     ipoib_send_desc_t* const        p_desc )\r
-{\r
-       NDIS_STATUS             status;\r
-       ip_hdr_t                *p_ip_hdr;\r
-       uint32_t                ip_packet_len;\r
-       size_t                  iph_size_in_bytes;\r
-       size_t                  iph_options_size;\r
-       \r
-       PERF_DECLARE( QueryIp );\r
-       PERF_DECLARE( SendTcp );\r
-       PERF_DECLARE( FilterUdp );\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_SEND );\r
-\r
-       if( !buf_len )\r
-       {\r
-               cl_perf_start( QueryIp );\r
-               NdisGetNextMdl ( p_mdl, &p_mdl );\r
-               if( !p_mdl )\r
-               {\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Failed to get IP header buffer.\n") );\r
-                       return NDIS_STATUS_FAILURE;\r
-               }\r
-\r
-               NdisQueryMdl(p_mdl, &p_ip_hdr, &buf_len, NormalPagePriority);\r
-               if( !p_ip_hdr )\r
-               {\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Failed to query IP header buffer.\n") );\r
-                       return NDIS_STATUS_FAILURE;\r
-               }\r
-               cl_perf_stop( &p_port->p_adapter->perf, QueryIp );\r
-       }\r
-       else\r
-       {\r
-               p_ip_hdr = (ip_hdr_t*)(p_eth_hdr + 1);\r
-       }\r
-       if( buf_len < sizeof(ip_hdr_t) )\r
-       {\r
-               /* This buffer is done for.  Get the next buffer. */\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Buffer too small for IP packet.\n") );\r
-               return NDIS_STATUS_BUFFER_TOO_SHORT;\r
-       }\r
-\r
-       switch( p_ip_hdr->prot )\r
-       {\r
-       case IP_PROT_UDP:\r
-\r
-               cl_perf_start( FilterUdp );\r
-               status = __send_mgr_filter_udp(\r
-                       p_port, p_ip_hdr, p_mdl, (buf_len - sizeof(ip_hdr_t)), p_sgl, p_desc );\r
-               cl_perf_stop( &p_port->p_adapter->perf, FilterUdp );\r
-               if( status == NDIS_STATUS_PENDING )\r
-               {  /* not DHCP packet, keep going */\r
-                       if( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )\r
-                               p_desc->send_dir = SEND_UD_QP;\r
-                       else\r
-                               p_desc->send_dir = SEND_RC_QP;\r
-                       break;\r
-               }\r
-               return status;\r
-       \r
-       case IP_PROT_TCP:\r
-               p_desc->send_dir = SEND_RC_QP;\r
-               break;\r
-       case IP_PROT_IGMP:\r
-               /*\r
-               In igmp packet I saw that iph arrive in 2 NDIS_BUFFERs:\r
-               1. iph\r
-               2. ip options\r
-                               So to get the IGMP packet we need to skip the ip options NDIS_BUFFER\r
-                       */\r
-                       iph_size_in_bytes = (p_ip_hdr->ver_hl & 0xf) * 4;\r
-                       iph_options_size = iph_size_in_bytes - buf_len;\r
-                       buf_len -= sizeof(ip_hdr_t);//without ipheader\r
-\r
-                       /*\r
-               Could be a case that arrived igmp packet not from type IGMPv2 ,\r
-               but IGMPv1 or IGMPv3.\r
-               We anyway pass it to __send_mgr_filter_igmp_v2().\r
-               */\r
-               status =\r
-                       __send_mgr_filter_igmp_v2( p_port, p_ip_hdr, iph_options_size, p_mdl, buf_len );\r
-               if( status != NDIS_STATUS_SUCCESS )\r
-                       return status;\r
-\r
-       case IP_PROT_ICMP:\r
-               p_desc->send_dir = SEND_UD_QP;\r
-       default:\r
-               break;\r
-       }\r
-       \r
-       if( !p_port->p_adapter->params.cm_enabled )\r
-       {\r
-               p_desc->send_dir = SEND_UD_QP;\r
-               goto send_gen;\r
-       }\r
-       else if( endpt_cm_get_state( p_desc->p_endpt ) != IPOIB_CM_CONNECTED )\r
-       {\r
-               p_desc->send_dir = SEND_UD_QP;\r
-       }\r
-       if( p_desc->send_dir == SEND_UD_QP )\r
-       {\r
-               ip_packet_len = cl_ntoh16( p_ip_hdr->length );\r
-               if( ip_packet_len  > p_port->p_adapter->params.payload_mtu )\r
-               {\r
-                       //TODO: NDIS60\r
-                       #if 0\r
-                       status = __send_fragments( p_port, p_desc, (eth_hdr_t* const)p_eth_hdr,\r
-                                               (ip_hdr_t* const)p_ip_hdr, (uint32_t)buf_len, p_mdl );\r
-                       return status;\r
-                       #endif\r
-                       ASSERT(FALSE);\r
-               }\r
-       }\r
-\r
-send_gen:\r
-       cl_perf_start( SendTcp );\r
-       status = __send_gen( p_port, p_desc, p_sgl, 0 );\r
-       cl_perf_stop( &p_port->p_adapter->perf, SendTcp );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_SEND );\r
-       return status;\r
-}\r
-\r
-static NDIS_STATUS\r
-__send_mgr_filter_igmp_v2(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   ip_hdr_t* const                         p_ip_hdr,\r
-       IN                              size_t                                          iph_options_size,\r
-       IN                              MDL*                                            p_mdl,\r
-       IN                              size_t                                          buf_len )\r
-{\r
-       igmp_v2_hdr_t           *p_igmp_v2_hdr = NULL;\r
-       NDIS_STATUS                     endpt_status;\r
-       ipoib_endpt_t*          p_endpt = NULL;\r
-       mac_addr_t                      fake_mcast_mac;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_SEND );\r
-\r
-       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,\r
-                        ("buf_len = %d,iph_options_size = %d\n",(int)buf_len,(int)iph_options_size ) );\r
-\r
-       if( !buf_len )\r
-       {\r
-               // To get the IGMP packet we need to skip the ip options NDIS_BUFFER (if exists)\r
-               while ( iph_options_size )\r
-               {\r
-                       NdisGetNextMdl( p_mdl, &p_mdl );\r
-                       if( !p_mdl )\r
-                       {\r
-                               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                       ("Failed to get IGMPv2 header buffer.\n") );\r
-                               return NDIS_STATUS_FAILURE;\r
-                       }\r
-                       NdisQueryMdl( p_mdl, &p_igmp_v2_hdr, &buf_len, NormalPagePriority );\r
-                       if( !p_igmp_v2_hdr )\r
-                       {\r
-                               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                       ("Failed to query IGMPv2 header buffer.\n") );\r
-                               return NDIS_STATUS_FAILURE;\r
-                       }\r
-                       iph_options_size-=buf_len;\r
-               }\r
-        \r
-               NdisGetNextMdl( p_mdl, &p_mdl );\r
-               if( !p_mdl )\r
-               {\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Failed to get IGMPv2 header buffer.\n") );\r
-                       return NDIS_STATUS_FAILURE;\r
-               }\r
-               NdisQueryMdl( p_mdl, &p_igmp_v2_hdr, &buf_len, NormalPagePriority );\r
-               if( !p_igmp_v2_hdr )\r
-               {\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Failed to query IGMPv2 header buffer.\n") );\r
-                       return NDIS_STATUS_FAILURE;\r
-               }\r
-       }\r
-       else\r
-       {\r
-               /* assuming ip header and options are in the same packet */\r
-               p_igmp_v2_hdr = GetIpPayloadPtr(p_ip_hdr);\r
-       }\r
-       /* Get the IGMP header length. */\r
-       if( buf_len < sizeof(igmp_v2_hdr_t) )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Buffer not large enough for IGMPv2 packet.\n") );\r
-               return NDIS_STATUS_BUFFER_TOO_SHORT;\r
-       }\r
-\r
-       // build fake mac from igmp packet group address\r
-       fake_mcast_mac.addr[0] = 1;\r
-       fake_mcast_mac.addr[1] = ((unsigned char*)&p_igmp_v2_hdr->group_address)[0] & 0x0f;\r
-       fake_mcast_mac.addr[2] = 0x5E;\r
-       fake_mcast_mac.addr[3] = ((unsigned char*)&p_igmp_v2_hdr->group_address)[1];\r
-       fake_mcast_mac.addr[4] = ((unsigned char*)&p_igmp_v2_hdr->group_address)[2];\r
-       fake_mcast_mac.addr[5] = ((unsigned char*)&p_igmp_v2_hdr->group_address)[3];\r
-\r
-       switch ( p_igmp_v2_hdr->type )\r
-       {\r
-       case IGMP_V2_MEMBERSHIP_REPORT:\r
-               /* \r
-                       This mean that some body open listener on this group \r
-                       Change type of mcast endpt to SEND_RECV endpt. So mcast garbage collector \r
-                       will not delete this mcast endpt.\r
-               */\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,\r
-                       ("Catched IGMP_V2_MEMBERSHIP_REPORT message\n") );\r
-               endpt_status = __endpt_mgr_ref( p_port, fake_mcast_mac, &p_endpt );\r
-               if ( p_endpt )\r
-               {\r
-                       cl_obj_lock( &p_port->obj );\r
-                       p_endpt->is_mcast_listener = TRUE;\r
-                       cl_obj_unlock( &p_port->obj );\r
-            ipoib_endpt_deref( p_endpt );\r
-               }\r
-               break;\r
-\r
-       case IGMP_V2_LEAVE_GROUP:\r
-               /* \r
-                       This mean that somebody CLOSE listener on this group .\r
-                   Change type of mcast endpt to SEND_ONLY endpt. So mcast \r
-                       garbage collector will delete this mcast endpt next time.\r
-               */\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,\r
-                            ("Catched IGMP_V2_LEAVE_GROUP message\n") );\r
-               endpt_status = __endpt_mgr_ref( p_port, fake_mcast_mac, &p_endpt );\r
-               if ( p_endpt )\r
-               {\r
-                       cl_obj_lock( &p_port->obj );\r
-                       p_endpt->is_mcast_listener = FALSE;\r
-                       p_endpt->is_in_use = FALSE;\r
-                       cl_obj_unlock( &p_port->obj );\r
-                       ipoib_endpt_deref( p_endpt );\r
-               }\r
-\r
-               __port_do_mcast_garbage(p_port);\r
-\r
-               break;\r
-\r
-       default:\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,\r
-                            ("Send Unknown IGMP message: 0x%x \n", p_igmp_v2_hdr->type ) );\r
-               break;\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_SEND );\r
-       return NDIS_STATUS_SUCCESS;\r
-}\r
-\r
-static NDIS_STATUS\r
-__send_mgr_filter_udp(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   ip_hdr_t* const                         p_ip_hdr,\r
-       IN                              MDL*                                            p_mdl,\r
-       IN                              size_t                                          buf_len,\r
-       IN                              SCATTER_GATHER_LIST                     *p_sgl,\r
-       IN      OUT                     ipoib_send_desc_t* const        p_desc )\r
-{\r
-       ib_api_status_t         status;\r
-       udp_hdr_t                       *p_udp_hdr;\r
-       PERF_DECLARE( QueryUdp );\r
-       PERF_DECLARE( SendUdp );\r
-       PERF_DECLARE( FilterDhcp );\r
-       //TODO NDIS60 remove this param\r
-       UNUSED_PARAM(p_sgl);\r
-       IPOIB_ENTER( IPOIB_DBG_SEND );\r
-\r
-       if( !buf_len )\r
-       {\r
-               cl_perf_start( QueryUdp );\r
-               NdisGetNextMdl( p_mdl, &p_mdl );\r
-               if( !p_mdl )\r
-               {\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Failed to get UDP header buffer.\n") );\r
-                       return NDIS_STATUS_FAILURE;\r
-               }\r
-               NdisQueryMdl( p_mdl, &p_udp_hdr, &buf_len, NormalPagePriority );\r
-               if( !p_udp_hdr )\r
-               {\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Failed to query UDP header buffer.\n") );\r
-                       return NDIS_STATUS_FAILURE;\r
-               }\r
-               cl_perf_stop( &p_port->p_adapter->perf, QueryUdp );\r
-       }\r
-       else\r
-       {\r
-               p_udp_hdr = (udp_hdr_t*)GetIpPayloadPtr(p_ip_hdr);\r
-       }\r
-       /* Get the UDP header and check the destination port numbers. */\r
-       \r
-       if (p_ip_hdr->offset > 0) {\r
-               /* This is a fragmented part of UDP packet\r
-                * Only first packet will contain UDP header in such case\r
-                * So, return if offset > 0\r
-                */\r
-                return NDIS_STATUS_PENDING;\r
-       }\r
-                \r
-       if( buf_len < sizeof(udp_hdr_t) )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Buffer not large enough for UDP packet.\n") );\r
-               return NDIS_STATUS_BUFFER_TOO_SHORT;\r
-       }\r
-\r
-       if( (p_udp_hdr->src_port != DHCP_PORT_CLIENT ||\r
-               p_udp_hdr->dst_port != DHCP_PORT_SERVER) &&\r
-               (p_udp_hdr->src_port != DHCP_PORT_SERVER ||\r
-               p_udp_hdr->dst_port != DHCP_PORT_CLIENT) )\r
-       {\r
-               /* Not a DHCP packet. */\r
-               return NDIS_STATUS_PENDING;\r
-       }\r
-\r
-       buf_len -= sizeof(udp_hdr_t);\r
-\r
-       /* Allocate our scratch buffer. */\r
-       p_desc->p_buf = (send_buf_t*)\r
-               ExAllocateFromNPagedLookasideList( &p_port->buf_mgr.send_buf_list );\r
-       if( !p_desc->p_buf )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Failed to query DHCP packet buffer.\n") );\r
-               return NDIS_STATUS_RESOURCES;\r
-       }\r
-       /* Copy the IP and UDP headers. */\r
-       cl_memcpy( &p_desc->p_buf->ip.hdr, p_ip_hdr , sizeof(ip_hdr_t) );\r
-       cl_memcpy(\r
-               &p_desc->p_buf->ip.prot.udp.hdr, p_udp_hdr, sizeof(udp_hdr_t) );\r
-\r
-       cl_perf_start( FilterDhcp );\r
-       status = __send_mgr_filter_dhcp(\r
-               p_port, p_udp_hdr, p_mdl, buf_len, p_desc );\r
-       cl_perf_stop( &p_port->p_adapter->perf, FilterDhcp );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_SEND );\r
-       return status;\r
-}\r
-\r
-unsigned short ipchksum(unsigned short *ip, int len)\r
-{\r
-    unsigned long sum = 0;\r
-\r
-    len >>= 1;\r
-    while (len--) {\r
-        sum += *(ip++);\r
-        if (sum > 0xFFFF)\r
-            sum -= 0xFFFF;\r
-    }\r
-    return (unsigned short)((~sum) & 0x0000FFFF);\r
-}\r
-\r
-static NDIS_STATUS\r
-__send_mgr_filter_dhcp(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   udp_hdr_t* const                        p_udp_hdr,\r
-       IN                              NDIS_BUFFER*                            p_mdl,\r
-       IN                              size_t                                          buf_len,\r
-       IN      OUT                     ipoib_send_desc_t* const        p_desc )\r
-{\r
-       dhcp_pkt_t                      *p_dhcp;\r
-       dhcp_pkt_t                      *p_ib_dhcp;\r
-       uint8_t                         *p_option, *p_cid = NULL;\r
-       uint8_t                         msg = 0;\r
-       size_t                          len;\r
-       ib_gid_t                        gid;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_SEND );\r
-\r
-       if( !buf_len )\r
-       {\r
-               NdisGetNextMdl( p_mdl, &p_mdl );\r
-               if( !p_mdl )\r
-               {\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Failed to get DHCP buffer.\n") );\r
-                       return NDIS_STATUS_FAILURE;\r
-               }\r
-               NdisQueryMdl( p_mdl, &p_dhcp, &buf_len, NormalPagePriority );\r
-               if( !p_dhcp )\r
-               {\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Failed to query DHCP buffer.\n") );\r
-                       return NDIS_STATUS_FAILURE;\r
-               }\r
-       }\r
-       else\r
-       {\r
-               p_dhcp = (dhcp_pkt_t*)(p_udp_hdr + 1);\r
-       }\r
-\r
-       if( buf_len < DHCP_MIN_SIZE )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Buffer not large enough for DHCP packet.\n") );\r
-               return NDIS_STATUS_BUFFER_TOO_SHORT;\r
-       }\r
-\r
-       p_ib_dhcp = &p_desc->p_buf->ip.prot.udp.dhcp;\r
-       cl_memcpy( p_ib_dhcp, p_dhcp, buf_len );\r
-\r
-       /* Now scan through the options looking for the client identifier. */\r
-       p_option = &p_ib_dhcp->options[4];\r
-       while( *p_option != DHCP_OPT_END && p_option < &p_ib_dhcp->options[312] )\r
-       {\r
-               switch( *p_option )\r
-               {\r
-               case DHCP_OPT_PAD:\r
-                       p_option++;\r
-                       break;\r
-\r
-               case DHCP_OPT_MSG:\r
-                       msg = p_option[2];\r
-                       p_option += 3;\r
-                       break;\r
-\r
-               case DHCP_OPT_CLIENT_ID:\r
-                       p_cid = p_option;\r
-                       /* Fall through. */\r
-\r
-               default:\r
-                       /*\r
-                        * All other options have a length byte following the option code.\r
-                        * Offset by the length to get to the next option.\r
-                        */\r
-                       p_option += (p_option[1] + 2);\r
-               }\r
-       }\r
-\r
-       switch( msg )\r
-       {\r
-       /* Client messages */\r
-       case DHCPDISCOVER:\r
-       case DHCPREQUEST:\r
-                       p_ib_dhcp->flags |= DHCP_FLAGS_BROADCAST;\r
-               /* Fall through */\r
-       case DHCPDECLINE:\r
-       case DHCPRELEASE:\r
-       case DHCPINFORM:\r
-               /* Fix up the client identifier option */\r
-               if( p_cid )\r
-               {\r
-                       /* do we need to replace it ?  len eq ETH MAC sz 'and' MAC is mine */\r
-                       if( p_cid[1] == HW_ADDR_LEN+1 && !cl_memcmp( &p_cid[3],\r
-                               &p_port->p_adapter->params.conf_mac.addr, HW_ADDR_LEN ) )\r
-                       {\r
-                               /* Make sure there's room to extend it.  23 is the size of\r
-                                * the CID option for IPoIB.\r
-                                */\r
-                               if( buf_len + 23 - p_cid[1] > sizeof(dhcp_pkt_t) )\r
-                               {\r
-                                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                               ("Can't convert CID to IPoIB format.\n") );\r
-                                       return NDIS_STATUS_RESOURCES;\r
-                               }\r
-                               /* Move the existing options down, and add a new CID option */\r
-                               len = p_option - ( p_cid + p_cid[1] + 2 );\r
-                               p_option = p_cid + p_cid[1] + 2;\r
-                               RtlMoveMemory( p_cid, p_option, len );\r
-                               \r
-                               p_cid += len;\r
-                               p_cid[0] = DHCP_OPT_CLIENT_ID;\r
-                               p_cid[1] = 21;\r
-                               p_cid[2] = DHCP_HW_TYPE_IB;\r
-                       }\r
-                       else\r
-                       {\r
-                               p_cid[2] = DHCP_HW_TYPE_IB;\r
-                       }\r
-               }\r
-               else\r
-               {\r
-                       /*\r
-                        * Make sure there's room to extend it.  23 is the size of\r
-                        * the CID option for IPoIB.\r
-                        */\r
-                       if( buf_len + 23 > sizeof(dhcp_pkt_t) )\r
-                       {\r
-                               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                       ("Can't convert CID to IPoIB format.\n") );\r
-                               return NDIS_STATUS_RESOURCES;\r
-                       }\r
-\r
-                       p_cid = p_option;\r
-                       p_option = p_cid + 23;\r
-                       p_option[0] = DHCP_OPT_END;\r
-                       p_cid[0] = DHCP_OPT_CLIENT_ID;\r
-                       p_cid[1] = 21;\r
-                       p_cid[2] = DHCP_HW_TYPE_IB;\r
-               }\r
-\r
-               CL_ASSERT( p_cid[1] == 21 );\r
-               p_cid[23]= DHCP_OPT_END;\r
-               ib_gid_set_default( &gid, p_port->p_adapter->guids.port_guid.guid );\r
-               cl_memcpy( &p_cid[7], &gid, sizeof(ib_gid_t) );\r
-               cl_memcpy( &p_cid[3], &p_port->ib_mgr.qpn, sizeof(p_port->ib_mgr.qpn) );                \r
-               p_ib_dhcp->htype = DHCP_HW_TYPE_IB;\r
-\r
-               /* update lengths to include any change we made */\r
-               p_desc->p_buf->ip.hdr.length = cl_ntoh16( sizeof(ip_hdr_t) + sizeof(udp_hdr_t) + sizeof(dhcp_pkt_t) );\r
-               p_desc->p_buf->ip.prot.udp.hdr.length = cl_ntoh16( sizeof(udp_hdr_t) + sizeof(dhcp_pkt_t) );\r
-\r
-               /* update crc in ip header */\r
-               //if( !p_port->p_adapter->params.send_chksum_offload )\r
-               //{ //TODO ?\r
-               p_desc->p_buf->ip.hdr.chksum = 0;\r
-               p_desc->p_buf->ip.hdr.chksum = ipchksum((unsigned short*) &p_desc->p_buf->ip.hdr, sizeof(ip_hdr_t));\r
-               //} TODO ??\r
-               break;\r
-\r
-       /* Server messages. */\r
-       case DHCPOFFER:\r
-       case DHCPACK:\r
-       case DHCPNAK:\r
-               /* don't touch server messages */\r
-               break;\r
-\r
-       default:\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Invalide message type.\n") );\r
-               return NDIS_STATUS_INVALID_DATA;\r
-       }\r
-       /* no chksum for udp */\r
-       p_desc->p_buf->ip.prot.udp.hdr.chksum = 0;\r
-       p_desc->send_wr[0].local_ds[1].vaddr = cl_get_physaddr( p_desc->p_buf );\r
-       p_desc->send_wr[0].local_ds[1].length = sizeof(ip_hdr_t) +      sizeof(udp_hdr_t) + sizeof(dhcp_pkt_t);\r
-       p_desc->send_wr[0].local_ds[1].lkey = p_port->ib_mgr.lkey;\r
-       p_desc->send_wr[0].wr.num_ds = 2;\r
-       p_desc->send_dir = SEND_UD_QP;\r
-       IPOIB_EXIT( IPOIB_DBG_SEND );\r
-       return NDIS_STATUS_SUCCESS;\r
-}\r
-\r
-\r
-static NDIS_STATUS\r
-__send_mgr_filter_arp(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   eth_hdr_t* const                        p_eth_hdr,\r
-       IN                              MDL*                                            p_mdl,\r
-       IN                              size_t                                          buf_len,\r
-       IN      OUT                     ipoib_send_desc_t* const        p_desc )\r
-{\r
-       arp_pkt_t                       *p_arp;\r
-       ipoib_arp_pkt_t         *p_ib_arp;\r
-       NDIS_STATUS                     status;\r
-       mac_addr_t                      null_hw = {0};\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_SEND );\r
-       \r
-       if( !buf_len )\r
-       {\r
-               NdisGetNextMdl( p_mdl, &p_mdl );\r
-               if( !p_mdl )\r
-               {\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Failed to get ARP buffer.\n") );\r
-                       return NDIS_STATUS_FAILURE;\r
-               }\r
-               NdisQueryMdl( p_mdl, &p_arp, &buf_len, NormalPagePriority );\r
-               if( !p_arp )\r
-               {\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Failed to get query ARP buffer.\n") );\r
-                       return NDIS_STATUS_FAILURE;\r
-               }\r
-       }\r
-       else\r
-       {\r
-               p_arp = (arp_pkt_t*)(p_eth_hdr + 1);\r
-       }\r
-\r
-       /* Single buffer ARP packet. */\r
-       if( buf_len < sizeof(arp_pkt_t) )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Buffer too short for ARP.\n") );\r
-               return NDIS_STATUS_BUFFER_TOO_SHORT;\r
-       }\r
-\r
-       if( p_arp->prot_type != ETH_PROT_TYPE_IP )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Unsupported protocol type.\n") );\r
-               return NDIS_STATUS_INVALID_DATA;\r
-       }\r
-\r
-       /* Allocate our scratch buffer. */\r
-       p_desc->p_buf = (send_buf_t*)\r
-               NdisAllocateFromNPagedLookasideList( &p_port->buf_mgr.send_buf_list );\r
-       if( !p_desc->p_buf )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Failed to query ARP packet buffer.\n") );\r
-               return NDIS_STATUS_RESOURCES;\r
-       }\r
-       p_ib_arp = (ipoib_arp_pkt_t*)p_desc->p_buf;\r
-\r
-       /* Convert the ARP payload. */\r
-       p_ib_arp->hw_type = ARP_HW_TYPE_IB;\r
-       p_ib_arp->prot_type = p_arp->prot_type;\r
-       p_ib_arp->hw_size = sizeof(ipoib_hw_addr_t);\r
-       p_ib_arp->prot_size = p_arp->prot_size;\r
-       p_ib_arp->op = p_arp->op;\r
-       \r
-       ipoib_addr_set_qpn( &p_ib_arp->src_hw, p_port->ib_mgr.qpn );\r
-#if 0\r
-\r
-       if( p_port->p_adapter->params.cm_enabled )\r
-       {\r
-               ipoib_addr_set_flags( &p_ib_arp->src_hw, IPOIB_CM_FLAG_RC );\r
-       }\r
-#endif\r
-\r
-       ib_gid_set_default( &p_ib_arp->src_hw.gid,\r
-               p_port->p_adapter->guids.port_guid.guid );\r
-       p_ib_arp->src_ip = p_arp->src_ip;\r
-       if( cl_memcmp( &p_arp->dst_hw, &null_hw, sizeof(mac_addr_t) ) )\r
-       {\r
-               /* Get the endpoint referenced by the dst_hw address. */\r
-               net32_t qpn = 0;\r
-               status = __endpt_mgr_get_gid_qpn( p_port, p_arp->dst_hw,\r
-                       &p_ib_arp->dst_hw.gid, &qpn );\r
-               if( status != NDIS_STATUS_SUCCESS )\r
-               {\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Failed lookup of destination HW address\n") );\r
-                       return status;\r
-               }\r
-               ipoib_addr_set_qpn( &p_ib_arp->dst_hw, qpn );\r
-#if 0\r
-               if( p_arp->op == ARP_OP_REP && \r
-                       p_port->p_adapter->params.cm_enabled && \r
-                       p_desc->p_endpt->cm_flag == IPOIB_CM_FLAG_RC )\r
-               {\r
-                       cm_state_t      cm_state;\r
-                       cm_state = \r
-                               ( cm_state_t )InterlockedCompareExchange( (volatile LONG *)&p_desc->p_endpt->conn.state,\r
-                                                               IPOIB_CM_CONNECT, IPOIB_CM_DISCONNECTED );\r
-                       switch( cm_state )\r
-                       {\r
-                       case IPOIB_CM_DISCONNECTED:\r
-                                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
-                                               ("ARP REPLY pending Endpt[%p] QPN %#x MAC %02x:%02x:%02x:%02x:%02x:%02x\n",\r
-                                               p_desc->p_endpt, \r
-                                               cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->dst_hw )),\r
-                                               p_desc->p_endpt->mac.addr[0], p_desc->p_endpt->mac.addr[1],\r
-                                               p_desc->p_endpt->mac.addr[2], p_desc->p_endpt->mac.addr[3],\r
-                                               p_desc->p_endpt->mac.addr[4], p_desc->p_endpt->mac.addr[5] ) );\r
-                                       ipoib_addr_set_sid( &p_desc->p_endpt->conn.service_id,\r
-                                                                               ipoib_addr_get_qpn( &p_ib_arp->dst_hw ) );\r
-\r
-                                       NdisFreeToNPagedLookasideList(\r
-                                               &p_port->buf_mgr.send_buf_list, p_desc->p_buf );\r
-                                       cl_qlist_insert_tail( &p_port->send_mgr.pending_list,\r
-                                                               IPOIB_LIST_ITEM_FROM_PACKET( p_desc->p_buf ) );\r
-                                       NdisInterlockedInsertTailList( &p_port->endpt_mgr.pending_conns, \r
-                                                                                               &p_desc->p_endpt->list_item, \r
-                                                                                               &p_port->endpt_mgr.conn_lock );\r
-                                       cl_event_signal( &p_port->endpt_mgr.event );\r
-                                       return NDIS_STATUS_PENDING;\r
-                       \r
-                       case IPOIB_CM_CONNECT:\r
-                               /* queue ARP REP packet until connected */\r
-                                       NdisFreeToNPagedLookasideList(\r
-                                       &p_port->buf_mgr.send_buf_list, p_desc->p_buf );\r
-                                       cl_qlist_insert_tail( &p_port->send_mgr.pending_list,\r
-                                                               IPOIB_LIST_ITEM_FROM_PACKET( p_desc->p_pkt ) );\r
-                                       return NDIS_STATUS_PENDING;\r
-                       default:\r
-                               break;\r
-                       }\r
-               }\r
-#endif\r
-       }\r
-       else\r
-       {\r
-               cl_memclr( &p_ib_arp->dst_hw, sizeof(ipoib_hw_addr_t) );\r
-       }\r
-       \r
-#if 0 //DBG\r
-       if( p_port->p_adapter->params.cm_enabled )\r
-       {\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
-               (" ARP %s SEND to ENDPT[%p] State: %d flag: %#x, QPN: %#x MAC %02x:%02x:%02x:%02x:%02x:%02x\n",\r
-                       ( p_ib_arp->op == ARP_OP_REP ? "REP": "REQ"),                   p_desc->p_endpt, \r
-                       endpt_cm_get_state( p_desc->p_endpt ),\r
-                       p_desc->p_endpt->cm_flag, \r
-                       cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->dst_hw )),\r
-                       p_desc->p_endpt->mac.addr[0], p_desc->p_endpt->mac.addr[1],\r
-                       p_desc->p_endpt->mac.addr[2], p_desc->p_endpt->mac.addr[3],\r
-                       p_desc->p_endpt->mac.addr[4], p_desc->p_endpt->mac.addr[5] ));\r
-       }\r
-#endif\r
-\r
-       p_ib_arp->dst_ip = p_arp->dst_ip;\r
-\r
-       p_desc->send_wr[0].local_ds[1].vaddr = cl_get_physaddr( p_ib_arp );\r
-       p_desc->send_wr[0].local_ds[1].length = sizeof(ipoib_arp_pkt_t);\r
-       p_desc->send_wr[0].local_ds[1].lkey = p_port->ib_mgr.lkey;\r
-       p_desc->send_wr[0].wr.num_ds = 2;\r
-       p_desc->send_wr[0].wr.p_next = NULL;\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_SEND );\r
-       return NDIS_STATUS_SUCCESS;\r
-}\r
-\r
-static inline NDIS_STATUS\r
-__send_mgr_queue(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              eth_hdr_t* const                        p_eth_hdr,\r
-               OUT                     ipoib_endpt_t** const           pp_endpt )\r
-{\r
-       NDIS_STATUS                     status;\r
-\r
-       PERF_DECLARE( GetEndpt );\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_SEND );\r
-\r
-       /* Check the send queue and pend the request if not empty. */\r
-       if( cl_qlist_count( &p_port->send_mgr.pending_list ) )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,\r
-                       ("Pending list not empty.\n") );\r
-               return NDIS_STATUS_PENDING;\r
-       }\r
-\r
-       /* Check the send queue and pend the request if not empty. */\r
-       if( p_port->send_mgr.depth == p_port->p_adapter->params.sq_depth )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,\r
-                       ("No available WQEs.\n") );\r
-               return NDIS_STATUS_PENDING;\r
-       }\r
-\r
-       cl_perf_start( GetEndpt );\r
-       status = __endpt_mgr_ref( p_port, p_eth_hdr->dst, pp_endpt );\r
-       cl_perf_stop( &p_port->p_adapter->perf, GetEndpt );\r
-\r
-       if( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION &&\r
-               ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )\r
-       {\r
-               if( ipoib_port_join_mcast( p_port, p_eth_hdr->dst, \r
-                       IB_MC_REC_STATE_FULL_MEMBER) == IB_SUCCESS )\r
-               {\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,\r
-                               ("Multicast Mac - trying to join.\n") );\r
-                       return NDIS_STATUS_PENDING;\r
-               }\r
-       }\r
-       else if ( status == NDIS_STATUS_SUCCESS && \r
-                         ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) &&  \r
-                         !ETH_IS_BROADCAST( p_eth_hdr->dst.addr ) )\r
-       {\r
-               CL_ASSERT( (*pp_endpt) );\r
-               CL_ASSERT((*pp_endpt)->h_mcast != NULL);\r
-               (*pp_endpt)->is_in_use = TRUE;\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_SEND );\r
-       return status;\r
-}\r
-\r
-\r
-static NDIS_STATUS\r
-__build_send_desc(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              eth_hdr_t* const                        p_eth_hdr,\r
-       IN                              MDL* const                                      p_mdl,\r
-       IN              const   size_t                                          mdl_len,\r
-       IN                              SCATTER_GATHER_LIST                     *p_sgl,\r
-       IN      OUT                     ipoib_send_desc_t* const        p_desc )\r
-{\r
-       NDIS_STATUS                     status;\r
-       int32_t                         hdr_idx;\r
-       uint32_t                        mss;\r
-       //PVOID*                                pp_tmp;\r
-       PNDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO                      p_checksum_list_info;\r
-       PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO       p_lso_info;\r
-       PERF_DECLARE( SendMgrFilter );\r
-       \r
-       IPOIB_ENTER( IPOIB_DBG_SEND );\r
-\r
-       /* Format the send descriptor. */\r
-       p_checksum_list_info = NET_BUFFER_LIST_INFO( p_desc->p_netbuf_list,TcpIpChecksumNetBufferListInfo);\r
-       //pp_tmp = &NET_BUFFER_LIST_INFO(p_desc->p_netbuf_list, TcpIpChecksumNetBufferListInfo);\r
-       //p_checksum_list_info =                (   ) ((PULONG)pp_tmp);\r
-       p_lso_info = NET_BUFFER_LIST_INFO( p_desc->p_netbuf_list, TcpLargeSendNetBufferListInfo );\r
-               \r
-       /* Format the send descriptor. */\r
-       hdr_idx = cl_atomic_inc( &p_port->hdr_idx );\r
-       hdr_idx &= (p_port->p_adapter->params.sq_depth - 1);\r
-       ASSERT( hdr_idx < p_port->p_adapter->params.sq_depth );\r
-       p_port->hdr[hdr_idx].type = p_eth_hdr->type;\r
-       p_port->hdr[hdr_idx].resv = 0;\r
-\r
-       p_desc->send_wr[0].local_ds[0].vaddr = cl_get_physaddr( &p_port->hdr[hdr_idx] );\r
-       p_desc->send_wr[0].local_ds[0].length = sizeof(ipoib_hdr_t);\r
-       p_desc->send_wr[0].local_ds[0].lkey = p_port->ib_mgr.lkey;\r
-       p_desc->send_wr[0].wr.send_opt = 0;\r
-\r
-       mss = (p_lso_info->LsoV1Transmit.MSS | p_lso_info->LsoV2Transmit.MSS);\r
-       //TODO: first check params.lso, and thereafter calculate LSO\r
-       if( p_port->p_adapter->params.lso && mss )\r
-\r
-\r
-       {\r
-               ASSERT( mss == (p_lso_info->LsoV1Transmit.MSS & p_lso_info->LsoV2Transmit.MSS));\r
-               ASSERT ( (mss & (1<<20)) == mss);\r
-               status = __build_lso_desc( p_port, p_desc, mss, p_sgl, hdr_idx, p_lso_info );\r
-               if( status != NDIS_STATUS_SUCCESS )\r
-               {\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("__build_lso_desc returned 0x%08X.\n", status) );\r
-                       return status;\r
-               }\r
-       }\r
-       else\r
-       {\r
-               uint32_t        i;\r
-               cl_perf_start( SendMgrFilter );\r
-               status = __send_mgr_filter(\r
-               p_port, p_eth_hdr, p_mdl, mdl_len,p_sgl, p_desc );\r
-               cl_perf_stop( &p_port->p_adapter->perf, SendMgrFilter );\r
-               if( status != NDIS_STATUS_SUCCESS )\r
-               {\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("__send_mgr_filter returned 0x%08X.\n", status) );\r
-                       return status;\r
-               }\r
-\r
-               if( p_desc->send_dir == SEND_UD_QP )\r
-               {\r
-                       p_desc->send_qp = p_port->ib_mgr.h_qp; // UD QP\r
-                       for( i = 0; i < p_desc->num_wrs; i++ )\r
-                       {\r
-                               p_desc->send_wr[i].wr.dgrm.ud.remote_qp = p_desc->p_endpt->qpn;\r
-                               p_desc->send_wr[i].wr.dgrm.ud.remote_qkey = p_port->ib_mgr.bcast_rec.qkey;\r
-                               p_desc->send_wr[i].wr.dgrm.ud.h_av = p_desc->p_endpt->h_av;\r
-                               p_desc->send_wr[i].wr.dgrm.ud.pkey_index = p_port->pkey_index;\r
-                               p_desc->send_wr[i].wr.dgrm.ud.rsvd = NULL;\r
-                               p_desc->send_wr[i].wr.send_opt = 0;\r
-\r
-                               if( p_port->p_adapter->params.send_chksum_offload && \r
-                                       ( p_checksum_list_info->Transmit.IsIPv4  || \r
-                                       p_checksum_list_info->Transmit.IsIPv6  ))\r
-                               {\r
-                                       // Set transimition checksum offloading \r
-                                       if( p_checksum_list_info->Transmit.IpHeaderChecksum )\r
-                                       {\r
-                                               p_desc->send_wr[i].wr.send_opt |= IB_SEND_OPT_TX_IP_CSUM;\r
-                                       }\r
-                                       if( p_checksum_list_info->Transmit.TcpChecksum )\r
-                                       {\r
-                                               p_desc->send_wr[i].wr.send_opt |= IB_SEND_OPT_TX_TCP_UDP_CSUM;\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-               else // RC QP\r
-               {\r
-                       CL_ASSERT( p_desc->send_dir == SEND_RC_QP );\r
-                       p_desc->send_qp = p_desc->p_endpt->conn.h_work_qp;\r
-               }\r
-               for( i = 0; i < p_desc->num_wrs; i++ )\r
-               {\r
-                       p_desc->send_wr[i].wr.wr_type = WR_SEND;\r
-                       p_desc->send_wr[i].wr.wr_id = 0;\r
-                       p_desc->send_wr[i].wr.ds_array = &p_desc->send_wr[i].local_ds[0];\r
-                       if( i )\r
-                       {\r
-                               p_desc->send_wr[i-1].wr.p_next = &p_desc->send_wr[i].wr;\r
-                       }\r
-               }\r
-               //TODO p_net_buf or p_buf\r
-//             p_desc->send_wr[p_desc->num_wrs - 1].wr.wr_id = (uintn_t)NET_BUFFER_LIST_FIRST_NB(p_desc->p_netbuf_list );\r
-//????         IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("WR_ID was set to NBL 0x%x \n",p_desc->p_netbuf_list ));\r
-               p_desc->send_wr[p_desc->num_wrs - 1].wr.wr_id = (uintn_t)p_desc->p_netbuf_list ;\r
-\r
-               p_desc->send_wr[p_desc->num_wrs - 1].wr.send_opt |= IB_SEND_OPT_SIGNALED;\r
-               p_desc->send_wr[p_desc->num_wrs - 1].wr.p_next = NULL;\r
-       }\r
-\r
-       /* Store context in our reserved area of the packet. */\r
-       IPOIB_PORT_FROM_PACKET( p_desc->p_netbuf_list ) = p_port;\r
-       IPOIB_ENDPT_FROM_PACKET( p_desc->p_netbuf_list ) = p_desc->p_endpt;\r
-       IPOIB_SEND_FROM_NETBUFFER( NET_BUFFER_LIST_FIRST_NB(p_desc->p_netbuf_list ))= p_desc->p_buf;\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_SEND );\r
-       return NDIS_STATUS_SUCCESS;\r
-}\r
-\r
-static NDIS_STATUS\r
-__build_lso_desc(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN      OUT                     ipoib_send_desc_t* const        p_desc,\r
-       IN                              ULONG                                           mss,\r
-       IN                              SCATTER_GATHER_LIST                     *p_sgl,\r
-       IN                              int32_t                                         hdr_idx, \r
-       IN PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO p_lso_info)\r
-{\r
-       NDIS_STATUS                     status;\r
-       LsoData                                                         TheLsoData;\r
-       UINT                                                            IndexOfData = 0;\r
-       \r
-       PNET_BUFFER     FirstBuffer  = NET_BUFFER_LIST_FIRST_NB (p_desc->p_netbuf_list);\r
-       ULONG                   PacketLength = NET_BUFFER_DATA_LENGTH(FirstBuffer);\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_SEND );\r
-\r
-\r
-\r
-       memset(&TheLsoData, 0, sizeof TheLsoData );\r
-       status = GetLsoHeaderSize(\r
-               FirstBuffer, \r
-               &TheLsoData, \r
-               &IndexOfData,\r
-               &p_port->hdr[hdr_idx] );\r
-\r
-       if ((status != NDIS_STATUS_SUCCESS ) || \r
-               (TheLsoData.FullBuffers != TheLsoData.UsedBuffers)) \r
-       {\r
-               ASSERT(FALSE);\r
-\r
-               IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("<-- Throwing this packet\n"));\r
-\r
-               if( status == NDIS_STATUS_SUCCESS )\r
-               {\r
-                       status = NDIS_STATUS_INVALID_PACKET;\r
-               }\r
-               return status;\r
-       }\r
-       ASSERT(TheLsoData.LsoHeaderSize> 0);\r
-       // Tell NDIS how much we will send.\r
-       //PktExt->NdisPacketInfo[TcpLargeSendPacketInfo] = UlongToPtr(PacketLength);\r
-       p_lso_info->LsoV1TransmitComplete.TcpPayload = PacketLength;\r
-\r
-       p_desc->send_wr[0].wr.dgrm.ud.mss = mss;\r
-       p_desc->send_wr[0].wr.dgrm.ud.header = TheLsoData.LsoBuffers[0].pData;\r
-       p_desc->send_wr[0].wr.dgrm.ud.hlen = TheLsoData.LsoHeaderSize ;//lso_header_size; \r
-       p_desc->send_wr[0].wr.dgrm.ud.remote_qp = p_desc->p_endpt->qpn;\r
-       p_desc->send_wr[0].wr.dgrm.ud.remote_qkey = p_port->ib_mgr.bcast_rec.qkey;\r
-       p_desc->send_wr[0].wr.dgrm.ud.h_av = p_desc->p_endpt->h_av;\r
-       p_desc->send_wr[0].wr.dgrm.ud.pkey_index = p_port->pkey_index;\r
-       p_desc->send_wr[0].wr.dgrm.ud.rsvd = NULL;\r
-\r
-       //TODO: Should be NBL or p_desc\r
-       p_desc->send_wr[0].wr.wr_id = (uintn_t)p_desc->p_netbuf_list;\r
-       p_desc->send_wr[0].wr.ds_array = p_desc->send_wr[0].local_ds;\r
-       p_desc->send_wr[0].wr.wr_type = WR_LSO;\r
-       p_desc->send_wr[0].wr.send_opt = \r
-               (IB_SEND_OPT_TX_IP_CSUM | IB_SEND_OPT_TX_TCP_UDP_CSUM) | IB_SEND_OPT_SIGNALED;\r
-       \r
-       p_desc->send_wr[0].wr.p_next = NULL;\r
-       p_desc->send_qp = p_port->ib_mgr.h_qp;\r
-       p_desc->send_dir = SEND_UD_QP;\r
-       status = __send_gen(p_port, p_desc, p_sgl, IndexOfData );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_SEND );\r
-       return status;\r
-}\r
-\r
-static inline void\r
-__process_failed_send(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ipoib_send_desc_t* const        p_desc,\r
-       IN              const   NDIS_STATUS                                     status,\r
-       IN                              ULONG                                           compl_flags)\r
-{\r
-       IPOIB_ENTER( IPOIB_DBG_SEND );\r
-\r
-       /* Complete the packet. */\r
-       NET_BUFFER_LIST_NEXT_NBL(p_desc->p_netbuf_list) = NULL;\r
-       NET_BUFFER_LIST_STATUS(p_desc->p_netbuf_list) = status;\r
-       NdisMSendNetBufferListsComplete( p_port->p_adapter->h_adapter,\r
-               p_desc->p_netbuf_list, compl_flags );\r
-       ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_ERROR, 0 );\r
-       /* Deref the endpoint. */\r
-       if( p_desc->p_endpt )\r
-               ipoib_endpt_deref( p_desc->p_endpt );\r
-\r
-       if( p_desc->p_buf )\r
-       {\r
-               NdisFreeToNPagedLookasideList(\r
-                       &p_port->buf_mgr.send_buf_list, p_desc->p_buf );\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_SEND );\r
-}\r
-\r
-// max number of physical fragmented buffers \r
-#define MAX_PHYS_BUF_FRAG_ELEMENTS      0x29\r
-#define MP_FRAG_ELEMENT SCATTER_GATHER_ELEMENT \r
-#define PMP_FRAG_ELEMENT PSCATTER_GATHER_ELEMENT \r
-\r
-\r
-typedef struct _MP_FRAG_LIST {\r
-    ULONG NumberOfElements;\r
-    ULONG_PTR Reserved;\r
-    SCATTER_GATHER_ELEMENT Elements[MAX_PHYS_BUF_FRAG_ELEMENTS];\r
-} MP_FRAG_LIST, *PMP_FRAG_LIST;\r
-\r
-\r
-void \r
-CreateFragList(\r
-    ULONG PhysBufCount,\r
-    PNET_BUFFER NetBuff,\r
-    ULONG PacketLength,\r
-    PMP_FRAG_LIST pFragList\r
-    )\r
-{\r
-//    ETH_ENTER(ETH_SND);\r
-\r
-    ULONG i = 0;\r
-       int j=0;\r
-\r
-    UINT  buf_len = NET_BUFFER_DATA_LENGTH(NetBuff);\r
-    PMDL pMdl = NET_BUFFER_CURRENT_MDL(NetBuff);\r
-\r
-    ULONG CurrentMdlDataOffset = NET_BUFFER_CURRENT_MDL_OFFSET(NetBuff);\r
-    ASSERT(MmGetMdlByteCount(pMdl) >= CurrentMdlDataOffset);\r
-\r
-    \r
-    ASSERT(NetBuff != NULL);\r
-#ifdef DBG\r
-    ASSERT(PhysBufCount <= MAX_PHYS_BUF_FRAG_ELEMENTS);\r
-#else\r
-       UNREFERENCED_PARAMETER(PhysBufCount);\r
-#endif\r
-    \r
-    ASSERT(buf_len > 0);\r
-    UNREFERENCED_PARAMETER(PacketLength);\r
-\r
-\r
-//    ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_SND, "CreateFragList: NetBuff %p, Length =0x%x\n", NetBuff, buf_len);\r
-\r
-    while ( (pMdl != NULL) && (buf_len != 0) )\r
-    {\r
-        PPFN_NUMBER page_array = MmGetMdlPfnArray(pMdl);\r
-        int MdlBufCount = ADDRESS_AND_SIZE_TO_SPAN_PAGES(MmGetMdlVirtualAddress(pMdl), MmGetMdlByteCount(pMdl));\r
-    \r
-        ULONG offset = MmGetMdlByteOffset(pMdl) + CurrentMdlDataOffset ;        \r
-        ULONG MdlBytesCount = MmGetMdlByteCount(pMdl) - CurrentMdlDataOffset;\r
-        CurrentMdlDataOffset = 0;\r
-        \r
-        if( MdlBytesCount == 0 )\r
-        {\r
-            pMdl = pMdl->Next;\r
-            continue;\r
-        }\r
-\r
-        ASSERT( (buf_len > 0) && (MdlBytesCount > 0) );\r
\r
-//        ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_SND, "CreateFragList: pMdl=%p, MdlBytesCount=x%x, MdlBufCount=0x%x\n", pMdl, MdlBytesCount, MdlBufCount);\r
-\r
-        if (MdlBytesCount > 0)\r
-        {\r
-            if( buf_len > MdlBytesCount)\r
-            {\r
-                buf_len -= MdlBytesCount;    \r
-            }\r
-            else\r
-            {\r
-                MdlBytesCount = buf_len;\r
-                buf_len = 0;                \r
-            }                        \r
-            //\r
-            // In some cases the mdlcount is greater than needed and in the last page\r
-            // there is 0 bytes\r
-            //\r
-            for (j=0; ((j< MdlBufCount) && (MdlBytesCount > 0)); j++) \r
-            {\r
-                ASSERT(MdlBytesCount > 0);\r
-                if (j ==0 ) \r
-                {\r
-                    //\r
-                    // First page\r
-                    //\r
-                    ULONG64 ul64PageNum = page_array[j];\r
-                    pFragList->Elements[i].Address.QuadPart = (ul64PageNum << PAGE_SHIFT)+ offset;\r
-                    if( offset + MdlBytesCount > PAGE_SIZE )\r
-                    {\r
-                        //\r
-                        // the data slides behind the page boundry\r
-                        //\r
-                        ASSERT(PAGE_SIZE > offset);\r
-                        pFragList->Elements[i].Length = PAGE_SIZE - offset;\r
-                        MdlBytesCount -= pFragList->Elements[i].Length;\r
-                    }\r
-                    else\r
-                    {\r
-                        //\r
-                        // All the data is hold in one page\r
-                        //    \r
-                        pFragList->Elements[i].Length = MdlBytesCount;\r
-                        MdlBytesCount = 0;\r
-                    }\r
-\r
-//                    ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_SND, "CreateFragList: j == 0, MdlBytesCount=x%x, i = %d, element.length=0x%x \n",  MdlBytesCount, i, pFragList->Elements[i].Length);                    \r
-                } \r
-                else \r
-                {\r
-                    if (page_array[j] == (page_array[j-1] + 1))\r
-                    {\r
-                        \r
-                        ULONG size = min(PAGE_SIZE, MdlBytesCount);\r
-                                               i -= 1;\r
-                        pFragList->Elements[i].Length += size;\r
-                        MdlBytesCount -= size;\r
-                    }\r
-                    else \r
-                    {\r
-                        //\r
-                        // Not first page. so the data always start at the begining of the page\r
-                        //\r
-                        ULONG64 ul64PageNum = page_array[j];\r
-                        pFragList->Elements[i].Address.QuadPart = (ul64PageNum << PAGE_SHIFT);\r
-                        pFragList->Elements[i].Length = min(PAGE_SIZE, MdlBytesCount);\r
-                        MdlBytesCount -= pFragList->Elements[i].Length;\r
-                    }\r
-\r
-//                    ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_SND, "CreateFragList: j != 0, MdlBytesCount=x%x, i = %d, element.length=0x%x \n",  MdlBytesCount, i, pFragList->Elements[i].Length);                    \r
-                }                \r
-                i++;\r
-                ASSERT(i <= MAX_PHYS_BUF_FRAG_ELEMENTS);\r
-            }\r
-        }\r
-\r
-        pMdl = pMdl->Next;\r
-    }\r
-        \r
-    if (buf_len != 0)\r
-    {\r
-        //\r
-        // In some cases the size in MDL isn't equal to the buffer size. In such \r
-        // a case we need to add the rest of packet to last chunk\r
-        //\r
-        ASSERT(i > 0); // To prevent array underflow\r
-        pFragList->Elements[i-1].Length += buf_len;\r
-//        ETH_PRINT(TRACE_LEVEL_ERROR, ETH_SND, "CreateFragList: buf_len != 0, i = %d, element.length=0x%x \n",  i -1, pFragList->Elements[i-1].Length);                    \r
-    }\r
-\r
-    ASSERT(i <= PhysBufCount);\r
-    pFragList->NumberOfElements = i;\r
-\r
-#ifdef DBG\r
-{\r
-    ULONG size = 0;\r
-    for (i  = 0; i <  pFragList->NumberOfElements; ++i)\r
-    {\r
-        size += pFragList->Elements[i].Length;\r
-    }\r
-    ASSERT(size == PacketLength);\r
-}\r
-#endif\r
-\r
-//    ETH_EXIT(ETH_SND);\r
-}\r
-\r
-\r
-\r
-\r
-void\r
-ipoib_port_send(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-    IN  NET_BUFFER_LIST     *p_net_buffer_list,\r
-    IN  ULONG               send_flags)\r
-{\r
-       NDIS_STATUS                     status;\r
-       PNET_BUFFER                     p_netbuf;\r
-       UINT                            buf_cnt = 0;\r
-       //ipoib_send_desc_t     *p_desc;\r
-       ULONG                           send_complete_flags = 0;\r
-       KIRQL                           old_irql;\r
-       PVOID                           p_sgl;\r
-       \r
-       PERF_DECLARE( GetEthHdr );\r
-       PERF_DECLARE( BuildSendDesc );\r
-       PERF_DECLARE( QueuePacket );\r
-       PERF_DECLARE( SendMgrQueue );\r
-       PERF_DECLARE( PostSend );\r
-       PERF_DECLARE( ProcessFailedSends );\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_SEND );\r
-       \r
-       if (NDIS_TEST_SEND_AT_DISPATCH_LEVEL(send_flags))\r
-       {\r
-               //TODO Tzachid: make an assert here to validate your IRQL\r
-               //ASSERT (KeGetCurrentIRQL() == DISPATCH_LEVEL);\r
-               NDIS_SET_SEND_COMPLETE_FLAG(send_complete_flags, NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL);\r
-       } else {\r
-               //ASSERT (KeGetCurrentIRQL() == PASSIVE_LEVEL);\r
-       }\r
-       \r
-       cl_obj_lock( &p_port->obj );\r
-       if( p_port->state != IB_QPS_RTS )\r
-       {\r
-               \r
-               \r
-               cl_obj_unlock( &p_port->obj );\r
-               \r
-               \r
-               NET_BUFFER_LIST_STATUS(p_net_buffer_list) = NDIS_STATUS_FAILURE;\r
-               NET_BUFFER_LIST_NEXT_NBL(p_net_buffer_list) = NULL;\r
-               ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );\r
-                       \r
-               NdisMSendNetBufferListsComplete(\r
-                       p_port->p_adapter->h_adapter,\r
-                       p_net_buffer_list,\r
-                       send_complete_flags);  \r
-               \r
-               return;\r
-       }\r
-       cl_obj_unlock( &p_port->obj );\r
-       \r
-       //IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-       //                      ("Processing netbuffer list: %x\n", p_net_buffer_list));\r
-       for (p_netbuf = NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);\r
-                p_netbuf != NULL; \r
-                p_netbuf = NET_BUFFER_NEXT_NB(p_netbuf))\r
-       {\r
-               IPOIB_PORT_FROM_PACKET(p_net_buffer_list) = p_port;\r
-               IPOIB_NET_BUFFER_LIST_FROM_NETBUFFER(p_netbuf)  = p_net_buffer_list;\r
-               IPOIB_FROM_QUEUE(p_netbuf) = NULL;\r
-               /*p_desc = &p_port->send_mgr.desc;\r
-               p_desc->p_buf = p_netbuf;\r
-               p_desc->p_endpt = NULL;\r
-               p_desc->p_buf = NULL;\r
-               p_desc->send_qp = NULL;\r
-               p_desc->num_wrs = 1;\r
-               p_desc->send_dir = 0;*/\r
-               \r
-               old_irql = KeGetCurrentIrql();\r
-               if (old_irql < DISPATCH_LEVEL) \r
-               {\r
-                       KeRaiseIrqlToDpcLevel();\r
-               }\r
-               ++buf_cnt;\r
-               //IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-               //              ("[%d] Netbuf = %x\n",buf_cnt, p_netbuf) );\r
-               if (cl_is_item_in_qlist( &p_port->send_mgr.pending_list,\r
-                                               IPOIB_LIST_ITEM_FROM_PACKET( p_net_buffer_list ))) {\r
-                               p_sgl = IPOIB_FROM_QUEUE(p_netbuf);     \r
-                               //IPOIB_FROM_QUEUE(p_net_buffer) = (void*)1;\r
-                               ASSERT (p_sgl);                         \r
-                               //IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               //              ("[%d] FROM_QUEUE Netbuf = %x, found SGL = %x\n",buf_cnt, p_netbuf, p_sgl) );\r
-                                status = NDIS_STATUS_SUCCESS;\r
-               } else {\r
-\r
-//#if 0\r
-                       CHAR *pTemp = ExAllocatePoolWithTag(NonPagedPool , p_port->p_adapter->sg_list_size, 'abcd');\r
-                       CL_ASSERT(pTemp != NULL);\r
-                       status = NDIS_STATUS_SUCCESS;\r
-                       p_sgl = pTemp;\r
-                       CreateFragList(NdisQueryNetBufferPhysicalCount(p_netbuf), p_netbuf, NET_BUFFER_DATA_LENGTH(p_netbuf), p_sgl);\r
-                       IPOIB_FROM_QUEUE(p_netbuf) = NULL;\r
-                       /*IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                               ("[%d] Allocation from scratch: Netbuf = %x, found SGL = %x, PhysBufCnt=%ld, NB LEN = %ld, sg_list_size=%ld\n",\r
-                                               buf_cnt, p_netbuf, p_sgl,NdisQueryNetBufferPhysicalCount(p_netbuf) ,\r
-                                               NET_BUFFER_DATA_LENGTH(p_netbuf),p_port->p_adapter->sg_list_size) );\r
-                                               */\r
-                       ipoib_process_sg_list(NULL, NULL, p_sgl, p_netbuf);\r
-                       status = NDIS_STATUS_SUCCESS;\r
-//#endif\r
-#if 0          \r
-                       status = NdisMAllocateNetBufferSGList(\r
-                                                                       p_port->p_adapter->NdisMiniportDmaHandle,\r
-                                                                       p_netbuf,\r
-                                                                       p_netbuf,\r
-                                                                       NDIS_SG_LIST_WRITE_TO_DEVICE,\r
-                                                                       NULL,\r
-                                                                       0);\r
-#endif\r
-               }\r
-               KeLowerIrql (old_irql);\r
-       \r
-               if( status != NDIS_STATUS_SUCCESS )\r
-               {\r
-                       /* fail net buffer list */\r
-                       NET_BUFFER_LIST_NEXT_NBL(p_net_buffer_list) = NULL;\r
-                       NET_BUFFER_LIST_STATUS(p_net_buffer_list) = NDIS_STATUS_RESOURCES;\r
-                       NdisMSendNetBufferListsComplete(\r
-                               p_port->p_adapter->h_adapter,\r
-                               p_net_buffer_list,\r
-                               send_complete_flags);   \r
-                               break;\r
-               }\r
-               ASSERT(buf_cnt);\r
-               IPOIB_GET_NET_BUFFER_LIST_REF_COUNT(p_net_buffer_list) = (PVOID)(ULONG_PTR)buf_cnt;\r
-       }\r
-       \r
-               /* Post the WR. *\r
-               cl_perf_start( PostSend );\r
-               ib_status =     p_port->p_adapter->p_ifc->post_send( p_desc->send_qp, &p_desc->send_wr[0].wr, &p_wr_failed );\r
-               cl_perf_stop( &p_port->p_adapter->perf, PostSend );\r
-               if( ib_status != IB_SUCCESS )\r
-               {\r
-                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("ib_post_send returned %s\n", \r
-                               p_port->p_adapter->p_ifc->get_err_str( ib_status )) );\r
-                       cl_perf_start( ProcessFailedSends );\r
-                       __process_failed_send( p_port, p_desc, NDIS_STATUS_FAILURE );\r
-                       cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends );\r
-                       * Flag the adapter as hung since posting is busted. *\r
-                       p_port->p_adapter->hung = TRUE;\r
-                       continue;\r
-               }\r
-\r
-               cl_atomic_inc( &p_port->send_mgr.depth );\r
-       }\r
-       cl_spinlock_release( &p_port->send_lock );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_SEND );*/\r
-}\r
-\r
-\r
-void\r
-ipoib_port_resume(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN boolean_t                                                            b_pending )\r
-{\r
-       NDIS_STATUS                     status;\r
-       cl_list_item_t          *p_item;\r
-       NET_BUFFER                      *p_net_buffer;\r
-       NET_BUFFER_LIST         *p_net_buffer_list;\r
-       //ipoib_send_desc_t     *p_desc;\r
-       KIRQL                           old_irql;\r
-       UINT                            buf_cnt = 0;\r
-       NET_BUFFER_LIST         *p_prev_nbl = NULL;\r
-       PVOID                           p_sgl;\r
-       static PVOID            p_prev_sgl = NULL;\r
-       \r
-       PERF_DECLARE( GetEndpt );\r
-       PERF_DECLARE( BuildSendDesc );\r
-       PERF_DECLARE( ProcessFailedSends );\r
-       PERF_DECLARE( PostSend );\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_SEND );\r
-\r
-       UNUSED_PARAM(b_pending);\r
-       \r
-       cl_obj_lock( &p_port->obj );\r
-       if( p_port->state != IB_QPS_RTS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,\r
-                       ("Invalid state - Aborting.\n") );\r
-               cl_obj_unlock( &p_port->obj );\r
-               return;\r
-       }\r
-       cl_obj_unlock( &p_port->obj );\r
-\r
-//TODO NDIS60\r
-////??????????????     cl_spinlock_acquire( &p_port->send_lock );\r
-\r
-       for( p_item = cl_qlist_head( &p_port->send_mgr.pending_list );\r
-               p_item != cl_qlist_end( &p_port->send_mgr.pending_list );\r
-               p_item = cl_qlist_head( &p_port->send_mgr.pending_list ) )\r
-       {\r
-               \r
-               \r
-               /* Check the send queue and pend the request if not empty. */\r
-               if( p_port->send_mgr.depth == p_port->p_adapter->params.sq_depth )\r
-               {\r
-                       IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,\r
-                               ("No available WQEs.\n") );\r
-                       break;\r
-               }\r
-               \r
-               p_net_buffer_list = IPOIB_PACKET_FROM_LIST_ITEM(\r
-                       cl_qlist_remove_head( &p_port->send_mgr.pending_list ) );\r
-               if (p_prev_nbl == p_net_buffer_list) {\r
-//                     IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-       //                      ("TRYING TO PROCESS ONCE AGAIN, EXITING: %x\n", p_net_buffer_list));\r
-                       break; //TODO more sophisticated mechanism to avoid starvation\r
-               }\r
-               old_irql = KeGetCurrentIrql();\r
-               if (old_irql < DISPATCH_LEVEL) \r
-               {\r
-                       KeRaiseIrqlToDpcLevel();\r
-               }\r
-//             IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-       //              ("Processing netbuffer list from queue: %x\n", (UINT) (PVOID) p_net_buffer_list));\r
-               \r
-               for( p_net_buffer = NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);\r
-                        p_net_buffer != NULL;\r
-                        p_net_buffer = NET_BUFFER_NEXT_NB(p_net_buffer), buf_cnt++)\r
-                               {\r
-\r
-                       \r
-                       p_sgl = IPOIB_FROM_QUEUE(p_net_buffer); \r
-                       //IPOIB_FROM_QUEUE(p_net_buffer) = (void*)1;\r
-                       ASSERT (p_sgl);\r
-                       IPOIB_PORT_FROM_PACKET(p_net_buffer_list) = p_port;\r
-                       IPOIB_NET_BUFFER_LIST_FROM_NETBUFFER(p_net_buffer)  = p_net_buffer_list;\r
-                       /*p_desc = &p_port->send_mgr.desc;\r
-                       p_desc->p_buf = p_net_buffer;\r
-                       p_desc->p_endpt = NULL;\r
-                       p_desc->p_buf = NULL;\r
-                       p_desc->send_qp = NULL;\r
-                       p_desc->num_wrs = 1;\r
-                       p_desc->send_dir = 0;*/\r
-\r
-//                     IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-       //                      ("[%d] Netbuf = %x, p_sgl = %x\n",buf_cnt, p_net_buffer, p_sgl) );\r
-                       ASSERT(p_sgl);\r
-                       if (p_sgl != (void*) 1) {\r
-                               ipoib_process_sg_list(NULL, NULL, p_sgl, p_net_buffer);\r
-                               status = NDIS_STATUS_SUCCESS;\r
-                       }\r
-                       else {\r
-                               ASSERT(FALSE);\r
-                               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Getting strange flow\n") );\r
-                               NdisMFreeNetBufferSGList(\r
-                                                                       p_port->p_adapter->NdisMiniportDmaHandle,\r
-                                                                       p_sgl,\r
-                                                                       p_net_buffer );\r
-                               status = NdisMAllocateNetBufferSGList(\r
-                                                                       p_port->p_adapter->NdisMiniportDmaHandle,\r
-                                                                       p_net_buffer,\r
-                                                                       p_net_buffer,\r
-                                                                       NDIS_SG_LIST_WRITE_TO_DEVICE,\r
-                                                                       NULL,\r
-                                                                       0 /*p_port->p_adapter->sg_list_size*/ );\r
-                       }\r
-                       p_prev_sgl = p_sgl;             \r
-                       if( status != NDIS_STATUS_SUCCESS )\r
-                       {\r
-                               /* fail net buffer list */\r
-                               NET_BUFFER_LIST_NEXT_NBL(p_net_buffer_list) = NULL;\r
-                               NET_BUFFER_LIST_STATUS(p_net_buffer_list) = NDIS_STATUS_RESOURCES;\r
-                               NdisMSendNetBufferListsComplete(\r
-                                       p_port->p_adapter->h_adapter,\r
-                                       p_net_buffer_list,\r
-                                       0);     \r
-                               break;\r
-                       }\r
-               }\r
-                        \r
-               KeLowerIrql (old_irql);\r
-               \r
-               \r
-               p_prev_nbl = p_net_buffer_list;\r
-               \r
-       }\r
-       IPOIB_EXIT( IPOIB_DBG_SEND );\r
-}\r
-\r
-\r
-\r
-static void\r
-__send_cb(\r
-       IN              const   ib_cq_handle_t                          h_cq,\r
-       IN                              void                                            *cq_context )\r
-{\r
-       ipoib_port_t            *p_port;\r
-       ib_api_status_t         status;\r
-       ib_wc_t                         wc[MAX_SEND_WC], *p_wc, *p_free;\r
-       cl_qlist_t                      done_list;\r
-       NET_BUFFER_LIST         *p_nbl;\r
-       uint32_t                        length;\r
-       ipoib_endpt_t           *p_endpt;\r
-       send_buf_t                      *p_send_buf;\r
-       ip_stat_sel_t           type;\r
-       size_t                          i;\r
-       NET_BUFFER                      *p_netbuffer = NULL;\r
-\r
-       PERF_DECLARE( SendCompBundle );\r
-       PERF_DECLARE( SendCb );\r
-       PERF_DECLARE( PollSend );\r
-       PERF_DECLARE( SendComp );\r
-       PERF_DECLARE( FreeSendBuf );\r
-       PERF_DECLARE( RearmSend );\r
-       PERF_DECLARE( PortResume );\r
-//return;//???????????\r
-       IPOIB_ENTER( IPOIB_DBG_SEND );\r
-\r
-       cl_perf_clr( SendCompBundle );\r
-\r
-       cl_perf_start( SendCb );\r
-\r
-       UNUSED_PARAM( h_cq );\r
-\r
-       cl_qlist_init( &done_list );\r
-\r
-       p_port = (ipoib_port_t*)cq_context;\r
-\r
-       ipoib_port_ref( p_port, ref_send_cb );\r
-\r
-       for( i = 0; i < MAX_SEND_WC; i++ )\r
-               wc[i].p_next = &wc[i + 1];\r
-       wc[MAX_SEND_WC - 1].p_next = NULL;\r
-\r
-       do\r
-       {\r
-               p_free = wc;\r
-               cl_perf_start( PollSend );\r
-               status = p_port->p_adapter->p_ifc->poll_cq( p_port->ib_mgr.h_send_cq, &p_free, &p_wc );\r
-               cl_perf_stop( &p_port->p_adapter->perf, PollSend );\r
-               CL_ASSERT( status == IB_SUCCESS || status == IB_NOT_FOUND );\r
-\r
-               while( p_wc )\r
-               {\r
-                       cl_perf_start( SendComp );\r
-                       CL_ASSERT( p_wc->status != IB_WCS_SUCCESS || p_wc->wc_type == IB_WC_SEND );\r
-                       p_nbl = (NET_BUFFER_LIST*)(uintn_t)p_wc->wr_id;\r
-                       //IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_SEND,\r
-                       //("[1]Successfull send completion for NBL=0x%x .\n", (UINT) (PVOID) p_nbl ));\r
-                       CL_ASSERT( p_nbl );\r
-                       CL_ASSERT( IPOIB_PORT_FROM_PACKET( p_nbl ) == p_port );\r
-                       length = 0;\r
-                       p_endpt = IPOIB_ENDPT_FROM_PACKET( p_nbl );\r
-                       p_send_buf = IPOIB_SEND_FROM_NETBUFFER( NET_BUFFER_LIST_FIRST_NB (p_nbl ));\r
-                       \r
-                       switch( p_wc->status )\r
-                       {\r
-                       case IB_WCS_SUCCESS:\r
-                               if( p_endpt->h_mcast )\r
-                               {\r
-                                       if( p_endpt->dgid.multicast.raw_group_id[11] == 0xFF &&\r
-                                               p_endpt->dgid.multicast.raw_group_id[10] == 0xFF &&\r
-                                               p_endpt->dgid.multicast.raw_group_id[12] == 0xFF &&\r
-                                               p_endpt->dgid.multicast.raw_group_id[13] == 0xFF )\r
-                                       {\r
-                                               type = IP_STAT_BCAST_BYTES;\r
-                                       }\r
-                                       else\r
-                                       {\r
-                                               type = IP_STAT_MCAST_BYTES;\r
-                                       }\r
-                               }\r
-                               else\r
-                               {\r
-                                       type = IP_STAT_UCAST_BYTES;\r
-                               }\r
-                               for (p_netbuffer = NET_BUFFER_LIST_FIRST_NB(p_nbl);\r
-                                        p_netbuffer != NULL;\r
-                                        p_netbuffer = NET_BUFFER_NEXT_NB(p_netbuffer))\r
-                               {\r
-                                        length += NET_BUFFER_DATA_LENGTH(p_netbuffer);\r
-                               }                       \r
-                               ipoib_inc_send_stat( p_port->p_adapter, type, length );\r
-                               //      IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_SEND,\r
-                                       //("Successfull send completion for NBL=0x%x .\n", (UINT) (PVOID) p_nbl) );\r
-                               NET_BUFFER_LIST_STATUS(p_nbl) = NDIS_STATUS_SUCCESS;\r
-                               IPOIB_DEC_NET_BUFFER_LIST_REF_COUNT(p_nbl);\r
-                               if (IPOIB_GET_NET_BUFFER_LIST_REF_COUNT(p_nbl) == 0)\r
-                                       NdisMSendNetBufferListsComplete(p_port->p_adapter->h_adapter,\r
-                                                                                               p_nbl,\r
-                                                                                               0);\r
-                               break;\r
-\r
-                       case IB_WCS_WR_FLUSHED_ERR:\r
-                               IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,\r
-                                       ("Flushed send completion.\n") );\r
-                                       ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );\r
-                               NET_BUFFER_LIST_STATUS(p_nbl) = NDIS_STATUS_RESET_IN_PROGRESS;\r
-                               NdisMSendNetBufferListsComplete(p_port->p_adapter->h_adapter,\r
-                                                                                               p_nbl,\r
-                                                                                               0);   \r
-                               break;\r
-\r
-                       default:\r
-                               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                       ("Send failed with %s (vendor specific %#x)\n",\r
-                                       p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status ),\r
-                                       (int)p_wc->vendor_specific) );\r
-                                       ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_ERROR, 0 );\r
-                               NET_BUFFER_LIST_STATUS(p_nbl) = NDIS_STATUS_FAILURE;\r
-                               NdisMSendNetBufferListsComplete(p_port->p_adapter->h_adapter,\r
-                                                                                               p_nbl,\r
-                                                                                               0);  \r
-                               break;\r
-                       }\r
-                       cl_perf_stop( &p_port->p_adapter->perf, SendComp );\r
-                       /* Dereference the enpoint used for the transfer. */\r
-                       ipoib_endpt_deref( p_endpt );\r
-\r
-                       if( p_send_buf )\r
-                       {\r
-                               cl_perf_start( FreeSendBuf );\r
-                               NdisFreeToNPagedLookasideList( &p_port->buf_mgr.send_buf_list,\r
-                                       p_send_buf );\r
-                       cl_perf_stop( &p_port->p_adapter->perf, FreeSendBuf );\r
-                       }\r
-\r
-                       cl_atomic_dec( &p_port->send_mgr.depth );\r
-\r
-                       p_wc = p_wc->p_next;\r
-                       cl_perf_inc( SendCompBundle );\r
-               }\r
-               /* If we didn't use up every WC, break out. */\r
-       } while( !p_free );\r
-\r
-       /* Rearm the CQ. */\r
-       cl_perf_start( RearmSend );\r
-       status = p_port->p_adapter->p_ifc->rearm_cq( p_port->ib_mgr.h_send_cq, FALSE );\r
-       cl_perf_stop( &p_port->p_adapter->perf, RearmSend );\r
-       CL_ASSERT( status == IB_SUCCESS );\r
-\r
-       /* Resume any sends awaiting resources. */\r
-       cl_perf_start( PortResume );\r
-       ipoib_port_resume( p_port, TRUE );\r
-       cl_perf_stop( &p_port->p_adapter->perf, PortResume );\r
-       \r
-       ipoib_port_deref( p_port, ref_send_cb );\r
-\r
-       cl_perf_stop( &p_port->p_adapter->perf, SendCb );\r
-       cl_perf_update_ctr( &p_port->p_adapter->perf, SendCompBundle );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_SEND );\r
-}\r
-\r
-\r
-/******************************************************************************\r
-*\r
-* Endpoint manager implementation\r
-*\r
-******************************************************************************/\r
-static void\r
-__endpt_mgr_construct(\r
-       IN                              ipoib_port_t* const                     p_port )\r
-{\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-       cl_qmap_init( &p_port->endpt_mgr.mac_endpts );\r
-       cl_qmap_init( &p_port->endpt_mgr.lid_endpts );\r
-       cl_fmap_init( &p_port->endpt_mgr.gid_endpts, __gid_cmp );\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-}\r
-\r
-static void\r
-__endpt_cm_mgr_thread(\r
-IN             void*           p_context );\r
-\r
-static ib_api_status_t\r
-__endpt_mgr_init(\r
-       IN                              ipoib_port_t* const                     p_port )\r
-{\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-#if 0\r
-       if( p_port->p_adapter->params.cm_enabled )\r
-       {\r
-               cl_fmap_init( &p_port->endpt_mgr.conn_endpts, __gid_cmp );\r
-               \r
-               NdisInitializeListHead( &p_port->endpt_mgr.pending_conns );\r
-               NdisAllocateSpinLock( &p_port->endpt_mgr.conn_lock );\r
-               cl_event_init( &p_port->endpt_mgr.event, FALSE );\r
-       \r
-               NdisInitializeListHead( &p_port->endpt_mgr.remove_conns );\r
-               NdisAllocateSpinLock( &p_port->endpt_mgr.remove_lock );\r
-\r
-               cl_thread_init( &p_port->endpt_mgr.h_thread, \r
-                                               __endpt_cm_mgr_thread,\r
-                                               ( const void *)p_port, \r
-                                               "CmEndPtMgr" );\r
-       }\r
-#endif\r
-       UNUSED_PARAM(p_port);\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-       return IB_SUCCESS;\r
-}\r
-\r
-static void\r
-__endpt_cm_mgr_thread(\r
-IN             void*           p_context )\r
-{\r
-       ib_api_status_t ib_status;\r
-       LIST_ENTRY              *p_item;\r
-       ipoib_endpt_t   *p_endpt;\r
-       ipoib_port_t    *p_port =( ipoib_port_t *)p_context;\r
-       \r
-       IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, \r
-               ("Starting Port [%d] Endpt CM thread \n", p_port->port_num ) );\r
-\r
-       while( !p_port->endpt_mgr.thread_is_done )\r
-       {\r
-               cl_event_wait_on( &p_port->endpt_mgr.event, EVENT_NO_TIMEOUT, FALSE );\r
-       \r
-               while( ( p_item = NdisInterlockedRemoveHeadList( \r
-                                                               &p_port->endpt_mgr.pending_conns,\r
-                                                               &p_port->endpt_mgr.conn_lock) ) != NULL )\r
-               {\r
-\r
-                       p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, list_item );\r
-                       if( p_port->endpt_mgr.thread_is_done )\r
-                       {\r
-                               endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );\r
-                               continue;\r
-                       }\r
-\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
-                               ("Endpt[%p] CONNECT REQ to MAC %02x:%02x:%02x:%02x:%02x:%02x\n",\r
-                               p_endpt,\r
-                               p_endpt->mac.addr[0], p_endpt->mac.addr[1],\r
-                               p_endpt->mac.addr[2], p_endpt->mac.addr[3],\r
-                               p_endpt->mac.addr[4], p_endpt->mac.addr[5] ) );\r
-                       \r
-                       if( !p_endpt->conn.h_send_qp )\r
-                       {\r
-                               ib_status = endpt_cm_create_qp( p_endpt, &p_endpt->conn.h_send_qp );\r
-                               if( ib_status != IB_SUCCESS )\r
-                               {\r
-                                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                               ("Endpt [%p ] CM create QP failed status %#x\n", p_endpt, ib_status ) );\r
-                               }\r
-                               else\r
-                               {\r
-                                       ib_status = ipoib_endpt_connect( p_endpt );\r
-                                       if( ib_status != IB_SUCCESS && ib_status != IB_PENDING )\r
-                                       {\r
-                                               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                                                       ("Endpt [ %p ] conn REQ failed status %#x\n", p_endpt, ib_status ) );\r
-                                       }\r
-                               }\r
-                               if( ib_status != IB_SUCCESS && ib_status != IB_PENDING )\r
-                               {\r
-                                       endpt_cm_set_state( p_endpt, IPOIB_CM_DESTROY );\r
-                                       endpt_cm_flush_recv( p_port, p_endpt );\r
-                                       endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );\r
-                               }\r
-                       }\r
-\r
-               }//while( p_item != NULL )\r
-\r
-               while( ( p_item = NdisInterlockedRemoveHeadList(\r
-                                                               &p_port->endpt_mgr.remove_conns,\r
-                                                               &p_port->endpt_mgr.remove_lock ) ) != NULL )\r
-               {\r
-                       p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, list_item );\r
-\r
-                       endpt_cm_set_state( p_endpt, IPOIB_CM_DESTROY );\r
-\r
-                       IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,\r
-                               ("\nDESTROYING Endpt[%p]  MAC %02x:%02x:%02x:%02x:%02x:%02x\n",\r
-                               p_endpt,\r
-                               p_endpt->mac.addr[0], p_endpt->mac.addr[1],\r
-                               p_endpt->mac.addr[2], p_endpt->mac.addr[3],\r
-                               p_endpt->mac.addr[4], p_endpt->mac.addr[5] ) );\r
-                       endpt_cm_flush_recv( p_port, p_endpt );\r
-                       endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );\r
-                       cl_obj_destroy( &p_endpt->obj );\r
-               }\r
-       }\r
-\r
-       p_port->endpt_mgr.thread_is_done++;\r
-       NdisFreeSpinLock( &p_port->endpt_mgr.conn_lock );\r
-       \r
-       IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, \r
-               (" Port [%d] Endpt thread is done\n", p_port->port_num ) );\r
-}\r
-\r
-static void\r
-__endpt_mgr_destroy(\r
-       IN                              ipoib_port_t* const                     p_port )\r
-{\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-       CL_ASSERT( cl_is_qmap_empty( &p_port->endpt_mgr.mac_endpts ) );\r
-       CL_ASSERT( cl_is_qmap_empty( &p_port->endpt_mgr.lid_endpts ) );\r
-       CL_ASSERT( cl_is_fmap_empty( &p_port->endpt_mgr.gid_endpts ) );\r
-       UNUSED_PARAM(p_port);\r
-#if 0\r
-       if( p_port->p_adapter->params.cm_enabled )\r
-       {\r
-               CL_ASSERT( cl_is_fmap_empty( &p_port->endpt_mgr.conn_endpts ) );\r
-       }\r
-#endif\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-}\r
-\r
-\r
-static void\r
-__endpt_mgr_remove_all(\r
-       IN                              ipoib_port_t* const                     p_port )\r
-{\r
-       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
-       \r
-       cl_obj_lock( &p_port->obj );\r
-       /* Wait for all readers to complete. */\r
-       while( p_port->endpt_rdr )\r
-               ;\r
-       /*\r
-        * We don't need to initiate destruction - this is called only\r
-        * from the __port_destroying function, and destruction cascades\r
-        * to all child objects.  Just clear all the maps.\r
-        */\r
-       cl_qmap_remove_all( &p_port->endpt_mgr.mac_endpts );\r
-       cl_qmap_remove_all( &p_port->endpt_mgr.lid_endpts );\r
-       cl_fmap_remove_all( &p_port->endpt_mgr.gid_endpts );\r
-       cl_obj_unlock( &p_port->obj );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
-}\r
-\r
-\r
-static void\r
-__endpt_mgr_reset_all(\r
-       IN                              ipoib_port_t* const                     p_port )\r
-{\r
-       cl_map_item_t                   *p_item;\r
-       cl_fmap_item_t                  *p_fmap_item;\r
-       ipoib_endpt_t                   *p_endpt;\r
-       cl_qlist_t                              mc_list;\r
-       cl_qlist_t                              conn_list;\r
-       uint32_t                                local_exist = 0;\r
-       NDIS_LINK_STATE                 link_state;\r
-       NDIS_STATUS_INDICATION  status_indication;\r
-\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
-\r
-       cl_qlist_init( &mc_list );\r
-       cl_qlist_init( &conn_list );\r
-//???  cl_obj_lock( &p_port->obj );\r
-       /* Wait for all readers to complete. */\r
-       while( p_port->endpt_rdr )\r
-               ;\r
-\r
-#if 0\r
-                       __endpt_mgr_remove_all(p_port);\r
-#else\r
-                       link_state.Header.Revision = NDIS_LINK_STATE_REVISION_1;\r
-                       link_state.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;\r
-                       link_state.Header.Size = sizeof(NDIS_LINK_STATE);\r
-                       link_state.MediaConnectState = MediaConnectStateDisconnected;\r
-                       link_state.MediaDuplexState = MediaDuplexStateFull;\r
-                       link_state.XmitLinkSpeed = link_state.RcvLinkSpeed = IPOIB_MEDIA_MAX_SPEED;\r
-\r
-                       IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,\r
-                                                               p_port->p_adapter->h_adapter,\r
-                                                               NDIS_STATUS_LINK_STATE,\r
-                                                               (PVOID)&link_state,\r
-                                                               sizeof(link_state));\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, ("Indicate DISCONNECT!\n") );\r
-                       NdisMIndicateStatusEx(p_port->p_adapter->h_adapter,&status_indication);\r
-                       \r
-                       link_state.MediaConnectState = MediaConnectStateConnected;\r
-                       IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,\r
-                                                               p_port->p_adapter->h_adapter,\r
-                                                               NDIS_STATUS_LINK_STATE,\r
-                                                               (PVOID)&link_state,\r
-                                                               sizeof(link_state));\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, ("Indicate Connect\n") );\r
-                       NdisMIndicateStatusEx(p_port->p_adapter->h_adapter,&status_indication);\r
-\r
-               \r
-                               //      IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
-                                       //      ("Link DOWN!\n") );\r
-\r
-       if( p_port->p_local_endpt )\r
-       {\r
-               //TODO: CM RESTORE\r
-               //ipoib_port_cancel_listen( p_port, p_port->p_local_endpt );\r
-\r
-               cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,\r
-                       &p_port->p_local_endpt->gid_item );\r
-               cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,\r
-                       &p_port->p_local_endpt->mac_item );\r
-               cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,\r
-                       &p_port->p_local_endpt->lid_item );\r
-               \r
-               cl_qlist_insert_head(\r
-                       &mc_list, &p_port->p_local_endpt->mac_item.pool_item.list_item );\r
-               local_exist = 1;\r
-\r
-               p_port->p_local_endpt = NULL;\r
-       }\r
-\r
-       p_item = cl_qmap_head( &p_port->endpt_mgr.mac_endpts );\r
-       while( p_item != cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )\r
-       {\r
-               p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );\r
-               p_item = cl_qmap_next( p_item );\r
-               if( p_endpt->h_mcast )\r
-               {\r
-                       /*\r
-                        * We destroy MC endpoints since they will get recreated\r
-                        * when the port comes back up and we rejoin the MC groups.\r
-                        */\r
-                       cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,\r
-                               &p_endpt->mac_item );\r
-                       cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,\r
-                               &p_endpt->gid_item );\r
-\r
-                       cl_qlist_insert_tail(\r
-                               &mc_list, &p_endpt->mac_item.pool_item.list_item );\r
-               }\r
-               /* destroy connected endpoints if any */\r
-               else if( p_port->p_adapter->params.cm_enabled &&\r
-                                endpt_cm_get_state( p_endpt ) != IPOIB_CM_DISCONNECTED )\r
-               {\r
-                       p_fmap_item = cl_fmap_get( &p_port->endpt_mgr.conn_endpts, &p_endpt->dgid );\r
-                       if( p_fmap_item != cl_fmap_end( &p_port->endpt_mgr.conn_endpts ) )\r
-                       {\r
-                               cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, \r
-                                       &p_endpt->conn_item );\r
-                       }\r
-                       cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,\r
-                               &p_endpt->mac_item );\r
-                       cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,\r
-                               &p_endpt->gid_item );\r
-\r
-                       cl_qlist_insert_tail(\r
-                               &conn_list, &p_endpt->mac_item.pool_item.list_item );\r
-               }\r
-               if( p_endpt->h_av )\r
-               {\r
-                       /* Destroy the AV for all other endpoints. */\r
-                       p_port->p_adapter->p_ifc->destroy_av( p_endpt->h_av );\r
-                       p_endpt->h_av = NULL;\r
-               }\r
-               \r
-               if( p_endpt->dlid )\r
-               {\r
-                       cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,\r
-                               &p_endpt->lid_item );\r
-                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,\r
-                               ("<__endptr_mgr_reset_all: setting p_endpt->dlid to 0\n"));\r
-                       p_endpt->dlid = 0;\r
-               }\r
-               \r
-       }\r
-#endif\r
-//???  cl_obj_unlock( &p_port->obj );\r
-\r
-       //TODO CM\r
-       /*while( cl_qlist_count( &conn_list ) )\r
-       {\r
-               endpt_cm_destroy_conn( p_port,\r
-                       PARENT_STRUCT( cl_qlist_remove_head( &conn_list ),\r
-                       ipoib_endpt_t, mac_item.pool_item.list_item ) );\r
-       }*/\r
-\r
-       if(cl_qlist_count( &mc_list ) - local_exist)\r
-       {\r
-               p_port->mcast_cnt =  (uint32_t)cl_qlist_count( &mc_list ) - local_exist;\r
-       }\r
-       else\r
-       {\r
-               p_port->mcast_cnt = 0;\r
-               KeSetEvent( &p_port->leave_mcast_event, EVENT_INCREMENT, FALSE );\r
-       }       \r
-\r
-       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("p_port->mcast_cnt = %d\n", p_port->mcast_cnt - local_exist));\r
-\r
-       /* Destroy all multicast endpoints now that we have released the lock. */\r
-       while( cl_qlist_count( &mc_list ) )\r
-       {\r
-               cl_list_item_t  *p_item;\r
-               p_item = cl_qlist_remove_head( &mc_list );\r
-               p_endpt = PARENT_STRUCT(p_item, ipoib_endpt_t, mac_item.pool_item.list_item);\r
-               cl_obj_destroy( &p_endpt->obj);\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
-}\r
-\r
-\r
-/*\r
- * Called when updating an endpoint entry in response to an ARP.\r
- * Because receive processing is serialized, and holds a reference\r
- * on the endpoint reader, we wait for all *other* readers to exit before\r
- * removing the item.\r
- */\r
-static void\r
-__endpt_mgr_remove(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ipoib_endpt_t* const            p_endpt )\r
-{\r
-#if 0 //CM\r
-       cl_fmap_item_t* p_fmap_item;\r
-#endif \r
-       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
-\r
-       /* This function must be called from the receive path */\r
-       CL_ASSERT(p_port->endpt_rdr > 0);\r
-\r
-       cl_obj_lock( &p_port->obj );\r
-       /* Wait for all readers to complete. */    \r
-       while( p_port->endpt_rdr > 1 )\r
-               ;\r
-\r
-       /* Remove the endpoint from the maps so further requests don't find it. */\r
-       cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts, &p_endpt->mac_item );\r
-       /*\r
-        * The enpoints are *ALWAYS* in both the MAC and GID maps.  They are only\r
-        * in the LID map if the GID has the same subnet prefix as us.\r
-        */\r
-       cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts, &p_endpt->gid_item );\r
-#if 0\r
-\r
-       if( p_port->p_adapter->params.cm_enabled )\r
-       {\r
-               p_fmap_item = cl_fmap_get( &p_port->endpt_mgr.conn_endpts, &p_endpt->dgid );\r
-               \r
-               if( p_fmap_item != cl_fmap_end( &p_port->endpt_mgr.conn_endpts ) )\r
-               {\r
-                       cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, \r
-                               &p_endpt->conn_item );\r
-               }\r
-       }\r
-#endif \r
-       if( p_endpt->dlid )\r
-       {\r
-               cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,\r
-                       &p_endpt->lid_item );\r
-       }\r
-\r
-       cl_obj_unlock( &p_port->obj );\r
-\r
-       //TODO CM\r
-       //endpt_cm_destroy_conn( p_port, p_endpt );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
-}\r
-\r
-\r
-NTSTATUS\r
-ipoib_mac_to_gid(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   mac_addr_t                                      mac,\r
-               OUT                     ib_gid_t*                                       p_gid )\r
-{\r
-       ipoib_endpt_t*  p_endpt;\r
-       cl_map_item_t   *p_item;\r
-       uint64_t                key = 0;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
-\r
-       cl_memcpy( &key, &mac, sizeof(mac_addr_t) );\r
-\r
-       cl_obj_lock( &p_port->obj );\r
-\r
-       p_item = cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key );\r
-       if( p_item == cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )\r
-       {\r
-               cl_obj_unlock( &p_port->obj );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Failed endpoint lookup.\n") );\r
-               return STATUS_INVALID_PARAMETER;\r
-       }\r
-\r
-       p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );\r
-       *p_gid = p_endpt->dgid;\r
-\r
-       cl_obj_unlock( &p_port->obj );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
-       return STATUS_SUCCESS;\r
-}\r
-\r
-\r
-NTSTATUS\r
-ipoib_mac_to_path(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   mac_addr_t                                      mac,\r
-               OUT                     ib_path_rec_t*                          p_path )\r
-{\r
-       ipoib_endpt_t*  p_endpt;\r
-       cl_map_item_t   *p_item;\r
-       uint64_t                key = 0;\r
-       uint8_t                 sl;\r
-       net32_t                 flow_lbl;\r
-       uint8_t                 hop_limit;\r
-       uint8_t                 pkt_life;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
-\r
-       cl_memcpy( &key, &mac, sizeof(mac_addr_t) );\r
-\r
-       cl_obj_lock( &p_port->obj );\r
-\r
-       if( p_port->p_local_endpt == NULL )\r
-       {\r
-               cl_obj_unlock( &p_port->obj );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("No local endpoint.\n") );\r
-               return STATUS_INVALID_PARAMETER;\r
-       }\r
-\r
-       if( mac.addr[0] == 0 && mac.addr[1] == 0 && mac.addr[2] == 0 &&\r
-               mac.addr[3] == 0 && mac.addr[4] == 0 && mac.addr[5] == 0 )\r
-       {\r
-               p_endpt = p_port->p_local_endpt;\r
-       }\r
-       else\r
-       {\r
-               p_item = cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key );\r
-               if( p_item == cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )\r
-               {\r
-                       cl_obj_unlock( &p_port->obj );\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Failed endpoint lookup.\n") );\r
-                       return STATUS_INVALID_PARAMETER;\r
-               }\r
-\r
-               p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );\r
-       }\r
-\r
-       p_path->service_id = 0;\r
-       p_path->dgid = p_endpt->dgid;\r
-       p_path->sgid = p_port->p_local_endpt->dgid;\r
-       p_path->dlid = p_endpt->dlid;\r
-       p_path->slid = p_port->p_local_endpt->dlid;\r
-\r
-       ib_member_get_sl_flow_hop(\r
-               p_port->ib_mgr.bcast_rec.sl_flow_hop,\r
-               &sl,\r
-               &flow_lbl,\r
-               &hop_limit\r
-               );\r
-       \r
-       if( p_path->slid == p_path->dlid )\r
-               pkt_life = 0;\r
-       else\r
-               pkt_life = p_port->ib_mgr.bcast_rec.pkt_life;\r
-\r
-       ib_path_rec_init_local(\r
-               p_path,\r
-               &p_endpt->dgid,\r
-               &p_port->p_local_endpt->dgid,\r
-               p_endpt->dlid,\r
-               p_port->p_local_endpt->dlid,\r
-               1,\r
-               p_port->ib_mgr.bcast_rec.pkey,\r
-               sl, 0,\r
-               IB_PATH_SELECTOR_EXACTLY, p_port->ib_mgr.bcast_rec.mtu,\r
-               IB_PATH_SELECTOR_EXACTLY, p_port->ib_mgr.bcast_rec.rate,\r
-               IB_PATH_SELECTOR_EXACTLY, pkt_life,\r
-               0 );\r
-\r
-       /* Set global routing information. */\r
-       ib_path_rec_set_hop_flow_raw( p_path, hop_limit, flow_lbl, FALSE );\r
-       p_path->tclass = p_port->ib_mgr.bcast_rec.tclass;\r
\r
-       cl_obj_unlock( &p_port->obj );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
-       return STATUS_SUCCESS;\r
-}\r
-\r
-\r
-static inline NDIS_STATUS\r
-__endpt_mgr_ref(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   mac_addr_t                                      mac,\r
-               OUT                     ipoib_endpt_t** const           pp_endpt )\r
-{\r
-       NDIS_STATUS             status;\r
-       cl_map_item_t   *p_item;\r
-       uint64_t                key;\r
-\r
-       PERF_DECLARE( EndptQueue );\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
-\r
-       if( !cl_memcmp( &mac, &p_port->p_adapter->params.conf_mac, sizeof(mac) ) )\r
-       {\r
-               /* Discard loopback traffic. */\r
-               IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_ENDPT,\r
-                       ("Discarding loopback traffic\n") );\r
-               IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
-               return NDIS_STATUS_NO_ROUTE_TO_DESTINATION;\r
-       }\r
-\r
-       key = 0;\r
-       cl_memcpy( &key, &mac, sizeof(mac_addr_t) );\r
-\r
-       cl_obj_lock( &p_port->obj );\r
-\r
-       IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_ENDPT,\r
-               ("Look for :\t  MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",\r
-               mac.addr[0], mac.addr[1], mac.addr[2],\r
-               mac.addr[3], mac.addr[4], mac.addr[5]) );\r
-\r
-       p_item = cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key );\r
-       if( p_item == cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )\r
-       {\r
-               cl_obj_unlock( &p_port->obj );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,\r
-                       ("Failed endpoint lookup.\n") );\r
-               return NDIS_STATUS_NO_ROUTE_TO_DESTINATION;\r
-       }\r
-\r
-       *pp_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );\r
-       ipoib_endpt_ref( *pp_endpt );\r
-\r
-       cl_obj_unlock( &p_port->obj );\r
-\r
-       cl_perf_start( EndptQueue );\r
-       status = ipoib_endpt_queue( *pp_endpt );\r
-       cl_perf_stop( &p_port->p_adapter->perf, EndptQueue );\r
-       if( status != NDIS_STATUS_SUCCESS )\r
-               *pp_endpt = NULL;\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
-       return status;\r
-}\r
-\r
-\r
-static inline NDIS_STATUS\r
-__endpt_mgr_get_gid_qpn(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   mac_addr_t                                      mac,\r
-               OUT                     ib_gid_t* const                         p_gid,\r
-               OUT                     UNALIGNED net32_t* const        p_qpn )\r
-{\r
-       UNALIGNED\r
-       cl_map_item_t   *p_item;\r
-       ipoib_endpt_t   *p_endpt;\r
-       uint64_t                key;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
-\r
-       cl_obj_lock( &p_port->obj );\r
-\r
-       key = 0;\r
-       cl_memcpy( &key, &mac, sizeof(mac_addr_t) );\r
-       p_item = cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key );\r
-       if( p_item == cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )\r
-       {\r
-               cl_obj_unlock( &p_port->obj );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,\r
-                       ("Failed endpoint lookup.\n") );\r
-               return NDIS_STATUS_FAILURE;\r
-       }\r
-\r
-       p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );\r
-\r
-       *p_gid = p_endpt->dgid;\r
-       *p_qpn = p_endpt->qpn;\r
-\r
-       cl_obj_unlock( &p_port->obj );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
-       return NDIS_STATUS_SUCCESS;\r
-}\r
-\r
-\r
-static inline ipoib_endpt_t*\r
-__endpt_mgr_get_by_gid(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   ib_gid_t* const                         p_gid )\r
-{\r
-       cl_fmap_item_t  *p_item;\r
-       ipoib_endpt_t   *p_endpt;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
-\r
-       p_item = cl_fmap_get( &p_port->endpt_mgr.gid_endpts, p_gid );\r
-       if( p_item == cl_fmap_end( &p_port->endpt_mgr.gid_endpts ) )\r
-               p_endpt = NULL;\r
-       else\r
-               p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, gid_item );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
-       return p_endpt;\r
-}\r
-\r
-\r
-static ipoib_endpt_t*\r
-__endpt_mgr_get_by_lid(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   net16_t                                         lid )\r
-{\r
-       cl_map_item_t   *p_item;\r
-       ipoib_endpt_t   *p_endpt;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
-\r
-       p_item = cl_qmap_get( &p_port->endpt_mgr.lid_endpts, lid );\r
-       if( p_item == cl_qmap_end( &p_port->endpt_mgr.lid_endpts ) )\r
-               p_endpt = NULL;\r
-       else\r
-               p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, lid_item );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
-       return p_endpt;\r
-}\r
-\r
-\r
-inline ib_api_status_t\r
-__endpt_mgr_insert_locked(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   mac_addr_t                                      mac,\r
-       IN                              ipoib_endpt_t* const            p_endpt )\r
-{\r
-       ib_api_status_t status;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
-\r
-       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,\r
-               ("insert  :\t  MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",\r
-               mac.addr[0], mac.addr[1], mac.addr[2],\r
-               mac.addr[3], mac.addr[4], mac.addr[5]) );\r
-\r
-       cl_obj_lock( &p_port->obj );\r
-       while( p_port->endpt_rdr )\r
-       {\r
-               cl_obj_unlock( &p_port->obj );\r
-               cl_obj_lock( &p_port->obj );\r
-       }\r
-       /* __endpt_mgr_insert expects *one* reference to be held when being called. */\r
-       cl_atomic_inc( &p_port->endpt_rdr );\r
-       status= __endpt_mgr_insert( p_port, mac, p_endpt );\r
-       cl_atomic_dec( &p_port->endpt_rdr );\r
-       cl_obj_unlock( &p_port->obj );\r
-\r
-       return status;\r
-}\r
-\r
-\r
-inline ib_api_status_t\r
-__endpt_mgr_insert(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   mac_addr_t                                      mac,\r
-       IN                              ipoib_endpt_t* const            p_endpt )\r
-{\r
-       uint64_t                key;\r
-       cl_status_t             cl_status;\r
-       cl_map_item_t   *p_qitem;\r
-       cl_fmap_item_t  *p_fitem;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
-\r
-       /* Wait for all accesses to the map to complete. */\r
-       while( p_port->endpt_rdr > 1 )\r
-               ;\r
-\r
-       /* Link the endpoint to the port. */\r
-       cl_status = cl_obj_insert_rel_parent_locked(\r
-               &p_endpt->rel, &p_port->obj, &p_endpt->obj );\r
-\r
-       if( cl_status != CL_SUCCESS )\r
-       {\r
-               cl_obj_destroy( &p_endpt->obj );\r
-               return IB_INVALID_STATE;\r
-       }\r
-\r
-#if DBG\r
-       cl_atomic_inc( &p_port->ref[ref_endpt_track] );\r
-       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,\r
-               ("ref  type %d ref_cnt %d\n", ref_endpt_track, p_port->obj.ref_cnt) );\r
-#endif\r
-\r
-       p_endpt->mac = mac;\r
-       key = 0;\r
-       cl_memcpy( &key, &mac, sizeof(mac_addr_t) );\r
-       p_qitem = cl_qmap_insert(\r
-               &p_port->endpt_mgr.mac_endpts, key, &p_endpt->mac_item );\r
-       CL_ASSERT( p_qitem == &p_endpt->mac_item );\r
-       p_fitem = cl_fmap_insert(\r
-               &p_port->endpt_mgr.gid_endpts, &p_endpt->dgid, &p_endpt->gid_item );\r
-       CL_ASSERT( p_fitem == &p_endpt->gid_item );\r
-       if( p_endpt->dlid )\r
-       {\r
-               p_qitem = cl_qmap_insert(\r
-                       &p_port->endpt_mgr.lid_endpts, p_endpt->dlid, &p_endpt->lid_item );\r
-               CL_ASSERT( p_qitem == &p_endpt->lid_item );\r
-               if (p_qitem != &p_endpt->lid_item) {\r
-                       // Since we failed to insert into the list, make sure it is not removed\r
-                       p_endpt->dlid =0;\r
-               }\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
-       return IB_SUCCESS;\r
-}\r
-\r
-\r
-static ib_api_status_t\r
-__endpt_mgr_add_bcast(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ib_mcast_rec_t                          *p_mcast_rec )\r
-{\r
-       ib_api_status_t status;\r
-       ipoib_endpt_t   *p_endpt;\r
-       mac_addr_t              bcast_mac;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       /*\r
-        * Cache the broadcast group properties for creating future mcast groups.\r
-        */\r
-       p_port->ib_mgr.bcast_rec = *p_mcast_rec->p_member_rec;\r
-\r
-       /* Allocate the broadcast endpoint. */\r
-       p_endpt = ipoib_endpt_create( &p_mcast_rec->p_member_rec->mgid,\r
-               0 , CL_HTON32(0x00FFFFFF) );\r
-       if( !p_endpt )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ipoib_endpt_create failed.\n") );\r
-               return IB_INSUFFICIENT_RESOURCES;\r
-       }\r
-       /* set reference to transport to be used while is not attached to the port */\r
-       p_endpt->is_mcast_listener = TRUE;\r
-       p_endpt->p_ifc = p_port->p_adapter->p_ifc;\r
-       status = ipoib_endpt_set_mcast( p_endpt, p_port->ib_mgr.h_pd,\r
-               p_port->port_num, p_mcast_rec );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               cl_obj_destroy( &p_endpt->obj );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ipoib_create_mcast_endpt returned %s\n",\r
-                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-               return status;\r
-       }\r
-\r
-       /* Add the broadcast endpoint to the endpoint map. */\r
-       cl_memset( &bcast_mac, 0xFF, sizeof(bcast_mac) );\r
-       status = __endpt_mgr_insert_locked( p_port, bcast_mac, p_endpt );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-       return status;\r
-}\r
-\r
-\r
-void\r
-ipoib_port_remove_endpt(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   mac_addr_t                                      mac )\r
-{\r
-       cl_map_item_t   *p_item;\r
-       //TODO CM\r
-//     cl_fmap_item_t  *p_fmap_item;\r
-       ipoib_endpt_t   *p_endpt;\r
-       uint64_t                key;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
-\r
-       key = 0;\r
-       cl_memcpy( &key, &mac, sizeof(mac_addr_t) );\r
-\r
-       /* Remove the endpoint from the maps so further requests don't find it. */\r
-       cl_obj_lock( &p_port->obj );\r
-       /* Wait for all readers to finish */\r
-       while( p_port->endpt_rdr )\r
-               ;\r
-       p_item = cl_qmap_remove( &p_port->endpt_mgr.mac_endpts, key );\r
-       /*\r
-        * Dereference the endpoint.  If the ref count goes to zero, it\r
-        * will get freed.\r
-        */\r
-       if( p_item != cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )\r
-       {\r
-               p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );\r
-               /*\r
-                * The enpoints are *ALWAYS* in both the MAC and GID maps.  They are only\r
-                * in the LID map if the GID has the same subnet prefix as us.\r
-                */\r
-               cl_fmap_remove_item(\r
-                       &p_port->endpt_mgr.gid_endpts, &p_endpt->gid_item );\r
-#if 0\r
-               if( p_port->p_adapter->params.cm_enabled )\r
-               {\r
-                       p_fmap_item = cl_fmap_get( &p_port->endpt_mgr.conn_endpts, &p_endpt->dgid );\r
-               \r
-                       if( p_fmap_item != cl_fmap_end( &p_port->endpt_mgr.conn_endpts ) )\r
-                       {\r
-                               cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, \r
-                                       &p_endpt->conn_item );\r
-                       }\r
-               }\r
-#endif\r
-\r
-               if( p_endpt->dlid )\r
-               {\r
-                       cl_qmap_remove_item(\r
-                               &p_port->endpt_mgr.lid_endpts, &p_endpt->lid_item );\r
-               }\r
-\r
-               cl_obj_unlock( &p_port->obj );\r
-               //TODO CM\r
-               //endpt_cm_destroy_conn( p_port, p_endpt );\r
-\r
-#if DBG\r
-               cl_atomic_dec( &p_port->ref[ref_endpt_track] );\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,\r
-                       ("ref type %d ref_cnt %d\n", ref_endpt_track, p_port->obj.ref_cnt) );\r
-#endif\r
-\r
-       }\r
-       else\r
-       {\r
-               cl_obj_unlock( &p_port->obj );\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
-}\r
-\r
-/*\r
- * The sequence for port up is as follows:\r
- *     1. The port goes active.  This allows the adapter to send SA queries\r
- *     and join the broadcast group (and other groups).\r
- *\r
- *     2. The adapter sends an SA query for the broadcast group.\r
- *\r
- *     3. Upon completion of the query, the adapter joins the broadcast group.\r
- */\r
-\r
-\r
-/*\r
- * Query the SA for the broadcast group.\r
- */\r
-void\r
-ipoib_port_up(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   ib_pnp_port_rec_t* const        p_pnp_rec )\r
-{\r
-       ib_port_info_t          *p_port_info;\r
-       ib_mad_t                        *mad_in         = NULL;\r
-       ib_mad_t                        *mad_out = NULL;\r
-       ib_api_status_t         status  = IB_INSUFFICIENT_MEMORY;\r
-       static int                      cnt     = 0;\r
-       \r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_INIT,\r
-                       ("[%d] Entering port_up.\n", ++cnt) ); \r
-       \r
-       cl_obj_lock( &p_port->obj );\r
-       if ( p_port->state == IB_QPS_INIT ) \r
-       {\r
-               cl_obj_unlock( &p_port->obj );\r
-               status = IB_SUCCESS;\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
-                       ("p_port->state = %d - Aborting.\n", p_port->state) );        \r
-               goto up_done;\r
-       }\r
-       else if ( p_port->state == IB_QPS_RTS )\r
-       {\r
-               cl_obj_unlock( &p_port->obj );\r
-               cl_obj_lock( &p_port->p_adapter->obj );\r
-               if( p_port->p_adapter->state == IB_PNP_PORT_INIT )\r
-               {\r
-                       p_port->p_adapter->state = IB_PNP_PORT_ACTIVE;\r
-               }\r
-               cl_obj_unlock( &p_port->p_adapter->obj );\r
-               status = IB_SUCCESS;\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
-                       ("Port init is done. p_port->state = %d.\n", p_port->state ) );\r
-               goto up_done;\r
-       }\r
-       p_port->state = IB_QPS_INIT;\r
-       cl_obj_unlock( &p_port->obj );  \r
-\r
-\r
-       /* Wait for all work requests to get flushed. */\r
-       while( p_port->recv_mgr.depth || p_port->send_mgr.depth )\r
-               cl_thread_suspend( 0 );\r
-\r
-       KeResetEvent( &p_port->sa_event );\r
-\r
-       mad_out = (ib_mad_t*)cl_zalloc(256);\r
-       if(! mad_out)\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("failed to allocate mad mad_out\n")); \r
-               goto up_done;\r
-       }\r
-       mad_in = (ib_mad_t*)cl_zalloc(256);\r
-       if(! mad_in)\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("failed to allocate mad mad_in\n")); \r
-               goto up_done;\r
-       }\r
-\r
-       mad_in->attr_id = IB_MAD_ATTR_PORT_INFO;\r
-       mad_in->method = IB_MAD_METHOD_GET;\r
-       mad_in->base_ver = 1;\r
-       mad_in->class_ver =1;\r
-       mad_in->mgmt_class = IB_MCLASS_SUBN_LID;\r
-       \r
-       status = p_port->p_adapter->p_ifc->local_mad(\r
-               p_port->ib_mgr.h_ca ,p_port->port_num ,mad_in ,mad_out);\r
-\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               ipoib_set_inactive( p_port->p_adapter );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ib_local_mad returned %s\n", \r
-                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-               goto up_done;\r
-       }\r
-\r
-       p_port_info = (ib_port_info_t*)(((ib_smp_t*)mad_out)->data);\r
-       p_port->base_lid = p_pnp_rec->p_port_attr->lid;\r
-       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
-                       ("Received port info: link width = %d.\n",\r
-                       p_port_info->link_width_active) );\r
-       p_port->ib_mgr.rate =\r
-               ib_port_info_compute_rate( p_port_info );\r
-       \r
-       ipoib_set_rate( p_port->p_adapter,\r
-               p_port_info->link_width_active,\r
-       ib_port_info_get_link_speed_active( p_port_info ) );\r
-\r
-       status = __port_get_bcast( p_port );\r
-       if (status != IB_SUCCESS)\r
-               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-               (" __port_get_bcast returned %s\n",p_port->p_adapter->p_ifc->get_err_str( status )));\r
-\r
-up_done:\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               if( status != IB_CANCELED )\r
-               {\r
-                       ipoib_set_inactive( p_port->p_adapter );\r
-                       __endpt_mgr_reset_all( p_port );\r
-               }\r
-               ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);\r
-               p_port->state = IB_QPS_ERROR;\r
-               KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
-       }\r
-\r
-       if(mad_out)\r
-               cl_free(mad_out);\r
-       if(mad_in)\r
-               cl_free(mad_in);\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-}\r
-\r
-\r
-static ib_api_status_t\r
-__endpt_mgr_add_local(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ib_port_info_t* const           p_port_info )\r
-{\r
-       ib_api_status_t                 status;\r
-       ib_gid_t                                gid;\r
-       ipoib_endpt_t                   *p_endpt;\r
-       ib_av_attr_t                    av_attr;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       ib_gid_set_default( &gid, p_port->p_adapter->guids.port_guid.guid );\r
-       p_endpt = ipoib_endpt_create(\r
-               &gid, p_port_info->base_lid, p_port->ib_mgr.qpn );\r
-       if( !p_endpt )\r
-       {\r
-               p_port->p_adapter->hung = TRUE;\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Failed to create local endpt\n") );\r
-               return IB_INSUFFICIENT_MEMORY;\r
-       }\r
-\r
-       cl_memclr( &av_attr, sizeof(ib_av_attr_t) );\r
-       av_attr.port_num = p_port->port_num;\r
-       av_attr.sl = 0;\r
-       IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,\r
-               (" av_attr.dlid = p_port_info->base_lid = %d\n", cl_ntoh16( p_port_info->base_lid ) ));\r
-       av_attr.dlid = p_port_info->base_lid;\r
-       av_attr.static_rate = p_port->ib_mgr.rate;\r
-       av_attr.path_bits = 0;\r
-       status = p_port->p_adapter->p_ifc->create_av(\r
-               p_port->ib_mgr.h_pd, &av_attr, &p_endpt->h_av );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               cl_obj_destroy( &p_endpt->obj );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ib_create_av for local endpoint returned %s\n",\r
-                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-               return status;\r
-       }\r
-\r
-       /* __endpt_mgr_insert expects *one* reference to be held. */\r
-       cl_atomic_inc( &p_port->endpt_rdr );\r
-       status = __endpt_mgr_insert( p_port, p_port->p_adapter->params.conf_mac, p_endpt );\r
-       cl_atomic_dec( &p_port->endpt_rdr );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("__endpt_mgr_insert for local endpoint returned %s\n",\r
-                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-               return status;\r
-       }\r
-\r
-       p_port->p_local_endpt = p_endpt;\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-       return status;\r
-}\r
-\r
-\r
-\r
-\r
-static ib_api_status_t\r
-__port_get_bcast(\r
-       IN                              ipoib_port_t* const                     p_port )\r
-{\r
-       ib_api_status_t         status;\r
-       ib_query_req_t          query;\r
-       ib_user_query_t         info;\r
-       ib_member_rec_t         member_rec;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       info.method = IB_MAD_METHOD_GETTABLE;\r
-       info.attr_id = IB_MAD_ATTR_MCMEMBER_RECORD;\r
-       info.attr_size = sizeof(ib_member_rec_t);\r
-       info.comp_mask = IB_MCR_COMPMASK_MGID;\r
-       info.p_attr = &member_rec;\r
-\r
-       /* Query requires only the MGID. */\r
-       cl_memclr( &member_rec, sizeof(ib_member_rec_t) );\r
-       member_rec.mgid = bcast_mgid_template;\r
-\r
-    member_rec.mgid.raw[4] = (uint8_t) (p_port->p_adapter->guids.port_guid.pkey >> 8) ;\r
-       member_rec.mgid.raw[5] = (uint8_t) p_port->p_adapter->guids.port_guid.pkey;\r
-       member_rec.pkey = cl_hton16(p_port->p_adapter->guids.port_guid.pkey);\r
-       cl_memclr( &query, sizeof(ib_query_req_t) );\r
-       query.query_type = IB_QUERY_USER_DEFINED;\r
-       query.p_query_input = &info;\r
-       query.port_guid = p_port->p_adapter->guids.port_guid.guid;\r
-       query.timeout_ms = p_port->p_adapter->params.sa_timeout;\r
-       query.retry_cnt = p_port->p_adapter->params.sa_retry_cnt;\r
-       query.query_context = p_port;\r
-       query.pfn_query_cb = __bcast_get_cb;\r
-\r
-       /* reference the object for the multicast query. */\r
-       ipoib_port_ref( p_port, ref_get_bcast );\r
-\r
-       status = p_port->p_adapter->p_ifc->query(\r
-               p_port->p_adapter->h_al, &query, &p_port->ib_mgr.h_query );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               ipoib_port_deref( p_port, ref_get_bcast );\r
-               ASSERT(FALSE);\r
-               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ib_query returned %s\n", \r
-                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-       }\r
-       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ib_query returned SUCCESS\n"));\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-       return status;\r
-}\r
-\r
-\r
-/* Callback for the MCMemberRecord Get query for the IPv4 broadcast group. */\r
-static void\r
-__bcast_get_cb(\r
-       IN                              ib_query_rec_t                          *p_query_rec )\r
-{\r
-       ipoib_port_t            *p_port;\r
-       ib_member_rec_t         *p_mc_req;\r
-       ib_api_status_t         status;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       p_port = (ipoib_port_t*)p_query_rec->query_context;\r
-\r
-       cl_obj_lock( &p_port->obj );\r
-       p_port->ib_mgr.h_query = NULL;\r
-\r
-       CL_ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);\r
-       if( p_port->state != IB_QPS_INIT )\r
-       {\r
-               status = IB_CANCELED;\r
-               goto done;\r
-       }\r
-       \r
-       status = p_query_rec->status;\r
-\r
-       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
-               ("status of request %s\n", \r
-               p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-\r
-       switch( status )\r
-       {\r
-       case IB_SUCCESS:\r
-               if( p_query_rec->result_cnt )\r
-               {\r
-                       p_mc_req = (ib_member_rec_t*)\r
-                               ib_get_query_result( p_query_rec->p_result_mad, 0 );\r
-\r
-                       /* Join the broadcast group. */\r
-                       status = __port_join_bcast( p_port, p_mc_req );\r
-                       break;\r
-               }\r
-               /* Fall through. */\r
-\r
-       case IB_REMOTE_ERROR:\r
-               /* SA failed the query.  Broadcast group doesn't exist, create it. */\r
-               status = __port_create_bcast( p_port );\r
-               break;\r
-\r
-       case IB_CANCELED:\r
-               IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
-                       ("Instance destroying - Aborting.\n") );\r
-               break;\r
-\r
-       default:\r
-               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
-                       EVENT_IPOIB_BCAST_GET, 1, p_query_rec->status );\r
-       }\r
-done:\r
-       cl_obj_unlock( &p_port->obj );\r
-\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               if( status != IB_CANCELED )\r
-               {\r
-                       ipoib_set_inactive( p_port->p_adapter );\r
-                       __endpt_mgr_reset_all( p_port );\r
-               }\r
-               p_port->state = IB_QPS_ERROR;\r
-               KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
-       }\r
-\r
-       /* Return the response MAD to AL. */\r
-       if( p_query_rec->p_result_mad )\r
-               p_port->p_adapter->p_ifc->put_mad( p_query_rec->p_result_mad );\r
-\r
-       /* Release the reference taken when issuing the member record query. */\r
-       ipoib_port_deref( p_port, ref_bcast_get_cb );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-}\r
-\r
-\r
-static ib_api_status_t\r
-__port_join_bcast(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN                              ib_member_rec_t* const          p_member_rec )\r
-{\r
-       ib_api_status_t         status;\r
-       ib_mcast_req_t          mcast_req;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       /* Check that the rate is realizable for our port. */\r
-       if( p_port->ib_mgr.rate < (p_member_rec->rate & 0x3F) &&\r
-               (g_ipoib.bypass_check_bcast_rate == 0))\r
-       {\r
-               /*\r
-                * The MC group rate is higher than our port's rate.  Log an error\r
-                * and stop.  A port transition will drive the retry.\r
-                */\r
-               IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,\r
-                       ("Unrealizable join due to rate mismatch.\n") );\r
-               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
-                       EVENT_IPOIB_BCAST_RATE, 2,\r
-                       (uint32_t)(p_member_rec->rate & 0x3F),\r
-                       (uint32_t)p_port->ib_mgr.rate );\r
-               return IB_ERROR;\r
-       }\r
-\r
-       /* Join the broadcast group. */\r
-       cl_memclr( &mcast_req, sizeof(mcast_req) );\r
-       /* Copy the results of the Get to use as parameters. */\r
-       mcast_req.member_rec = *p_member_rec;\r
-       /* We specify our port GID for the join operation. */\r
-       mcast_req.member_rec.port_gid.unicast.prefix = IB_DEFAULT_SUBNET_PREFIX;\r
-       mcast_req.member_rec.port_gid.unicast.interface_id =\r
-               p_port->p_adapter->guids.port_guid.guid;\r
-\r
-       mcast_req.mcast_context = p_port;\r
-       mcast_req.pfn_mcast_cb = __bcast_cb;\r
-       mcast_req.timeout_ms = p_port->p_adapter->params.sa_timeout;\r
-       mcast_req.retry_cnt = p_port->p_adapter->params.sa_retry_cnt;\r
-       mcast_req.port_guid = p_port->p_adapter->guids.port_guid.guid;\r
-       mcast_req.pkey_index = p_port->pkey_index;\r
-\r
-       if( ib_member_get_state( mcast_req.member_rec.scope_state ) !=\r
-               IB_MC_REC_STATE_FULL_MEMBER )\r
-       {\r
-               IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,\r
-                       ("Incorrect MC member rec join state in query response.\n") );\r
-               ib_member_set_state( &mcast_req.member_rec.scope_state,\r
-                       IB_MC_REC_STATE_FULL_MEMBER );\r
-       }\r
-\r
-       /* reference the object for the multicast join request. */\r
-       ipoib_port_ref( p_port, ref_join_bcast );\r
-\r
-       status = p_port->p_adapter->p_ifc->join_mcast(\r
-               p_port->ib_mgr.h_qp, &mcast_req );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               ipoib_port_deref( p_port, ref_bcast_join_failed );\r
-               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ib_join_mcast returned %s\n", \r
-                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-       }\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-       return status;\r
-}\r
-\r
-\r
-static ib_api_status_t\r
-__port_create_bcast(\r
-       IN                              ipoib_port_t* const                     p_port )\r
-{\r
-       ib_api_status_t         status;\r
-       ib_mcast_req_t          mcast_req;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       /* Join the broadcast group. */\r
-       cl_memclr( &mcast_req, sizeof(mcast_req) );\r
-       mcast_req.create = TRUE;\r
-       /*\r
-        * Create requires pkey, qkey, SL, flow label, traffic class, joing state\r
-        * and port GID.\r
-        *\r
-        * We specify the MGID since we don't want the SA to generate it for us.\r
-        */\r
-       mcast_req.member_rec.mgid = bcast_mgid_template;\r
-       mcast_req.member_rec.mgid.raw[4] = (uint8_t) (p_port->p_adapter->guids.port_guid.pkey >> 8); \r
-       mcast_req.member_rec.mgid.raw[5] = (uint8_t) p_port->p_adapter->guids.port_guid.pkey;\r
-       ib_gid_set_default( &mcast_req.member_rec.port_gid,\r
-               p_port->p_adapter->guids.port_guid.guid );\r
-       /*\r
-        * IPOIB spec requires that the QKEY have the MSb set so that the QKEY\r
-        * from the QP is used rather than the QKEY in the send WR.\r
-        */\r
-       mcast_req.member_rec.qkey =\r
-               (uint32_t)(uintn_t)p_port | IB_QP_PRIVILEGED_Q_KEY;\r
-       mcast_req.member_rec.mtu =\r
-               (IB_PATH_SELECTOR_EXACTLY << 6) | IB_MTU_LEN_2048;\r
-\r
-       mcast_req.member_rec.pkey = cl_hton16(p_port->p_adapter->guids.port_guid.pkey);\r
-\r
-       mcast_req.member_rec.sl_flow_hop = ib_member_set_sl_flow_hop( 0, 0, 0 );\r
-       mcast_req.member_rec.scope_state =\r
-               ib_member_set_scope_state( 2, IB_MC_REC_STATE_FULL_MEMBER );\r
-\r
-       mcast_req.mcast_context = p_port;\r
-       mcast_req.pfn_mcast_cb = __bcast_cb;\r
-       mcast_req.timeout_ms = p_port->p_adapter->params.sa_timeout;\r
-       mcast_req.retry_cnt = p_port->p_adapter->params.sa_retry_cnt;\r
-       mcast_req.port_guid = p_port->p_adapter->guids.port_guid.guid;\r
-       mcast_req.pkey_index = p_port->pkey_index;\r
-\r
-       /* reference the object for the multicast join request. */\r
-       ipoib_port_ref( p_port, ref_join_bcast );\r
-\r
-       status = p_port->p_adapter->p_ifc->join_mcast( p_port->ib_mgr.h_qp, &mcast_req );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               ipoib_port_deref( p_port, ref_bcast_create_failed );\r
-               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ib_join_mcast returned %s\n", \r
-                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-       }\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-       return status;\r
-}\r
-\r
-\r
-void\r
-ipoib_port_down(\r
-       IN                              ipoib_port_t* const                     p_port )\r
-{\r
-       ib_api_status_t         status;\r
-       ib_qp_mod_t                     qp_mod;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       /*\r
-        * Mark our state.  This causes all callbacks to abort.\r
-        * Note that we hold the receive lock so that we synchronize\r
-        * with reposting.  We must take the receive lock before the\r
-        * object lock since that is the order taken when reposting.\r
-        */\r
-       cl_spinlock_acquire( &p_port->recv_lock );\r
-       cl_obj_lock( &p_port->obj );\r
-       p_port->state = IB_QPS_ERROR;\r
-\r
-       NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
-               EVENT_IPOIB_PORT_DOWN, 0 );\r
-\r
-       if( p_port->ib_mgr.h_query )\r
-       {\r
-               p_port->p_adapter->p_ifc->cancel_query(\r
-                       p_port->p_adapter->h_al, p_port->ib_mgr.h_query );\r
-               p_port->ib_mgr.h_query = NULL;\r
-       }\r
-       cl_obj_unlock( &p_port->obj );\r
-       cl_spinlock_release( &p_port->recv_lock );\r
-\r
-       KeWaitForSingleObject(\r
-               &p_port->sa_event, Executive, KernelMode, FALSE, NULL );\r
-\r
-       /* garbage collector timer is not needed when link is down */\r
-       KeCancelTimer(&p_port->gc_timer);\r
-       KeFlushQueuedDpcs();\r
-\r
-       /*\r
-        * Put the QP in the error state.  This removes the need to\r
-        * synchronize with send/receive callbacks.\r
-        */\r
-       CL_ASSERT( p_port->ib_mgr.h_qp );\r
-       cl_memclr( &qp_mod, sizeof(ib_qp_mod_t) );\r
-       qp_mod.req_state = IB_QPS_ERROR;\r
-       status = p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp, &qp_mod );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ib_modify_qp to error state returned %s.\n",\r
-                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-               p_port->p_adapter->hung = TRUE;\r
-               return;\r
-       }\r
-\r
-       KeResetEvent(&p_port->leave_mcast_event);\r
-\r
-       /* Reset all endpoints so we don't flush our ARP cache. */\r
-       __endpt_mgr_reset_all( p_port );\r
-\r
-       KeWaitForSingleObject(\r
-               &p_port->leave_mcast_event, Executive, KernelMode, FALSE, NULL );\r
-\r
-       __pending_list_destroy(p_port);\r
-       \r
-       cl_obj_lock( &p_port->p_adapter->obj );\r
-       ipoib_dereg_addrs( p_port->p_adapter );\r
-       cl_obj_unlock( &p_port->p_adapter->obj );\r
-       \r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-}\r
-\r
-\r
-static void\r
-__bcast_cb(\r
-       IN                              ib_mcast_rec_t                          *p_mcast_rec )\r
-{\r
-       ipoib_port_t    *p_port;\r
-       ib_api_status_t status;\r
-       LARGE_INTEGER   gc_due_time;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-\r
-       p_port = (ipoib_port_t*)p_mcast_rec->mcast_context;\r
-\r
-       cl_obj_lock( &p_port->obj );\r
-\r
-       ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);\r
-       if( p_port->state != IB_QPS_INIT )\r
-       {\r
-               cl_obj_unlock( &p_port->obj );\r
-               if( p_mcast_rec->status == IB_SUCCESS )\r
-               {\r
-                       ipoib_port_ref(p_port, ref_leave_mcast);\r
-                       p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast, __leave_error_mcast_cb );\r
-               }\r
-               KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
-               ipoib_port_deref( p_port, ref_bcast_inv_state );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
-                       ("Invalid state - Aborting.\n") );\r
-               return;\r
-       }\r
-       status = p_mcast_rec->status;\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Multicast join for broadcast group returned %s.\n",\r
-                       p_port->p_adapter->p_ifc->get_err_str( p_mcast_rec->status )) );\r
-               if( status == IB_REMOTE_ERROR )\r
-               {\r
-                       /*\r
-                        * Either:\r
-                        *      - the join failed because the group no longer exists\r
-                        *      - the create failed because the group already exists\r
-                        *\r
-                        * Kick off a new Get query to the SA to restart the join process\r
-                        * from the top.  Note that as an optimization, it would be\r
-                        * possible to distinguish between the join and the create.\r
-                        * If the join fails, try the create.  If the create fails, start\r
-                        * over with the Get.\r
-                        */\r
-                       /* TODO: Assert is a place holder.  Can we ever get here if the\r
-                       state isn't IB_PNP_PORT_ADD or PORT_DOWN or PORT_INIT? */\r
-                       CL_ASSERT( p_port->p_adapter->state == IB_PNP_PORT_ADD ||\r
-                               p_port->p_adapter->state == IB_PNP_PORT_DOWN ||\r
-                               p_port->p_adapter->state == IB_PNP_PORT_INIT );\r
-                       if(++p_port->bc_join_retry_cnt < p_port->p_adapter->params.bc_join_retry)\r
-                       {\r
-                               status = __port_get_bcast( p_port );\r
-                       }\r
-                       else\r
-                       {\r
-                               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
-                                       EVENT_IPOIB_BCAST_JOIN, 1, p_mcast_rec->status );\r
-                               p_port->bc_join_retry_cnt = 0;\r
-                       }\r
-               }\r
-               else\r
-               {\r
-                       NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
-                               EVENT_IPOIB_BCAST_JOIN, 1, p_mcast_rec->status );\r
-               }\r
-\r
-               cl_obj_unlock( &p_port->obj );\r
-               if( status != IB_SUCCESS )\r
-               {\r
-                       ipoib_set_inactive( p_port->p_adapter );\r
-                       __endpt_mgr_reset_all( p_port );\r
-                       ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);\r
-                       p_port->state = IB_QPS_ERROR;\r
-                       KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
-               }\r
-               ipoib_port_deref( p_port, ref_bcast_req_failed );\r
-               IPOIB_EXIT( IPOIB_DBG_INIT );\r
-               return;\r
-       }\r
-       p_port->bc_join_retry_cnt = 0;\r
-\r
-       while( p_port->endpt_rdr )\r
-       {\r
-               cl_obj_unlock( &p_port->obj );\r
-               cl_obj_lock( &p_port->obj );\r
-       }\r
-\r
-       if( !p_port->p_local_endpt )\r
-       {\r
-               ib_port_info_t  port_info;\r
-               cl_memclr(&port_info, sizeof(port_info));\r
-               port_info.base_lid = p_port->base_lid;\r
-               status = __endpt_mgr_add_local( p_port, &port_info );\r
-               if( status != IB_SUCCESS )\r
-               {\r
-                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("__endpt_mgr_add_local returned %s\n",\r
-                               p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-                       cl_obj_unlock( &p_port->obj );\r
-                       goto err;\r
-               }\r
-       }\r
-\r
-       cl_obj_unlock( &p_port->obj );\r
-\r
-       status = __endpt_mgr_add_bcast( p_port, p_mcast_rec );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("__endpt_mgr_add_bcast returned %s\n",\r
-                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-               ipoib_port_ref(p_port, ref_leave_mcast);\r
-               status = p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast, __leave_error_mcast_cb );\r
-               CL_ASSERT( status == IB_SUCCESS );\r
-               goto err;\r
-       }\r
-\r
-       /* Get the QP ready for action. */\r
-       status = __ib_mgr_activate( p_port );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("__ib_mgr_activate returned %s\n", \r
-                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-\r
-err:\r
-               /* Flag the adapter as hung. */\r
-               p_port->p_adapter->hung = TRUE;\r
-               ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);\r
-               p_port->state = IB_QPS_ERROR;        \r
-               KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
-               ipoib_port_deref( p_port, ref_bcast_error );\r
-               IPOIB_EXIT( IPOIB_DBG_INIT );\r
-               return;\r
-       }\r
-\r
-       cl_obj_lock( &p_port->obj );\r
-       /* Only change the state if we're still in INIT. */\r
-       ASSERT( p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);\r
-       if (p_port->state == IB_QPS_INIT) {\r
-               p_port->state = IB_QPS_RTS;\r
-       }\r
-       cl_obj_unlock( &p_port->obj );\r
-\r
-       /* Prepost receives. */\r
-       cl_spinlock_acquire( &p_port->recv_lock );\r
-       __recv_mgr_repost( p_port );\r
-       cl_spinlock_release( &p_port->recv_lock );\r
-\r
-       /* Notify the adapter that we now have an active connection. */\r
-       status = ipoib_set_active( p_port->p_adapter );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               ib_qp_mod_t                     qp_mod;\r
-               ipoib_set_inactive( p_port->p_adapter );\r
-               KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
-                       ("ipoib_set_active returned %s.\n",p_port->p_adapter->p_ifc->get_err_str( status )));\r
-               cl_spinlock_acquire( &p_port->recv_lock );\r
-               cl_obj_lock( &p_port->obj );\r
-               p_port->state = IB_QPS_ERROR;\r
-               if( p_port->ib_mgr.h_query )\r
-               {\r
-                       p_port->p_adapter->p_ifc->cancel_query(\r
-                               p_port->p_adapter->h_al, p_port->ib_mgr.h_query );\r
-                       p_port->ib_mgr.h_query = NULL;\r
-               }\r
-               cl_obj_unlock( &p_port->obj );\r
-               cl_spinlock_release( &p_port->recv_lock );\r
-\r
-               CL_ASSERT( p_port->ib_mgr.h_qp );\r
-               cl_memclr( &qp_mod, sizeof(ib_qp_mod_t) );\r
-               qp_mod.req_state = IB_QPS_ERROR;\r
-               status = p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp, &qp_mod );\r
-               __endpt_mgr_reset_all( p_port );\r
-\r
-               ipoib_port_deref( p_port, ref_join_bcast );\r
-               return;\r
-       }\r
-#if 0 //CM\r
-       if( p_port->p_adapter->params.cm_enabled &&\r
-               !p_port->p_local_endpt->conn.h_cm_listen )\r
-       {\r
-               if( ipoib_port_listen( p_port ) != IB_SUCCESS )\r
-               {\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Port CM Listen failed\n" ) );\r
-                       /*keep going with UD only */\r
-                       p_port->p_adapter->params.cm_enabled = FALSE;\r
-\r
-                       NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
-                               EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de3 );\r
-               }\r
-       }\r
-#endif\r
-       /* garbage collector timer is needed when link is active */\r
-       gc_due_time.QuadPart = -(int64_t)(((uint64_t)p_port->p_adapter->params.mc_leave_rescan * 2000000) * 10);\r
-       KeSetTimerEx(&p_port->gc_timer,gc_due_time,\r
-                           (LONG)p_port->p_adapter->params.mc_leave_rescan*1000,&p_port->gc_dpc);\r
-\r
-       KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
-       ipoib_port_deref( p_port, ref_join_bcast );\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-}\r
-\r
-\r
-static void\r
-__qp_event(\r
-       IN                              ib_async_event_rec_t            *p_event_rec )\r
-{\r
-       UNUSED_PARAM( p_event_rec );\r
-       CL_ASSERT( p_event_rec->context );\r
-       ((ipoib_port_t*)p_event_rec->context)->p_adapter->hung = TRUE;\r
-}\r
-\r
-\r
-static void\r
-__cq_event(\r
-       IN                              ib_async_event_rec_t            *p_event_rec )\r
-{\r
-       UNUSED_PARAM( p_event_rec );\r
-       CL_ASSERT( p_event_rec->context );\r
-       ((ipoib_port_t*)p_event_rec->context)->p_adapter->hung = TRUE;\r
-}\r
-\r
-\r
-static ib_api_status_t\r
-__ib_mgr_activate(\r
-       IN                              ipoib_port_t* const                     p_port )\r
-{\r
-       ib_api_status_t status;\r
-       ib_dgrm_info_t  dgrm_info;\r
-       ib_qp_mod_t             qp_mod;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_INIT );\r
-       /*\r
-        * Move the QP to RESET.  This allows us to reclaim any\r
-        * unflushed receives.\r
-        */\r
-       cl_memclr( &qp_mod, sizeof(ib_qp_mod_t) );\r
-       qp_mod.req_state = IB_QPS_RESET;\r
-       status = p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp, &qp_mod );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ib_modify_qp returned %s\n", \r
-                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-               return status;\r
-       }\r
-\r
-       /* Move the QP to RTS. */\r
-       dgrm_info.port_guid = p_port->p_adapter->guids.port_guid.guid;\r
-       dgrm_info.qkey = p_port->ib_mgr.bcast_rec.qkey;\r
-       dgrm_info.pkey_index = p_port->pkey_index;\r
-       status = p_port->p_adapter->p_ifc->init_dgrm_svc( p_port->ib_mgr.h_qp, &dgrm_info );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ib_init_dgrm_svc returned %s\n", \r
-                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-               return status;\r
-       }\r
-\r
-       /* Rearm the CQs. */\r
-       status = p_port->p_adapter->p_ifc->rearm_cq( p_port->ib_mgr.h_recv_cq, FALSE );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ib_rearm_cq for recv returned %s\n", \r
-                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-               return status;\r
-       }\r
-       status = p_port->p_adapter->p_ifc->rearm_cq( p_port->ib_mgr.h_send_cq, FALSE );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ib_rearm_cq for send returned %s\n", \r
-                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-               return status;\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_INIT );\r
-       return IB_SUCCESS;\r
-}\r
-\r
-\r
-/* Transition to a passive level thread. */\r
-ib_api_status_t\r
-ipoib_port_join_mcast(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   mac_addr_t                              mac,\r
-       IN              const   uint8_t                                 state)\r
-{\r
-       ib_api_status_t         status;\r
-       ib_mcast_req_t          mcast_req;\r
-       ipoib_endpt_t           *p_endpt;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_MCAST );\r
-\r
-       switch( __endpt_mgr_ref( p_port, mac, &p_endpt ) )\r
-       {\r
-       case NDIS_STATUS_NO_ROUTE_TO_DESTINATION:\r
-               break;\r
-\r
-       case NDIS_STATUS_SUCCESS:\r
-               ipoib_endpt_deref( p_endpt );\r
-               /* Fall through */\r
-\r
-       case NDIS_STATUS_PENDING:\r
-               return IB_SUCCESS;\r
-       }\r
-\r
-       /*\r
-        * Issue the mcast request, using the parameters of the broadcast group.\r
-        * This allows us to do a create request that should always succeed since\r
-        * the required parameters are known.\r
-        */\r
-       cl_memclr( &mcast_req, sizeof(mcast_req) );\r
-       mcast_req.create = TRUE;\r
-\r
-       /* Copy the settings from the broadcast group. */\r
-       mcast_req.member_rec = p_port->ib_mgr.bcast_rec;\r
-       /* Clear fields that aren't specified in the join */\r
-       mcast_req.member_rec.mlid = 0;\r
-       ib_member_set_state( &mcast_req.member_rec.scope_state,state);\r
-\r
-       if( (mac.addr[0] == 1) && (mac.addr[2] == 0x5E ))\r
-       {\r
-               /*\r
-                * Update the address portion of the MGID with the 28 lower bits of the\r
-                * IP address.  Since we're given a MAC address, we are using \r
-                * 24 lower bits of that network-byte-ordered value (assuming MSb\r
-                * is zero) and 4 lsb bits of the first byte of IP address.\r
-                */\r
-               mcast_req.member_rec.mgid.raw[12] = mac.addr[1];\r
-               mcast_req.member_rec.mgid.raw[13] = mac.addr[3];\r
-               mcast_req.member_rec.mgid.raw[14] = mac.addr[4];\r
-               mcast_req.member_rec.mgid.raw[15] = mac.addr[5];\r
-       }\r
-       else\r
-       {\r
-               /* Handle non IP mutlicast MAC addresses. */\r
-               /* Update the signature to use the lower 2 bytes of the OpenIB OUI. */\r
-               mcast_req.member_rec.mgid.raw[2] = 0x14;\r
-               mcast_req.member_rec.mgid.raw[3] = 0x05;\r
-               /* Now copy the MAC address into the last 6 bytes of the GID. */\r
-               cl_memcpy( &mcast_req.member_rec.mgid.raw[10], mac.addr, 6 );\r
-       }\r
-\r
-       mcast_req.mcast_context = p_port;\r
-       mcast_req.pfn_mcast_cb = __mcast_cb;\r
-       mcast_req.timeout_ms = p_port->p_adapter->params.sa_timeout;\r
-       mcast_req.retry_cnt = p_port->p_adapter->params.sa_retry_cnt;\r
-       mcast_req.port_guid = p_port->p_adapter->guids.port_guid.guid;\r
-       mcast_req.pkey_index = p_port->pkey_index;\r
-       mcast_req.member_rec.pkey = cl_hton16(p_port->p_adapter->guids.port_guid.pkey);\r
-       /*\r
-        * Create the endpoint and insert it in the port.  Since we don't wait for\r
-        * the mcast SA operations to complete before returning from the multicast\r
-        * list set OID asynchronously, it is possible for the mcast entry to be\r
-        * cleared before the SA interaction completes.  In this case, when the\r
-        * mcast callback is invoked, it would not find the corresponding endpoint\r
-        * and would be undone.\r
-        */\r
-       p_endpt = ipoib_endpt_create(\r
-               &mcast_req.member_rec.mgid, 0, CL_HTON32(0x00FFFFFF) );\r
-       if( !p_endpt )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ipoib_endpt_create failed.\n") );\r
-               return IB_INSUFFICIENT_MEMORY;\r
-       }\r
-\r
-       status = __endpt_mgr_insert_locked( p_port, mac, p_endpt );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("__endpt_mgr_insert_locked returned %s\n", \r
-                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-               return status;\r
-       }\r
-\r
-       /* reference the object for the multicast join request. */\r
-       ipoib_port_ref( p_port, ref_join_mcast );\r
-\r
-       status = p_port->p_adapter->p_ifc->join_mcast( p_port->ib_mgr.h_qp, &mcast_req );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               ipoib_port_deref( p_port, ref_mcast_join_failed );\r
-               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("ib_join_mcast returned %s\n", \r
-                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-       }\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_MCAST );\r
-       return status;\r
-}\r
-\r
-\r
-static void\r
-__mcast_cb(\r
-       IN                              ib_mcast_rec_t                          *p_mcast_rec )\r
-{\r
-       ib_api_status_t         status;\r
-       ipoib_port_t            *p_port;\r
-       cl_fmap_item_t          *p_item;\r
-       ipoib_endpt_t           *p_endpt;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_MCAST );\r
-\r
-       p_port = (ipoib_port_t*)p_mcast_rec->mcast_context;\r
-\r
-       cl_obj_lock( &p_port->obj );\r
-       while( p_port->endpt_rdr )\r
-       {\r
-               cl_obj_unlock( &p_port->obj );\r
-               cl_obj_lock( &p_port->obj );\r
-       }\r
-       if( p_port->state != IB_QPS_RTS )\r
-       {\r
-               cl_obj_unlock( &p_port->obj );\r
-               if( p_mcast_rec->status == IB_SUCCESS )\r
-\r
-               {\r
-                       ipoib_port_ref(p_port, ref_leave_mcast);\r
-                       p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast, __leave_error_mcast_cb );\r
-               }\r
-               ipoib_port_deref( p_port, ref_mcast_inv_state );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
-                       ("Invalid state - Aborting.\n") );\r
-               return;\r
-       }\r
-\r
-       if( p_mcast_rec->status != IB_SUCCESS )\r
-       {\r
-               cl_obj_unlock( &p_port->obj );\r
-               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Multicast join request failed with status %s.\n",\r
-                       p_port->p_adapter->p_ifc->get_err_str( p_mcast_rec->status )) );\r
-               /* Flag the adapter as hung. */\r
-               p_port->p_adapter->hung =TRUE;\r
-               ipoib_port_deref( p_port, ref_mcast_req_failed );\r
-               IPOIB_EXIT( IPOIB_DBG_MCAST );\r
-               return;\r
-       }\r
-\r
-       p_item = cl_fmap_get(\r
-               &p_port->endpt_mgr.gid_endpts, &p_mcast_rec->p_member_rec->mgid );\r
-       if( p_item == cl_fmap_end( &p_port->endpt_mgr.gid_endpts ) )\r
-       {\r
-               /*\r
-                * The endpoint must have been flushed while the join request\r
-                * was outstanding.  Just leave the group and return.  This\r
-                * is not an error.\r
-                */\r
-               cl_obj_unlock( &p_port->obj );\r
-               IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_ERROR,\r
-                       ("Failed to find endpoint for update.\n") );\r
-\r
-               ipoib_port_ref(p_port, ref_leave_mcast);\r
-               p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast, __leave_error_mcast_cb );\r
-               ipoib_port_deref( p_port, ref_mcast_no_endpt );\r
-               IPOIB_EXIT( IPOIB_DBG_MCAST );\r
-               return;\r
-       }\r
-\r
-       p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, gid_item );\r
-       p_endpt->p_ifc = p_port->p_adapter->p_ifc;\r
-\r
-       /* Setup the endpoint for use. */\r
-       status = ipoib_endpt_set_mcast(\r
-               p_endpt, p_port->ib_mgr.h_pd, p_port->port_num, p_mcast_rec );\r
-       if( status != IB_SUCCESS )\r
-       {\r
-               cl_obj_unlock( &p_port->obj );\r
-               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_MCAST,\r
-                       ("ipoib_endpt_set_mcast returned %s.\n",\r
-                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
-               /* Flag the adapter as hung. */\r
-               p_port->p_adapter->hung = TRUE;\r
-               ipoib_port_deref( p_port, ref_mcast_av_failed );\r
-               IPOIB_EXIT( IPOIB_DBG_MCAST );\r
-               return;\r
-       }\r
-\r
-       /*\r
-        * The endpoint is already in the GID and MAC maps.\r
-        * mast endpoint are not used in the LID map.\r
-        */\r
-       CL_ASSERT(p_endpt->dlid == 0);\r
-       /* set flag that endpoint is use */\r
-       p_endpt->is_in_use = TRUE;\r
-       cl_obj_unlock( &p_port->obj );\r
-       \r
-       /* Try to send all pending sends. */\r
-       ipoib_port_resume( p_port , FALSE);\r
-\r
-       ipoib_port_deref( p_port, ref_join_mcast );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_MCAST );\r
-}\r
-\r
-\r
-void\r
-ipoib_leave_mcast_cb(\r
-       IN                              void                            *context )\r
-{\r
-       ipoib_port_t            *p_port;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_MCAST );\r
-\r
-       p_port = (ipoib_port_t*)context;\r
-\r
-       IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_MCAST,("p_port->mcast_cnt = %d\n", p_port->mcast_cnt));\r
-       \r
-       ipoib_port_deref( p_port, ref_leave_mcast);\r
-       cl_atomic_dec( &p_port->mcast_cnt);\r
-       \r
-       if(0 == p_port->mcast_cnt)\r
-       {\r
-               KeSetEvent( &p_port->leave_mcast_event, EVENT_INCREMENT, FALSE );\r
-       }\r
-       \r
-       IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,\r
-                       ("Leave mcast callback deref ipoib_port \n") );\r
-       \r
-       IPOIB_EXIT( IPOIB_DBG_MCAST );\r
-}\r
-\r
-\r
-\r
-void\r
-__leave_error_mcast_cb(\r
-       IN                              void                            *context )\r
-{\r
-       ipoib_port_t            *p_port;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_MCAST );\r
-\r
-       p_port = (ipoib_port_t*)context;\r
-\r
-       ipoib_port_deref( p_port, ref_leave_mcast);\r
-       IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,\r
-                       ("Leave mcast callback deref ipoib_port \n") );\r
-       \r
-       IPOIB_EXIT( IPOIB_DBG_MCAST );\r
-}\r
-\r
-/*++\r
-Routine Description:\r
-    The routine process the packet and returns LSO information\r
-    \r
-Arguments:\r
-    pNetBuffer - a pointer to the first net buffer object of the packet\r
-    TcpHeaderOffset - offset to the begining of the TCP header in the packet\r
-    pLsoData - pointer to LsoData object in which the routine returns the LSO information\r
-    pHeaderSize - pointer to ULONG object in which the header size is returned\r
-    IndexOfData - \r
-             \r
-Return Value:\r
-     NDIS_STATUS   \r
-\r
-NOTE:\r
-    called at DISPATCH level\r
---*/\r
-\r
-NDIS_STATUS GetLsoHeaderSize(\r
-       IN              PNET_BUFFER             pNetBuffer,\r
-       IN              LsoData                 *pLsoData,\r
-       OUT     UINT                    *IndexOfData,\r
-       IN              ipoib_hdr_t *ipoib_hdr\r
-       )\r
-{\r
-       UINT            CurrLength;\r
-       PUCHAR          pSrc;\r
-       PUCHAR          pCopiedData = pLsoData->coppied_data;\r
-       ip_hdr_t        UNALIGNED  *IpHdr;\r
-       tcp_hdr_t       UNALIGNED *TcpHdr;\r
-       uint16_t        TcpHeaderLen;\r
-       uint16_t        IpHeaderLen;\r
-       uint16_t        IpOffset;\r
-       INT                     FullBuffers = 0;\r
-       PMDL            pMDL;\r
-       NDIS_STATUS     status = NDIS_STATUS_INVALID_PACKET;\r
-       \r
-       \r
-#define IP_OFFSET 14;\r
-       //\r
-       // This Flag indicates the way we gets the headers\r
-       // RegularFlow = we get the headers (ETH+IP+TCP) in the same Buffer \r
-       // in sequence.\r
-       //\r
-       boolean_t                       IsRegularFlow = TRUE;\r
-\r
-       const uint16_t          ETH_OFFSET = IP_OFFSET; \r
-       \r
-       pLsoData->LsoHeaderSize = 0;\r
-       IpOffset = IP_OFFSET; //(uint16_t)pPort->EncapsulationFormat.EncapsulationHeaderSize;\r
-       *IndexOfData = 0;\r
-\r
-       pMDL = NET_BUFFER_CURRENT_MDL(pNetBuffer);\r
-       NdisQueryMdl(pMDL, &pSrc, &CurrLength, NormalPagePriority);\r
-       //NdisQueryBufferSafe( CurrBuffer, &pSrc, &CurrLength, NormalPagePriority );\r
-       if (pSrc == NULL) {\r
-               IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error processing packets\n"));\r
-               return status;\r
-       }\r
-       // We start by looking for the ethernet and the IP\r
-       if (CurrLength < ETH_OFFSET) {\r
-               IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error porcessing packets\n"));\r
-               return status;\r
-       }\r
-       //pLsoData->LsoHeaderSize = pLsoData->LsoHeaderSize + ETH_OFFSET;\r
-       if (CurrLength == ETH_OFFSET) {        \r
-               ASSERT(FALSE);\r
-               IsRegularFlow = FALSE;        \r
-               memcpy(pCopiedData, pSrc, ETH_OFFSET);\r
-               pCopiedData += ETH_OFFSET;        \r
-               FullBuffers++;\r
-               // First buffer was only ethernet\r
-               pNetBuffer = NET_BUFFER_NEXT_NB(pNetBuffer);\r
-        NdisQueryMdl(NET_BUFFER_CURRENT_MDL(pNetBuffer), &pSrc, &CurrLength, NormalPagePriority);\r
-               if (pSrc == NULL) {\r
-                       IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing packets\n"));\r
-                       return status;\r
-           }\r
-       } else {\r
-               // This is ETH + IP together (at least)\r
-               pLsoData->LsoBuffers[0].pData = pSrc + (ETH_OFFSET - sizeof (ipoib_hdr_t));\r
-               memcpy (pLsoData->LsoBuffers[0].pData, ipoib_hdr, sizeof (ipoib_hdr_t));\r
-               CurrLength -= ETH_OFFSET;\r
-               pSrc = pSrc + ETH_OFFSET;\r
-               pLsoData->LsoHeaderSize = pLsoData->LsoHeaderSize + sizeof (ipoib_hdr_t);\r
-       }\r
-       // we should now be having at least the size of ethernet data\r
-       if (CurrLength < sizeof (ip_hdr_t)) {\r
-               IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing packets\n"));\r
-               return status;\r
-       }\r
-       IpHdr = (ip_hdr_t UNALIGNED*)pSrc;\r
-       IpHeaderLen = (uint16_t)IP_HEADER_LENGTH(IpHdr);\r
-       ASSERT(IpHdr->prot == IP_PROT_TCP);\r
-       if (CurrLength < IpHeaderLen) {\r
-               IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error processing packets\n"));\r
-               return status;\r
-       }\r
-       pLsoData->LsoHeaderSize = pLsoData->LsoHeaderSize + IpHeaderLen;\r
-       // We now start to find where the TCP header starts\r
-       if (CurrLength == IpHeaderLen) {\r
-               ASSERT(FALSE);\r
-               // two options : \r
-               // if(IsRegularFlow = FALSE) ==> ETH and IP seperated in two buffers\r
-               // if(IsRegularFlow = TRUE ) ==> ETH and IP in the same buffer \r
-               // TCP will start at next buffer\r
-               if(IsRegularFlow){\r
-                       memcpy(pCopiedData, pSrc-ETH_OFFSET ,ETH_OFFSET+IpHeaderLen);\r
-                       pCopiedData += (ETH_OFFSET + IpHeaderLen);\r
-               } else {\r
-                       memcpy(pCopiedData, pSrc,IpHeaderLen);\r
-                       pCopiedData += IpHeaderLen;\r
-               }\r
-\r
-               FullBuffers++;\r
-               IsRegularFlow = FALSE;\r
-               //NdisGetNextBuffer( CurrBuffer, &CurrBuffer);\r
-               //NdisQueryBufferSafe( CurrBuffer, &pSrc, &CurrLength, NormalPagePriority );\r
-               pNetBuffer = NET_BUFFER_NEXT_NB(pNetBuffer);\r
-               NdisQueryMdl(NET_BUFFER_CURRENT_MDL(pNetBuffer), &pSrc, &CurrLength, NormalPagePriority);\r
-               if (pSrc == NULL) {\r
-                       IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing packets\n"));\r
-                       return status;\r
-               }\r
-       } else {\r
-               // if(IsRegularFlow = TRUE ) ==> the ETH and IP and TCP in the same buffer       \r
-               // if(IsRegularFlow = FLASE ) ==> ETH in one buffer , IP+TCP together in the same buffer\r
-               if (IsRegularFlow) {            \r
-                       pLsoData->LsoBuffers[0].Len += IpHeaderLen;\r
-               } else {            \r
-                       memcpy(pCopiedData, pSrc, IpHeaderLen);\r
-                       pCopiedData += IpHeaderLen;\r
-               }\r
-\r
-               CurrLength -= IpHeaderLen;\r
-               pSrc = pSrc + IpHeaderLen;\r
-       }\r
-       if (CurrLength < sizeof (tcp_hdr_t)) {\r
-               IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing packets\n"));\r
-               return status;\r
-       }\r
-       // We have finaly found the TCP header\r
-       TcpHdr = (tcp_hdr_t UNALIGNED *)pSrc;\r
-       TcpHeaderLen = TCP_HEADER_LENGTH(TcpHdr);\r
-\r
-       //ASSERT(TcpHeaderLen == 20);\r
-       \r
-       if (CurrLength < TcpHeaderLen) {\r
-               //IPOIB_PRINT(TRACE_LEVEL_VERBOSE, ETH, ("Error porcessing packets\n"));\r
-               return status;\r
-       }\r
-       pLsoData->LsoHeaderSize =  pLsoData->LsoHeaderSize + TcpHeaderLen;\r
-       if(IsRegularFlow){\r
-               pLsoData->LsoBuffers[0].Len += TcpHeaderLen;\r
-       }\r
-       else{\r
-               memcpy(pCopiedData, pSrc, TcpHeaderLen);\r
-               pCopiedData += TcpHeaderLen;\r
-       }\r
-       if (CurrLength == TcpHeaderLen) {\r
-               FullBuffers++;\r
-               pLsoData->UsedBuffers = FullBuffers;\r
-               *IndexOfData = FullBuffers ;\r
-       } else {\r
-               pLsoData->UsedBuffers = FullBuffers + 1;\r
-               *IndexOfData = FullBuffers - 1;\r
-       }\r
-       pLsoData->FullBuffers = FullBuffers; \r
-       if (!IsRegularFlow){\r
-               pLsoData->LsoBuffers[0].pData = pLsoData->coppied_data;\r
-               pLsoData->LsoBuffers[0].Len = ETH_OFFSET + IpHeaderLen + TcpHeaderLen;\r
-               ASSERT(pLsoData->LsoBuffers[0].Len <= LSO_MAX_HEADER);\r
-       }\r
-       return NDIS_STATUS_SUCCESS;\r
-}\r
-\r
-static void __port_do_mcast_garbage(ipoib_port_t* const        p_port)\r
-{\r
-    const mac_addr_t DEFAULT_MCAST_GROUP = {0x01, 0x00, 0x5E, 0x00, 0x00, 0x01};\r
-       /* Do garbage collecting... */\r
-\r
-       cl_map_item_t   *p_item;\r
-       ipoib_endpt_t   *p_endpt;\r
-       cl_qlist_t              destroy_mc_list;\r
-       uint8_t                 cnt;\r
-       const static GC_MAX_LEAVE_NUM = 80;\r
-\r
-       cl_qlist_init( &destroy_mc_list );\r
-\r
-       cl_obj_lock( &p_port->obj );\r
-       /* Wait for all readers to finish */\r
-       while( p_port->endpt_rdr )\r
-       {\r
-               cl_obj_unlock( &p_port->obj );\r
-               cl_obj_lock( &p_port->obj );\r
-       }\r
-       cnt = 0;\r
-       p_item = cl_qmap_head( &p_port->endpt_mgr.mac_endpts );\r
-       while( (p_item != cl_qmap_end( &p_port->endpt_mgr.mac_endpts )) && (cnt < GC_MAX_LEAVE_NUM))\r
-       {\r
-               p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );\r
-               p_item = cl_qmap_next( p_item );\r
-\r
-               /* Check if the current endpoint is not a multicast listener */\r
-\r
-               if( p_endpt->h_mcast && \r
-                       (!p_endpt->is_mcast_listener) &&\r
-                       ( cl_memcmp( &p_endpt->mac, &DEFAULT_MCAST_GROUP, sizeof(mac_addr_t) ) &&\r
-                        (!p_endpt->is_in_use) ))\r
-               {\r
-                       cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,\r
-                               &p_endpt->mac_item );\r
-                       cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,\r
-                               &p_endpt->gid_item );\r
-\r
-                       if( p_endpt->dlid )\r
-                       {\r
-                               cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,\r
-                                       &p_endpt->lid_item );\r
-                               p_endpt->dlid = 0;\r
-                       }\r
-\r
-                       cl_qlist_insert_tail(\r
-                               &destroy_mc_list, &p_endpt->mac_item.pool_item.list_item );\r
-                       cnt++;\r
-               }\r
-               else\r
-                       p_endpt->is_in_use = FALSE;\r
-       }\r
-       cl_obj_unlock( &p_port->obj );\r
-\r
-       /* Destroy all multicast endpoints now that we have released the lock. */\r
-       while( cl_qlist_count( &destroy_mc_list ) )\r
-       {\r
-               p_endpt = PARENT_STRUCT( cl_qlist_remove_head( &destroy_mc_list ),\r
-                                                                ipoib_endpt_t, mac_item.pool_item.list_item );\r
-               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,\r
-                       ("mcast garbage collector: destroying endpoint %02x:%02x:%02x:%02x:%02x:%02x \n", \r
-                                p_endpt->mac.addr[0],\r
-                                p_endpt->mac.addr[1],\r
-                                p_endpt->mac.addr[2],\r
-                                p_endpt->mac.addr[3],\r
-                                p_endpt->mac.addr[4],\r
-                                p_endpt->mac.addr[5]) );\r
-               cl_obj_destroy( &p_endpt->obj );\r
-       }\r
-}\r
-\r
-static void __port_mcast_garbage_dpc(KDPC *p_gc_dpc,void *context,void *s_arg1, void *s_arg2)\r
-{\r
-       ipoib_port_t *p_port = context;\r
-\r
-       UNREFERENCED_PARAMETER(p_gc_dpc);\r
-       UNREFERENCED_PARAMETER(s_arg1);\r
-       UNREFERENCED_PARAMETER(s_arg2);\r
-\r
-       __port_do_mcast_garbage(p_port);\r
-}\r
-\r
-ipoib_endpt_t*\r
-ipoib_endpt_get_by_gid(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   ib_gid_t* const                         p_gid )\r
-{\r
-       return __endpt_mgr_get_by_gid( p_port, p_gid );\r
-}\r
-\r
-ipoib_endpt_t*\r
-ipoib_endpt_get_by_lid(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   net16_t                                         lid )\r
-{\r
-       return __endpt_mgr_get_by_lid( p_port, lid );\r
-}\r
-\r
-ib_api_status_t\r
-ipoib_recv_dhcp(\r
-       IN                              ipoib_port_t* const                     p_port,\r
-       IN              const   ipoib_pkt_t* const                      p_ipoib,\r
-               OUT                     eth_pkt_t* const                        p_eth,\r
-       IN                              ipoib_endpt_t* const            p_src,\r
-       IN                              ipoib_endpt_t* const            p_dst )\r
-{\r
-       return __recv_dhcp(\r
-               p_port, p_ipoib, p_eth, p_src,p_dst );\r
-}\r
-\r
-\r
-void\r
-ipoib_port_cancel_xmit(\r
-       IN                              ipoib_port_t* const             p_port,\r
-       IN                              PVOID                                    cancel_id )\r
-{\r
-       cl_list_item_t          *p_item;\r
-       PNET_BUFFER_LIST                p_nbl;\r
-       PVOID                   nbl_id;\r
-       cl_qlist_t              cancel_list;\r
-       ULONG                   send_complete_flags = 0;\r
-       IPOIB_ENTER( IPOIB_DBG_SEND );\r
-\r
-       cl_qlist_init( &cancel_list );\r
-\r
-       cl_spinlock_acquire( &p_port->send_lock );\r
-\r
-       for( p_item = cl_qlist_head( &p_port->send_mgr.pending_list );\r
-               p_item != cl_qlist_end( &p_port->send_mgr.pending_list );\r
-               p_item = cl_qlist_next( p_item ) )\r
-       {\r
-               p_nbl = IPOIB_PACKET_FROM_LIST_ITEM( p_item );\r
-               nbl_id = NDIS_GET_NET_BUFFER_LIST_CANCEL_ID( p_nbl );\r
-               if( nbl_id == cancel_id )\r
-               {\r
-                       cl_qlist_remove_item( &p_port->send_mgr.pending_list, p_item );\r
-                       NET_BUFFER_LIST_STATUS( p_nbl) = NDIS_STATUS_REQUEST_ABORTED ;\r
-                       cl_qlist_insert_tail( &cancel_list, IPOIB_LIST_ITEM_FROM_PACKET( p_nbl ) );\r
-               }\r
-       }\r
-       cl_spinlock_release( &p_port->send_lock );\r
-\r
-       if( cl_qlist_count( &cancel_list ) )\r
-       {\r
-               while( ( p_item = cl_qlist_remove_head( &cancel_list )) \r
-                                                               != cl_qlist_end( &cancel_list ))\r
-               {\r
-                       p_nbl = IPOIB_PACKET_FROM_LIST_ITEM( p_item );\r
-                       NET_BUFFER_LIST_STATUS( p_nbl) = NDIS_STATUS_SEND_ABORTED;\r
-                       send_complete_flags = 0;\r
-                       if (NDIS_CURRENT_IRQL() == DISPATCH_LEVEL)\r
-                       {\r
-                               NDIS_SET_SEND_COMPLETE_FLAG(send_complete_flags, NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL);\r
-                       }\r
-                       NdisMSendNetBufferListsComplete( p_port->p_adapter->h_adapter,\r
-                               p_nbl, send_complete_flags );\r
-               }\r
-       }\r
-       IPOIB_EXIT( IPOIB_DBG_SEND );\r
-}\r
-\r
-/* \r
-*  Put all fragments into separate WR and chain together.\r
-*  The last WR will be set to generate CQ Event.\r
-*  lookaside buffer is used for ipoib and ip headers attached to each WR.\r
-*  Buffer will be released on last WR send completion.\r
-*/\r
-#if 0\r
-static NDIS_STATUS\r
-__send_fragments(\r
-IN             ipoib_port_t* const                     p_port,\r
-IN             ipoib_send_desc_t* const        p_desc,\r
-IN             eth_hdr_t* const                        p_eth_hdr,\r
-IN             ip_hdr_t* const                         p_ip_hdr,\r
-IN             uint32_t                                        buf_len,\r
-IN             NDIS_BUFFER*                            p_ndis_buf )\r
-{\r
-       uint32_t        ds_idx = 1;\r
-       uint32_t        wr_idx = 0;\r
-       uint32_t        sgl_idx = 2; //skip eth hdr, ip hdr\r
-       uint32_t        options_len = 0;\r
-       uint8_t*        p_options = NULL;\r
-       uint8_t*        p_buf;\r
-       uint32_t        frag_offset = 0;\r
-       uint32_t        next_sge;\r
-       uint32_t        wr_size = 0;\r
-       uint32_t        ip_hdr_len = IP_HEADER_LENGTH( p_ip_hdr );\r
-       uint32_t        total_ip_len = cl_ntoh16( p_ip_hdr->length );\r
-\r
-       SCATTER_GATHER_LIST             *p_sgl;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_SEND );\r
-\r
-       if( IP_DONT_FRAGMENT(p_ip_hdr) )\r
-                       return NDIS_STATUS_INVALID_PACKET;\r
-       \r
-       p_sgl = NDIS_PER_PACKET_INFO_FROM_PACKET( p_desc->p_pkt, ScatterGatherListPacketInfo );\r
-       if( !p_sgl )\r
-       {\r
-               ASSERT( p_sgl );\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Failed to get SGL from packet.\n") );\r
-               return NDIS_STATUS_FAILURE;\r
-       }\r
-       if( ( p_sgl->NumberOfElements > MAX_SEND_SGE ||\r
-               p_sgl->Elements[0].Length < sizeof(eth_hdr_t)) )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Too many SG Elements in packet.\n") );\r
-               return NDIS_STATUS_FAILURE;\r
-       }\r
-       p_buf = (uint8_t *)\r
-               ExAllocateFromNPagedLookasideList( &p_port->buf_mgr.send_buf_list );\r
-       if( !p_buf )\r
-       {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                       ("Failed to allocate lookaside buffer.\n") );\r
-               return NDIS_STATUS_RESOURCES;\r
-       }\r
-       p_desc->p_buf = (send_buf_t*)p_buf;\r
-\r
-       if( buf_len < ip_hdr_len )\r
-       {       /* ip options in a separate buffer */\r
-               CL_ASSERT( buf_len == sizeof( ip_hdr_t ) );\r
-               NdisGetNextBuffer( p_ndis_buf, &p_ndis_buf );\r
-               if( !p_ndis_buf )\r
-               {\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Failed to get IP options buffer.\n") );\r
-                       return NDIS_STATUS_FAILURE;\r
-               }\r
-               NdisQueryBufferSafe( p_ndis_buf, &p_options, &options_len, NormalPagePriority );\r
-               if( !p_options )\r
-               {\r
-                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Failed to query IP options buffer address.\n") );\r
-                       return NDIS_STATUS_FAILURE;\r
-               }\r
-               cl_memcpy( p_buf, p_ip_hdr, sizeof( ip_hdr_t ) );\r
-               if( p_options && options_len )\r
-               { \r
-                       __copy_ip_options( &p_buf[sizeof(ip_hdr_t)], \r
-                                                               p_options, options_len, TRUE );\r
-               }\r
-               wr_size = buf_len + options_len;\r
-               sgl_idx++;\r
-       }\r
-       else\r
-       {       /*options probably in the same buffer */\r
-               cl_memcpy( p_buf, p_ip_hdr, buf_len );\r
-               options_len = ip_hdr_len - sizeof( ip_hdr_t );\r
-               if( options_len )\r
-               {\r
-                       p_options = p_buf + sizeof( ip_hdr_t );\r
-               }\r
-               frag_offset += ( buf_len - ip_hdr_len );\r
-               wr_size = buf_len;\r
-       }\r
-\r
-       p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf );\r
-       p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;\r
-       p_desc->send_wr[wr_idx].local_ds[ds_idx].length = wr_size;\r
-       \r
-       /* count how much data can be put into the first WR beside IP header.\r
-        * other protocols headers possibly supplied in subsequent buffers.\r
-        */\r
-       for( sgl_idx; sgl_idx < p_sgl->NumberOfElements; sgl_idx++ )\r
-       {\r
-               next_sge = p_sgl->Elements[sgl_idx].Length;\r
-\r
-               /* add sgl if it can fit into the same WR \r
-               * Note: so far not going to split large SGE between WRs,\r
-               * so first fragment could be a smaller size.\r
-               */\r
-               if( next_sge <= ( p_port->p_adapter->params.payload_mtu - wr_size ) )\r
-               {\r
-                       ++ds_idx;\r
-                       wr_size += next_sge;\r
-                       frag_offset += next_sge;\r
-                       p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = \r
-                                                                       p_sgl->Elements[sgl_idx].Address.QuadPart;\r
-                       p_desc->send_wr[wr_idx].local_ds[ds_idx].length = next_sge;\r
-                       p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;\r
-               }\r
-               else\r
-               {\r
-                       /* fix ip hdr for the first fragment and move on */\r
-                       __update_fragment_ip_hdr( (ip_hdr_t* const)p_buf,\r
-                               (uint16_t)wr_size, IP_FRAGMENT_OFFSET(p_ip_hdr), TRUE );\r
-\r
-                       p_desc->send_wr[wr_idx].wr.num_ds = ds_idx + 1;\r
-                       p_buf += ip_hdr_len;\r
-                       p_buf += (( buf_len > ip_hdr_len ) ? ( buf_len - ip_hdr_len ): 0);\r
-                       frag_offset += ( (IP_FRAGMENT_OFFSET(p_ip_hdr)) << 3 );\r
-                       ++wr_idx;\r
-                       ds_idx = 0;\r
-                       break;\r
-               }\r
-       }\r
-       total_ip_len -= wr_size;\r
-       wr_size = 0;\r
-\r
-       for( sgl_idx, wr_idx; sgl_idx < p_sgl->NumberOfElements; sgl_idx++ )\r
-       {\r
-               uint32_t        seg_len;\r
-               uint64_t        next_sgl_addr;\r
-               \r
-               if( wr_idx >= ( MAX_WRS_PER_MSG - 1 ) )\r
-                       return NDIS_STATUS_RESOURCES;\r
-               \r
-               next_sge = p_sgl->Elements[sgl_idx].Length;\r
-               next_sgl_addr = p_sgl->Elements[sgl_idx].Address.QuadPart;\r
-\r
-               while( next_sge )\r
-               {\r
-                       if( ds_idx == 0 )\r
-                       {       /* new ipoib + ip header */\r
-                               ((ipoib_hdr_t*)p_buf)->type = p_eth_hdr->type;\r
-                               ((ipoib_hdr_t*)p_buf)->resv = 0;\r
-                               p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf );\r
-                               p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;\r
-                               p_desc->send_wr[wr_idx].local_ds[ds_idx].length = sizeof( ipoib_hdr_t );\r
-                               p_buf += sizeof( ipoib_hdr_t );\r
-                               ++ds_idx;\r
-\r
-                               cl_memcpy( p_buf, p_ip_hdr, sizeof( ip_hdr_t ) );\r
-                               if( p_options && options_len )\r
-                               {\r
-                                       /* copy ip options if needed */\r
-                                       __copy_ip_options( &p_buf[sizeof(ip_hdr_t)], \r
-                                                               p_options, options_len, FALSE );\r
-                               }\r
-                               wr_size = ip_hdr_len;\r
-                       }\r
-                       if( ds_idx == 1 )\r
-                       {\r
-                               p_desc->send_wr[wr_idx].local_ds[ds_idx].length = ip_hdr_len;\r
-                               p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf );\r
-                               p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;\r
-                               ++ds_idx;\r
-                       }\r
-\r
-                       seg_len = ( next_sge > ( p_port->p_adapter->params.payload_mtu - wr_size ) )?\r
-                               ( p_port->p_adapter->params.payload_mtu - wr_size ) : next_sge;\r
-\r
-                       p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = next_sgl_addr;\r
-                       p_desc->send_wr[wr_idx].local_ds[ds_idx].length = seg_len;\r
-                       p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;\r
-                       ++ds_idx;\r
-                       \r
-                       wr_size += seg_len;\r
-                       total_ip_len -= seg_len;\r
-\r
-                       if( wr_size >= p_port->p_adapter->params.payload_mtu || total_ip_len == 0 )\r
-                       {       /* fix ip hdr for that fragment */\r
-                               __update_fragment_ip_hdr( (ip_hdr_t* const)p_buf, (uint16_t)wr_size,\r
-                                       ((uint16_t)(frag_offset >> 3 )), \r
-                                       (BOOLEAN)(( total_ip_len > 0 ) || IP_MORE_FRAGMENTS( p_ip_hdr)) );\r
-                               p_desc->send_wr[wr_idx].wr.num_ds = ds_idx;\r
-                               if( total_ip_len > 0 )\r
-                               {\r
-                                       ++wr_idx;\r
-                                       frag_offset += (wr_size - ip_hdr_len);\r
-                                       wr_size = 0;\r
-                                       ds_idx = 0;\r
-                                       p_buf += ip_hdr_len;\r
-                               }\r
-                       }\r
-                       next_sge -= seg_len;\r
-                       if( next_sge > 0 )\r
-                       {\r
-                               next_sgl_addr += seg_len;\r
-                       }\r
-               }\r
-       }\r
-       p_desc->num_wrs += wr_idx;\r
-       \r
-       IPOIB_EXIT( IPOIB_DBG_SEND );\r
-       return NDIS_STATUS_SUCCESS;\r
-}\r
-#endif\r
-\r
-static void\r
-__update_fragment_ip_hdr(\r
-IN             ip_hdr_t* const         p_ip_hdr,\r
-IN             uint16_t                        fragment_size, \r
-IN             uint16_t                        fragment_offset, \r
-IN             BOOLEAN                         more_fragments )\r
-{\r
-       uint16_t*       p_hdr = (uint16_t*)p_ip_hdr;\r
-       p_ip_hdr->length = cl_hton16( fragment_size ); // bytes\r
-       p_ip_hdr->offset = cl_hton16( fragment_offset ); // 8-byte units\r
-       if( more_fragments )\r
-       {\r
-               IP_SET_MORE_FRAGMENTS( p_ip_hdr );\r
-       }\r
-       else\r
-       {\r
-               IP_SET_LAST_FRAGMENT( p_ip_hdr );\r
-       }\r
-       p_ip_hdr->chksum = 0;\r
-       p_ip_hdr->chksum = ipchksum( p_hdr, IP_HEADER_LENGTH(p_ip_hdr) );\r
-}\r
-\r
-static void\r
-__copy_ip_options(\r
-IN             uint8_t*        p_buf,\r
-IN             uint8_t*        p_options,\r
-IN             uint32_t        options_len,\r
-IN             BOOLEAN         copy_all )\r
-{\r
-       uint32_t        option_length;\r
-       uint32_t        total_length = 0;\r
-       uint32_t        copied_length = 0;\r
-       uint8_t*        p_src = p_options;\r
-       uint8_t*        p_dst = p_buf;\r
-\r
-       if( p_options == NULL || options_len == 0 )\r
-               return;\r
-       if( copy_all )\r
-       {\r
-               cl_memcpy( p_dst, p_src, options_len );\r
-               return;\r
-       }\r
-       do\r
-       {\r
-               if( ( *p_src ) == 0 ) // end of options list\r
-               {\r
-                       total_length++;\r
-                       break;\r
-               }\r
-               if( ( *p_src ) == 0x1 ) // no op\r
-               {\r
-                       p_src++;\r
-                       total_length++;\r
-                       continue;\r
-               }\r
-               /*from RFC791: \r
-               * This option may be used between options, for example, to align\r
-        * the beginning of a subsequent option on a 32 bit boundary.\r
-               */\r
-               if( copied_length && (copied_length % 4) )\r
-               {\r
-                       uint32_t align = 4 - (copied_length % 4);\r
-                       cl_memset( p_dst, 0x1, (size_t)align );\r
-                       p_dst += align;\r
-                       copied_length += align;\r
-               }\r
-               option_length = *(p_src + 1);\r
-\r
-               if( *p_src & 0x80 )\r
-               {\r
-                       cl_memcpy( p_dst, p_src, option_length );\r
-                       p_dst += option_length;\r
-                       copied_length += option_length;\r
-               }\r
-               total_length += option_length;\r
-               p_src += option_length;\r
-\r
-       }while( total_length < options_len );\r
-\r
-       CL_ASSERT( total_length == options_len );\r
-       CL_ASSERT( copied_length <= 40 );\r
-\r
-       /* padding the rest */\r
-       if( options_len > copied_length )\r
-       {\r
-               cl_memclr( p_dst, ( options_len - copied_length ) );\r
-       }\r
-       return;\r
-}\r
diff --git a/branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp b/branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp
new file mode 100644 (file)
index 0000000..f6d7a25
--- /dev/null
@@ -0,0 +1,8119 @@
+/*\r
+ * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
+ * Copyright (c) 2006 Mellanox Technologies.  All rights reserved.\r
+ * Portions Copyright (c) 2008 Microsoft Corporation.  All rights reserved.\r
+ *\r
+ * This software is available to you under the OpenIB.org BSD license\r
+ * below:\r
+ *\r
+ *     Redistribution and use in source and binary forms, with or\r
+ *     without modification, are permitted provided that the following\r
+ *     conditions are met:\r
+ *\r
+ *      - Redistributions of source code must retain the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer.\r
+ *\r
+ *      - Redistributions in binary form must reproduce the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer in the documentation and/or other materials\r
+ *        provided with the distribution.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
+ * SOFTWARE.\r
+ *\r
+ * $Id: ipoib_port.c 4506 2009-06-23 14:40:54Z xalex $\r
+ */\r
+\r
+\r
+\r
+#include "ipoib_endpoint.h"\r
+#include "ipoib_port.h"\r
+#include "ipoib_adapter.h"\r
+#include "ipoib_debug.h"\r
+#if defined(EVENT_TRACING)\r
+#ifdef offsetof\r
+#undef offsetof\r
+#endif\r
+#include "ipoib_port.tmh"\r
+#endif\r
+#include <offload.h>\r
+\r
+#include "wdm.h"\r
+#include <ntddk.h>\r
+\r
+\r
+\r
+ib_gid_t       bcast_mgid_template = {\r
+       0xff,                                                           /* multicast field */\r
+       0x12,                                                           /* scope (to be filled in) */\r
+       0x40, 0x1b,                                                     /* IPv4 signature */\r
+       0xff, 0xff,                                                     /* 16 bits of P_Key (to be filled in) */\r
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00,     /* 48 bits of zeros */\r
+       0xff, 0xff, 0xff, 0xff,                         /* 32 bit IPv4 broadcast address */\r
+};\r
+\r
+\r
+#ifdef _DEBUG_\r
+/* Handy pointer for debug use. */\r
+ipoib_port_t   *gp_ipoib_port;\r
+#endif\r
+\r
+static void __port_mcast_garbage_dpc(KDPC *p_gc_dpc,void *context,void *s_arg1, void *s_arg2);\r
+static void __port_do_mcast_garbage(ipoib_port_t* const        p_port );\r
+\r
+\r
+static void __recv_cb_dpc(KDPC *p_gc_dpc,void *context,void *s_arg1, void *s_arg2);\r
+\r
+\r
+/******************************************************************************\r
+*\r
+* Declarations\r
+*\r
+******************************************************************************/\r
+static void\r
+__port_construct(\r
+       IN                              ipoib_port_t* const                     p_port );\r
+\r
+static ib_api_status_t\r
+__port_init(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ipoib_adapter_t* const          p_adapter,\r
+       IN                              ib_pnp_port_rec_t* const        p_pnp_rec );\r
+\r
+static void\r
+__port_destroying(\r
+       IN                              cl_obj_t* const                         p_obj );\r
+\r
+static void\r
+__port_cleanup(\r
+       IN                              cl_obj_t* const                         p_obj );\r
+\r
+static void\r
+__port_free(\r
+       IN                              cl_obj_t* const                         p_obj );\r
+\r
+static ib_api_status_t\r
+__port_query_ca_attrs( \r
+       IN              ipoib_port_t* const                                     p_port,\r
+       IN              ib_ca_attr_t**                                          pp_ca_attrs );\r
+\r
+static void\r
+__srq_async_event_cb(\r
+IN                     ib_async_event_rec_t            *p_event_rec );\r
+\r
+/******************************************************************************\r
+*\r
+* IB resource manager operations\r
+*\r
+******************************************************************************/\r
+static void\r
+__ib_mgr_construct(\r
+       IN                              ipoib_port_t* const                     p_port );\r
+\r
+static ib_api_status_t\r
+__ib_mgr_init(\r
+       IN                              ipoib_port_t* const                     p_port );\r
+\r
+static void\r
+__ib_mgr_destroy(\r
+       IN                              ipoib_port_t* const                     p_port );\r
+\r
+static void\r
+__qp_event(\r
+       IN                              ib_async_event_rec_t            *p_event_rec );\r
+\r
+static void\r
+__cq_event(\r
+       IN                              ib_async_event_rec_t            *p_event_rec );\r
+\r
+static ib_api_status_t\r
+__ib_mgr_activate(\r
+       IN                              ipoib_port_t* const                     p_port );\r
+\r
+/******************************************************************************\r
+*\r
+* Buffer manager operations.\r
+*\r
+******************************************************************************/\r
+static void\r
+__buf_mgr_construct(\r
+       IN                              ipoib_port_t* const                     p_port );\r
+\r
+static ib_api_status_t\r
+__buf_mgr_init(\r
+       IN                              ipoib_port_t* const                     p_port );\r
+\r
+static void\r
+__buf_mgr_destroy(\r
+       IN                              ipoib_port_t* const                     p_port );\r
+\r
+static cl_status_t\r
+__recv_ctor(\r
+       IN                              void* const                                     p_object,\r
+       IN                              void*                                           context,\r
+               OUT                     cl_pool_item_t** const          pp_pool_item );\r
+\r
+#if !IPOIB_INLINE_RECV\r
+static void\r
+__recv_dtor(\r
+       IN              const   cl_pool_item_t* const           p_pool_item,\r
+       IN                              void                                            *context );\r
+#endif /* IPOIB_INLINE_RECV */\r
+\r
+static inline ipoib_send_desc_t*\r
+__buf_mgr_get_send(\r
+       IN                              ipoib_port_t* const                     p_port );\r
+\r
+static inline void\r
+__buf_mgr_put_send(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ipoib_send_desc_t* const        p_desc );\r
+\r
+static inline ipoib_recv_desc_t*\r
+__buf_mgr_get_recv(\r
+       IN                              ipoib_port_t* const                     p_port );\r
+\r
+static inline void\r
+__buf_mgr_put_recv(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ipoib_recv_desc_t* const        p_desc,\r
+       IN                              NET_BUFFER_LIST* const          p_net_buffer_list OPTIONAL );\r
+\r
+static inline void\r
+__buf_mgr_put_recv_list(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              cl_qlist_t* const                       p_list );\r
+\r
+//NDIS60\r
+static inline NET_BUFFER_LIST*\r
+__buf_mgr_get_ndis_pkt(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ipoib_recv_desc_t* const        p_desc );\r
+\r
+\r
+/******************************************************************************\r
+*\r
+* Receive manager operations.\r
+*\r
+******************************************************************************/\r
+static void\r
+__recv_mgr_construct(\r
+       IN                              ipoib_port_t* const                     p_port );\r
+\r
+static ib_api_status_t\r
+__recv_mgr_init(\r
+       IN                              ipoib_port_t* const                     p_port );\r
+\r
+static void\r
+__recv_mgr_destroy(\r
+       IN                              ipoib_port_t* const                     p_port );\r
+\r
+/* Posts receive buffers to the receive queue. */\r
+int32_t\r
+__recv_mgr_repost(\r
+       IN                              ipoib_port_t* const                     p_port );\r
+\r
+static void\r
+__recv_cb(\r
+       IN              const   ib_cq_handle_t                          h_cq,\r
+       IN                              void                                            *cq_context );\r
+\r
+static void\r
+__recv_get_endpts(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ipoib_recv_desc_t* const        p_desc,\r
+       IN                              ib_wc_t* const                          p_wc,\r
+               OUT                     ipoib_endpt_t** const           pp_src,\r
+               OUT                     ipoib_endpt_t** const           pp_dst );\r
+\r
+static int32_t\r
+__recv_mgr_filter(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ib_wc_t* const                          p_done_wc_list,\r
+               OUT                     cl_qlist_t* const                       p_done_list,\r
+               OUT                     cl_qlist_t* const                       p_bad_list );\r
+\r
+static ib_api_status_t\r
+__recv_gen(\r
+       IN              const   ipoib_pkt_t* const                      p_ipoib,\r
+               OUT                     eth_pkt_t* const                        p_eth,\r
+       IN                              ipoib_endpt_t* const            p_src,\r
+       IN                              ipoib_endpt_t* const            p_dst );\r
+\r
+static ib_api_status_t\r
+__recv_dhcp(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   ipoib_pkt_t* const                      p_ipoib,\r
+               OUT                     eth_pkt_t* const                        p_eth,\r
+       IN                              ipoib_endpt_t* const            p_src,\r
+       IN                              ipoib_endpt_t* const            p_dst );\r
+\r
+static ib_api_status_t\r
+__recv_arp(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ib_wc_t* const                          p_wc,\r
+       IN              const   ipoib_pkt_t* const                      p_ipoib,\r
+               OUT                     eth_pkt_t* const                        p_eth,\r
+       IN                              ipoib_endpt_t** const           p_src,\r
+       IN                              ipoib_endpt_t* const            p_dst );\r
+\r
+static ib_api_status_t\r
+__recv_mgr_prepare_pkt(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ipoib_recv_desc_t* const        p_desc,\r
+               OUT                     NET_BUFFER_LIST** const         pp_net_buffer_list );\r
+\r
+static uint32_t\r
+__recv_mgr_build_pkt_array(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              int32_t                                         shortage,\r
+               OUT                     cl_qlist_t* const                       p_done_list,\r
+               OUT                     int32_t* const                          p_discarded );\r
+\r
+/******************************************************************************\r
+*\r
+* Send manager operations.\r
+*\r
+******************************************************************************/\r
+static void\r
+__send_mgr_construct(\r
+       IN                              ipoib_port_t* const                     p_port );\r
+\r
+static void\r
+__send_mgr_destroy(\r
+       IN                              ipoib_port_t* const                     p_port );\r
+\r
+static NDIS_STATUS\r
+__send_gen(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ipoib_send_desc_t* const        p_desc,\r
+       IN                              SCATTER_GATHER_LIST                     *p_sgl,\r
+       IN                              INT                                             lso_data_index);\r
+\r
+static NDIS_STATUS\r
+__send_mgr_filter_ip(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   eth_hdr_t* const                        p_eth_hdr,\r
+       IN                              MDL*                                            p_mdl,\r
+       IN                              size_t                                          buf_len,\r
+       IN                              SCATTER_GATHER_LIST                     *p_sgl,\r
+       IN      OUT                     ipoib_send_desc_t* const        p_desc );\r
+\r
+static NDIS_STATUS\r
+__send_mgr_filter_igmp_v2(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+    IN         const   ip_hdr_t* const                         p_ip_hdr,\r
+       IN                              size_t                                          iph_options_size,\r
+       IN                              MDL*                                            p_mdl,\r
+       IN                              size_t                                          buf_len );\r
+\r
+static NDIS_STATUS\r
+__send_mgr_filter_udp(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   ip_hdr_t* const                         p_ip_hdr,\r
+       IN                              MDL*                                            p_mdl,\r
+       IN                              size_t                                          buf_len,\r
+       IN                              SCATTER_GATHER_LIST                     *p_sgl,\r
+       IN      OUT                     ipoib_send_desc_t* const        p_desc );\r
+\r
+static NDIS_STATUS\r
+__send_mgr_filter_dhcp(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   udp_hdr_t* const                        p_udp_hdr,\r
+       IN                              MDL*                                            p_mdl,\r
+       IN                              size_t                                          buf_len,\r
+       IN      OUT                     ipoib_send_desc_t* const        p_desc );\r
+\r
+static NDIS_STATUS\r
+__send_mgr_filter_arp(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   eth_hdr_t* const                        p_eth_hdr,\r
+       IN                              MDL*                                            p_mdl,\r
+       IN                              size_t                                          buf_len,\r
+       IN      OUT                     ipoib_send_desc_t* const        p_desc );\r
+\r
+static void\r
+__process_failed_send(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ipoib_send_desc_t* const        p_desc,\r
+       IN              const   NDIS_STATUS                                     status,\r
+       IN              ULONG                                           send_complete_flags );\r
+\r
+static inline NDIS_STATUS\r
+__send_mgr_queue(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              eth_hdr_t* const                        p_eth_hdr,\r
+               OUT                     ipoib_endpt_t** const           pp_endpt );\r
+\r
+static NDIS_STATUS\r
+__build_send_desc(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              eth_hdr_t* const                        p_eth_hdr,\r
+       IN                              MDL* const                                      p_mdl,\r
+       IN              const   size_t                                          mdl_len,\r
+       IN                              SCATTER_GATHER_LIST                     *p_sgl,\r
+       IN      OUT                     ipoib_send_desc_t* const        p_desc );\r
+\r
+\r
+static void\r
+__send_cb(\r
+       IN              const   ib_cq_handle_t                          h_cq,\r
+       IN                              void                                            *cq_context );\r
+\r
+static NDIS_STATUS \r
+GetLsoHeaderSize(\r
+       IN              PNET_BUFFER             pNetBuffer,\r
+       IN              LsoData                 *pLsoData,\r
+       OUT     UINT                    *IndexOfData,\r
+       IN              ipoib_hdr_t *ipoib_hdr );\r
+\r
+\r
+static NDIS_STATUS\r
+__build_lso_desc(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN      OUT                     ipoib_send_desc_t* const        p_desc,\r
+       IN                              ULONG                                           mss,\r
+       IN                              SCATTER_GATHER_LIST                     *p_sgl,\r
+       IN                              int32_t                                         hdr_idx,\r
+       IN PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO p_lso_info );\r
+\r
+static NDIS_STATUS\r
+__send_fragments(\r
+       IN              ipoib_port_t* const                                     p_port,\r
+       IN              ipoib_send_desc_t* const                        p_desc,\r
+       IN              eth_hdr_t* const                                        p_eth_hdr,\r
+       IN              ip_hdr_t* const                                         p_ip_hdr,\r
+       IN              uint32_t                                                        buf_len,\r
+       IN              NDIS_BUFFER*                                            p_ndis_buf );\r
+\r
+//TODO CM Restore\r
+#if 0\r
+static void\r
+__update_fragment_ip_hdr(\r
+IN             ip_hdr_t* const         p_ip_hdr,\r
+IN             uint16_t                        fragment_size, \r
+IN             uint16_t                        fragment_offset, \r
+IN             BOOLEAN                         more_fragments );\r
+\r
+static void\r
+__copy_ip_options(\r
+IN             uint8_t*                        p_buf,\r
+IN             uint8_t*                        p_options,\r
+IN             uint32_t                        options_len,\r
+IN             BOOLEAN                         copy_all );\r
+#endif\r
+/******************************************************************************\r
+*\r
+* Endpoint manager operations\r
+*\r
+******************************************************************************/\r
+static void\r
+__endpt_mgr_construct(\r
+       IN                              ipoib_port_t* const                     p_port );\r
+\r
+static ib_api_status_t\r
+__endpt_mgr_init(\r
+       IN                              ipoib_port_t* const                     p_port );\r
+\r
+static void\r
+__endpt_mgr_destroy(\r
+       IN                              ipoib_port_t* const                     p_port );\r
+\r
+/****f* IPoIB/__endpt_mgr_remove_all\r
+* NAME\r
+*      __endpt_mgr_remove_all\r
+*\r
+* DESCRIPTION\r
+*      Removes all enpoints from the port, dereferencing them to initiate\r
+*      destruction.\r
+*\r
+* SYNOPSIS\r
+*/\r
+static void\r
+__endpt_mgr_remove_all(\r
+       IN                              ipoib_port_t* const                     p_port );\r
+/*\r
+********/\r
+\r
+static void\r
+__endpt_mgr_remove(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ipoib_endpt_t* const            p_endpt );\r
+\r
+static void\r
+__endpt_mgr_reset_all(\r
+       IN                              ipoib_port_t* const                     p_port );\r
+\r
+static inline NDIS_STATUS\r
+__endpt_mgr_ref(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   mac_addr_t                                      mac,\r
+               OUT                     ipoib_endpt_t** const           pp_endpt );\r
+\r
+static inline NDIS_STATUS\r
+__endpt_mgr_get_gid_qpn(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   mac_addr_t                                      mac,\r
+               OUT                     ib_gid_t* const                         p_gid,\r
+               OUT                     UNALIGNED net32_t* const        p_qpn );\r
+\r
+static inline ipoib_endpt_t*\r
+__endpt_mgr_get_by_gid(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   ib_gid_t* const                         p_gid );\r
+\r
+static inline ipoib_endpt_t*\r
+__endpt_mgr_get_by_lid(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   net16_t                                         lid );\r
+\r
+static inline ib_api_status_t\r
+__endpt_mgr_insert_locked(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   mac_addr_t                                      mac,\r
+       IN                              ipoib_endpt_t* const            p_endpt );\r
+\r
+static inline ib_api_status_t\r
+__endpt_mgr_insert(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   mac_addr_t                                      mac,\r
+       IN                              ipoib_endpt_t* const            p_endpt );\r
+\r
+static ib_api_status_t\r
+__endpt_mgr_add_local(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ib_port_info_t* const           p_port_info );\r
+\r
+static ib_api_status_t\r
+__endpt_mgr_add_bcast(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ib_mcast_rec_t                          *p_mcast_rec );\r
+\r
+/******************************************************************************\r
+*\r
+* MCast operations.\r
+*\r
+******************************************************************************/\r
+static ib_api_status_t\r
+__port_get_bcast(\r
+       IN                              ipoib_port_t* const                     p_port );\r
+\r
+static ib_api_status_t\r
+__port_join_bcast(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ib_member_rec_t* const          p_member_rec );\r
+\r
+static ib_api_status_t\r
+__port_create_bcast(\r
+       IN                              ipoib_port_t* const                     p_port );\r
+\r
+\r
+\r
+static void\r
+__bcast_get_cb(\r
+       IN                              ib_query_rec_t                          *p_query_rec );\r
+\r
+\r
+static void\r
+__bcast_cb(\r
+       IN                              ib_mcast_rec_t                          *p_mcast_rec );\r
+\r
+\r
+static void\r
+__mcast_cb(\r
+       IN                              ib_mcast_rec_t                          *p_mcast_rec );\r
+\r
+void\r
+__leave_error_mcast_cb(\r
+       IN                              void                            *context );\r
+\r
+\r
+static intn_t\r
+__gid_cmp(\r
+       IN              const   void* const                                     p_key1,\r
+       IN              const   void* const                                     p_key2 )\r
+{\r
+       return cl_memcmp( p_key1, p_key2, sizeof(ib_gid_t) );\r
+}\r
+\r
+\r
+inline void ipoib_port_ref( ipoib_port_t * p_port, int type )\r
+{\r
+       cl_obj_ref( &p_port->obj );\r
+#if DBG\r
+       cl_atomic_inc( &p_port->ref[type % ref_mask] );\r
+       if ((p_port->obj.ref_cnt % 20)==0)\r
+       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,\r
+               ("ref type %d ref_cnt %d\n", type, p_port->obj.ref_cnt) );\r
+       //TODO remove\r
+       //ASSERT (p_port->obj.ref_cnt < 100);\r
+#else\r
+       UNREFERENCED_PARAMETER(type);\r
+#endif\r
+}\r
+\r
+\r
+inline void ipoib_port_deref(ipoib_port_t * p_port, int type)\r
+{\r
+#if DBG\r
+       cl_atomic_dec( &p_port->ref[type % ref_mask] );\r
+       if ((p_port->obj.ref_cnt % 20) == 0)\r
+       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,\r
+               ("deref type %d ref_cnt %d\n", type, p_port->obj.ref_cnt) );\r
+#else\r
+       UNREFERENCED_PARAMETER(type);\r
+#endif\r
+       cl_obj_deref( &p_port->obj );\r
+\r
+}\r
+\r
+/* function returns pointer to payload that is going after IP header.\r
+*  asssuming that payload and IP header are in the same buffer\r
+*/\r
+static void* GetIpPayloadPtr(const     ip_hdr_t* const p_ip_hdr)\r
+{\r
+       return (void*)((uint8_t*)p_ip_hdr + IP_HEADER_LENGTH(p_ip_hdr));\r
+}\r
+\r
+/******************************************************************************\r
+*\r
+* Implementation\r
+*\r
+******************************************************************************/\r
+ib_api_status_t\r
+ipoib_create_port(\r
+       IN                              ipoib_adapter_t* const          p_adapter,\r
+       IN                              ib_pnp_port_rec_t* const        p_pnp_rec,\r
+               OUT                     ipoib_port_t** const            pp_port )\r
+{\r
+       ib_api_status_t         status;\r
+       ipoib_port_t            *p_port;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       CL_ASSERT( !p_adapter->p_port );\r
+\r
+       p_port = (ipoib_port_t *) cl_zalloc( sizeof(ipoib_port_t) +\r
+               (sizeof(ipoib_hdr_t) * (p_adapter->params.sq_depth - 1)) );\r
+       if( !p_port )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Failed to allocate ipoib_port_t (%d bytes)\n",\r
+                       sizeof(ipoib_port_t)) );\r
+               return IB_INSUFFICIENT_MEMORY;\r
+       }\r
+\r
+#ifdef _DEBUG_\r
+       gp_ipoib_port = p_port;\r
+#endif\r
+\r
+       __port_construct( p_port );\r
+\r
+       status = __port_init( p_port, p_adapter, p_pnp_rec );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ipoib_port_init returned %s.\n", \r
+                       p_adapter->p_ifc->get_err_str( status )) );\r
+               __port_cleanup( &p_port->obj );\r
+               __port_free( &p_port->obj );\r
+               return status;\r
+       }\r
+\r
+       *pp_port = p_port;\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+       return IB_SUCCESS;\r
+}\r
+\r
+\r
+void\r
+ipoib_port_destroy(\r
+       IN                              ipoib_port_t* const                     p_port )\r
+{\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       CL_ASSERT( p_port );\r
+       CL_ASSERT( p_port->p_adapter );\r
+       CL_ASSERT( !p_port->p_adapter->p_port );\r
+\r
+       cl_obj_destroy( &p_port->obj );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+}\r
+\r
+\r
+static void\r
+__port_construct(\r
+       IN                              ipoib_port_t* const                     p_port )\r
+{\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       p_port->state = IB_QPS_RESET;\r
+\r
+       cl_obj_construct( &p_port->obj, IPOIB_OBJ_PORT );\r
+       cl_spinlock_construct( &p_port->send_lock );\r
+       cl_spinlock_construct( &p_port->recv_lock );\r
+       __ib_mgr_construct( p_port );\r
+       __buf_mgr_construct( p_port );\r
+\r
+       __recv_mgr_construct( p_port );\r
+       __send_mgr_construct( p_port );\r
+\r
+       __endpt_mgr_construct( p_port );\r
+\r
+       KeInitializeEvent( &p_port->sa_event, NotificationEvent, TRUE );\r
+       KeInitializeEvent( &p_port->leave_mcast_event, NotificationEvent, TRUE );\r
+       \r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+}\r
+\r
+\r
+static ib_api_status_t\r
+__port_init(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ipoib_adapter_t* const          p_adapter,\r
+       IN                              ib_pnp_port_rec_t* const        p_pnp_rec )\r
+{\r
+       cl_status_t                     cl_status;\r
+       ib_api_status_t         status;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       p_port->port_num = p_pnp_rec->p_port_attr->port_num;\r
+       p_port->p_adapter = p_adapter;\r
+\r
+       cl_status = cl_spinlock_init( &p_port->send_lock );\r
+       if( cl_status != CL_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("cl_spinlock_init returned %#x\n", cl_status) );\r
+               return IB_ERROR;\r
+       }\r
+\r
+       cl_status = cl_spinlock_init( &p_port->recv_lock );\r
+       if( cl_status != CL_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("cl_spinlock_init returned %#x\n", cl_status) );\r
+               return IB_ERROR;\r
+       }\r
+\r
+       /* Initialize the IB resource manager. */\r
+       status = __ib_mgr_init( p_port );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("__ib_mgr_init returned %s\n", \r
+                       p_adapter->p_ifc->get_err_str( status )) );\r
+               return status;\r
+       }\r
+\r
+       /* Initialize the buffer manager. */\r
+       status = __buf_mgr_init( p_port );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("__buf_mgr_init returned %s\n", \r
+                       p_adapter->p_ifc->get_err_str( status )) );\r
+               return status;\r
+       }\r
+\r
+       /* Initialize the receive manager. */\r
+       status = __recv_mgr_init( p_port );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("__recv_mgr_init returned %s\n", \r
+                       p_adapter->p_ifc->get_err_str( status )) );\r
+               return status;\r
+       }\r
+\r
+       /* Initialize the endpoint manager. */\r
+       status = __endpt_mgr_init( p_port );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("__endpt_mgr_init returned %s\n", \r
+                       p_adapter->p_ifc->get_err_str( status )) );\r
+               return status;\r
+       }\r
+\r
+        KeInitializeDpc(&p_port->recv_dpc,(PKDEFERRED_ROUTINE)__recv_cb_dpc,p_port);\r
+\r
+\r
+        /* Initialize multicast garbage collector timer and DPC object */\r
+        KeInitializeDpc(&p_port->gc_dpc,(PKDEFERRED_ROUTINE)__port_mcast_garbage_dpc,p_port);\r
+        KeInitializeTimerEx(&p_port->gc_timer,SynchronizationTimer);\r
+\r
+       /* We only ever destroy from the PnP callback thread. */\r
+       cl_status = cl_obj_init( &p_port->obj, CL_DESTROY_SYNC,\r
+               __port_destroying, __port_cleanup, __port_free );\r
+\r
+#if DBG\r
+       cl_atomic_inc( &p_port->ref[ref_init] );\r
+       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,\r
+               ("ref type %d ref_cnt %d\n", ref_init, p_port->obj.ref_cnt) );\r
+#endif\r
+\r
+       if( cl_status != CL_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("cl_obj_init returned %#x\n", cl_status) );\r
+               return IB_ERROR;\r
+       }\r
+\r
+       cl_status = cl_obj_insert_rel( &p_port->rel, &p_adapter->obj, &p_port->obj );\r
+       if( cl_status != CL_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("cl_obj_insert_rel returned %#x\n", cl_status) );\r
+               cl_obj_destroy( &p_port->obj );\r
+               return IB_ERROR;\r
+       }\r
+\r
+#if DBG\r
+       cl_atomic_inc( &p_port->ref[ref_init] );\r
+       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_OBJ,\r
+               ("ref type %d ref_cnt %d\n", ref_init, p_port->obj.ref_cnt) );\r
+#endif\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+       return IB_SUCCESS;\r
+}\r
+\r
+\r
+static void\r
+__port_destroying(\r
+       IN                              cl_obj_t* const                         p_obj )\r
+{\r
+       ipoib_port_t    *p_port;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       CL_ASSERT( p_obj );\r
+\r
+       p_port = PARENT_STRUCT( p_obj, ipoib_port_t, obj );\r
+\r
+       ipoib_port_down( p_port );\r
+\r
+       __endpt_mgr_remove_all( p_port );\r
+\r
+#if 0\r
+       if( p_port->p_adapter->params.cm_enabled )\r
+       {\r
+               endpt_cm_buf_mgr_destroy(  p_port );\r
+               ipoib_port_srq_destroy( p_port );\r
+               p_port->endpt_mgr.thread_is_done = 1;\r
+               cl_event_signal( &p_port->endpt_mgr.event );\r
+       }\r
+#endif\r
+       ASSERT(FALSE);\r
+       //TODO NDIS6.0\r
+       ipoib_port_resume( p_port, FALSE );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+}\r
+\r
+\r
+static void\r
+__port_cleanup(\r
+       IN                              cl_obj_t* const                         p_obj )\r
+{\r
+       ipoib_port_t    *p_port;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       CL_ASSERT( p_obj );\r
+\r
+       p_port = PARENT_STRUCT( p_obj, ipoib_port_t, obj );\r
+\r
+       /* Wait for all sends and receives to get flushed. */\r
+       while( p_port->send_mgr.depth || p_port->recv_mgr.depth )\r
+               cl_thread_suspend( 0 );\r
+\r
+       /* Destroy the send and receive managers before closing the CA. */\r
+       __ib_mgr_destroy( p_port );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+}\r
+\r
+\r
+static void\r
+__port_free(\r
+       IN                              cl_obj_t* const                         p_obj )\r
+{\r
+       ipoib_port_t    *p_port;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       CL_ASSERT( p_obj );\r
+\r
+       p_port = PARENT_STRUCT( p_obj, ipoib_port_t, obj );\r
+\r
+       KeCancelTimer(&p_port->gc_timer);\r
+       KeFlushQueuedDpcs();\r
+       __endpt_mgr_destroy( p_port );\r
+       __recv_mgr_destroy( p_port );\r
+       __send_mgr_destroy( p_port );\r
+       __buf_mgr_destroy( p_port );\r
+\r
+       cl_spinlock_destroy( &p_port->send_lock );\r
+       cl_spinlock_destroy( &p_port->recv_lock );\r
+\r
+       cl_obj_deinit( p_obj );\r
+       if( p_port->p_ca_attrs )\r
+       {\r
+               cl_free ( p_port->p_ca_attrs );\r
+       }\r
+       cl_free( p_port );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+}\r
+\r
+\r
+\r
+/******************************************************************************\r
+*\r
+* IB resource manager implementation.\r
+*\r
+******************************************************************************/\r
+static void\r
+__ib_mgr_construct(\r
+       IN                              ipoib_port_t* const                     p_port )\r
+{\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       cl_memclr( &p_port->ib_mgr, sizeof(ipoib_ib_mgr_t) );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+}\r
+\r
+\r
+static ib_api_status_t\r
+__ib_mgr_init(\r
+       IN                              ipoib_port_t* const                     p_port )\r
+{\r
+       ib_api_status_t         status;\r
+       ib_cq_create_t          cq_create;\r
+       ib_qp_create_t          qp_create;\r
+       ib_phys_create_t        phys_create;\r
+       ib_phys_range_t         phys_range;\r
+       uint64_t                        vaddr;\r
+       net32_t                         rkey;\r
+       ib_qp_attr_t            qp_attr;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       /* Open the CA. */\r
+       status = p_port->p_adapter->p_ifc->open_ca(\r
+               p_port->p_adapter->h_al, p_port->p_adapter->guids.ca_guid,\r
+               NULL, p_port, &p_port->ib_mgr.h_ca );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
+                       EVENT_IPOIB_OPEN_CA, 1, status );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ib_open_ca returned %s\n", \r
+                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+               return status;\r
+       }\r
+\r
+       status = __port_query_ca_attrs( p_port, &p_port->p_ca_attrs );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Query CA attributes failed\n" ) );\r
+               return status;\r
+       }\r
+#if 0\r
+       if( p_port->p_adapter->params.cm_enabled )\r
+       {\r
+               uint32_t payload_mtu = __port_attr_to_mtu_size( \r
+                       p_port->p_ca_attrs->p_port_attr[p_port->port_num - 1].mtu )\r
+                       - sizeof(ipoib_hdr_t);\r
+               /* adjust ipoib UD payload MTU to actual port MTU size. */\r
+               p_port->p_adapter->params.payload_mtu = \r
+                               max( DEFAULT_PAYLOAD_MTU, payload_mtu );\r
+               p_port->p_adapter->params.xfer_block_size = \r
+                       (sizeof(eth_hdr_t) + p_port->p_adapter->params.payload_mtu);\r
+       }\r
+#endif\r
+#if IPOIB_USE_DMA\r
+       /* init DMA only once while running MiniportInitialize */\r
+       if ( !p_port->p_adapter->reset )\r
+       {\r
+               ULONG max_phys_mapping;\r
+               if( p_port->p_adapter->params.cm_enabled )\r
+               {\r
+                       max_phys_mapping = p_port->p_adapter->params.cm_xfer_block_size;\r
+               }\r
+               else if( p_port->p_adapter->params.lso )\r
+               {\r
+                       max_phys_mapping = LARGE_SEND_OFFLOAD_SIZE;\r
+               }\r
+               else\r
+               {\r
+                       max_phys_mapping = p_port->p_adapter->params.xfer_block_size;\r
+               }\r
+               /*if( NdisMInitializeScatterGatherDma( p_port->p_adapter->h_adapter,\r
+                                                       TRUE, max_phys_mapping )!= NDIS_STATUS_SUCCESS )\r
+               {\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("NdisMInitializeScatterGatherDma failed\n" ) );\r
+                       return IB_INSUFFICIENT_RESOURCES;\r
+               }*/\r
+       }\r
+#endif\r
+\r
+       /* Allocate the PD. */\r
+       status = p_port->p_adapter->p_ifc->alloc_pd(\r
+               p_port->ib_mgr.h_ca, IB_PDT_UD, p_port, &p_port->ib_mgr.h_pd );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
+                       EVENT_IPOIB_ALLOC_PD, 1, status );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ib_alloc_pd returned %s\n", \r
+                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+               return status;\r
+       }\r
+\r
+       /* Allocate receive CQ. */\r
+       cq_create.size = p_port->p_adapter->params.rq_depth;\r
+       cq_create.pfn_comp_cb = __recv_cb;\r
+       cq_create.h_wait_obj = NULL;\r
+\r
+       status = p_port->p_adapter->p_ifc->create_cq(\r
+               p_port->ib_mgr.h_ca, &cq_create, p_port,\r
+               __cq_event, &p_port->ib_mgr.h_recv_cq );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
+                       EVENT_IPOIB_CREATE_RECV_CQ, 1, status );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ib_create_cq returned %s.\n", \r
+                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+               return status;\r
+       }\r
+\r
+       /* Allocate send CQ. */\r
+       cq_create.size = p_port->p_adapter->params.sq_depth;\r
+       cq_create.pfn_comp_cb = __send_cb;\r
+\r
+       status = p_port->p_adapter->p_ifc->create_cq(\r
+               p_port->ib_mgr.h_ca, &cq_create, p_port,\r
+               __cq_event, &p_port->ib_mgr.h_send_cq );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
+                       EVENT_IPOIB_CREATE_SEND_CQ, 1, status );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ib_create_cq returned %s.\n", \r
+                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+               return status;\r
+       }\r
+       \r
+       /* Allocate the QP. */\r
+       cl_memclr( &qp_create, sizeof(qp_create) );\r
+       qp_create.qp_type = IB_QPT_UNRELIABLE_DGRM;\r
+       qp_create.rq_depth = p_port->p_adapter->params.rq_depth;\r
+       qp_create.rq_sge = 2;   /* To support buffers spanning pages. */\r
+       qp_create.h_rq_cq = p_port->ib_mgr.h_recv_cq;\r
+       qp_create.sq_depth = p_port->p_adapter->params.sq_depth;\r
+\r
+#define UD_QP_USED_SGE 3\r
+       qp_create.sq_sge = MAX_SEND_SGE < p_port->p_ca_attrs->max_sges ? \r
+                       MAX_SEND_SGE  : ( p_port->p_ca_attrs->max_sges - UD_QP_USED_SGE );\r
+       if ( !p_port->p_ca_attrs->ipoib_csum ) \r
+       { \r
+               /* checksum is not supported by device\r
+               user must specify BYPASS to explicitly cancel checksum calculation */\r
+               if (p_port->p_adapter->params.send_chksum_offload == CSUM_ENABLED)\r
+                       p_port->p_adapter->params.send_chksum_offload = CSUM_DISABLED;\r
+               if (p_port->p_adapter->params.recv_chksum_offload == CSUM_ENABLED)\r
+                       p_port->p_adapter->params.recv_chksum_offload = CSUM_DISABLED;\r
+       }\r
+\r
+       qp_create.h_sq_cq = p_port->ib_mgr.h_send_cq;\r
+       qp_create.sq_signaled = FALSE;\r
+       status = p_port->p_adapter->p_ifc->create_qp(\r
+               p_port->ib_mgr.h_pd, &qp_create, p_port,\r
+               __qp_event, &p_port->ib_mgr.h_qp );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
+                       EVENT_IPOIB_CREATE_QP, 1, status );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ib_create_qp returned %s\n", \r
+                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+               return status;\r
+       }\r
+       /* Query the QP so we can get our QPN. */\r
+       status = p_port->p_adapter->p_ifc->query_qp(\r
+               p_port->ib_mgr.h_qp, &qp_attr );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
+                       EVENT_IPOIB_QUERY_QP, 1, status );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ib_query_qp returned %s\n", \r
+                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+               return status;\r
+       }\r
+       p_port->ib_mgr.qpn = qp_attr.num;\r
+\r
+       /* Register all of physical memory */\r
+       phys_create.length = MEM_REG_SIZE;\r
+       phys_create.num_ranges = 1;\r
+       phys_create.range_array = &phys_range;\r
+       phys_create.buf_offset = 0;\r
+       phys_create.hca_page_size = PAGE_SIZE;\r
+       phys_create.access_ctrl = IB_AC_LOCAL_WRITE;\r
+       phys_range.base_addr = 0;\r
+       phys_range.size = MEM_REG_SIZE;\r
+       vaddr = 0;\r
+       status = p_port->p_adapter->p_ifc->reg_phys(\r
+               p_port->ib_mgr.h_pd, &phys_create, &vaddr,\r
+               &p_port->ib_mgr.lkey, &rkey, &p_port->ib_mgr.h_mr );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
+                       EVENT_IPOIB_REG_PHYS, 1, status );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ib_reg_phys returned %s\n", \r
+                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+               return status;\r
+       }\r
+\r
+       status = ipoib_port_srq_init( p_port );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ipoib_port_srq_init failed %s\n",\r
+                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+               /* disable further CM initialization */\r
+               p_port->p_adapter->params.cm_enabled = FALSE;\r
+\r
+               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
+                               EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de1 );\r
+\r
+       }\r
+//CM\r
+#if 0\r
+       if( p_port->p_adapter->params.cm_enabled )\r
+       {\r
+               status = endpt_cm_buf_mgr_init( p_port );\r
+               if( status != IB_SUCCESS )\r
+               {\r
+                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("CM Init buf mgr failed status %#x\n", status ) );\r
+                       ipoib_port_srq_destroy( p_port );\r
+                       p_port->p_adapter->params.cm_enabled = FALSE;\r
+\r
+                       NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
+                               EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de2 );\r
+               }\r
+               else \r
+               {\r
+                       if ( p_port->p_adapter->params.send_chksum_offload )\r
+                       p_port->p_adapter->params.send_chksum_offload = CSUM_DISABLED;\r
+               }\r
+       }\r
+#endif\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+       return IB_SUCCESS;\r
+}\r
+\r
+static void\r
+__srq_async_event_cb(\r
+IN                     ib_async_event_rec_t            *p_event_rec )\r
+{\r
+       ipoib_port_t* p_port = \r
+               (ipoib_port_t *)p_event_rec->context;\r
+\r
+       switch( p_event_rec->code )\r
+       {\r
+       case IB_AE_SRQ_LIMIT_REACHED:\r
+                               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("SRQ ASYNC EVENT CODE %d: %s\n", \r
+                       p_event_rec->code, "IB_AE_SRQ_LIMIT_REACHED" ) );\r
+                       break;\r
+       case IB_AE_SRQ_CATAS_ERROR:\r
+                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("SRQ ASYNC EVENT CODE %d: %s\n", \r
+                               p_event_rec->code, "IB_AE_SRQ_CATAS_ERROR" ) );\r
+                       /*SRQ is in err state, must reinitialize */\r
+                       p_port->p_adapter->hung = TRUE;\r
+                       break;\r
+       case IB_AE_SRQ_QP_LAST_WQE_REACHED:\r
+                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("SRQ ASYNC EVENT CODE %d: %s\n", \r
+                               p_event_rec->code, "IB_AE_SRQ_QP_LAST_WQE_REACHED" ) );\r
+                       /*SRQ is in err state, must reinitialize */\r
+                       p_port->p_adapter->hung = TRUE;\r
+                       break;\r
+       default:\r
+                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("ASYNC EVENT CODE ARRIVED %d(%#x)\n", \r
+                               p_event_rec->code, p_event_rec->code ) );\r
+       }\r
+}\r
+\r
+ib_api_status_t\r
+ipoib_port_srq_init(\r
+       IN                              ipoib_port_t* const                     p_port )\r
+{\r
+       ib_api_status_t         ib_status;\r
+       ib_srq_handle_t         h_srq;\r
+       ib_srq_attr_t           srq_attr;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+       \r
+       if( !p_port->p_adapter->params.cm_enabled )\r
+               return IB_SUCCESS;\r
+\r
+       srq_attr.max_sge = min( 2, p_port->p_ca_attrs->max_srq_sges );\r
+       srq_attr.srq_limit = 10;\r
+       srq_attr.max_wr = \r
+               min( (uint32_t)p_port->p_adapter->params.rq_depth * 8,\r
+                               p_port->p_ca_attrs->max_srq_wrs/2 );\r
+\r
+       ib_status = p_port->p_adapter->p_ifc->create_srq( \r
+                                                               p_port->ib_mgr.h_pd, \r
+                                                               &srq_attr, \r
+                                                               p_port, \r
+                                                               __srq_async_event_cb, \r
+                                                               &h_srq );\r
+       if( ib_status != IB_SUCCESS )\r
+       {\r
+               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
+                       EVENT_IPOIB_CREATE_QP, 1, ib_status );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ib_create_srq failed status %s\n", \r
+                       p_port->p_adapter->p_ifc->get_err_str( ib_status )) );\r
+               return ib_status;\r
+       }\r
+       p_port->ib_mgr.h_srq = h_srq;\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+\r
+       return ib_status;\r
+}\r
+\r
+/*  __port_query_ca_attrs() \r
+ *  returns a pointer to allocated memory.\r
+ *  must be released by caller.\r
+ */\r
+static ib_api_status_t\r
+__port_query_ca_attrs( \r
+       IN              ipoib_port_t* const             p_port,\r
+       IN              ib_ca_attr_t**                  pp_ca_attrs )\r
+{\r
+       ib_api_status_t         ib_status;\r
+       uint32_t                        attr_size;\r
+       ib_ca_attr_t*           p_ca_attrs;\r
+\r
+       *pp_ca_attrs = NULL;\r
+\r
+       ib_status = \r
+               p_port->p_adapter->p_ifc->query_ca( p_port->ib_mgr.h_ca, NULL , &attr_size );\r
+       if( ib_status != IB_INSUFFICIENT_MEMORY )\r
+       {\r
+               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ib_query_ca failed status %s\n",\r
+                       p_port->p_adapter->p_ifc->get_err_str( ib_status )) );\r
+               goto done;\r
+       }\r
+       CL_ASSERT( attr_size );\r
+\r
+       p_ca_attrs = (ib_ca_attr_t *) cl_zalloc( attr_size );\r
+       if ( p_ca_attrs == NULL )\r
+       {\r
+               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Allocate %d bytes failed for CA Attributes\n", attr_size ));\r
+               ib_status = IB_INSUFFICIENT_MEMORY;\r
+               goto done;\r
+       }\r
+\r
+       ib_status = \r
+               p_port->p_adapter->p_ifc->query_ca( p_port->ib_mgr.h_ca, p_ca_attrs , &attr_size );\r
+       if ( ib_status != IB_SUCCESS )\r
+       {\r
+               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("CA attributes query failed\n") );\r
+               cl_free ( p_ca_attrs );\r
+               goto done;\r
+       }\r
+\r
+       *pp_ca_attrs = p_ca_attrs;\r
+done:\r
+       return ib_status;\r
+}\r
+\r
+void\r
+ipoib_port_srq_destroy( \r
+       IN                              ipoib_port_t* const                     p_port )\r
+{\r
+       ib_api_status_t status;\r
+\r
+       if( p_port->ib_mgr.h_srq )\r
+       {\r
+               status =\r
+                       p_port->p_adapter->p_ifc->destroy_srq( p_port->ib_mgr.h_srq, NULL );\r
+               CL_ASSERT( status == IB_SUCCESS );\r
+               p_port->ib_mgr.h_srq = NULL;\r
+       }\r
+}\r
+\r
+static void\r
+__ib_mgr_destroy(\r
+       IN                              ipoib_port_t* const                     p_port )\r
+{\r
+       ib_api_status_t status;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       if( p_port->ib_mgr.h_ca )\r
+       {\r
+               status =\r
+                       p_port->p_adapter->p_ifc->close_ca( p_port->ib_mgr.h_ca, NULL );\r
+               CL_ASSERT( status == IB_SUCCESS );\r
+               p_port->ib_mgr.h_ca = NULL;\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+}\r
+\r
+\r
+\r
+/******************************************************************************\r
+*\r
+* Buffer manager implementation.\r
+*\r
+******************************************************************************/\r
+static void\r
+__buf_mgr_construct(\r
+       IN                              ipoib_port_t* const                     p_port )\r
+{\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       cl_qpool_construct( &p_port->buf_mgr.recv_pool );\r
+\r
+       p_port->buf_mgr.h_packet_pool = NULL;\r
+       p_port->buf_mgr.h_buffer_pool = NULL;\r
+\r
+       NdisInitializeNPagedLookasideList( &p_port->buf_mgr.send_buf_list,\r
+               NULL, NULL, 0, MAX_XFER_BLOCK_SIZE, 'bipi', 0 );\r
+\r
+       p_port->buf_mgr.h_send_pkt_pool = NULL;\r
+       p_port->buf_mgr.h_send_buf_pool = NULL;\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+}\r
+\r
+\r
+static ib_api_status_t\r
+__buf_mgr_init(\r
+       IN                              ipoib_port_t* const                     p_port )\r
+{\r
+       cl_status_t             cl_status;\r
+       ipoib_params_t  *p_params;\r
+       NET_BUFFER_LIST_POOL_PARAMETERS pool_parameters;\r
+       IPOIB_ENTER(IPOIB_DBG_INIT );\r
+\r
+       CL_ASSERT( p_port );\r
+       CL_ASSERT( p_port->p_adapter );\r
+\r
+       p_params = &p_port->p_adapter->params;\r
+\r
+       /* Allocate the receive descriptor pool */\r
+       cl_status = cl_qpool_init( &p_port->buf_mgr.recv_pool,\r
+               p_params->rq_depth * p_params->recv_pool_ratio,\r
+#if IPOIB_INLINE_RECV\r
+               0, 0, sizeof(ipoib_recv_desc_t), __recv_ctor, NULL, p_port );\r
+#else  /* IPOIB_INLINE_RECV */\r
+               0, 0, sizeof(ipoib_recv_desc_t), __recv_ctor, __recv_dtor, p_port );\r
+#endif /* IPOIB_INLINE_RECV */\r
+       if( cl_status != CL_SUCCESS )\r
+       {\r
+               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
+                       EVENT_IPOIB_RECV_POOL, 1, cl_status );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("cl_qpool_init for recvs returned %#x\n",\r
+                       cl_status) );\r
+               return IB_INSUFFICIENT_MEMORY;\r
+       }\r
+\r
+       /* Allocate the NET BUFFER list pools for receive indication. */\r
+       NdisZeroMemory(&pool_parameters, sizeof(NET_BUFFER_LIST_POOL_PARAMETERS));\r
+    pool_parameters.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;\r
+    pool_parameters.Header.Revision = NET_BUFFER_LIST_POOL_PARAMETERS_REVISION_1;\r
+    pool_parameters.Header.Size = sizeof(pool_parameters);\r
+    pool_parameters.ProtocolId = 0;\r
+    pool_parameters.ContextSize = 0;\r
+    pool_parameters.fAllocateNetBuffer = TRUE;\r
+    pool_parameters.PoolTag = 'CRPI';\r
+\r
+    p_port->buf_mgr.h_packet_pool = NdisAllocateNetBufferListPool(\r
+                p_port->p_adapter->h_adapter,\r
+                &pool_parameters); \r
+\r
+       if( !p_port->buf_mgr.h_packet_pool )\r
+       {\r
+               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
+                       EVENT_IPOIB_RECV_PKT_POOL, 1, NDIS_STATUS_RESOURCES  );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("NdisAllocatePacketPool returned %08X\n", (UINT)NDIS_STATUS_RESOURCES) );\r
+               return IB_INSUFFICIENT_RESOURCES;\r
+       }\r
+/*\r
+       NdisAllocateBufferPool( &ndis_status, &p_port->buf_mgr.h_buffer_pool,\r
+               p_params->rq_depth );\r
+       if( ndis_status != NDIS_STATUS_SUCCESS )\r
+       {\r
+               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
+                       EVENT_IPOIB_RECV_BUF_POOL, 1, ndis_status );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("NdisAllocateBufferPool returned %08X\n", ndis_status) );\r
+               return IB_INSUFFICIENT_RESOURCES;\r
+       }\r
+*/\r
+       /* Allocate the NET buffer list pool for send formatting. */\r
+    pool_parameters.PoolTag = 'XTPI';\r
+\r
+    p_port->buf_mgr.h_send_pkt_pool = NdisAllocateNetBufferListPool(\r
+                p_port->p_adapter->h_adapter,\r
+                &pool_parameters); \r
+       if( !p_port->buf_mgr.h_send_pkt_pool)\r
+       {\r
+               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
+                       EVENT_IPOIB_SEND_PKT_POOL, 1, NDIS_STATUS_RESOURCES );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("NdisAllocatePacketPool returned %08X\n", (UINT)NDIS_STATUS_RESOURCES) );\r
+               return IB_INSUFFICIENT_RESOURCES;\r
+       }\r
+/*\r
+       NdisAllocateBufferPool( &ndis_status,\r
+               &p_port->buf_mgr.h_send_buf_pool, 1 );\r
+       if( ndis_status != NDIS_STATUS_SUCCESS )\r
+       {\r
+               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
+                       EVENT_IPOIB_SEND_BUF_POOL, 1, ndis_status );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("NdisAllocateBufferPool returned %08X\n", ndis_status) );\r
+               return IB_INSUFFICIENT_RESOURCES;\r
+       }\r
+*/\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+       return IB_SUCCESS;\r
+}\r
+\r
+\r
+static void\r
+__buf_mgr_destroy(\r
+       IN                              ipoib_port_t* const                     p_port )\r
+{\r
+       IPOIB_ENTER(IPOIB_DBG_INIT );\r
+\r
+       CL_ASSERT( p_port );\r
+\r
+       /* Destroy the send packet and buffer pools. \r
+       if( p_port->buf_mgr.h_send_buf_pool )\r
+               NdisFreeBufferPool( p_port->buf_mgr.h_send_buf_pool );*/\r
+       if( p_port->buf_mgr.h_send_pkt_pool )\r
+               NdisFreeNetBufferListPool ( p_port->buf_mgr.h_send_pkt_pool );\r
+\r
+       /* Destroy the receive packet and buffer pools. \r
+       if( p_port->buf_mgr.h_buffer_pool )\r
+               NdisFreeBufferPool( p_port->buf_mgr.h_buffer_pool );*/\r
+       if( p_port->buf_mgr.h_packet_pool )\r
+               NdisFreeNetBufferListPool ( p_port->buf_mgr.h_packet_pool );\r
+\r
+       /* Free the receive and send descriptors. */\r
+       cl_qpool_destroy( &p_port->buf_mgr.recv_pool );\r
+\r
+       /* Free the lookaside list of scratch buffers. */\r
+       NdisDeleteNPagedLookasideList( &p_port->buf_mgr.send_buf_list );\r
+\r
+       IPOIB_EXIT(  IPOIB_DBG_INIT );\r
+}\r
+\r
+\r
+static cl_status_t\r
+__recv_ctor(\r
+       IN                              void* const                                     p_object,\r
+       IN                              void*                                           context,\r
+               OUT                     cl_pool_item_t** const          pp_pool_item )\r
+{\r
+       ipoib_recv_desc_t       *p_desc;\r
+       ipoib_port_t            *p_port;\r
+\r
+#if IPOIB_INLINE_RECV\r
+       uint32_t                        ds0_len;\r
+#endif\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_ALLOC );\r
+\r
+       CL_ASSERT( p_object );\r
+       CL_ASSERT( context );\r
+\r
+       p_desc = (ipoib_recv_desc_t*)p_object;\r
+       p_port = (ipoib_port_t*)context;\r
+\r
+       /* Setup the work request. */\r
+       p_desc->wr.ds_array = p_desc->local_ds;\r
+       p_desc->wr.wr_id = (uintn_t)p_desc;\r
+\r
+#if IPOIB_INLINE_RECV\r
+       /* Sanity check on the receive buffer layout */\r
+       CL_ASSERT( (void*)&p_desc->buf.eth.pkt.type ==\r
+               (void*)&p_desc->buf.ib.pkt.type );\r
+       CL_ASSERT( sizeof(recv_buf_t) == sizeof(ipoib_pkt_t) + sizeof(ib_grh_t) );\r
+\r
+       /* Setup the local data segment. */\r
+       p_desc->local_ds[0].vaddr = cl_get_physaddr( &p_desc->buf );\r
+       p_desc->local_ds[0].lkey = p_port->ib_mgr.lkey;\r
+       ds0_len =\r
+               PAGE_SIZE - ((uint32_t)p_desc->local_ds[0].vaddr & (PAGE_SIZE - 1));\r
+       if( ds0_len >= sizeof(recv_buf_t) )\r
+       {\r
+               /* The whole buffer is within a page. */\r
+               p_desc->local_ds[0].length = ds0_len;\r
+               p_desc->wr.num_ds = 1;\r
+       }\r
+       else\r
+       {\r
+               /* The buffer crosses page boundaries. */\r
+               p_desc->local_ds[0].length = ds0_len;\r
+               p_desc->local_ds[1].vaddr = cl_get_physaddr( \r
+                       ((uint8_t*)&p_desc->buf) + ds0_len );\r
+               p_desc->local_ds[1].lkey = p_port->ib_mgr.lkey;\r
+               p_desc->local_ds[1].length = sizeof(recv_buf_t) - ds0_len;\r
+               p_desc->wr.num_ds = 2;\r
+       }\r
+#else  /* IPOIB_INLINE_RECV */\r
+       /* Allocate the receive buffer. */\r
+       p_desc->p_buf = (recv_buf_t*)cl_zalloc( sizeof(recv_buf_t) );\r
+       if( !p_desc->p_buf )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Failed to allocate receive buffer.\n") );\r
+               return CL_INSUFFICIENT_MEMORY;\r
+       }\r
+\r
+       /* Sanity check on the receive buffer layout */\r
+       CL_ASSERT( (void*)&p_desc->p_buf->eth.pkt.type ==\r
+               (void*)&p_desc->p_buf->ib.pkt.type );\r
+\r
+       /* Setup the local data segment. */\r
+       p_desc->local_ds[0].vaddr = cl_get_physaddr( p_desc->p_buf );\r
+       p_desc->local_ds[0].length = sizeof(ipoib_pkt_t) + sizeof(ib_grh_t);\r
+       p_desc->local_ds[0].lkey = p_port->ib_mgr.lkey;\r
+       p_desc->wr.num_ds = 1;\r
+#endif /* IPOIB_INLINE_RECV */\r
+\r
+       *pp_pool_item = &p_desc->item;\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_ALLOC );\r
+       return CL_SUCCESS;\r
+}\r
+\r
+\r
+#if !IPOIB_INLINE_RECV\r
+static void\r
+__recv_dtor(\r
+       IN              const   cl_pool_item_t* const           p_pool_item,\r
+       IN                              void                                            *context )\r
+{\r
+       ipoib_recv_desc_t       *p_desc;\r
+\r
+       IPOIB_ENTER(  IPOIB_DBG_ALLOC );\r
+\r
+       UNUSED_PARAM( context );\r
+\r
+       p_desc = PARENT_STRUCT( p_pool_item, ipoib_recv_desc_t, item );\r
+\r
+       if( p_desc->p_buf )\r
+               cl_free( p_desc->p_buf );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_ALLOC );\r
+}\r
+#endif\r
+\r
+\r
+static inline ipoib_recv_desc_t*\r
+__buf_mgr_get_recv(\r
+       IN                              ipoib_port_t* const                     p_port )\r
+{\r
+       ipoib_recv_desc_t       *p_desc;\r
+       IPOIB_ENTER( IPOIB_DBG_RECV );\r
+       p_desc = (ipoib_recv_desc_t*)cl_qpool_get( &p_port->buf_mgr.recv_pool );\r
+       /* Reference the port object for the send. */\r
+       if( p_desc )\r
+       {\r
+               ipoib_port_ref( p_port, ref_get_recv );\r
+               CL_ASSERT( p_desc->wr.wr_id == (uintn_t)p_desc );\r
+#if IPOIB_INLINE_RECV\r
+               CL_ASSERT( p_desc->local_ds[0].vaddr ==\r
+                       cl_get_physaddr( &p_desc->buf ) );\r
+#else  /* IPOIB_INLINE_RECV */\r
+               CL_ASSERT( p_desc->local_ds[0].vaddr ==\r
+                       cl_get_physaddr( p_desc->p_buf ) );\r
+               CL_ASSERT( p_desc->local_ds[0].length ==\r
+                       (sizeof(ipoib_pkt_t) + sizeof(ib_grh_t)) );\r
+#endif /* IPOIB_INLINE_RECV */\r
+               CL_ASSERT( p_desc->local_ds[0].lkey == p_port->ib_mgr.lkey );\r
+       }\r
+       IPOIB_EXIT( IPOIB_DBG_RECV );\r
+       return p_desc;\r
+}\r
+\r
+\r
+//NDIS60\r
+static inline void\r
+__buf_mgr_put_recv(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ipoib_recv_desc_t* const        p_desc,\r
+       IN                              NET_BUFFER_LIST* const          p_net_buffer_list OPTIONAL )\r
+{\r
+       NET_BUFFER              *p_buf = NULL;\r
+       MDL                             *p_mdl = NULL;\r
+       IPOIB_ENTER(IPOIB_DBG_RECV );\r
+\r
+       if( p_net_buffer_list )\r
+       {\r
+               NET_BUFFER_LIST_NEXT_NBL(p_net_buffer_list) = NULL;\r
+               p_buf = NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);\r
+               CL_ASSERT( p_buf );\r
+               p_mdl = NET_BUFFER_FIRST_MDL(p_buf);\r
+               CL_ASSERT( p_mdl );\r
+               NdisFreeMdl(p_mdl);\r
+               NdisFreeNetBufferList(p_net_buffer_list);\r
+       }\r
+\r
+       /* Return the descriptor to its pools. */\r
+       cl_qpool_put( &p_port->buf_mgr.recv_pool, &p_desc->item );\r
+\r
+       /*\r
+        * Dereference the port object since the receive is no longer outstanding.\r
+        */\r
+       ipoib_port_deref( p_port, ref_get_recv );\r
+       IPOIB_EXIT(  IPOIB_DBG_RECV );\r
+}\r
+\r
+\r
+static inline void\r
+__buf_mgr_put_recv_list(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              cl_qlist_t* const                       p_list )\r
+{\r
+       //IPOIB_ENTER(  IPOIB_DBG_RECV );\r
+       cl_qpool_put_list( &p_port->buf_mgr.recv_pool, p_list );\r
+       //IPOIB_EXIT(  IPOIB_DBG_RECV );\r
+}\r
+\r
+\r
+static inline NET_BUFFER_LIST*\r
+__buf_mgr_get_ndis_pkt(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ipoib_recv_desc_t* const        p_desc )\r
+{\r
+       NET_BUFFER_LIST                 *p_net_buffer_list;\r
+       MDL                                             *p_mdl;\r
+\r
+       IPOIB_ENTER(  IPOIB_DBG_RECV );\r
+\r
+       p_mdl = NdisAllocateMdl(p_port->p_adapter->h_adapter,\r
+                                                       &p_desc->buf.eth.pkt,\r
+                                                       p_desc->len );\r
+       if( !p_mdl )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Failed to allocate MDL\n") );\r
+               return NULL;\r
+       }\r
+\r
+       p_net_buffer_list = NdisAllocateNetBufferAndNetBufferList(\r
+                                               p_port->buf_mgr.h_packet_pool,\r
+                                               0,\r
+                                               0,\r
+                                               p_mdl,\r
+                                               0,\r
+                                               0);\r
+\r
+       if( !p_net_buffer_list )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Failed to allocate NET_BUFFER_LIST\n") );\r
+               NdisFreeMdl(p_mdl);\r
+               return NULL;\r
+       }\r
+\r
+       NET_BUFFER_LIST_NEXT_NBL(p_net_buffer_list) = NULL;\r
+       IPOIB_PORT_FROM_PACKET( p_net_buffer_list ) = p_port;\r
+       IPOIB_RECV_FROM_PACKET( p_net_buffer_list ) = p_desc;\r
+       p_net_buffer_list->SourceHandle = p_port->p_adapter->h_adapter;\r
+\r
+       IPOIB_EXIT(  IPOIB_DBG_RECV );\r
+       return p_net_buffer_list;\r
+}\r
+\r
+\r
+/******************************************************************************\r
+*\r
+* Receive manager implementation.\r
+*\r
+******************************************************************************/\r
+static void\r
+__recv_mgr_construct(\r
+       IN                              ipoib_port_t* const                     p_port )\r
+{\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       cl_qlist_init( &p_port->recv_mgr.done_list );\r
+\r
+       p_port->recv_mgr.recv_pkt_array = NULL;\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+}\r
+\r
+\r
+static ib_api_status_t\r
+__recv_mgr_init(\r
+       IN                              ipoib_port_t* const                     p_port )\r
+{\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       /* Allocate the NDIS_PACKET pointer array for indicating receives. */\r
+       p_port->recv_mgr.recv_pkt_array = (NET_BUFFER_LIST **)cl_malloc(\r
+               sizeof(NET_BUFFER_LIST*) * p_port->p_adapter->params.rq_depth );\r
+       if( !p_port->recv_mgr.recv_pkt_array )\r
+       {\r
+               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
+                       EVENT_IPOIB_RECV_PKT_ARRAY, 0 );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("cl_malloc for PNDIS_PACKET array failed.\n") );\r
+               return IB_INSUFFICIENT_MEMORY;\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+       return IB_SUCCESS;\r
+}\r
+\r
+\r
+static void\r
+__recv_mgr_destroy(\r
+       IN                              ipoib_port_t* const                     p_port )\r
+{\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       CL_ASSERT( cl_is_qlist_empty( &p_port->recv_mgr.done_list ) );\r
+       CL_ASSERT( !p_port->recv_mgr.depth );\r
+\r
+       if( p_port->recv_mgr.recv_pkt_array )\r
+               cl_free( p_port->recv_mgr.recv_pkt_array );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+}\r
+\r
+\r
+/*\r
+ * Posts receive buffers to the receive queue and returns the number\r
+ * of receives needed to bring the RQ to its low water mark.  Note\r
+ * that the value is signed, and can go negative.  All tests must\r
+ * be for > 0.\r
+ */\r
+int32_t\r
+__recv_mgr_repost(\r
+       IN                              ipoib_port_t* const                     p_port )\r
+{\r
+       ipoib_recv_desc_t       *p_head = NULL, *p_tail = NULL, *p_next;\r
+       ib_api_status_t         status;\r
+       ib_recv_wr_t            *p_failed;\r
+       PERF_DECLARE( GetRecv );\r
+       PERF_DECLARE( PostRecv );\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_RECV );\r
+\r
+       CL_ASSERT( p_port );\r
+       cl_obj_lock( &p_port->obj );\r
+       if( p_port->state != IB_QPS_RTS )\r
+       {\r
+               cl_obj_unlock( &p_port->obj );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,\r
+                       ("Port in invalid state.  Not reposting.\n") );\r
+               return 0;\r
+       }\r
+       ipoib_port_ref( p_port, ref_repost );\r
+       cl_obj_unlock( &p_port->obj );\r
+\r
+       while( p_port->recv_mgr.depth < p_port->p_adapter->params.rq_depth )\r
+       {\r
+               /* Pull receives out of the pool and chain them up. */\r
+               cl_perf_start( GetRecv );\r
+               p_next = __buf_mgr_get_recv( p_port );\r
+               cl_perf_stop( &p_port->p_adapter->perf, GetRecv );\r
+               if( !p_next )\r
+               {\r
+                       IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,\r
+                               ("Out of receive descriptors! recv queue depth 0x%x\n",p_port->recv_mgr.depth) );\r
+                       break;\r
+               }\r
+\r
+               if( !p_tail )\r
+               {\r
+                       p_tail = p_next;\r
+                       p_next->wr.p_next = NULL;\r
+               }\r
+               else\r
+               {\r
+                       p_next->wr.p_next = &p_head->wr;\r
+               }\r
+\r
+               p_head = p_next;\r
+\r
+               p_port->recv_mgr.depth++;\r
+       }\r
+\r
+       if( p_head )\r
+       {\r
+               cl_perf_start( PostRecv );\r
+               status = p_port->p_adapter->p_ifc->post_recv(\r
+                       p_port->ib_mgr.h_qp, &p_head->wr, &p_failed );\r
+               cl_perf_stop( &p_port->p_adapter->perf, PostRecv );\r
+\r
+               if( status != IB_SUCCESS )\r
+               {\r
+                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("ip_post_recv returned %s\n", \r
+                               p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+                       /* return the descriptors to the pool */\r
+                       while( p_failed )\r
+                       {\r
+                               p_head = PARENT_STRUCT( p_failed, ipoib_recv_desc_t, wr );\r
+                               p_failed = p_failed->p_next;\r
+\r
+                               __buf_mgr_put_recv( p_port, p_head, NULL );\r
+                               p_port->recv_mgr.depth--;\r
+                       }\r
+               }\r
+       }\r
+\r
+       ipoib_port_deref( p_port, ref_repost );\r
+       IPOIB_EXIT( IPOIB_DBG_RECV );\r
+       return p_port->p_adapter->params.rq_low_watermark - p_port->recv_mgr.depth;\r
+}\r
+\r
+void\r
+ipoib_return_net_buffer_list(\r
+       IN                              NDIS_HANDLE                                     adapter_context,\r
+       IN                              NET_BUFFER_LIST                         *p_net_buffer_lists,\r
+       IN                              ULONG                                           return_flags)\r
+{\r
+//     cl_list_item_t          *p_item;\r
+       ipoib_port_t            *p_port;\r
+       ipoib_recv_desc_t       *p_desc;\r
+       NET_BUFFER_LIST         *cur_net_buffer_list,*next_net_buffer_list;\r
+//     ib_api_status_t         status = IB_NOT_DONE;\r
+//     int32_t                         shortage;\r
+//     ULONG                           complete_flags = 0;\r
+       PERF_DECLARE( ReturnPacket );\r
+       PERF_DECLARE( ReturnPutRecv );\r
+       PERF_DECLARE( ReturnRepostRecv );\r
+       PERF_DECLARE( ReturnPreparePkt );\r
+       PERF_DECLARE( ReturnNdisIndicate );\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_RECV );\r
+\r
+       UNUSED_PARAM( return_flags );\r
+\r
+       p_port = ((ipoib_adapter_t*)adapter_context)->p_port;\r
+       CL_ASSERT( p_net_buffer_lists );\r
+\r
+       cl_perf_start( ReturnPacket );\r
+       cl_spinlock_acquire( &p_port->recv_lock );\r
+       for (cur_net_buffer_list = p_net_buffer_lists;\r
+                cur_net_buffer_list != NULL;\r
+                cur_net_buffer_list = next_net_buffer_list)\r
+       {\r
+               next_net_buffer_list = NET_BUFFER_LIST_NEXT_NBL(cur_net_buffer_list);\r
+\r
+               /* Get the port and descriptor from the packet. */\r
+               CL_ASSERT(p_port == IPOIB_PORT_FROM_PACKET( cur_net_buffer_list ));\r
+               p_desc = IPOIB_RECV_FROM_PACKET( cur_net_buffer_list );\r
+\r
+               \r
+               //TODO: NDIS60, rewrite this block\r
+               /* Get descriptor from the packet. */\r
+#if 0\r
+               if( p_desc->type == PKT_TYPE_CM_UCAST )\r
+               {\r
+                       NDIS_BUFFER             *p_buf;\r
+\r
+                       /* Unchain the NDIS buffer. */\r
+                       NdisUnchainBufferAtFront( p_packet, &p_buf );\r
+                       CL_ASSERT( p_buf );\r
+                       /* Return the NDIS packet and NDIS buffer to their pools. */\r
+                       NdisDprFreePacketNonInterlocked( p_packet );\r
+                       NdisFreeBuffer( p_buf );\r
+\r
+                       endpt_cm_buf_mgr_put_recv( &p_port->cm_buf_mgr, (ipoib_cm_desc_t *)p_desc );\r
+                       status = endpt_cm_post_recv( p_port );\r
+                       if(  status != IB_SUCCESS )\r
+                       {\r
+                               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                       ("Post Recv QP failed\n" ) );\r
+                       }\r
+                       cl_spinlock_release( &p_port->recv_lock );\r
+                       return;\r
+               }\r
+#endif\r
+\r
+               cl_perf_start( ReturnPutRecv );\r
+               __buf_mgr_put_recv( p_port, p_desc, cur_net_buffer_list );\r
+               cl_perf_stop( &p_port->p_adapter->perf, ReturnPutRecv );\r
+       }\r
+#if 0           \r
+       /* Repost buffers. */\r
+       cl_perf_start( ReturnRepostRecv );\r
+       shortage = __recv_mgr_repost( p_port );\r
+       cl_perf_stop( &p_port->p_adapter->perf, ReturnRepostRecv );\r
+\r
+       for( p_item = cl_qlist_remove_head( &p_port->recv_mgr.done_list );\r
+               p_item != cl_qlist_end( &p_port->recv_mgr.done_list );\r
+               p_item = cl_qlist_remove_head( &p_port->recv_mgr.done_list ) )\r
+       {\r
+               p_desc = (ipoib_recv_desc_t*)p_item;\r
+\r
+               cl_perf_start( ReturnPreparePkt );\r
+               status = __recv_mgr_prepare_pkt( p_port, p_desc, &cur_net_buffer_list );\r
+               cl_perf_stop( &p_port->p_adapter->perf, ReturnPreparePkt );\r
+               if( status == IB_SUCCESS )\r
+               {\r
+                       if( shortage > 0 )\r
+                               NET_BUFFER_LIST_STATUS( cur_net_buffer_list) = NDIS_STATUS_RESOURCES;\r
+                       else\r
+                               NET_BUFFER_LIST_STATUS( cur_net_buffer_list) = NDIS_STATUS_SUCCESS;\r
+\r
+                       cl_spinlock_release( &p_port->recv_lock );\r
+                       NET_BUFFER_LIST_NEXT_NBL(cur_net_buffer_list) = NULL;\r
+                       cl_perf_start( ReturnNdisIndicate );\r
+                       NdisMRecvIndicate( p_port->p_adapter->h_adapter,\r
+                               cur_net_buffer_list, complete_flags );\r
+                       cl_perf_stop( &p_port->p_adapter->perf, ReturnNdisIndicate );\r
+                       cl_spinlock_acquire( &p_port->recv_lock );\r
+\r
+                       if( shortage > 0 )\r
+                       {\r
+                               cl_perf_start( ReturnPutRecv );\r
+                               __buf_mgr_put_recv( p_port, p_desc, cur_net_buffer_list );\r
+                               cl_perf_stop( &p_port->p_adapter->perf, ReturnPutRecv );\r
+\r
+                               /* Repost buffers. */\r
+                               cl_perf_start( ReturnRepostRecv );\r
+                               shortage = __recv_mgr_repost( p_port );\r
+                               cl_perf_stop( &p_port->p_adapter->perf, ReturnRepostRecv );\r
+                       }\r
+               }\r
+               else if( status != IB_NOT_DONE )\r
+               {\r
+                       IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,\r
+                               ("__recv_mgr_prepare_pkt returned %s\n",\r
+                               p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+                       /* Return the item to the head of the list. */\r
+                       cl_qlist_insert_head( &p_port->recv_mgr.done_list, p_item );\r
+                       break;\r
+               }\r
+       }\r
+       #endif\r
+       cl_spinlock_release( &p_port->recv_lock );\r
+       cl_perf_stop( &p_port->p_adapter->perf, ReturnPacket );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_RECV );\r
+}\r
+\r
+static void __recv_cb_dpc(KDPC *p_gc_dpc,void *context,void * s_arg1 , void * s_arg2)\r
+{\r
+\r
+       ipoib_port_t *p_port = (ipoib_port_t *) context;\r
+\r
+       UNREFERENCED_PARAMETER(p_gc_dpc);\r
+       UNREFERENCED_PARAMETER(s_arg1);\r
+       UNREFERENCED_PARAMETER(s_arg2);\r
+\r
+\r
+       __recv_cb(NULL, p_port);\r
+       ipoib_port_deref( p_port, ref_recv_cb );\r
+\r
+\r
+}\r
+\r
+\r
+static void\r
+__recv_cb(\r
+       IN              const   ib_cq_handle_t                          h_cq,\r
+       IN                              void                                            *cq_context )\r
+{\r
+       ipoib_port_t            *p_port;\r
+       ib_api_status_t         status;\r
+       ib_wc_t                         wc[MAX_RECV_WC], *p_free, *p_wc;\r
+       int32_t                         pkt_cnt, recv_cnt = 0, shortage, discarded;\r
+       cl_qlist_t                      done_list, bad_list;\r
+       size_t                          i;\r
+       ULONG                           recv_complete_flags = 0;\r
+\r
+       PERF_DECLARE( RecvCompBundle );\r
+       PERF_DECLARE( RecvCb );\r
+       PERF_DECLARE( PollRecv );\r
+       PERF_DECLARE( RepostRecv );\r
+       PERF_DECLARE( FilterRecv );\r
+       PERF_DECLARE( BuildPktArray );\r
+       PERF_DECLARE( RecvNdisIndicate );\r
+       PERF_DECLARE( RearmRecv );\r
+       PERF_DECLARE( PutRecvList );\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_RECV );\r
+\r
+       cl_perf_clr( RecvCompBundle );\r
+\r
+       cl_perf_start( RecvCb );\r
+//return ;\r
+       UNUSED_PARAM( h_cq );\r
+\r
+       NDIS_SET_SEND_COMPLETE_FLAG(recv_complete_flags, NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL );\r
+\r
+       p_port = (ipoib_port_t*)cq_context;\r
+\r
+       cl_qlist_init( &done_list );\r
+       cl_qlist_init( &bad_list );\r
+\r
+       ipoib_port_ref( p_port, ref_recv_cb );\r
+       for( i = 0; i < MAX_RECV_WC; i++ )\r
+               wc[i].p_next = &wc[i + 1];\r
+       wc[MAX_RECV_WC - 1].p_next = NULL;\r
+\r
+       /*\r
+        * We'll be accessing the endpoint map so take a reference\r
+        * on it to prevent modifications.\r
+        */\r
+       cl_obj_lock( &p_port->obj );\r
+       cl_atomic_inc( &p_port->endpt_rdr );\r
+       cl_obj_unlock( &p_port->obj );\r
+\r
+       do\r
+       {\r
+               /* If we get here, then the list of WCs is intact. */\r
+               p_free = wc;\r
+\r
+               cl_perf_start( PollRecv );\r
+               status = p_port->p_adapter->p_ifc->poll_cq(\r
+                       p_port->ib_mgr.h_recv_cq, &p_free, &p_wc );\r
+               cl_perf_stop( &p_port->p_adapter->perf, PollRecv );\r
+               CL_ASSERT( status == IB_SUCCESS || status == IB_NOT_FOUND );\r
+\r
+               /* Look at the payload now and filter ARP and DHCP packets. */\r
+               cl_perf_start( FilterRecv );\r
+               recv_cnt += __recv_mgr_filter( p_port, p_wc, &done_list, &bad_list );\r
+               cl_perf_stop( &p_port->p_adapter->perf, FilterRecv );\r
+\r
+       } while( (!p_free) && (recv_cnt < 128));\r
+\r
+       /* We're done looking at the endpoint map, release the reference. */\r
+       cl_atomic_dec( &p_port->endpt_rdr );\r
+\r
+       cl_perf_log( &p_port->p_adapter->perf, RecvCompBundle, recv_cnt );\r
+\r
+       cl_spinlock_acquire( &p_port->recv_lock );\r
+\r
+       /* Update our posted depth. */\r
+       p_port->recv_mgr.depth -= recv_cnt;\r
+\r
+       /* Return any discarded receives to the pool */\r
+       cl_perf_start( PutRecvList );\r
+       __buf_mgr_put_recv_list( p_port, &bad_list );\r
+       cl_perf_stop( &p_port->p_adapter->perf, PutRecvList );\r
+\r
+       do\r
+       {\r
+               int32_t cnt;\r
+               /* Repost ASAP so we don't starve the RQ. */\r
+               cl_perf_start( RepostRecv );\r
+               shortage = __recv_mgr_repost( p_port );\r
+               cl_perf_stop( &p_port->p_adapter->perf, RepostRecv );\r
+\r
+               cl_perf_start( BuildPktArray );\r
+               /* Notify NDIS of any and all possible receive buffers. */\r
+               pkt_cnt = __recv_mgr_build_pkt_array(\r
+                       p_port, shortage, &done_list, &discarded );\r
+               cl_perf_stop( &p_port->p_adapter->perf, BuildPktArray );\r
+\r
+               /* Only indicate receives if we actually had any. */\r
+               if( discarded && shortage > 0 )\r
+               {\r
+                       /* We may have thrown away packets, and have a shortage */\r
+                       cl_perf_start( RepostRecv );\r
+                       __recv_mgr_repost( p_port );\r
+                       cl_perf_stop( &p_port->p_adapter->perf, RepostRecv );\r
+               }\r
+\r
+               if( !pkt_cnt )\r
+                       break;\r
+\r
+               cl_spinlock_release( &p_port->recv_lock );\r
+               for( cnt = 0; cnt < pkt_cnt -1; cnt++)\r
+               {\r
+                       NET_BUFFER_LIST_NEXT_NBL(p_port->recv_mgr.recv_pkt_array[cnt]) = \r
+                               p_port->recv_mgr.recv_pkt_array[cnt + 1];\r
+               }\r
+               cl_perf_start( RecvNdisIndicate );\r
+#ifndef NDIS_DEFAULT_PORT_NUMBER\r
+#define NDIS_DEFAULT_PORT_NUMBER 0\r
+#endif\r
+               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                       ("Indicate NDIS with  %d received NBs\n",\r
+                                       pkt_cnt) );\r
+               NdisMIndicateReceiveNetBufferLists(\r
+                       p_port->p_adapter->h_adapter,\r
+                       p_port->recv_mgr.recv_pkt_array[0],\r
+                       NDIS_DEFAULT_PORT_NUMBER,\r
+                       pkt_cnt,\r
+                       recv_complete_flags);\r
+\r
+               cl_perf_stop( &p_port->p_adapter->perf, RecvNdisIndicate );\r
+\r
+               /*\r
+                * Cap the number of receives to put back to what we just indicated\r
+                * with NDIS_STATUS_RESOURCES.\r
+                */\r
+               if( shortage > 0 )\r
+               {\r
+                       if( pkt_cnt < shortage )\r
+                               shortage = pkt_cnt;\r
+\r
+                       /* Return all but the last packet to the pool. */\r
+                       cl_spinlock_acquire( &p_port->recv_lock );\r
+                       while( shortage-- > 1 )\r
+                       {\r
+                               __buf_mgr_put_recv( p_port,\r
+                                       (ipoib_recv_desc_t *)IPOIB_RECV_FROM_PACKET( p_port->recv_mgr.recv_pkt_array[shortage] ),\r
+                                       p_port->recv_mgr.recv_pkt_array[shortage] );\r
+                       }\r
+                       cl_spinlock_release( &p_port->recv_lock );\r
+\r
+                       /*\r
+                        * Return the last packet as if NDIS returned it, so that we repost\r
+                        * and report any other pending receives.\r
+                        */\r
+                       ipoib_return_net_buffer_list( NULL, p_port->recv_mgr.recv_pkt_array[0],recv_complete_flags );\r
+               }\r
+               cl_spinlock_acquire( &p_port->recv_lock );\r
+\r
+       } while( pkt_cnt );\r
+       cl_spinlock_release( &p_port->recv_lock );\r
+\r
+       if (p_free ) {\r
+               /*\r
+                * Rearm after filtering to prevent contention on the enpoint maps\r
+                * and eliminate the possibility of having a call to\r
+                * __endpt_mgr_insert find a duplicate.\r
+                */\r
+               cl_perf_start( RearmRecv );\r
+               status = p_port->p_adapter->p_ifc->rearm_cq(\r
+                       p_port->ib_mgr.h_recv_cq, FALSE );\r
+               cl_perf_stop( &p_port->p_adapter->perf, RearmRecv );\r
+               CL_ASSERT( status == IB_SUCCESS );\r
+\r
+               ipoib_port_deref( p_port, ref_recv_cb );\r
+       } else {\r
+               // Please note the reference is still up\r
+               KeInsertQueueDpc(&p_port->recv_dpc, NULL, NULL);\r
+       }\r
+\r
+       cl_perf_stop( &p_port->p_adapter->perf, RecvCb );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_RECV );\r
+}\r
+\r
+\r
+static void\r
+__recv_get_endpts(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ipoib_recv_desc_t* const        p_desc,\r
+       IN                              ib_wc_t* const                          p_wc,\r
+               OUT                     ipoib_endpt_t** const           pp_src,\r
+               OUT                     ipoib_endpt_t** const           pp_dst )\r
+{\r
+       ib_api_status_t         status;\r
+       mac_addr_t                      mac;\r
+       PERF_DECLARE( GetEndptByGid );\r
+       PERF_DECLARE( GetEndptByLid );\r
+       PERF_DECLARE( EndptInsert );\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_RECV );\r
+\r
+       /* Setup our shortcut pointers based on whether GRH is valid. */\r
+       if( p_wc->recv.ud.recv_opt & IB_RECV_OPT_GRH_VALID )\r
+       {\r
+               /* Lookup the source endpoints based on GID. */\r
+               cl_perf_start( GetEndptByGid );\r
+               *pp_src =\r
+#if IPOIB_INLINE_RECV\r
+                       __endpt_mgr_get_by_gid( p_port, &p_desc->buf.ib.grh.src_gid );\r
+#else  /* IPOIB_INLINE_RECV */\r
+                       __endpt_mgr_get_by_gid( p_port, &p_desc->p_buf->ib.grh.src_gid );\r
+#endif /* IPOIB_INLINE_RECV */\r
+               cl_perf_stop( &p_port->p_adapter->perf, GetEndptByGid );\r
+\r
+               /*\r
+                * Lookup the destination endpoint based on GID.\r
+                * This is used along with the packet filter to determine\r
+                * whether to report this to NDIS.\r
+                */\r
+               cl_perf_start( GetEndptByGid );\r
+               *pp_dst =\r
+#if IPOIB_INLINE_RECV\r
+                       __endpt_mgr_get_by_gid( p_port, &p_desc->buf.ib.grh.dest_gid );\r
+#else  /* IPOIB_INLINE_RECV */\r
+                       __endpt_mgr_get_by_gid( p_port, &p_desc->p_buf->ib.grh.dest_gid );\r
+#endif /* IPOIB_INLINE_RECV */\r
+               cl_perf_stop( &p_port->p_adapter->perf, GetEndptByGid );\r
+\r
+               /*\r
+                * Create the source endpoint if it does not exist.  Note that we\r
+                * can only do this for globally routed traffic since we need the\r
+                * information from the GRH to generate the MAC.\r
+                */\r
+               if( !*pp_src )\r
+               {\r
+                       status = ipoib_mac_from_guid(\r
+#if IPOIB_INLINE_RECV\r
+                               p_desc->buf.ib.grh.src_gid.unicast.interface_id, p_port->p_adapter->params.guid_mask, &mac );\r
+#else  /* IPOIB_INLINE_RECV */\r
+                               p_desc->p_buf->ib.grh.src_gid.unicast.interface_id, p_port->p_adapter->params.guid_mask, &mac );\r
+#endif /* IPOIB_INLINE_RECV */\r
+                       if( status != IB_SUCCESS )\r
+                       {\r
+                               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                       ("ipoib_mac_from_guid returned %s\n",\r
+                                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+                               return;\r
+                       }\r
+\r
+                       /* Create the endpoint. */\r
+#if IPOIB_INLINE_RECV\r
+                       *pp_src = ipoib_endpt_create( &p_desc->buf.ib.grh.src_gid,\r
+#else  /* IPOIB_INLINE_RECV */\r
+                       *pp_src = ipoib_endpt_create( &p_desc->p_buf->ib.grh.src_gid,\r
+#endif /* IPOIB_INLINE_RECV */\r
+                               p_wc->recv.ud.remote_lid, p_wc->recv.ud.remote_qp );\r
+                       if( !*pp_src )\r
+                       {\r
+                               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                       ("ipoib_endpt_create failed\n") );\r
+                               return;\r
+                       }\r
+                       cl_perf_start( EndptInsert );\r
+                       cl_obj_lock( &p_port->obj );\r
+                       status = __endpt_mgr_insert( p_port, mac, *pp_src );\r
+                       if( status != IB_SUCCESS )\r
+                       {\r
+                               cl_obj_unlock( &p_port->obj );\r
+                               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                       ("__endpt_mgr_insert returned %s\n",\r
+                                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+                               *pp_src = NULL;\r
+                               return;\r
+                       }\r
+                       cl_obj_unlock( &p_port->obj );\r
+                       cl_perf_stop( &p_port->p_adapter->perf, EndptInsert );\r
+               }\r
+       }\r
+       else\r
+       {\r
+               /*\r
+                * Lookup the remote endpoint based on LID.  Note that only\r
+                * unicast traffic can be LID routed.\r
+                */\r
+               cl_perf_start( GetEndptByLid );\r
+               *pp_src = __endpt_mgr_get_by_lid( p_port, p_wc->recv.ud.remote_lid );\r
+               cl_perf_stop( &p_port->p_adapter->perf, GetEndptByLid );\r
+               *pp_dst = p_port->p_local_endpt;\r
+               CL_ASSERT( *pp_dst );\r
+       }\r
+\r
+       if( *pp_src && !ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) &&\r
+               (*pp_src)->qpn != p_wc->recv.ud.remote_qp )\r
+       {\r
+               /* Update the QPN for the endpoint. */\r
+               IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,\r
+                       ("Updating QPN for MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",\r
+                       (*pp_src )->mac.addr[0], (*pp_src )->mac.addr[1],\r
+                       (*pp_src )->mac.addr[2], (*pp_src )->mac.addr[3],\r
+                       (*pp_src )->mac.addr[4], (*pp_src )->mac.addr[5]) );\r
+//             (*pp_src)->qpn = p_wc->recv.ud.remote_qp;\r
+       }\r
+\r
+       if( *pp_src && *pp_dst )\r
+       {\r
+               IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,\r
+                       ("Recv:\n"\r
+                       "\tsrc MAC: %02X-%02X-%02X-%02X-%02X-%02X\n"\r
+                       "\tdst MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",\r
+                       (*pp_src )->mac.addr[0], (*pp_src )->mac.addr[1],\r
+                       (*pp_src )->mac.addr[2], (*pp_src )->mac.addr[3],\r
+                       (*pp_src )->mac.addr[4], (*pp_src )->mac.addr[5],\r
+                       (*pp_dst )->mac.addr[0], (*pp_dst )->mac.addr[1],\r
+                       (*pp_dst )->mac.addr[2], (*pp_dst )->mac.addr[3],\r
+                       (*pp_dst )->mac.addr[4], (*pp_dst )->mac.addr[5]) );\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_RECV );\r
+}\r
+\r
+\r
+static int32_t\r
+__recv_mgr_filter(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ib_wc_t* const                          p_done_wc_list,\r
+               OUT                     cl_qlist_t* const                       p_done_list,\r
+               OUT                     cl_qlist_t* const                       p_bad_list )\r
+{\r
+       ipoib_recv_desc_t               *p_desc;\r
+       ib_wc_t                                 *p_wc;\r
+       ipoib_pkt_t                             *p_ipoib;\r
+       eth_pkt_t                               *p_eth;\r
+       ipoib_endpt_t                   *p_src, *p_dst;\r
+       ib_api_status_t                 status;\r
+       uint32_t                                len;\r
+       int32_t                                 recv_cnt = 0;\r
+       PERF_DECLARE( GetRecvEndpts );\r
+       PERF_DECLARE( RecvGen );\r
+       PERF_DECLARE( RecvTcp );\r
+       PERF_DECLARE( RecvUdp );\r
+       PERF_DECLARE( RecvDhcp );\r
+       PERF_DECLARE( RecvArp );\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_RECV );\r
+\r
+       for( p_wc = p_done_wc_list; p_wc; p_wc = p_wc->p_next )\r
+       {\r
+               CL_ASSERT( p_wc->status != IB_WCS_SUCCESS || p_wc->wc_type == IB_WC_RECV );\r
+               p_desc = (ipoib_recv_desc_t*)(uintn_t)p_wc->wr_id;\r
+               recv_cnt++;\r
+\r
+               if( p_wc->status != IB_WCS_SUCCESS )\r
+               {\r
+                       if( p_wc->status != IB_WCS_WR_FLUSHED_ERR )\r
+                       {\r
+                               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                       ("Failed completion %s  (vendor specific %#x)\n",\r
+                                       p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status ),\r
+                                       (int)p_wc->vendor_specific) );\r
+                               ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );\r
+                       }\r
+                       else\r
+                       {\r
+                               IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,\r
+                                       ("Flushed completion %s\n",\r
+                                       p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status )) );\r
+                               ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_DROPPED, 0, 0 );\r
+                       }\r
+                       cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );\r
+                       /* Dereference the port object on behalf of the failed receive. */\r
+                       ipoib_port_deref( p_port, ref_failed_recv_wc );\r
+                       continue;\r
+               }\r
+\r
+               len = p_wc->length - sizeof(ib_grh_t);\r
+\r
+               if( len < sizeof(ipoib_hdr_t) )\r
+               {\r
+                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Received ETH packet < min size\n") );\r
+                       ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );\r
+                       cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );\r
+                       ipoib_port_deref( p_port, ref_recv_inv_len );\r
+                       continue;\r
+               }\r
+\r
+               if((len - sizeof(ipoib_hdr_t)) > p_port->p_adapter->params.payload_mtu)\r
+               {\r
+                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Received ETH packet len %d > payload MTU (%d)\n",\r
+                               (len - sizeof(ipoib_hdr_t)),\r
+                               p_port->p_adapter->params.payload_mtu) );\r
+                       ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );\r
+                       cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );\r
+                       ipoib_port_deref( p_port, ref_recv_inv_len );\r
+                       continue;\r
+                       \r
+               }\r
+               /* Successful completion.  Get the receive information. */\r
+               p_desc->ndis_csum.Value = ( ( p_wc->recv.ud.recv_opt & IB_RECV_OPT_CSUM_MASK ) >> 8 );\r
+               p_desc->len = len + 14 - 4 ;\r
+               cl_perf_start( GetRecvEndpts );\r
+               __recv_get_endpts( p_port, p_desc, p_wc, &p_src, &p_dst );\r
+               cl_perf_stop( &p_port->p_adapter->perf, GetRecvEndpts );\r
+\r
+#if IPOIB_INLINE_RECV\r
+               p_ipoib = &p_desc->buf.ib.pkt;\r
+               p_eth = &p_desc->buf.eth.pkt;\r
+#else  /* IPOIB_INLINE_RECV */\r
+               p_ipoib = &p_desc->p_buf->ib.pkt;\r
+               p_eth = &p_desc->p_buf->eth.pkt;\r
+#endif /*IPOIB_INLINE_RECV */\r
+\r
+               if( p_src )\r
+               {\r
+                       /* Don't report loopback traffic - we requested SW loopback. */\r
+                       if( !cl_memcmp( &p_port->p_adapter->params.conf_mac,\r
+                               &p_src->mac, sizeof(p_port->p_adapter->params.conf_mac) ) )\r
+                       {\r
+                               /*\r
+                                * "This is not the packet you're looking for" - don't update\r
+                                * receive statistics, the packet never happened.\r
+                                */\r
+                               cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );\r
+                               /* Dereference the port object on behalf of the failed recv. */\r
+                               ipoib_port_deref( p_port, ref_recv_loopback );\r
+                               continue;\r
+                       }\r
+               }\r
+\r
+               switch( p_ipoib->hdr.type )\r
+               {\r
+               case ETH_PROT_TYPE_IP:\r
+                       if( len < (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t)) )\r
+                       {\r
+                               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                       ("Received IP packet < min size\n") );\r
+                               status = IB_INVALID_SETTING;\r
+                               break;\r
+                       }\r
+\r
+                       if( p_ipoib->type.ip.hdr.offset ||\r
+                               p_ipoib->type.ip.hdr.prot != IP_PROT_UDP )\r
+                       {\r
+                               /* Unfiltered.  Setup the ethernet header and report. */\r
+                               cl_perf_start( RecvTcp );\r
+                               status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );\r
+                               cl_perf_stop( &p_port->p_adapter->perf, RecvTcp );\r
+                               break;\r
+                       }\r
+\r
+                       /* First packet of a UDP transfer. */\r
+                       if( len <\r
+                               (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t) + sizeof(udp_hdr_t)) )\r
+                       {\r
+                               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                       ("Received UDP packet < min size\n") );\r
+                               status = IB_INVALID_SETTING;\r
+                               break;\r
+                       }\r
+\r
+                       /* Check if DHCP conversion is required. */\r
+                       if( (p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_SERVER &&\r
+                               p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_CLIENT) ||\r
+                               (p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_CLIENT &&\r
+                               p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_SERVER) )\r
+                       {\r
+                               if( len < (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t) +\r
+                                       sizeof(udp_hdr_t) + DHCP_MIN_SIZE) )\r
+                               {\r
+                                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                               ("Received DHCP < min size\n") );\r
+                                       status = IB_INVALID_SETTING;\r
+                                       break;\r
+                               }\r
+                               if ((p_ipoib->type.ip.hdr.ver_hl & 0x0f) != 5 ) {\r
+                                       // If there are IP options in this message, we are in trouble in any case\r
+                                       status = IB_INVALID_SETTING;\r
+                                       break;                                  \r
+                               }\r
+                               /* UDP packet with BOOTP ports in src/dst port numbers. */\r
+                               cl_perf_start( RecvDhcp );\r
+                               status = __recv_dhcp( p_port, p_ipoib, p_eth, p_src, p_dst );\r
+                               cl_perf_stop( &p_port->p_adapter->perf, RecvDhcp );\r
+                       }\r
+                       else\r
+                       {\r
+                               /* Unfiltered.  Setup the ethernet header and report. */\r
+                               cl_perf_start( RecvUdp );\r
+                               status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );\r
+                               cl_perf_stop( &p_port->p_adapter->perf, RecvUdp );\r
+                       }\r
+                       break;\r
+\r
+               case ETH_PROT_TYPE_ARP:\r
+                       if( len < (sizeof(ipoib_hdr_t) + sizeof(ipoib_arp_pkt_t)) )\r
+                       {\r
+                               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                       ("Received ARP < min size\n") );\r
+                               status = IB_INVALID_SETTING;\r
+                               break;\r
+                       }\r
+                       cl_perf_start( RecvArp );\r
+                       status = __recv_arp( p_port, p_wc, p_ipoib, p_eth, &p_src, p_dst );\r
+                       cl_perf_stop( &p_port->p_adapter->perf, RecvArp );\r
+                       len = sizeof(ipoib_hdr_t) + sizeof(arp_pkt_t);\r
+                       break;\r
+\r
+               default:\r
+                       /* Unfiltered.  Setup the ethernet header and report. */\r
+                       cl_perf_start( RecvGen );\r
+                       status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );\r
+                       cl_perf_stop( &p_port->p_adapter->perf, RecvGen );\r
+               }\r
+\r
+               if( status != IB_SUCCESS )\r
+               {\r
+                       /* Update stats. */\r
+                       ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );\r
+                       cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );\r
+                       /* Dereference the port object on behalf of the failed receive. */\r
+                       ipoib_port_deref( p_port, ref_recv_filter );\r
+               }\r
+               else\r
+               {\r
+                       ip_stat_sel_t               ip_stat;\r
+                       p_desc->len =\r
+                               len + sizeof(eth_hdr_t) - sizeof(ipoib_hdr_t);\r
+                       if( p_dst->h_mcast)\r
+                       {\r
+                               if( p_dst->dgid.multicast.raw_group_id[10] == 0xFF &&\r
+                                       p_dst->dgid.multicast.raw_group_id[11] == 0xFF &&\r
+                                       p_dst->dgid.multicast.raw_group_id[12] == 0xFF &&\r
+                                       p_dst->dgid.multicast.raw_group_id[13] == 0xFF )\r
+                               {\r
+                                       p_desc->type = PKT_TYPE_BCAST;\r
+                                       ip_stat = IP_STAT_BCAST_BYTES;\r
+                               }\r
+                               else\r
+                               {\r
+                                       p_desc->type = PKT_TYPE_MCAST;\r
+                                       ip_stat = IP_STAT_MCAST_BYTES;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               p_desc->type = PKT_TYPE_UCAST;\r
+                               ip_stat = IP_STAT_UCAST_BYTES;\r
+                               \r
+                       }\r
+                       cl_qlist_insert_tail( p_done_list, &p_desc->item.list_item );\r
+                       ipoib_inc_recv_stat( p_port->p_adapter, ip_stat, len, 1 );  \r
+               }\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_RECV );\r
+       return recv_cnt;\r
+}\r
+\r
+\r
+static ib_api_status_t\r
+__recv_gen(\r
+       IN              const   ipoib_pkt_t* const                      p_ipoib,\r
+               OUT                     eth_pkt_t* const                        p_eth,\r
+       IN                              ipoib_endpt_t* const            p_src,\r
+       IN                              ipoib_endpt_t* const            p_dst )\r
+{\r
+       IPOIB_ENTER( IPOIB_DBG_RECV );\r
+\r
+       if( !p_src || !p_dst )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Received packet with no matching endpoints.\n") );\r
+               return IB_NOT_DONE;\r
+       }\r
+\r
+       /*\r
+        * Fill in the ethernet header.  Note that doing so will overwrite\r
+        * the IPoIB header, so start by moving the information from the IPoIB\r
+        * header.\r
+        */\r
+       p_eth->hdr.type = p_ipoib->hdr.type;\r
+       p_eth->hdr.src = p_src->mac;\r
+       p_eth->hdr.dst = p_dst->mac;\r
+\r
+       if ( p_eth->hdr.dst.addr[0] == 1 && \r
+                p_eth->hdr.type == ETH_PROT_TYPE_IP &&\r
+                p_eth->hdr.dst.addr[2] == 0x5E)  \r
+       {\r
+               p_eth->hdr.dst.addr[1] = 0;\r
+               p_eth->hdr.dst.addr[3] = p_eth->hdr.dst.addr[3] & 0x7f;\r
+       }\r
+       if (p_dst->h_mcast)\r
+               p_dst->is_in_use = TRUE;\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_RECV );\r
+       return IB_SUCCESS;\r
+}\r
+\r
+\r
+static ib_api_status_t\r
+__recv_dhcp(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   ipoib_pkt_t* const                      p_ipoib,\r
+               OUT                     eth_pkt_t* const                        p_eth,\r
+       IN                              ipoib_endpt_t* const            p_src,\r
+       IN                              ipoib_endpt_t* const            p_dst )\r
+{\r
+       ib_api_status_t         status;\r
+       dhcp_pkt_t                      *p_dhcp;\r
+       uint8_t                         *p_option;\r
+       uint8_t                         *p_cid = NULL;\r
+       ib_gid_t                        gid;\r
+       uint8_t                         msg = 0;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_RECV );\r
+\r
+       UNUSED_PARAM( p_port );\r
+\r
+       /* Create the ethernet header. */\r
+       status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("__recv_gen returned %s.\n", \r
+                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+               return status;\r
+       }\r
+\r
+       /* Fixup the payload. */\r
+       p_dhcp = &p_eth->type.ip.prot.udp.dhcp;\r
+       if( p_dhcp->op != DHCP_REQUEST && p_dhcp->op != DHCP_REPLY )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Invalid DHCP op code.\n") );\r
+               return IB_INVALID_SETTING;\r
+       }\r
+\r
+       /*\r
+        * Find the client identifier option, making sure to skip\r
+        * the "magic cookie".\r
+        */\r
+       p_option = &p_dhcp->options[0];\r
+       if ( *(uint32_t *)p_option != DHCP_COOKIE )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("DHCP cookie corrupted.\n") );\r
+               return IB_INVALID_PARAMETER;\r
+       }\r
+\r
+       p_option = &p_dhcp->options[4];\r
+       while( *p_option != DHCP_OPT_END && p_option < &p_dhcp->options[312] )\r
+       {\r
+               switch( *p_option )\r
+               {\r
+               case DHCP_OPT_PAD:\r
+                       p_option++;\r
+                       break;\r
+\r
+               case DHCP_OPT_MSG:\r
+                       msg = p_option[2];\r
+                       p_option += 3;\r
+                       break;\r
+\r
+               case DHCP_OPT_CLIENT_ID:\r
+                       p_cid = p_option;\r
+                       /* Fall through. */\r
+\r
+               default:\r
+                       /*\r
+                        * All other options have a length byte following the option code.\r
+                        * Offset by the length to get to the next option.\r
+                        */\r
+                       p_option += (p_option[1] + 2);\r
+               }\r
+       }\r
+\r
+       switch( msg )\r
+       {\r
+       /* message from client */\r
+       case DHCPDISCOVER:\r
+       case DHCPREQUEST:\r
+       case DHCPDECLINE:\r
+       case DHCPRELEASE:\r
+       case DHCPINFORM:\r
+               if( !p_cid )\r
+               {\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Failed to find required Client-identifier option.\n") );\r
+                       return IB_INVALID_SETTING;\r
+               }\r
+               if( p_dhcp->htype != DHCP_HW_TYPE_IB )\r
+               {\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Invalid hardware address type.\n") );\r
+                       return IB_INVALID_SETTING;\r
+               }\r
+               break;\r
+       /* message from DHCP server */\r
+       case DHCPOFFER:\r
+       case DHCPACK:\r
+       case DHCPNAK:\r
+               break;\r
+\r
+       default:\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Invalide message type.\n") );\r
+               return IB_INVALID_PARAMETER;\r
+       }\r
+       p_eth->type.ip.prot.udp.hdr.chksum = 0;\r
+       p_dhcp->htype = DHCP_HW_TYPE_ETH;\r
+       p_dhcp->hlen = HW_ADDR_LEN;\r
+\r
+       if( p_cid ) /* from client */\r
+       {\r
+               /* Validate that the length and type of the option is as required. */\r
+               if( p_cid[1] != 21 )\r
+               {\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Client-identifier length not 21 as required.\n") );\r
+                       return IB_INVALID_SETTING;\r
+               }\r
+               if( p_cid[2] != DHCP_HW_TYPE_IB )\r
+               {\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Client-identifier type is wrong.\n") );\r
+                       return IB_INVALID_SETTING;\r
+               }\r
+               /*\r
+                * Copy the GID value from the option so that we can make aligned\r
+                * accesses to the contents.\r
+                * Recover CID to standard type.\r
+                */\r
+               cl_memcpy( &gid, &p_cid[7], sizeof(ib_gid_t) );\r
+               p_cid[1] =  HW_ADDR_LEN +1;// CID length \r
+               p_cid[2] =  DHCP_HW_TYPE_ETH;// CID type \r
+               status = ipoib_mac_from_guid( gid.unicast.interface_id, p_port->p_adapter->params.guid_mask, (mac_addr_t*)&p_cid[3] );\r
+               if (status == IB_INVALID_GUID_MASK)\r
+               {\r
+                       IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_ERROR,\r
+                               ("Invalid GUID mask received, rejecting it") );\r
+                       ipoib_create_log(p_port->p_adapter->h_adapter, GUID_MASK_LOG_INDEX, EVENT_IPOIB_WRONG_PARAMETER_WRN);\r
+                       status = IB_SUCCESS;\r
+               }\r
+               p_cid[HW_ADDR_LEN + 3] = DHCP_OPT_END; //terminate tag\r
+       }\r
+       IPOIB_EXIT( IPOIB_DBG_RECV );\r
+       return status;\r
+}\r
+\r
+\r
+static ib_api_status_t\r
+__recv_arp(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ib_wc_t* const                          p_wc,\r
+       IN              const   ipoib_pkt_t* const                      p_ipoib,\r
+               OUT                     eth_pkt_t* const                        p_eth,\r
+       IN                              ipoib_endpt_t** const           pp_src,\r
+       IN                              ipoib_endpt_t* const            p_dst )\r
+{\r
+       ib_api_status_t                 status;\r
+       arp_pkt_t                               *p_arp;\r
+       const ipoib_arp_pkt_t   *p_ib_arp;\r
+       ib_gid_t                                gid;\r
+       mac_addr_t                              mac;\r
+       ipoib_hw_addr_t                 null_hw = {0};\r
+       uint8_t                                 cm_capable = 0;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_RECV );\r
+\r
+       if( !p_dst )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Unknown destination endpoint\n") );\r
+               return IB_INVALID_SETTING;\r
+       }\r
+\r
+       p_ib_arp = &p_ipoib->type.arp;\r
+       p_arp = &p_eth->type.arp;\r
+\r
+       if( p_ib_arp->hw_type != ARP_HW_TYPE_IB )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ARP hardware type is not IB\n") );\r
+               return IB_INVALID_SETTING;\r
+       }\r
+\r
+       if( p_ib_arp->hw_size != sizeof(ipoib_hw_addr_t) )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ARP hardware address size is not sizeof(ipoib_hw_addr_t)\n") );\r
+               return IB_INVALID_SETTING;\r
+       }\r
+\r
+       if( p_ib_arp->prot_type != ETH_PROT_TYPE_IP )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ARP protocal type not IP\n") );\r
+               return IB_INVALID_SETTING;\r
+       }\r
+\r
+       cm_capable = ipoib_addr_get_flags( &p_ib_arp->src_hw );\r
+\r
+       /*\r
+        * If we don't have a source, lookup the endpoint specified in the payload.\r
+        */\r
+       if( !*pp_src )\r
+               *pp_src = __endpt_mgr_get_by_gid( p_port, &p_ib_arp->src_hw.gid );\r
+\r
+       /*\r
+        * If the endpoint exists for the GID, make sure\r
+        * the dlid and qpn match the arp.\r
+        */\r
+       if( *pp_src )\r
+       {\r
+               if( cl_memcmp( &(*pp_src)->dgid, &p_ib_arp->src_hw.gid,\r
+                       sizeof(ib_gid_t) ) )\r
+               {\r
+                       /*\r
+                        * GIDs for the endpoint are different.  The ARP must\r
+                        * have been proxied.  Dereference it.\r
+                        */\r
+                       *pp_src = NULL;\r
+               }\r
+               else if( (*pp_src)->dlid &&\r
+                       (*pp_src)->dlid != p_wc->recv.ud.remote_lid )\r
+               {\r
+                       /* Out of date!  Destroy the endpoint and replace it. */\r
+                       __endpt_mgr_remove( p_port, *pp_src );\r
+                       *pp_src = NULL;\r
+               }\r
+               else if ( ! ((*pp_src)->dlid)) {\r
+                       /* Out of date!  Destroy the endpoint and replace it. */\r
+                       __endpt_mgr_remove( p_port, *pp_src );\r
+                       *pp_src = NULL;\r
+               }\r
+               else if( ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) )\r
+               {\r
+                       if( (*pp_src)->qpn != ipoib_addr_get_qpn( &p_ib_arp->src_hw ) &&\r
+                                p_wc->recv.ud.remote_qp !=     ipoib_addr_get_qpn( &p_ib_arp->src_hw ) )\r
+                       {\r
+                               /* Out of date!  Destroy the endpoint and replace it. */\r
+                               __endpt_mgr_remove( p_port, *pp_src );\r
+                               *pp_src = NULL;\r
+                       }\r
+               }\r
+               else if( (*pp_src)->qpn != p_wc->recv.ud.remote_qp )\r
+               {\r
+                       /* Out of date!  Destroy the endpoint and replace it. */\r
+                       __endpt_mgr_remove( p_port, *pp_src );\r
+                       *pp_src = NULL;\r
+               }\r
+       }\r
+\r
+       /* Do we need to create an endpoint for this GID? */\r
+       if( !*pp_src )\r
+       {\r
+               /* Copy the src GID to allow aligned access */\r
+               cl_memcpy( &gid, &p_ib_arp->src_hw.gid, sizeof(ib_gid_t) );\r
+               status = ipoib_mac_from_guid( gid.unicast.interface_id, p_port->p_adapter->params.guid_mask, &mac );\r
+               if (status == IB_INVALID_GUID_MASK)\r
+               {\r
+                       IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_ERROR,\r
+                               ("Invalid GUID mask received, rejecting it") );\r
+                       ipoib_create_log(p_port->p_adapter->h_adapter, GUID_MASK_LOG_INDEX, EVENT_IPOIB_WRONG_PARAMETER_WRN);\r
+               }\r
+               else if( status != IB_SUCCESS )\r
+               {\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("ipoib_mac_from_guid returned %s\n",\r
+                               p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+                       return status;\r
+               }\r
+               /*\r
+                * Create the endpoint.\r
+                */\r
+               *pp_src = ipoib_endpt_create( &p_ib_arp->src_hw.gid,\r
+                       p_wc->recv.ud.remote_lid, ipoib_addr_get_qpn( &p_ib_arp->src_hw ) );\r
+\r
+               if( !*pp_src )\r
+               {\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("ipoib_endpt_create failed\n") );\r
+                       return status;\r
+               }\r
+\r
+               cl_obj_lock( &p_port->obj );\r
+               status = __endpt_mgr_insert( p_port, mac, *pp_src );\r
+               if( status != IB_SUCCESS )\r
+               {\r
+                       cl_obj_unlock( &p_port->obj );\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("__endpt_mgr_insert return %s \n",\r
+                               p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+                       return status;\r
+               }\r
+\r
+               cl_obj_unlock( &p_port->obj );\r
+       }\r
+\r
+       (*pp_src)->cm_flag = cm_capable;\r
+\r
+       CL_ASSERT( !cl_memcmp(\r
+               &(*pp_src)->dgid, &p_ib_arp->src_hw.gid, sizeof(ib_gid_t) ) );\r
+       CL_ASSERT( ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) ||\r
+               (*pp_src)->qpn == ipoib_addr_get_qpn( &p_ib_arp->src_hw ) );\r
+#if 0\r
+       if( p_port->p_adapter->params.cm_enabled &&\r
+               p_ib_arp->op == ARP_OP_REQ &&\r
+               cm_capable == IPOIB_CM_FLAG_RC )\r
+       {\r
+               /* if we've got ARP request and RC flag is set, \r
+               save SID for connect REQ to be sent in ARP reply\r
+               when requestor's path get resolved */\r
+               if( endpt_cm_get_state( (*pp_src) ) == IPOIB_CM_DISCONNECTED )\r
+               {\r
+                       (*pp_src)->cm_flag = cm_capable;\r
+                       ipoib_addr_set_sid( \r
+                               &(*pp_src)->conn.service_id,\r
+                               ipoib_addr_get_qpn( &p_ib_arp->src_hw ) );\r
+               }\r
+       }\r
+#endif\r
+#if 0 //DBG\r
+       if( p_port->p_adapter->params.cm_enabled )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+                       (" ARP %s from ENDPT[%p] state %d CM cap: %d QPN: %#x MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",\r
+                       ((p_ib_arp->op == ARP_OP_REQ )? "REQUEST" : "REPLY"),\r
+                       *pp_src, endpt_cm_get_state( *pp_src ), \r
+                       ((cm_capable == IPOIB_CM_FLAG_RC)? 1: 0),\r
+                       cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->src_hw ) ),\r
+                       (*pp_src)->mac.addr[0], (*pp_src)->mac.addr[1],\r
+                       (*pp_src)->mac.addr[2], (*pp_src)->mac.addr[3],\r
+                       (*pp_src)->mac.addr[4], (*pp_src)->mac.addr[5] ));\r
+       }\r
+#endif\r
+\r
+       /* Now swizzle the data. */\r
+       p_arp->hw_type = ARP_HW_TYPE_ETH;\r
+       p_arp->hw_size = sizeof(mac_addr_t);\r
+       p_arp->src_hw = (*pp_src)->mac;\r
+       p_arp->src_ip = p_ib_arp->src_ip;\r
+\r
+       if( cl_memcmp( &p_ib_arp->dst_hw, &null_hw, sizeof(ipoib_hw_addr_t) ) )\r
+       {\r
+               if( cl_memcmp( &p_dst->dgid, &p_ib_arp->dst_hw.gid, sizeof(ib_gid_t) ) )\r
+               {\r
+                       /*\r
+                        * We received bcast ARP packet that means\r
+                        * remote port lets everyone know it was changed IP/MAC\r
+                        * or just activated\r
+                        */\r
+\r
+                       /* Guy: TODO: Check why this check fails in case of Voltaire IPR */\r
+\r
+                       if ( !ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) &&\r
+                                !ib_gid_is_multicast( (const ib_gid_t*)&p_dst->dgid ) )\r
+                       {\r
+                               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                       ("ARP: is not ARP MCAST\n") );\r
+                               return IB_INVALID_SETTING;\r
+                       }\r
+\r
+                       p_arp->dst_hw = p_port->p_local_endpt->mac;\r
+                       p_dst->mac = p_port->p_local_endpt->mac;\r
+                       /*\r
+                        * we don't care what receiver ip addr is,\r
+                        * as long as OS' ARP table is global  ???\r
+                        */\r
+                       p_arp->dst_ip = (net32_t)0;\r
+               }\r
+               else /* we've got reply to our ARP request */\r
+               {\r
+                       p_arp->dst_hw = p_dst->mac;\r
+                       p_arp->dst_ip = p_ib_arp->dst_ip;\r
+                       CL_ASSERT( p_dst->qpn == ipoib_addr_get_qpn( &p_ib_arp->dst_hw ) );\r
+               }\r
+       }\r
+       else /* we got ARP reqeust */\r
+       {\r
+               cl_memclr( &p_arp->dst_hw, sizeof(mac_addr_t) );\r
+               p_arp->dst_ip = p_ib_arp->dst_ip;\r
+       }\r
+\r
+       /*\r
+        * Create the ethernet header.  Note that this is done last so that\r
+        * we have a chance to create a new endpoint.\r
+        */\r
+       status = __recv_gen( p_ipoib, p_eth, *pp_src, p_dst );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("__recv_gen returned %s.\n", \r
+                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+               return status;\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_RECV );\r
+       return IB_SUCCESS;\r
+}\r
+\r
+\r
+static ib_api_status_t\r
+__recv_mgr_prepare_pkt(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ipoib_recv_desc_t*      const   p_desc,\r
+               OUT                     NET_BUFFER_LIST** const         pp_net_buffer_list )\r
+{\r
+       NDIS_STATUS                                                     status;\r
+       uint32_t                                                        pkt_filter;\r
+       ip_stat_sel_t                                           type;\r
+       //NDIS60\r
+       NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO       chksum;\r
+       //NDIS_TCP_IP_CHECKSUM_PACKET_INFO      chksum;\r
+\r
+       PERF_DECLARE( GetNdisPkt );\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_RECV );\r
+\r
+       pkt_filter = p_port->p_adapter->packet_filter;\r
+       /* Check the packet filter. */\r
+       switch( p_desc->type )\r
+       {\r
+       default:\r
+       case PKT_TYPE_UCAST:\r
+               \r
+               if( pkt_filter & NDIS_PACKET_TYPE_PROMISCUOUS ||\r
+                       pkt_filter & NDIS_PACKET_TYPE_ALL_FUNCTIONAL ||\r
+                       pkt_filter & NDIS_PACKET_TYPE_SOURCE_ROUTING ||\r
+                       pkt_filter & NDIS_PACKET_TYPE_DIRECTED )\r
+               {\r
+                       /* OK to report. */\r
+                       type = IP_STAT_UCAST_BYTES;\r
+                       status = NDIS_STATUS_SUCCESS;\r
+                       IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR,\r
+                       ("Received UCAST PKT.\n"));\r
+               }\r
+               else\r
+               {\r
+                       type = IP_STAT_DROPPED;\r
+                       status = NDIS_STATUS_FAILURE;\r
+                       IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR,\r
+                       ("Received UCAST PKT with ERROR !!!!\n"));\r
+               }\r
+               break;\r
+       case PKT_TYPE_BCAST:\r
+               if( pkt_filter & NDIS_PACKET_TYPE_PROMISCUOUS ||\r
+                       pkt_filter & NDIS_PACKET_TYPE_BROADCAST )\r
+               {\r
+                       /* OK to report. */\r
+                       type = IP_STAT_BCAST_BYTES;\r
+                       status = NDIS_STATUS_SUCCESS;\r
+                       IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR,\r
+                       ("Received BCAST PKT.\n"));\r
+               }\r
+               else\r
+               {\r
+                       type = IP_STAT_DROPPED;\r
+                       status = NDIS_STATUS_FAILURE;\r
+                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Received BCAST PKT with ERROR !!!!\n"));\r
+               }\r
+               break;\r
+       case PKT_TYPE_MCAST:\r
+               if( pkt_filter & NDIS_PACKET_TYPE_PROMISCUOUS ||\r
+                       pkt_filter & NDIS_PACKET_TYPE_ALL_MULTICAST ||\r
+                       pkt_filter & NDIS_PACKET_TYPE_MULTICAST )\r
+               {\r
+                       /* OK to report. */\r
+                       type = IP_STAT_MCAST_BYTES;\r
+                       status = NDIS_STATUS_SUCCESS;\r
+                       IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR,\r
+                       ("Received UCAST PKT.\n"));\r
+               }\r
+               else\r
+               {\r
+                       type = IP_STAT_DROPPED;\r
+                       status = NDIS_STATUS_FAILURE;\r
+                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Received MCAST PKT with ERROR !!!!\n"));\r
+               }\r
+               break;\r
+       }\r
+\r
+       if( status != NDIS_STATUS_SUCCESS )\r
+       {\r
+               ipoib_inc_recv_stat( p_port->p_adapter, type, 0, 0 );\r
+               /* Return the receive descriptor to the pool. */\r
+               __buf_mgr_put_recv( p_port, p_desc, NULL );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_RECV,\r
+                       ("Packet filter doesn't match receive.  Dropping.\n") );\r
+               /*\r
+                * Return IB_NOT_DONE since the packet has been completed,\r
+                * but has not consumed an array entry.\r
+                */\r
+               return IB_NOT_DONE;\r
+       }\r
+\r
+       cl_perf_start( GetNdisPkt );\r
+       *pp_net_buffer_list = __buf_mgr_get_ndis_pkt( p_port, p_desc );\r
+       cl_perf_stop( &p_port->p_adapter->perf, GetNdisPkt );\r
+       if( !*pp_net_buffer_list )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("__buf_mgr_get_ndis_pkt failed\n") );\r
+               return IB_INSUFFICIENT_RESOURCES;\r
+       }\r
+\r
+       chksum.Value = 0;\r
+\r
+{\r
+       PNET_BUFFER NetBuffer = NET_BUFFER_LIST_FIRST_NB(*pp_net_buffer_list);\r
+       NET_BUFFER_DATA_LENGTH(NetBuffer) = p_desc->len;\r
+}\r
+       \r
+       switch( p_port->p_adapter->params.recv_chksum_offload )\r
+       {\r
+         default:\r
+               CL_ASSERT( FALSE );\r
+         case CSUM_DISABLED:\r
+               //NDIS60\r
+               //NDIS_PER_PACKET_INFO_FROM_PACKET( *pp_packet, TcpIpChecksumPacketInfo ) =\r
+               //(void*)(uintn_t)chksum.Value;\r
+               NET_BUFFER_LIST_INFO(*pp_net_buffer_list, TcpIpChecksumNetBufferListInfo) = \r
+               (void*)(uintn_t)chksum.Value;\r
+               break;\r
+         case CSUM_ENABLED:\r
+               /* Get the checksums directly from packet information. */\r
+               /* In this case, no one of cheksum's cat get false value */\r
+               /* If hardware checksum failed or wasn't calculated, NDIS will recalculate it again */\r
+               //NDIS60\r
+               //NDIS_PER_PACKET_INFO_FROM_PACKET( *pp_packet, TcpIpChecksumPacketInfo ) = \r
+               NET_BUFFER_LIST_INFO(*pp_net_buffer_list, TcpIpChecksumNetBufferListInfo) =\r
+                       (void*)(uintn_t)(p_desc->ndis_csum.Value);\r
+               break;\r
+         case CSUM_BYPASS:\r
+               /* Flag the checksums as having been calculated. */\r
+               chksum.Receive.TcpChecksumSucceeded = TRUE;\r
+               chksum.Receive.UdpChecksumSucceeded = TRUE;\r
+               chksum.Receive.IpChecksumSucceeded = TRUE;\r
+               //NDIS60\r
+               //NDIS_PER_PACKET_INFO_FROM_PACKET( *pp_packet, TcpIpChecksumPacketInfo ) =\r
+               NET_BUFFER_LIST_INFO(*pp_net_buffer_list, TcpIpChecksumNetBufferListInfo) =\r
+               (void*)(uintn_t)chksum.Value;\r
+               break;\r
+       }\r
+       ipoib_inc_recv_stat( p_port->p_adapter, type, p_desc->len, 1 );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_RECV );\r
+       return IB_SUCCESS;\r
+}\r
+\r
+\r
+static uint32_t\r
+__recv_mgr_build_pkt_array(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              int32_t                                         shortage,\r
+               OUT                     cl_qlist_t* const                       p_done_list,\r
+               OUT                     int32_t* const                          p_discarded )\r
+{\r
+       cl_list_item_t                  *p_item;\r
+       ipoib_recv_desc_t               *p_desc;\r
+       uint32_t                                i = 0;\r
+       ib_api_status_t                 status;\r
+       PERF_DECLARE( PreparePkt );\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_RECV );\r
+\r
+       *p_discarded = 0;\r
+\r
+       /* Move any existing receives to the head to preserve ordering. */\r
+       cl_qlist_insert_list_head( p_done_list, &p_port->recv_mgr.done_list );\r
+       p_item = cl_qlist_remove_head( p_done_list );\r
+       while( p_item != cl_qlist_end( p_done_list ) )\r
+       {\r
+               p_desc = (ipoib_recv_desc_t*)p_item;\r
+\r
+               cl_perf_start( PreparePkt );\r
+               status = __recv_mgr_prepare_pkt( p_port, p_desc,\r
+                       &p_port->recv_mgr.recv_pkt_array[i] );\r
+               cl_perf_stop( &p_port->p_adapter->perf, PreparePkt );\r
+               if( status == IB_SUCCESS )\r
+               {\r
+                       CL_ASSERT( p_port->recv_mgr.recv_pkt_array[i] );\r
+                       if( shortage-- > 0 )\r
+                       {\r
+                               NET_BUFFER_LIST_STATUS(p_port->recv_mgr.recv_pkt_array[i])= NDIS_STATUS_RESOURCES;                                      \r
+                       }\r
+                       else\r
+                       {\r
+                               NET_BUFFER_LIST_STATUS(p_port->recv_mgr.recv_pkt_array[i])=  NDIS_STATUS_SUCCESS;\r
+                       }\r
+                       i++;\r
+               }\r
+               else if( status == IB_NOT_DONE )\r
+               {\r
+                       (*p_discarded)++;\r
+               }\r
+               else\r
+               {\r
+                       IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,\r
+                               ("__recv_mgr_prepare_pkt returned %s\n",\r
+                               p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+                       /* Put all completed receives on the port's done list. */\r
+                       cl_qlist_insert_tail( &p_port->recv_mgr.done_list, p_item );\r
+                       cl_qlist_insert_list_tail( &p_port->recv_mgr.done_list, p_done_list );\r
+                       break;\r
+               }\r
+\r
+               p_item = cl_qlist_remove_head( p_done_list );\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_RECV );\r
+       return i;\r
+}\r
+\r
+\r
+\r
+\r
+/******************************************************************************\r
+*\r
+* Send manager implementation.\r
+*\r
+******************************************************************************/\r
+static void\r
+__send_mgr_construct(\r
+       IN                              ipoib_port_t* const                     p_port )\r
+{\r
+       IPOIB_ENTER( IPOIB_DBG_SEND );\r
+       p_port->send_mgr.depth = 0;\r
+       cl_qlist_init( &p_port->send_mgr.pending_list );\r
+       IPOIB_EXIT( IPOIB_DBG_SEND );\r
+}\r
+\r
+\r
+static void \r
+__pending_list_destroy(\r
+       IN                              ipoib_port_t* const                     p_port )\r
+{\r
+       cl_list_item_t  *p_item;\r
+       NET_BUFFER_LIST         **pp_net_buffer_list, *p_head;\r
+       \r
+       p_head = NULL;\r
+       cl_spinlock_acquire( &p_port->send_lock );\r
+       /* Complete any pending packets. */\r
+       pp_net_buffer_list = &p_head;\r
+       for( p_item = cl_qlist_remove_head( &p_port->send_mgr.pending_list );\r
+               p_item != cl_qlist_end( &p_port->send_mgr.pending_list );\r
+               p_item = cl_qlist_remove_head( &p_port->send_mgr.pending_list ) )\r
+       {\r
+               *pp_net_buffer_list = IPOIB_PACKET_FROM_LIST_ITEM( p_item );\r
+               NET_BUFFER_LIST_STATUS(*pp_net_buffer_list) = NDIS_STATUS_RESET_IN_PROGRESS;\r
+               pp_net_buffer_list = &(NET_BUFFER_LIST_NEXT_NBL(*pp_net_buffer_list));\r
+       }\r
+       cl_spinlock_release( &p_port->send_lock );\r
+       if(p_head)\r
+               NdisMSendNetBufferListsComplete(\r
+            p_port->p_adapter->h_adapter,\r
+            p_head,\r
+            0);   \r
+}\r
+\r
+static void\r
+__send_mgr_destroy(\r
+       IN                              ipoib_port_t* const                     p_port )\r
+{\r
+       IPOIB_ENTER( IPOIB_DBG_SEND );\r
+       __pending_list_destroy(p_port);\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_SEND );\r
+}\r
+\r
+\r
+static NDIS_STATUS\r
+__send_mgr_filter(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   eth_hdr_t* const                        p_eth_hdr,\r
+       IN                              MDL* const                                      p_mdl,\r
+       IN                              size_t                                          buf_len,\r
+       IN                              SCATTER_GATHER_LIST                     *p_sgl,\r
+       IN      OUT                     ipoib_send_desc_t* const        p_desc )\r
+{\r
+       NDIS_STATUS             status;\r
+\r
+       PERF_DECLARE( FilterIp );\r
+       PERF_DECLARE( FilterArp );\r
+       PERF_DECLARE( SendGen );\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_SEND );\r
+\r
+       /*\r
+        * We already checked the ethernet header length, so we know it's safe\r
+        * to decrement the buf_len without underflowing.\r
+        */\r
+       buf_len -= sizeof(eth_hdr_t);\r
+\r
+       switch( p_eth_hdr->type )\r
+       {\r
+       case ETH_PROT_TYPE_IP:\r
+               cl_perf_start( FilterIp );\r
+               status = __send_mgr_filter_ip(\r
+                       p_port, p_eth_hdr, p_mdl, buf_len, p_sgl, p_desc);\r
+               cl_perf_stop( &p_port->p_adapter->perf, FilterIp );\r
+               break;\r
+\r
+       case ETH_PROT_TYPE_ARP:\r
+               cl_perf_start( FilterArp );\r
+               status = __send_mgr_filter_arp(\r
+                       p_port, p_eth_hdr, p_mdl, buf_len, p_desc );\r
+               p_desc->send_dir = SEND_UD_QP;\r
+               cl_perf_stop( &p_port->p_adapter->perf, FilterArp );\r
+               break;\r
+\r
+       default:\r
+               /*\r
+                * The IPoIB spec doesn't define how to send non IP or ARP packets.\r
+                * Just send the payload and hope for the best.\r
+                */\r
+\r
+               p_desc->send_dir = SEND_UD_QP;\r
+               cl_perf_start( SendGen );\r
+               status = __send_gen( p_port, p_desc, p_sgl, 0 );\r
+               cl_perf_stop( &p_port->p_adapter->perf, SendGen );\r
+               break;\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_SEND );\r
+       return status;\r
+}\r
+\r
+\r
+static NDIS_STATUS\r
+__send_copy(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ipoib_send_desc_t* const        p_desc )\r
+{\r
+       NET_BUFFER_LIST                 *p_net_buffer_list;\r
+       NET_BUFFER                              *p_netbuffer;\r
+       MDL                                             *p_mdl;\r
+       UINT                                    tot_len = 0;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_SEND );\r
+\r
+       UNREFERENCED_PARAMETER(p_port);\r
+       UNREFERENCED_PARAMETER(p_desc);\r
+\r
+       p_desc->p_buf = \r
+               (send_buf_t *) NdisAllocateFromNPagedLookasideList( &p_port->buf_mgr.send_buf_list );\r
+       if( !p_desc->p_buf )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Failed to allocate buffer for packet copy.\n") );\r
+               return NDIS_STATUS_RESOURCES;\r
+       }\r
+\r
+       p_mdl = NdisAllocateMdl(p_port->p_adapter->h_adapter,\r
+                                                       p_desc->p_buf,\r
+                                                       p_port->p_adapter->params.xfer_block_size );\r
+       if( !p_mdl )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Failed to allocate MDL\n") );\r
+               return NDIS_STATUS_RESOURCES;\r
+       }\r
+\r
+       p_net_buffer_list = NdisAllocateNetBufferAndNetBufferList(\r
+                                               p_port->buf_mgr.h_send_buf_pool,\r
+                                               0,\r
+                                               0,\r
+                                               p_mdl,\r
+                                               0,\r
+                                               0);\r
+\r
+       if( !p_net_buffer_list )\r
+       {\r
+               NdisFreeMdl(p_mdl);\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,\r
+                       ("Failed to allocate NDIS_PACKET for copy.\n") );\r
+               return NDIS_STATUS_RESOURCES;\r
+       }\r
+\r
+       for (p_netbuffer = NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list); \r
+                p_netbuffer != NULL;\r
+                p_netbuffer = NET_BUFFER_NEXT_NB(p_netbuffer))\r
+       {\r
+               tot_len +=NET_BUFFER_DATA_LENGTH(p_netbuffer);\r
+       }\r
+\r
+       /* Setup the work request. */\r
+       p_desc->send_wr[0].local_ds[1].vaddr = cl_get_physaddr(\r
+               ((uint8_t*)p_desc->p_buf) + sizeof(eth_hdr_t) );\r
+       p_desc->send_wr[0].local_ds[1].length = tot_len - sizeof(eth_hdr_t);\r
+       p_desc->send_wr[0].local_ds[1].lkey = p_port->ib_mgr.lkey;\r
+       p_desc->send_wr[0].wr.num_ds = 2;\r
+       \r
+       /* Free our temp packet now that the data is copied. */\r
+       NdisFreeMdl(p_mdl);\r
+       NdisFreeNetBufferList(p_net_buffer_list);\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_SEND );\r
+       return NDIS_STATUS_SUCCESS;\r
+}\r
+\r
+static inline NDIS_STATUS\r
+__send_mgr_get_eth_hdr(\r
+       IN                              PNET_BUFFER                                     p_net_buffer,\r
+               OUT                     MDL** const                                     pp_mdl,\r
+               OUT                     eth_hdr_t** const                       pp_eth_hdr,\r
+               OUT                     UINT*                                           p_mdl_len)\r
+{\r
+       PUCHAR  p_head = NULL;\r
+       IPOIB_ENTER( IPOIB_DBG_SEND );\r
+\r
+       *pp_mdl = NET_BUFFER_FIRST_MDL(p_net_buffer);\r
+\r
+       NdisQueryMdl(*pp_mdl,&p_head,p_mdl_len,NormalPagePriority);\r
+       if( ! p_head )\r
+       {\r
+               /* Failed to get first buffer. */\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("NdisQueryMdl failed.\n") );\r
+               return NDIS_STATUS_FAILURE;\r
+       }\r
+\r
+       if( *p_mdl_len < sizeof(eth_hdr_t) )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("First buffer in packet smaller than eth_hdr_t: %d.\n",\r
+                       *p_mdl_len) );\r
+               return NDIS_STATUS_BUFFER_TOO_SHORT;\r
+       }\r
+\r
+       *pp_eth_hdr = (eth_hdr_t*)(p_head + NET_BUFFER_CURRENT_MDL_OFFSET(p_net_buffer));\r
+\r
+       IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,\r
+               ("Ethernet header:\n"\r
+               "\tsrc MAC: %02X-%02X-%02X-%02X-%02X-%02X\n"\r
+               "\tdst MAC: %02X-%02X-%02X-%02X-%02X-%02X\n"\r
+               "\tprotocol type: %04X\n",\r
+               (*pp_eth_hdr)->src.addr[0], (*pp_eth_hdr)->src.addr[1],\r
+               (*pp_eth_hdr)->src.addr[2], (*pp_eth_hdr)->src.addr[3],\r
+               (*pp_eth_hdr)->src.addr[4], (*pp_eth_hdr)->src.addr[5],\r
+               (*pp_eth_hdr)->dst.addr[0], (*pp_eth_hdr)->dst.addr[1],\r
+               (*pp_eth_hdr)->dst.addr[2], (*pp_eth_hdr)->dst.addr[3],\r
+               (*pp_eth_hdr)->dst.addr[4], (*pp_eth_hdr)->dst.addr[5],\r
+               cl_ntoh16( (*pp_eth_hdr)->type )) );\r
+\r
+       return NDIS_STATUS_SUCCESS;\r
+}\r
+\r
+\r
+#if !IPOIB_USE_DMA\r
+/* Send using the MDL's page information rather than the SGL. */\r
+static ib_api_status_t\r
+__send_gen(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ipoib_send_desc_t* const        p_desc )\r
+{\r
+       uint32_t                                i, j = 1;\r
+       ULONG                                   offset;\r
+       MDL                                             *p_mdl;\r
+       UINT                                    num_pages, tot_len;\r
+       ULONG                                   buf_len;\r
+       PPFN_NUMBER                             page_array;\r
+       boolean_t                               hdr_done = FALSE;\r
+       ib_api_status_t                 status;\r
+       PNET_BUFFER                             p_net_buf;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_SEND );\r
+       p_net_buf = NET_BUFFER_LIST_FIRST_NB(p_desc->p_netbuf_list);\r
+       NdisQueryBuffer( p_net_buf, &num_pages, NULL, &p_mdl,\r
+               &tot_len );\r
+\r
+       if( !p_mdl )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("No buffers associated with packet.\n") );\r
+               return IB_ERROR;\r
+       }\r
+\r
+       /* Remember that one of the DS entries is reserved for the IPoIB header. */\r
+       if( num_pages >= MAX_SEND_SGE )\r
+       {\r
+               IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,\r
+                       ("Too many buffers to fit in WR ds_array.  Copying data.\n") );\r
+               status = __send_copy( p_port, p_desc );\r
+               IPOIB_EXIT( IPOIB_DBG_SEND );\r
+               return status;\r
+       }\r
+\r
+       CL_ASSERT( tot_len > sizeof(eth_hdr_t) );\r
+       CL_ASSERT( tot_len <= p_port->p_adapter->params.xfer_block_size );\r
+       /*\r
+        * Assume that the ethernet header is always fully contained\r
+        * in the first page of the first MDL.  This makes for much\r
+        * simpler code.\r
+        */\r
+       offset = MmGetMdlByteOffset( p_mdl ) + sizeof(eth_hdr_t);\r
+       CL_ASSERT( offset <= PAGE_SIZE );\r
+\r
+       while( tot_len )\r
+       {\r
+               buf_len = MmGetMdlByteCount( p_mdl );\r
+               page_array = MmGetMdlPfnArray( p_mdl );\r
+               CL_ASSERT( page_array );\r
+               i = 0;\r
+               if( !hdr_done )\r
+               {\r
+                       CL_ASSERT( buf_len >= sizeof(eth_hdr_t) );\r
+                       /* Skip the ethernet header. */\r
+                       buf_len -= sizeof(eth_hdr_t);\r
+                       CL_ASSERT( buf_len <= p_port->p_adapter->params.payload_mtu );\r
+                       if( buf_len )\r
+                       {\r
+                               /* The ethernet header is a subset of this MDL. */\r
+                               CL_ASSERT( i == 0 );\r
+                               if( offset < PAGE_SIZE )\r
+                               {\r
+                                       p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;\r
+                                       p_desc->send_wr[0].local_ds[j].vaddr = (page_array[i] << PAGE_SHIFT);\r
+                                       /* Add the byte offset since we're on the 1st page. */\r
+                                       p_desc->send_wr[0].local_ds[j].vaddr += offset;\r
+                                       if( offset + buf_len > PAGE_SIZE )\r
+                                       {\r
+                                               p_desc->send_wr[0].local_ds[j].length = PAGE_SIZE - offset;\r
+                                               buf_len -= p_desc->send_wr[0].local_ds[j].length;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               p_desc->send_wr[0].local_ds[j].length = buf_len;\r
+                                               buf_len = 0;\r
+                                       }\r
+                                       /* This data segment is done.  Move to the next. */\r
+                                       j++;\r
+                               }\r
+                               /* This page is done.  Move to the next. */\r
+                               i++;\r
+                       }\r
+                       /* Done handling the ethernet header. */\r
+                       hdr_done = TRUE;\r
+               }\r
+\r
+               /* Finish this MDL */\r
+               while( buf_len )\r
+               {\r
+                       p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;\r
+                       p_desc->send_wr[0].local_ds[j].vaddr = (page_array[i] << PAGE_SHIFT);\r
+                       /* Add the first page's offset if we're on the first page. */\r
+                       if( i == 0 )\r
+                               p_desc->send_wr[0].local_ds[j].vaddr += MmGetMdlByteOffset( p_mdl );\r
+\r
+                       if( i == 0 && (MmGetMdlByteOffset( p_mdl ) + buf_len) > PAGE_SIZE )\r
+                       {\r
+                               /* Buffers spans pages. */\r
+                               p_desc->send_wr[0].local_ds[j].length =\r
+                                       PAGE_SIZE - MmGetMdlByteOffset( p_mdl );\r
+                               buf_len -= p_desc->send_wr[0].local_ds[j].length;\r
+                               /* This page is done.  Move to the next. */\r
+                               i++;\r
+                       }\r
+                       else\r
+                       {\r
+                               /* Last page of the buffer. */\r
+                               p_desc->send_wr[0].local_ds[j].length = buf_len;\r
+                               buf_len = 0;\r
+                       }\r
+                       /* This data segment is done.  Move to the next. */\r
+                       j++;\r
+               }\r
+\r
+               tot_len -= MmGetMdlByteCount( p_mdl );\r
+               if( !tot_len )\r
+                       break;\r
+\r
+               NdisGetNextBuffer( p_mdl, &p_mdl );\r
+               if( !p_mdl )\r
+               {\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Failed to get next buffer.\n") );\r
+                       return IB_ERROR;\r
+               }\r
+       }\r
+\r
+       /* Set the number of data segments. */\r
+       p_desc->send_wr[0].wr.num_ds = j;\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_SEND );\r
+       return IB_SUCCESS;\r
+}\r
+\r
+#else\r
+\r
+#if 0\r
+void \r
+ipoib_process_sg_list1(\r
+    IN  PDEVICE_OBJECT          pDO,\r
+    IN  PVOID                   pIrp,\r
+    IN  PSCATTER_GATHER_LIST    p_sgl,\r
+    IN  PVOID                   context\r
+    )\r
+{\r
+       int i;\r
+       char temp[200];\r
+       for (i = 0 ; i < 1;i++)\r
+               temp[i] = 5;\r
+}\r
+#endif\r
+\r
+void \r
+ipoib_process_sg_list(\r
+    IN  PDEVICE_OBJECT          pDO,\r
+    IN  PVOID                   pIrp,\r
+    IN  PSCATTER_GATHER_LIST    p_sgl,\r
+    IN  PVOID                   context\r
+    )\r
+{      \r
+       NDIS_STATUS                             status;\r
+       ipoib_port_t                    *p_port;\r
+       MDL                                             *p_mdl;\r
+       eth_hdr_t                               *p_eth_hdr;\r
+       UINT                                    mdl_len;\r
+       static ipoib_send_desc_t                *p_desc = NULL;\r
+       ib_send_wr_t                    *p_wr_failed;\r
+       NET_BUFFER_LIST                 *p_net_buffer_list;\r
+       NET_BUFFER                              *p_netbuf;\r
+       boolean_t                               from_queue;\r
+       ib_api_status_t                 ib_status;\r
+       ULONG                                   complete_flags = 0;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_SEND );\r
+\r
+       UNREFERENCED_PARAMETER(pDO);\r
+       UNREFERENCED_PARAMETER(pIrp);\r
+\r
+       PERF_DECLARE( SendCopy );\r
+       PERF_DECLARE( BuildSendDesc );\r
+       PERF_DECLARE( GetEthHdr );\r
+       PERF_DECLARE( QueuePacket );\r
+       PERF_DECLARE( SendMgrQueue );\r
+       PERF_DECLARE( PostSend );\r
+       PERF_DECLARE( ProcessFailedSends );\r
+       PERF_DECLARE( GetEndpt );\r
+\r
+\r
+       p_netbuf = (NET_BUFFER*)context;\r
+       p_net_buffer_list = (NET_BUFFER_LIST*)IPOIB_NET_BUFFER_LIST_FROM_NETBUFFER(p_netbuf);\r
+       p_port = (ipoib_port_t*)IPOIB_PORT_FROM_PACKET(p_net_buffer_list);\r
+       NDIS_SET_SEND_COMPLETE_FLAG(complete_flags, NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL);\r
+\r
+\r
+       cl_spinlock_acquire( &p_port->send_lock );\r
+       if (p_desc == NULL) {\r
+               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_SEND, ("Allocating send_desc First Time\n") );\r
+               p_desc = \r
+                       (ipoib_send_desc_t *)ExAllocatePoolWithTag(NonPagedPool ,sizeof (ipoib_send_desc_t), 'XMXA');\r
+       }\r
+       ASSERT(p_desc);\r
+       p_desc->p_netbuf_list = p_net_buffer_list;\r
+       p_desc->p_endpt = NULL;\r
+       p_desc->p_buf = NULL;\r
+       p_desc->num_wrs = 1;\r
+\r
+       //IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,\r
+               //                              ("\n*******\nRECEIVED NB= %x with SG= %x\n********\n", p_netbuf, p_sgl) );\r
+       /* Get the ethernet header so we can find the endpoint. */\r
+       cl_perf_start( GetEthHdr );\r
+       status = __send_mgr_get_eth_hdr(\r
+               p_netbuf, &p_mdl, &p_eth_hdr, &mdl_len );\r
+       cl_perf_stop( &p_port->p_adapter->perf, GetEthHdr );\r
+\r
+       if( status != NDIS_STATUS_SUCCESS )\r
+       {\r
+               cl_perf_start( ProcessFailedSends );\r
+               /* fail  net buffer list */\r
+               __process_failed_send( p_port, p_desc, status, complete_flags);\r
+               cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends );\r
+               goto send_end;\r
+       }\r
+       //from_queue = (boolean_t)(IPOIB_FROM_QUEUE(p_netbuf) == (void*)1);\r
+       from_queue = (boolean_t)(IPOIB_FROM_QUEUE(p_netbuf) != NULL);\r
+       if (from_queue)\r
+       {\r
+               cl_perf_start( GetEndpt );\r
+               status = __endpt_mgr_ref( p_port, p_eth_hdr->dst, &p_desc->p_endpt );\r
+               cl_perf_stop( &p_port->p_adapter->perf, GetEndpt );\r
+               if( status == NDIS_STATUS_PENDING )\r
+               {\r
+                       IPOIB_FROM_QUEUE(p_netbuf) = p_sgl;\r
+                       cl_qlist_insert_head( &p_port->send_mgr.pending_list,\r
+                               IPOIB_LIST_ITEM_FROM_PACKET( p_desc->p_netbuf_list ) );\r
+                       goto send_end;\r
+               }\r
+               else if( status != NDIS_STATUS_SUCCESS )\r
+               {\r
+                       ASSERT( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION );\r
+\r
+                       if( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )\r
+                       {\r
+                               if( ipoib_port_join_mcast( p_port, p_eth_hdr->dst,\r
+                                       IB_MC_REC_STATE_FULL_MEMBER) == IB_SUCCESS )\r
+                               {\r
+                                       IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,\r
+                                               ("Multicast Mac - trying to join.\n") );\r
+                                       IPOIB_FROM_QUEUE(p_netbuf) = p_sgl;\r
+                                       cl_qlist_insert_head( &p_port->send_mgr.pending_list,\r
+                                               IPOIB_LIST_ITEM_FROM_PACKET( p_desc->p_netbuf_list ) );\r
+                                       goto send_end;\r
+                               }\r
+                       }\r
+                       /*\r
+                        * Complete the send as if we sent it - WHQL tests don't like the\r
+                        * sends to fail.\r
+                        */\r
+                       cl_perf_start( ProcessFailedSends );\r
+                       __process_failed_send( p_port, p_desc, NDIS_STATUS_SUCCESS,complete_flags );\r
+                       cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends );\r
+                       goto send_end;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               cl_perf_start( SendMgrQueue );\r
+               if ( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) && \r
+                        p_eth_hdr->type == ETH_PROT_TYPE_IP &&\r
+                        !ETH_IS_BROADCAST( p_eth_hdr->dst.addr ) ) \r
+               {\r
+                       ip_hdr_t                        *p_ip_hdr;\r
+                       uint8_t                         *p_tmp;\r
+                       MDL                                     *p_ip_hdr_mdl;\r
+                       UINT                            ip_hdr_mdl_len;\r
+\r
+                       if(mdl_len >= sizeof(ip_hdr_t) + sizeof(eth_hdr_t))\r
+                       {\r
+                               p_ip_hdr = (ip_hdr_t*)(p_eth_hdr + 1);\r
+                       }\r
+                       else\r
+                       {\r
+                               NdisGetNextMdl(p_mdl,&p_ip_hdr_mdl);\r
+                               // Extract the ip hdr \r
+                               if( !p_ip_hdr_mdl )\r
+                               {\r
+                                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                               ("Failed to get IP header buffer.\n") );\r
+                                       goto mc_end;\r
+                               }       \r
+                               NdisQueryMdl(p_ip_hdr_mdl,&p_tmp,&ip_hdr_mdl_len,NormalPagePriority);\r
+                               if( !p_tmp )\r
+                               {\r
+                                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                               ("Failed to get IP header.\n") );\r
+                                       goto mc_end;\r
+                               }                                       \r
+                               if( ip_hdr_mdl_len < sizeof(ip_hdr_t) )\r
+                               {\r
+                                       /* This buffer is done for.  Get the next buffer. */\r
+                                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                               ("Buffer too small for IP packet.\n") );\r
+                                       goto mc_end;\r
+                               }\r
+                               p_ip_hdr = (ip_hdr_t*)(p_tmp + NET_BUFFER_CURRENT_MDL_OFFSET(p_netbuf));\r
+                               p_eth_hdr->dst.addr[1] = ((unsigned char*)&p_ip_hdr->dst_ip)[0] & 0x0f;\r
+                               p_eth_hdr->dst.addr[3] = ((unsigned char*)&p_ip_hdr->dst_ip)[1];\r
+                       }\r
+               }\r
+mc_end:\r
+               status = __send_mgr_queue( p_port, p_eth_hdr, &p_desc->p_endpt );\r
+               cl_perf_stop( &p_port->p_adapter->perf, SendMgrQueue );\r
+               if( status == NDIS_STATUS_PENDING )\r
+               {\r
+                       /* Queue net buffer list. */\r
+                       cl_perf_start( QueuePacket );\r
+                       NET_BUFFER_LIST_NEXT_NBL(p_net_buffer_list) = NULL;\r
+                       IPOIB_FROM_QUEUE(p_netbuf) = p_sgl;\r
+                       cl_qlist_insert_tail( &p_port->send_mgr.pending_list,\r
+                                       IPOIB_LIST_ITEM_FROM_PACKET(p_net_buffer_list) );\r
+                       cl_perf_stop( &p_port->p_adapter->perf, QueuePacket );\r
+                       goto send_end;\r
+               }\r
+               if( status != NDIS_STATUS_SUCCESS )\r
+               {\r
+                       ASSERT( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION );\r
+                       /*\r
+                        * Complete the send as if we sent it - WHQL tests don't like the\r
+                        * sends to fail.\r
+                        */\r
+                       cl_perf_start( ProcessFailedSends );\r
+                       __process_failed_send( p_port, p_desc, NDIS_STATUS_SUCCESS, complete_flags );\r
+                       cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends );\r
+                       goto send_end;\r
+               }\r
+       }\r
+       cl_perf_start( BuildSendDesc );\r
+       status = __build_send_desc( p_port, p_eth_hdr, p_mdl, mdl_len, p_sgl, p_desc );\r
+       cl_perf_stop( &p_port->p_adapter->perf, BuildSendDesc );\r
+\r
+       if( status != NDIS_STATUS_SUCCESS )\r
+       {\r
+               cl_perf_start( ProcessFailedSends );\r
+               __process_failed_send( p_port, p_desc, status, complete_flags );\r
+               cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends );\r
+               goto send_end;\r
+       }\r
+\r
+       /* Post the WR. */\r
+       cl_perf_start( PostSend );\r
+       cl_msg_out("sending packet with wr-id =0x%x\n",&p_desc->send_wr[0].wr.wr_id );\r
+       ib_status = p_port->p_adapter->p_ifc->post_send( p_port->ib_mgr.h_qp, &p_desc->send_wr[0].wr, &p_wr_failed );\r
+       cl_perf_stop( &p_port->p_adapter->perf, PostSend );\r
+       if( ib_status != IB_SUCCESS )\r
+       {\r
+               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ib_post_send returned %s\n", \r
+                       p_port->p_adapter->p_ifc->get_err_str( ib_status )) );\r
+               cl_perf_start( ProcessFailedSends );\r
+               __process_failed_send( p_port, p_desc, NDIS_STATUS_FAILURE, complete_flags );\r
+               cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends );\r
+               /* Flag the adapter as hung since posting is busted. */\r
+               p_port->p_adapter->hung = TRUE;\r
+       }\r
+       cl_atomic_inc( &p_port->send_mgr.depth );\r
+\r
+send_end:\r
+       if (status != NDIS_STATUS_SUCCESS) {\r
+//             IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_SEND,\r
+       //                                      ("Free S/G List: 0x%x.\n", (UINT) (PVOID) p_sgl) );\r
+               /*NdisMFreeNetBufferSGList(\r
+                       p_port->p_adapter->NdisMiniportDmaHandle,\r
+                       p_sgl,\r
+                       p_netbuf);*/\r
+               \r
+       }\r
+                       \r
+                       \r
+       cl_spinlock_release( &p_port->send_lock );\r
+       IPOIB_EXIT( IPOIB_DBG_SEND );\r
+}\r
+\r
+static NDIS_STATUS\r
+__send_gen(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ipoib_send_desc_t* const        p_desc,\r
+       IN                              SCATTER_GATHER_LIST                     *p_sgl,\r
+       IN                              INT                                                     lso_data_index\r
+        )\r
+{\r
+       NDIS_STATUS                             status;\r
+       uint32_t                                i, j = 1;\r
+       uint32_t                                offset = sizeof(eth_hdr_t);\r
+       PERF_DECLARE( SendCopy );\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_SEND );\r
+\r
+       if( !p_sgl )\r
+       {\r
+               ASSERT( p_sgl );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Failed to get SGL from packet.\n") );\r
+               return NDIS_STATUS_FAILURE;\r
+       }\r
+\r
+       /* Remember that one of the DS entries is reserved for the IPoIB header. */\r
+       if( ( p_sgl->NumberOfElements >= MAX_SEND_SGE ||\r
+               p_sgl->Elements[0].Length < sizeof(eth_hdr_t)) )\r
+       {\r
+\r
+               IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,\r
+                       ("Too many buffers %d to fit in WR ds_array[%d] \\r
+                        Or buffer[0] length %d < Eth header. Copying data.\n",\r
+                       p_sgl->NumberOfElements, MAX_SEND_SGE,  p_sgl->Elements[0].Length ) );\r
+               status = NDIS_STATUS_RESOURCES;\r
+               if( !p_port->p_adapter->params.cm_enabled )\r
+               {\r
+                       cl_perf_start( SendCopy );\r
+                       status = __send_copy( p_port, p_desc );\r
+                       cl_perf_stop( &p_port->p_adapter->perf, SendCopy );\r
+               }\r
+               IPOIB_EXIT( IPOIB_DBG_SEND );\r
+               return status;\r
+       }\r
+\r
+       /*\r
+        * Skip the ethernet header.  It is either the first element,\r
+        * or part of it.\r
+        */\r
+       i = 0;\r
+       if( lso_data_index )\r
+       { /* we have an LSO packet */\r
+               i = lso_data_index;\r
+               j = 0;\r
+       }\r
+       else while( offset )\r
+       {\r
+               if( p_sgl->Elements[i].Length <= offset )\r
+               {\r
+                       offset -= p_sgl->Elements[i++].Length;\r
+               }\r
+               else\r
+               {\r
+                       p_desc->send_wr[0].local_ds[j].vaddr =\r
+                               p_sgl->Elements[i].Address.QuadPart + offset;\r
+                       p_desc->send_wr[0].local_ds[j].length =\r
+                               p_sgl->Elements[i].Length - offset;\r
+                       p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;\r
+                       i++;\r
+                       j++;\r
+                       break;\r
+               }\r
+       }\r
+       /* Now fill in the rest of the local data segments. */\r
+       while( i < p_sgl->NumberOfElements )\r
+       {\r
+               p_desc->send_wr[0].local_ds[j].vaddr = p_sgl->Elements[i].Address.QuadPart;\r
+               p_desc->send_wr[0].local_ds[j].length = p_sgl->Elements[i].Length;\r
+               p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;\r
+               i++;\r
+               j++;\r
+       }\r
+\r
+       /* Set the number of data segments. */\r
+       p_desc->send_wr[0].wr.num_ds = j;\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_SEND );\r
+       return NDIS_STATUS_SUCCESS;\r
+}\r
+#endif\r
+\r
+\r
+static NDIS_STATUS\r
+__send_mgr_filter_ip(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   eth_hdr_t* const                        p_eth_hdr,\r
+       IN                              MDL*                                            p_mdl,\r
+       IN                              size_t                                          buf_len,\r
+       IN                              SCATTER_GATHER_LIST                     *p_sgl,\r
+       IN      OUT                     ipoib_send_desc_t* const        p_desc )\r
+{\r
+       NDIS_STATUS             status;\r
+       ip_hdr_t                *p_ip_hdr;\r
+       uint32_t                ip_packet_len;\r
+       size_t                  iph_size_in_bytes;\r
+       size_t                  iph_options_size;\r
+       \r
+       PERF_DECLARE( QueryIp );\r
+       PERF_DECLARE( SendTcp );\r
+       PERF_DECLARE( FilterUdp );\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_SEND );\r
+\r
+       if( !buf_len )\r
+       {\r
+               cl_perf_start( QueryIp );\r
+               NdisGetNextMdl ( p_mdl, &p_mdl );\r
+               if( !p_mdl )\r
+               {\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Failed to get IP header buffer.\n") );\r
+                       return NDIS_STATUS_FAILURE;\r
+               }\r
+\r
+               NdisQueryMdl(p_mdl, &p_ip_hdr, &buf_len, NormalPagePriority);\r
+               if( !p_ip_hdr )\r
+               {\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Failed to query IP header buffer.\n") );\r
+                       return NDIS_STATUS_FAILURE;\r
+               }\r
+               cl_perf_stop( &p_port->p_adapter->perf, QueryIp );\r
+       }\r
+       else\r
+       {\r
+               p_ip_hdr = (ip_hdr_t*)(p_eth_hdr + 1);\r
+       }\r
+       if( buf_len < sizeof(ip_hdr_t) )\r
+       {\r
+               /* This buffer is done for.  Get the next buffer. */\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Buffer too small for IP packet.\n") );\r
+               return NDIS_STATUS_BUFFER_TOO_SHORT;\r
+       }\r
+\r
+       switch( p_ip_hdr->prot )\r
+       {\r
+       case IP_PROT_UDP:\r
+\r
+               cl_perf_start( FilterUdp );\r
+               status = __send_mgr_filter_udp(\r
+                       p_port, p_ip_hdr, p_mdl, (buf_len - sizeof(ip_hdr_t)), p_sgl, p_desc );\r
+               cl_perf_stop( &p_port->p_adapter->perf, FilterUdp );\r
+               if( status == NDIS_STATUS_PENDING )\r
+               {  /* not DHCP packet, keep going */\r
+                       if( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )\r
+                               p_desc->send_dir = SEND_UD_QP;\r
+                       else\r
+                               p_desc->send_dir = SEND_RC_QP;\r
+                       break;\r
+               }\r
+               return status;\r
+       \r
+       case IP_PROT_TCP:\r
+               p_desc->send_dir = SEND_RC_QP;\r
+               break;\r
+       case IP_PROT_IGMP:\r
+               /*\r
+               In igmp packet I saw that iph arrive in 2 NDIS_BUFFERs:\r
+               1. iph\r
+               2. ip options\r
+                               So to get the IGMP packet we need to skip the ip options NDIS_BUFFER\r
+                       */\r
+                       iph_size_in_bytes = (p_ip_hdr->ver_hl & 0xf) * 4;\r
+                       iph_options_size = iph_size_in_bytes - buf_len;\r
+                       buf_len -= sizeof(ip_hdr_t);//without ipheader\r
+\r
+                       /*\r
+               Could be a case that arrived igmp packet not from type IGMPv2 ,\r
+               but IGMPv1 or IGMPv3.\r
+               We anyway pass it to __send_mgr_filter_igmp_v2().\r
+               */\r
+               status =\r
+                       __send_mgr_filter_igmp_v2( p_port, p_ip_hdr, iph_options_size, p_mdl, buf_len );\r
+               if( status != NDIS_STATUS_SUCCESS )\r
+                       return status;\r
+\r
+       case IP_PROT_ICMP:\r
+               p_desc->send_dir = SEND_UD_QP;\r
+       default:\r
+               break;\r
+       }\r
+       \r
+       if( !p_port->p_adapter->params.cm_enabled )\r
+       {\r
+               p_desc->send_dir = SEND_UD_QP;\r
+               goto send_gen;\r
+       }\r
+       else if( endpt_cm_get_state( p_desc->p_endpt ) != IPOIB_CM_CONNECTED )\r
+       {\r
+               p_desc->send_dir = SEND_UD_QP;\r
+       }\r
+       if( p_desc->send_dir == SEND_UD_QP )\r
+       {\r
+               ip_packet_len = cl_ntoh16( p_ip_hdr->length );\r
+               if( ip_packet_len  > p_port->p_adapter->params.payload_mtu )\r
+               {\r
+                       //TODO: NDIS60\r
+                       #if 0\r
+                       status = __send_fragments( p_port, p_desc, (eth_hdr_t* const)p_eth_hdr,\r
+                                               (ip_hdr_t* const)p_ip_hdr, (uint32_t)buf_len, p_mdl );\r
+                       return status;\r
+                       #endif\r
+                       ASSERT(FALSE);\r
+               }\r
+       }\r
+\r
+send_gen:\r
+       cl_perf_start( SendTcp );\r
+       status = __send_gen( p_port, p_desc, p_sgl, 0 );\r
+       cl_perf_stop( &p_port->p_adapter->perf, SendTcp );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_SEND );\r
+       return status;\r
+}\r
+\r
+static NDIS_STATUS\r
+__send_mgr_filter_igmp_v2(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   ip_hdr_t* const                         p_ip_hdr,\r
+       IN                              size_t                                          iph_options_size,\r
+       IN                              MDL*                                            p_mdl,\r
+       IN                              size_t                                          buf_len )\r
+{\r
+       igmp_v2_hdr_t           *p_igmp_v2_hdr = NULL;\r
+       NDIS_STATUS                     endpt_status;\r
+       ipoib_endpt_t*          p_endpt = NULL;\r
+       mac_addr_t                      fake_mcast_mac;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_SEND );\r
+\r
+       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,\r
+                        ("buf_len = %d,iph_options_size = %d\n",(int)buf_len,(int)iph_options_size ) );\r
+\r
+       if( !buf_len )\r
+       {\r
+               // To get the IGMP packet we need to skip the ip options NDIS_BUFFER (if exists)\r
+               while ( iph_options_size )\r
+               {\r
+                       NdisGetNextMdl( p_mdl, &p_mdl );\r
+                       if( !p_mdl )\r
+                       {\r
+                               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                       ("Failed to get IGMPv2 header buffer.\n") );\r
+                               return NDIS_STATUS_FAILURE;\r
+                       }\r
+                       NdisQueryMdl( p_mdl, &p_igmp_v2_hdr, &buf_len, NormalPagePriority );\r
+                       if( !p_igmp_v2_hdr )\r
+                       {\r
+                               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                       ("Failed to query IGMPv2 header buffer.\n") );\r
+                               return NDIS_STATUS_FAILURE;\r
+                       }\r
+                       iph_options_size-=buf_len;\r
+               }\r
+        \r
+               NdisGetNextMdl( p_mdl, &p_mdl );\r
+               if( !p_mdl )\r
+               {\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Failed to get IGMPv2 header buffer.\n") );\r
+                       return NDIS_STATUS_FAILURE;\r
+               }\r
+               NdisQueryMdl( p_mdl, &p_igmp_v2_hdr, &buf_len, NormalPagePriority );\r
+               if( !p_igmp_v2_hdr )\r
+               {\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Failed to query IGMPv2 header buffer.\n") );\r
+                       return NDIS_STATUS_FAILURE;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               /* assuming ip header and options are in the same packet */\r
+               p_igmp_v2_hdr = (igmp_v2_hdr_t *) GetIpPayloadPtr(p_ip_hdr);\r
+       }\r
+       /* Get the IGMP header length. */\r
+       if( buf_len < sizeof(igmp_v2_hdr_t) )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Buffer not large enough for IGMPv2 packet.\n") );\r
+               return NDIS_STATUS_BUFFER_TOO_SHORT;\r
+       }\r
+\r
+       // build fake mac from igmp packet group address\r
+       fake_mcast_mac.addr[0] = 1;\r
+       fake_mcast_mac.addr[1] = ((unsigned char*)&p_igmp_v2_hdr->group_address)[0] & 0x0f;\r
+       fake_mcast_mac.addr[2] = 0x5E;\r
+       fake_mcast_mac.addr[3] = ((unsigned char*)&p_igmp_v2_hdr->group_address)[1];\r
+       fake_mcast_mac.addr[4] = ((unsigned char*)&p_igmp_v2_hdr->group_address)[2];\r
+       fake_mcast_mac.addr[5] = ((unsigned char*)&p_igmp_v2_hdr->group_address)[3];\r
+\r
+       switch ( p_igmp_v2_hdr->type )\r
+       {\r
+       case IGMP_V2_MEMBERSHIP_REPORT:\r
+               /* \r
+                       This mean that some body open listener on this group \r
+                       Change type of mcast endpt to SEND_RECV endpt. So mcast garbage collector \r
+                       will not delete this mcast endpt.\r
+               */\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,\r
+                       ("Catched IGMP_V2_MEMBERSHIP_REPORT message\n") );\r
+               endpt_status = __endpt_mgr_ref( p_port, fake_mcast_mac, &p_endpt );\r
+               if ( p_endpt )\r
+               {\r
+                       cl_obj_lock( &p_port->obj );\r
+                       p_endpt->is_mcast_listener = TRUE;\r
+                       cl_obj_unlock( &p_port->obj );\r
+            ipoib_endpt_deref( p_endpt );\r
+               }\r
+               break;\r
+\r
+       case IGMP_V2_LEAVE_GROUP:\r
+               /* \r
+                       This mean that somebody CLOSE listener on this group .\r
+                   Change type of mcast endpt to SEND_ONLY endpt. So mcast \r
+                       garbage collector will delete this mcast endpt next time.\r
+               */\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,\r
+                            ("Catched IGMP_V2_LEAVE_GROUP message\n") );\r
+               endpt_status = __endpt_mgr_ref( p_port, fake_mcast_mac, &p_endpt );\r
+               if ( p_endpt )\r
+               {\r
+                       cl_obj_lock( &p_port->obj );\r
+                       p_endpt->is_mcast_listener = FALSE;\r
+                       p_endpt->is_in_use = FALSE;\r
+                       cl_obj_unlock( &p_port->obj );\r
+                       ipoib_endpt_deref( p_endpt );\r
+               }\r
+\r
+               __port_do_mcast_garbage(p_port);\r
+\r
+               break;\r
+\r
+       default:\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,\r
+                            ("Send Unknown IGMP message: 0x%x \n", p_igmp_v2_hdr->type ) );\r
+               break;\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_SEND );\r
+       return NDIS_STATUS_SUCCESS;\r
+}\r
+\r
+static NDIS_STATUS\r
+__send_mgr_filter_udp(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   ip_hdr_t* const                         p_ip_hdr,\r
+       IN                              MDL*                                            p_mdl,\r
+       IN                              size_t                                          buf_len,\r
+       IN                              SCATTER_GATHER_LIST                     *p_sgl,\r
+       IN      OUT                     ipoib_send_desc_t* const        p_desc )\r
+{\r
+       NDIS_STATUS                     status;\r
+       udp_hdr_t                       *p_udp_hdr;\r
+       PERF_DECLARE( QueryUdp );\r
+       PERF_DECLARE( SendUdp );\r
+       PERF_DECLARE( FilterDhcp );\r
+       //TODO NDIS60 remove this param\r
+       UNUSED_PARAM(p_sgl);\r
+       IPOIB_ENTER( IPOIB_DBG_SEND );\r
+\r
+       if( !buf_len )\r
+       {\r
+               cl_perf_start( QueryUdp );\r
+               NdisGetNextMdl( p_mdl, &p_mdl );\r
+               if( !p_mdl )\r
+               {\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Failed to get UDP header buffer.\n") );\r
+                       return NDIS_STATUS_FAILURE;\r
+               }\r
+               NdisQueryMdl( p_mdl, &p_udp_hdr, &buf_len, NormalPagePriority );\r
+               if( !p_udp_hdr )\r
+               {\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Failed to query UDP header buffer.\n") );\r
+                       return NDIS_STATUS_FAILURE;\r
+               }\r
+               cl_perf_stop( &p_port->p_adapter->perf, QueryUdp );\r
+       }\r
+       else\r
+       {\r
+               p_udp_hdr = (udp_hdr_t*)GetIpPayloadPtr(p_ip_hdr);\r
+       }\r
+       /* Get the UDP header and check the destination port numbers. */\r
+       \r
+       if (p_ip_hdr->offset > 0) {\r
+               /* This is a fragmented part of UDP packet\r
+                * Only first packet will contain UDP header in such case\r
+                * So, return if offset > 0\r
+                */\r
+                return NDIS_STATUS_PENDING;\r
+       }\r
+                \r
+       if( buf_len < sizeof(udp_hdr_t) )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Buffer not large enough for UDP packet.\n") );\r
+               return NDIS_STATUS_BUFFER_TOO_SHORT;\r
+       }\r
+\r
+       if( (p_udp_hdr->src_port != DHCP_PORT_CLIENT ||\r
+               p_udp_hdr->dst_port != DHCP_PORT_SERVER) &&\r
+               (p_udp_hdr->src_port != DHCP_PORT_SERVER ||\r
+               p_udp_hdr->dst_port != DHCP_PORT_CLIENT) )\r
+       {\r
+               /* Not a DHCP packet. */\r
+               return NDIS_STATUS_PENDING;\r
+       }\r
+\r
+       buf_len -= sizeof(udp_hdr_t);\r
+\r
+       /* Allocate our scratch buffer. */\r
+       p_desc->p_buf = (send_buf_t*)\r
+               ExAllocateFromNPagedLookasideList( &p_port->buf_mgr.send_buf_list );\r
+       if( !p_desc->p_buf )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Failed to query DHCP packet buffer.\n") );\r
+               return NDIS_STATUS_RESOURCES;\r
+       }\r
+       /* Copy the IP and UDP headers. */\r
+       cl_memcpy( &p_desc->p_buf->ip.hdr, p_ip_hdr , sizeof(ip_hdr_t) );\r
+       cl_memcpy(\r
+               &p_desc->p_buf->ip.prot.udp.hdr, p_udp_hdr, sizeof(udp_hdr_t) );\r
+\r
+       cl_perf_start( FilterDhcp );\r
+       status = __send_mgr_filter_dhcp(\r
+               p_port, p_udp_hdr, p_mdl, buf_len, p_desc );\r
+       cl_perf_stop( &p_port->p_adapter->perf, FilterDhcp );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_SEND );\r
+       return status;\r
+}\r
+\r
+unsigned short ipchksum(unsigned short *ip, int len)\r
+{\r
+    unsigned long sum = 0;\r
+\r
+    len >>= 1;\r
+    while (len--) {\r
+        sum += *(ip++);\r
+        if (sum > 0xFFFF)\r
+            sum -= 0xFFFF;\r
+    }\r
+    return (unsigned short)((~sum) & 0x0000FFFF);\r
+}\r
+\r
+static NDIS_STATUS\r
+__send_mgr_filter_dhcp(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   udp_hdr_t* const                        p_udp_hdr,\r
+       IN                              NDIS_BUFFER*                            p_mdl,\r
+       IN                              size_t                                          buf_len,\r
+       IN      OUT                     ipoib_send_desc_t* const        p_desc )\r
+{\r
+       dhcp_pkt_t                      *p_dhcp;\r
+       dhcp_pkt_t                      *p_ib_dhcp;\r
+       uint8_t                         *p_option, *p_cid = NULL;\r
+       uint8_t                         msg = 0;\r
+       size_t                          len;\r
+       ib_gid_t                        gid;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_SEND );\r
+\r
+       if( !buf_len )\r
+       {\r
+               NdisGetNextMdl( p_mdl, &p_mdl );\r
+               if( !p_mdl )\r
+               {\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Failed to get DHCP buffer.\n") );\r
+                       return NDIS_STATUS_FAILURE;\r
+               }\r
+               NdisQueryMdl( p_mdl, &p_dhcp, &buf_len, NormalPagePriority );\r
+               if( !p_dhcp )\r
+               {\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Failed to query DHCP buffer.\n") );\r
+                       return NDIS_STATUS_FAILURE;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               p_dhcp = (dhcp_pkt_t*)(p_udp_hdr + 1);\r
+       }\r
+\r
+       if( buf_len < DHCP_MIN_SIZE )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Buffer not large enough for DHCP packet.\n") );\r
+               return NDIS_STATUS_BUFFER_TOO_SHORT;\r
+       }\r
+\r
+       p_ib_dhcp = &p_desc->p_buf->ip.prot.udp.dhcp;\r
+       cl_memcpy( p_ib_dhcp, p_dhcp, buf_len );\r
+\r
+       /* Now scan through the options looking for the client identifier. */\r
+       p_option = &p_ib_dhcp->options[4];\r
+       while( *p_option != DHCP_OPT_END && p_option < &p_ib_dhcp->options[312] )\r
+       {\r
+               switch( *p_option )\r
+               {\r
+               case DHCP_OPT_PAD:\r
+                       p_option++;\r
+                       break;\r
+\r
+               case DHCP_OPT_MSG:\r
+                       msg = p_option[2];\r
+                       p_option += 3;\r
+                       break;\r
+\r
+               case DHCP_OPT_CLIENT_ID:\r
+                       p_cid = p_option;\r
+                       /* Fall through. */\r
+\r
+               default:\r
+                       /*\r
+                        * All other options have a length byte following the option code.\r
+                        * Offset by the length to get to the next option.\r
+                        */\r
+                       p_option += (p_option[1] + 2);\r
+               }\r
+       }\r
+\r
+       switch( msg )\r
+       {\r
+       /* Client messages */\r
+       case DHCPDISCOVER:\r
+       case DHCPREQUEST:\r
+                       p_ib_dhcp->flags |= DHCP_FLAGS_BROADCAST;\r
+               /* Fall through */\r
+       case DHCPDECLINE:\r
+       case DHCPRELEASE:\r
+       case DHCPINFORM:\r
+               /* Fix up the client identifier option */\r
+               if( p_cid )\r
+               {\r
+                       /* do we need to replace it ?  len eq ETH MAC sz 'and' MAC is mine */\r
+                       if( p_cid[1] == HW_ADDR_LEN+1 && !cl_memcmp( &p_cid[3],\r
+                               &p_port->p_adapter->params.conf_mac.addr, HW_ADDR_LEN ) )\r
+                       {\r
+                               /* Make sure there's room to extend it.  23 is the size of\r
+                                * the CID option for IPoIB.\r
+                                */\r
+                               if( buf_len + 23 - p_cid[1] > sizeof(dhcp_pkt_t) )\r
+                               {\r
+                                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                               ("Can't convert CID to IPoIB format.\n") );\r
+                                       return NDIS_STATUS_RESOURCES;\r
+                               }\r
+                               /* Move the existing options down, and add a new CID option */\r
+                               len = p_option - ( p_cid + p_cid[1] + 2 );\r
+                               p_option = p_cid + p_cid[1] + 2;\r
+                               RtlMoveMemory( p_cid, p_option, len );\r
+                               \r
+                               p_cid += len;\r
+                               p_cid[0] = DHCP_OPT_CLIENT_ID;\r
+                               p_cid[1] = 21;\r
+                               p_cid[2] = DHCP_HW_TYPE_IB;\r
+                       }\r
+                       else\r
+                       {\r
+                               p_cid[2] = DHCP_HW_TYPE_IB;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       /*\r
+                        * Make sure there's room to extend it.  23 is the size of\r
+                        * the CID option for IPoIB.\r
+                        */\r
+                       if( buf_len + 23 > sizeof(dhcp_pkt_t) )\r
+                       {\r
+                               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                       ("Can't convert CID to IPoIB format.\n") );\r
+                               return NDIS_STATUS_RESOURCES;\r
+                       }\r
+\r
+                       p_cid = p_option;\r
+                       p_option = p_cid + 23;\r
+                       p_option[0] = DHCP_OPT_END;\r
+                       p_cid[0] = DHCP_OPT_CLIENT_ID;\r
+                       p_cid[1] = 21;\r
+                       p_cid[2] = DHCP_HW_TYPE_IB;\r
+               }\r
+\r
+               CL_ASSERT( p_cid[1] == 21 );\r
+               p_cid[23]= DHCP_OPT_END;\r
+               ib_gid_set_default( &gid, p_port->p_adapter->guids.port_guid.guid );\r
+               cl_memcpy( &p_cid[7], &gid, sizeof(ib_gid_t) );\r
+               cl_memcpy( &p_cid[3], &p_port->ib_mgr.qpn, sizeof(p_port->ib_mgr.qpn) );                \r
+               p_ib_dhcp->htype = DHCP_HW_TYPE_IB;\r
+\r
+               /* update lengths to include any change we made */\r
+               p_desc->p_buf->ip.hdr.length = cl_ntoh16( sizeof(ip_hdr_t) + sizeof(udp_hdr_t) + sizeof(dhcp_pkt_t) );\r
+               p_desc->p_buf->ip.prot.udp.hdr.length = cl_ntoh16( sizeof(udp_hdr_t) + sizeof(dhcp_pkt_t) );\r
+\r
+               /* update crc in ip header */\r
+               //if( !p_port->p_adapter->params.send_chksum_offload )\r
+               //{ //TODO ?\r
+               p_desc->p_buf->ip.hdr.chksum = 0;\r
+               p_desc->p_buf->ip.hdr.chksum = ipchksum((unsigned short*) &p_desc->p_buf->ip.hdr, sizeof(ip_hdr_t));\r
+               //} TODO ??\r
+               break;\r
+\r
+       /* Server messages. */\r
+       case DHCPOFFER:\r
+       case DHCPACK:\r
+       case DHCPNAK:\r
+               /* don't touch server messages */\r
+               break;\r
+\r
+       default:\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Invalide message type.\n") );\r
+               return NDIS_STATUS_INVALID_DATA;\r
+       }\r
+       /* no chksum for udp */\r
+       p_desc->p_buf->ip.prot.udp.hdr.chksum = 0;\r
+       p_desc->send_wr[0].local_ds[1].vaddr = cl_get_physaddr( p_desc->p_buf );\r
+       p_desc->send_wr[0].local_ds[1].length = sizeof(ip_hdr_t) +      sizeof(udp_hdr_t) + sizeof(dhcp_pkt_t);\r
+       p_desc->send_wr[0].local_ds[1].lkey = p_port->ib_mgr.lkey;\r
+       p_desc->send_wr[0].wr.num_ds = 2;\r
+       p_desc->send_dir = SEND_UD_QP;\r
+       IPOIB_EXIT( IPOIB_DBG_SEND );\r
+       return NDIS_STATUS_SUCCESS;\r
+}\r
+\r
+\r
+static NDIS_STATUS\r
+__send_mgr_filter_arp(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   eth_hdr_t* const                        p_eth_hdr,\r
+       IN                              MDL*                                            p_mdl,\r
+       IN                              size_t                                          buf_len,\r
+       IN      OUT                     ipoib_send_desc_t* const        p_desc )\r
+{\r
+       arp_pkt_t                       *p_arp;\r
+       ipoib_arp_pkt_t         *p_ib_arp;\r
+       NDIS_STATUS                     status;\r
+       mac_addr_t                      null_hw = {0};\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_SEND );\r
+       \r
+       if( !buf_len )\r
+       {\r
+               NdisGetNextMdl( p_mdl, &p_mdl );\r
+               if( !p_mdl )\r
+               {\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Failed to get ARP buffer.\n") );\r
+                       return NDIS_STATUS_FAILURE;\r
+               }\r
+               NdisQueryMdl( p_mdl, &p_arp, &buf_len, NormalPagePriority );\r
+               if( !p_arp )\r
+               {\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Failed to get query ARP buffer.\n") );\r
+                       return NDIS_STATUS_FAILURE;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               p_arp = (arp_pkt_t*)(p_eth_hdr + 1);\r
+       }\r
+\r
+       /* Single buffer ARP packet. */\r
+       if( buf_len < sizeof(arp_pkt_t) )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Buffer too short for ARP.\n") );\r
+               return NDIS_STATUS_BUFFER_TOO_SHORT;\r
+       }\r
+\r
+       if( p_arp->prot_type != ETH_PROT_TYPE_IP )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Unsupported protocol type.\n") );\r
+               return NDIS_STATUS_INVALID_DATA;\r
+       }\r
+\r
+       /* Allocate our scratch buffer. */\r
+       p_desc->p_buf = (send_buf_t*)\r
+               NdisAllocateFromNPagedLookasideList( &p_port->buf_mgr.send_buf_list );\r
+       if( !p_desc->p_buf )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Failed to query ARP packet buffer.\n") );\r
+               return NDIS_STATUS_RESOURCES;\r
+       }\r
+       p_ib_arp = (ipoib_arp_pkt_t*)p_desc->p_buf;\r
+\r
+       /* Convert the ARP payload. */\r
+       p_ib_arp->hw_type = ARP_HW_TYPE_IB;\r
+       p_ib_arp->prot_type = p_arp->prot_type;\r
+       p_ib_arp->hw_size = sizeof(ipoib_hw_addr_t);\r
+       p_ib_arp->prot_size = p_arp->prot_size;\r
+       p_ib_arp->op = p_arp->op;\r
+       \r
+       ipoib_addr_set_qpn( &p_ib_arp->src_hw, p_port->ib_mgr.qpn );\r
+#if 0\r
+\r
+       if( p_port->p_adapter->params.cm_enabled )\r
+       {\r
+               ipoib_addr_set_flags( &p_ib_arp->src_hw, IPOIB_CM_FLAG_RC );\r
+       }\r
+#endif\r
+\r
+       ib_gid_set_default( &p_ib_arp->src_hw.gid,\r
+               p_port->p_adapter->guids.port_guid.guid );\r
+       p_ib_arp->src_ip = p_arp->src_ip;\r
+       if( cl_memcmp( &p_arp->dst_hw, &null_hw, sizeof(mac_addr_t) ) )\r
+       {\r
+               /* Get the endpoint referenced by the dst_hw address. */\r
+               net32_t qpn = 0;\r
+               status = __endpt_mgr_get_gid_qpn( p_port, p_arp->dst_hw,\r
+                       &p_ib_arp->dst_hw.gid, &qpn );\r
+               if( status != NDIS_STATUS_SUCCESS )\r
+               {\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Failed lookup of destination HW address\n") );\r
+                       return status;\r
+               }\r
+               ipoib_addr_set_qpn( &p_ib_arp->dst_hw, qpn );\r
+#if 0\r
+               if( p_arp->op == ARP_OP_REP && \r
+                       p_port->p_adapter->params.cm_enabled && \r
+                       p_desc->p_endpt->cm_flag == IPOIB_CM_FLAG_RC )\r
+               {\r
+                       cm_state_t      cm_state;\r
+                       cm_state = \r
+                               ( cm_state_t )InterlockedCompareExchange( (volatile LONG *)&p_desc->p_endpt->conn.state,\r
+                                                               IPOIB_CM_CONNECT, IPOIB_CM_DISCONNECTED );\r
+                       switch( cm_state )\r
+                       {\r
+                       case IPOIB_CM_DISCONNECTED:\r
+                                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+                                               ("ARP REPLY pending Endpt[%p] QPN %#x MAC %02x:%02x:%02x:%02x:%02x:%02x\n",\r
+                                               p_desc->p_endpt, \r
+                                               cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->dst_hw )),\r
+                                               p_desc->p_endpt->mac.addr[0], p_desc->p_endpt->mac.addr[1],\r
+                                               p_desc->p_endpt->mac.addr[2], p_desc->p_endpt->mac.addr[3],\r
+                                               p_desc->p_endpt->mac.addr[4], p_desc->p_endpt->mac.addr[5] ) );\r
+                                       ipoib_addr_set_sid( &p_desc->p_endpt->conn.service_id,\r
+                                                                               ipoib_addr_get_qpn( &p_ib_arp->dst_hw ) );\r
+\r
+                                       NdisFreeToNPagedLookasideList(\r
+                                               &p_port->buf_mgr.send_buf_list, p_desc->p_buf );\r
+                                       cl_qlist_insert_tail( &p_port->send_mgr.pending_list,\r
+                                                               IPOIB_LIST_ITEM_FROM_PACKET( p_desc->p_buf ) );\r
+                                       NdisInterlockedInsertTailList( &p_port->endpt_mgr.pending_conns, \r
+                                                                                               &p_desc->p_endpt->list_item, \r
+                                                                                               &p_port->endpt_mgr.conn_lock );\r
+                                       cl_event_signal( &p_port->endpt_mgr.event );\r
+                                       return NDIS_STATUS_PENDING;\r
+                       \r
+                       case IPOIB_CM_CONNECT:\r
+                               /* queue ARP REP packet until connected */\r
+                                       NdisFreeToNPagedLookasideList(\r
+                                       &p_port->buf_mgr.send_buf_list, p_desc->p_buf );\r
+                                       cl_qlist_insert_tail( &p_port->send_mgr.pending_list,\r
+                                                               IPOIB_LIST_ITEM_FROM_PACKET( p_desc->p_pkt ) );\r
+                                       return NDIS_STATUS_PENDING;\r
+                       default:\r
+                               break;\r
+                       }\r
+               }\r
+#endif\r
+       }\r
+       else\r
+       {\r
+               cl_memclr( &p_ib_arp->dst_hw, sizeof(ipoib_hw_addr_t) );\r
+       }\r
+       \r
+#if 0 //DBG\r
+       if( p_port->p_adapter->params.cm_enabled )\r
+       {\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+               (" ARP %s SEND to ENDPT[%p] State: %d flag: %#x, QPN: %#x MAC %02x:%02x:%02x:%02x:%02x:%02x\n",\r
+                       ( p_ib_arp->op == ARP_OP_REP ? "REP": "REQ"),                   p_desc->p_endpt, \r
+                       endpt_cm_get_state( p_desc->p_endpt ),\r
+                       p_desc->p_endpt->cm_flag, \r
+                       cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->dst_hw )),\r
+                       p_desc->p_endpt->mac.addr[0], p_desc->p_endpt->mac.addr[1],\r
+                       p_desc->p_endpt->mac.addr[2], p_desc->p_endpt->mac.addr[3],\r
+                       p_desc->p_endpt->mac.addr[4], p_desc->p_endpt->mac.addr[5] ));\r
+       }\r
+#endif\r
+\r
+       p_ib_arp->dst_ip = p_arp->dst_ip;\r
+\r
+       p_desc->send_wr[0].local_ds[1].vaddr = cl_get_physaddr( p_ib_arp );\r
+       p_desc->send_wr[0].local_ds[1].length = sizeof(ipoib_arp_pkt_t);\r
+       p_desc->send_wr[0].local_ds[1].lkey = p_port->ib_mgr.lkey;\r
+       p_desc->send_wr[0].wr.num_ds = 2;\r
+       p_desc->send_wr[0].wr.p_next = NULL;\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_SEND );\r
+       return NDIS_STATUS_SUCCESS;\r
+}\r
+\r
+static inline NDIS_STATUS\r
+__send_mgr_queue(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              eth_hdr_t* const                        p_eth_hdr,\r
+               OUT                     ipoib_endpt_t** const           pp_endpt )\r
+{\r
+       NDIS_STATUS                     status;\r
+\r
+       PERF_DECLARE( GetEndpt );\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_SEND );\r
+\r
+       /* Check the send queue and pend the request if not empty. */\r
+       if( cl_qlist_count( &p_port->send_mgr.pending_list ) )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,\r
+                       ("Pending list not empty.\n") );\r
+               return NDIS_STATUS_PENDING;\r
+       }\r
+\r
+       /* Check the send queue and pend the request if not empty. */\r
+       if( p_port->send_mgr.depth == p_port->p_adapter->params.sq_depth )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,\r
+                       ("No available WQEs.\n") );\r
+               return NDIS_STATUS_PENDING;\r
+       }\r
+\r
+       cl_perf_start( GetEndpt );\r
+       status = __endpt_mgr_ref( p_port, p_eth_hdr->dst, pp_endpt );\r
+       cl_perf_stop( &p_port->p_adapter->perf, GetEndpt );\r
+\r
+       if( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION &&\r
+               ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )\r
+       {\r
+               if( ipoib_port_join_mcast( p_port, p_eth_hdr->dst, \r
+                       IB_MC_REC_STATE_FULL_MEMBER) == IB_SUCCESS )\r
+               {\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,\r
+                               ("Multicast Mac - trying to join.\n") );\r
+                       return NDIS_STATUS_PENDING;\r
+               }\r
+       }\r
+       else if ( status == NDIS_STATUS_SUCCESS && \r
+                         ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) &&  \r
+                         !ETH_IS_BROADCAST( p_eth_hdr->dst.addr ) )\r
+       {\r
+               CL_ASSERT( (*pp_endpt) );\r
+               CL_ASSERT((*pp_endpt)->h_mcast != NULL);\r
+               (*pp_endpt)->is_in_use = TRUE;\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_SEND );\r
+       return status;\r
+}\r
+\r
+\r
+static NDIS_STATUS\r
+__build_send_desc(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              eth_hdr_t* const                        p_eth_hdr,\r
+       IN                              MDL* const                                      p_mdl,\r
+       IN              const   size_t                                          mdl_len,\r
+       IN                              SCATTER_GATHER_LIST                     *p_sgl,\r
+       IN      OUT                     ipoib_send_desc_t* const        p_desc )\r
+{\r
+       NDIS_STATUS                     status;\r
+       int32_t                         hdr_idx;\r
+       uint32_t                        mss = 0;\r
+\r
+       PNDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO                      p_checksum_list_info;\r
+       PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO       p_lso_info;\r
+       PERF_DECLARE( SendMgrFilter );\r
+       \r
+       IPOIB_ENTER( IPOIB_DBG_SEND );\r
+\r
+       /* Format the send descriptor. */\r
+       p_checksum_list_info =\r
+               (PNDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO) NET_BUFFER_LIST_INFO( p_desc->p_netbuf_list,TcpIpChecksumNetBufferListInfo);\r
+\r
+       // Calculate LSO\r
+       if( p_port->p_adapter->params.lso ) {\r
+               p_lso_info = \r
+                       (PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO) \r
+                       NET_BUFFER_LIST_INFO( p_desc->p_netbuf_list, TcpLargeSendNetBufferListInfo );\r
+               ASSERT(p_lso_info);\r
+               if (p_lso_info) {\r
+                       mss = (p_lso_info->LsoV1Transmit.MSS | p_lso_info->LsoV2Transmit.MSS);\r
+               }\r
+       }\r
+                       \r
+       /* Format the send descriptor. */\r
+       hdr_idx = cl_atomic_inc( &p_port->hdr_idx );\r
+       hdr_idx &= (p_port->p_adapter->params.sq_depth - 1);\r
+       ASSERT( hdr_idx < p_port->p_adapter->params.sq_depth );\r
+       p_port->hdr[hdr_idx].type = p_eth_hdr->type;\r
+       p_port->hdr[hdr_idx].resv = 0;\r
+\r
+       p_desc->send_wr[0].local_ds[0].vaddr = cl_get_physaddr( &p_port->hdr[hdr_idx] );\r
+       p_desc->send_wr[0].local_ds[0].length = sizeof(ipoib_hdr_t);\r
+       p_desc->send_wr[0].local_ds[0].lkey = p_port->ib_mgr.lkey;\r
+       p_desc->send_wr[0].wr.send_opt = 0;\r
+\r
+       \r
+               \r
+       if (mss) { //We have LSO packet\r
+               ASSERT( mss == (p_lso_info->LsoV1Transmit.MSS & p_lso_info->LsoV2Transmit.MSS));\r
+               ASSERT ( (mss & (1<<20)) == mss);\r
+               status = __build_lso_desc( p_port, p_desc, mss, p_sgl, hdr_idx, p_lso_info );\r
+               if( status != NDIS_STATUS_SUCCESS )\r
+               {\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("__build_lso_desc returned 0x%08X.\n", status) );\r
+                       return status;\r
+               }\r
+       }\r
+       \r
+       else\r
+       {\r
+               uint32_t        i;\r
+               cl_perf_start( SendMgrFilter );\r
+               status = __send_mgr_filter(\r
+               p_port, p_eth_hdr, p_mdl, mdl_len,p_sgl, p_desc );\r
+               cl_perf_stop( &p_port->p_adapter->perf, SendMgrFilter );\r
+               if( status != NDIS_STATUS_SUCCESS )\r
+               {\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("__send_mgr_filter returned 0x%08X.\n", status) );\r
+                       return status;\r
+               }\r
+\r
+               if( p_desc->send_dir == SEND_UD_QP )\r
+               {\r
+                       p_desc->send_qp = p_port->ib_mgr.h_qp; // UD QP\r
+                       for( i = 0; i < p_desc->num_wrs; i++ )\r
+                       {\r
+                               p_desc->send_wr[i].wr.dgrm.ud.remote_qp = p_desc->p_endpt->qpn;\r
+                               p_desc->send_wr[i].wr.dgrm.ud.remote_qkey = p_port->ib_mgr.bcast_rec.qkey;\r
+                               p_desc->send_wr[i].wr.dgrm.ud.h_av = p_desc->p_endpt->h_av;\r
+                               p_desc->send_wr[i].wr.dgrm.ud.pkey_index = p_port->pkey_index;\r
+                               p_desc->send_wr[i].wr.dgrm.ud.rsvd = NULL;\r
+                               p_desc->send_wr[i].wr.send_opt = 0;\r
+\r
+                               if( p_port->p_adapter->params.send_chksum_offload && \r
+                                       ( p_checksum_list_info->Transmit.IsIPv4  || \r
+                                       p_checksum_list_info->Transmit.IsIPv6  ))\r
+                               {\r
+                                       // Set transimition checksum offloading\r
+                                       if( p_checksum_list_info->Transmit.IpHeaderChecksum )\r
+                                       {\r
+                                               p_desc->send_wr[i].wr.send_opt |= IB_SEND_OPT_TX_IP_CSUM;\r
+                                       }\r
+                                       if( p_checksum_list_info->Transmit.TcpChecksum )\r
+                                       {\r
+                                               p_desc->send_wr[i].wr.send_opt |= IB_SEND_OPT_TX_TCP_UDP_CSUM;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               else // RC QP\r
+               {\r
+                       CL_ASSERT( p_desc->send_dir == SEND_RC_QP );\r
+                       p_desc->send_qp = p_desc->p_endpt->conn.h_work_qp;\r
+               }\r
+               for( i = 0; i < p_desc->num_wrs; i++ )\r
+               {\r
+                       p_desc->send_wr[i].wr.wr_type = WR_SEND;\r
+                       p_desc->send_wr[i].wr.wr_id = 0;\r
+                       p_desc->send_wr[i].wr.ds_array = &p_desc->send_wr[i].local_ds[0];\r
+                       if( i )\r
+                       {\r
+                               p_desc->send_wr[i-1].wr.p_next = &p_desc->send_wr[i].wr;\r
+                       }\r
+               }\r
+               //TODO p_net_buf or p_buf\r
+//             p_desc->send_wr[p_desc->num_wrs - 1].wr.wr_id = (uintn_t)NET_BUFFER_LIST_FIRST_NB(p_desc->p_netbuf_list );\r
+//????         IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("WR_ID was set to NBL 0x%x \n",p_desc->p_netbuf_list ));\r
+               p_desc->send_wr[p_desc->num_wrs - 1].wr.wr_id = (uintn_t)p_desc->p_netbuf_list ;\r
+\r
+               p_desc->send_wr[p_desc->num_wrs - 1].wr.send_opt |= IB_SEND_OPT_SIGNALED;\r
+               p_desc->send_wr[p_desc->num_wrs - 1].wr.p_next = NULL;\r
+       }\r
+\r
+       /* Store context in our reserved area of the packet. */\r
+       IPOIB_PORT_FROM_PACKET( p_desc->p_netbuf_list ) = p_port;\r
+       IPOIB_ENDPT_FROM_PACKET( p_desc->p_netbuf_list ) = p_desc->p_endpt;\r
+       IPOIB_SEND_FROM_NETBUFFER( NET_BUFFER_LIST_FIRST_NB(p_desc->p_netbuf_list ))= p_desc->p_buf;\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_SEND );\r
+       return NDIS_STATUS_SUCCESS;\r
+}\r
+\r
+static NDIS_STATUS\r
+__build_lso_desc(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN      OUT                     ipoib_send_desc_t* const        p_desc,\r
+       IN                              ULONG                                           mss,\r
+       IN                              SCATTER_GATHER_LIST                     *p_sgl,\r
+       IN                              int32_t                                         hdr_idx, \r
+       IN PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO p_lso_info)\r
+{\r
+       NDIS_STATUS                     status;\r
+       LsoData                                                         TheLsoData;\r
+       UINT                                                            IndexOfData = 0;\r
+       \r
+       PNET_BUFFER     FirstBuffer  = NET_BUFFER_LIST_FIRST_NB (p_desc->p_netbuf_list);\r
+       ULONG                   PacketLength = NET_BUFFER_DATA_LENGTH(FirstBuffer);\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_SEND );\r
+\r
+\r
+\r
+       memset(&TheLsoData, 0, sizeof TheLsoData );\r
+       status = GetLsoHeaderSize(\r
+               FirstBuffer, \r
+               &TheLsoData, \r
+               &IndexOfData,\r
+               &p_port->hdr[hdr_idx] );\r
+\r
+       if ((status != NDIS_STATUS_SUCCESS ) || \r
+               (TheLsoData.FullBuffers != TheLsoData.UsedBuffers)) \r
+       {\r
+               ASSERT(FALSE);\r
+\r
+               IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("<-- Throwing this packet\n"));\r
+\r
+               if( status == NDIS_STATUS_SUCCESS )\r
+               {\r
+                       status = NDIS_STATUS_INVALID_PACKET;\r
+               }\r
+               return status;\r
+       }\r
+       ASSERT(TheLsoData.LsoHeaderSize> 0);\r
+       // Tell NDIS how much we will send.\r
+       //PktExt->NdisPacketInfo[TcpLargeSendPacketInfo] = UlongToPtr(PacketLength);\r
+       p_lso_info->LsoV1TransmitComplete.TcpPayload = PacketLength;\r
+\r
+       p_desc->send_wr[0].wr.dgrm.ud.mss = mss;\r
+       p_desc->send_wr[0].wr.dgrm.ud.header = TheLsoData.LsoBuffers[0].pData;\r
+       p_desc->send_wr[0].wr.dgrm.ud.hlen = TheLsoData.LsoHeaderSize ;//lso_header_size; \r
+       p_desc->send_wr[0].wr.dgrm.ud.remote_qp = p_desc->p_endpt->qpn;\r
+       p_desc->send_wr[0].wr.dgrm.ud.remote_qkey = p_port->ib_mgr.bcast_rec.qkey;\r
+       p_desc->send_wr[0].wr.dgrm.ud.h_av = p_desc->p_endpt->h_av;\r
+       p_desc->send_wr[0].wr.dgrm.ud.pkey_index = p_port->pkey_index;\r
+       p_desc->send_wr[0].wr.dgrm.ud.rsvd = NULL;\r
+\r
+       //TODO: Should be NBL or p_desc\r
+       p_desc->send_wr[0].wr.wr_id = (uintn_t)p_desc->p_netbuf_list;\r
+       p_desc->send_wr[0].wr.ds_array = p_desc->send_wr[0].local_ds;\r
+       p_desc->send_wr[0].wr.wr_type = WR_LSO;\r
+       p_desc->send_wr[0].wr.send_opt = \r
+               (IB_SEND_OPT_TX_IP_CSUM | IB_SEND_OPT_TX_TCP_UDP_CSUM) | IB_SEND_OPT_SIGNALED;\r
+       \r
+       p_desc->send_wr[0].wr.p_next = NULL;\r
+       p_desc->send_qp = p_port->ib_mgr.h_qp;\r
+       p_desc->send_dir = SEND_UD_QP;\r
+       status = __send_gen(p_port, p_desc, p_sgl, IndexOfData );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_SEND );\r
+       return status;\r
+}\r
+\r
+static inline void\r
+__process_failed_send(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ipoib_send_desc_t* const        p_desc,\r
+       IN              const   NDIS_STATUS                                     status,\r
+       IN                              ULONG                                           compl_flags)\r
+{\r
+       IPOIB_ENTER( IPOIB_DBG_SEND );\r
+\r
+       /* Complete the packet. */\r
+       NET_BUFFER_LIST_NEXT_NBL(p_desc->p_netbuf_list) = NULL;\r
+       NET_BUFFER_LIST_STATUS(p_desc->p_netbuf_list) = status;\r
+       NdisMSendNetBufferListsComplete( p_port->p_adapter->h_adapter,\r
+               p_desc->p_netbuf_list, compl_flags );\r
+       ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_ERROR, 0 );\r
+       /* Deref the endpoint. */\r
+       if( p_desc->p_endpt )\r
+               ipoib_endpt_deref( p_desc->p_endpt );\r
+\r
+       if( p_desc->p_buf )\r
+       {\r
+               NdisFreeToNPagedLookasideList(\r
+                       &p_port->buf_mgr.send_buf_list, p_desc->p_buf );\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_SEND );\r
+}\r
+\r
+// max number of physical fragmented buffers \r
+#define MAX_PHYS_BUF_FRAG_ELEMENTS      0x29\r
+#define MP_FRAG_ELEMENT SCATTER_GATHER_ELEMENT \r
+#define PMP_FRAG_ELEMENT PSCATTER_GATHER_ELEMENT \r
+\r
+\r
+typedef struct _MP_FRAG_LIST {\r
+    ULONG NumberOfElements;\r
+    ULONG_PTR Reserved;\r
+    SCATTER_GATHER_ELEMENT Elements[MAX_PHYS_BUF_FRAG_ELEMENTS];\r
+} MP_FRAG_LIST, *PMP_FRAG_LIST;\r
+\r
+\r
+void \r
+CreateFragList(\r
+    ULONG PhysBufCount,\r
+    PNET_BUFFER NetBuff,\r
+    ULONG PacketLength,\r
+    PMP_FRAG_LIST pFragList\r
+    )\r
+{\r
+//    ETH_ENTER(ETH_SND);\r
+\r
+    ULONG i = 0;\r
+       int j=0;\r
+\r
+    UINT  buf_len = NET_BUFFER_DATA_LENGTH(NetBuff);\r
+    PMDL pMdl = NET_BUFFER_CURRENT_MDL(NetBuff);\r
+\r
+    ULONG CurrentMdlDataOffset = NET_BUFFER_CURRENT_MDL_OFFSET(NetBuff);\r
+    ASSERT(MmGetMdlByteCount(pMdl) >= CurrentMdlDataOffset);\r
+\r
+    \r
+    ASSERT(NetBuff != NULL);\r
+#ifdef DBG\r
+    ASSERT(PhysBufCount <= MAX_PHYS_BUF_FRAG_ELEMENTS);\r
+#else\r
+       UNREFERENCED_PARAMETER(PhysBufCount);\r
+#endif\r
+    \r
+    ASSERT(buf_len > 0);\r
+    UNREFERENCED_PARAMETER(PacketLength);\r
+\r
+\r
+//    ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_SND, "CreateFragList: NetBuff %p, Length =0x%x\n", NetBuff, buf_len);\r
+\r
+    while ( (pMdl != NULL) && (buf_len != 0) )\r
+    {\r
+        PPFN_NUMBER page_array = MmGetMdlPfnArray(pMdl);\r
+        int MdlBufCount = ADDRESS_AND_SIZE_TO_SPAN_PAGES(MmGetMdlVirtualAddress(pMdl), MmGetMdlByteCount(pMdl));\r
+    \r
+        ULONG offset = MmGetMdlByteOffset(pMdl) + CurrentMdlDataOffset ;        \r
+        ULONG MdlBytesCount = MmGetMdlByteCount(pMdl) - CurrentMdlDataOffset;\r
+        CurrentMdlDataOffset = 0;\r
+        \r
+        if( MdlBytesCount == 0 )\r
+        {\r
+            pMdl = pMdl->Next;\r
+            continue;\r
+        }\r
+\r
+        ASSERT( (buf_len > 0) && (MdlBytesCount > 0) );\r
\r
+//        ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_SND, "CreateFragList: pMdl=%p, MdlBytesCount=x%x, MdlBufCount=0x%x\n", pMdl, MdlBytesCount, MdlBufCount);\r
+\r
+        if (MdlBytesCount > 0)\r
+        {\r
+            if( buf_len > MdlBytesCount)\r
+            {\r
+                buf_len -= MdlBytesCount;    \r
+            }\r
+            else\r
+            {\r
+                MdlBytesCount = buf_len;\r
+                buf_len = 0;                \r
+            }                        \r
+            //\r
+            // In some cases the mdlcount is greater than needed and in the last page\r
+            // there is 0 bytes\r
+            //\r
+            for (j=0; ((j< MdlBufCount) && (MdlBytesCount > 0)); j++) \r
+            {\r
+                ASSERT(MdlBytesCount > 0);\r
+                if (j ==0 ) \r
+                {\r
+                    //\r
+                    // First page\r
+                    //\r
+                    ULONG64 ul64PageNum = page_array[j];\r
+                    pFragList->Elements[i].Address.QuadPart = (ul64PageNum << PAGE_SHIFT)+ offset;\r
+                    if( offset + MdlBytesCount > PAGE_SIZE )\r
+                    {\r
+                        //\r
+                        // the data slides behind the page boundry\r
+                        //\r
+                        ASSERT(PAGE_SIZE > offset);\r
+                        pFragList->Elements[i].Length = PAGE_SIZE - offset;\r
+                        MdlBytesCount -= pFragList->Elements[i].Length;\r
+                    }\r
+                    else\r
+                    {\r
+                        //\r
+                        // All the data is hold in one page\r
+                        //    \r
+                        pFragList->Elements[i].Length = MdlBytesCount;\r
+                        MdlBytesCount = 0;\r
+                    }\r
+\r
+//                    ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_SND, "CreateFragList: j == 0, MdlBytesCount=x%x, i = %d, element.length=0x%x \n",  MdlBytesCount, i, pFragList->Elements[i].Length);                    \r
+                } \r
+                else \r
+                {\r
+                    if (page_array[j] == (page_array[j-1] + 1))\r
+                    {\r
+                        \r
+                        ULONG size = min(PAGE_SIZE, MdlBytesCount);\r
+                                               i -= 1;\r
+                        pFragList->Elements[i].Length += size;\r
+                        MdlBytesCount -= size;\r
+                    }\r
+                    else \r
+                    {\r
+                        //\r
+                        // Not first page. so the data always start at the begining of the page\r
+                        //\r
+                        ULONG64 ul64PageNum = page_array[j];\r
+                        pFragList->Elements[i].Address.QuadPart = (ul64PageNum << PAGE_SHIFT);\r
+                        pFragList->Elements[i].Length = min(PAGE_SIZE, MdlBytesCount);\r
+                        MdlBytesCount -= pFragList->Elements[i].Length;\r
+                    }\r
+\r
+//                    ETH_PRINT(TRACE_LEVEL_VERBOSE, ETH_SND, "CreateFragList: j != 0, MdlBytesCount=x%x, i = %d, element.length=0x%x \n",  MdlBytesCount, i, pFragList->Elements[i].Length);                    \r
+                }                \r
+                i++;\r
+                ASSERT(i <= MAX_PHYS_BUF_FRAG_ELEMENTS);\r
+            }\r
+        }\r
+\r
+        pMdl = pMdl->Next;\r
+    }\r
+        \r
+    if (buf_len != 0)\r
+    {\r
+        //\r
+        // In some cases the size in MDL isn't equal to the buffer size. In such \r
+        // a case we need to add the rest of packet to last chunk\r
+        //\r
+        ASSERT(i > 0); // To prevent array underflow\r
+        pFragList->Elements[i-1].Length += buf_len;\r
+//        ETH_PRINT(TRACE_LEVEL_ERROR, ETH_SND, "CreateFragList: buf_len != 0, i = %d, element.length=0x%x \n",  i -1, pFragList->Elements[i-1].Length);                    \r
+    }\r
+\r
+    ASSERT(i <= PhysBufCount);\r
+    pFragList->NumberOfElements = i;\r
+\r
+#ifdef DBG\r
+{\r
+    ULONG size = 0;\r
+    for (i  = 0; i <  pFragList->NumberOfElements; ++i)\r
+    {\r
+        size += pFragList->Elements[i].Length;\r
+    }\r
+    ASSERT(size == PacketLength);\r
+}\r
+#endif\r
+\r
+//    ETH_EXIT(ETH_SND);\r
+}\r
+\r
+\r
+\r
+\r
+void\r
+ipoib_port_send(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+    IN  NET_BUFFER_LIST     *p_net_buffer_list,\r
+    IN  ULONG               send_flags)\r
+{\r
+       NDIS_STATUS                     status;\r
+       PNET_BUFFER                     p_netbuf;\r
+       UINT                            buf_cnt = 0;\r
+       //ipoib_send_desc_t     *p_desc;\r
+       ULONG                           send_complete_flags = 0;\r
+       KIRQL                           old_irql;\r
+       PVOID                           p_sgl;\r
+       \r
+       PERF_DECLARE( GetEthHdr );\r
+       PERF_DECLARE( BuildSendDesc );\r
+       PERF_DECLARE( QueuePacket );\r
+       PERF_DECLARE( SendMgrQueue );\r
+       PERF_DECLARE( PostSend );\r
+       PERF_DECLARE( ProcessFailedSends );\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_SEND );\r
+       \r
+       if (NDIS_TEST_SEND_AT_DISPATCH_LEVEL(send_flags))\r
+       {\r
+               //TODO Tzachid: make an assert here to validate your IRQL\r
+               //ASSERT (KeGetCurrentIRQL() == DISPATCH_LEVEL);\r
+               NDIS_SET_SEND_COMPLETE_FLAG(send_complete_flags, NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL);\r
+       } else {\r
+               //ASSERT (KeGetCurrentIRQL() == PASSIVE_LEVEL);\r
+       }\r
+       \r
+       cl_obj_lock( &p_port->obj );\r
+       if( p_port->state != IB_QPS_RTS )\r
+       {\r
+               \r
+               \r
+               cl_obj_unlock( &p_port->obj );\r
+               \r
+               \r
+               NET_BUFFER_LIST_STATUS(p_net_buffer_list) = NDIS_STATUS_FAILURE;\r
+               NET_BUFFER_LIST_NEXT_NBL(p_net_buffer_list) = NULL;\r
+               ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );\r
+                       \r
+               NdisMSendNetBufferListsComplete(\r
+                       p_port->p_adapter->h_adapter,\r
+                       p_net_buffer_list,\r
+                       send_complete_flags);  \r
+               \r
+               return;\r
+       }\r
+       cl_obj_unlock( &p_port->obj );\r
+       \r
+       //IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+       //                      ("Processing netbuffer list: %x\n", p_net_buffer_list));\r
+       for (p_netbuf = NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);\r
+                p_netbuf != NULL; \r
+                p_netbuf = NET_BUFFER_NEXT_NB(p_netbuf))\r
+       {\r
+               IPOIB_PORT_FROM_PACKET(p_net_buffer_list) = p_port;\r
+               IPOIB_NET_BUFFER_LIST_FROM_NETBUFFER(p_netbuf)  = p_net_buffer_list;\r
+               IPOIB_FROM_QUEUE(p_netbuf) = NULL;\r
+               /*p_desc = &p_port->send_mgr.desc;\r
+               p_desc->p_buf = p_netbuf;\r
+               p_desc->p_endpt = NULL;\r
+               p_desc->p_buf = NULL;\r
+               p_desc->send_qp = NULL;\r
+               p_desc->num_wrs = 1;\r
+               p_desc->send_dir = 0;*/\r
+               \r
+               old_irql = KeGetCurrentIrql();\r
+               if (old_irql < DISPATCH_LEVEL) \r
+               {\r
+                       KeRaiseIrqlToDpcLevel();\r
+               }\r
+               ++buf_cnt;\r
+               //IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+               //              ("[%d] Netbuf = %x\n",buf_cnt, p_netbuf) );\r
+               if (cl_is_item_in_qlist( &p_port->send_mgr.pending_list,\r
+                                               IPOIB_LIST_ITEM_FROM_PACKET( p_net_buffer_list ))) {\r
+                               p_sgl = IPOIB_FROM_QUEUE(p_netbuf);     \r
+                               //IPOIB_FROM_QUEUE(p_net_buffer) = (void*)1;\r
+                               ASSERT (p_sgl);                         \r
+                               //IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               //              ("[%d] FROM_QUEUE Netbuf = %x, found SGL = %x\n",buf_cnt, p_netbuf, p_sgl) );\r
+                                status = NDIS_STATUS_SUCCESS;\r
+               } else {\r
+\r
+//#if 0\r
+                       CHAR *pTemp = (CHAR *) ExAllocatePoolWithTag(NonPagedPool , p_port->p_adapter->sg_list_size, 'abcd');\r
+                       CL_ASSERT(pTemp != NULL);\r
+                       status = NDIS_STATUS_SUCCESS;\r
+                       p_sgl = pTemp;\r
+                       CreateFragList(NdisQueryNetBufferPhysicalCount(p_netbuf), p_netbuf, NET_BUFFER_DATA_LENGTH(p_netbuf), (PMP_FRAG_LIST) p_sgl);\r
+                       IPOIB_FROM_QUEUE(p_netbuf) = NULL;\r
+                       /*IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                               ("[%d] Allocation from scratch: Netbuf = %x, found SGL = %x, PhysBufCnt=%ld, NB LEN = %ld, sg_list_size=%ld\n",\r
+                                               buf_cnt, p_netbuf, p_sgl,NdisQueryNetBufferPhysicalCount(p_netbuf) ,\r
+                                               NET_BUFFER_DATA_LENGTH(p_netbuf),p_port->p_adapter->sg_list_size) );\r
+                                               */\r
+                       ipoib_process_sg_list(NULL, NULL, (PSCATTER_GATHER_LIST)p_sgl, p_netbuf);\r
+                       status = NDIS_STATUS_SUCCESS;\r
+//#endif\r
+#if 0          \r
+                       status = NdisMAllocateNetBufferSGList(\r
+                                                                       p_port->p_adapter->NdisMiniportDmaHandle,\r
+                                                                       p_netbuf,\r
+                                                                       p_netbuf,\r
+                                                                       NDIS_SG_LIST_WRITE_TO_DEVICE,\r
+                                                                       NULL,\r
+                                                                       0);\r
+#endif\r
+               }\r
+               KeLowerIrql (old_irql);\r
+       \r
+               if( status != NDIS_STATUS_SUCCESS )\r
+               {\r
+                       /* fail net buffer list */\r
+                       NET_BUFFER_LIST_NEXT_NBL(p_net_buffer_list) = NULL;\r
+                       NET_BUFFER_LIST_STATUS(p_net_buffer_list) = NDIS_STATUS_RESOURCES;\r
+                       NdisMSendNetBufferListsComplete(\r
+                               p_port->p_adapter->h_adapter,\r
+                               p_net_buffer_list,\r
+                               send_complete_flags);   \r
+                               break;\r
+               }\r
+               ASSERT(buf_cnt);\r
+               IPOIB_GET_NET_BUFFER_LIST_REF_COUNT(p_net_buffer_list) = (PVOID)(ULONG_PTR)buf_cnt;\r
+       }\r
+       \r
+}\r
+\r
+\r
+void\r
+ipoib_port_resume(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN boolean_t                                                            b_pending )\r
+{\r
+       NDIS_STATUS                     status;\r
+       cl_list_item_t          *p_item;\r
+       NET_BUFFER                      *p_net_buffer;\r
+       NET_BUFFER_LIST         *p_net_buffer_list;\r
+       //ipoib_send_desc_t     *p_desc;\r
+       KIRQL                           old_irql;\r
+       UINT                            buf_cnt = 0;\r
+       NET_BUFFER_LIST         *p_prev_nbl = NULL;\r
+       PVOID                           p_sgl;\r
+       static PVOID            p_prev_sgl = NULL;\r
+       \r
+       PERF_DECLARE( GetEndpt );\r
+       PERF_DECLARE( BuildSendDesc );\r
+       PERF_DECLARE( ProcessFailedSends );\r
+       PERF_DECLARE( PostSend );\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_SEND );\r
+\r
+       UNUSED_PARAM(b_pending);\r
+       \r
+       cl_obj_lock( &p_port->obj );\r
+       if( p_port->state != IB_QPS_RTS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,\r
+                       ("Invalid state - Aborting.\n") );\r
+               cl_obj_unlock( &p_port->obj );\r
+               return;\r
+       }\r
+       cl_obj_unlock( &p_port->obj );\r
+\r
+//TODO NDIS60\r
+////??????????????     cl_spinlock_acquire( &p_port->send_lock );\r
+\r
+       for( p_item = cl_qlist_head( &p_port->send_mgr.pending_list );\r
+               p_item != cl_qlist_end( &p_port->send_mgr.pending_list );\r
+               p_item = cl_qlist_head( &p_port->send_mgr.pending_list ) )\r
+       {\r
+               \r
+               \r
+               /* Check the send queue and pend the request if not empty. */\r
+               if( p_port->send_mgr.depth == p_port->p_adapter->params.sq_depth )\r
+               {\r
+                       IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,\r
+                               ("No available WQEs.\n") );\r
+                       break;\r
+               }\r
+               \r
+               p_net_buffer_list = IPOIB_PACKET_FROM_LIST_ITEM(\r
+                       cl_qlist_remove_head( &p_port->send_mgr.pending_list ) );\r
+               if (p_prev_nbl == p_net_buffer_list) {\r
+//                     IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+       //                      ("TRYING TO PROCESS ONCE AGAIN, EXITING: %x\n", p_net_buffer_list));\r
+                       break; //TODO more sophisticated mechanism to avoid starvation\r
+               }\r
+               old_irql = KeGetCurrentIrql();\r
+               if (old_irql < DISPATCH_LEVEL) \r
+               {\r
+                       KeRaiseIrqlToDpcLevel();\r
+               }\r
+//             IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+       //              ("Processing netbuffer list from queue: %x\n", (UINT) (PVOID) p_net_buffer_list));\r
+               \r
+               for( p_net_buffer = NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);\r
+                        p_net_buffer != NULL;\r
+                        p_net_buffer = NET_BUFFER_NEXT_NB(p_net_buffer), buf_cnt++)\r
+                               {\r
+\r
+                       \r
+                       p_sgl = IPOIB_FROM_QUEUE(p_net_buffer); \r
+                       //IPOIB_FROM_QUEUE(p_net_buffer) = (void*)1;\r
+                       ASSERT (p_sgl);\r
+                       IPOIB_PORT_FROM_PACKET(p_net_buffer_list) = p_port;\r
+                       IPOIB_NET_BUFFER_LIST_FROM_NETBUFFER(p_net_buffer)  = p_net_buffer_list;\r
+                       /*p_desc = &p_port->send_mgr.desc;\r
+                       p_desc->p_buf = p_net_buffer;\r
+                       p_desc->p_endpt = NULL;\r
+                       p_desc->p_buf = NULL;\r
+                       p_desc->send_qp = NULL;\r
+                       p_desc->num_wrs = 1;\r
+                       p_desc->send_dir = 0;*/\r
+\r
+//                     IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+       //                      ("[%d] Netbuf = %x, p_sgl = %x\n",buf_cnt, p_net_buffer, p_sgl) );\r
+                       ASSERT(p_sgl);\r
+                       if (p_sgl != (void*) 1) {\r
+                               ipoib_process_sg_list(NULL, NULL, (PSCATTER_GATHER_LIST) p_sgl, p_net_buffer);\r
+                               status = NDIS_STATUS_SUCCESS;\r
+                       }\r
+                       else {\r
+                               ASSERT(FALSE);\r
+                               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Getting strange flow\n") );\r
+                               NdisMFreeNetBufferSGList(\r
+                                                                       p_port->p_adapter->NdisMiniportDmaHandle,\r
+                                                                       (PSCATTER_GATHER_LIST)p_sgl,\r
+                                                                       p_net_buffer );\r
+                               status = NdisMAllocateNetBufferSGList(\r
+                                                                       p_port->p_adapter->NdisMiniportDmaHandle,\r
+                                                                       p_net_buffer,\r
+                                                                       p_net_buffer,\r
+                                                                       NDIS_SG_LIST_WRITE_TO_DEVICE,\r
+                                                                       NULL,\r
+                                                                       0 /*p_port->p_adapter->sg_list_size*/ );\r
+                       }\r
+                       p_prev_sgl = p_sgl;             \r
+                       if( status != NDIS_STATUS_SUCCESS )\r
+                       {\r
+                               /* fail net buffer list */\r
+                               NET_BUFFER_LIST_NEXT_NBL(p_net_buffer_list) = NULL;\r
+                               NET_BUFFER_LIST_STATUS(p_net_buffer_list) = NDIS_STATUS_RESOURCES;\r
+                               NdisMSendNetBufferListsComplete(\r
+                                       p_port->p_adapter->h_adapter,\r
+                                       p_net_buffer_list,\r
+                                       0);     \r
+                               break;\r
+                       }\r
+               }\r
+                        \r
+               KeLowerIrql (old_irql);\r
+               \r
+               \r
+               p_prev_nbl = p_net_buffer_list;\r
+               \r
+       }\r
+       IPOIB_EXIT( IPOIB_DBG_SEND );\r
+}\r
+\r
+\r
+\r
+static void\r
+__send_cb(\r
+       IN              const   ib_cq_handle_t                          h_cq,\r
+       IN                              void                                            *cq_context )\r
+{\r
+       ipoib_port_t            *p_port;\r
+       ib_api_status_t         status;\r
+       ib_wc_t                         wc[MAX_SEND_WC], *p_wc, *p_free;\r
+       cl_qlist_t                      done_list;\r
+       NET_BUFFER_LIST         *p_nbl;\r
+       uint32_t                        length;\r
+       ipoib_endpt_t           *p_endpt;\r
+       send_buf_t                      *p_send_buf;\r
+       ip_stat_sel_t           type;\r
+       size_t                          i;\r
+       NET_BUFFER                      *p_netbuffer = NULL;\r
+\r
+       PERF_DECLARE( SendCompBundle );\r
+       PERF_DECLARE( SendCb );\r
+       PERF_DECLARE( PollSend );\r
+       PERF_DECLARE( SendComp );\r
+       PERF_DECLARE( FreeSendBuf );\r
+       PERF_DECLARE( RearmSend );\r
+       PERF_DECLARE( PortResume );\r
\r
+       IPOIB_ENTER( IPOIB_DBG_SEND );\r
+\r
+       cl_perf_clr( SendCompBundle );\r
+\r
+       cl_perf_start( SendCb );\r
+\r
+       UNUSED_PARAM( h_cq );\r
+\r
+       cl_qlist_init( &done_list );\r
+\r
+       p_port = (ipoib_port_t*)cq_context;\r
+\r
+       ipoib_port_ref( p_port, ref_send_cb );\r
+\r
+       for( i = 0; i < MAX_SEND_WC; i++ )\r
+               wc[i].p_next = &wc[i + 1];\r
+       wc[MAX_SEND_WC - 1].p_next = NULL;\r
+\r
+       do\r
+       {\r
+               p_free = wc;\r
+               cl_perf_start( PollSend );\r
+               status = p_port->p_adapter->p_ifc->poll_cq( p_port->ib_mgr.h_send_cq, &p_free, &p_wc );\r
+               cl_perf_stop( &p_port->p_adapter->perf, PollSend );\r
+               CL_ASSERT( status == IB_SUCCESS || status == IB_NOT_FOUND );\r
+\r
+               while( p_wc )\r
+               {\r
+                       cl_perf_start( SendComp );\r
+                       CL_ASSERT( p_wc->status != IB_WCS_SUCCESS || p_wc->wc_type == IB_WC_SEND );\r
+                       p_nbl = (NET_BUFFER_LIST*)(uintn_t)p_wc->wr_id;\r
+                       //IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_SEND,\r
+                       //("[1]Successfull send completion for NBL=0x%x .\n", (UINT) (PVOID) p_nbl ));\r
+                       CL_ASSERT( p_nbl );\r
+                       CL_ASSERT( IPOIB_PORT_FROM_PACKET( p_nbl ) == p_port );\r
+                       length = 0;\r
+                       p_endpt = IPOIB_ENDPT_FROM_PACKET( p_nbl );\r
+                       p_send_buf = IPOIB_SEND_FROM_NETBUFFER( NET_BUFFER_LIST_FIRST_NB (p_nbl ));\r
+                       \r
+                       switch( p_wc->status )\r
+                       {\r
+                       case IB_WCS_SUCCESS:\r
+                               if( p_endpt->h_mcast )\r
+                               {\r
+                                       if( p_endpt->dgid.multicast.raw_group_id[11] == 0xFF &&\r
+                                               p_endpt->dgid.multicast.raw_group_id[10] == 0xFF &&\r
+                                               p_endpt->dgid.multicast.raw_group_id[12] == 0xFF &&\r
+                                               p_endpt->dgid.multicast.raw_group_id[13] == 0xFF )\r
+                                       {\r
+                                               type = IP_STAT_BCAST_BYTES;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               type = IP_STAT_MCAST_BYTES;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       type = IP_STAT_UCAST_BYTES;\r
+                               }\r
+                               for (p_netbuffer = NET_BUFFER_LIST_FIRST_NB(p_nbl);\r
+                                        p_netbuffer != NULL;\r
+                                        p_netbuffer = NET_BUFFER_NEXT_NB(p_netbuffer))\r
+                               {\r
+                                        length += NET_BUFFER_DATA_LENGTH(p_netbuffer);\r
+                               }                       \r
+                               ipoib_inc_send_stat( p_port->p_adapter, type, length );\r
+                               //      IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_SEND,\r
+                                       //("Successfull send completion for NBL=0x%x .\n", (UINT) (PVOID) p_nbl) );\r
+                               NET_BUFFER_LIST_STATUS(p_nbl) = NDIS_STATUS_SUCCESS;\r
+                               IPOIB_DEC_NET_BUFFER_LIST_REF_COUNT(p_nbl);\r
+                               if (IPOIB_GET_NET_BUFFER_LIST_REF_COUNT(p_nbl) == 0)\r
+                                       NdisMSendNetBufferListsComplete(p_port->p_adapter->h_adapter,\r
+                                                                                               p_nbl,\r
+                                                                                               0);\r
+                               break;\r
+\r
+                       case IB_WCS_WR_FLUSHED_ERR:\r
+                               IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,\r
+                                       ("Flushed send completion.\n") );\r
+                                       ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );\r
+                               NET_BUFFER_LIST_STATUS(p_nbl) = NDIS_STATUS_RESET_IN_PROGRESS;\r
+                               NdisMSendNetBufferListsComplete(p_port->p_adapter->h_adapter,\r
+                                                                                               p_nbl,\r
+                                                                                               0);   \r
+                               break;\r
+\r
+                       default:\r
+                               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                       ("Send failed with %s (vendor specific %#x)\n",\r
+                                       p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status ),\r
+                                       (int)p_wc->vendor_specific) );\r
+                                       ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_ERROR, 0 );\r
+                               NET_BUFFER_LIST_STATUS(p_nbl) = NDIS_STATUS_FAILURE;\r
+                               NdisMSendNetBufferListsComplete(p_port->p_adapter->h_adapter,\r
+                                                                                               p_nbl,\r
+                                                                                               0);  \r
+                               break;\r
+                       }\r
+                       cl_perf_stop( &p_port->p_adapter->perf, SendComp );\r
+                       /* Dereference the enpoint used for the transfer. */\r
+                       ipoib_endpt_deref( p_endpt );\r
+\r
+                       if( p_send_buf )\r
+                       {\r
+                               cl_perf_start( FreeSendBuf );\r
+                               NdisFreeToNPagedLookasideList( &p_port->buf_mgr.send_buf_list,\r
+                                       p_send_buf );\r
+                       cl_perf_stop( &p_port->p_adapter->perf, FreeSendBuf );\r
+                       }\r
+\r
+                       cl_atomic_dec( &p_port->send_mgr.depth );\r
+\r
+                       p_wc = p_wc->p_next;\r
+                       cl_perf_inc( SendCompBundle );\r
+               }\r
+               /* If we didn't use up every WC, break out. */\r
+       } while( !p_free );\r
+\r
+       /* Rearm the CQ. */\r
+       cl_perf_start( RearmSend );\r
+       status = p_port->p_adapter->p_ifc->rearm_cq( p_port->ib_mgr.h_send_cq, FALSE );\r
+       cl_perf_stop( &p_port->p_adapter->perf, RearmSend );\r
+       CL_ASSERT( status == IB_SUCCESS );\r
+\r
+       /* Resume any sends awaiting resources. */\r
+       cl_perf_start( PortResume );\r
+       ipoib_port_resume( p_port, TRUE );\r
+       cl_perf_stop( &p_port->p_adapter->perf, PortResume );\r
+       \r
+       ipoib_port_deref( p_port, ref_send_cb );\r
+\r
+       cl_perf_stop( &p_port->p_adapter->perf, SendCb );\r
+       cl_perf_update_ctr( &p_port->p_adapter->perf, SendCompBundle );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_SEND );\r
+}\r
+\r
+\r
+/******************************************************************************\r
+*\r
+* Endpoint manager implementation\r
+*\r
+******************************************************************************/\r
+static void\r
+__endpt_mgr_construct(\r
+       IN                              ipoib_port_t* const                     p_port )\r
+{\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+       cl_qmap_init( &p_port->endpt_mgr.mac_endpts );\r
+       cl_qmap_init( &p_port->endpt_mgr.lid_endpts );\r
+       cl_fmap_init( &p_port->endpt_mgr.gid_endpts, __gid_cmp );\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+}\r
+\r
+//TODO Restore CM\r
+#if 0\r
+static void\r
+__endpt_cm_mgr_thread(\r
+IN             void*           p_context );\r
+#endif\r
+\r
+static ib_api_status_t\r
+__endpt_mgr_init(\r
+       IN                              ipoib_port_t* const                     p_port )\r
+{\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+#if 0\r
+       if( p_port->p_adapter->params.cm_enabled )\r
+       {\r
+               cl_fmap_init( &p_port->endpt_mgr.conn_endpts, __gid_cmp );\r
+               \r
+               NdisInitializeListHead( &p_port->endpt_mgr.pending_conns );\r
+               NdisAllocateSpinLock( &p_port->endpt_mgr.conn_lock );\r
+               cl_event_init( &p_port->endpt_mgr.event, FALSE );\r
+       \r
+               NdisInitializeListHead( &p_port->endpt_mgr.remove_conns );\r
+               NdisAllocateSpinLock( &p_port->endpt_mgr.remove_lock );\r
+\r
+               cl_thread_init( &p_port->endpt_mgr.h_thread, \r
+                                               __endpt_cm_mgr_thread,\r
+                                               ( const void *)p_port, \r
+                                               "CmEndPtMgr" );\r
+       }\r
+#endif\r
+       UNUSED_PARAM(p_port);\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+       return IB_SUCCESS;\r
+}\r
+\r
+//TODO CM Restore\r
+#if 0\r
+static void\r
+__endpt_cm_mgr_thread(\r
+IN             void*           p_context )\r
+{\r
+       ib_api_status_t ib_status;\r
+       LIST_ENTRY              *p_item;\r
+       ipoib_endpt_t   *p_endpt;\r
+       ipoib_port_t    *p_port =( ipoib_port_t *)p_context;\r
+       \r
+       IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, \r
+               ("Starting Port [%d] Endpt CM thread \n", p_port->port_num ) );\r
+\r
+       while( !p_port->endpt_mgr.thread_is_done )\r
+       {\r
+               cl_event_wait_on( &p_port->endpt_mgr.event, EVENT_NO_TIMEOUT, FALSE );\r
+       \r
+               while( ( p_item = NdisInterlockedRemoveHeadList( \r
+                                                               &p_port->endpt_mgr.pending_conns,\r
+                                                               &p_port->endpt_mgr.conn_lock) ) != NULL )\r
+               {\r
+\r
+                       p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, list_item );\r
+                       if( p_port->endpt_mgr.thread_is_done )\r
+                       {\r
+                               endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );\r
+                               continue;\r
+                       }\r
+\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+                               ("Endpt[%p] CONNECT REQ to MAC %02x:%02x:%02x:%02x:%02x:%02x\n",\r
+                               p_endpt,\r
+                               p_endpt->mac.addr[0], p_endpt->mac.addr[1],\r
+                               p_endpt->mac.addr[2], p_endpt->mac.addr[3],\r
+                               p_endpt->mac.addr[4], p_endpt->mac.addr[5] ) );\r
+                       \r
+                       if( !p_endpt->conn.h_send_qp )\r
+                       {\r
+                               ib_status = endpt_cm_create_qp( p_endpt, &p_endpt->conn.h_send_qp );\r
+                               if( ib_status != IB_SUCCESS )\r
+                               {\r
+                                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                               ("Endpt [%p ] CM create QP failed status %#x\n", p_endpt, ib_status ) );\r
+                               }\r
+                               else\r
+                               {\r
+                                       ib_status = ipoib_endpt_connect( p_endpt );\r
+                                       if( ib_status != IB_SUCCESS && ib_status != IB_PENDING )\r
+                                       {\r
+                                               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                                                       ("Endpt [ %p ] conn REQ failed status %#x\n", p_endpt, ib_status ) );\r
+                                       }\r
+                               }\r
+                               if( ib_status != IB_SUCCESS && ib_status != IB_PENDING )\r
+                               {\r
+                                       endpt_cm_set_state( p_endpt, IPOIB_CM_DESTROY );\r
+                                       endpt_cm_flush_recv( p_port, p_endpt );\r
+                                       endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );\r
+                               }\r
+                       }\r
+\r
+               }//while( p_item != NULL )\r
+\r
+               while( ( p_item = NdisInterlockedRemoveHeadList(\r
+                                                               &p_port->endpt_mgr.remove_conns,\r
+                                                               &p_port->endpt_mgr.remove_lock ) ) != NULL )\r
+               {\r
+                       p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, list_item );\r
+\r
+                       endpt_cm_set_state( p_endpt, IPOIB_CM_DESTROY );\r
+\r
+                       IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,\r
+                               ("\nDESTROYING Endpt[%p]  MAC %02x:%02x:%02x:%02x:%02x:%02x\n",\r
+                               p_endpt,\r
+                               p_endpt->mac.addr[0], p_endpt->mac.addr[1],\r
+                               p_endpt->mac.addr[2], p_endpt->mac.addr[3],\r
+                               p_endpt->mac.addr[4], p_endpt->mac.addr[5] ) );\r
+                       endpt_cm_flush_recv( p_port, p_endpt );\r
+                       endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );\r
+                       cl_obj_destroy( &p_endpt->obj );\r
+               }\r
+       }\r
+\r
+       p_port->endpt_mgr.thread_is_done++;\r
+       NdisFreeSpinLock( &p_port->endpt_mgr.conn_lock );\r
+       \r
+       IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, \r
+               (" Port [%d] Endpt thread is done\n", p_port->port_num ) );\r
+}\r
+#endif\r
+\r
+static void\r
+__endpt_mgr_destroy(\r
+       IN                              ipoib_port_t* const                     p_port )\r
+{\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+       CL_ASSERT( cl_is_qmap_empty( &p_port->endpt_mgr.mac_endpts ) );\r
+       CL_ASSERT( cl_is_qmap_empty( &p_port->endpt_mgr.lid_endpts ) );\r
+       CL_ASSERT( cl_is_fmap_empty( &p_port->endpt_mgr.gid_endpts ) );\r
+       UNUSED_PARAM(p_port);\r
+#if 0\r
+       if( p_port->p_adapter->params.cm_enabled )\r
+       {\r
+               CL_ASSERT( cl_is_fmap_empty( &p_port->endpt_mgr.conn_endpts ) );\r
+       }\r
+#endif\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+}\r
+\r
+\r
+static void\r
+__endpt_mgr_remove_all(\r
+       IN                              ipoib_port_t* const                     p_port )\r
+{\r
+       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
+       \r
+       cl_obj_lock( &p_port->obj );\r
+       /* Wait for all readers to complete. */\r
+       while( p_port->endpt_rdr )\r
+               ;\r
+       /*\r
+        * We don't need to initiate destruction - this is called only\r
+        * from the __port_destroying function, and destruction cascades\r
+        * to all child objects.  Just clear all the maps.\r
+        */\r
+       cl_qmap_remove_all( &p_port->endpt_mgr.mac_endpts );\r
+       cl_qmap_remove_all( &p_port->endpt_mgr.lid_endpts );\r
+       cl_fmap_remove_all( &p_port->endpt_mgr.gid_endpts );\r
+       cl_obj_unlock( &p_port->obj );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
+}\r
+\r
+\r
+static void\r
+__endpt_mgr_reset_all(\r
+       IN                              ipoib_port_t* const                     p_port )\r
+{\r
+       cl_map_item_t                   *p_item;\r
+       cl_fmap_item_t                  *p_fmap_item;\r
+       ipoib_endpt_t                   *p_endpt;\r
+       cl_qlist_t                              mc_list;\r
+       cl_qlist_t                              conn_list;\r
+       uint32_t                                local_exist = 0;\r
+       NDIS_LINK_STATE                 link_state;\r
+       NDIS_STATUS_INDICATION  status_indication;\r
+\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
+\r
+       cl_qlist_init( &mc_list );\r
+       cl_qlist_init( &conn_list );\r
+//???  cl_obj_lock( &p_port->obj );\r
+       /* Wait for all readers to complete. */\r
+       while( p_port->endpt_rdr )\r
+               ;\r
+\r
+#if 0\r
+                       __endpt_mgr_remove_all(p_port);\r
+#else\r
+                       link_state.Header.Revision = NDIS_LINK_STATE_REVISION_1;\r
+                       link_state.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;\r
+                       link_state.Header.Size = sizeof(NDIS_LINK_STATE);\r
+                       link_state.MediaConnectState = MediaConnectStateDisconnected;\r
+                       link_state.MediaDuplexState = MediaDuplexStateFull;\r
+                       link_state.XmitLinkSpeed = link_state.RcvLinkSpeed = IPOIB_MEDIA_MAX_SPEED;\r
+\r
+                       IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,\r
+                                                               p_port->p_adapter->h_adapter,\r
+                                                               NDIS_STATUS_LINK_STATE,\r
+                                                               (PVOID)&link_state,\r
+                                                               sizeof(link_state));\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, ("Indicate DISCONNECT!\n") );\r
+                       NdisMIndicateStatusEx(p_port->p_adapter->h_adapter,&status_indication);\r
+                       \r
+                       link_state.MediaConnectState = MediaConnectStateConnected;\r
+                       IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,\r
+                                                               p_port->p_adapter->h_adapter,\r
+                                                               NDIS_STATUS_LINK_STATE,\r
+                                                               (PVOID)&link_state,\r
+                                                               sizeof(link_state));\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, ("Indicate Connect\n") );\r
+                       NdisMIndicateStatusEx(p_port->p_adapter->h_adapter,&status_indication);\r
+\r
+               \r
+                               //      IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+                                       //      ("Link DOWN!\n") );\r
+\r
+       if( p_port->p_local_endpt )\r
+       {\r
+               //TODO: CM RESTORE\r
+               //ipoib_port_cancel_listen( p_port, p_port->p_local_endpt );\r
+\r
+               cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,\r
+                       &p_port->p_local_endpt->gid_item );\r
+               cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,\r
+                       &p_port->p_local_endpt->mac_item );\r
+               cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,\r
+                       &p_port->p_local_endpt->lid_item );\r
+               \r
+               cl_qlist_insert_head(\r
+                       &mc_list, &p_port->p_local_endpt->mac_item.pool_item.list_item );\r
+               local_exist = 1;\r
+\r
+               p_port->p_local_endpt = NULL;\r
+       }\r
+\r
+       p_item = cl_qmap_head( &p_port->endpt_mgr.mac_endpts );\r
+       while( p_item != cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )\r
+       {\r
+               p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );\r
+               p_item = cl_qmap_next( p_item );\r
+               if( p_endpt->h_mcast )\r
+               {\r
+                       /*\r
+                        * We destroy MC endpoints since they will get recreated\r
+                        * when the port comes back up and we rejoin the MC groups.\r
+                        */\r
+                       cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,\r
+                               &p_endpt->mac_item );\r
+                       cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,\r
+                               &p_endpt->gid_item );\r
+\r
+                       cl_qlist_insert_tail(\r
+                               &mc_list, &p_endpt->mac_item.pool_item.list_item );\r
+               }\r
+               /* destroy connected endpoints if any */\r
+               else if( p_port->p_adapter->params.cm_enabled &&\r
+                                endpt_cm_get_state( p_endpt ) != IPOIB_CM_DISCONNECTED )\r
+               {\r
+                       p_fmap_item = cl_fmap_get( &p_port->endpt_mgr.conn_endpts, &p_endpt->dgid );\r
+                       if( p_fmap_item != cl_fmap_end( &p_port->endpt_mgr.conn_endpts ) )\r
+                       {\r
+                               cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, \r
+                                       &p_endpt->conn_item );\r
+                       }\r
+                       cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,\r
+                               &p_endpt->mac_item );\r
+                       cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,\r
+                               &p_endpt->gid_item );\r
+\r
+                       cl_qlist_insert_tail(\r
+                               &conn_list, &p_endpt->mac_item.pool_item.list_item );\r
+               }\r
+               if( p_endpt->h_av )\r
+               {\r
+                       /* Destroy the AV for all other endpoints. */\r
+                       p_port->p_adapter->p_ifc->destroy_av( p_endpt->h_av );\r
+                       p_endpt->h_av = NULL;\r
+               }\r
+               \r
+               if( p_endpt->dlid )\r
+               {\r
+                       cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,\r
+                               &p_endpt->lid_item );\r
+                       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,\r
+                               ("<__endptr_mgr_reset_all: setting p_endpt->dlid to 0\n"));\r
+                       p_endpt->dlid = 0;\r
+               }\r
+               \r
+       }\r
+#endif\r
+//???  cl_obj_unlock( &p_port->obj );\r
+\r
+       //TODO CM\r
+       /*while( cl_qlist_count( &conn_list ) )\r
+       {\r
+               endpt_cm_destroy_conn( p_port,\r
+                       PARENT_STRUCT( cl_qlist_remove_head( &conn_list ),\r
+                       ipoib_endpt_t, mac_item.pool_item.list_item ) );\r
+       }*/\r
+\r
+       if(cl_qlist_count( &mc_list ) - local_exist)\r
+       {\r
+               p_port->mcast_cnt =  (uint32_t)cl_qlist_count( &mc_list ) - local_exist;\r
+       }\r
+       else\r
+       {\r
+               p_port->mcast_cnt = 0;\r
+               KeSetEvent( &p_port->leave_mcast_event, EVENT_INCREMENT, FALSE );\r
+       }       \r
+\r
+       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("p_port->mcast_cnt = %d\n", p_port->mcast_cnt - local_exist));\r
+\r
+       /* Destroy all multicast endpoints now that we have released the lock. */\r
+       while( cl_qlist_count( &mc_list ) )\r
+       {\r
+               cl_list_item_t  *p_item;\r
+               p_item = cl_qlist_remove_head( &mc_list );\r
+               p_endpt = PARENT_STRUCT(p_item, ipoib_endpt_t, mac_item.pool_item.list_item);\r
+               cl_obj_destroy( &p_endpt->obj);\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
+}\r
+\r
+\r
+/*\r
+ * Called when updating an endpoint entry in response to an ARP.\r
+ * Because receive processing is serialized, and holds a reference\r
+ * on the endpoint reader, we wait for all *other* readers to exit before\r
+ * removing the item.\r
+ */\r
+static void\r
+__endpt_mgr_remove(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ipoib_endpt_t* const            p_endpt )\r
+{\r
+#if 0 //CM\r
+       cl_fmap_item_t* p_fmap_item;\r
+#endif \r
+       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
+\r
+       /* This function must be called from the receive path */\r
+       CL_ASSERT(p_port->endpt_rdr > 0);\r
+\r
+       cl_obj_lock( &p_port->obj );\r
+       /* Wait for all readers to complete. */    \r
+       while( p_port->endpt_rdr > 1 )\r
+               ;\r
+\r
+       /* Remove the endpoint from the maps so further requests don't find it. */\r
+       cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts, &p_endpt->mac_item );\r
+       /*\r
+        * The enpoints are *ALWAYS* in both the MAC and GID maps.  They are only\r
+        * in the LID map if the GID has the same subnet prefix as us.\r
+        */\r
+       cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts, &p_endpt->gid_item );\r
+#if 0\r
+\r
+       if( p_port->p_adapter->params.cm_enabled )\r
+       {\r
+               p_fmap_item = cl_fmap_get( &p_port->endpt_mgr.conn_endpts, &p_endpt->dgid );\r
+               \r
+               if( p_fmap_item != cl_fmap_end( &p_port->endpt_mgr.conn_endpts ) )\r
+               {\r
+                       cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, \r
+                               &p_endpt->conn_item );\r
+               }\r
+       }\r
+#endif \r
+       if( p_endpt->dlid )\r
+       {\r
+               cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,\r
+                       &p_endpt->lid_item );\r
+       }\r
+\r
+       cl_obj_unlock( &p_port->obj );\r
+\r
+       //TODO CM\r
+       //endpt_cm_destroy_conn( p_port, p_endpt );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
+}\r
+\r
+\r
+NTSTATUS\r
+ipoib_mac_to_gid(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   mac_addr_t                                      mac,\r
+               OUT                     ib_gid_t*                                       p_gid )\r
+{\r
+       ipoib_endpt_t*  p_endpt;\r
+       cl_map_item_t   *p_item;\r
+       uint64_t                key = 0;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
+\r
+       cl_memcpy( &key, &mac, sizeof(mac_addr_t) );\r
+\r
+       cl_obj_lock( &p_port->obj );\r
+\r
+       p_item = cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key );\r
+       if( p_item == cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )\r
+       {\r
+               cl_obj_unlock( &p_port->obj );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Failed endpoint lookup.\n") );\r
+               return STATUS_INVALID_PARAMETER;\r
+       }\r
+\r
+       p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );\r
+       *p_gid = p_endpt->dgid;\r
+\r
+       cl_obj_unlock( &p_port->obj );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
+       return STATUS_SUCCESS;\r
+}\r
+\r
+\r
+NTSTATUS\r
+ipoib_mac_to_path(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   mac_addr_t                                      mac,\r
+               OUT                     ib_path_rec_t*                          p_path )\r
+{\r
+       ipoib_endpt_t*  p_endpt;\r
+       cl_map_item_t   *p_item;\r
+       uint64_t                key = 0;\r
+       uint8_t                 sl;\r
+       net32_t                 flow_lbl;\r
+       uint8_t                 hop_limit;\r
+       uint8_t                 pkt_life;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
+\r
+       cl_memcpy( &key, &mac, sizeof(mac_addr_t) );\r
+\r
+       cl_obj_lock( &p_port->obj );\r
+\r
+       if( p_port->p_local_endpt == NULL )\r
+       {\r
+               cl_obj_unlock( &p_port->obj );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("No local endpoint.\n") );\r
+               return STATUS_INVALID_PARAMETER;\r
+       }\r
+\r
+       if( mac.addr[0] == 0 && mac.addr[1] == 0 && mac.addr[2] == 0 &&\r
+               mac.addr[3] == 0 && mac.addr[4] == 0 && mac.addr[5] == 0 )\r
+       {\r
+               p_endpt = p_port->p_local_endpt;\r
+       }\r
+       else\r
+       {\r
+               p_item = cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key );\r
+               if( p_item == cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )\r
+               {\r
+                       cl_obj_unlock( &p_port->obj );\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Failed endpoint lookup.\n") );\r
+                       return STATUS_INVALID_PARAMETER;\r
+               }\r
+\r
+               p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );\r
+       }\r
+\r
+       p_path->service_id = 0;\r
+       p_path->dgid = p_endpt->dgid;\r
+       p_path->sgid = p_port->p_local_endpt->dgid;\r
+       p_path->dlid = p_endpt->dlid;\r
+       p_path->slid = p_port->p_local_endpt->dlid;\r
+\r
+       ib_member_get_sl_flow_hop(\r
+               p_port->ib_mgr.bcast_rec.sl_flow_hop,\r
+               &sl,\r
+               &flow_lbl,\r
+               &hop_limit\r
+               );\r
+       \r
+       if( p_path->slid == p_path->dlid )\r
+               pkt_life = 0;\r
+       else\r
+               pkt_life = p_port->ib_mgr.bcast_rec.pkt_life;\r
+\r
+       ib_path_rec_init_local(\r
+               p_path,\r
+               &p_endpt->dgid,\r
+               &p_port->p_local_endpt->dgid,\r
+               p_endpt->dlid,\r
+               p_port->p_local_endpt->dlid,\r
+               1,\r
+               p_port->ib_mgr.bcast_rec.pkey,\r
+               sl, 0,\r
+               IB_PATH_SELECTOR_EXACTLY, p_port->ib_mgr.bcast_rec.mtu,\r
+               IB_PATH_SELECTOR_EXACTLY, p_port->ib_mgr.bcast_rec.rate,\r
+               IB_PATH_SELECTOR_EXACTLY, pkt_life,\r
+               0 );\r
+\r
+       /* Set global routing information. */\r
+       ib_path_rec_set_hop_flow_raw( p_path, hop_limit, flow_lbl, FALSE );\r
+       p_path->tclass = p_port->ib_mgr.bcast_rec.tclass;\r
\r
+       cl_obj_unlock( &p_port->obj );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
+       return STATUS_SUCCESS;\r
+}\r
+\r
+\r
+static inline NDIS_STATUS\r
+__endpt_mgr_ref(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   mac_addr_t                                      mac,\r
+               OUT                     ipoib_endpt_t** const           pp_endpt )\r
+{\r
+       NDIS_STATUS             status;\r
+       cl_map_item_t   *p_item;\r
+       uint64_t                key;\r
+\r
+       PERF_DECLARE( EndptQueue );\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
+\r
+       if( !cl_memcmp( &mac, &p_port->p_adapter->params.conf_mac, sizeof(mac) ) )\r
+       {\r
+               /* Discard loopback traffic. */\r
+               IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_ENDPT,\r
+                       ("Discarding loopback traffic\n") );\r
+               IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
+               return NDIS_STATUS_NO_ROUTE_TO_DESTINATION;\r
+       }\r
+\r
+       key = 0;\r
+       cl_memcpy( &key, &mac, sizeof(mac_addr_t) );\r
+\r
+       cl_obj_lock( &p_port->obj );\r
+\r
+       IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_ENDPT,\r
+               ("Look for :\t  MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",\r
+               mac.addr[0], mac.addr[1], mac.addr[2],\r
+               mac.addr[3], mac.addr[4], mac.addr[5]) );\r
+\r
+       p_item = cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key );\r
+       if( p_item == cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )\r
+       {\r
+               cl_obj_unlock( &p_port->obj );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,\r
+                       ("Failed endpoint lookup.\n") );\r
+               return NDIS_STATUS_NO_ROUTE_TO_DESTINATION;\r
+       }\r
+\r
+       *pp_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );\r
+       ipoib_endpt_ref( *pp_endpt );\r
+\r
+       cl_obj_unlock( &p_port->obj );\r
+\r
+       cl_perf_start( EndptQueue );\r
+       status = ipoib_endpt_queue( *pp_endpt );\r
+       cl_perf_stop( &p_port->p_adapter->perf, EndptQueue );\r
+       if( status != NDIS_STATUS_SUCCESS )\r
+               *pp_endpt = NULL;\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
+       return status;\r
+}\r
+\r
+\r
+static inline NDIS_STATUS\r
+__endpt_mgr_get_gid_qpn(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   mac_addr_t                                      mac,\r
+               OUT                     ib_gid_t* const                         p_gid,\r
+               OUT                     UNALIGNED net32_t* const        p_qpn )\r
+{\r
+       UNALIGNED\r
+       cl_map_item_t   *p_item;\r
+       ipoib_endpt_t   *p_endpt;\r
+       uint64_t                key;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
+\r
+       cl_obj_lock( &p_port->obj );\r
+\r
+       key = 0;\r
+       cl_memcpy( &key, &mac, sizeof(mac_addr_t) );\r
+       p_item = cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key );\r
+       if( p_item == cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )\r
+       {\r
+               cl_obj_unlock( &p_port->obj );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,\r
+                       ("Failed endpoint lookup.\n") );\r
+               return NDIS_STATUS_FAILURE;\r
+       }\r
+\r
+       p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );\r
+\r
+       *p_gid = p_endpt->dgid;\r
+       *p_qpn = p_endpt->qpn;\r
+\r
+       cl_obj_unlock( &p_port->obj );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
+       return NDIS_STATUS_SUCCESS;\r
+}\r
+\r
+\r
+static inline ipoib_endpt_t*\r
+__endpt_mgr_get_by_gid(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   ib_gid_t* const                         p_gid )\r
+{\r
+       cl_fmap_item_t  *p_item;\r
+       ipoib_endpt_t   *p_endpt;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
+\r
+       p_item = cl_fmap_get( &p_port->endpt_mgr.gid_endpts, p_gid );\r
+       if( p_item == cl_fmap_end( &p_port->endpt_mgr.gid_endpts ) )\r
+               p_endpt = NULL;\r
+       else\r
+               p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, gid_item );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
+       return p_endpt;\r
+}\r
+\r
+\r
+static ipoib_endpt_t*\r
+__endpt_mgr_get_by_lid(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   net16_t                                         lid )\r
+{\r
+       cl_map_item_t   *p_item;\r
+       ipoib_endpt_t   *p_endpt;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
+\r
+       p_item = cl_qmap_get( &p_port->endpt_mgr.lid_endpts, lid );\r
+       if( p_item == cl_qmap_end( &p_port->endpt_mgr.lid_endpts ) )\r
+               p_endpt = NULL;\r
+       else\r
+               p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, lid_item );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
+       return p_endpt;\r
+}\r
+\r
+\r
+inline ib_api_status_t\r
+__endpt_mgr_insert_locked(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   mac_addr_t                                      mac,\r
+       IN                              ipoib_endpt_t* const            p_endpt )\r
+{\r
+       ib_api_status_t status;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
+\r
+       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,\r
+               ("insert  :\t  MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",\r
+               mac.addr[0], mac.addr[1], mac.addr[2],\r
+               mac.addr[3], mac.addr[4], mac.addr[5]) );\r
+\r
+       cl_obj_lock( &p_port->obj );\r
+       while( p_port->endpt_rdr )\r
+       {\r
+               cl_obj_unlock( &p_port->obj );\r
+               cl_obj_lock( &p_port->obj );\r
+       }\r
+       /* __endpt_mgr_insert expects *one* reference to be held when being called. */\r
+       cl_atomic_inc( &p_port->endpt_rdr );\r
+       status= __endpt_mgr_insert( p_port, mac, p_endpt );\r
+       cl_atomic_dec( &p_port->endpt_rdr );\r
+       cl_obj_unlock( &p_port->obj );\r
+\r
+       return status;\r
+}\r
+\r
+\r
+inline ib_api_status_t\r
+__endpt_mgr_insert(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   mac_addr_t                                      mac,\r
+       IN                              ipoib_endpt_t* const            p_endpt )\r
+{\r
+       uint64_t                key;\r
+       cl_status_t             cl_status;\r
+       cl_map_item_t   *p_qitem;\r
+       cl_fmap_item_t  *p_fitem;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
+\r
+       /* Wait for all accesses to the map to complete. */\r
+       while( p_port->endpt_rdr > 1 )\r
+               ;\r
+\r
+       /* Link the endpoint to the port. */\r
+       cl_status = cl_obj_insert_rel_parent_locked(\r
+               &p_endpt->rel, &p_port->obj, &p_endpt->obj );\r
+\r
+       if( cl_status != CL_SUCCESS )\r
+       {\r
+               cl_obj_destroy( &p_endpt->obj );\r
+               return IB_INVALID_STATE;\r
+       }\r
+\r
+#if DBG\r
+       cl_atomic_inc( &p_port->ref[ref_endpt_track] );\r
+       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,\r
+               ("ref  type %d ref_cnt %d\n", ref_endpt_track, p_port->obj.ref_cnt) );\r
+#endif\r
+\r
+       p_endpt->mac = mac;\r
+       key = 0;\r
+       cl_memcpy( &key, &mac, sizeof(mac_addr_t) );\r
+       p_qitem = cl_qmap_insert(\r
+               &p_port->endpt_mgr.mac_endpts, key, &p_endpt->mac_item );\r
+       CL_ASSERT( p_qitem == &p_endpt->mac_item );\r
+       p_fitem = cl_fmap_insert(\r
+               &p_port->endpt_mgr.gid_endpts, &p_endpt->dgid, &p_endpt->gid_item );\r
+       CL_ASSERT( p_fitem == &p_endpt->gid_item );\r
+       if( p_endpt->dlid )\r
+       {\r
+               p_qitem = cl_qmap_insert(\r
+                       &p_port->endpt_mgr.lid_endpts, p_endpt->dlid, &p_endpt->lid_item );\r
+               CL_ASSERT( p_qitem == &p_endpt->lid_item );\r
+               if (p_qitem != &p_endpt->lid_item) {\r
+                       // Since we failed to insert into the list, make sure it is not removed\r
+                       p_endpt->dlid =0;\r
+               }\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
+       return IB_SUCCESS;\r
+}\r
+\r
+\r
+static ib_api_status_t\r
+__endpt_mgr_add_bcast(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ib_mcast_rec_t                          *p_mcast_rec )\r
+{\r
+       ib_api_status_t status;\r
+       ipoib_endpt_t   *p_endpt;\r
+       mac_addr_t              bcast_mac;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       /*\r
+        * Cache the broadcast group properties for creating future mcast groups.\r
+        */\r
+       p_port->ib_mgr.bcast_rec = *p_mcast_rec->p_member_rec;\r
+\r
+       /* Allocate the broadcast endpoint. */\r
+       p_endpt = ipoib_endpt_create( &p_mcast_rec->p_member_rec->mgid,\r
+               0 , CL_HTON32(0x00FFFFFF) );\r
+       if( !p_endpt )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ipoib_endpt_create failed.\n") );\r
+               return IB_INSUFFICIENT_RESOURCES;\r
+       }\r
+       /* set reference to transport to be used while is not attached to the port */\r
+       p_endpt->is_mcast_listener = TRUE;\r
+       p_endpt->p_ifc = p_port->p_adapter->p_ifc;\r
+       status = ipoib_endpt_set_mcast( p_endpt, p_port->ib_mgr.h_pd,\r
+               p_port->port_num, p_mcast_rec );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               cl_obj_destroy( &p_endpt->obj );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ipoib_create_mcast_endpt returned %s\n",\r
+                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+               return status;\r
+       }\r
+\r
+       /* Add the broadcast endpoint to the endpoint map. */\r
+       cl_memset( &bcast_mac, 0xFF, sizeof(bcast_mac) );\r
+       status = __endpt_mgr_insert_locked( p_port, bcast_mac, p_endpt );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+       return status;\r
+}\r
+\r
+\r
+void\r
+ipoib_port_remove_endpt(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   mac_addr_t                                      mac )\r
+{\r
+       cl_map_item_t   *p_item;\r
+       //TODO CM\r
+//     cl_fmap_item_t  *p_fmap_item;\r
+       ipoib_endpt_t   *p_endpt;\r
+       uint64_t                key;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
+\r
+       key = 0;\r
+       cl_memcpy( &key, &mac, sizeof(mac_addr_t) );\r
+\r
+       /* Remove the endpoint from the maps so further requests don't find it. */\r
+       cl_obj_lock( &p_port->obj );\r
+       /* Wait for all readers to finish */\r
+       while( p_port->endpt_rdr )\r
+               ;\r
+       p_item = cl_qmap_remove( &p_port->endpt_mgr.mac_endpts, key );\r
+       /*\r
+        * Dereference the endpoint.  If the ref count goes to zero, it\r
+        * will get freed.\r
+        */\r
+       if( p_item != cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )\r
+       {\r
+               p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );\r
+               /*\r
+                * The enpoints are *ALWAYS* in both the MAC and GID maps.  They are only\r
+                * in the LID map if the GID has the same subnet prefix as us.\r
+                */\r
+               cl_fmap_remove_item(\r
+                       &p_port->endpt_mgr.gid_endpts, &p_endpt->gid_item );\r
+#if 0\r
+               if( p_port->p_adapter->params.cm_enabled )\r
+               {\r
+                       p_fmap_item = cl_fmap_get( &p_port->endpt_mgr.conn_endpts, &p_endpt->dgid );\r
+               \r
+                       if( p_fmap_item != cl_fmap_end( &p_port->endpt_mgr.conn_endpts ) )\r
+                       {\r
+                               cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, \r
+                                       &p_endpt->conn_item );\r
+                       }\r
+               }\r
+#endif\r
+\r
+               if( p_endpt->dlid )\r
+               {\r
+                       cl_qmap_remove_item(\r
+                               &p_port->endpt_mgr.lid_endpts, &p_endpt->lid_item );\r
+               }\r
+\r
+               cl_obj_unlock( &p_port->obj );\r
+               //TODO CM\r
+               //endpt_cm_destroy_conn( p_port, p_endpt );\r
+\r
+#if DBG\r
+               cl_atomic_dec( &p_port->ref[ref_endpt_track] );\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,\r
+                       ("ref type %d ref_cnt %d\n", ref_endpt_track, p_port->obj.ref_cnt) );\r
+#endif\r
+\r
+       }\r
+       else\r
+       {\r
+               cl_obj_unlock( &p_port->obj );\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
+}\r
+\r
+/*\r
+ * The sequence for port up is as follows:\r
+ *     1. The port goes active.  This allows the adapter to send SA queries\r
+ *     and join the broadcast group (and other groups).\r
+ *\r
+ *     2. The adapter sends an SA query for the broadcast group.\r
+ *\r
+ *     3. Upon completion of the query, the adapter joins the broadcast group.\r
+ */\r
+\r
+\r
+/*\r
+ * Query the SA for the broadcast group.\r
+ */\r
+void\r
+ipoib_port_up(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   ib_pnp_port_rec_t* const        p_pnp_rec )\r
+{\r
+       ib_port_info_t          *p_port_info;\r
+       ib_mad_t                        *mad_in         = NULL;\r
+       ib_mad_t                        *mad_out = NULL;\r
+       ib_api_status_t         status  = IB_INSUFFICIENT_MEMORY;\r
+       static int                      cnt     = 0;\r
+       \r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_INIT,\r
+                       ("[%d] Entering port_up.\n", ++cnt) ); \r
+       \r
+       cl_obj_lock( &p_port->obj );\r
+       if ( p_port->state == IB_QPS_INIT ) \r
+       {\r
+               cl_obj_unlock( &p_port->obj );\r
+               status = IB_SUCCESS;\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+                       ("p_port->state = %d - Aborting.\n", p_port->state) );        \r
+               goto up_done;\r
+       }\r
+       else if ( p_port->state == IB_QPS_RTS )\r
+       {\r
+               cl_obj_unlock( &p_port->obj );\r
+               cl_obj_lock( &p_port->p_adapter->obj );\r
+               if( p_port->p_adapter->state == IB_PNP_PORT_INIT )\r
+               {\r
+                       p_port->p_adapter->state = IB_PNP_PORT_ACTIVE;\r
+               }\r
+               cl_obj_unlock( &p_port->p_adapter->obj );\r
+               status = IB_SUCCESS;\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+                       ("Port init is done. p_port->state = %d.\n", p_port->state ) );\r
+               goto up_done;\r
+       }\r
+       p_port->state = IB_QPS_INIT;\r
+       cl_obj_unlock( &p_port->obj );  \r
+\r
+\r
+       /* Wait for all work requests to get flushed. */\r
+       while( p_port->recv_mgr.depth || p_port->send_mgr.depth )\r
+               cl_thread_suspend( 0 );\r
+\r
+       KeResetEvent( &p_port->sa_event );\r
+\r
+       mad_out = (ib_mad_t *) (ib_mad_t*)cl_zalloc(256);\r
+       if(! mad_out)\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("failed to allocate mad mad_out\n")); \r
+               goto up_done;\r
+       }\r
+       mad_in = (ib_mad_t *) cl_zalloc(256);\r
+       if(! mad_in)\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("failed to allocate mad mad_in\n")); \r
+               goto up_done;\r
+       }\r
+\r
+       mad_in->attr_id = IB_MAD_ATTR_PORT_INFO;\r
+       mad_in->method = IB_MAD_METHOD_GET;\r
+       mad_in->base_ver = 1;\r
+       mad_in->class_ver =1;\r
+       mad_in->mgmt_class = IB_MCLASS_SUBN_LID;\r
+       \r
+       status = p_port->p_adapter->p_ifc->local_mad(\r
+               p_port->ib_mgr.h_ca ,p_port->port_num ,mad_in ,mad_out);\r
+\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               ipoib_set_inactive( p_port->p_adapter );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ib_local_mad returned %s\n", \r
+                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+               goto up_done;\r
+       }\r
+\r
+       p_port_info = (ib_port_info_t*)(((ib_smp_t*)mad_out)->data);\r
+       p_port->base_lid = p_pnp_rec->p_port_attr->lid;\r
+       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+                       ("Received port info: link width = %d.\n",\r
+                       p_port_info->link_width_active) );\r
+       p_port->ib_mgr.rate =\r
+               ib_port_info_compute_rate( p_port_info );\r
+       \r
+       ipoib_set_rate( p_port->p_adapter,\r
+               p_port_info->link_width_active,\r
+       ib_port_info_get_link_speed_active( p_port_info ) );\r
+\r
+       status = __port_get_bcast( p_port );\r
+       if (status != IB_SUCCESS)\r
+               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+               (" __port_get_bcast returned %s\n",p_port->p_adapter->p_ifc->get_err_str( status )));\r
+\r
+up_done:\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               if( status != IB_CANCELED )\r
+               {\r
+                       ipoib_set_inactive( p_port->p_adapter );\r
+                       __endpt_mgr_reset_all( p_port );\r
+               }\r
+               ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);\r
+               p_port->state = IB_QPS_ERROR;\r
+               KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
+       }\r
+\r
+       if(mad_out)\r
+               cl_free(mad_out);\r
+       if(mad_in)\r
+               cl_free(mad_in);\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+}\r
+\r
+\r
+static ib_api_status_t\r
+__endpt_mgr_add_local(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ib_port_info_t* const           p_port_info )\r
+{\r
+       ib_api_status_t                 status;\r
+       ib_gid_t                                gid;\r
+       ipoib_endpt_t                   *p_endpt;\r
+       ib_av_attr_t                    av_attr;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       ib_gid_set_default( &gid, p_port->p_adapter->guids.port_guid.guid );\r
+       p_endpt = ipoib_endpt_create(\r
+               &gid, p_port_info->base_lid, p_port->ib_mgr.qpn );\r
+       if( !p_endpt )\r
+       {\r
+               p_port->p_adapter->hung = TRUE;\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Failed to create local endpt\n") );\r
+               return IB_INSUFFICIENT_MEMORY;\r
+       }\r
+\r
+       cl_memclr( &av_attr, sizeof(ib_av_attr_t) );\r
+       av_attr.port_num = p_port->port_num;\r
+       av_attr.sl = 0;\r
+       IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,\r
+               (" av_attr.dlid = p_port_info->base_lid = %d\n", cl_ntoh16( p_port_info->base_lid ) ));\r
+       av_attr.dlid = p_port_info->base_lid;\r
+       av_attr.static_rate = p_port->ib_mgr.rate;\r
+       av_attr.path_bits = 0;\r
+       status = p_port->p_adapter->p_ifc->create_av(\r
+               p_port->ib_mgr.h_pd, &av_attr, &p_endpt->h_av );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               cl_obj_destroy( &p_endpt->obj );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ib_create_av for local endpoint returned %s\n",\r
+                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+               return status;\r
+       }\r
+\r
+       /* __endpt_mgr_insert expects *one* reference to be held. */\r
+       cl_atomic_inc( &p_port->endpt_rdr );\r
+       status = __endpt_mgr_insert( p_port, p_port->p_adapter->params.conf_mac, p_endpt );\r
+       cl_atomic_dec( &p_port->endpt_rdr );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("__endpt_mgr_insert for local endpoint returned %s\n",\r
+                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+               return status;\r
+       }\r
+\r
+       p_port->p_local_endpt = p_endpt;\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+       return status;\r
+}\r
+\r
+\r
+\r
+\r
+static ib_api_status_t\r
+__port_get_bcast(\r
+       IN                              ipoib_port_t* const                     p_port )\r
+{\r
+       ib_api_status_t         status;\r
+       ib_query_req_t          query;\r
+       ib_user_query_t         info;\r
+       ib_member_rec_t         member_rec;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       info.method = IB_MAD_METHOD_GETTABLE;\r
+       info.attr_id = IB_MAD_ATTR_MCMEMBER_RECORD;\r
+       info.attr_size = sizeof(ib_member_rec_t);\r
+       info.comp_mask = IB_MCR_COMPMASK_MGID;\r
+       info.p_attr = &member_rec;\r
+\r
+       /* Query requires only the MGID. */\r
+       cl_memclr( &member_rec, sizeof(ib_member_rec_t) );\r
+       member_rec.mgid = bcast_mgid_template;\r
+\r
+    member_rec.mgid.raw[4] = (uint8_t) (p_port->p_adapter->guids.port_guid.pkey >> 8) ;\r
+       member_rec.mgid.raw[5] = (uint8_t) p_port->p_adapter->guids.port_guid.pkey;\r
+       member_rec.pkey = cl_hton16(p_port->p_adapter->guids.port_guid.pkey);\r
+       cl_memclr( &query, sizeof(ib_query_req_t) );\r
+       query.query_type = IB_QUERY_USER_DEFINED;\r
+       query.p_query_input = &info;\r
+       query.port_guid = p_port->p_adapter->guids.port_guid.guid;\r
+       query.timeout_ms = p_port->p_adapter->params.sa_timeout;\r
+       query.retry_cnt = p_port->p_adapter->params.sa_retry_cnt;\r
+       query.query_context = p_port;\r
+       query.pfn_query_cb = __bcast_get_cb;\r
+\r
+       /* reference the object for the multicast query. */\r
+       ipoib_port_ref( p_port, ref_get_bcast );\r
+\r
+       status = p_port->p_adapter->p_ifc->query(\r
+               p_port->p_adapter->h_al, &query, &p_port->ib_mgr.h_query );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               ipoib_port_deref( p_port, ref_get_bcast );\r
+               ASSERT(FALSE);\r
+               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ib_query returned %s\n", \r
+                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+       }\r
+       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ib_query returned SUCCESS\n"));\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+       return status;\r
+}\r
+\r
+\r
+/* Callback for the MCMemberRecord Get query for the IPv4 broadcast group. */\r
+static void\r
+__bcast_get_cb(\r
+       IN                              ib_query_rec_t                          *p_query_rec )\r
+{\r
+       ipoib_port_t            *p_port;\r
+       ib_member_rec_t         *p_mc_req;\r
+       ib_api_status_t         status;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       p_port = (ipoib_port_t*)p_query_rec->query_context;\r
+\r
+       cl_obj_lock( &p_port->obj );\r
+       p_port->ib_mgr.h_query = NULL;\r
+\r
+       CL_ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);\r
+       if( p_port->state != IB_QPS_INIT )\r
+       {\r
+               status = IB_CANCELED;\r
+               goto done;\r
+       }\r
+       \r
+       status = p_query_rec->status;\r
+\r
+       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+               ("status of request %s\n", \r
+               p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+\r
+       switch( status )\r
+       {\r
+       case IB_SUCCESS:\r
+               if( p_query_rec->result_cnt )\r
+               {\r
+                       p_mc_req = (ib_member_rec_t*)\r
+                               ib_get_query_result( p_query_rec->p_result_mad, 0 );\r
+\r
+                       /* Join the broadcast group. */\r
+                       status = __port_join_bcast( p_port, p_mc_req );\r
+                       break;\r
+               }\r
+               /* Fall through. */\r
+\r
+       case IB_REMOTE_ERROR:\r
+               /* SA failed the query.  Broadcast group doesn't exist, create it. */\r
+               status = __port_create_bcast( p_port );\r
+               break;\r
+\r
+       case IB_CANCELED:\r
+               IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+                       ("Instance destroying - Aborting.\n") );\r
+               break;\r
+\r
+       default:\r
+               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
+                       EVENT_IPOIB_BCAST_GET, 1, p_query_rec->status );\r
+       }\r
+done:\r
+       cl_obj_unlock( &p_port->obj );\r
+\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               if( status != IB_CANCELED )\r
+               {\r
+                       ipoib_set_inactive( p_port->p_adapter );\r
+                       __endpt_mgr_reset_all( p_port );\r
+               }\r
+               p_port->state = IB_QPS_ERROR;\r
+               KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
+       }\r
+\r
+       /* Return the response MAD to AL. */\r
+       if( p_query_rec->p_result_mad )\r
+               p_port->p_adapter->p_ifc->put_mad( p_query_rec->p_result_mad );\r
+\r
+       /* Release the reference taken when issuing the member record query. */\r
+       ipoib_port_deref( p_port, ref_bcast_get_cb );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+}\r
+\r
+\r
+static ib_api_status_t\r
+__port_join_bcast(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN                              ib_member_rec_t* const          p_member_rec )\r
+{\r
+       ib_api_status_t         status;\r
+       ib_mcast_req_t          mcast_req;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       /* Check that the rate is realizable for our port. */\r
+       if( p_port->ib_mgr.rate < (p_member_rec->rate & 0x3F) &&\r
+               (g_ipoib.bypass_check_bcast_rate == 0))\r
+       {\r
+               /*\r
+                * The MC group rate is higher than our port's rate.  Log an error\r
+                * and stop.  A port transition will drive the retry.\r
+                */\r
+               IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,\r
+                       ("Unrealizable join due to rate mismatch.\n") );\r
+               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
+                       EVENT_IPOIB_BCAST_RATE, 2,\r
+                       (uint32_t)(p_member_rec->rate & 0x3F),\r
+                       (uint32_t)p_port->ib_mgr.rate );\r
+               return IB_ERROR;\r
+       }\r
+\r
+       /* Join the broadcast group. */\r
+       cl_memclr( &mcast_req, sizeof(mcast_req) );\r
+       /* Copy the results of the Get to use as parameters. */\r
+       mcast_req.member_rec = *p_member_rec;\r
+       /* We specify our port GID for the join operation. */\r
+       mcast_req.member_rec.port_gid.unicast.prefix = IB_DEFAULT_SUBNET_PREFIX;\r
+       mcast_req.member_rec.port_gid.unicast.interface_id =\r
+               p_port->p_adapter->guids.port_guid.guid;\r
+\r
+       mcast_req.mcast_context = p_port;\r
+       mcast_req.pfn_mcast_cb = __bcast_cb;\r
+       mcast_req.timeout_ms = p_port->p_adapter->params.sa_timeout;\r
+       mcast_req.retry_cnt = p_port->p_adapter->params.sa_retry_cnt;\r
+       mcast_req.port_guid = p_port->p_adapter->guids.port_guid.guid;\r
+       mcast_req.pkey_index = p_port->pkey_index;\r
+\r
+       if( ib_member_get_state( mcast_req.member_rec.scope_state ) !=\r
+               IB_MC_REC_STATE_FULL_MEMBER )\r
+       {\r
+               IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,\r
+                       ("Incorrect MC member rec join state in query response.\n") );\r
+               ib_member_set_state( &mcast_req.member_rec.scope_state,\r
+                       IB_MC_REC_STATE_FULL_MEMBER );\r
+       }\r
+\r
+       /* reference the object for the multicast join request. */\r
+       ipoib_port_ref( p_port, ref_join_bcast );\r
+\r
+       status = p_port->p_adapter->p_ifc->join_mcast(\r
+               p_port->ib_mgr.h_qp, &mcast_req );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               ipoib_port_deref( p_port, ref_bcast_join_failed );\r
+               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ib_join_mcast returned %s\n", \r
+                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+       }\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+       return status;\r
+}\r
+\r
+\r
+static ib_api_status_t\r
+__port_create_bcast(\r
+       IN                              ipoib_port_t* const                     p_port )\r
+{\r
+       ib_api_status_t         status;\r
+       ib_mcast_req_t          mcast_req;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       /* Join the broadcast group. */\r
+       cl_memclr( &mcast_req, sizeof(mcast_req) );\r
+       mcast_req.create = TRUE;\r
+       /*\r
+        * Create requires pkey, qkey, SL, flow label, traffic class, joing state\r
+        * and port GID.\r
+        *\r
+        * We specify the MGID since we don't want the SA to generate it for us.\r
+        */\r
+       mcast_req.member_rec.mgid = bcast_mgid_template;\r
+       mcast_req.member_rec.mgid.raw[4] = (uint8_t) (p_port->p_adapter->guids.port_guid.pkey >> 8); \r
+       mcast_req.member_rec.mgid.raw[5] = (uint8_t) p_port->p_adapter->guids.port_guid.pkey;\r
+       ib_gid_set_default( &mcast_req.member_rec.port_gid,\r
+               p_port->p_adapter->guids.port_guid.guid );\r
+       /*\r
+        * IPOIB spec requires that the QKEY have the MSb set so that the QKEY\r
+        * from the QP is used rather than the QKEY in the send WR.\r
+        */\r
+       mcast_req.member_rec.qkey =\r
+               (uint32_t)(uintn_t)p_port | IB_QP_PRIVILEGED_Q_KEY;\r
+       mcast_req.member_rec.mtu =\r
+               (IB_PATH_SELECTOR_EXACTLY << 6) | IB_MTU_LEN_2048;\r
+\r
+       mcast_req.member_rec.pkey = cl_hton16(p_port->p_adapter->guids.port_guid.pkey);\r
+\r
+       mcast_req.member_rec.sl_flow_hop = ib_member_set_sl_flow_hop( 0, 0, 0 );\r
+       mcast_req.member_rec.scope_state =\r
+               ib_member_set_scope_state( 2, IB_MC_REC_STATE_FULL_MEMBER );\r
+\r
+       mcast_req.mcast_context = p_port;\r
+       mcast_req.pfn_mcast_cb = __bcast_cb;\r
+       mcast_req.timeout_ms = p_port->p_adapter->params.sa_timeout;\r
+       mcast_req.retry_cnt = p_port->p_adapter->params.sa_retry_cnt;\r
+       mcast_req.port_guid = p_port->p_adapter->guids.port_guid.guid;\r
+       mcast_req.pkey_index = p_port->pkey_index;\r
+\r
+       /* reference the object for the multicast join request. */\r
+       ipoib_port_ref( p_port, ref_join_bcast );\r
+\r
+       status = p_port->p_adapter->p_ifc->join_mcast( p_port->ib_mgr.h_qp, &mcast_req );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               ipoib_port_deref( p_port, ref_bcast_create_failed );\r
+               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ib_join_mcast returned %s\n", \r
+                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+       }\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+       return status;\r
+}\r
+\r
+\r
+void\r
+ipoib_port_down(\r
+       IN                              ipoib_port_t* const                     p_port )\r
+{\r
+       ib_api_status_t         status;\r
+       ib_qp_mod_t                     qp_mod;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       /*\r
+        * Mark our state.  This causes all callbacks to abort.\r
+        * Note that we hold the receive lock so that we synchronize\r
+        * with reposting.  We must take the receive lock before the\r
+        * object lock since that is the order taken when reposting.\r
+        */\r
+       cl_spinlock_acquire( &p_port->recv_lock );\r
+       cl_obj_lock( &p_port->obj );\r
+       p_port->state = IB_QPS_ERROR;\r
+\r
+       NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
+               EVENT_IPOIB_PORT_DOWN, 0 );\r
+\r
+       if( p_port->ib_mgr.h_query )\r
+       {\r
+               p_port->p_adapter->p_ifc->cancel_query(\r
+                       p_port->p_adapter->h_al, p_port->ib_mgr.h_query );\r
+               p_port->ib_mgr.h_query = NULL;\r
+       }\r
+       cl_obj_unlock( &p_port->obj );\r
+       cl_spinlock_release( &p_port->recv_lock );\r
+\r
+       KeWaitForSingleObject(\r
+               &p_port->sa_event, Executive, KernelMode, FALSE, NULL );\r
+\r
+       /* garbage collector timer is not needed when link is down */\r
+       KeCancelTimer(&p_port->gc_timer);\r
+       KeFlushQueuedDpcs();\r
+\r
+       /*\r
+        * Put the QP in the error state.  This removes the need to\r
+        * synchronize with send/receive callbacks.\r
+        */\r
+       CL_ASSERT( p_port->ib_mgr.h_qp );\r
+       cl_memclr( &qp_mod, sizeof(ib_qp_mod_t) );\r
+       qp_mod.req_state = IB_QPS_ERROR;\r
+       status = p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp, &qp_mod );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ib_modify_qp to error state returned %s.\n",\r
+                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+               p_port->p_adapter->hung = TRUE;\r
+               return;\r
+       }\r
+\r
+       KeResetEvent(&p_port->leave_mcast_event);\r
+\r
+       /* Reset all endpoints so we don't flush our ARP cache. */\r
+       __endpt_mgr_reset_all( p_port );\r
+\r
+       KeWaitForSingleObject(\r
+               &p_port->leave_mcast_event, Executive, KernelMode, FALSE, NULL );\r
+\r
+       __pending_list_destroy(p_port);\r
+       \r
+       cl_obj_lock( &p_port->p_adapter->obj );\r
+       ipoib_dereg_addrs( p_port->p_adapter );\r
+       cl_obj_unlock( &p_port->p_adapter->obj );\r
+       \r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+}\r
+\r
+\r
+static void\r
+__bcast_cb(\r
+       IN                              ib_mcast_rec_t                          *p_mcast_rec )\r
+{\r
+       ipoib_port_t    *p_port;\r
+       ib_api_status_t status;\r
+       LARGE_INTEGER   gc_due_time;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       p_port = (ipoib_port_t*)p_mcast_rec->mcast_context;\r
+\r
+       cl_obj_lock( &p_port->obj );\r
+\r
+       ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);\r
+       if( p_port->state != IB_QPS_INIT )\r
+       {\r
+               cl_obj_unlock( &p_port->obj );\r
+               if( p_mcast_rec->status == IB_SUCCESS )\r
+               {\r
+                       ipoib_port_ref(p_port, ref_leave_mcast);\r
+                       p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast, __leave_error_mcast_cb );\r
+               }\r
+               KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
+               ipoib_port_deref( p_port, ref_bcast_inv_state );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+                       ("Invalid state - Aborting.\n") );\r
+               return;\r
+       }\r
+       status = p_mcast_rec->status;\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Multicast join for broadcast group returned %s.\n",\r
+                       p_port->p_adapter->p_ifc->get_err_str( p_mcast_rec->status )) );\r
+               if( status == IB_REMOTE_ERROR )\r
+               {\r
+                       /*\r
+                        * Either:\r
+                        *      - the join failed because the group no longer exists\r
+                        *      - the create failed because the group already exists\r
+                        *\r
+                        * Kick off a new Get query to the SA to restart the join process\r
+                        * from the top.  Note that as an optimization, it would be\r
+                        * possible to distinguish between the join and the create.\r
+                        * If the join fails, try the create.  If the create fails, start\r
+                        * over with the Get.\r
+                        */\r
+                       /* TODO: Assert is a place holder.  Can we ever get here if the\r
+                       state isn't IB_PNP_PORT_ADD or PORT_DOWN or PORT_INIT? */\r
+                       CL_ASSERT( p_port->p_adapter->state == IB_PNP_PORT_ADD ||\r
+                               p_port->p_adapter->state == IB_PNP_PORT_DOWN ||\r
+                               p_port->p_adapter->state == IB_PNP_PORT_INIT );\r
+                       if(++p_port->bc_join_retry_cnt < p_port->p_adapter->params.bc_join_retry)\r
+                       {\r
+                               status = __port_get_bcast( p_port );\r
+                       }\r
+                       else\r
+                       {\r
+                               NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
+                                       EVENT_IPOIB_BCAST_JOIN, 1, p_mcast_rec->status );\r
+                               p_port->bc_join_retry_cnt = 0;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
+                               EVENT_IPOIB_BCAST_JOIN, 1, p_mcast_rec->status );\r
+               }\r
+\r
+               cl_obj_unlock( &p_port->obj );\r
+               if( status != IB_SUCCESS )\r
+               {\r
+                       ipoib_set_inactive( p_port->p_adapter );\r
+                       __endpt_mgr_reset_all( p_port );\r
+                       ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);\r
+                       p_port->state = IB_QPS_ERROR;\r
+                       KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
+               }\r
+               ipoib_port_deref( p_port, ref_bcast_req_failed );\r
+               IPOIB_EXIT( IPOIB_DBG_INIT );\r
+               return;\r
+       }\r
+       p_port->bc_join_retry_cnt = 0;\r
+\r
+       while( p_port->endpt_rdr )\r
+       {\r
+               cl_obj_unlock( &p_port->obj );\r
+               cl_obj_lock( &p_port->obj );\r
+       }\r
+\r
+       if( !p_port->p_local_endpt )\r
+       {\r
+               ib_port_info_t  port_info;\r
+               cl_memclr(&port_info, sizeof(port_info));\r
+               port_info.base_lid = p_port->base_lid;\r
+               status = __endpt_mgr_add_local( p_port, &port_info );\r
+               if( status != IB_SUCCESS )\r
+               {\r
+                       IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("__endpt_mgr_add_local returned %s\n",\r
+                               p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+                       cl_obj_unlock( &p_port->obj );\r
+                       goto err;\r
+               }\r
+       }\r
+\r
+       cl_obj_unlock( &p_port->obj );\r
+\r
+       status = __endpt_mgr_add_bcast( p_port, p_mcast_rec );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("__endpt_mgr_add_bcast returned %s\n",\r
+                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+               ipoib_port_ref(p_port, ref_leave_mcast);\r
+               status = p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast, __leave_error_mcast_cb );\r
+               CL_ASSERT( status == IB_SUCCESS );\r
+               goto err;\r
+       }\r
+\r
+       /* Get the QP ready for action. */\r
+       status = __ib_mgr_activate( p_port );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("__ib_mgr_activate returned %s\n", \r
+                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+\r
+err:\r
+               /* Flag the adapter as hung. */\r
+               p_port->p_adapter->hung = TRUE;\r
+               ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);\r
+               p_port->state = IB_QPS_ERROR;        \r
+               KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
+               ipoib_port_deref( p_port, ref_bcast_error );\r
+               IPOIB_EXIT( IPOIB_DBG_INIT );\r
+               return;\r
+       }\r
+\r
+       cl_obj_lock( &p_port->obj );\r
+       /* Only change the state if we're still in INIT. */\r
+       ASSERT( p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);\r
+       if (p_port->state == IB_QPS_INIT) {\r
+               p_port->state = IB_QPS_RTS;\r
+       }\r
+       cl_obj_unlock( &p_port->obj );\r
+\r
+       /* Prepost receives. */\r
+       cl_spinlock_acquire( &p_port->recv_lock );\r
+       __recv_mgr_repost( p_port );\r
+       cl_spinlock_release( &p_port->recv_lock );\r
+\r
+       /* Notify the adapter that we now have an active connection. */\r
+       status = ipoib_set_active( p_port->p_adapter );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               ib_qp_mod_t                     qp_mod;\r
+               ipoib_set_inactive( p_port->p_adapter );\r
+               KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+                       ("ipoib_set_active returned %s.\n",p_port->p_adapter->p_ifc->get_err_str( status )));\r
+               cl_spinlock_acquire( &p_port->recv_lock );\r
+               cl_obj_lock( &p_port->obj );\r
+               p_port->state = IB_QPS_ERROR;\r
+               if( p_port->ib_mgr.h_query )\r
+               {\r
+                       p_port->p_adapter->p_ifc->cancel_query(\r
+                               p_port->p_adapter->h_al, p_port->ib_mgr.h_query );\r
+                       p_port->ib_mgr.h_query = NULL;\r
+               }\r
+               cl_obj_unlock( &p_port->obj );\r
+               cl_spinlock_release( &p_port->recv_lock );\r
+\r
+               CL_ASSERT( p_port->ib_mgr.h_qp );\r
+               cl_memclr( &qp_mod, sizeof(ib_qp_mod_t) );\r
+               qp_mod.req_state = IB_QPS_ERROR;\r
+               status = p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp, &qp_mod );\r
+               __endpt_mgr_reset_all( p_port );\r
+\r
+               ipoib_port_deref( p_port, ref_join_bcast );\r
+               return;\r
+       }\r
+#if 0 //CM\r
+       if( p_port->p_adapter->params.cm_enabled &&\r
+               !p_port->p_local_endpt->conn.h_cm_listen )\r
+       {\r
+               if( ipoib_port_listen( p_port ) != IB_SUCCESS )\r
+               {\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Port CM Listen failed\n" ) );\r
+                       /*keep going with UD only */\r
+                       p_port->p_adapter->params.cm_enabled = FALSE;\r
+\r
+                       NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
+                               EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de3 );\r
+               }\r
+       }\r
+#endif\r
+       /* garbage collector timer is needed when link is active */\r
+       gc_due_time.QuadPart = -(int64_t)(((uint64_t)p_port->p_adapter->params.mc_leave_rescan * 2000000) * 10);\r
+       KeSetTimerEx(&p_port->gc_timer,gc_due_time,\r
+                           (LONG)p_port->p_adapter->params.mc_leave_rescan*1000,&p_port->gc_dpc);\r
+\r
+       KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
+       ipoib_port_deref( p_port, ref_join_bcast );\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+}\r
+\r
+\r
+static void\r
+__qp_event(\r
+       IN                              ib_async_event_rec_t            *p_event_rec )\r
+{\r
+       UNUSED_PARAM( p_event_rec );\r
+       CL_ASSERT( p_event_rec->context );\r
+       ((ipoib_port_t*)p_event_rec->context)->p_adapter->hung = TRUE;\r
+}\r
+\r
+\r
+static void\r
+__cq_event(\r
+       IN                              ib_async_event_rec_t            *p_event_rec )\r
+{\r
+       UNUSED_PARAM( p_event_rec );\r
+       CL_ASSERT( p_event_rec->context );\r
+       ((ipoib_port_t*)p_event_rec->context)->p_adapter->hung = TRUE;\r
+}\r
+\r
+\r
+static ib_api_status_t\r
+__ib_mgr_activate(\r
+       IN                              ipoib_port_t* const                     p_port )\r
+{\r
+       ib_api_status_t status;\r
+       ib_dgrm_info_t  dgrm_info;\r
+       ib_qp_mod_t             qp_mod;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+       /*\r
+        * Move the QP to RESET.  This allows us to reclaim any\r
+        * unflushed receives.\r
+        */\r
+       cl_memclr( &qp_mod, sizeof(ib_qp_mod_t) );\r
+       qp_mod.req_state = IB_QPS_RESET;\r
+       status = p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp, &qp_mod );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ib_modify_qp returned %s\n", \r
+                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+               return status;\r
+       }\r
+\r
+       /* Move the QP to RTS. */\r
+       dgrm_info.port_guid = p_port->p_adapter->guids.port_guid.guid;\r
+       dgrm_info.qkey = p_port->ib_mgr.bcast_rec.qkey;\r
+       dgrm_info.pkey_index = p_port->pkey_index;\r
+       status = p_port->p_adapter->p_ifc->init_dgrm_svc( p_port->ib_mgr.h_qp, &dgrm_info );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ib_init_dgrm_svc returned %s\n", \r
+                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+               return status;\r
+       }\r
+\r
+       /* Rearm the CQs. */\r
+       status = p_port->p_adapter->p_ifc->rearm_cq( p_port->ib_mgr.h_recv_cq, FALSE );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ib_rearm_cq for recv returned %s\n", \r
+                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+               return status;\r
+       }\r
+       status = p_port->p_adapter->p_ifc->rearm_cq( p_port->ib_mgr.h_send_cq, FALSE );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ib_rearm_cq for send returned %s\n", \r
+                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+               return status;\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+       return IB_SUCCESS;\r
+}\r
+\r
+\r
+/* Transition to a passive level thread. */\r
+ib_api_status_t\r
+ipoib_port_join_mcast(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   mac_addr_t                              mac,\r
+       IN              const   uint8_t                                 state)\r
+{\r
+       ib_api_status_t         status;\r
+       ib_mcast_req_t          mcast_req;\r
+       ipoib_endpt_t           *p_endpt;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_MCAST );\r
+\r
+       switch( __endpt_mgr_ref( p_port, mac, &p_endpt ) )\r
+       {\r
+       case NDIS_STATUS_NO_ROUTE_TO_DESTINATION:\r
+               break;\r
+\r
+       case NDIS_STATUS_SUCCESS:\r
+               ipoib_endpt_deref( p_endpt );\r
+               /* Fall through */\r
+\r
+       case NDIS_STATUS_PENDING:\r
+               return IB_SUCCESS;\r
+       }\r
+\r
+       /*\r
+        * Issue the mcast request, using the parameters of the broadcast group.\r
+        * This allows us to do a create request that should always succeed since\r
+        * the required parameters are known.\r
+        */\r
+       cl_memclr( &mcast_req, sizeof(mcast_req) );\r
+       mcast_req.create = TRUE;\r
+\r
+       /* Copy the settings from the broadcast group. */\r
+       mcast_req.member_rec = p_port->ib_mgr.bcast_rec;\r
+       /* Clear fields that aren't specified in the join */\r
+       mcast_req.member_rec.mlid = 0;\r
+       ib_member_set_state( &mcast_req.member_rec.scope_state,state);\r
+\r
+       if( (mac.addr[0] == 1) && (mac.addr[2] == 0x5E ))\r
+       {\r
+               /*\r
+                * Update the address portion of the MGID with the 28 lower bits of the\r
+                * IP address.  Since we're given a MAC address, we are using \r
+                * 24 lower bits of that network-byte-ordered value (assuming MSb\r
+                * is zero) and 4 lsb bits of the first byte of IP address.\r
+                */\r
+               mcast_req.member_rec.mgid.raw[12] = mac.addr[1];\r
+               mcast_req.member_rec.mgid.raw[13] = mac.addr[3];\r
+               mcast_req.member_rec.mgid.raw[14] = mac.addr[4];\r
+               mcast_req.member_rec.mgid.raw[15] = mac.addr[5];\r
+       }\r
+       else\r
+       {\r
+               /* Handle non IP mutlicast MAC addresses. */\r
+               /* Update the signature to use the lower 2 bytes of the OpenIB OUI. */\r
+               mcast_req.member_rec.mgid.raw[2] = 0x14;\r
+               mcast_req.member_rec.mgid.raw[3] = 0x05;\r
+               /* Now copy the MAC address into the last 6 bytes of the GID. */\r
+               cl_memcpy( &mcast_req.member_rec.mgid.raw[10], mac.addr, 6 );\r
+       }\r
+\r
+       mcast_req.mcast_context = p_port;\r
+       mcast_req.pfn_mcast_cb = __mcast_cb;\r
+       mcast_req.timeout_ms = p_port->p_adapter->params.sa_timeout;\r
+       mcast_req.retry_cnt = p_port->p_adapter->params.sa_retry_cnt;\r
+       mcast_req.port_guid = p_port->p_adapter->guids.port_guid.guid;\r
+       mcast_req.pkey_index = p_port->pkey_index;\r
+       mcast_req.member_rec.pkey = cl_hton16(p_port->p_adapter->guids.port_guid.pkey);\r
+       /*\r
+        * Create the endpoint and insert it in the port.  Since we don't wait for\r
+        * the mcast SA operations to complete before returning from the multicast\r
+        * list set OID asynchronously, it is possible for the mcast entry to be\r
+        * cleared before the SA interaction completes.  In this case, when the\r
+        * mcast callback is invoked, it would not find the corresponding endpoint\r
+        * and would be undone.\r
+        */\r
+       p_endpt = ipoib_endpt_create(\r
+               &mcast_req.member_rec.mgid, 0, CL_HTON32(0x00FFFFFF) );\r
+       if( !p_endpt )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ipoib_endpt_create failed.\n") );\r
+               return IB_INSUFFICIENT_MEMORY;\r
+       }\r
+\r
+       status = __endpt_mgr_insert_locked( p_port, mac, p_endpt );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("__endpt_mgr_insert_locked returned %s\n", \r
+                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+               return status;\r
+       }\r
+\r
+       /* reference the object for the multicast join request. */\r
+       ipoib_port_ref( p_port, ref_join_mcast );\r
+\r
+       status = p_port->p_adapter->p_ifc->join_mcast( p_port->ib_mgr.h_qp, &mcast_req );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               ipoib_port_deref( p_port, ref_mcast_join_failed );\r
+               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("ib_join_mcast returned %s\n", \r
+                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+       }\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_MCAST );\r
+       return status;\r
+}\r
+\r
+\r
+static void\r
+__mcast_cb(\r
+       IN                              ib_mcast_rec_t                          *p_mcast_rec )\r
+{\r
+       ib_api_status_t         status;\r
+       ipoib_port_t            *p_port;\r
+       cl_fmap_item_t          *p_item;\r
+       ipoib_endpt_t           *p_endpt;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_MCAST );\r
+\r
+       p_port = (ipoib_port_t*)p_mcast_rec->mcast_context;\r
+\r
+       cl_obj_lock( &p_port->obj );\r
+       while( p_port->endpt_rdr )\r
+       {\r
+               cl_obj_unlock( &p_port->obj );\r
+               cl_obj_lock( &p_port->obj );\r
+       }\r
+       if( p_port->state != IB_QPS_RTS )\r
+       {\r
+               cl_obj_unlock( &p_port->obj );\r
+               if( p_mcast_rec->status == IB_SUCCESS )\r
+\r
+               {\r
+                       ipoib_port_ref(p_port, ref_leave_mcast);\r
+                       p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast, __leave_error_mcast_cb );\r
+               }\r
+               ipoib_port_deref( p_port, ref_mcast_inv_state );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+                       ("Invalid state - Aborting.\n") );\r
+               return;\r
+       }\r
+\r
+       if( p_mcast_rec->status != IB_SUCCESS )\r
+       {\r
+               cl_obj_unlock( &p_port->obj );\r
+               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Multicast join request failed with status %s.\n",\r
+                       p_port->p_adapter->p_ifc->get_err_str( p_mcast_rec->status )) );\r
+               /* Flag the adapter as hung. */\r
+               p_port->p_adapter->hung =TRUE;\r
+               ipoib_port_deref( p_port, ref_mcast_req_failed );\r
+               IPOIB_EXIT( IPOIB_DBG_MCAST );\r
+               return;\r
+       }\r
+\r
+       p_item = cl_fmap_get(\r
+               &p_port->endpt_mgr.gid_endpts, &p_mcast_rec->p_member_rec->mgid );\r
+       if( p_item == cl_fmap_end( &p_port->endpt_mgr.gid_endpts ) )\r
+       {\r
+               /*\r
+                * The endpoint must have been flushed while the join request\r
+                * was outstanding.  Just leave the group and return.  This\r
+                * is not an error.\r
+                */\r
+               cl_obj_unlock( &p_port->obj );\r
+               IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_ERROR,\r
+                       ("Failed to find endpoint for update.\n") );\r
+\r
+               ipoib_port_ref(p_port, ref_leave_mcast);\r
+               p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast, __leave_error_mcast_cb );\r
+               ipoib_port_deref( p_port, ref_mcast_no_endpt );\r
+               IPOIB_EXIT( IPOIB_DBG_MCAST );\r
+               return;\r
+       }\r
+\r
+       p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, gid_item );\r
+       p_endpt->p_ifc = p_port->p_adapter->p_ifc;\r
+\r
+       /* Setup the endpoint for use. */\r
+       status = ipoib_endpt_set_mcast(\r
+               p_endpt, p_port->ib_mgr.h_pd, p_port->port_num, p_mcast_rec );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               cl_obj_unlock( &p_port->obj );\r
+               IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_MCAST,\r
+                       ("ipoib_endpt_set_mcast returned %s.\n",\r
+                       p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+               /* Flag the adapter as hung. */\r
+               p_port->p_adapter->hung = TRUE;\r
+               ipoib_port_deref( p_port, ref_mcast_av_failed );\r
+               IPOIB_EXIT( IPOIB_DBG_MCAST );\r
+               return;\r
+       }\r
+\r
+       /*\r
+        * The endpoint is already in the GID and MAC maps.\r
+        * mast endpoint are not used in the LID map.\r
+        */\r
+       CL_ASSERT(p_endpt->dlid == 0);\r
+       /* set flag that endpoint is use */\r
+       p_endpt->is_in_use = TRUE;\r
+       cl_obj_unlock( &p_port->obj );\r
+       \r
+       /* Try to send all pending sends. */\r
+       ipoib_port_resume( p_port , FALSE);\r
+\r
+       ipoib_port_deref( p_port, ref_join_mcast );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_MCAST );\r
+}\r
+\r
+\r
+void\r
+ipoib_leave_mcast_cb(\r
+       IN                              void                            *context )\r
+{\r
+       ipoib_port_t            *p_port;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_MCAST );\r
+\r
+       p_port = (ipoib_port_t*)context;\r
+\r
+       IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_MCAST,("p_port->mcast_cnt = %d\n", p_port->mcast_cnt));\r
+       \r
+       ipoib_port_deref( p_port, ref_leave_mcast);\r
+       cl_atomic_dec( &p_port->mcast_cnt);\r
+       \r
+       if(0 == p_port->mcast_cnt)\r
+       {\r
+               KeSetEvent( &p_port->leave_mcast_event, EVENT_INCREMENT, FALSE );\r
+       }\r
+       \r
+       IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,\r
+                       ("Leave mcast callback deref ipoib_port \n") );\r
+       \r
+       IPOIB_EXIT( IPOIB_DBG_MCAST );\r
+}\r
+\r
+\r
+\r
+void\r
+__leave_error_mcast_cb(\r
+       IN                              void                            *context )\r
+{\r
+       ipoib_port_t            *p_port;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_MCAST );\r
+\r
+       p_port = (ipoib_port_t*)context;\r
+\r
+       ipoib_port_deref( p_port, ref_leave_mcast);\r
+       IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,\r
+                       ("Leave mcast callback deref ipoib_port \n") );\r
+       \r
+       IPOIB_EXIT( IPOIB_DBG_MCAST );\r
+}\r
+\r
+/*++\r
+Routine Description:\r
+    The routine process the packet and returns LSO information\r
+    \r
+Arguments:\r
+    pNetBuffer - a pointer to the first net buffer object of the packet\r
+    TcpHeaderOffset - offset to the begining of the TCP header in the packet\r
+    pLsoData - pointer to LsoData object in which the routine returns the LSO information\r
+    pHeaderSize - pointer to ULONG object in which the header size is returned\r
+    IndexOfData - \r
+             \r
+Return Value:\r
+     NDIS_STATUS   \r
+\r
+NOTE:\r
+    called at DISPATCH level\r
+--*/\r
+\r
+NDIS_STATUS GetLsoHeaderSize(\r
+       IN              PNET_BUFFER             pNetBuffer,\r
+       IN              LsoData                 *pLsoData,\r
+       OUT     UINT                    *IndexOfData,\r
+       IN              ipoib_hdr_t *ipoib_hdr\r
+       )\r
+{\r
+       UINT            CurrLength;\r
+       PUCHAR          pSrc;\r
+       PUCHAR          pCopiedData = pLsoData->coppied_data;\r
+       ip_hdr_t        UNALIGNED  *IpHdr;\r
+       tcp_hdr_t       UNALIGNED *TcpHdr;\r
+       uint16_t        TcpHeaderLen;\r
+       uint16_t        IpHeaderLen;\r
+       uint16_t        IpOffset;\r
+       INT                     FullBuffers = 0;\r
+       PMDL            pMDL;\r
+       NDIS_STATUS     status = NDIS_STATUS_INVALID_PACKET;\r
+       \r
+       \r
+#define IP_OFFSET 14;\r
+       //\r
+       // This Flag indicates the way we gets the headers\r
+       // RegularFlow = we get the headers (ETH+IP+TCP) in the same Buffer \r
+       // in sequence.\r
+       //\r
+       boolean_t                       IsRegularFlow = TRUE;\r
+\r
+       const uint16_t          ETH_OFFSET = IP_OFFSET; \r
+       \r
+       pLsoData->LsoHeaderSize = 0;\r
+       IpOffset = IP_OFFSET; //(uint16_t)pPort->EncapsulationFormat.EncapsulationHeaderSize;\r
+       *IndexOfData = 0;\r
+\r
+       pMDL = NET_BUFFER_CURRENT_MDL(pNetBuffer);\r
+       NdisQueryMdl(pMDL, &pSrc, &CurrLength, NormalPagePriority);\r
+       //NdisQueryBufferSafe( CurrBuffer, &pSrc, &CurrLength, NormalPagePriority );\r
+       if (pSrc == NULL) {\r
+               IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error processing packets\n"));\r
+               return status;\r
+       }\r
+       // We start by looking for the ethernet and the IP\r
+       if (CurrLength < ETH_OFFSET) {\r
+               IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error porcessing packets\n"));\r
+               return status;\r
+       }\r
+       //pLsoData->LsoHeaderSize = pLsoData->LsoHeaderSize + ETH_OFFSET;\r
+       if (CurrLength == ETH_OFFSET) {        \r
+               ASSERT(FALSE);\r
+               IsRegularFlow = FALSE;        \r
+               memcpy(pCopiedData, pSrc, ETH_OFFSET);\r
+               pCopiedData += ETH_OFFSET;        \r
+               FullBuffers++;\r
+               // First buffer was only ethernet\r
+               pNetBuffer = NET_BUFFER_NEXT_NB(pNetBuffer);\r
+        NdisQueryMdl(NET_BUFFER_CURRENT_MDL(pNetBuffer), &pSrc, &CurrLength, NormalPagePriority);\r
+               if (pSrc == NULL) {\r
+                       IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing packets\n"));\r
+                       return status;\r
+           }\r
+       } else {\r
+               // This is ETH + IP together (at least)\r
+               pLsoData->LsoBuffers[0].pData = pSrc + (ETH_OFFSET - sizeof (ipoib_hdr_t));\r
+               memcpy (pLsoData->LsoBuffers[0].pData, ipoib_hdr, sizeof (ipoib_hdr_t));\r
+               CurrLength -= ETH_OFFSET;\r
+               pSrc = pSrc + ETH_OFFSET;\r
+               pLsoData->LsoHeaderSize = pLsoData->LsoHeaderSize + sizeof (ipoib_hdr_t);\r
+       }\r
+       // we should now be having at least the size of ethernet data\r
+       if (CurrLength < sizeof (ip_hdr_t)) {\r
+               IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing packets\n"));\r
+               return status;\r
+       }\r
+       IpHdr = (ip_hdr_t UNALIGNED*)pSrc;\r
+       IpHeaderLen = (uint16_t)IP_HEADER_LENGTH(IpHdr);\r
+       ASSERT(IpHdr->prot == IP_PROT_TCP);\r
+       if (CurrLength < IpHeaderLen) {\r
+               IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error processing packets\n"));\r
+               return status;\r
+       }\r
+       pLsoData->LsoHeaderSize = pLsoData->LsoHeaderSize + IpHeaderLen;\r
+       // We now start to find where the TCP header starts\r
+       if (CurrLength == IpHeaderLen) {\r
+               ASSERT(FALSE);\r
+               // two options : \r
+               // if(IsRegularFlow = FALSE) ==> ETH and IP seperated in two buffers\r
+               // if(IsRegularFlow = TRUE ) ==> ETH and IP in the same buffer \r
+               // TCP will start at next buffer\r
+               if(IsRegularFlow){\r
+                       memcpy(pCopiedData, pSrc-ETH_OFFSET ,ETH_OFFSET+IpHeaderLen);\r
+                       pCopiedData += (ETH_OFFSET + IpHeaderLen);\r
+               } else {\r
+                       memcpy(pCopiedData, pSrc,IpHeaderLen);\r
+                       pCopiedData += IpHeaderLen;\r
+               }\r
+\r
+               FullBuffers++;\r
+               IsRegularFlow = FALSE;\r
+               //NdisGetNextBuffer( CurrBuffer, &CurrBuffer);\r
+               //NdisQueryBufferSafe( CurrBuffer, &pSrc, &CurrLength, NormalPagePriority );\r
+               pNetBuffer = NET_BUFFER_NEXT_NB(pNetBuffer);\r
+               NdisQueryMdl(NET_BUFFER_CURRENT_MDL(pNetBuffer), &pSrc, &CurrLength, NormalPagePriority);\r
+               if (pSrc == NULL) {\r
+                       IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing packets\n"));\r
+                       return status;\r
+               }\r
+       } else {\r
+               // if(IsRegularFlow = TRUE ) ==> the ETH and IP and TCP in the same buffer       \r
+               // if(IsRegularFlow = FLASE ) ==> ETH in one buffer , IP+TCP together in the same buffer\r
+               if (IsRegularFlow) {            \r
+                       pLsoData->LsoBuffers[0].Len += IpHeaderLen;\r
+               } else {            \r
+                       memcpy(pCopiedData, pSrc, IpHeaderLen);\r
+                       pCopiedData += IpHeaderLen;\r
+               }\r
+\r
+               CurrLength -= IpHeaderLen;\r
+               pSrc = pSrc + IpHeaderLen;\r
+       }\r
+       if (CurrLength < sizeof (tcp_hdr_t)) {\r
+               IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing packets\n"));\r
+               return status;\r
+       }\r
+       // We have finaly found the TCP header\r
+       TcpHdr = (tcp_hdr_t UNALIGNED *)pSrc;\r
+       TcpHeaderLen = TCP_HEADER_LENGTH(TcpHdr);\r
+\r
+       //ASSERT(TcpHeaderLen == 20);\r
+       \r
+       if (CurrLength < TcpHeaderLen) {\r
+               //IPOIB_PRINT(TRACE_LEVEL_VERBOSE, ETH, ("Error porcessing packets\n"));\r
+               return status;\r
+       }\r
+       pLsoData->LsoHeaderSize =  pLsoData->LsoHeaderSize + TcpHeaderLen;\r
+       if(IsRegularFlow){\r
+               pLsoData->LsoBuffers[0].Len += TcpHeaderLen;\r
+       }\r
+       else{\r
+               memcpy(pCopiedData, pSrc, TcpHeaderLen);\r
+               pCopiedData += TcpHeaderLen;\r
+       }\r
+       if (CurrLength == TcpHeaderLen) {\r
+               FullBuffers++;\r
+               pLsoData->UsedBuffers = FullBuffers;\r
+               *IndexOfData = FullBuffers ;\r
+       } else {\r
+               pLsoData->UsedBuffers = FullBuffers + 1;\r
+               *IndexOfData = FullBuffers - 1;\r
+       }\r
+       pLsoData->FullBuffers = FullBuffers; \r
+       if (!IsRegularFlow){\r
+               pLsoData->LsoBuffers[0].pData = pLsoData->coppied_data;\r
+               pLsoData->LsoBuffers[0].Len = ETH_OFFSET + IpHeaderLen + TcpHeaderLen;\r
+               ASSERT(pLsoData->LsoBuffers[0].Len <= LSO_MAX_HEADER);\r
+       }\r
+       return NDIS_STATUS_SUCCESS;\r
+}\r
+\r
+static void __port_do_mcast_garbage(ipoib_port_t* const        p_port)\r
+{\r
+    const mac_addr_t DEFAULT_MCAST_GROUP = {0x01, 0x00, 0x5E, 0x00, 0x00, 0x01};\r
+       /* Do garbage collecting... */\r
+\r
+       cl_map_item_t   *p_item;\r
+       ipoib_endpt_t   *p_endpt;\r
+       cl_qlist_t              destroy_mc_list;\r
+       uint8_t                 cnt;\r
+       const static GC_MAX_LEAVE_NUM = 80;\r
+\r
+       cl_qlist_init( &destroy_mc_list );\r
+\r
+       cl_obj_lock( &p_port->obj );\r
+       /* Wait for all readers to finish */\r
+       while( p_port->endpt_rdr )\r
+       {\r
+               cl_obj_unlock( &p_port->obj );\r
+               cl_obj_lock( &p_port->obj );\r
+       }\r
+       cnt = 0;\r
+       p_item = cl_qmap_head( &p_port->endpt_mgr.mac_endpts );\r
+       while( (p_item != cl_qmap_end( &p_port->endpt_mgr.mac_endpts )) && (cnt < GC_MAX_LEAVE_NUM))\r
+       {\r
+               p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );\r
+               p_item = cl_qmap_next( p_item );\r
+\r
+               /* Check if the current endpoint is not a multicast listener */\r
+\r
+               if( p_endpt->h_mcast && \r
+                       (!p_endpt->is_mcast_listener) &&\r
+                       ( cl_memcmp( &p_endpt->mac, &DEFAULT_MCAST_GROUP, sizeof(mac_addr_t) ) &&\r
+                        (!p_endpt->is_in_use) ))\r
+               {\r
+                       cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,\r
+                               &p_endpt->mac_item );\r
+                       cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,\r
+                               &p_endpt->gid_item );\r
+\r
+                       if( p_endpt->dlid )\r
+                       {\r
+                               cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,\r
+                                       &p_endpt->lid_item );\r
+                               p_endpt->dlid = 0;\r
+                       }\r
+\r
+                       cl_qlist_insert_tail(\r
+                               &destroy_mc_list, &p_endpt->mac_item.pool_item.list_item );\r
+                       cnt++;\r
+               }\r
+               else\r
+                       p_endpt->is_in_use = FALSE;\r
+       }\r
+       cl_obj_unlock( &p_port->obj );\r
+\r
+       /* Destroy all multicast endpoints now that we have released the lock. */\r
+       while( cl_qlist_count( &destroy_mc_list ) )\r
+       {\r
+               p_endpt = PARENT_STRUCT( cl_qlist_remove_head( &destroy_mc_list ),\r
+                                                                ipoib_endpt_t, mac_item.pool_item.list_item );\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,\r
+                       ("mcast garbage collector: destroying endpoint %02x:%02x:%02x:%02x:%02x:%02x \n", \r
+                                p_endpt->mac.addr[0],\r
+                                p_endpt->mac.addr[1],\r
+                                p_endpt->mac.addr[2],\r
+                                p_endpt->mac.addr[3],\r
+                                p_endpt->mac.addr[4],\r
+                                p_endpt->mac.addr[5]) );\r
+               cl_obj_destroy( &p_endpt->obj );\r
+       }\r
+}\r
+\r
+static void __port_mcast_garbage_dpc(KDPC *p_gc_dpc,void *context,void *s_arg1, void *s_arg2)\r
+{\r
+       ipoib_port_t *p_port = (ipoib_port_t *) context;\r
+\r
+       UNREFERENCED_PARAMETER(p_gc_dpc);\r
+       UNREFERENCED_PARAMETER(s_arg1);\r
+       UNREFERENCED_PARAMETER(s_arg2);\r
+\r
+       __port_do_mcast_garbage(p_port);\r
+}\r
+\r
+ipoib_endpt_t*\r
+ipoib_endpt_get_by_gid(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   ib_gid_t* const                         p_gid )\r
+{\r
+       return __endpt_mgr_get_by_gid( p_port, p_gid );\r
+}\r
+\r
+ipoib_endpt_t*\r
+ipoib_endpt_get_by_lid(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   net16_t                                         lid )\r
+{\r
+       return __endpt_mgr_get_by_lid( p_port, lid );\r
+}\r
+\r
+ib_api_status_t\r
+ipoib_recv_dhcp(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN              const   ipoib_pkt_t* const                      p_ipoib,\r
+               OUT                     eth_pkt_t* const                        p_eth,\r
+       IN                              ipoib_endpt_t* const            p_src,\r
+       IN                              ipoib_endpt_t* const            p_dst )\r
+{\r
+       return __recv_dhcp(\r
+               p_port, p_ipoib, p_eth, p_src,p_dst );\r
+}\r
+\r
+\r
+void\r
+ipoib_port_cancel_xmit(\r
+       IN                              ipoib_port_t* const             p_port,\r
+       IN                              PVOID                                    cancel_id )\r
+{\r
+       cl_list_item_t          *p_item;\r
+       PNET_BUFFER_LIST                p_nbl;\r
+       PVOID                   nbl_id;\r
+       cl_qlist_t              cancel_list;\r
+       ULONG                   send_complete_flags = 0;\r
+       IPOIB_ENTER( IPOIB_DBG_SEND );\r
+\r
+       cl_qlist_init( &cancel_list );\r
+\r
+       cl_spinlock_acquire( &p_port->send_lock );\r
+\r
+       for( p_item = cl_qlist_head( &p_port->send_mgr.pending_list );\r
+               p_item != cl_qlist_end( &p_port->send_mgr.pending_list );\r
+               p_item = cl_qlist_next( p_item ) )\r
+       {\r
+               p_nbl = IPOIB_PACKET_FROM_LIST_ITEM( p_item );\r
+               nbl_id = NDIS_GET_NET_BUFFER_LIST_CANCEL_ID( p_nbl );\r
+               if( nbl_id == cancel_id )\r
+               {\r
+                       cl_qlist_remove_item( &p_port->send_mgr.pending_list, p_item );\r
+                       NET_BUFFER_LIST_STATUS( p_nbl) = NDIS_STATUS_REQUEST_ABORTED ;\r
+                       cl_qlist_insert_tail( &cancel_list, IPOIB_LIST_ITEM_FROM_PACKET( p_nbl ) );\r
+               }\r
+       }\r
+       cl_spinlock_release( &p_port->send_lock );\r
+\r
+       if( cl_qlist_count( &cancel_list ) )\r
+       {\r
+               while( ( p_item = cl_qlist_remove_head( &cancel_list )) \r
+                                                               != cl_qlist_end( &cancel_list ))\r
+               {\r
+                       p_nbl = IPOIB_PACKET_FROM_LIST_ITEM( p_item );\r
+                       NET_BUFFER_LIST_STATUS( p_nbl) = NDIS_STATUS_SEND_ABORTED;\r
+                       send_complete_flags = 0;\r
+                       if (NDIS_CURRENT_IRQL() == DISPATCH_LEVEL)\r
+                       {\r
+                               NDIS_SET_SEND_COMPLETE_FLAG(send_complete_flags, NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL);\r
+                       }\r
+                       NdisMSendNetBufferListsComplete( p_port->p_adapter->h_adapter,\r
+                               p_nbl, send_complete_flags );\r
+               }\r
+       }\r
+       IPOIB_EXIT( IPOIB_DBG_SEND );\r
+}\r
+\r
+/* \r
+*  Put all fragments into separate WR and chain together.\r
+*  The last WR will be set to generate CQ Event.\r
+*  lookaside buffer is used for ipoib and ip headers attached to each WR.\r
+*  Buffer will be released on last WR send completion.\r
+*/\r
+#if 0\r
+static NDIS_STATUS\r
+__send_fragments(\r
+IN             ipoib_port_t* const                     p_port,\r
+IN             ipoib_send_desc_t* const        p_desc,\r
+IN             eth_hdr_t* const                        p_eth_hdr,\r
+IN             ip_hdr_t* const                         p_ip_hdr,\r
+IN             uint32_t                                        buf_len,\r
+IN             NDIS_BUFFER*                            p_ndis_buf )\r
+{\r
+       uint32_t        ds_idx = 1;\r
+       uint32_t        wr_idx = 0;\r
+       uint32_t        sgl_idx = 2; //skip eth hdr, ip hdr\r
+       uint32_t        options_len = 0;\r
+       uint8_t*        p_options = NULL;\r
+       uint8_t*        p_buf;\r
+       uint32_t        frag_offset = 0;\r
+       uint32_t        next_sge;\r
+       uint32_t        wr_size = 0;\r
+       uint32_t        ip_hdr_len = IP_HEADER_LENGTH( p_ip_hdr );\r
+       uint32_t        total_ip_len = cl_ntoh16( p_ip_hdr->length );\r
+\r
+       SCATTER_GATHER_LIST             *p_sgl;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_SEND );\r
+\r
+       if( IP_DONT_FRAGMENT(p_ip_hdr) )\r
+                       return NDIS_STATUS_INVALID_PACKET;\r
+       \r
+       p_sgl = NDIS_PER_PACKET_INFO_FROM_PACKET( p_desc->p_pkt, ScatterGatherListPacketInfo );\r
+       if( !p_sgl )\r
+       {\r
+               ASSERT( p_sgl );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Failed to get SGL from packet.\n") );\r
+               return NDIS_STATUS_FAILURE;\r
+       }\r
+       if( ( p_sgl->NumberOfElements > MAX_SEND_SGE ||\r
+               p_sgl->Elements[0].Length < sizeof(eth_hdr_t)) )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Too many SG Elements in packet.\n") );\r
+               return NDIS_STATUS_FAILURE;\r
+       }\r
+       p_buf = (uint8_t *)\r
+               ExAllocateFromNPagedLookasideList( &p_port->buf_mgr.send_buf_list );\r
+       if( !p_buf )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Failed to allocate lookaside buffer.\n") );\r
+               return NDIS_STATUS_RESOURCES;\r
+       }\r
+       p_desc->p_buf = (send_buf_t*)p_buf;\r
+\r
+       if( buf_len < ip_hdr_len )\r
+       {       /* ip options in a separate buffer */\r
+               CL_ASSERT( buf_len == sizeof( ip_hdr_t ) );\r
+               NdisGetNextBuffer( p_ndis_buf, &p_ndis_buf );\r
+               if( !p_ndis_buf )\r
+               {\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Failed to get IP options buffer.\n") );\r
+                       return NDIS_STATUS_FAILURE;\r
+               }\r
+               NdisQueryBufferSafe( p_ndis_buf, &p_options, &options_len, NormalPagePriority );\r
+               if( !p_options )\r
+               {\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Failed to query IP options buffer address.\n") );\r
+                       return NDIS_STATUS_FAILURE;\r
+               }\r
+               cl_memcpy( p_buf, p_ip_hdr, sizeof( ip_hdr_t ) );\r
+               if( p_options && options_len )\r
+               { \r
+                       __copy_ip_options( &p_buf[sizeof(ip_hdr_t)], \r
+                                                               p_options, options_len, TRUE );\r
+               }\r
+               wr_size = buf_len + options_len;\r
+               sgl_idx++;\r
+       }\r
+       else\r
+       {       /*options probably in the same buffer */\r
+               cl_memcpy( p_buf, p_ip_hdr, buf_len );\r
+               options_len = ip_hdr_len - sizeof( ip_hdr_t );\r
+               if( options_len )\r
+               {\r
+                       p_options = p_buf + sizeof( ip_hdr_t );\r
+               }\r
+               frag_offset += ( buf_len - ip_hdr_len );\r
+               wr_size = buf_len;\r
+       }\r
+\r
+       p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf );\r
+       p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;\r
+       p_desc->send_wr[wr_idx].local_ds[ds_idx].length = wr_size;\r
+       \r
+       /* count how much data can be put into the first WR beside IP header.\r
+        * other protocols headers possibly supplied in subsequent buffers.\r
+        */\r
+       for( sgl_idx; sgl_idx < p_sgl->NumberOfElements; sgl_idx++ )\r
+       {\r
+               next_sge = p_sgl->Elements[sgl_idx].Length;\r
+\r
+               /* add sgl if it can fit into the same WR \r
+               * Note: so far not going to split large SGE between WRs,\r
+               * so first fragment could be a smaller size.\r
+               */\r
+               if( next_sge <= ( p_port->p_adapter->params.payload_mtu - wr_size ) )\r
+               {\r
+                       ++ds_idx;\r
+                       wr_size += next_sge;\r
+                       frag_offset += next_sge;\r
+                       p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = \r
+                                                                       p_sgl->Elements[sgl_idx].Address.QuadPart;\r
+                       p_desc->send_wr[wr_idx].local_ds[ds_idx].length = next_sge;\r
+                       p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;\r
+               }\r
+               else\r
+               {\r
+                       /* fix ip hdr for the first fragment and move on */\r
+                       __update_fragment_ip_hdr( (ip_hdr_t* const)p_buf,\r
+                               (uint16_t)wr_size, IP_FRAGMENT_OFFSET(p_ip_hdr), TRUE );\r
+\r
+                       p_desc->send_wr[wr_idx].wr.num_ds = ds_idx + 1;\r
+                       p_buf += ip_hdr_len;\r
+                       p_buf += (( buf_len > ip_hdr_len ) ? ( buf_len - ip_hdr_len ): 0);\r
+                       frag_offset += ( (IP_FRAGMENT_OFFSET(p_ip_hdr)) << 3 );\r
+                       ++wr_idx;\r
+                       ds_idx = 0;\r
+                       break;\r
+               }\r
+       }\r
+       total_ip_len -= wr_size;\r
+       wr_size = 0;\r
+\r
+       for( sgl_idx, wr_idx; sgl_idx < p_sgl->NumberOfElements; sgl_idx++ )\r
+       {\r
+               uint32_t        seg_len;\r
+               uint64_t        next_sgl_addr;\r
+               \r
+               if( wr_idx >= ( MAX_WRS_PER_MSG - 1 ) )\r
+                       return NDIS_STATUS_RESOURCES;\r
+               \r
+               next_sge = p_sgl->Elements[sgl_idx].Length;\r
+               next_sgl_addr = p_sgl->Elements[sgl_idx].Address.QuadPart;\r
+\r
+               while( next_sge )\r
+               {\r
+                       if( ds_idx == 0 )\r
+                       {       /* new ipoib + ip header */\r
+                               ((ipoib_hdr_t*)p_buf)->type = p_eth_hdr->type;\r
+                               ((ipoib_hdr_t*)p_buf)->resv = 0;\r
+                               p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf );\r
+                               p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;\r
+                               p_desc->send_wr[wr_idx].local_ds[ds_idx].length = sizeof( ipoib_hdr_t );\r
+                               p_buf += sizeof( ipoib_hdr_t );\r
+                               ++ds_idx;\r
+\r
+                               cl_memcpy( p_buf, p_ip_hdr, sizeof( ip_hdr_t ) );\r
+                               if( p_options && options_len )\r
+                               {\r
+                                       /* copy ip options if needed */\r
+                                       __copy_ip_options( &p_buf[sizeof(ip_hdr_t)], \r
+                                                               p_options, options_len, FALSE );\r
+                               }\r
+                               wr_size = ip_hdr_len;\r
+                       }\r
+                       if( ds_idx == 1 )\r
+                       {\r
+                               p_desc->send_wr[wr_idx].local_ds[ds_idx].length = ip_hdr_len;\r
+                               p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf );\r
+                               p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;\r
+                               ++ds_idx;\r
+                       }\r
+\r
+                       seg_len = ( next_sge > ( p_port->p_adapter->params.payload_mtu - wr_size ) )?\r
+                               ( p_port->p_adapter->params.payload_mtu - wr_size ) : next_sge;\r
+\r
+                       p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = next_sgl_addr;\r
+                       p_desc->send_wr[wr_idx].local_ds[ds_idx].length = seg_len;\r
+                       p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;\r
+                       ++ds_idx;\r
+                       \r
+                       wr_size += seg_len;\r
+                       total_ip_len -= seg_len;\r
+\r
+                       if( wr_size >= p_port->p_adapter->params.payload_mtu || total_ip_len == 0 )\r
+                       {       /* fix ip hdr for that fragment */\r
+                               __update_fragment_ip_hdr( (ip_hdr_t* const)p_buf, (uint16_t)wr_size,\r
+                                       ((uint16_t)(frag_offset >> 3 )), \r
+                                       (BOOLEAN)(( total_ip_len > 0 ) || IP_MORE_FRAGMENTS( p_ip_hdr)) );\r
+                               p_desc->send_wr[wr_idx].wr.num_ds = ds_idx;\r
+                               if( total_ip_len > 0 )\r
+                               {\r
+                                       ++wr_idx;\r
+                                       frag_offset += (wr_size - ip_hdr_len);\r
+                                       wr_size = 0;\r
+                                       ds_idx = 0;\r
+                                       p_buf += ip_hdr_len;\r
+                               }\r
+                       }\r
+                       next_sge -= seg_len;\r
+                       if( next_sge > 0 )\r
+                       {\r
+                               next_sgl_addr += seg_len;\r
+                       }\r
+               }\r
+       }\r
+       p_desc->num_wrs += wr_idx;\r
+       \r
+       IPOIB_EXIT( IPOIB_DBG_SEND );\r
+       return NDIS_STATUS_SUCCESS;\r
+}\r
+\r
+\r
+static void\r
+__update_fragment_ip_hdr(\r
+IN             ip_hdr_t* const         p_ip_hdr,\r
+IN             uint16_t                        fragment_size, \r
+IN             uint16_t                        fragment_offset, \r
+IN             BOOLEAN                         more_fragments )\r
+{\r
+       uint16_t*       p_hdr = (uint16_t*)p_ip_hdr;\r
+       p_ip_hdr->length = cl_hton16( fragment_size ); // bytes\r
+       p_ip_hdr->offset = cl_hton16( fragment_offset ); // 8-byte units\r
+       if( more_fragments )\r
+       {\r
+               IP_SET_MORE_FRAGMENTS( p_ip_hdr );\r
+       }\r
+       else\r
+       {\r
+               IP_SET_LAST_FRAGMENT( p_ip_hdr );\r
+       }\r
+       p_ip_hdr->chksum = 0;\r
+       p_ip_hdr->chksum = ipchksum( p_hdr, IP_HEADER_LENGTH(p_ip_hdr) );\r
+}\r
+\r
+static void\r
+__copy_ip_options(\r
+IN             uint8_t*        p_buf,\r
+IN             uint8_t*        p_options,\r
+IN             uint32_t        options_len,\r
+IN             BOOLEAN         copy_all )\r
+{\r
+       uint32_t        option_length;\r
+       uint32_t        total_length = 0;\r
+       uint32_t        copied_length = 0;\r
+       uint8_t*        p_src = p_options;\r
+       uint8_t*        p_dst = p_buf;\r
+\r
+       if( p_options == NULL || options_len == 0 )\r
+               return;\r
+       if( copy_all )\r
+       {\r
+               cl_memcpy( p_dst, p_src, options_len );\r
+               return;\r
+       }\r
+       do\r
+       {\r
+               if( ( *p_src ) == 0 ) // end of options list\r
+               {\r
+                       total_length++;\r
+                       break;\r
+               }\r
+               if( ( *p_src ) == 0x1 ) // no op\r
+               {\r
+                       p_src++;\r
+                       total_length++;\r
+                       continue;\r
+               }\r
+               /*from RFC791: \r
+               * This option may be used between options, for example, to align\r
+        * the beginning of a subsequent option on a 32 bit boundary.\r
+               */\r
+               if( copied_length && (copied_length % 4) )\r
+               {\r
+                       uint32_t align = 4 - (copied_length % 4);\r
+                       cl_memset( p_dst, 0x1, (size_t)align );\r
+                       p_dst += align;\r
+                       copied_length += align;\r
+               }\r
+               option_length = *(p_src + 1);\r
+\r
+               if( *p_src & 0x80 )\r
+               {\r
+                       cl_memcpy( p_dst, p_src, option_length );\r
+                       p_dst += option_length;\r
+                       copied_length += option_length;\r
+               }\r
+               total_length += option_length;\r
+               p_src += option_length;\r
+\r
+       }while( total_length < options_len );\r
+\r
+       CL_ASSERT( total_length == options_len );\r
+       CL_ASSERT( copied_length <= 40 );\r
+\r
+       /* padding the rest */\r
+       if( options_len > copied_length )\r
+       {\r
+               cl_memclr( p_dst, ( options_len - copied_length ) );\r
+       }\r
+       return;\r
+}\r
+#endif\r
index 602389b5eb25a96dd0dd5a61f5656142e269b579..30090dc074e1a7b704d21d4ed44cfb93235098d9 100644 (file)
@@ -86,8 +86,8 @@
        (((send_buf_t**)NET_BUFFER_MINIPORT_RESERVED(P))[2])\r
 \r
 \r
-#define IPOIB_GET_NET_BUFFER_LIST_REF_COUNT(_NetBufferList)    ((_NetBufferList->FirstNetBuffer)->MiniportReserved[3])\r
-#define IPOIB_DEC_NET_BUFFER_LIST_REF_COUNT(_NetBufferList)    (*(PULONG)&(_NetBufferList->FirstNetBuffer)->MiniportReserved[3])--\r
+#define IPOIB_GET_NET_BUFFER_LIST_REF_COUNT(_NetBufferList)    ((NET_BUFFER_LIST_FIRST_NB(_NetBufferList))->MiniportReserved[3])\r
+#define IPOIB_DEC_NET_BUFFER_LIST_REF_COUNT(_NetBufferList)    (*(PULONG)&(NET_BUFFER_LIST_FIRST_NB(_NetBufferList))->MiniportReserved[3])--\r
 \r
 \r
 typedef struct _ipoib_ib_mgr\r
@@ -523,7 +523,7 @@ typedef struct _ipoib_endpt_mgr
 *              Map of connected endpts, keyed by remote gid.\r
 *********/\r
 \r
-\r
+#pragma warning(disable:4324)   // structure padded due to align()\r
 typedef struct _ipoib_port\r
 {\r
        cl_obj_t                                obj;\r
@@ -573,6 +573,8 @@ typedef struct _ipoib_port
        ipoib_hdr_t                             hdr[1]; /* Must be last! */\r
 \r
 }      ipoib_port_t;\r
+#pragma warning(default:4324)\r
+\r
 /*\r
 * FIELDS\r
 *      obj\r
diff --git a/branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_xfr_mgr.c b/branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_xfr_mgr.c
deleted file mode 100644 (file)
index ce0650f..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-/*\r
- * Copyright (c) 2008 Mellanox Technologies.  All rights reserved.\r
- *\r
- * This software is available to you under the OpenIB.org BSD license\r
- * below:\r
- *\r
- *     Redistribution and use in source and binary forms, with or\r
- *     without modification, are permitted provided that the following\r
- *     conditions are met:\r
- *\r
- *      - Redistributions of source code must retain the above\r
- *        copyright notice, this list of conditions and the following\r
- *        disclaimer.\r
- *\r
- *      - Redistributions in binary form must reproduce the above\r
- *        copyright notice, this list of conditions and the following\r
- *        disclaimer in the documentation and/or other materials\r
- *        provided with the distribution.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
- * SOFTWARE.\r
- *\r
- * $Id: ipoib_xfr_mgr.c 3459 2008-11-12 16:48:21Z tzachid $\r
- */\r
-\r
-\r
-#include "ipoib_xfr_mgr.h"\r
-#if defined(EVENT_TRACING)\r
-#ifdef offsetof\r
-#undef offsetof\r
-#endif\r
-#include "ipoib_xfr_mgr.tmh"\r
-#endif\r
-\r
-\r
-const ipoib_guid2mac_translation_t guid2mac_table[] = {\r
-       {0x30, 0x48, 0xE7},\r
-       {0x05, 0xAD, 0xE7},\r
-       {0x18, 0x8B, 0xE7},\r
-       {0x1A, 0x4B, 0xE7},\r
-       {0x17, 0x08, 0xE7},\r
-       {0x1E, 0x0B, 0xE7},\r
-\r
-       {0x03, 0xBA, 0xE7},\r
-       {0x05, 0xAD, 0xE7},\r
-       {0x0D, 0x9D, 0xE7},\r
-       {0x11, 0x0A, 0xE7},\r
-       {0x11, 0x85, 0xE7},\r
-       {0x12, 0x79, 0xE7},\r
-       {0x13, 0x21, 0xE7},\r
-       {0x14, 0x38, 0xE7},\r
-       {0x16, 0x35, 0xE7},\r
-       {0x17, 0x08, 0xE7},\r
-       {0x17, 0xA4, 0xE7},\r
-       {0x18, 0x8B, 0xE7},\r
-       {0x18, 0xFE, 0xE7},\r
-       {0x19, 0xBB, 0xE7},\r
-       {0x1A, 0x4B, 0xE7},\r
-       {0x1B, 0x78, 0xE7},\r
-       {0x1E, 0x0B, 0xE7},\r
-       {0x22, 0x64, 0xE7},\r
-       {0x23, 0x7D, 0xE7},\r
-       {0x30, 0x48, 0xE7},\r
-       {0x80, 0x5F, 0xE7},\r
-\r
-       {0x00, 0x00, 0x00},\r
-};\r
-\r
diff --git a/branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_xfr_mgr.cpp b/branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_xfr_mgr.cpp
new file mode 100644 (file)
index 0000000..ce0650f
--- /dev/null
@@ -0,0 +1,74 @@
+/*\r
+ * Copyright (c) 2008 Mellanox Technologies.  All rights reserved.\r
+ *\r
+ * This software is available to you under the OpenIB.org BSD license\r
+ * below:\r
+ *\r
+ *     Redistribution and use in source and binary forms, with or\r
+ *     without modification, are permitted provided that the following\r
+ *     conditions are met:\r
+ *\r
+ *      - Redistributions of source code must retain the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer.\r
+ *\r
+ *      - Redistributions in binary form must reproduce the above\r
+ *        copyright notice, this list of conditions and the following\r
+ *        disclaimer in the documentation and/or other materials\r
+ *        provided with the distribution.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
+ * SOFTWARE.\r
+ *\r
+ * $Id: ipoib_xfr_mgr.c 3459 2008-11-12 16:48:21Z tzachid $\r
+ */\r
+\r
+\r
+#include "ipoib_xfr_mgr.h"\r
+#if defined(EVENT_TRACING)\r
+#ifdef offsetof\r
+#undef offsetof\r
+#endif\r
+#include "ipoib_xfr_mgr.tmh"\r
+#endif\r
+\r
+\r
+const ipoib_guid2mac_translation_t guid2mac_table[] = {\r
+       {0x30, 0x48, 0xE7},\r
+       {0x05, 0xAD, 0xE7},\r
+       {0x18, 0x8B, 0xE7},\r
+       {0x1A, 0x4B, 0xE7},\r
+       {0x17, 0x08, 0xE7},\r
+       {0x1E, 0x0B, 0xE7},\r
+\r
+       {0x03, 0xBA, 0xE7},\r
+       {0x05, 0xAD, 0xE7},\r
+       {0x0D, 0x9D, 0xE7},\r
+       {0x11, 0x0A, 0xE7},\r
+       {0x11, 0x85, 0xE7},\r
+       {0x12, 0x79, 0xE7},\r
+       {0x13, 0x21, 0xE7},\r
+       {0x14, 0x38, 0xE7},\r
+       {0x16, 0x35, 0xE7},\r
+       {0x17, 0x08, 0xE7},\r
+       {0x17, 0xA4, 0xE7},\r
+       {0x18, 0x8B, 0xE7},\r
+       {0x18, 0xFE, 0xE7},\r
+       {0x19, 0xBB, 0xE7},\r
+       {0x1A, 0x4B, 0xE7},\r
+       {0x1B, 0x78, 0xE7},\r
+       {0x1E, 0x0B, 0xE7},\r
+       {0x22, 0x64, 0xE7},\r
+       {0x23, 0x7D, 0xE7},\r
+       {0x30, 0x48, 0xE7},\r
+       {0x80, 0x5F, 0xE7},\r
+\r
+       {0x00, 0x00, 0x00},\r
+};\r
+\r