阅读:982回复:1
ddk中packet例子中接收数据的问题
packet中为什么在接收数据是只调用ReceivePackerHandle例程而不调用ReceiveHandler例程?
|
|
|
沙发#
发布于:2004-04-02 11:31
一、数据从网卡进入机器总共有4种可能性及对NAT的处理:
1。当网卡为老式网卡或不需要OOB数据时miniport调用ndisxxxindicatepacket时,NDIS调用ptreceive函数。并且packet==NULL。这时如果PACKETSIZE<=lookaheadbuffersize,那么说明所要数据已经传上来。 我们可以立即对数据进行组包,然后做NAT。如果NAT的返回值不是PENDING那么我们立即释放我们刚刚所 申请的资源。如果是PENDING那么我们应该在ptsendcomplete中释放我们的资源。 2。当系统资源不足时,miniport自己组装一个packet,但是这个packet只是一个指针而已! miniport将这个packet的status设为NDIS_STATUS_RESOURCE 并调用ndisindicatepacket函数通知NDIS,那么NDIS也会调用ptreceive函数,但是在ptreceive 函数中,packet=ndisgetpacket的值不会==NULL。在ptreceive我们同样也申请一个包mypacket, 但是真正的内容还是在底层的miniport中,现在开始做NAT,那么如果返回不是PENDING那么 我们立即释放刚刚所申请的资源。否则我们应该在ptsendcomplete中释放我们的资源。 这个mypacket的释放要特别注意! 3。 当网卡为老式网卡或不需要OOB数据时miniport调用ndisxxxindicatepacket时,NDIS调用ptreceive函数, 并且packet==NULL。这时如果PACKETSIZE>lookaheadbuffersize;那么说明数据还有一部分在miniport上, 我们需要先transferdata,如果transferdata等于PENDING,那么还要transferdatacomplet。 通知miniport数据已经全部上来了。 在transferdata之前我们可以先申请pbakcontext,offsetbuffer,mypacket,把先传上来的raw数据 放在mypacket中。然后我们再申请一个ppacketbuffer,buffer,natpacket来存放接下来要transfer的 data。 如果transferdata返回了NDIS―STATUS-SUCCESS,那么立刻释放我们的资源,否则的话: 在ptsendcomplete中释放 4。miniport调用NDISINDICATEpacket,并且包的状态不是RESOURCE,那么miniport将复制一份packet 给上层的ptreceivepacket,那么意味着我们可以在ptreceivepacket中对包进行任意修改。 |
|