阅读:3052回复:3
DriverNetwork miniport驱动学习(9)
KNdisLookahead类
<const UINT L, const NDIS_MEDIUM M = NdisMedium802_3 > : KNdisLookahead抽象了完成部分分组的NDIS机制。Miniport驱动允许协议先检查接收帧的头部和一小部分内容。而不需要立即将整个帧都交给它。因此,协议要先调用介质相关NdisMXXXReceiveIndicate() API。协议然后调用MiniportTransferData处理程序来接收分组剩余内容。 模板类KNdisLookahead封装了部分说明机制。该模板由两个参数: L :最大Lookahead缓冲长度;缓冲创建在类内。 M:介质类型;定义了怎样调用NDIS来说明帧;802.3是默认的。 类的使用 1. 在adapter 类中包括一个成员数据KNdisLookahead<> 。例如: KNdisLookahead<256> m_Lookahead; 2. 在adapter 类中, 提供下面的公共函数: UINT CopyDataUp(PVOID FrameBase, PUCHAR Buf, UINT Len, UINT Offset); 这同步传输的内容有:长度Len,起始偏移Offset,缓冲Buf中当前帧的内容。The frame is identified by an opaque to the framework value FrameBase. 驱动开发者用硬件特定的方法使用FrameBase。也就是,它可能说明了卡上环形缓冲中当前帧的偏移地址。 3. 在HandleInterrupt()处理程序中,在配置用来说明的接收数据长度和卡内存中的帧的FrameBase 之后,调用: m_Lookahead.Indicate (this, header_len, lookah_len, packet_len, FrameBase); 这样帧的lookahead部分将存入KNdisLookahead实体中,并且接着调用NDIS来说明lookahead。因此NDIS就可以将lookahead展示给捆绑的协议。 如果协议对该分组感兴趣,控制权将转到适配的TransferData()处理程序。参看第五步。FrameBase值存在类中并且当调用CopyDataUp()时就回传给CopyDataUp()。 如果在硬件中存在多个接收帧,上面的过程就重复多次。 4. 在离开HandleInterrupt()处理程序之前,至少要调用下面一次: m_Lookahead.IndicateComplete(this); 这样调用NDIS说明当前接收突发结束。 5. 在TransferData()处理程序中调用: m_Lookahead.Transfer(this, Packet, BytesToCopy, ByteOffset); 这将传输当前帧的部分给协议提供的分组。该当前帧的部分是协议请求的且偏移量为ByteOffset。 注意:在 m_Lookahead.Indicate()和Adapter::TransferData()调用之前,连续 miniports不能被调用(除了中断)。 完整交互过程都是DISPATCH_LEVEL ,卡上的中断去能了。当调用TransferData(),当前帧部分存在m_LookaheadData,部分仍然在卡上。KNdisLookahead::Transfer()知道从哪里传输数据。如果协议对该帧不敢兴趣,TransferData()处理程序就根本不调用。Lookahead缓冲将给下一个接收帧覆盖。 Members KNdisLookahead |
|
沙发#
发布于:2004-03-22 09:48
好贴,顶
|
|
板凳#
发布于:2004-03-24 09:54
顶先
可惜没时间看 |
|
|
地板#
发布于:2008-07-18 11:14
先收藏了再说
可是(10)呢?? |
|