处理 SAN 的套接字选项和控制代码

Windows 套接字开关与 TCP/IP 提供程序一起处理应用程序发起的大多数 WSPGetSockOptWSPSetSockOptWSPIoctl 调用。 这些请求通常用于设置和检索与应用程序套接字关联的选项和操作参数。 交换机通常不会将这些调用转发到 SAN 服务提供商,除非以下部分所述。

检索 SAN 套接字选项

Windows 套接字开关调用 SAN 服务提供程序的 WSPGetSockOpt 函数,并传递以下套接字选项之一来检索该选项的当前值(如果 SAN 服务提供程序支持该选项):

SO_DEBUG
SAN 服务提供商不需要支持此选项。 如果应用程序设置了 SO_DEBUG 选项,则建议他们提供输出调试信息,但不是必需的。

SO_MAX_MSG_SIZE
如果基础 SAN 传输面向消息,并且传输限制交换机在调用 SAN 服务提供商的 WSPSend 函数时可以发送的数据量,则 SAN 服务提供商必须支持此选项。 交换机随后不会将发送请求传递给超过 SAN 服务提供商为此选项的值返回的大小的 SAN 服务提供商。

SO_MAX_RDMA_SIZE
如果基础 SAN 传输限制交换机在调用 SAN 服务提供商的 WSPRdmaReadWSPRdmaWrite 函数时可以传输的数据量,则 SAN 服务提供商必须支持此选项。 交换机随后不会将 RDMA 传输请求传递给超过 SAN 服务提供商为此选项的值返回的大小的 SAN 服务提供商。

SO_RDMA_THRESHOLD_SIZE
SAN 服务提供程序支持此选项,以指示交换机在调用 SAN 服务提供商的 WSPRdmaReadWSPRdmaWrite 函数时可以传输的最小数据量的首选项。 但是,开关可以将实际阈值设置为与 SAN 服务提供商返回的值不同的值。 随后,该开关调用 WSPRdmaReadWSPRdmaWrite 函数来传输数据块 (超出此阈值大小的 RDMA 传输) ,并调用 WSPSendWSPRecv 函数来传输数据块 (小于或等于此阈值大小的面向消息的传输) 。

SO_GROUP_ID、SO_GROUP_PRIORITY
如果 SAN 服务提供商支持服务质量 (QoS) ,则必须支持这些选项。 否则,交换机会将这些选项转发到保留默认值的 TCP/IP 提供程序。 SAN 服务提供程序通过在 WSAPROTOCOL_INFO 结构的 dwServiceFlags 成员中设置 XP1_QOS_SUPPORTED 位来指示它支持 QoS。

设置 SAN 套接字选项

Windows 套接字开关调用 SAN 服务提供程序的 WSPSetSockOpt 函数,并传递以下套接字选项之一来设置该选项的值(如果 SAN 服务提供程序支持该选项):

SO_DEBUG
有关此套接字选项的说明,请参阅前面的列表。

SO_GROUP_PRIORITY
有关此套接字选项的说明,请参阅前面的列表。

访问 SAN 套接字信息

Windows 套接字开关调用 SAN 服务提供程序的 WSPIoctl 函数,并传递以下控制代码之一,以设置或检索该 SAN 服务提供程序的信息(如果 SAN 服务提供程序支持该控制代码):

SIO_GET_EXTENSION_FUNCTION_POINTER
检索指向 SAN 服务提供程序必须支持的扩展函数的指针。 有关扩展函数的详细信息,请参阅 适用于 SAN 的 Windows 套接字 SPI 扩展WSPIoctl 调用的输入缓冲区包含 GUID,其值标识指定的扩展函数。 SAN 服务提供程序返回指向 WSPIoctl 输出缓冲区中请求的函数的指针。 下表包含 SAN 服务提供商可以支持的扩展函数的 GUID:

扩展函数 GUID

WSPRegisterMemory

{C0B422F5-F58C-11d1-AD6C-00C04FA34A2D}

WSPDeregisterMemory

{C0B422F6-F58C-11d1-AD6C-00C04FA34A2D}

WSPRegisterRdmaMemory

{C0B422F7-F58C-11d1-AD6C-00C04FA34A2D}

WSPDeregisterRdmaMemory

{C0B422F8-F58C-11d1-AD6C-00C04FA34A2D}

WSPRdmaWrite

{C0B422F9-F58C-11d1-AD6C-00C04FA34A2D}

WSPRdmaRead

{C0B422FA-F58C-11d1-AD6C-00C04FA34A2D}

WSPMemoryRegistrationCacheCallback

{E5DA4AF8-D824-48CD-A799-6337A98ED2AF}

SIO_GET_QOS、SIO_GET_GROUP_QOS、SIO_SET_QOS、SIO_SET_GROUP_QOS
如果 SAN 服务提供商支持 QoS,则必须支持这些控制代码。 否则,交换机会将这些选项转发到保留默认值的 TCP/IP 提供程序。 提供程序通过在 WSAPROTOCOL_INFO 结构的 dwServiceFlags 成员中设置 XP1_QOS_SUPPORTED 位来指示它支持 QoS。

SIO_ADDRESS_LIST_QUERY
检索分配给网络接口卡的本地 IP 地址列表,这些地址 (NIC) 由 SAN 服务提供商控制。 SAN 服务提供程序使用定义如下的 SOCKET_ADDRESS_LIST 结构返回 WSPIoctl 的输出缓冲区中的列表:

typedef struct _SOCKET_ADDRESS_LIST {
    INT             iAddressCount; 
    SOCKET_ADDRESS  Address[1]; 
} SOCKET_ADDRESS_LIST, FAR * LPSOCKET_ADDRESS_LIST;

此结构的成员包含以下信息:

iAddressCount
指定列表中地址结构的数目。

地址
IP 地址结构的数组。

交换机在内部使用此 IOCTL 代码来决定是使用给定的 SAN 服务提供程序来执行应用程序的请求来建立连接,还是侦听传入连接。 交换机将本地 IP 地址列表的实际应用程序请求转发到 TCP/IP 提供程序。 该交换机还使用 TCP/IP 提供程序来检测所有 SAN 服务提供商所服务的地址列表中的更改。 TCP/IP 报告更改后,交换机会查询所有 SAN 服务提供商以刷新其列表。