}\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
{\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