阅读:1669回复:7
使用ptReceive的网卡如何处理包?
passthru中,
在ptreceive中Packet不能获得完整的一个NDIS_PACKET结构,是不是MptransferData中当Status=NDIS_STATUS_SUCCESS时,MptransferData中的Packet就指向了一个完整的NDIS_PACKET结构呢?我现在想先得到完整的包内容放入一个缓冲中,处理后在提交上去给协议层。但是我现在不知道应该怎样实现这个方案,希望各位能帮忙给我一些解决的方案或者方法。 |
|
|
沙发#
发布于:2004-01-08 18:06
请帮助,谢谢
|
|
|
板凳#
发布于:2004-01-08 21:46
你用的是什么网卡呢?
有些便宜的网卡如rtl8139芯片的网卡无法获取PACKET,只能从原是buffer中提取ip包! |
|
地板#
发布于:2004-01-09 08:44
8139,我应该怎样提取出完整的包内容呢?
|
|
|
论坛版主
|
地下室#
发布于:2004-01-09 12:22
接收过程分三种情况:
>1.对于10/100M自适应网卡(这是据说,我试过好像不灵喔:),我的网卡是10/100自 适应的啊,但从来不以这种方式接收包,但据我们教研室一个人说遇到过,所以最好还 是把这种情况做出来),NdisGetReceivedPacket可以得到完整的包, 包含OOB DATA,这是最简单的情况。 >2.如果不是,也就是上述方法得不到PACKET,那么要判断PTRECEIVE的两个参数: PacketSize 和 LookAheadBufferSize的大小,如果PacketSize <= LookAheadBufferSize,表示整个包被放到了前视缓冲区中,可以从LookAheadBuffer得 到整个的包,包大小是LookAheadBufferSize。 >3.PacketSize > LookAheadBufferSize的情况那么表示下层MINIPORT发送了一个叫做 前视数据的部分上来,如果上层判断需要这个包,可以利用PTTRANSFERDATA将剩下的部 分传上来。LookAheadBufferSize表示传了多大上来,PacketSize - LookAheadBufferSize表示还剩多少要传。 |
|
5楼#
发布于:2004-01-09 13:40
你是说我可以在MPTransferData中得到完整包内容么?
情况一:我在ptreceive中收到的lookaheadbuffersize>=packetsize,我就可以直接处理lookaheadbuffer,把它当成是包内容,当我处理完以后,如果lookheadbuffer的长度变化,就将新的lookaheadbuffersize通知给NdisMEthIndicateReceive()。直接把lookaheadbuffer给NdisMEthIndicateReceive()。 情况二:lookaheadbuffersize<packetsize,我就可以直接在MPTransferData中收全整个包,并用一个packet描述符来描述这个包,我就可以将包能容一一都给考出来到一个连续的buffer中,进行处理,处理完毕之后,用一个新的描述符把这个缓冲描述成一个packet。然后用NdisMIndicateReceivePacket()来通知协议层一个包送到。 我这样做可以么?请指教。谢谢 |
|
|
论坛版主
|
6楼#
发布于:2004-01-09 20:58
可以可以;)JUST DO IT
|
|
7楼#
发布于:2004-01-16 11:33
这个贴子原来有回答的。
在PtReceive中的不是完整的包结构的话,得到的是一部分包内容,将其拷入一个内存块中,然后调用ndistranferdata,在ptTransferdataComplete中会得到剩下的包内容,将两个包组装一下就行了。 |
|