阅读:1427回复:0
passthru源代码数据接收流程遇到的几个问题求教
最近刚学ndis编程,看了看pasthru源代码,对里面实现协议经过中间层传递从网卡处取数据包的整个过程有点不懂,望指教:
当以太网卡收到了以太帧后,网卡驱动调用ndismindicatereceive通知中间层自己收到数据报文(这个报文是指的什么?以太帧,or packet ,这个packet是指ip包,还是ndis里面定义的一个数据结构NDIS_PACKET?),你可以取了,那么ndis调用中间层实现的一个ptreceive函数,该函数里面调用ndisgetreceivedpacket从网卡处拿packet。 1. 如果能够拿到一个packet,那么中间层拿到packet后待用ndismindicatepacket通知自己的上层也就是协议驱动我已经收到packet了,你可以来取了。通过ndis调用协议驱动自己的ptreceive(这个ptreceive与中间层的ptreceive是不同的吧?)从中间层取packet,协议取到packet后就可以对包进行处理了,处理完后调用ndisretuenpacket(为什么不是在协议驱动接到包后就直接调用ndisretrnpacket呢?)告送中间层我已经接到packet了,这导致ndis调用中间层的mpreturnpacket,该函数进行中间层保留的packet副本的释放,并且调用ndisreturnpacket告送网卡驱动中间层已经接收到packet了,这同样导致ndis调用网卡驱动的mpreturnpacket释放网卡自己的数据包。 2. 如果中间层发现不能从网卡取到packet(是不是网卡驱动此时还不能将网卡收到的以太帧转化为一个packet,也就是说网卡驱动还不做出一个packet?)那么中间层调用ndismethindicatereceive导致ndis让网卡收到完整的数据报文(啥叫完整的数据报文?)后就调用ndismetheindicatereceivecomplete,告送中间层现在网卡已经收到了完整的数据报文,导致ndis调用中间层的ptreceivecomplete,在该函数中再调用ndismetheindicatereceivecomplete通知协议驱动自己准备好了完整的packet,但这时候中间层还没有向网卡取packet(对不对呢?)。ndis调用协议驱动的ptreceivecomplete,在该函数里面可能是通过调用ndistransferdata叫中间层将packet传上来,这样导致ndis调用中间层的mptransferdata,在该函数中再次调用ndistransferdata,让ndis调用网卡的mptransferdata。 对complete总是不能理解,第2中情况不大清楚这个过程, 还有底层微端口驱动是网卡驱动吗?协议驱动和底层微端口驱动不是由协议和网卡实现了吗?自己在编写中间层驱动还要实现协议驱动和微端口驱动吗?总感觉这里有个弯老不出来,望有人指点一下,谢谢! |
|