- 底层驱动使用NdisMIndicateReceive / NdisMEthIndicateReceive通知上层已经收到数据报文
- 在PtReceive中如果通过NdisGetReceivedPacket得到了一个完整的packet,就分配我们自己的MyPacket,根据底下传上来的packet设置MyPacket,然后调用NdisMIndicateReceivePacket通知NDIS,NDIS会接着调用上层协议驱动的相应PtReceive例程。如果此时MyPacket的status是NDIS_STATUS_RESOURCES,我们就在本函数中释放我们分配的MyPacket;否则我们在上层发送4的时候,在MPReturnPacket中释放MyPacket.
- 在PtReceive中如果通过NdisGetReceivedPacket不能得到一个完整的packet,那我们就直接调用NdisMEthIndicateReceive等函数通知NDIS。
- 当上层协议驱动得到了一个完整的数据报文并且处理完毕以后,它会调用NdisReturnPacket,然后NDIS会调用我们的MPReturnPacket.
- 在我们的MPReturnPacket中,释放我们自己分配的MyPacket,然后同样的向下层调用NdisReturnPacket。下层会释放他们自己分配的packet
- 如果3发生,当底层miniport驱动收到了一个完整的数据报文,它会调用NdisMEthIndicateReceiveComplete,然后NDIS会调用我们的PtReceiveComplete
- 我们的PtReceiveComplete同样的会调用NdisMEthIndicateReceiveComplete,通知NDIS“我们已经收到了完整的报文”
- 当上层协议驱动得知底层已经收到了完整的数据报文以后,可能会调用NdisTransferData,要求下层把剩余的数据传上来。
- 8的调用会导致NDIS调用我们的MPTransferData例程。在MPTransferData中,做同样的调用NdisTransferData。注意该函数的返回值:如果返回success,说明剩余的数据立刻就传上来了。此时会立即返回。10、11两步骤就不会调用;如果返回pending,表明底层在此阻塞,底层会在稍后的时候调用10
- 当底层miniport驱动做好了一个完整的packet,它会调用NdisTransferDataComplete
- 同样在我们的PtTransferDataComplete中,会作出同样的调用。
1. Protocol driver调用NdisSend向下层发送数据报文。
2. Passthru的MPSend/MPSendPacket例程根据上层传下来的数据报文分配MyPacket,调用NdisSend发送到下层。如果返回pending,就在PtSendComplete中释放我们的MyPacket;否则就在本函数中紧接着释放MyPacket。
3. 当下层miniport driver发送完成MyPacket以后,会调用NdisMSendComplete
4. NDIS接着调用passthru的PtSendComplete,在这个函数里边,我们应该释放MyPacket,并且通知上层protocol driver去释放它们的packet。
本文详细介绍了网络驱动程序如何处理数据报文的接收与发送过程。包括底层驱动使用NdisMIndicateReceive通知上层接收数据,以及通过NdisSend发送数据到下层的过程。还涉及了MyPacket的分配与释放机制。

1152

被折叠的 条评论
为什么被折叠?



