阅读:4544回复:24
由应用程序决定底层数据包是否通过的问题
我把网卡收到的数据传到应用层后由应用层决定该包是否抛弃(驱动通过共享内存、共享事件来通知应用;应用通过CTL_CODE通知驱动),但是发现分片包(比如ping xxx -l 60000)的时候还没有等我的CTL_CODE传递到驱动就已经Time out了,想问问驱动和应用通过CTL_CODE通讯是否比较耗时间,能有什么其它好办法吗?
我试图修改packet中OOBS数据的ReceivedTime但是发现还有此问题,请问高手问题可能出在哪里?有什么好办法解决? |
|
沙发#
发布于:2005-03-24 20:26
我按照chili的方法做了,但是没有解决丢包的问题,主要是同步和队列的大小没设置好,请大家帮忙。
这地方我设置pRevQueue大小为9500,大概能接受6个包(1514),pRevQueue我用的是一个非分页内存,为了防止分页问题,这地方我不敢设得比较大,请问这地方设多大最好呀,还有就是这地方必须要采用非分页内存吗? 一个接受包的队列:pRevQueue; 每个节点:包的内容+flag flag=0 未处理,flag=1 已处理 这个队列我通过一个pRevEvent来控制同步的 在驱动层: 网卡上传来一个包packet; pNode=CreatNode(packet);//根据packet建立一个queue node 其中flag=0 EnQueue(pRevQueue,pNode);//pNode进入队列(在pNode进入队列时,先对flag=1的Node作删除操作 KeSetEvent(pRevEvent, 0, FALSE);//这地方我采用事件通知上层,请问这用这个方法好吗?还有没有其它的方法? 在应用层: while(repeat) { WaitForSingleObject(mpRevEvent,INFINITE);//mpRevEvent与pRevEvent相关联 while(IsNotEmpty(mpRevQueue)) { ModifyQueue(mpRevQueue,pNode);//取出flag=0的node,并且将其flag设为1 //对pNode进行处理 } ResetEvent(mpRevEvent); } [编辑 - 3/24/05 by wfine] |
|
板凳#
发布于:2005-03-02 11:54
用户被禁言,该主题自动屏蔽! |
|
地板#
发布于:2005-02-25 08:16
请问4怎么实现?
在驱动中怎么实现多线程? |
|
地下室#
发布于:2005-02-24 20:55
我开辟了个共享队列由应用和驱动来共同维护此队列 |
|
驱动小牛
![]() |
5楼#
发布于:2005-02-19 17:00
关注!我也有个类似程序,想请教大家.
|
6楼#
发布于:2005-02-04 11:14
gz-关注!
|
|
|
7楼#
发布于:2005-02-04 10:57
gz什么意思啊,看着看着,非常高兴,来个不懂的,一头雾水
|
|
8楼#
发布于:2004-09-28 10:40
这可能是目前最好的方法了,速度快,不会丢包。其实如果你关心IDS技术的话就会知道,这两年IDS技术里面叫的最响的就是网络驱动和IDS过滤采用共享内存的方法,可以极快的提高分析速度(因为免去了数据包从内核级内存拷贝到用户态内存空间的时间)。不过之前我们做的都是linux下的,比较容易实现。
|
|
9楼#
发布于:2004-09-15 14:52
gz
|
|
|
10楼#
发布于:2004-09-14 20:18
后来我又增加了一个队列.....,数据包交互的方式可以调整 是不是发送的数据包一个队列,接收的数据包一个队列? 你所说的数据包交互方式调整是指什么? |
|
11楼#
发布于:2004-09-13 16:08
后来我又增加了一个队列.....,数据包交互的方式可以调整
|
|
12楼#
发布于:2004-09-13 15:31
我开辟了个共享队列由应用和驱动来共同维护此队列 太好了,我正在考虑这个问题呢。很惭愧,我自己做的这点东西总是做做停停。谢谢chili。 |
|
13楼#
发布于:2004-07-19 15:06
多谢asmsys以前的指点 :),小弟没分可送了,唯一的一分留着舍不得送人。
|
|
14楼#
发布于:2004-07-19 14:40
方法很好
|
|
15楼#
发布于:2004-07-19 13:40
我开辟了个共享队列由应用和驱动来共同维护此队列
1.开辟个共享队列由驱动和应用共同维护 2.收发包时把数据包保存在队列中不发送但告诉protocol/nic收发成功,同时通知上层有数据包到来要处理。 3.应用收到数据包通知后读取、分析数据然后决定该报是否阻断(通过对共享数据中的某个节点的某个Flag做标记)..... 4.在驱动中也建立线程监控共享队列中的数据是否在应用中做了标记(有效、已读、已处理等)然后来决定是否发送 5.我测试过ping 65500的数据包的时候系统处理不会造成丢包 .这样可以由应用程序来决定某个包能否通过。 我开始发此初帖的时候(想每来一个包然后由上面决定然后通知线面是否通过)没有考虑到网卡收发包的速度比事件通知快,走了很多弯路(第一次搞驱动,高手们多帮助我)。 [编辑 - 7/19/04 by chili] |
|
16楼#
发布于:2004-06-30 17:24
处理速度上不必担心,100M环境肯定没有问题。关键是处理方法要合理。SPI上做防火墙有缺陷。
Microsoft提供了一种firewall hook,也是在驱动。我猜测本意是提供FIREWARE的功能。现在也不建议采用了(见DDK),而是建议IMD做类似的工作。 |
|
17楼#
发布于:2004-06-30 17:02
SPI抓不到mac,spi是工作在socket之下
用winpcap吧,不过要处理WAN的话,要分析比较多的数据包 |
|
|
18楼#
发布于:2004-06-30 14:51
这个问题搞了很久了,还是换种思路算了。。。。哎
再加个队列,底层建立一个线程监视..。。. |
|
19楼#
发布于:2004-06-30 14:19
我还想抓取Mac,Spi可以吗?
[编辑 - 6/30/04 by chili] |
|
上一页
下一页