广域网微端口 NIC驱动程序本章将介绍在标准和面向连接的NDIS(CoNDIS)环境中支持广域网 NIC微端口驱动程序所需的NDIS结构和函数。同时将详细描述如何实现标准和CoNDIS 广域网微端口驱动程序。 Microsoft? Window? 2000 同时支持标准和CoNDIS 广域网微端口驱动程序的实现,但是我们鼓励驱动程序开发者编写CoNDIS 广域网微端口驱动程序。
标准广域网微端口驱动程序: n 大部分在非广域网无连接的微端口驱动程序中的NDIS函数仍被使用。 n 部分在非广域网无连接的微端口驱动程序中的NDIS函数被替换。 n 提供附加的广域网功能。
CoNDIS广域网微端口驱动程序: n 提供面向连接的微端口驱动程序提供的所有函数。 n 使用面向连接的微端口驱动程序所使用的NDIS函数。 n 提供附加的广域网功能。 标准和CoNDIS环境下的广域网NIC微端口驱动程序开发时需遵循第二,三,四章描述的要求和功能,除此之外还遵循本章的要求。
远程访问服务(Remote Access Servise , RAS)使远程工作站能够拨入局域网并且透明的访问局域网上的资源。
以下节描述在标准和面向连接的环境下,广域网卡的驱动程序如何通信。同时描述了如何实现两种环境下的广域网NIC微端口驱动程序及包的组帧: n 8.1 RAS 体系结构 n 8.2 NDISWAN 概述 n 8.3 网卡、绑定、和连接 n 8.4 广域网微端口驱动程序的实现 n 8.5 广域网包组帧 n 8.6 标准NDIS上的电话服务扩展 n 8.7 使用支持电话服务的CoNDIS扩展
8.1 RAS 体系结构本节说明远程访问服务(RAS)各部件之间的联系,以及广域网卡(如:ISDN, X.25, Switched 56 适配器等)的驱动程序如何使用NDIS和NDISWAN服务在标准广域网环境和面向连接的广域网环境中进行通信。 图8.1说明了RAS体系结构。后面的章节中将描述NDISWAN 中间层NDIS驱动程序、NDISTAPI驱动程序、及NDPROXY驱动程序,并且给出了整个RAS系统更详细的描述。 图8.1中所示的WAN、RAS、和TAPI组件将在下文中讨论。
图8.1 RAS体系结构
RAS函数 RAS函数集允许用户模式的应用程序建立RAS连接。当RAS连接建立后,应用程序就可以使用标准网络接口(如:Windows Socket、NetBIOS、Named Pipes、和RPC等)连接到网络服务。
传输 RAS系统部件提供传输服务如PPP验证(PAP,CHAP),网络配置协议(IPCP,IPXCP,NBFCP,LCP等)。广域网微端口驱动程序仅实现PPP 介质相关组帧。.
TAPI服务 TAPI服务(tapisrv.exe)将不同服务提供者的电话服务提供者接口(TSPI)提供给使用TAPI的应用程序。应用程序使用特定的服务提供者与特定类型的设备通信。这些服务提供者是在TAPI服务进程中运行的DLLs。无论是标准的还是CoNDIS 广域网微端口驱动程序,都可以使用操作系统提供的服务提供者与用户模式驱动程序通信。
KMDDSP 本部件是一个在TAPI服务进程中运行的服务提供者DLL。kmddsp.tsp部件为TAPI应用程序提供了一个TSPI接口,以便NDISTAPI能与用户模式应用程序通信。本部件为NDISTAPI将用户模式的请求转换为相关的TAPI OIDs.
NDISTAPI 本部件实现 TAPI接口的内核模式部分。ndistapi.sys部件通过NdisRquest函数将TAPI专用的OID请求传递给适当的标准广域网微端口驱动程序,与广域网微端口进行通信。
NDPTSP 本部件是一个在TAPI服务进程中运行的服务提供者DLL。ndptsp.tsp为TAPI应用程序提供了一个TSPI接口,使NDPROXY能与用户模式应用程序通信,本部件为NDPROXY将用户模式的请求转换为相关的TAPI-CO-related OIDs。
NDPROXY 在产生和接受呼叫时本部件将TAPI参数封装到NDIS结构中。ndproxy.sys部件通过NDPTSR的TSPI接口与TAPI通信;通过NDIS与NDISWAN和CoNDIS广域网NIC微端口驱动程序进行通信。本部件为微端口驱动程序提供了一个客户接口,为NDISWAN提供呼叫管理器接口。NDISWAN为本部件提供客户接口。微端口驱动程序为本部件提供呼叫管理器接口。本部件使用TAPI-CO-related OIDs调用NdisCoRequest函数列举CoNDIS 广域网 微端口驱动程序的TAPI性能。同时,本部件注册特定的TAPI地址族、创建虚连接(VC)、产生和接受呼叫、并激活虚连接以便在虚连接上发送和接收数据。
NDISWAN NDISWAN中间层NDIS驱动程序支持PPP协议/链路组帧、压缩、和加密。NDISWAN支持标准和面向连接的微端口驱动程序。ndiswan.sys通过两个接口与标准广域网NIC驱动程序通信: 1. NDIS广域网接口。 2. NDIS 微端口NIC驱动程序接口。 ndiswan.sys通过面向连接的微端口NIC驱动程序接口与CoNDIS 广域网微端口驱动程序通信。
串口驱动程序 本部件是内部串行端口或多端口串行卡的标准设备驱动程序。Windows? 2000内置的异步广域网微端口驱动程序使用内部串口驱动程序进行调制解调器通信。输出与串口驱动程序相同的函数的任何驱动程序都与内置的异步WAN微端口驱动程序共同工作。 X.25厂商可以选择为X..25卡实现串口驱动程序仿真程序。在这种情况下,每个X.25卡上的虚连接都表现为一个串口(有一个X.25 PAD连在上面)。连接接口必须能正确仿真串行信号如:DTR、DCD、RTS和DSR。 选择为X..25卡实现串口驱动程序仿真程序的厂商必须在pad.inf为PAD中提供入口。这个文件里包含通过X.25 PAD建立连接所需的命令/响应脚本。pad.inf的详细信息请参见Remote Access Service Administrator’s Guide 。
广域网微端口NIC驱动程序 视情况而定,ISDN、Switched 56和X.25厂商可以选择编写标准的或CoNDIS 广域网微端口驱动程序。
8.2 NDISWAN 概述NDISWAN是一个中间层NDIS驱动程序,它可以运行在标准的和面向连接的环境中。NDISWAN为上层协议驱动程序同时提供标准和CoNDIS 802.3微端口驱动程序接口。NDISWAN同时为下层管理广域网卡的广域网微端口驱动程序提供协议驱动程序接口。对于CoNDIS,这个广域网微端口驱动程序可以是一个集成的微端口呼叫管理器(MCM)。
NDISWAN将外出包从局域网格式转换为PPP格式。NDISWAN使用简单HDLC组帧。大多数介质相关的组帧必须在微端口驱动程序中完成。NDISWAN从微端口驱动程序对OID_WAN_MEDIUM_SUBTYPE查询请求的响应来获得组帧的信息。
广域网微端口驱动程序可以在广域网上收发包之前必须要建立连接。建立连接的方法依赖于如下所描述的广域网微端口驱动程序是在标准还是CoNDIS环境下工作: n 在标准环境中,应用程序必须建立一个由发送节点发起的连接,或通过产生或接受呼叫接受远程节点发起的连接。连接的建立、管理、拆卸是通过TAPI完成的。TAPI请求和对TAPI的状态指示都通过NDISWAN。在标准广域网微端口驱动程序上使用TAPI服务的详细叙述见8.6节。 n 在CoNDIS环境中,须建立虚连接(VC)。NDPROXY为应用程序发起的外出呼叫创建虚连接。类似的,MCM为内入呼叫指示NDISWAN和NDPROXY建立虚连接。MCM必须通知远程团体虚连接参数,有时需与远程团体协商虚连接参数。连接的建立、管理、拆卸是通过TAPI完成的。TAPI请求和对TAPI的状态指示都通过NDISWAN。NDPROXY实现的TAPI服务详见8.7节。
在应用程序与远程节点建立连接后,就可以在广域网上交换数据包了。包的交换方式依赖于广域网微端口驱动程序是在标准还是在CoNDIS环境下运行: n 在标准环境下,典型的从协议驱动程序到标准广域网微端口驱动程序的包传送路径是:协议驱动程序以包描述信息为参数调用NdisSend;NDISWAN检查包描述信息头以决定包将被送往哪个链接;NDISWAN将一般不连续的数据包拷贝到连续的缓冲区中,此缓冲区带有标准广域网微端口驱动程序在初始化和注册时指定的报头和报尾填充。 n 在CoNDIS环境下,在协议驱动程序以一个VC句柄和一个包描述信息指针数组为参数调用NdisCoSendPackets函数之后,包通过VC从协议驱动程序传送到CoNDIS广域网微端口驱动程序,。NDISWAN为指定VC接收包数组。
NDISWAN接收到的包有几个可能的配置选项:报头压缩、数据压缩、和加密。这些配置选项是以一定顺序加到包上的。在接收方以相反的顺序解压和解密。任何时候启用这些如压缩、加密等的配置选项时,须通知特定的广域网微端口驱动程序。
在将包发送给广域网微端口驱动程序的发送函数以前,NDISWAN进行简单PPP HDLC组帧。简单PPP HDLC组帧是指没有帧检验序列(FCS)、位/字填充、起始/结束标记的PPP HDLC组帧。有关介质相关组帧的内容详见8.5节广域网包组帧。最后,NDISWAN发送包。然后NDIS调用广域网微端口驱动程序的发送函数。NDIS根据广域网微端口驱动程序的类型(标准或CoNDIS)调用不同的函数: n 如果是标准广域网微端口驱动程序,发送函数是MiniportWanSend ,而不是其他局域网微端口NIC驱动程序所实现的类似的函数。 n 如果是CoNDIS广域网微端口驱动程序,发送函数是 MiniportCoSendPackets,所有面向连接的微端口驱动程序都实现这个发送函数。
广域网微端口驱动程序收到包后,它应在活动连接上发送包。对于标准环境,这个连接是指已经建立的链路。对于CoNDIS环境,这个连接是虚连接(VC)。广域网微端口驱动程序在每个连接上可以处理的未完成包的个数是由微端口驱动程序指定给协议驱动程序的。广域网微端口驱动程序指定这个数值的方法取决于它是标准或CoNDIS类型的: n 标准广域网微端口驱动程序在NDIS_WAN_INFO结构的MaxTransmit成员中指定每个数据信道可以拥有的未完成包的缺省个数。微端口驱动程序用此结构响应协议驱动程序的OID_WAN_GET_INFO请求。然而,微端口驱动程序可以动态管理发送窗口,通过以line-up指示为每个线路调用NdisMIndicateStatus调整发送窗口。在这个调用中,微端口驱动程序为传递给函数的NDIS_MAC_LINE_UP结构的成员SendWindows 提供一个新的非零值。如果微端口驱动程序将SendWindows 置为零,NDISWAN将为此线路使用MaxTransmit 中保留的缺省值。 标准广域网微端口驱动程序可能要修改或添加包的报头和报尾(如添加FCS)。微端口驱动程序可以预先对包头和包尾进行适当填充。为了在广域网介质上发送数据,广域网微端口驱动程序可以用任何适当的方式改变包中的数据。 n CoNDIS广域网微端口驱动程序在NDIS_WAN_CO_INFO结构的成员MaxSendWindow中指定每个VC可以拥有的未完成包个数。微端口驱动程序提供此结构来响应协议驱动程序的OID_WAN_CO_GET_INFO请求。然而,微端口驱动程序可以动态调整此数字,以及为每个VC使用由微端口传输到NdisMCoIndiateStatues函数WAN_CO_LINKPARAMS结构的SendWindow成员动态调整这个数字。NDISWAN使用当前的SendWindow 值作为对未完成发送数的限制。微端口驱动程序通过将SendWindow 置为0来表示它不能处理任何未完成的包,也就是说,如果SendWindow成员设置为“0”,发送窗口将关闭。
注意,如果CoNDIS广域网微端口驱动程序将SendWindow 置零,它的关闭发送窗口将被关闭。如果标准广域网微端口驱动程序将SendWindow 置零,它的发送窗口被设置为缺省值。
8.3 网络卡、绑定、和连接
广域网微端口驱动程序在每个绑定上可管理多个连接,因此每个NIC可有多个连接。对于标准环境,这些连接是已经建立的链路;对于CoNDIS环境,这些连接是虚连接(VC)。
与其他微端口驱动程序一样,每个广域网微端口驱动程序至少应有一个NIC,为每个它分配并保留一个NIC专用的环境区域。此环境区域仅仅用于存储、检索和使用NIC硬件细节,如中断、总线类型、I/O范围、和存储器,以及维护运行时状态。微端口NIC驱动程序应为系统中它所支持的每个网卡指定一个NIC专用的环境区域。
从广域网微端口驱动程序的观点看,每个NIC只有一个绑定,尽管在微端口驱动程序之上有许多协议被绑定到某个NIC上。因为这些协议对广域网微端口驱动程序是未知的,微端口驱动程序不保留对NIC的绑定。NDISWAN处理微端口驱动程序的绑定以区分不同的协议。实际上,NDISWAN绑定到一个或多个广域网微端口驱动程序上,一个或多个协议驱动程序绑定到NDISWAN上。
标准和CoNDIS广域网微端口驱动程序在NIC上使用不同类型的的连接:
§ 标准广域网微端口驱动程序使用的连接是链路。链路是逻辑的、点对点的、双向的通信信道。每个NIC可以有多个链路。链路可以动态建立和拆除。每个连接的链路的速度和质量可以不同。然而,一个NIC上所有链路的填充和链接能力是通用的:如果一个标准广域网微端口驱动程序指定了20 byte的头填充和4 byte 的尾填充,那么这个填充对微端口驱动程序的NIC上所有的链路都保持不变。 § CoNDIS广域网微端口驱动程序与所有面向连接的微端口驱动程序相同,使用的是虚连接(VC)。每个NIC上可以有多个虚连接。每个虚连接的速度可以不同。但是同一NIC上所有虚连接的性能是相同的。如果一个CoNDIS广域网微端口驱动程序为它可以接收和发送的任何一个包指定了最大帧长度,则这个最大帧长度对NIC上的所有的VC都保持不变。
如果某个广域网微端口驱动程序指出它不需要PPP地址和控制字段压缩,则这对NIC上所有的连接都是有效的。
图8.2 广域网微端口驱动程序的绑定
每个协议只绑定一次NDISWAN驱动程序 尽管X.25微端口只有一个绑定,NDISWAN可以将以包传递给三个协议中的任何一个 ISDN微端口有两个适配器,因此有两个绑定
协议只绑定到NDISWAN上一次,且不绑定到广域网微端口驱动程序上。这种绑定节省了内存并简化了广域网微端口驱动程序。因为在一个典型的系统中可能有多个协议和多个广域网微端口驱动程序,减少绑定数目可以节省内存。也就是说不必每个协议和驱动程序之间都有绑定。在上图中,如果每个协议都绑定到驱动程序上,会有9个绑定;如果每个协议只有一个广域网绑定,则这些协议可能被简化。 一个广域网微端口驱动程序一定是一个NDIS微端口NIC驱动程序。完全的NIC驱动程序不支持广域网NIC。本章和第二部分有关微端口NIC驱动程序的章节给出了编写广域网微端口驱动程序所需的设计信息。 在源程序中加入以下行将驱动程序标识为微端口驱动程序: C_DEFINES=/DNDIS_MINIPORT_DRIVER 支持通过TAPI连接的标准广域网微端口驱动程序,必须在源程序中加入以下行,指定所支持的TAPI版本号: C_DEFINES=-DNDIS_TAPI_CURRENT_VERSION=0X00010003 是集成微端口呼叫管理器(MCM)驱动程序和支持CoNDIS地址族类型CO_ADDRESS_FAMILY_TAPI_PROXY的CoNDIS广域网微端口驱动程序,必须在源程序中加入下列行以指定所支持的TAPI版本号: C_DEFINES=-DNDIS_TAPI_CURRENT_VERSION=0x00030000 广域网微端口驱动程序的包含路径须包含ndiswan.h和ndis.h。 如果广域网微端口驱动程序支持通过TAPI的连接,则还要包含ndistapi.h。
8.4 广域网微端口驱动程序的实现为了支持像ISDN、帧中继、Switch 56等带远程访问服务(RAS)的介质,必须要提供一个广域网微端口驱动程序。微端口驱动程序应依据NDIS的当前版本(现为5.0版)编写。对于标准广域网微端口驱动程序,现存的根据NDIS 3.0 和 NDIS 4.0 编写的驱动程序仍然可以使用。 标准广域网微端口驱动程序调用少数NDIS函数的广域网变种。标准广域网微端口驱动程序调用的部分NDIS函数与局域网微端口驱动程序调用的相同,部分局域网微端口驱动程序的NDIS调用被广域网专用的NDIS调用替换。另外,标准广域网微端口驱动程序提供了广域网专用的发送函数,它的定义与局域网微端口驱动程序实现的MiniportSend函数并不相同。本节后面将介绍这些广域网专用的调用和函数。 CoNDIS广域网微端口驱动程序与所有面向连接的微端口驱动程序调用相同的NDIS函数集,它们提供的函数集也相同。 广域网微端口驱动程序通过NDIS库与NDISWAN 中间层NDIS驱动程序通信。由于NDISWAN可以提供公用服务,如:数据压缩、加密、回送、简单PPP组帧等,因此广域网微端口驱动程序只需要与介质相关的特征(例如:ISDN需要Q931信令)。
广域网微端口驱动程序是这样的NIC微端口驱动程序: § 执行从NDISWAN 中间层NDIS驱动程序到广域网微端口驱动程序的连接管理操作。 § 接受发送请求,向NDISWAN驱动程序指示接受到的数据。
下面章节定义了NDISWAN驱动程序与广域网微端口驱动程序之间的接口,并详述了实现微端口驱动程序的细节。除了本章内容,广域网微端口驱动程序的开发者还需要参考第二部分有关局域网微端口驱动程序的章节,并参考online DDK内的Network Drivers Reference获得大多数关于NDIS函数的细节。 § 8.4.1 标准广域网微端口驱动程序与局域网微端口驱动程序的区别 § 8.4.2 CoNDIS广域网微端口驱动程序的附加特性 § 8.4.3 广域网微端口驱动程序提供的服务 § 8.4.4 广域网微端口驱动程序做出的指示 8.4.1 标准广域网微端口驱动程序与局域网微端口驱动程序的区别在前面几章我们已经描述了标准广域网微端口驱动程序与局域网微端口驱动程序的一些区别,这些区别将影响标准广域网微端口驱动程序的实现。 § 标准广域网微端口驱动程序被禁止用NdisMRegisterMiniport注册MiniportTransferData处理程序。它总是将整个包传递给NdisMWanIndicateReceive函数。NdisMWanIndicateReceive函数返回后,包已经被复制,此时广域网微端口驱动程序可以重用分配的包资源。 § 标准广域网微端口驱动程序提供函数MiniportWanSend代替MiniportSend函数。MiniportWanSend函数接受NDIS_WAN_PACKET类型(不是NDIS_PACKET类型)的描述信息和一个指定包将要在上发送的数据信道的附加参数。 § 标准广域网微端口驱动程序从不返回NDIS_STATUS_RESOURCES作为MiniportWanSend或任何其他MiniportXxx函数的执行情况,且不能调用NdisMSendResourcesAvaliable函数。 § 标准广域网微端口驱动程序支持一组广域网专用的 OID,这些OID可以用来设置和查询操作特性。 § 标准广域网微端口驱动程序支持一组传递给NdisMIndicateStatus的广域网专用的状态指示。这些状态指示报告链接状态的变化。 § 有两个广域网专用的NDIS函数可以被标准广域网微端口驱动程序调用,以完成用于发送和接收的广域网专用NDIS 调用。这两个完成函数是: NdisMWanIndicateReceiveComplete NdisMWanSendComplete § 标准广域网微端口驱动程序用NDIS_WAN_PACKET而不是NDIS_PACKET类型的 描述信息。 § 标准广域网微端口驱动程序保留一组广域网专用的统计数据。 § 标准广域网微端口驱动程序从不回送,回送总是由NDISWAN提供。
8.4.2 CoNDIS广域网微端口驱动程序的附加特性CoNDIS广域网微端口驱动程序必须实现以下附加特性:
§ CoNDIS广域网微端口驱动程序必须支持一组用来设置和查询操作特性的CoNDIS广域网专用OID。 § CoNDIS广域网微端口驱动程序支持一组传递给NdisMCoIndicateStatus 的CoNDIS广域网专用的状态指示。这些状态指示报告虚连接(VC)状态的变化 § CoNDIS广域网微端口驱动程序应为驱动程序管理的NIC上的每个虚连接保留一组统计数据。 § CoNDIS广域网微端口驱动程序使用NDIS_PACKET类型的描述符,而不是标准广域网微端口驱动程序使用的NDIS_WAN_PACKET类型的描述符。 § CoNDIS广域网微端口驱动程序从不试图回送任何包;NDISWAN提供回送支持。
8.4.3 广域网微端口驱动程序提供的服务标准和CoNDIS广域网微端口驱动程序对NDISWAN驱动程序提供不同的接口。标准广域网微端口驱动程序提供的接口,除发送请求外,与局域网微端口驱动程序的相同。CoNDIS广域网微端口驱动程序提供的接口与面向连接的微端口驱动程序相同。广域网微端口驱动程序接收并响应一组广域网专用 OID。对于标准广域网微端口驱动程序,用来查询和设置的OID被分别传递给MiniportQueryInformation和MiniportSetInformation函数。对于CoNDIS广域网微端口驱动程序,用来查询和设置的OID被传递给函数MiniportCoRequest 。广域网微端口驱动程序在注册时将自己标识为广域网微端口驱动程序。 以下章节描述了广域网微端口驱动程序如何标识它自己,如何处理发送操作,以及用于查询和设置标准广域网微端口驱动程序、CoNDIS广域网微端口驱动程序、和广域网NIC 特性的OID。 § 8.4.3.1 注册为广域网微端口驱动程序 § 8.4.3.2 查询广域网小段口驱动程序的信息 § 8.4.3.3 设置广域网小段口驱动程序的状态 § 8.4.3.4 在广域网微端口驱动程序上发送数据
8.4.3.1 注册为广域网微端口驱动程序广域网微端口驱动程序在注册时可以将自己标识为标准或面向连接的微端口驱动程序。微端口驱动程序在它的函数DriverEntry内调用函数NdisMRigisterMiniport 向NDIS注册。在此调用中,标准广域网微端口驱动程序通过在NDISXX_MINIPORT_CHARACTERISTICS结构的成员Reserved中设置标志NDIS_USE_WAN_WRAPPER来指出它需要广域网服务。NDISXX_MINIPORT_CHARACTERISTICS结构的成员还指定了适当的NDIS版本号。NDIS 3.0、4.0和5.0支持标准广域网微端口驱动程序。只有NDIS 5.0支持CoNDIS广域网微端口驱动程序。在此调用中,微端口驱动程序还为驱动程序提供的MiniportXxx函数指定了入口点。 为了从NDIS接收适当的NDISXX_MINIPORT_CHARACTERISTIC结构,广域网微端口驱动程序还必须在源代码开始部分嵌入适当的编译器指令,或在源程序文件中设置适当的编译指令。这些指令取决于广域网微端口驱动程序运行的环境,是标准的还是CoNDIS环境: § 对于标准广域网微端口驱动程序,将以下编译器指令被放在源代码开始部分表示微端口驱动程序使用了NDIS_MINIPORT_CHARACTERISTICS结构的4.0版: #define NDIS_MINIPORT_DRIVER #define NDIS40_MINIPORT 1 #include <ndis.h> 如果NDIS40_MINIPORT指令被忽略了,标准广域网微端口驱动程序将使用3.0版的NDIS_MINIPORT_CHARACTERISTICS结构。 § 对于CoNDIS广域网微端口驱动程序,将以下编译器指令被放在源代码开始部分表示微端口驱动程序使用了NDIS_MINIPORT_CHARACTERISTICS结构的5.0版: #define NDIS_MINIPORT_DRIVER #define NDIS50_MINIPORT 1 #include <ndis.h> 注意,在NDISXX_MINIPORT_CHARCTERISTICS的成员中指定的NDIS的版本号必须与用编译器指令为驱动程序设置的版本号一致。 在广域网微端口驱动程序的DriverEntry函数执行完之后,微端口驱动程序已经为一个或多个NIC注册了它的微端口入口点。此后,微端口驱动程序必须为上层驱动程序(如:NDISWAN、NDPROXY)提供它及其NIC性能的信息。驱动程序提供性能信息的途径取决于广域网微端口驱动程序工作的环境,是标准的还是CoNDIS环境: § 对于标准广域网微端口驱动程序,微端口驱动程序的MiniportInitialize函数首先为一个或多个NIC完成初始化。然后,NDISWAN驱动程序使用OID_WAN_GET_INFO查询微端口驱动程序。然后NDIS调用微端口驱动程序的MiniportQueryInformation函数并且传递此查询请求。有TAPI能力的微端口驱动程序应当设置NDIS_WAN_INFO结构的成员FrameingBits的TAPI_PROVIDER位。设置TAPI_PROVIDER位通知上层驱动程序将TAPI OID发送给微端口驱动程序。标准广域网微端口驱动程序使用TAPI OID来建立、使用、拆卸TAPI连接。如何设置使用TAPI服务的标准广域网微端口驱动程序将在8.6节详细描述。 § 对于CoNDIS广域网微端口驱动程序,微端口驱动程序在函数MiniportInitialize内调用NdisCmRegisterAddressFamily函数,注册呼叫管理器入口点和地址族类型CO_ADDRESS_FAMILY_TAPI_PROXY。通过这样做,微端口驱动程序通告上层驱动程序它实现TAPI服务。然后NDIS将新注册的地址族通知给NDPROXY。NDPROXY确定它可以使用呼叫管理器(集成在广域网微端口驱动程序之中)提供的TAPI服务。有TAPI能力的CoNDIS广域网微端口驱动程序可以是一个集成的微端口呼叫管理器(MCM)。NDPROXY打开TAPI-proxy地址族,它联合微端口驱动程序,并向NDIS注册NDPROXY的面向连接的入口点,这些入口点被用于与微端口驱动程序的通信。一旦NDPROXY确定它可以使用微端口驱动程序的TAPI服务,它便列举微端口驱动程序的TAPI性能,然后发送封装在NDIS结构中的TAPI请求。 关于使用支持电话服务的CoNDIS扩展,详见8.7节。
8.4.3.2 查询广域网微端口驱动程序的信息高层驱动程序用查询请求调用NdisRequest或NdisCoRequest函数,确定标准或CoNDIS广域网微端口驱动程序及其NIC的广域网性能和当前状态。在NDISWAN驱动程序转发查询请求之后,NDIS调用广域网微端口驱动程序的查询请求函数。NDIS调用的查询请求函数根据广域网微端口驱动程序的类型,是标准的或CoNDIS,而有所不同: § 对于标准广域网微端口驱动程序,这个查询请求函数是MiniportQueryInformation。这个函数与局域网微端口驱动程序的相同,只是广域网微端口驱动程序可以识别标准广域网OID。 § 对于CoNDIS广域网微端口驱动程序,这个查询请求函数是MiniportCoRequest。这个函数与标准的面向连接的微端口驱动程序的相同,只是CoNDIS广域网微端口驱动程序可以识别CoNDIS 广域网OID。
若某个广域网微端口驱动程序需要通过返回状态NDIS_STATUS_PENDING异步地完成NdisRequest或NdisCoRequest,它以后还必须通过调用一个完成函数(completion function)来完成查询。微端口驱动程序使用哪个完成函数取决于此驱动程序是标准还是CoNDIS类型的: § 对于标准广域网微端口驱动程序,完成函数是NdisMQueryInformationComplete。 § 对于CoNDIS广域网微端口驱动程序,完成函数是NdisCoRequestComplete。
NDIS在调用某个广域网微端口驱动程序的查询请求函数的时候,NDIS传递一个指向NDIS_REQUEST结构的指针,这个结构包含了查询OID和一个用于保留从广域网微端口驱动程序获得的信息的缓冲区。广域网微端口驱动程序在完成请求之前控制此缓冲区。如果NDIS_REQUEST的成员InformationBufferLength中指定的字节数不足以存储此OID查询的信息,广域网微端口驱动程序将使此次查询请求失败,并置NDIS_REQUEST的成员BytesNeeded(NDIS_REQUEST的一个成员)为OID需要的字节数。
当前查询请求完成之前不会有其他请求再提交给特定的广域网微端口驱动程序。
广域网微端口驱动程序必须能够识别并正确的响应一组广域网查询OID。这组OID取决于广域网微端口驱动程序的类型是标准还是CoNDIS: § 标准广域网查询OID(Standard WAN query OIDs)。 § CoNDIS广域网查询OID(CoNDIS WAN query OIDs)。
标准广域网查询OID 标准广域网微端口驱动程序必须能够识别并正确的响应的标准广域网查询OID有:
OID_WAN_MEDIUM_SUBTYPE 这个OID被用来查询标准广域网微端口驱动程序支持的介质子类型。标准广域网微端口驱动程序返回的信息应该是枚举NDIS_WAN_MEDIUM_SUBTYPE的子类型之一:
OID_WAN_GET_INFO 在标准广域网微端口驱动程序初始化之后,查询此OID来确定一些关于微端口驱动程序和它的NIC的信息。这个OID的结构的说明在online DDK的Network Drivers Reference 中。标准广域网微端口驱动程序返回的信息包含在NDIS_WAN_INFO结构的成员中。这些信息包括: 参数 内容
MaxTransmit 广域网微端口驱动程序在一个线路上可以处理的未完成包(outstanding packet)数目的缺省最大值。NDISWAN驱动程序确保微端口驱动程序不超过这个数字,具体来说,如果达到最大值,NDISWAN将挂起发送包,除非微端口驱动程序在后来的line-up指示中重置此最大值。通过在line-up指示中传递一个新的非零SendWindow值,微端口驱动程序可以动态改变一条线路的最大传输值。 HeaderPadding 在最大包开始处填充所需缓冲区长度(字节)。 TailPadding 在最大包结尾处填充所需缓冲区长度(字节)。 Endpoint NIC最多所能支持的链接数。这是一个与适配器相关的特性。 MemoryFlags 如果NIC不是DMA设备则此标志为零。如果NIC支持DMA,此标志可以被设为NIDS_MEMORY_NONCACHED或/和 NDIS_MEMORY_CONTIGUOUS。 HightestAcceptableAddress 如果广域网微端口驱动程序的NIC支持DMA,置此标记为NDIS_PHYSICAL_ADDRESS_CONST(-1,-1);否则,如果NIC支持DMA且支持24位地址,置此标记为NDIS_PHYSICAL_ADDRESS_CONST(0x1000000,0)。然后,指定范围内的内存将被分配给将要传送到NIC的包。这样可以通过DMA将内存的数据直接送到NIC,而不必通过CPU在两块缓冲区之间复制。 FramingBits 驱动程序设置此标记置指定它支持的组帧类型。
OID_WAN_PERMANENT_ADDRESS 此OID用来查询NIC的硬件地址。 OID_WAN_CURRENT_ADDRESS 此OID用来查询NIC当前正使用的地址。
标准广域网微端口驱动程序为每个NIC返回一个唯一的地址。这个地址作为以太网地址被用于绑定协议。第一字节的最小有效位不能为1,否则将被认为是以太网广播地址。如果供货商已经分配了一个以太网供货商编码,此编码应被用于确保地址不与其他供货商的地址冲突。
OID_WAN_GET_LINK_INFO 查询此OID来确定链接的当前状态。这个OID的结构的说明在online DDK的Network Drivers Reference 中。标准广域网微端口驱动程序返回先前的OID_WAN_SET_LINK_INFO设置请求设置的值。如果先前没有设置请求发生,标准广域网微端口驱动程序将返回链接的当前状态。如果链接并不存在或处于非活动状态,将返回错误NDIS_STATUS_INVALID_DATA。标准广域网微端口驱动程序返回的信息包含在结构NDIS_WAN_GET_LINK_INFO的成员中: 参数 内容
MaxSendFrameSize 广域网微端口驱动程序可以在此链接上发送的最大缓冲区长度(字节)。微端口驱动程序的MiniportWanSend函数可以拒绝接收大于此值的发送包。 MaxReceiveFrameSize 微端口驱动程序可以从网上接受的最大包(包括填充)。比这更大的包将被丢弃。 HeaderPadding 帧头填充长度(字节)。 TailPadding 帧尾填充的长度(字节)。 SendFramingBits 描述可以发送什么类型的帧的位掩码。 RecvFramingBits 描述可以接收什么类型的帧的位掩码。 SendCompressionBits 保留。 RecvCompressionBits 保留。 SendACCM 专用于异步介质类型。如果存在, 0-31位分别指示需要字填充(byte stuff)的字。例如:如果位0被置为1,ASCII字符0x00应被字填充。 RecvACCM 同SendACCM。
OID_WAN_GET_STATS_INFO 此OID用于查询标准广域网微端口驱动程序的NIC上的链接的状态。标准广域网微端口驱动程序应为它的链接保留统计量。这个OID的结构在online DDK的Network Drivers Reference 中说明。标准广域网微端口驱动程序返回的信息包含在结构NDIS_WAN_GET_STATS_INFO的成员中,这些信息有: 成员 内容
BytesSent 发送了的字节数。 BytesRcvd 接收到的字节数。 FramesSent 发送的帧(广域网包)数。 FramesRcvd 接收到的帧数。 CRCErrors 链接遇到的CRC错误个数。CRC错误是由循环冗余校验失败引起的。CRC错误表明接收到的帧中的某些字节在传输过程中有错码。 TimeoutErrors 链接遇到的超时错误数。当预期的字节未被及时接收时,发生超时错误。 AlignmentErrors 链接遇到的定位错误数。当接收到的字节与预期的不同时,发生定位错误。这种错误发生的典型情况是有字节丢失或有超时错误发生。 SerialOverrunErrors 链接遇到的串行过速错误数。当广域网NIC不能以数据接收的速度处理数据时,发生串行过速错误。 FramingErrors 链接遇到的组帧错误数。当接收到有无效开始和结束位的异步字节时,发生组帧错误。 BufferOverrunErrors 链接遇到的缓冲过速错误数。当标准广域网微端口驱动程序不能以数据接收的速度处理数据时,发生缓冲过速错误。
CoNDIS广域网查询OID CoNDIS广域网微端口驱动程序必须能够识别并正确的响应面向连接的广域网查询OID,概述如下:
OID_WAN_CO_GET_INFO 在CoNDIS广域网微端口驱动程序初始化之后,查询此OID以确定微端口驱动程序的NIC上所有VC的信息。这个OID的结构在online DDK的Network Drivers Reference 中说明。CoNDIS广域网微端口驱动程序返回的信息包含在NDIS_WAN_CO_INFO结构的成员中。这些信息包括: 成员 内容
MaxSendWindow CoNDIS广域网微端口驱动程序将此成员置为驱动程序在每个VC上能处理的未完成包(outstanding packet)的最大数。NDISWAN驱动程序确保微端口驱动程序不超过这个数字,也就是说,如果到达最大值,NDISWAN将挂起发送包,除非微端口驱动程序在后继的链接参数(link-parameters)指示中重置此最大值。通过设置WAN_CO_LINK_PARAMS结构的成员SendWindow,然后指示给NDISWAN,微端口驱动程序可以为每个VC动态改变此值。 FramingBits 一个32位掩码,CoNDIS广域网微端口驱动程序用此掩码指定微端口驱动程序支持的组帧类型。微端口驱动程序也可以指定它是否支持TAPI连接,以及是否执行它自己的组帧。 DesiredACCM CoNDIS广域网微端口驱动程序将此成员置为它需要的异步控制字符映射的类型。
OID_WAN_CO_GET_LINK_INFO 查询此OID以确定VC当前状态的PPP组帧(PPP framing)信息。这个OID的结构在online DDK的Network Drivers Reference 中说明。CoNDIS广域网微端口驱动程序返回先前用OID_WAN_CO_SET_LINK_INFO设置请求设置的值。如果先前没有设置请求发生,CoNDIS广域网微端口驱动程序将返回VC的当前状态。如果VC并不存在或处于非活动状态,将返回错误NDIS_STATUS_INVALID_DATA。CoNDIS广域网微端口驱动程序返回的信息包含在结构NDIS_WAN_CO_GET_LINK_INFO的成员中。这些信息包括: 成员 内容
MaxRecvFrameSize 可以从网络上接收的最大包长度。微端口驱动程序可以丢弃大于此长度的包。 SendFramingBits 一个32位掩码,指定微端口驱动程序可以发送的组帧类型。 RecvFramingBits 一个32位掩码,指定微端口驱动程序可以接收的组帧类型。 SendACCM 专用于异步介质类型。如果存在,位0-31分别指示需要字填充(byte stuff)的字。例如:如果位0被置为1,ASCII字符0x00应被字填充。
OID_WAN_CO_GET_STATS_INFO 查询此OID以确定VC的状态。CoNDIS广域网微端口驱动程序应为它的VC保留统计量。这个OID的结构在online DDK的Network Drivers Reference 中说明。CoNDIS广域网微端口驱动程序返回的信息包含在结构NDIS_WAN_CO_GET_STATS_INFO的成员中,这些信息有:
BytesSent 发送的字节数。 BytesRcvd 接收的字节数。 FrameSent 发送的帧(包)数。 FrameRcvd 接收的帧数。 CRCErrors 此VC遇到的CRC错误数。CRC错误是由循环冗余校验失败引起的。CRC错误表明接收到的帧中的某些字节在传输过程中有错码。 TimeoutErrors VC遇到的超时错误数。当预期的字节未被及时接收时,发生超时错误。 AlignmentErrors VC遇到的定位错误数。当接收到的字节与预期的不同时,发生定位错误。这种错误发生的典型情况是当字节丢失或有超时错误发生时。 SerialOverrunErrors VC遇到的串行过速错误数。当WAN NIC不能以数据接收的速度处理数据时,发生串行过速错误。 FramingErrors VC遇到的组帧错误数。当接收到有无效开始和结束位的异步字节时,发生组帧错误。
8.4.3.3 设置广域网小段口驱动程序的状态高层协议使用设置请求调用NdisRequest或NdisCoRequest函数改变标准或CoNDIS广域网微端口驱动程序的NIC的信息。在NDISWAN驱动程序转发设置请求后,NDIS调用广域网微端口驱动程序的设置请求函数。NDIS调用哪个设置请求函数取决于广域网微端口驱动程序的类型,标准或CoNDIS: § 对于标准广域网微端口驱动程序,这个设置请求函数是MiniportSetInformation。这个函数与局域网微端口驱动程序的相同,只是广域网微端口驱动程序可以识别标准广域网OID。 § 对于CoNDIS广域网微端口驱动程序,这个设置请求函数是MiniportCoRequest。这个函数与标准面向连接的微端口驱动程序的相同,只是CoNDIS广域网微端口驱动程序可以识别CoNDIS 广域网OID。
在当前设置请求完成之前,其他请求不会被提交给广域网微端口驱动程序。如果广域网微端口驱动程序不能立即完成设置请求,它必须在稍后调用一个完成函数(completion function)。广域网微端口驱动程序的设置请求函数返回NDIS_STATUS_PENDING表示它未完成设置请求。微端口驱动程序调用哪个完成函数依赖于广域网微端口驱动程序的类型,标准或CoNDIS: § 对于标准广域网微端口驱动程序,这个完成函数是NdisMSetInformationComplete。 § 对于CoNDIS广域网微端口驱动程序,这个完成函数是NdisCoRequestComplete。
广域网微端口驱动程序可以使用所有的NDIS 全局设置(global-set)OID。 广域网微端口驱动程序必须能够识别并正确的响应一组广域网设置 OID(WAN set OID)。这组广域网设置 OID依赖于广域网微端口驱动程序的类型,标准或CoNDIS: 标准广域网设置 OID 标准广域网微端口驱动程序必须能够识别并正确的响应以下标准广域网OID。 OID_WAN_SET_LINK_INFO 此OID用于设置链接的特性。这个OID的结构在online DDK的Network Drivers Reference 中说明。传递给标准广域网微端口驱动程序的信息包含在结构NDIS_WAN_SET_LINK_INFO的成员中。NDIS_WAN_SET_LINK_INFO结构的成员与NDIS_WAN_GET_LINK_INFO的成员相同,这在标准广域网查询OID中有描述。
CoNDIS广域网设置OID CoNDIS广域网微端口驱动程序必须能够识别并正确的响应以下面向连接的广域网OID。 OID_WAN_CO_SET_LINK_INFO 此OID用于为特定VC改变PPP组帧信息。这个OID的结构的说明在online DDK的Network Drivers Reference 中。传送给CoNDIS广域网微端口驱动程序的信息包含在结构NDIS_WAN_CO_SET_LINK_INFO的成员中。这在CoNDIS广域网查询OID中有描述。
8.4.3.4 在广域网微端口驱动程序上发送数据上层协议调用NdisSend或NdisCoSendPackets函数巴包发送给下层广域网微端口驱动程序。NDISWAN驱动程序转发从上层驱动程序发送来的包。在转发包之前,NDISWAN将之重新打包。对于标准广域网微端口驱动程序,在转发之前,NDISWAN将包的结构从NDIS_PACKET变为NDIS_WAN_PACKET结构。对于CoNDIS广域网微端口驱动程序,NDISWAN用新的NDIS_PACKET结构转发包。
NIDSWAN转发包之后,NDIS调用广域网微端口驱动程序的发送函数。NDIS调用哪个发送函数取决于广域网微端口驱动程序的类型是标准还是CoNDIS: l 对于标准广域网微端口驱动程序,此发送函数是MiniportWanSend。MiniportWanSend函数将包通过NIC发送到广域网。 l 对于CoNDIS广域网微端口驱动程序,此发送函数是MiniportCoSendPacket。关于CoNDIS广域网微端口驱动程序如何发送包的更多信息,参见第四部分的1.6.7.1,面向连接的NDIS。
不论是同步还是异步,包描述信息和包数据的所有权都被传递给广域网微端口驱动程序,直到包发送完毕为止。广域网微端口驱动程序的发送函数返回NDIS_STATUS_PENDING,表示它还未完成包的传送,它需要调用一个完成函数完成发送。微端口驱动程序以后调用哪个完成函数取决于微端口驱动程序的类型是标准还是CoNDIS: l 对于标准广域网微端口驱动程序,此完成函数是NdisMWanSendComplete。 l 对于CoNDIS广域网微端口驱动程序,此完成函数是NdisMCoSendComplete。
这些完成函数的调用不一定表时包已经被传送,尽管一般来说包已经被传送(除智能NIC外)。这些调用实际上是指广域网微端口驱动程序已经准备好释放包的所有权。 如果广域网微端口驱动程序返回一个不是NDIS_STATUS_PENDING的状态,则认为发送操作已经结束,包的所有权立刻返回到调用者。在这种情况下,微端口驱动程序不必调用完成函数。 在包被广域网微端口驱动程序接收到之后,应当在当前连接上将包发送出去。对于标准环境,此连接是一个已建立的链接。对于CoNDIS环境,此连接是一个VC。 与局域网微端口驱动程序不同的是,广域网微端口驱动程序不可以返回状态NDIS_STATUS_RESOURCES以指示它没有足够的资源处理包的传送。取而代之的是,广域网微端口驱动程序应当将包放在发送队列中等待一段时间,并可能还要降低此连接的发送窗口的值。发送窗口的值是广域网微端口驱动程序在每个连接上可以处理的未完成包的个数。发送窗口的值由微端口驱动程序为上层驱动程序指定。广域网微端口驱动程序指定发送窗口值的方法取决于广域网微端口驱动程序的类型是标准还是CoNDIS: n 标准广域网微端口驱动程序通过NDIS_WAN_INFO结构的成员MaxTransmit指定每个数据信道可以处理的未完成包个数的缺省值。微端口驱动程序在响应协议驱动程序的OID_WAN_GET_INFO请求时提供此结构。然而,微端口驱动程序通过以line-up指示调用函数NdisMIndicateStatus,可以在每条线路的基础上动态操纵发送窗口。在此调用中,微端口驱动程序为参数NDIS_WAN_LINE_UP结构的成员SendWindow提供一个新的非零值。如果微端口驱动程序将SendWindow值置为零,NDISWAN将使用MaxTransmit中的缺省值作为此线路的值。标准广域网微端口驱动程序可能必须修改或添加包头,以及添加包尾(例如,添加FCS)。微端口驱动程序预先提供在包的头和尾的适当填充。为了在广域网介质上发送包,广域网微端口驱动程序可以随意以它认为合适的方法改变包中的数据。 n CoNDIS广域网微端口驱动程序通过NDIS_WAN_CO_INFO结构的成员MaxSendWindow,来指定每个VC可以处理的未完成包的个数。微端口驱动程序在响应协议驱动程序的OID_WAN_CO_GET_INFO请求时提供此结构。然而,通过设置传送给函数NdisMCoIndicateStatus 的WAN_CO_LINKPARAMS结构的成员SendWindow,微端口驱动程序可以在每个VC的基础上动态调节此数值。NDISWAN使用当前SendWindow值作为对未完成发送的限制。微端口驱动程序可以通过将SendWindow置零规定不可以处理任何未完成包。也就是说,把SendWindow成员置为零,关闭发送窗口并且NDISWAN停止为特定VC发送包。
广域网微端口驱动程序也不能调用NdisMSendResourcesAvailable函数。 如果已设置PPP组帧,传递给广域网微端口驱动程序的发送函数的包将包含简单HDLC PPP组帧。对于SLIP或RAS组帧,包只包含数据部分,不包 (责任编辑:qhgongzi) |
