From: leonidk Date: Thu, 6 Sep 2007 12:06:04 +0000 (+0000) Subject: [IPOIB] added IP to Port mapping to IBAT functionality in IPoIB X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=01d78f22eeab3ef627b5f77c5eb5e58eda48d1c9;p=~shefty%2Frdma-win.git [IPOIB] added IP to Port mapping to IBAT functionality in IPoIB git-svn-id: svn://openib.tc.cornell.edu/gen1@782 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- diff --git a/branches/Ndi/inc/iba/ib_at_ioctl.h b/branches/Ndi/inc/iba/ib_at_ioctl.h index f7d4b852..6fc9b550 100644 --- a/branches/Ndi/inc/iba/ib_at_ioctl.h +++ b/branches/Ndi/inc/iba/ib_at_ioctl.h @@ -127,6 +127,22 @@ typedef struct _IOCTL_IBAT_MAC_TO_GID_OUT } IOCTL_IBAT_MAC_TO_GID_OUT; +/** This IRP is used to get port record, corresponding to its (loca) IP address */ +#define IOCTL_IBAT_IP_TO_PORT IOCTL_IBAT( 4 ) + +typedef struct _IOCTL_IBAT_IP_TO_PORT_IN +{ + ULONG Version; + IP_ADDRESS Address; + +} IOCTL_IBAT_IP_TO_PORT_IN; + +typedef struct _IOCTL_IBAT_IP_TO_PORT_OUT +{ + IBAT_PORT_RECORD Port; + +} IOCTL_IBAT_IP_TO_PORT_OUT; + #define IBAT_DEV_NAME L"\\Device\\ibat" #define IBAT_DOS_DEV_NAME L"\\DosDevices\\Global\\ibat" diff --git a/branches/Ndi/ulp/ipoib/kernel/ipoib_ibat.c b/branches/Ndi/ulp/ipoib/kernel/ipoib_ibat.c index 81297093..9423c9a7 100644 --- a/branches/Ndi/ulp/ipoib/kernel/ipoib_ibat.c +++ b/branches/Ndi/ulp/ipoib/kernel/ipoib_ibat.c @@ -326,6 +326,91 @@ __ibat_mac_to_gid( } +static NTSTATUS +__ibat_ip_to_port( + IN IRP *pIrp, + IN IO_STACK_LOCATION *pIoStack ) +{ + IOCTL_IBAT_IP_TO_PORT_IN *pIn; + IOCTL_IBAT_IP_TO_PORT_OUT *pOut; + KLOCK_QUEUE_HANDLE hdl; + cl_list_item_t *pItem; + ipoib_adapter_t *pAdapter; + size_t idx; + net_address_item_t *pAddr; + NTSTATUS status = STATUS_NOT_FOUND; + + IPOIB_ENTER(IPOIB_DBG_IOCTL); + + if( pIoStack->Parameters.DeviceIoControl.InputBufferLength != + sizeof(IOCTL_IBAT_IP_TO_PORT_IN) ) + { + IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, + ("Invalid input buffer size.\n") ); + return STATUS_INVALID_PARAMETER; + } + + if( pIoStack->Parameters.DeviceIoControl.OutputBufferLength != + sizeof(IOCTL_IBAT_IP_TO_PORT_OUT) ) + { + IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, + ("Invalid output buffer size.\n") ); + return STATUS_INVALID_PARAMETER; + } + + pIn = pIrp->AssociatedIrp.SystemBuffer; + pOut = pIrp->AssociatedIrp.SystemBuffer; + + if( pIn->Version != IBAT_IOCTL_VERSION ) + { + IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, + ("Invalid version.\n") ); + return STATUS_INVALID_PARAMETER; + } + + if (pIn->Address.IpVersion != 4) + { + IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, + ("Invalid IP version (%d). Supported only 4\n", pIn->Address.IpVersion) ); + return STATUS_INVALID_PARAMETER; + } + + KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl ); + for( pItem = cl_qlist_head( &g_ipoib.adapter_list ); + pItem != cl_qlist_end( &g_ipoib.adapter_list ); + pItem = cl_qlist_next( pItem ) ) + { + pAdapter = CONTAINING_RECORD( pItem, ipoib_adapter_t, entry ); + + cl_obj_lock( &pAdapter->obj ); + + for( idx = 0; + idx < cl_vector_get_size( &pAdapter->ip_vector ); + idx++ ) + { + pAddr = (net_address_item_t*) + cl_vector_get_ptr( &pAdapter->ip_vector, idx ); + + if (!memcmp( &pIn->Address.Address[12], pAddr->address.as_bytes, IPV4_ADDR_SIZE)) + { + pOut->Port.CaGuid = pAdapter->guids.ca_guid; + pOut->Port.PortGuid = pAdapter->guids.port_guid; + pOut->Port.PortNum = pAdapter->guids.port_num; + pIrp->IoStatus.Information = sizeof(IOCTL_IBAT_IP_TO_PORT_OUT); + status = STATUS_SUCCESS; + break; + } + } + cl_obj_unlock( &pAdapter->obj ); + if (status == STATUS_SUCCESS) + break; + } + + KeReleaseInStackQueuedSpinLock( &hdl ); + IPOIB_EXIT( IPOIB_DBG_IOCTL ); + return status; +} + void ipoib_ref_ibat() { @@ -463,22 +548,28 @@ __ipoib_dispatch( { case IOCTL_IBAT_PORTS: IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_IOCTL, - ("IOCTL_IBAT_PORTS recieved\n") ); + ("IOCTL_IBAT_PORTS received\n") ); status = __ibat_get_ports( pIrp, pIoStack ); break; case IOCTL_IBAT_IP_ADDRESSES: IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_IOCTL, - ("IOCTL_IBAT_IP_ADDRESSES recieved\n" )); + ("IOCTL_IBAT_IP_ADDRESSES received\n" )); status = __ibat_get_ips( pIrp, pIoStack ); break; case IOCTL_IBAT_MAC_TO_GID: IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_IOCTL, - ("IOCTL_IBAT_MAC_TO_GID recieved\n" )); + ("IOCTL_IBAT_MAC_TO_GID received\n" )); status = __ibat_mac_to_gid( pIrp, pIoStack ); break; + case IOCTL_IBAT_IP_TO_PORT: + IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_IOCTL, + ("IOCTL_IBAT_IP_TO_PORT received\n" )); + status = __ibat_ip_to_port( pIrp, pIoStack ); + break; + default: IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_IOCTL, ("unknow IOCTL code = 0x%x\n",