阅读:1596回复:9
数据包NdisMIndicateReceivePacket这种情况下怎么不行呢?
我在passthru的基础上把在ptRecieve和PtTransferDataComplete中把收到数据包后保存在自己的队列中不向上指示,然后把这些数据传给应用程序分析后在通过io事件通知底层数据包出队列,决定向上指示还是直接抛弃。在ptRecieve(packetsize=lookaheadsize)和PtTransferDataComplete(packetsize>lookaheadsize)中保存
if (SaveToPacketQueue(pPacketQueue,ProtocolBindingContext,&Packet,&pPacketContent,PacketLen,DIRECTION_RECEIVE)==0){...} SaveToPacketQueue用于保存收到的数据包的信息,包括下面内容 typedef struct _PACKET_MAP //定义数据包映射表 { NDIS_HANDLE ProtocolBindingContext; PNDIS_PACKET Packet; PVOID Address; UINT Size; UINT Direct; }PACKET_MAP,*PPACKET_MAP; 然后在IRP_MJ_DEVICE_CONTROL中如果允许则 QueuePacketPass(pPacketQueue); //允许环形队列中的头数据包发送,调用NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &pPacket, 1); 可是我在用ping(icmp包)测试的时候如果指定包的长度<1473则能够ping通,否则不通,搞了很久还没找到原因,希望高手指点! |
|
沙发#
发布于:2004-06-03 17:47
但是我是想在下层抓包后让上层组包对应用层协议分析(http\\smtp\\pop3\\telnet\\dns\\icq等应用协议),如果在驱动中开发这些协议分析估计比较费时间.同时要求对包进行动作处理(抛弃\\通过)等,而且还要有简易的防火墙功能啊,怎么驱动和应用程序通讯要耗比较多时间吗?看来还有不少不可预见的问题啊
[编辑 - 6/3/04 by chili] |
|
板凳#
发布于:2004-06-03 17:26
数据送到应用层没办法提高速度。因为系统要做好多事情,况且还要使用内核对象,内核对象本身也是极其费事的。
直接在驱动中处理数据就可以了,VPN,防火墙都这么做,一定是可行的。 |
|
地板#
发布于:2004-06-03 14:29
可是只要我在驱动中用keSetEvent通知应用程序有数据包(上面什么都不处理就是发个IO_PACKET_PASS_EVENT)的时候就会出现上面所说的情况啊....,该以怎样的方式和应用程序通讯呢?
|
|
地下室#
发布于:2004-06-03 13:29
非常感谢asmsys老大的指点,我在驱动中进队列后直接出队列(把传到应用程序处理的代码去掉后)ping 包的长度没限制都可以了终于找到问题所在了,后面的工作就改变传给应用程序数据的方法了。
非常感谢!!! |
|
5楼#
发布于:2004-06-03 11:27
是不是只要我加快对数据包的处理还是可以解决这种问题的(我准备把它搞到网关那里的)?
这个还要你试试。 一般NDIS_STATUS_RESOUR标志的时候要求上层立即拷贝包并返回,这个一般大致是什么数量级呢? COPY1500个字节的数量级。 |
|
6楼#
发布于:2004-06-03 10:41
是不是只要我加快对数据包的处理还是可以解决这种问题的(我准备把它搞到网关那里的)?一般NDIS_STATUS_RESOUR标志的时候要求上层立即拷贝包并返回,这个一般大致是什么数量级呢?看来得优化代码了
|
|
7楼#
发布于:2004-06-03 10:19
大体思路就这样,只要把包COPY出来就好了。
另外,如果处理队列的时间过长,TIME OUT是必然的。 |
|
8楼#
发布于:2004-06-03 10:13
啊 这样啊,那我的设计是不是要做调整了?这种情况有什么办法解决吗??
|
|
9楼#
发布于:2004-06-03 09:49
如果是ptRecievePacket中的包可以这么做,没有问题,因为此时拥有对包的所有权。
但PTreceive和PtTransferDataComplete的组合被使用,有一个重要的原因就是下层的小端口 举包的时候使用了NDIS_STATUS_RESOURCE标志,这意味着下层的小端口的资源紧张,要求上层立即拷贝包并返回,此时包的所有权没有交上来,等你在队列中处理包时,该包很可能已经被下一批数据使用了。 |
|