[ofw] [PATCH v2] Add smarter IB address translation

Fab Tillier ftillier at windows.microsoft.com
Wed Jul 2 11:56:04 PDT 2008


I forgot to include the header file for the library.  So here's the patch again.

Signed-off-by: Fab Tillier <ftillier at microsoft.com>

diff -up -N -r -X trunk\docs\dontdiff.txt -I \$Id: old\core\dirs trunk\core\dirs
--- old\core\dirs       Wed Jul 02 11:53:02 2008
+++ trunk\core\dirs     Wed Jul 02 11:47:36 2008
@@ -2,4 +2,5 @@ DIRS=\
        complib \
        al              \
        bus             \
-       iou
+       iou             \
+       ibat
diff -up -N -r -X trunk\docs\dontdiff.txt -I \$Id: old\core\ibat\dirs trunk\core\ibat\dirs
--- old\core\ibat\dirs  Wed Dec 31 16:00:00 1969
+++ trunk\core\ibat\dirs        Wed Jul 02 11:00:10 2008
@@ -0,0 +1,2 @@
+DIRS=\
+       user
diff -up -N -r -X trunk\docs\dontdiff.txt -I \$Id: old\core\ibat\user\ibat.cpp trunk\core\ibat\user\ibat.cpp
--- old\core\ibat\user\ibat.cpp Wed Dec 31 16:00:00 1969
+++ trunk\core\ibat\user\ibat.cpp       Wed Jul 02 11:00:10 2008
@@ -0,0 +1,400 @@
+/*
+ * Copyright (c) 2008 Microsoft Corporation.  All rights reserved.
+ *
+ * This software is available to you under 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:$
+ */
+
+//
+// IBAT: InfiniBand Address Translation
+//
+// Description:
+//  Maps remote IP addresses (IPv4 and IPv6) to the remote GID.
+//
+//  The mapping requires two steps:
+//      1. Mapping the remote IP address to the remote Ethernet MAC address
+//      2. Retrieve the remote GID given the remote Ethernet MAC address
+//      from IPoIB
+//
+//  The first step is accomplished as follows on Windows Server 2008:
+//      1. Lookup the desired MAC from the OS using GetIpNetEntry2
+//      2. If the remote IP isn't found, resolve the remote IP address
+//      using ResolveIpNetEntry2
+//
+//  The first step is accomplished as follows on Windows Server 2003:
+//      1. Retrieve the whole IP->MAC mapping table from the OS using
+//      GetIpNetTable.
+//      2. Walk the returned table looking for the destination IP to
+//      find the destination Ethernet MAC address.
+//      3. If the remote IP isn't found, resolve the remote IP address using
+//      SendARP.
+//
+//  The second step is accomplished by asking IPoIB for the remote GID
+//  given the remote MAC.
+
+#pragma warning( push, 3 )
+#include <windows.h>
+#include <stdlib.h>
+#include <winioctl.h>
+#pragma warning( pop )
+#include "iba/ibat.h"
+#include <iphlpapi.h>
+#include "iba/ib_at_ioctl.h"
+
+
+namespace IBAT
+{
+
+    const IN6_ADDR x_DefaultGid = {0xFE,0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+
+class H
+{
+public:
+    H( HANDLE h = INVALID_HANDLE_VALUE ) : m_h( h ) {};
+    ~H(){ if( m_h != INVALID_HANDLE_VALUE ) CloseHandle( m_h ); }
+
+    H& operator =(HANDLE h){ CloseHandle( m_h ); m_h = h; }
+    operator HANDLE() const { return m_h; }
+
+private:
+    HANDLE m_h;
+};
+
+#if WINVER >= 0x600
+HRESULT
+Resolve(
+    __in const struct sockaddr* pSrcAddr,
+    __in const struct sockaddr* pDestAddr,
+    __out IN6_ADDR* pSrcGid,
+    __out IN6_ADDR* pDestGid,
+    __out USHORT* pPkey
+    )
+{
+    if( pSrcAddr->sa_family != pDestAddr->sa_family )
+        return E_INVALIDARG;
+
+    H hIbatDev = CreateFileW( IBAT_WIN32_NAME,
+        MAXIMUM_ALLOWED, 0, NULL,
+        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
+    if( hIbatDev == INVALID_HANDLE_VALUE )
+        return HRESULT_FROM_WIN32( GetLastError() );
+
+    bool fLoopback;
+    IOCTL_IBAT_IP_TO_PORT_IN port_in;
+    port_in.Version = IBAT_IOCTL_VERSION;
+    if( pSrcAddr->sa_family == AF_INET )
+    {
+        port_in.Address.IpVersion = 4;
+        RtlCopyMemory(
+            &port_in.Address.Address[12],
+            &((struct sockaddr_in*)pSrcAddr)->sin_addr,
+            sizeof( ((struct sockaddr_in*)pSrcAddr)->sin_addr ) );
+
+        fLoopback = ((struct sockaddr_in*)pDestAddr)->sin_addr.s_addr ==
+            ((struct sockaddr_in*)pSrcAddr)->sin_addr.s_addr;
+    }
+    else
+    {
+        port_in.Address.IpVersion = 6;
+        RtlCopyMemory(
+            port_in.Address.Address,
+            &((struct sockaddr_in6*)pSrcAddr)->sin6_addr,
+            sizeof(port_in.Address.Address) );
+        fLoopback = IN6_ADDR_EQUAL(
+            &((struct sockaddr_in6*)pDestAddr)->sin6_addr,
+            &((struct sockaddr_in6*)pSrcAddr)->sin6_addr
+            ) == TRUE;
+    }
+
+    IBAT_PORT_RECORD port_out;
+    DWORD size;
+    BOOL fSuccess = DeviceIoControl( hIbatDev, IOCTL_IBAT_IP_TO_PORT,
+        &port_in, sizeof(port_in), &port_out, sizeof(port_out), &size, NULL );
+
+    if( !fSuccess )
+        return HRESULT_FROM_WIN32( GetLastError() );
+
+    // Check for loopback.
+    if( fLoopback )
+    {
+        *pSrcGid = x_DefaultGid;
+        RtlCopyMemory(
+            &pSrcGid->u.Byte[8],
+            &port_out.PortGuid,
+            sizeof(port_out.PortGuid) );
+        *pDestGid = *pSrcGid;
+        *pPkey = port_out.PKey;
+        return S_OK;
+    }
+
+    NET_LUID luid;
+    DWORD ret;
+    do
+    {
+        DWORD iIf;
+        ret = GetBestInterfaceEx( (struct sockaddr*)pSrcAddr, &iIf );
+        if( ret != NO_ERROR )
+            return HRESULT_FROM_WIN32( ret );
+
+        // Interface indexes are not constant, so get the LUID mapping for the
+        // returned interface for use in the rest of the function.
+        ret = ConvertInterfaceIndexToLuid( iIf, &luid );
+
+    } while( ret != NO_ERROR );
+
+    SOCKADDR_INET src;
+    MIB_IPNET_ROW2 net = {0};
+    net.InterfaceLuid = luid;
+    switch( pDestAddr->sa_family )
+    {
+    case AF_INET:
+        net.Address.si_family = src.si_family = AF_INET;
+        net.Address.Ipv4 = *(struct sockaddr_in*)pDestAddr;
+        src.Ipv4 = *(struct sockaddr_in*)pSrcAddr;
+        break;
+
+    case AF_INET6:
+        net.Address.si_family = src.si_family = AF_INET6;
+        net.Address.Ipv6 = *(struct sockaddr_in6*)pDestAddr;
+        src.Ipv6 = *(struct sockaddr_in6*)pSrcAddr;
+        break;
+
+    default:
+        return E_INVALIDARG;
+    }
+
+    bool fRetry = true;
+retry:
+    ret = GetIpNetEntry2( &net );
+    if( ret != NO_ERROR )
+        return HRESULT_FROM_WIN32( ret );
+
+    switch( net.State )
+    {
+    default:
+    case NlnsUnreachable:
+        ret = ResolveIpNetEntry2( &net, &src );
+        if( ret == ERROR_BAD_NET_NAME && fRetry )
+        {
+            fRetry = false;
+            goto retry;
+        }
+        else if( ret != NO_ERROR )
+        {
+            return HRESULT_FROM_WIN32( ret );
+        }
+        break;
+
+    case NlnsReachable:
+    case NlnsPermanent:
+        break;
+
+    case NlnsIncomplete:
+        return E_PENDING;
+    }
+
+    if( net.PhysicalAddressLength > 6 )
+        return E_UNEXPECTED;
+
+    IOCTL_IBAT_MAC_TO_GID_IN mac_in;
+    mac_in.Version = IBAT_IOCTL_VERSION;
+    mac_in.PortGuid = port_out.PortGuid;
+    RtlCopyMemory( mac_in.DestMac, net.PhysicalAddress, IBAT_MAC_LEN );
+
+    fSuccess = DeviceIoControl( hIbatDev, IOCTL_IBAT_MAC_TO_GID,
+        &mac_in, sizeof(mac_in), pDestGid, sizeof(*pDestGid), &size, NULL );
+    if( !fSuccess )
+        return HRESULT_FROM_WIN32( GetLastError() );
+
+    // Use the same subnet prefix as the destination.
+    *pSrcGid = *pDestGid;
+    RtlCopyMemory( &pSrcGid->u.Byte[8], &port_out.PortGuid, sizeof(port_out.PortGuid) );
+    *pPkey = port_out.PKey;
+    return S_OK;
+}
+#else   // Back compatibility with Windows Server 2003
+
+
+static HRESULT
+GetDestMac(
+    __in struct sockaddr_in* pDestAddr,
+    __out BYTE* pDestMac
+    )
+{
+    DWORD ret;
+
+    MIB_IPNETTABLE* pTable = NULL;
+    ULONG len = 0;
+    do
+    {
+        ret = GetIpNetTable( pTable, &len, FALSE );
+        if( ret != ERROR_INSUFFICIENT_BUFFER )
+            break;
+
+        if( pTable != NULL )
+        {
+            HeapFree( GetProcessHeap(), 0, pTable );
+        }
+
+        pTable = (MIB_IPNETTABLE*)HeapAlloc( GetProcessHeap(), 0, len );
+    } while( ret == ERROR_INSUFFICIENT_BUFFER );
+
+    if( ret != NO_ERROR )
+    {
+        if( pTable != NULL )
+        {
+            HeapFree( GetProcessHeap(), 0, pTable );
+        }
+        return HRESULT_FROM_WIN32( ret );
+    }
+
+    ret = ERROR_NOT_SUPPORTED;
+    DWORD i;
+    for( i = 0; i < pTable->dwNumEntries; i++ )
+    {
+        if( pTable->table[i].dwType == MIB_IPNET_TYPE_OTHER ||
+            pTable->table[i].dwType == MIB_IPNET_TYPE_INVALID )
+        {
+            continue;
+        }
+
+        if( pTable->table[i].dwAddr !=
+            ((struct sockaddr_in*)pDestAddr)->sin_addr.s_addr )
+        {
+            continue;
+        }
+
+        if( pTable->table[i].dwPhysAddrLen != IBAT_MAC_LEN )
+        {
+            continue;
+        }
+
+        RtlCopyMemory( pDestMac, pTable->table[i].bPhysAddr, IBAT_MAC_LEN );
+        ret = S_OK;
+        break;
+    }
+    HeapFree( GetProcessHeap(), 0, pTable );
+
+    return HRESULT_FROM_WIN32( ret );
+}
+
+HRESULT
+Resolve(
+    __in const struct sockaddr* pSrcAddr,
+    __in const struct sockaddr* pDestAddr,
+    __out IN6_ADDR* pSrcGid,
+    __out IN6_ADDR* pDestGid,
+    __out USHORT* pPkey
+    )
+{
+    if( pDestAddr->sa_family != AF_INET )
+        return E_NOTIMPL;
+
+    H hIbatDev = CreateFileW( IBAT_WIN32_NAME,
+        MAXIMUM_ALLOWED, 0, NULL,
+        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
+    if( hIbatDev == INVALID_HANDLE_VALUE )
+        return HRESULT_FROM_WIN32( GetLastError() );
+
+    IOCTL_IBAT_IP_TO_PORT_IN port_in;
+    port_in.Version = IBAT_IOCTL_VERSION;
+    port_in.Address.IpVersion = 4;
+    RtlCopyMemory(
+        &port_in.Address.Address[12],
+        &((struct sockaddr_in*)pSrcAddr)->sin_addr,
+        sizeof( ((struct sockaddr_in*)pSrcAddr)->sin_addr ) );
+
+    IBAT_PORT_RECORD port_out;
+    DWORD size;
+    BOOL fSuccess = DeviceIoControl( hIbatDev, IOCTL_IBAT_IP_TO_PORT,
+        &port_in, sizeof(port_in), &port_out, sizeof(port_out), &size, NULL );
+
+    if( !fSuccess )
+        return HRESULT_FROM_WIN32( GetLastError() );
+
+    // Check for loopback.
+    if( ((struct sockaddr_in*)pDestAddr)->sin_addr.s_addr ==
+        ((struct sockaddr_in*)pSrcAddr)->sin_addr.s_addr )
+    {
+        *pSrcGid = x_DefaultGid;
+        RtlCopyMemory(
+            &pSrcGid->u.Byte[8],
+            &port_out.PortGuid,
+            sizeof(port_out.PortGuid) );
+        *pDestGid = *pSrcGid;
+        *pPkey = port_out.PKey;
+        return S_OK;
+    }
+
+    IOCTL_IBAT_MAC_TO_GID_IN mac_in;
+    mac_in.Version = IBAT_IOCTL_VERSION;
+    mac_in.PortGuid = port_out.PortGuid;
+    HRESULT hr = GetDestMac( (struct sockaddr_in*)pDestAddr, mac_in.DestMac );
+    if( FAILED( hr ) )
+    {
+        ULONG len = sizeof(mac_in.DestMac);
+        DWORD ret = SendARP(
+            ((struct sockaddr_in*)pDestAddr)->sin_addr.s_addr,
+            ((struct sockaddr_in*)pSrcAddr)->sin_addr.s_addr,
+            (ULONG*)mac_in.DestMac,
+            &len
+            );
+        if( ret != NO_ERROR )
+            return HRESULT_FROM_WIN32( ret );
+    }
+
+    fSuccess = DeviceIoControl( hIbatDev, IOCTL_IBAT_MAC_TO_GID,
+        &mac_in, sizeof(mac_in), pDestGid, sizeof(*pDestGid), &size, NULL );
+    if( !fSuccess )
+        return HRESULT_FROM_WIN32( GetLastError() );
+
+    // Use the same subnet prefix as the destination.
+    *pSrcGid = *pDestGid;
+    RtlCopyMemory( &pSrcGid->u.Byte[8], &port_out.PortGuid, sizeof(port_out.PortGuid) );
+    *pPkey = port_out.PKey;
+    return S_OK;
+}
+
+#endif
+}
+
+extern "C"
+{
+
+HRESULT
+IbatResolve(
+    __in const struct sockaddr* pSrcAddr,
+    __in const struct sockaddr* pDestAddr,
+    __out IN6_ADDR* pSrcGid,
+    __out IN6_ADDR* pDestGid,
+    __out USHORT* pPkey
+    )
+{
+    return IBAT::Resolve( pSrcAddr, pDestAddr, pSrcGid, pDestGid, pPkey );
+}
+
+} /* extern "C" */
diff -up -N -r -X trunk\docs\dontdiff.txt -I \$Id: old\core\ibat\user\makefile trunk\core\ibat\user\makefile
--- old\core\ibat\user\makefile Wed Dec 31 16:00:00 1969
+++ trunk\core\ibat\user\makefile       Wed Jul 02 11:00:10 2008
@@ -0,0 +1,7 @@
+#
+# DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source
+# file to this component.  This file merely indirects to the real make file
+# that is shared by all the driver components of the OpenIB Windows project.
+#
+
+!INCLUDE ..\..\..\inc\openib.def
diff -up -N -r -X trunk\docs\dontdiff.txt -I \$Id: old\core\ibat\user\SOURCES trunk\core\ibat\user\SOURCES
--- old\core\ibat\user\SOURCES  Wed Dec 31 16:00:00 1969
+++ trunk\core\ibat\user\SOURCES        Wed Jul 02 11:00:10 2008
@@ -0,0 +1,14 @@
+TARGETNAME=ibat
+
+TARGETPATH=..\..\..\bin\user\obj$(BUILD_ALT_DIR)
+TARGETTYPE=LIBRARY
+
+SOURCES=\
+       ibat.cpp
+
+
+INCLUDES=$(SDK_INC_PATH);..;..\..\..\inc;..\..\..\inc\user;$(PLATFORM_SDK_PATH)\Include
+
+USER_C_FLAGS=$(USER_C_FLAGS)
+
+MSC_WARNING_LEVEL= /W4
diff -up -N -r -X trunk\docs\dontdiff.txt -I \$Id: old\hw\mthca\kernel\mthca_log.rc trunk\hw\mthca\kernel\mthca_log.rc
--- old\hw\mthca\kernel\mthca_log.rc    Wed Jul 02 11:53:02 2008
+++ trunk\hw\mthca\kernel\mthca_log.rc  Wed Dec 31 16:00:00 1969
@@ -1,2 +0,0 @@
-LANGUAGE 0x9,0x1
-1 11 MSG00001.bin
diff -up -N -r -X trunk\docs\dontdiff.txt -I \$Id: old\inc\iba\ib_at_ioctl.h trunk\inc\iba\ib_at_ioctl.h
--- old\inc\iba\ib_at_ioctl.h   Wed Jul 02 11:53:02 2008
+++ trunk\inc\iba\ib_at_ioctl.h Wed Jul 02 11:50:14 2008
@@ -1,6 +1,7 @@
 /*
  * Copyright (c) 2005 Mellanox Technologies.  All rights reserved.
  * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.
+ * Portions Copyright (c) 2008 Microsoft Corporation.  All rights reserved.
  *
  * This software is available to you under the OpenIB.org BSD license
  * below:
@@ -39,7 +40,7 @@
 #define        _IB_AT_IOCTL_H_


-#define        IBAT_IOCTL_VERSION              4
+#define        IBAT_IOCTL_VERSION              5

 #define        IBAT_MAC_LEN                    6

@@ -56,6 +57,7 @@ typedef struct _IBAT_PORT_RECORD
 {
        UINT64                          CaGuid;
        UINT64                          PortGuid;
+       UINT16                          PKey;
        UINT8                           PortNum;

 } IBAT_PORT_RECORD;
diff -up -N -r -X trunk\docs\dontdiff.txt -I \$Id: old\inc\user\iba\ibat.h trunk\inc\user\iba\ibat.h
--- old\inc\user\iba\ibat.h     Wed Dec 31 16:00:00 1969
+++ trunk\inc\user\iba\ibat.h   Fri May 09 14:06:38 2008
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2008 Microsoft Corporation.  All rights reserved.
+ *
+ * This software is available to you under 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 <winsock2.h>
+#include <ws2tcpip.h>
+
+#ifdef __cplusplus
+namespace IBAT
+{
+
+HRESULT
+Resolve(
+    __in const struct sockaddr* pSrcAddr,
+    __in const struct sockaddr* pDestAddr,
+    __out IN6_ADDR* pSrcGid,
+    __out IN6_ADDR* pDestGid,
+    __out USHORT* pPkey
+    );
+
+}
+#else /* __cplusplus */
+
+HRESULT
+IbatResolve(
+    __in const struct sockaddr* pSrcAddr,
+    __in const struct sockaddr* pDestAddr,
+    __out IN6_ADDR* pSrcGid,
+    __out IN6_ADDR* pDestGid,
+    __out USHORT* pPkey
+    );
+
+#endif /* __cplusplus */
diff -up -N -r -X trunk\docs\dontdiff.txt -I \$Id: old\tests\dirs trunk\tests\dirs
--- old\tests\dirs      Wed Jul 02 11:53:02 2008
+++ trunk\tests\dirs    Wed Jul 02 11:50:14 2008
@@ -3,4 +3,5 @@ DIRS=\
        cmtest  \
        wsd             \
        ibat    \
-       limits
+       limits  \
+       wherebu
diff -up -N -r -X trunk\docs\dontdiff.txt -I \$Id: old\tests\wherebu\dirs trunk\tests\wherebu\dirs
--- old\tests\wherebu\dirs      Wed Dec 31 16:00:00 1969
+++ trunk\tests\wherebu\dirs    Thu May 08 09:38:22 2008
@@ -0,0 +1,2 @@
+DIRS=\
+       user
diff -up -N -r -X trunk\docs\dontdiff.txt -I \$Id: old\tests\wherebu\user\makefile trunk\tests\wherebu\user\makefile
--- old\tests\wherebu\user\makefile     Wed Dec 31 16:00:00 1969
+++ trunk\tests\wherebu\user\makefile   Thu May 08 09:38:22 2008
@@ -0,0 +1,7 @@
+#
+# DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source
+# file to this component.  This file merely indirects to the real make file
+# that is shared by all the driver components of the Windows NT DDK
+#
+
+!INCLUDE ..\..\..\inc\openib.def
diff -up -N -r -X trunk\docs\dontdiff.txt -I \$Id: old\tests\wherebu\user\SOURCES trunk\tests\wherebu\user\SOURCES
--- old\tests\wherebu\user\SOURCES      Wed Dec 31 16:00:00 1969
+++ trunk\tests\wherebu\user\SOURCES    Thu May 08 09:38:22 2008
@@ -0,0 +1,20 @@
+TARGETNAME=wherebu
+TARGETPATH=..\..\..\bin\user\obj$(BUILD_ALT_DIR)
+TARGETTYPE=PROGRAM
+UMTYPE=console
+USE_MSVCRT=1
+
+SOURCES=\
+       wherebu.cpp
+
+TARGETLIBS=\
+       $(TARGETPATH)\*\ibat.lib \
+       $(SDK_LIB_PATH)\ws2_32.lib \
+       $(SDK_LIB_PATH)\Iphlpapi.lib
+
+MSC_WARNING_LEVEL= /W4
+
+INCLUDES=$(SDK_INC_PATH);\
+       ..\..\..\inc;\
+       ..\..\..\inc\user;\
+       $(PLATFORM_SDK_PATH)\include;
diff -up -N -r -X trunk\docs\dontdiff.txt -I \$Id: old\tests\wherebu\user\wherebu.cpp trunk\tests\wherebu\user\wherebu.cpp
--- old\tests\wherebu\user\wherebu.cpp  Wed Dec 31 16:00:00 1969
+++ trunk\tests\wherebu\user\wherebu.cpp        Wed Jul 02 11:36:08 2008
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2008 Microsoft Corporation.  All rights reserved.
+ *
+ * This software is available to you under 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 "iba/ibat.h"
+#include "stdlib.h"
+#include "stdio.h"
+
+
+inline LONGLONG GetElapsedTime()
+{
+    LARGE_INTEGER elapsed;
+    QueryPerformanceCounter(&elapsed);
+    return elapsed.QuadPart;
+}
+
+inline LONGLONG GetFrequency()
+{
+    LARGE_INTEGER Frequency;
+    QueryPerformanceFrequency(&Frequency);
+    return Frequency.QuadPart;
+}
+
+int PrintUsage( int argc, char *argv[] )
+{
+    UNREFERENCED_PARAMETER( argc );
+    printf( "%s <source IP> <destination IP>\n", argv[0] );
+
+    return __LINE__;
+}
+
+int __cdecl main(int argc, char *argv[])
+{
+    if( argc < 3 )
+        return PrintUsage( argc, argv );
+
+    struct sockaddr_in srcAddr = {0};
+    srcAddr.sin_family = AF_INET;
+    srcAddr.sin_addr.s_addr = inet_addr( argv[1] );
+
+    struct sockaddr_in destAddr = {0};
+    destAddr.sin_family = AF_INET;
+    destAddr.sin_addr.s_addr = inet_addr( argv[2] );
+
+    IN6_ADDR srcGid;
+    IN6_ADDR destGid;
+    USHORT pkey;
+
+    HRESULT hr = IBAT::Resolve(
+        (struct sockaddr*)&srcAddr,
+        (struct sockaddr*)&destAddr,
+        &srcGid,
+        &destGid,
+        &pkey
+        );
+    if( FAILED( hr ) )
+    {
+        printf( "Resolve returned %08x.\n", hr );
+        return hr;
+    }
+
+    printf(
+        "I B at:\n"
+        "partition %x\n"
+        "source GID %x:%x:%x:%x:%x:%x:%x:%x\n"
+        "destination GID %x:%x:%x:%x:%x:%x:%x:%x\n",
+        pkey,
+        srcGid.u.Word[0], srcGid.u.Word[1], srcGid.u.Word[2], srcGid.u.Word[3],
+        srcGid.u.Word[4], srcGid.u.Word[5], srcGid.u.Word[6], srcGid.u.Word[7],
+        destGid.u.Word[0], destGid.u.Word[1], destGid.u.Word[2], destGid.u.Word[3],
+        destGid.u.Word[4], destGid.u.Word[5], destGid.u.Word[6], destGid.u.Word[7]
+    );
+
+    LONGLONG StartTime = GetElapsedTime();
+    for( int i = 0; i < 2000; i++ )
+    {
+        HRESULT hr = IBAT::Resolve(
+            (struct sockaddr*)&srcAddr,
+            (struct sockaddr*)&destAddr,
+            &srcGid,
+            &destGid,
+            &pkey
+            );
+        if( FAILED( hr ) )
+        {
+            printf( "Resolve returned %08x.\n", hr );
+            return hr;
+        }
+    }
+    LONGLONG RunTime = GetElapsedTime() - StartTime;
+    double Rate = 2000.0 / ((double)RunTime / (double)GetFrequency());
+    printf( "%7.2f lookups per second\n", Rate );
+
+    return 0;
+}
diff -up -N -r -X trunk\docs\dontdiff.txt -I \$Id: old\ulp\ipoib\kernel\ipoib_ibat.c trunk\ulp\ipoib\kernel\ipoib_ibat.c
--- old\ulp\ipoib\kernel\ipoib_ibat.c   Wed Jul 02 11:53:02 2008
+++ trunk\ulp\ipoib\kernel\ipoib_ibat.c Wed Jul 02 11:50:27 2008
@@ -142,6 +142,7 @@ __ibat_get_ports(
                pAdapter = CONTAINING_RECORD( pItem, ipoib_adapter_t, entry );
                pOut->Ports[pOut->NumPorts].CaGuid = pAdapter->guids.ca_guid;
                pOut->Ports[pOut->NumPorts].PortGuid = pAdapter->guids.port_guid.guid;
+               pOut->Ports[pOut->NumPorts].PKey = IB_DEFAULT_PKEY;
                pOut->Ports[pOut->NumPorts].PortNum = pAdapter->guids.port_num;
                pOut->NumPorts++;

@@ -396,6 +397,7 @@ __ibat_ip_to_port(
                        {
                                pOut->Port.CaGuid = pAdapter->guids.ca_guid;
                                pOut->Port.PortGuid = pAdapter->guids.port_guid.guid;
+                               pOut->Port.PKey = IB_DEFAULT_PKEY;
                                pOut->Port.PortNum = pAdapter->guids.port_num;
                                pIrp->IoStatus.Information = sizeof(IOCTL_IBAT_IP_TO_PORT_OUT);
                                status = STATUS_SUCCESS;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ibat.patch
Type: application/octet-stream
Size: 24064 bytes
Desc: ibat.patch
URL: <http://lists.openfabrics.org/pipermail/ofw/attachments/20080702/8d166d69/attachment.obj>


More information about the ofw mailing list