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

Leonid Keller leonid at mellanox.co.il
Thu Jul 3 01:29:39 PDT 2008


Applied in 1331. Thank you. 

> -----Original Message-----
> From: ofw-bounces at lists.openfabrics.org 
> [mailto:ofw-bounces at lists.openfabrics.org] On Behalf Of Fab Tillier
> Sent: Wednesday, July 02, 2008 9:56 PM
> To: ofw at lists.openfabrics.org
> Subject: [ofw] [PATCH v2] Add smarter IB address translation
> 
> 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_S
> +DK_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;
> 



More information about the ofw mailing list