阅读:3394回复:26
为什么不调用NdisReturnPackets?
在passthr中,PtreceivePacket在调用NdisMIndicatepacket后立即释放自己分配的packet,但是为什么不紧接着调用NdisReturnPacket通知底层释放传来的Packet呢?
|
|
最新喜欢:tempte... |
沙发#
发布于:2003-10-09 12:51
答案就在你说的中哦!
|
|
|
板凳#
发布于:2003-10-09 15:51
大案在这里:
An NDIS intermediate driver should call NdisReturnPackets as soon as possible after its ProtocolReceivePacket or ProtocolCoReceivePacket function has returned control。 |
|
|
地板#
发布于:2003-10-09 20:28
这两个函数返回控制后到哪儿了啊?
|
|
地下室#
发布于:2003-10-13 13:53
在passthr中,PtreceivePacket在调用NdisMIndicatepacket后立即释放自己分配的packet,但是为什么不紧接着调用NdisReturnPacket通知底层释放传来的Packet呢? 我跟踪调试的结果是这样的: 如果你Packet的Status设置为NDIS_STATUS_SUCCESS,那么在你调用 NdisMIndicateReceivePacket后ndis会自动调用你提供的MPReturnPacket,其中传给MPReturnPacket的Packet就是你传给NdisMIndicateReceivePacket的Packet,在MPReturnPacket里面你可以释放你自己分配的Packet,然后再调用NdisReturnPacket,返回下层传给你的Packet; 如果Packet的Status设置为NDIS_STATUS_RESOURCES,那么ndis不会自动调用你的MPReturnPacket,这时,需要你在PtReceivePacket里面释放自己分配的Packet,然后调用NdisReturnPacket,返回下层传给你的包 |
|
5楼#
发布于:2003-10-13 15:00
NdisReturnPacket不是在receivepacket里面调用的。
其他的问题你自己看ddk好了,我就不在你面前装版主了。 |
|
|
6楼#
发布于:2003-10-13 15:35
NdisReturnPacket不是在receivepacket里面调用的。 真不想骂你,你tmd懂不懂?老子做的防火墙都卖出100多套了,每套25k卖的,我说的都是有根据的,你整个一SB啊,不解答人家的问题还在这里说风凉话,去你妈的蛋吧 |
|
7楼#
发布于:2003-10-13 16:03
[quote]NdisReturnPacket不是在receivepacket里面调用的。 真不想骂你,你tmd懂不懂?老子做的防火墙都卖出100多套了,每套25k卖的,我说的都是有根据的,你整个一SB啊,不解答人家的问题还在这里说风凉话,去你妈的蛋吧 [/quote] 你说的有道理,呵呵,有道理。 |
|
|
8楼#
发布于:2003-10-13 21:29
[quote]NdisReturnPacket不是在receivepacket里面调用的。 真不想骂你,你tmd懂不懂?老子做的防火墙都卖出100多套了,每套25k卖的,我说的都是有根据的,你整个一SB啊,不解答人家的问题还在这里说风凉话,去你妈的蛋吧 [/quote] :o好羡慕啊 MPReturnPacket是在TCPIP。SYS调用NDISRETURNPACKET的时候才被 调用。也就是说你INDICATEPACKET后由系统调用 (今天喝多了,头晕得不行了) 还有拜托不要进行人身攻击:) |
|
|
9楼#
发布于:2003-10-13 21:47
呵呵,Mike遇到高人了
不过,拜托别骂人 我们只谈技术 话说完了,闪人 |
|
|
10楼#
发布于:2003-10-13 23:22
[quote]NdisReturnPacket不是在receivepacket里面调用的。 真不想骂你,你tmd懂不懂?老子做的防火墙都卖出100多套了,每套25k卖的,我说的都是有根据的,你整个一SB啊,不解答人家的问题还在这里说风凉话,去你妈的蛋吧 [/quote] 真不想骂你,你tmd懂不懂? 老子NDIS版主不是白做的,老子的防火墙已经卖出100K套,现在连邦软件,茂立软件行,国外网站上到处都有的买。这么简单的问题还他妈的要回答,连这个都不懂还写什么程序。 |
|
|
11楼#
发布于:2003-10-14 09:31
忍不住插一句.
骂人的事谁都不想做,不过这位mikeluo版主说风凉话,哥们也不是见过一次两次了.我想骂人的话说出来的确是有些粗鄙,不过说风凉话的就更叫人可气了.不是当了版主就有些资格说吧? 我这算不算是人身攻击? |
|
|
12楼#
发布于:2003-10-14 09:43
忍不住插一句. 除了回答问题我说的就只有让大家好好看看ddk而已,这里太多的问题都是ddk里面ndis的文档很明确的写着的,如果这也是风凉话的话那估计我只会说风凉话了。 至于Flstar不知是何方高人,既然是高人就来当版主好了,免得我在这里说风凉话。 |
|
|
13楼#
发布于:2003-10-14 10:08
大家不要吵嘛,都是出来混的,都不容易,消消气.
我的主要疑惑是:PtReceivePacket中如果设置自己分配的转发包状态NDIS_STATUS_RESOURCE,那么indicat后,IM开发者自己立刻调用free,将自己分配的转发包释放,这时候上层在接收转发数据后就不会调用MpReturnPacket了,但是问题来了,底层如何知道何时释放他负责分配的传给了上层的包(就是PtReceivePacket中的参数)?所以我觉的在这种情况下应该紧接着调用NdisReturnpackets通知底层释放资源. 还有PtReceive中的资源headbuffer,lookaheadbuffer也是底层分配的,在IM也存在通知底层释放的问题吧?这又是怎么通知的呢? 不好意思,ddk看了,但是这些问题总是相不通.拿位大虾能指点一下谢谢! |
|
14楼#
发布于:2003-10-14 10:18
根据ptreceive和ptreceivepacket的返回值。
在ptreceivepacket里面,如果你已经处理完了packet,想要告诉底层释放资源的话,直接返回0就可以了。如果在ptreceivepacket里面没有处理完,要在其他的地方处理,然后调用ndisreturnpacket来通知底层释放资源的话,那就要在ptreceivepacket里面返回对于这个packet你要调用的ndisreturnpacket的次数,一般都是1次吧,所以passthru里面返回的是1,如果你有特殊情况要调用ndisreturnpacket多次那就返回具体的次数。 ptreceive有个返回值NDIS_STATUS来说明状态,ddk中的说明是只能返回两个值之一:NDIS_STATUS_NOT_ACCEPTED 和NDIS_STATUS_SUCCESS ,不管返回那个底层都会释放资源了,所以如果要在ptrecieve的外面处理的话就一定要把buffer的内容copy出来(其实要处理就要copy buffer,不管在哪里) |
|
|
15楼#
发布于:2003-10-14 10:40
[quote]忍不住插一句. 除了回答问题我说的就只有让大家好好看看ddk而已,这里太多的问题都是ddk里面ndis的文档很明确的写着的,如果这也是风凉话的话那估计我只会说风凉话了。 至于Flstar不知是何方高人,既然是高人就来当版主好了,免得我在这里说风凉话。 [/quote] 大伙儿很多问题都是因为看了DDK还是不明白才来问的,或者是DDK本来讲的明白,但还是没有看懂,也不妨来问一下,你能给讲讲清楚最好,不想讲就拉倒,说句去看DDK不是风凉话也是废话. 如果大伙都说去看DDK,那还来这儿干吗?! 如果一句去看DDK就把什么问题都挡回去的话,这里很多关于Passthru的接收发送讲的很不错的帖子如何能够积累起来?mikeluo老大,你不觉得说句去看DDK对初来乍到的人很是打击么? 你老大是不是觉得有些问题过于入门,不值得一答?岂不知 lu0 大哥说的\"请不要在本论坛提出过于入门话题\"的范围也只不过是/如何BUILD APP/如何BUILD DRIVER/如何使用VC. 所以我想你想回答问题就耐心回答,不想回答就找地儿歇会儿,实在没必要说什么去看DDK. |
|
|
16楼#
发布于:2003-10-14 10:44
大家不要吵嘛,都是出来混的,都不容易,消消气. 不明白你为什么要把Packet的状态设为NDIS_STATUS_RESOURCE再Indicate?NDIS_STATUS_RESOURCE是个失败状态,一般表示分配资源不成功吧.如果分配不成功,该清理的资源清理一下,然后返回0就好了吧,我觉得没必要再做什么处理. [编辑 - 10/14/03 by SharpShooter] |
|
|
17楼#
发布于:2003-10-14 11:41
[quote]大家不要吵嘛,都是出来混的,都不容易,消消气. 不明白你为什么要把Packet的状态设为NDIS_STATUS_RESOURCE再Indicate?NDIS_STATUS_RESOURCE是个失败状态,一般表示分配资源不成功吧.如果分配不成功,该清理的资源清理一下,然后返回0就好了吧,我觉得没必要再做什么处理. [编辑 - 10/14/03 by SharpShooter] [/quote] 我还是忍不住要对你说:看ddk的时候仔细一点(既然你说你看ddk)。 最后一次,一边待着去了。 |
|
|
18楼#
发布于:2003-10-15 00:49
呵呵,怎么吵起来了,我帮大家找找ddk吧
The miniport driver can set the Status member of the out-of-band data block to NDIS_STATUS_RESOURCES if it needs to retain ownership of the packet descriptor and buffer descriptors of some element in a particular indication. Setting NDIS_STATUS_RESOURCES forces NDIS to indicate each such packet, one at a time, to bound protocols\' ProtocolReceive functions, thereby forcing each protocol to copy the packet data and release each packet to be returned back to the miniport driver. 大概意思就是,底层的资源不是一直都有的,miniport驱动的rfd什么的都是有限的,如果网络包来的太快太多难免枯竭.所以它就会设置 NDIS_STATUS_RESOURCES来告诉上层,这个包我要保留,你悠着点.上层也得遵守一下,不占用这个包(分配自己的packet,并拷贝数据),然后就把这个包返回.接着miniport就会释放这个包,以保证有足够的rfd来截收网络包,尽量避免丢包 |
|
19楼#
发布于:2003-10-15 09:26
呵呵,怎么吵起来了,我帮大家找找ddk吧 惭愧,惭愧,实在是惭愧得很,惭愧的很。 兄弟已经放弃IM很长时间了,原本也就是看懂点皮毛,还在这儿乱讲,实在是惭愧之极。 多谢dshadow79老兄指点,多谢多谢。 |
|
|
上一页
下一页