阅读:1357回复:2
关于ptRecvComplete函数的问题
看了前面的帖子,我们总觉得这个函数好像没什么用处。
ddk中认为他可以对packet作一些后处理,比如说通知对该报文感兴趣的应用。 但是到目前为止,我还没有看见什么真真的应用。 在包截获中,如果报文收齐了,直接在ptrecv中判断是否提交, 如果没收齐,则调用transferdata,在transferdatacomplete中 合成整个报文,在提交上去。 前面有的帖子提出在这个函数中作截获判断。 但是斑竹将这个想法否决,应为这样的话,事实上报文可能已经提交上去,所以,我思前想后没什么要他干的啊! 显然我的想法是错误的,我知道哪位会的朋友解决一下。谢谢 |
|
沙发#
发布于:2003-11-13 09:33
你说的没错,如果PtReceive中和PtTransferDataComplete中做了NdisMIndicateReceivePacket的话,你可以不处理PtReceiveComplete.这是没有问题的.
正如DDK的例子,如果你不一定是整包向上递的话,你可以像例子中那样在PtReceiveComplete中做些处理.当然,用Passthru的一般都不这么做. 我是这样用的: 在PtReceive和PtTransferDataComplete中,一旦收齐整个包,就把它挂在一个链上,然后在PtReceiveComplete中Pop一个出来处理,处理完成后调用NdisMIndicateReceivePacket.当然,如果该数据包不是我关心的,就直接在PtReceive和PtTransferDataComplete中Indicate了. 实际的情况是,对于直接在PtReceive和PtTransferDataComplete中Indicate的情况,我不敢确定是否会进入PtReceiveComplete(没有去查,因为没有出现过问题).但对于挂在待处理链上的情况,总会进入PtReceiveComplete中,这样对这个链的Pop动作就只在一个地方做了. 还有一种情况,如果你想使用系统线程(这常常是需要的),那么Pop动作只在线程里做就可以了,PtReceiveComplete中可以不做任何处理,但这时后Push/Pop的动作之间就需要有Event等来通知. 实践证明,以上所说的两种情况都是没有问题的. Sample: VOID PtReceiveComplete( IN NDIS_HANDLE ProtocolBindingContext ) { PADAPT pAdapt =(PADAPT)ProtocolBindingContext; #ifndef USE_SYSTEM_THREAD IMHandlePacket((PVOID)ProtocolBindingContext, FALSE); #endif } [编辑 - 11/13/03 by SharpShooter] |
|
|
板凳#
发布于:2003-11-13 10:54
先谢谢楼上的朋友,回答的蛮精彩的。^_^
但是我还是有点小疑惑望不惜赐教: ddk中认为在ptreceive中不应该有比较复杂的操作。否则会影响系统中的提交报文的速度。 根据你的想法,其实就是将indicatexxxx这个函数换了个地方,摆到了recvcomplete中啊。在一些相关应用中似乎还是不能解决什么问题啊。比如在过滤报文的应用中,在数据收齐时,我还是要在ptrecv中解包判断啊,至于把indicatexxx放在ptrecv中,还是ptcomplete中,似乎没有多大影响,至少在效率上没有明显的提高啊。 另一方面,在ptrecv结束后一定调用ptrecvcomplete这个函数吗? 据我所知,只有在下层miniport调用ndisindicaterecvcomplet这个函数后才会调用啊。 谁又能保证下层一定调用这个函数啊。 ^_^希望回复,也希望大家一起来参与讨论。谢谢 |
|