]> git.openfabrics.org - ~shefty/rdma-win.git/commitdiff
[IPOIB] added IP to Port mapping to IBAT functionality in IPoIB
authorleonidk <leonidk@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Thu, 6 Sep 2007 12:06:04 +0000 (12:06 +0000)
committerleonidk <leonidk@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Thu, 6 Sep 2007 12:06:04 +0000 (12:06 +0000)
git-svn-id: svn://openib.tc.cornell.edu/gen1@782 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

branches/Ndi/inc/iba/ib_at_ioctl.h
branches/Ndi/ulp/ipoib/kernel/ipoib_ibat.c

index f7d4b852e8cb972342751679a6a69c9f01cc35b9..6fc9b5508d61c333e4ec60edac43094d96c28342 100644 (file)
@@ -127,6 +127,22 @@ typedef struct _IOCTL_IBAT_MAC_TO_GID_OUT
 \r
 } IOCTL_IBAT_MAC_TO_GID_OUT;\r
 \r
+/** This IRP is used to get port record, corresponding to its (loca) IP address */\r
+#define        IOCTL_IBAT_IP_TO_PORT           IOCTL_IBAT( 4 )\r
+\r
+typedef struct _IOCTL_IBAT_IP_TO_PORT_IN\r
+{\r
+       ULONG                           Version;\r
+       IP_ADDRESS                      Address;\r
+\r
+} IOCTL_IBAT_IP_TO_PORT_IN;\r
+\r
+typedef struct _IOCTL_IBAT_IP_TO_PORT_OUT\r
+{\r
+       IBAT_PORT_RECORD        Port;\r
+\r
+} IOCTL_IBAT_IP_TO_PORT_OUT;\r
+\r
 \r
 #define        IBAT_DEV_NAME   L"\\Device\\ibat"\r
 #define        IBAT_DOS_DEV_NAME L"\\DosDevices\\Global\\ibat"\r
index 8129709340ddaa4f0b7bd3bf9a1e4e26623bec43..9423c9a72d63e91653e113f7e0b345325e0d81c4 100644 (file)
@@ -326,6 +326,91 @@ __ibat_mac_to_gid(
 }\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;\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
@@ -463,22 +548,28 @@ __ipoib_dispatch(
        {\r
        case IOCTL_IBAT_PORTS:\r
                IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_IOCTL,\r
-                       ("IOCTL_IBAT_PORTS recieved\n") );\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 recieved\n" ));\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 recieved\n" ));\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
        default:\r
                IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_IOCTL,\r
                        ("unknow IOCTL code = 0x%x\n",\r