aldsd
驱动牛犊
驱动牛犊
  • 注册日期2004-02-26
  • 最后登录2005-05-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:982回复:1

ddk中packet例子中接收数据的问题

楼主#
更多 发布于:2004-04-02 11:15
packet中为什么在接收数据是只调用ReceivePackerHandle例程而不调用ReceiveHandler例程?
aldsd
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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中对包进行任意修改。
游客

返回顶部