阅读:2093回复:17
再问一个关于 Passthru 理解上的问题,会者不难[30 分]
以下讨论 XP 版的 Passthru:
如果我们在 PtReceivePacket() 返回了非 0 值,表示我们暂时不释放对包的所有权,等处理结束之后会调用 NdisReturnPacket() 通知刚才指示包的下层 Miniport 我们已经处理完了,可以释放包资源了,可是我在 Passthru 中看到:PtReceivePacket() 有可能返回非 0 值,但它却没有在任何地方调用 NdisReturnPacket() 啊?这是怎么回事? |
|
最新喜欢:suerdj... |
沙发#
发布于:2002-12-10 14:19
MPReturnPacket里面调用的
|
|
|
板凳#
发布于:2002-12-10 14:31
我看代码里的意思好象当包状态是 NDIS_STATUS_RESOURCES 的时候指示过程会立即结束,而不是的时候就代表上层协议一定保留了包的所有权,是这样吗?
为什么当包状态不是 NDIS_STATUS_RESOURCES 的时候上层就一定会保留包呢? |
|
地板#
发布于:2002-12-10 14:36
NDIS_STATUS_RESOURCES 是没有资源了,就是没有内存来存这些包了,所以就立刻返回了,不然的话不管是什么状态,协议层都把packet留下了(如果他想要的话),或者是丢弃了(如果他不想要),但是已经和你没有关系了
|
|
|
地下室#
发布于:2002-12-10 14:43
不然的话不管是什么状态,协议层都把packet留下了(如果他想要的话),或者是丢弃了(如果他不想要),但是已经和你没有关系了 怎么会跟我没关系了呢?我还等着它的通知来释放资源啊! 你的意思它就算是丢掉了也会调用我们的 ReturnPacketHandler? 难道上层协议的行为模式就是这样的吗:一旦收到包就保留其所有权? |
|
5楼#
发布于:2002-12-10 14:50
可是我从 Passthru 注释里看到的意思好象是说我们自己调用 ReturnPacket 啊,好象这样也说的通。
|
|
6楼#
发布于:2002-12-10 15:06
在Miniport调用NdisIndicateReceivePacket时,需要预先设定packet的status域,当设为STATUS_SUCESS时表示该Packet可以被pending,当设为STATUS_RESOURCES时要求上层的协议必须立即处理该数据。所以在PTReceive里当看到STATUS_RESOURCES时必须立即返回,而不能pending该数据。另外由于是中间层,在PTReceive收到的数据包最终要通过IM的Miniport提交给上层的协议,在上层的协议(TCP/IP)也是同样的处理办法。所以当设为STATUS_SUCCESS时,上层一般总是会返回Pending,最终的返回会调用MiniportReturnPacket表示该Packet已经处理完成。
|
|
7楼#
发布于:2002-12-10 15:11
PtReceive 跟 ReturnPacket 没关系吧?你说的是 PtReceivePacket ?
|
|
8楼#
发布于:2002-12-10 15:17
在Miniport调用NdisIndicateReceivePacket时,需要预先设定packet的status域,当设为STATUS_SUCESS时表示该Packet可以被pending,当设为STATUS_RESOURCES时要求上层的协议必须立即处理该数据。所以在PTReceive里当看到STATUS_RESOURCES时必须立即返回,而不能pending该数据。另外由于是中间层,在PTReceive收到的数据包最终要通过IM的Miniport提交给上层的协议,在上层的协议(TCP/IP)也是同样的处理办法。所以当设为STATUS_SUCCESS时,上层一般总是会返回Pending,最终的返回会调用MiniportReturnPacket表示该Packet已经处理完成。 是的,刚看了以下,xp里面判断的那个Status是从miniport传上来来的packet的状态, |
|
|
9楼#
发布于:2002-12-10 15:18
PtReceive 跟 ReturnPacket 没关系吧?你说的是 PtReceivePacket ? 你问的不是PtReceivePacket ?? |
|
|
10楼#
发布于:2002-12-10 15:27
我问的是 PtReceivePacket,可是 bingjie 好象在说 PtReceive。
|
|
11楼#
发布于:2002-12-10 15:33
他说的就是receivepacket,
Status = NDIS_GET_PACKET_STATUS(Packet);这个Status 是在packet里面的OOB数据,不是协议层返回的Status ,方才我没有看程序:) |
|
|
12楼#
发布于:2002-12-11 13:44
我想我现在已经理解了,只是还有个疑虑:
为什么在 PtReceivePacket() 中向上指示的包的包状态不是 NDIS_STATUS_RESOURCES,上层 Protocol 就一定会保留指示上去的包?有什么道理? 此问题澄清后立即结贴给分!诸位高手帮忙! |
|
13楼#
发布于:2002-12-11 14:52
高手顺便连这个也说一下吧:
PtSendComplete() 是 MPSend() 和 MPSendPackets() 公用的吗? |
|
14楼#
发布于:2002-12-11 15:06
NDIS_STATUS_RESOURCES是告诉他你的资源不够用了,一定要立刻把东西还给我,不然就没有用的了,否则就是告诉他随便用,用完了在还给你就行了
|
|
|
15楼#
发布于:2002-12-11 15:13
PtSendComplete() 是 MPSend() 和 MPSendPackets() 公用的吗? 这个呢,mikeluo? |
|
16楼#
发布于:2002-12-11 15:21
PtSendComplete只有一个:)
|
|
|
17楼#
发布于:2002-12-11 15:48
PtSendComplete只有一个:) 所以是公用的了?! 好,给分! |
|