<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=US-ASCII">
<META NAME="Generator" CONTENT="MS Exchange Server version 5.5.2654.45">
<TITLE>RE: [Openib-windows] [RFC] IRP-based verbs</TITLE>
</HEAD>
<BODY>
<P><FONT SIZE=2>Hi Fab,</FONT>
</P>
<P><FONT SIZE=2>Before we give you comments about the proposed change there are a few things that we would like to :</FONT>
</P>
<P><FONT SIZE=2>1) Do you intend that all the kernel mode ULPs to move to an IOCTL based model? That is do you want the IPOIB model to create an IRP every time it is going to talk with IBAL? Does it mean that the entire interface will change?</FONT></P>
<P><FONT SIZE=2>2) Currently the hardware driver doesn't support operations at dispatch mode (that is Create-QP will block bellow the IBAL library). As a result I don't understand how you are going to establish the goal of allowing all operations to work from dispatch level.</FONT></P>
<P><FONT SIZE=2>3) What is the impact on the client that you see from this change? Will it bring higher BW? Lower latency? Increase of connection rate?</FONT></P>
<P><FONT SIZE=2>Thanks</FONT>
<BR><FONT SIZE=2>Tzachi</FONT>
</P>
<P><FONT SIZE=2>>-----Original Message-----</FONT>
<BR><FONT SIZE=2>>From: Fab Tillier [<A HREF="mailto:ftillier@silverstorm.com">mailto:ftillier@silverstorm.com</A>]</FONT>
<BR><FONT SIZE=2>>Sent: Thursday, September 08, 2005 3:40 AM</FONT>
<BR><FONT SIZE=2>>To: openib-windows@openib.org</FONT>
<BR><FONT SIZE=2>>Subject: [Openib-windows] [RFC] IRP-based verbs</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>Hi Folks,</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>I've put together a couple definitions for the input and output buffers for</FONT>
<BR><FONT SIZE=2>>the</FONT>
<BR><FONT SIZE=2>>IOCTLs to perform the following verbs:</FONT>
<BR><FONT SIZE=2>>- OpenCa</FONT>
<BR><FONT SIZE=2>>- CloseCa</FONT>
<BR><FONT SIZE=2>>- QueryCa</FONT>
<BR><FONT SIZE=2>>- QueryPort</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>These IOCTLs would be used by both kernel and user-mode clients. Calling</FONT>
<BR><FONT SIZE=2>>mode</FONT>
<BR><FONT SIZE=2>>of the request can be retrieved from the RequestorMode of the IRP.</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>A couple of behavioral changes compared to the existing verbs as follows:</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>- All requests can be issued at DISPATCH_LEVEL, and are expected to return</FONT>
<BR><FONT SIZE=2>>STATUS_PENDING if they can't complete immediately. This will allow</FONT>
<BR><FONT SIZE=2>>elimination</FONT>
<BR><FONT SIZE=2>>of the AL object abstraction that managed async destruction, and all the</FONT>
<BR><FONT SIZE=2>>complexity that brought with it. It also gets rid of the destroy callbacks</FONT>
<BR><FONT SIZE=2>>from</FONT>
<BR><FONT SIZE=2>>destruction - the IOCTL won't complete until the operation is complete.</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>- The HCA will see every client's OpenCa request. Currently, it only sees</FONT>
<BR><FONT SIZE=2>>user-mode requests (via the um_open_ca handler). This change allows each</FONT>
<BR><FONT SIZE=2>>kernel</FONT>
<BR><FONT SIZE=2>>client to have their own UAR when using Mellanox HCAs.</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>- CloseCa will return STATUS_DEVICE_BUSY if there are unreleased resources.</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>- QueryCa will return as much or as little information as the user desires.</FONT>
<BR><FONT SIZE=2>>This allows users to query for the items at the beginning of the structure</FONT>
<BR><FONT SIZE=2>>without getting everything if that is what they want. Further the CA and</FONT>
<BR><FONT SIZE=2>>port</FONT>
<BR><FONT SIZE=2>>attribute structures have been changed to use offsets rather than embedded</FONT>
<BR><FONT SIZE=2>>pointers. This will make support for user-mode a lot simpler as it will</FONT>
<BR><FONT SIZE=2>>avoid</FONT>
<BR><FONT SIZE=2>>having to do pointer fixups.</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>- QueryPort is new, similar to what the Linux stack does.</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>- The CA attributes structure now uses a flag variable rather than a series</FONT>
<BR><FONT SIZE=2>>of</FONT>
<BR><FONT SIZE=2>>Booleans to report capabilities, similar to the Linux stack.</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>- The CA and port attribute structures have version fields to allow us to</FONT>
<BR><FONT SIZE=2>>do</FONT>
<BR><FONT SIZE=2>>versioning. The versions for related structures are expected to stay in</FONT>
<BR><FONT SIZE=2>>sync,</FONT>
<BR><FONT SIZE=2>>and the port attributes have a version in them to enable the QueryPort</FONT>
<BR><FONT SIZE=2>>functionality.</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>- Syntax generally follows what Microsoft does in terms of naming, types,</FONT>
<BR><FONT SIZE=2>>etc.</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>Note that I put together two new files for this so as to not disturb</FONT>
<BR><FONT SIZE=2>>existing</FONT>
<BR><FONT SIZE=2>>development. We can either keep this development separate and keep</FONT>
<BR><FONT SIZE=2>>backward</FONT>
<BR><FONT SIZE=2>>compatibility for a while, or we can evolve the main API instead. I think</FONT>
<BR><FONT SIZE=2>>separating the files makes sense as kernel and user-mode APIs are going to</FONT>
<BR><FONT SIZE=2>>diverge. It also allows us to think fresh, rather than try to make things</FONT>
<BR><FONT SIZE=2>>fit</FONT>
<BR><FONT SIZE=2>>within the potentially constrictive existing design.</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>I'll be continuing to fill in the IOCTL definitions for the rest of the</FONT>
<BR><FONT SIZE=2>>verbs,</FONT>
<BR><FONT SIZE=2>>and once those are in place, will start migrating the code base to</FONT>
<BR><FONT SIZE=2>>implement</FONT>
<BR><FONT SIZE=2>>this. Overall, I expect these changes will allow us to eliminate quite a</FONT>
<BR><FONT SIZE=2>>bit of</FONT>
<BR><FONT SIZE=2>>code in the access layer and ULPs, as well as enable new capabilities</FONT>
<BR><FONT SIZE=2>>currently</FONT>
<BR><FONT SIZE=2>>unavailable due to IRQL limitations.</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>Thoughts and comments welcome.</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>- Fab</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>Index: inc\kernel\iba\ib_defs.h</FONT>
<BR><FONT SIZE=2>>===================================================================</FONT>
<BR><FONT SIZE=2>>/*</FONT>
<BR><FONT SIZE=2>> * Copyright (c) 2005 SilverStorm Technologies. All rights reserved.</FONT>
<BR><FONT SIZE=2>> *</FONT>
<BR><FONT SIZE=2>> * This software is available to you under the OpenIB.org BSD license</FONT>
<BR><FONT SIZE=2>> * below:</FONT>
<BR><FONT SIZE=2>> *</FONT>
<BR><FONT SIZE=2>> * Redistribution and use in source and binary forms, with or</FONT>
<BR><FONT SIZE=2>> * without modification, are permitted provided that the following</FONT>
<BR><FONT SIZE=2>> * conditions are met:</FONT>
<BR><FONT SIZE=2>> *</FONT>
<BR><FONT SIZE=2>> * - Redistributions of source code must retain the above</FONT>
<BR><FONT SIZE=2>> * copyright notice, this list of conditions and the following</FONT>
<BR><FONT SIZE=2>> * disclaimer.</FONT>
<BR><FONT SIZE=2>> *</FONT>
<BR><FONT SIZE=2>> * - Redistributions in binary form must reproduce the above</FONT>
<BR><FONT SIZE=2>> * copyright notice, this list of conditions and the following</FONT>
<BR><FONT SIZE=2>> * disclaimer in the documentation and/or other materials</FONT>
<BR><FONT SIZE=2>> * provided with the distribution.</FONT>
<BR><FONT SIZE=2>> *</FONT>
<BR><FONT SIZE=2>> * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,</FONT>
<BR><FONT SIZE=2>> * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF</FONT>
<BR><FONT SIZE=2>> * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND</FONT>
<BR><FONT SIZE=2>> * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS</FONT>
<BR><FONT SIZE=2>> * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN</FONT>
<BR><FONT SIZE=2>> * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN</FONT>
<BR><FONT SIZE=2>> * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE</FONT>
<BR><FONT SIZE=2>> * SOFTWARE.</FONT>
<BR><FONT SIZE=2>> *</FONT>
<BR><FONT SIZE=2>> * $Id$</FONT>
<BR><FONT SIZE=2>> */</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>/** @file */</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>typedef struct _IB_CA *IB_CA_HANDLE, * __ptr64 IB_CA_HANDLE64;</FONT>
<BR><FONT SIZE=2>>typedef struct _IB_PD *IB_PD_HANDLE, * __ptr64 IB_PD_HANDLE64;</FONT>
<BR><FONT SIZE=2>>typedef struct _IB_CQ *IB_CQ_HANDLE, * __ptr64 IB_CQ_HANDLE64;</FONT>
<BR><FONT SIZE=2>>typedef struct _IB_QP *IB_QP_HANDLE, * __ptr64 IB_QP_HANDLE64;</FONT>
<BR><FONT SIZE=2>>typedef struct _IB_AH *IB_ADDR_HANDLE, * __ptr64 IB_ADDR_HANDLE64;</FONT>
<BR><FONT SIZE=2>>typedef struct _IB_MR *IB_MR_HANDLE, * __ptr64 IB_MR_HANDLE64;</FONT>
<BR><FONT SIZE=2>>typedef struct _IB_MW *IB_MW_HANDLE, * __ptr64 IB_MW_HANDLE64;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>#pragma pack(push, 1)</FONT>
<BR><FONT SIZE=2>>typedef union _IB_GID</FONT>
<BR><FONT SIZE=2>>{</FONT>
<BR><FONT SIZE=2>> UCHAR Raw[16];</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>> struct _IB_GID_UNICAST</FONT>
<BR><FONT SIZE=2>> {</FONT>
<BR><FONT SIZE=2>> UINT64 Prefix;</FONT>
<BR><FONT SIZE=2>> UINT64 InterfaceId;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>> } Unicast;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>> struct _IB_GID_MULTICAST</FONT>
<BR><FONT SIZE=2>> {</FONT>
<BR><FONT SIZE=2>> UCHAR Header[2];</FONT>
<BR><FONT SIZE=2>> UCHAR RawGroupId[14];</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>> } Multicast;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>} IB_GID;</FONT>
<BR><FONT SIZE=2>>#pragma pack(pop)</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>typedef enum _IB_MTU</FONT>
<BR><FONT SIZE=2>>{</FONT>
<BR><FONT SIZE=2>> IB_MTU_256 = 1,</FONT>
<BR><FONT SIZE=2>> IB_MTU_512 = 2,</FONT>
<BR><FONT SIZE=2>> IB_MTU_1024 = 3,</FONT>
<BR><FONT SIZE=2>> IB_MTU_2048 = 4,</FONT>
<BR><FONT SIZE=2>> IB_MTU_4096 = 5</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>} IB_MTU;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>typedef enum _IB_LINK_STATE</FONT>
<BR><FONT SIZE=2>>{</FONT>
<BR><FONT SIZE=2>> IB_LINK_NO_CHANGE = 0,</FONT>
<BR><FONT SIZE=2>> IB_LINK_DOWN = 1,</FONT>
<BR><FONT SIZE=2>> IB_LINK_INIT = 2,</FONT>
<BR><FONT SIZE=2>> IB_LINK_ARMED = 3,</FONT>
<BR><FONT SIZE=2>> IB_LINK_ACTIVE = 4,</FONT>
<BR><FONT SIZE=2>> IB_LINK_ACT_DEFER = 5</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>} IB_LINK_STATE;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>typedef enum _IB_LINK_WIDTH</FONT>
<BR><FONT SIZE=2>>{</FONT>
<BR><FONT SIZE=2>> IB_LINK_WIDTH_1X = 1,</FONT>
<BR><FONT SIZE=2>> IB_LINK_WIDTH_4X = 2,</FONT>
<BR><FONT SIZE=2>> IB_LINK_WIDTH_8X = 4,</FONT>
<BR><FONT SIZE=2>> IB_LINK_WIDTH_12X = 8</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>} IB_LINK_WIDTH;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>typedef enum _IB_LINK_SPEED</FONT>
<BR><FONT SIZE=2>>{</FONT>
<BR><FONT SIZE=2>> IB_LINK_SPEED_2_5_GBS = 1,</FONT>
<BR><FONT SIZE=2>> IB_LINK_SPEED_5_GBS = 2,</FONT>
<BR><FONT SIZE=2>> IB_LINK_SPEED_10_GBS = 4</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>} IB_LINK_SPEED;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>enum IB_PORT_CAP_FLAGS</FONT>
<BR><FONT SIZE=2>>{</FONT>
<BR><FONT SIZE=2>> IB_PORT_FLAG_IS_SM = (1<<1),</FONT>
<BR><FONT SIZE=2>> IB_PORT_FLAG_NOTICE_SUP = (1<<2),</FONT>
<BR><FONT SIZE=2>> IB_PORT_FLAG_TRAP_SUP = (1<<3),</FONT>
<BR><FONT SIZE=2>> IB_PORT_FLAG_OPT_IPD_SUP = (1<<4),</FONT>
<BR><FONT SIZE=2>> IB_PORT_FLAG_APM_SUP = (1<<5),</FONT>
<BR><FONT SIZE=2>> IB_PORT_FLAG_SL_MAP_SUP = (1<<6),</FONT>
<BR><FONT SIZE=2>> IB_PORT_FLAG_MKEY_NVRAM = (1<<7),</FONT>
<BR><FONT SIZE=2>> IB_PORT_FLAG_PKEY_NVRAM = (1<<8),</FONT>
<BR><FONT SIZE=2>> IB_PORT_FLAG_LED_INFO_SUP = (1<<9),</FONT>
<BR><FONT SIZE=2>> IB_PORT_FLAG_IS_SM_DISABLED = (1<<10),</FONT>
<BR><FONT SIZE=2>> IB_PORT_FLAG_SYS_IMAGE_GUID_SUP = (1<<11),</FONT>
<BR><FONT SIZE=2>> IB_PORT_FLAG_PKEY_SW_EXT_PORT_TRAP_SUP = (1<<12),</FONT>
<BR><FONT SIZE=2>> IB_PORT_FLAG_CM_SUP = (1<<16),</FONT>
<BR><FONT SIZE=2>> IB_PORT_FLAG_SNMP_TUNNEL_SUP = (1<<17),</FONT>
<BR><FONT SIZE=2>> IB_PORT_FLAG_REINIT_SUP = (1<<18),</FONT>
<BR><FONT SIZE=2>> IB_PORT_FLAG_DEVICE_MGMT_SUP = (1<<19),</FONT>
<BR><FONT SIZE=2>> IB_PORT_FLAG_VENDOR_CLASS_SUP = (1<<20),</FONT>
<BR><FONT SIZE=2>> IB_PORT_FLAG_DR_NOTICE_SUP = (1<<21),</FONT>
<BR><FONT SIZE=2>> IB_PORT_FLAG_CAP_MASK_NOTICE_SUP = (1<<22),</FONT>
<BR><FONT SIZE=2>> IB_PORT_FLAG_BOOT_MGMT_SUP = (1<<23),</FONT>
<BR><FONT SIZE=2>> IB_PORT_FLAG_LINK_LATENCY_SUP = (1<<24),</FONT>
<BR><FONT SIZE=2>> IB_PORT_FLAG_CLIENT_REG_SUP = (1<<25)</FONT>
<BR><FONT SIZE=2>>};</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>enum _IB_INIT_TYPE</FONT>
<BR><FONT SIZE=2>>{</FONT>
<BR><FONT SIZE=2>> IB_INIT_TYPE_NO_LOAD = 1,</FONT>
<BR><FONT SIZE=2>> IB_INIT_TYPE_PRESERVE_CONTENT = (1<<1),</FONT>
<BR><FONT SIZE=2>> IB_INIT_TYPE_PRESERVE_PRESENCE = (1<<2),</FONT>
<BR><FONT SIZE=2>> IB_INIT_TYPE_DO_NOT_RESUSCITATE = (1<<3)</FONT>
<BR><FONT SIZE=2>>};</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>typedef __declspec(align(8)) struct _IB_PORT_ATTR</FONT>
<BR><FONT SIZE=2>>{</FONT>
<BR><FONT SIZE=2>> ULONG Version;</FONT>
<BR><FONT SIZE=2>> ULONG Size;</FONT>
<BR><FONT SIZE=2>> /** GUID are in network byte order. */</FONT>
<BR><FONT SIZE=2>> UINT64 PortGuid;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>> IB_LINK_STATE LinkState;</FONT>
<BR><FONT SIZE=2>> IB_LINK_WIDTH LinkWidth;</FONT>
<BR><FONT SIZE=2>> IB_LINK_SPEED LinkSpeed;</FONT>
<BR><FONT SIZE=2>> IB_MTU Mtu;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>> UINT64 MaxMsgSize;</FONT>
<BR><FONT SIZE=2>> ULONG InitTypeReply;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>> /** HCA capabilites, formed by OR'ing IB_PORT_CAP_FLAGS values. */</FONT>
<BR><FONT SIZE=2>> ULONG CapabilitiesFlags;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>> USHORT NumGids;</FONT>
<BR><FONT SIZE=2>> USHORT NumPkeys;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>> /** Offsets are from beginning of structure. */</FONT>
<BR><FONT SIZE=2>> ULONG NextPortAttrOffset;</FONT>
<BR><FONT SIZE=2>> ULONG GidTblOffset;</FONT>
<BR><FONT SIZE=2>> ULONG PkeyTblOffset;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>> USHORT PkeyViolations;</FONT>
<BR><FONT SIZE=2>> USHORT QkeyViolations;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>> USHORT BaseLid;</FONT>
<BR><FONT SIZE=2>> USHORT SmLid;</FONT>
<BR><FONT SIZE=2>> USHORT MaxVls;</FONT>
<BR><FONT SIZE=2>> UCHAR Lmc;</FONT>
<BR><FONT SIZE=2>> UCHAR PortNum;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>> /** The maximum expected subnet propagation delay to reach any port on</FONT>
<BR><FONT SIZE=2>> * the subnet. This value also determines the rate at which traps can</FONT>
<BR><FONT SIZE=2>> * be generated from this node. The value is expressed as</FONT>
<BR><FONT SIZE=2>> * timeout = 4.096 microseconds * 2^subnet_timeout</FONT>
<BR><FONT SIZE=2>> */</FONT>
<BR><FONT SIZE=2>> UCHAR SubnetTimeout;</FONT>
<BR><FONT SIZE=2>> UCHAR SmSvcLvl;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>} IB_PORT_ATTR;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>enum IB_CA_CAP_FLAGS</FONT>
<BR><FONT SIZE=2>>{</FONT>
<BR><FONT SIZE=2>> IB_CA_FLAG_RESIZE_MAX_WR = (1<<0)</FONT>
<BR><FONT SIZE=2>> IB_CA_FLAG_BAD_PKEY_CNTR = (1<<1),</FONT>
<BR><FONT SIZE=2>> IB_CA_FLAG_BAD_QKEY_CNTR = (1<<2),</FONT>
<BR><FONT SIZE=2>> IB_CA_FLAG_AUTO_PATH_MIG = (1<<3),</FONT>
<BR><FONT SIZE=2>> IB_CA_FLAG_CHANGE_PHY_PORT = (1<<4),</FONT>
<BR><FONT SIZE=2>> IB_CA_FLAG_AH_PORT_ENFORCE = (1<<5),</FONT>
<BR><FONT SIZE=2>> IB_CA_FLAG_CURR_QP_STATE_MOD = (1<<6),</FONT>
<BR><FONT SIZE=2>> IB_CA_FLAG_SHUTDOWN_PORT = (1<<7),</FONT>
<BR><FONT SIZE=2>> IB_CA_FLAG_INIT_TYPE = (1<<8),</FONT>
<BR><FONT SIZE=2>> IB_CA_FLAG_PORT_ACTIVE_EVENT = (1<<9),</FONT>
<BR><FONT SIZE=2>> IB_CA_FLAG_SYS_IMAGE_GUID = (1<<10),</FONT>
<BR><FONT SIZE=2>> IB_CA_FLAG_RC_RNR_NAK_GEN = (1<<11),</FONT>
<BR><FONT SIZE=2>> IB_CA_FLAG_N_NOTIFY_CQ = (1<<12),</FONT>
<BR><FONT SIZE=2>> IB_CA_FLAG_SRQ_RESIZE = (1<<13)</FONT>
<BR><FONT SIZE=2>>};</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>typedef enum _IB_ATOMIC_CAP</FONT>
<BR><FONT SIZE=2>>{</FONT>
<BR><FONT SIZE=2>> IB_ATOMIC_NONE,</FONT>
<BR><FONT SIZE=2>> IB_ATOMIC_LOCAL,</FONT>
<BR><FONT SIZE=2>> IB_ATOMIC_GLOBAL</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>} IB_ATOMIC_CAP;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>typedef __declspec(align(8)) struct _IB_CA_ATTR</FONT>
<BR><FONT SIZE=2>>{</FONT>
<BR><FONT SIZE=2>> ULONG Version;</FONT>
<BR><FONT SIZE=2>> ULONG Size;</FONT>
<BR><FONT SIZE=2>> /** GUIDs are in network byte order. */</FONT>
<BR><FONT SIZE=2>> UINT64 CaGuid;</FONT>
<BR><FONT SIZE=2>> UINT64 SystemImageGuid;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>> UINT32 VendorId;</FONT>
<BR><FONT SIZE=2>> UINT16 DeviceId;</FONT>
<BR><FONT SIZE=2>> UINT16 DeviceRev;</FONT>
<BR><FONT SIZE=2>> UINT32 FwVersion;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>> /** Byte offset from the beginning of this structure to the first</FONT>
<BR><FONT SIZE=2>> * IB_PORT_ATTR structure for the HCA.</FONT>
<BR><FONT SIZE=2>> */</FONT>
<BR><FONT SIZE=2>> ULONG PortAttrOffset;</FONT>
<BR><FONT SIZE=2>> UINT8 NumPorts;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>> UINT8 MaxQpReadAtomic;</FONT>
<BR><FONT SIZE=2>> UINT8 MaxReadAtomic;</FONT>
<BR><FONT SIZE=2>> UINT8 MaxQpInitReadAtomic;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>> /** Each bit in PageSizeSupport indicates a 2^n page size supported</FONT>
<BR><FONT SIZE=2>> * by the HCA, where bit locations are 1-based. The minimum page</FONT>
<BR><FONT SIZE=2>> * size that can be supported is thus 2 bytes, and the largest 2^64.</FONT>
<BR><FONT SIZE=2>> */</FONT>
<BR><FONT SIZE=2>> UINT64 PageSizeSupport;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>> /** HCA capabilites, formed by OR'ing IB_CA_CAP_FLAGS values. */</FONT>
<BR><FONT SIZE=2>> ULONG CapabilitiesFlags;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>> IB_ATOMIC_CAP AtomicCap;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>> ULONG MaxQp;</FONT>
<BR><FONT SIZE=2>> ULONG MaxQpWr;</FONT>
<BR><FONT SIZE=2>> ULONG MaxQpSge;</FONT>
<BR><FONT SIZE=2>> ULONG MaxCq;</FONT>
<BR><FONT SIZE=2>> ULONG MaxCqe;</FONT>
<BR><FONT SIZE=2>> ULONG MaxPd;</FONT>
<BR><FONT SIZE=2>> ULONG MaxAh;</FONT>
<BR><FONT SIZE=2>> ULONG MaxMr;</FONT>
<BR><FONT SIZE=2>> UINT64 MaxMrSize;</FONT>
<BR><FONT SIZE=2>> ULONG MaxMw;</FONT>
<BR><FONT SIZE=2>> ULONG MaxMcastGrp;</FONT>
<BR><FONT SIZE=2>> ULONG MaxMcastQp;</FONT>
<BR><FONT SIZE=2>> ULONG MaxMcastQpPerGrp;</FONT>
<BR><FONT SIZE=2>> ULONG MaxSrq;</FONT>
<BR><FONT SIZE=2>> ULONG MaxSrqWr;</FONT>
<BR><FONT SIZE=2>> ULONG MaxSrqSge;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>> UINT16 MaxPKeys;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>> UINT8 LocalAckDelay;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>} IB_CA_ATTR;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>Index: inc\kernel\iba\ib_verbs.h</FONT>
<BR><FONT SIZE=2>>===================================================================</FONT>
<BR><FONT SIZE=2>>/*</FONT>
<BR><FONT SIZE=2>> * Copyright (c) 2005 SilverStorm Technologies. All rights reserved.</FONT>
<BR><FONT SIZE=2>> *</FONT>
<BR><FONT SIZE=2>> * This software is available to you under the OpenIB.org BSD license</FONT>
<BR><FONT SIZE=2>> * below:</FONT>
<BR><FONT SIZE=2>> *</FONT>
<BR><FONT SIZE=2>> * Redistribution and use in source and binary forms, with or</FONT>
<BR><FONT SIZE=2>> * without modification, are permitted provided that the following</FONT>
<BR><FONT SIZE=2>> * conditions are met:</FONT>
<BR><FONT SIZE=2>> *</FONT>
<BR><FONT SIZE=2>> * - Redistributions of source code must retain the above</FONT>
<BR><FONT SIZE=2>> * copyright notice, this list of conditions and the following</FONT>
<BR><FONT SIZE=2>> * disclaimer.</FONT>
<BR><FONT SIZE=2>> *</FONT>
<BR><FONT SIZE=2>> * - Redistributions in binary form must reproduce the above</FONT>
<BR><FONT SIZE=2>> * copyright notice, this list of conditions and the following</FONT>
<BR><FONT SIZE=2>> * disclaimer in the documentation and/or other materials</FONT>
<BR><FONT SIZE=2>> * provided with the distribution.</FONT>
<BR><FONT SIZE=2>> *</FONT>
<BR><FONT SIZE=2>> * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,</FONT>
<BR><FONT SIZE=2>> * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF</FONT>
<BR><FONT SIZE=2>> * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND</FONT>
<BR><FONT SIZE=2>> * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS</FONT>
<BR><FONT SIZE=2>> * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN</FONT>
<BR><FONT SIZE=2>> * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN</FONT>
<BR><FONT SIZE=2>> * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE</FONT>
<BR><FONT SIZE=2>> * SOFTWARE.</FONT>
<BR><FONT SIZE=2>> *</FONT>
<BR><FONT SIZE=2>> * $Id$</FONT>
<BR><FONT SIZE=2>> */</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>/** @file */</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>#include <ntddk.h></FONT>
<BR><FONT SIZE=2>>#include <ib_defs.h></FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>#define IB_IOCTL( code, access ) CTL_CODE( \</FONT>
<BR><FONT SIZE=2>> FILE_DEVICE_INIFNIBAND, (0x800 + code), METHOD_BUFFERED, access )</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>enum _IB_IOCTL_FUNC</FONT>
<BR><FONT SIZE=2>>{</FONT>
<BR><FONT SIZE=2>> IB_OPEN_CA,</FONT>
<BR><FONT SIZE=2>> IB_CLOSE_CA,</FONT>
<BR><FONT SIZE=2>> IB_QUERY_CA,</FONT>
<BR><FONT SIZE=2>> IB_QUERY_PORT</FONT>
<BR><FONT SIZE=2>>};</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>/** IB_OPEN_CA</FONT>
<BR><FONT SIZE=2>>* Open a CA for use by a client. Allocates all per-client information</FONT>
<BR><FONT SIZE=2>>* needed.</FONT>
<BR><FONT SIZE=2>>*</FONT>
<BR><FONT SIZE=2>>* The IRP input and output buffers overlap.</FONT>
<BR><FONT SIZE=2>>*</FONT>
<BR><FONT SIZE=2>>* <UNKNOWN></FONT>
<BR><FONT SIZE=2>>* [in] The input buffer is hardware vendor specific. For kernel</FONT>
<BR><FONT SIZE=2>>* clients it is always NULL. For user-mode clients it is NULL if</FONT>
<BR><FONT SIZE=2>>* there is no user-mode verb provider or the provider failed to</FONT>
<BR><FONT SIZE=2>>* load. Otherwise, the structure is defined by the user-mode verb</FONT>
<BR><FONT SIZE=2>>* provider.</FONT>
<BR><FONT SIZE=2>>*</FONT>
<BR><FONT SIZE=2>>* IB_CA_HANDLE64</FONT>
<BR><FONT SIZE=2>>* [out] The output buffer points to the location at which to store</FONT>
<BR><FONT SIZE=2>>* the CA handle. This location is 8 bytes long on all architectures.</FONT>
<BR><FONT SIZE=2>>*</FONT>
<BR><FONT SIZE=2>>* STATUS_SUCCESS</FONT>
<BR><FONT SIZE=2>>* The operation completed successfully.</FONT>
<BR><FONT SIZE=2>>*</FONT>
<BR><FONT SIZE=2>>* STATUS_PENDING</FONT>
<BR><FONT SIZE=2>>* The operation will be completed at a later time.</FONT>
<BR><FONT SIZE=2>>*/</FONT>
<BR><FONT SIZE=2>>#define IOCTL_IB_OPEN_CA IB_IOCTL( IB_OPEN_CA, FILE_ALL_ACCESS )</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>/** IB_CLOSE_CA</FONT>
<BR><FONT SIZE=2>>* Close a CA after use by a client. Frees all per-client information.</FONT>
<BR><FONT SIZE=2>>*</FONT>
<BR><FONT SIZE=2>>* IB_CA_HANDLE64</FONT>
<BR><FONT SIZE=2>>* [in] Handle returned by a previous call to IB_OPEN_CA.</FONT>
<BR><FONT SIZE=2>>*</FONT>
<BR><FONT SIZE=2>>* There are no output parameters.</FONT>
<BR><FONT SIZE=2>>*</FONT>
<BR><FONT SIZE=2>>* STATUS_SUCCESS</FONT>
<BR><FONT SIZE=2>>* The operation completed successfully.</FONT>
<BR><FONT SIZE=2>>*</FONT>
<BR><FONT SIZE=2>>* STATUS_PENDING</FONT>
<BR><FONT SIZE=2>>* The operation will be completed at a later time.</FONT>
<BR><FONT SIZE=2>>*</FONT>
<BR><FONT SIZE=2>>* STATUS_DEVICE_BUSY</FONT>
<BR><FONT SIZE=2>>* The operation could not complete because the CA instance has</FONT>
<BR><FONT SIZE=2>>* outstanding resources that have not been freed.</FONT>
<BR><FONT SIZE=2>>*/</FONT>
<BR><FONT SIZE=2>>#define IOCTL_IB_CLOSE_CA IB_IOCTL( IB_CLOSE_CA, FILE_ALL_ACCESS )</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>/** IB_QUERY_CA</FONT>
<BR><FONT SIZE=2>>* Query the attributes of a channel adapter.</FONT>
<BR><FONT SIZE=2>>*</FONT>
<BR><FONT SIZE=2>>* The IRP input and output buffers overlap.</FONT>
<BR><FONT SIZE=2>>*</FONT>
<BR><FONT SIZE=2>>* IB_QUERY_CA_IN</FONT>
<BR><FONT SIZE=2>>* [in] Provides the version of the CA attributes requested.</FONT>
<BR><FONT SIZE=2>>*</FONT>
<BR><FONT SIZE=2>>* IB_QUERY_CA_OUT/IB_CA_ATTR</FONT>
<BR><FONT SIZE=2>>* [out] Returns the CA attributes.</FONT>
<BR><FONT SIZE=2>>*</FONT>
<BR><FONT SIZE=2>>* STATUS_SUCCESS</FONT>
<BR><FONT SIZE=2>>* The full CA attributes, including port attributes and their GID</FONT>
<BR><FONT SIZE=2>>* and PKEY tables, were successfully copied to the output buffer.</FONT>
<BR><FONT SIZE=2>>* The Information member of the IO_STATUS_BLOCK is updated to</FONT>
<BR><FONT SIZE=2>>* indicate the number of bytes returned.</FONT>
<BR><FONT SIZE=2>>*</FONT>
<BR><FONT SIZE=2>>* STATUS_PENDING</FONT>
<BR><FONT SIZE=2>>* The operation will be completed at a later time.</FONT>
<BR><FONT SIZE=2>>*</FONT>
<BR><FONT SIZE=2>>* STATUS_BUFFER_OVERFLOW</FONT>
<BR><FONT SIZE=2>>* Returned partial attributes, full attributes were not returned due</FONT>
<BR><FONT SIZE=2>>* to insufficient space. The size required to get the full attributes</FONT>
<BR><FONT SIZE=2>>* is returned in IB_QUERY_CA_OUT::Size (or IB_CA_ATTR::Size). The</FONT>
<BR><FONT SIZE=2>>* Information member of the IO_STATUS_BLOCK is updated to indicate</FONT>
<BR><FONT SIZE=2>>* the number of bytes returned.</FONT>
<BR><FONT SIZE=2>>*</FONT>
<BR><FONT SIZE=2>>* STATUS_BUFFER_TOO_SMALL</FONT>
<BR><FONT SIZE=2>>* The buffer was too small to return any information. At a minimum,</FONT>
<BR><FONT SIZE=2>>* the buffer must be the size of the IB_QUERY_CA_OUT structure to</FONT>
<BR><FONT SIZE=2>>* allow the required size to be returned.</FONT>
<BR><FONT SIZE=2>>*</FONT>
<BR><FONT SIZE=2>>* STATUS_INVALID_PARAMETER</FONT>
<BR><FONT SIZE=2>>* An input or output buffer was not provided.</FONT>
<BR><FONT SIZE=2>>*</FONT>
<BR><FONT SIZE=2>>* The expected usage is for clients to use an IB_CA_ATTR buffer as both</FONT>
<BR><FONT SIZE=2>>* input and output parameters. On input, only the IB_CA_ATTR::Version</FONT>
<BR><FONT SIZE=2>>* field must be specified. Clients can request only a subset of the CA</FONT>
<BR><FONT SIZE=2>>* attributes by setting the size of the input buffer to their desired</FONT>
<BR><FONT SIZE=2>>* needs.</FONT>
<BR><FONT SIZE=2>>*/</FONT>
<BR><FONT SIZE=2>>#define IOCTL_IB_QUERY_CA IB_IOCTL( IB_QUERY_CA, FILE_READ_DATA )</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>typedef struct _IB_QUERY_CA_IN</FONT>
<BR><FONT SIZE=2>>{</FONT>
<BR><FONT SIZE=2>> /** Version of CA attributes requested. */</FONT>
<BR><FONT SIZE=2>> ULONG Version;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>} IB_QUERY_CA_IN;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>/** IOCTL_IB_QUERY_CA Minimal Output Parameters</FONT>
<BR><FONT SIZE=2>>* Matches the first two fields of the IB_CA_ATTR structure.</FONT>
<BR><FONT SIZE=2>>*/</FONT>
<BR><FONT SIZE=2>>typedef struct _IB_QUERY_CA_OUT</FONT>
<BR><FONT SIZE=2>>{</FONT>
<BR><FONT SIZE=2>> /** Version of CA attributes returned. */</FONT>
<BR><FONT SIZE=2>> ULONG Version;</FONT>
<BR><FONT SIZE=2>> /** Size required for the CA attributes. */</FONT>
<BR><FONT SIZE=2>> ULONG Size;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>} IB_QUERY_CA_OUT;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>/** IB_QUERY_PORT</FONT>
<BR><FONT SIZE=2>>* Query the attributes of a channel adapter's port.</FONT>
<BR><FONT SIZE=2>>*</FONT>
<BR><FONT SIZE=2>>* The IRP input and output buffers overlap.</FONT>
<BR><FONT SIZE=2>>*</FONT>
<BR><FONT SIZE=2>>* IB_QUERY_PORT_IN</FONT>
<BR><FONT SIZE=2>>* [in] Provides the version of the port attributes requested as</FONT>
<BR><FONT SIZE=2>>* well as the port number whose attributes to return.</FONT>
<BR><FONT SIZE=2>>*</FONT>
<BR><FONT SIZE=2>>* IB_QUERY_PORT_OUT/IB_PORT_ATTR</FONT>
<BR><FONT SIZE=2>>* [out] Returns the port</FONT>
<BR><FONT SIZE=2>>* attributes.</FONT>
<BR><FONT SIZE=2>>*</FONT>
<BR><FONT SIZE=2>>* STATUS_SUCCESS</FONT>
<BR><FONT SIZE=2>>* The full port attributes, including GID and PKEY tables, were</FONT>
<BR><FONT SIZE=2>>* successfully copied to the output buffer. The Information member</FONT>
<BR><FONT SIZE=2>>* of the IO_STATUS_BLOCK is updated to indicate the number of bytes</FONT>
<BR><FONT SIZE=2>>* returned.</FONT>
<BR><FONT SIZE=2>>*</FONT>
<BR><FONT SIZE=2>>* STATUS_PENDING</FONT>
<BR><FONT SIZE=2>>* The operation will be completed at a later time.</FONT>
<BR><FONT SIZE=2>>*</FONT>
<BR><FONT SIZE=2>>* STATUS_BUFFER_OVERFLOW</FONT>
<BR><FONT SIZE=2>>* Returned partial attributes, full attributes were not returned due</FONT>
<BR><FONT SIZE=2>>* to insufficient space. The size required to get the full attributes</FONT>
<BR><FONT SIZE=2>>* is returned in IB_QUERY_PORT_OUT::Size (or IB_PORT_ATTR::Size). The</FONT>
<BR><FONT SIZE=2>>* Information member of the IO_STATUS_BLOCK is updated to indicate the</FONT>
<BR><FONT SIZE=2>>* number of bytes returned.</FONT>
<BR><FONT SIZE=2>>*</FONT>
<BR><FONT SIZE=2>>* STATUS_BUFFER_TOO_SMALL</FONT>
<BR><FONT SIZE=2>>* The buffer was too small to return any information. At a minimum,</FONT>
<BR><FONT SIZE=2>>* the buffer must be the size of the IB_QUERY_PORT_OUT structure to</FONT>
<BR><FONT SIZE=2>>* allow the required size to be returned.</FONT>
<BR><FONT SIZE=2>>*</FONT>
<BR><FONT SIZE=2>>* STATUS_INVALID_PARAMETER</FONT>
<BR><FONT SIZE=2>>* An input or output buffer was not provided.</FONT>
<BR><FONT SIZE=2>>*</FONT>
<BR><FONT SIZE=2>>* The expected usage is for clients to use an IB_PORT_ATTR buffer as both</FONT>
<BR><FONT SIZE=2>>* input and output parameters. On input, the IB_PORT_ATTR::Version</FONT>
<BR><FONT SIZE=2>>* field must be specified, as well as setting the desired port number in</FONT>
<BR><FONT SIZE=2>>* IB_PORT_ATTR::Size. Clients can request only a subset of the port</FONT>
<BR><FONT SIZE=2>>* attributes by setting the size of the input buffer to their desired</FONT>
<BR><FONT SIZE=2>>* needs.</FONT>
<BR><FONT SIZE=2>>*/</FONT>
<BR><FONT SIZE=2>>#define IOCTL_IB_QUERY_PORT IB_IOCTL( IB_QUERY_PORT, FILE_READ_DATA )</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>typedef struct _IB_QUERY_PORT_IN</FONT>
<BR><FONT SIZE=2>>{</FONT>
<BR><FONT SIZE=2>> ULONG Version;</FONT>
<BR><FONT SIZE=2>> /** 1-based port number to query. */</FONT>
<BR><FONT SIZE=2>> ULONG PortNum;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>} IB_QUERY_PORT_IN;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>/** IOCTL_IB_QUERY_PORT Minimal Output Parameters</FONT>
<BR><FONT SIZE=2>>* Matches the first two fields of the IB_PORT_ATTR structure.</FONT>
<BR><FONT SIZE=2>>*/</FONT>
<BR><FONT SIZE=2>>typedef struct _IB_QUERY_PORT_OUT</FONT>
<BR><FONT SIZE=2>>{</FONT>
<BR><FONT SIZE=2>> ULONG Version;</FONT>
<BR><FONT SIZE=2>> ULONG Size;</FONT>
<BR><FONT SIZE=2>></FONT>
<BR><FONT SIZE=2>>} IB_QUERY_PORT_OUT;</FONT>
<BR><FONT SIZE=2>></FONT>
</P>
</BODY>
</HTML>