chili
驱动牛犊
驱动牛犊
  • 注册日期2004-03-31
  • 最后登录2011-03-29
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:4544回复:24

由应用程序决定底层数据包是否通过的问题

楼主#
更多 发布于:2004-06-29 11:33
我把网卡收到的数据传到应用层后由应用层决定该包是否抛弃(驱动通过共享内存、共享事件来通知应用;应用通过CTL_CODE通知驱动),但是发现分片包(比如ping xxx -l 60000)的时候还没有等我的CTL_CODE传递到驱动就已经Time out了,想问问驱动和应用通过CTL_CODE通讯是否比较耗时间,能有什么其它好办法吗?

我试图修改packet中OOBS数据的ReceivedTime但是发现还有此问题,请问高手问题可能出在哪里?有什么好办法解决?

最新喜欢:

pilixuankepilixu... ljmmaryljmmar... hbnhbnhbnhbnhbn...
wfine
驱动牛犊
驱动牛犊
  • 注册日期2004-08-15
  • 最后登录2005-06-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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]
baoyibao99
禁止发言
禁止发言
  • 注册日期2003-05-07
  • 最后登录2016-04-11
  • 粉丝0
  • 关注0
  • 积分894分
  • 威望8415点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-03-02 11:54
用户被禁言,该主题自动屏蔽!
wfine
驱动牛犊
驱动牛犊
  • 注册日期2004-08-15
  • 最后登录2005-06-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-02-25 08:16
请问4怎么实现?
在驱动中怎么实现多线程?
wfine
驱动牛犊
驱动牛犊
  • 注册日期2004-08-15
  • 最后登录2005-06-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-02-24 20:55
我开辟了个共享队列由应用和驱动来共同维护此队列
1.开辟个共享队列由驱动和应用共同维护
2.收发包时把数据包保存在队列中不发送但告诉protocol/nic收发成功,同时通知上层有数据包到来要处理。
3.应用收到数据包通知后读取、分析数据然后决定该报是否阻断(通过对共享数据中的某个节点的某个Flag做标记).....
4.在驱动中也建立线程监控共享队列中的数据是否在应用中做了标记(有效、已读、已处理等)然后来决定是否发送
5.我测试过ping 65500的数据包的时候系统处理不会造成丢包
.这样可以由应用程序来决定某个包能否通过。

我开始发此初帖的时候(想每来一个包然后由上面决定然后通知线面是否通过)没有考虑到网卡收发包的速度比事件通知快,走了很多弯路(第一次搞驱动,高手们多帮助我)。


[编辑 -  7/19/04 by  chili]
wangjianfeng
驱动小牛
驱动小牛
  • 注册日期2004-05-28
  • 最后登录2013-10-02
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望263点
  • 贡献值0点
  • 好评度260点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-02-19 17:00
关注!我也有个类似程序,想请教大家.
suerdj2k
驱动牛犊
驱动牛犊
  • 注册日期2004-12-28
  • 最后登录2006-02-08
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-02-04 11:14
gz-关注!

============================== 苏州工业园区 NDIS驱动 软件研发
pupilforever
驱动牛犊
驱动牛犊
  • 注册日期2004-11-23
  • 最后登录2005-03-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-02-04 10:57
gz什么意思啊,看着看着,非常高兴,来个不懂的,一头雾水
williamgu1974
驱动牛犊
驱动牛犊
  • 注册日期2004-08-13
  • 最后登录2004-10-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-09-28 10:40
这可能是目前最好的方法了,速度快,不会丢包。其实如果你关心IDS技术的话就会知道,这两年IDS技术里面叫的最响的就是网络驱动和IDS过滤采用共享内存的方法,可以极快的提高分析速度(因为免去了数据包从内核级内存拷贝到用户态内存空间的时间)。不过之前我们做的都是linux下的,比较容易实现。
WY.lslrt
驱动牛犊
驱动牛犊
  • 注册日期2004-07-30
  • 最后登录2009-10-27
  • 粉丝0
  • 关注0
  • 积分116分
  • 威望15点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-09-15 14:52
gz
---传说中的分割线--------
liusz
驱动牛犊
驱动牛犊
  • 注册日期2004-03-16
  • 最后登录2018-05-26
  • 粉丝0
  • 关注0
  • 积分29分
  • 威望43点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-09-14 20:18
后来我又增加了一个队列.....,数据包交互的方式可以调整


是不是发送的数据包一个队列,接收的数据包一个队列?

你所说的数据包交互方式调整是指什么?
chili
驱动牛犊
驱动牛犊
  • 注册日期2004-03-31
  • 最后登录2011-03-29
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-09-13 16:08
后来我又增加了一个队列.....,数据包交互的方式可以调整
liusz
驱动牛犊
驱动牛犊
  • 注册日期2004-03-16
  • 最后登录2018-05-26
  • 粉丝0
  • 关注0
  • 积分29分
  • 威望43点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-09-13 15:31
我开辟了个共享队列由应用和驱动来共同维护此队列
1.开辟个共享队列由驱动和应用共同维护
2.收发包时把数据包保存在队列中不发送但告诉protocol/nic收发成功,同时通知上层有数据包到来要处理。
3.应用收到数据包通知后读取、分析数据然后决定该报是否阻断(通过对共享数据中的某个节点的某个Flag做标记).....
4.在驱动中也建立线程监控共享队列中的数据是否在应用中做了标记(有效、已读、已处理等)然后来决定是否发送
5.我测试过ping 65500的数据包的时候系统处理不会造成丢包
.这样可以由应用程序来决定某个包能否通过。

我开始发此初帖的时候(想每来一个包然后由上面决定然后通知线面是否通过)没有考虑到网卡收发包的速度比事件通知快,走了很多弯路(第一次搞驱动,高手们多帮助我)。


[编辑 -  7/19/04 by  chili]



太好了,我正在考虑这个问题呢。很惭愧,我自己做的这点东西总是做做停停。谢谢chili。
chili
驱动牛犊
驱动牛犊
  • 注册日期2004-03-31
  • 最后登录2011-03-29
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-07-19 15:06
多谢asmsys以前的指点 :),小弟没分可送了,唯一的一分留着舍不得送人。
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-07-19 14:40
方法很好
chili
驱动牛犊
驱动牛犊
  • 注册日期2004-03-31
  • 最后登录2011-03-29
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-07-19 13:40
我开辟了个共享队列由应用和驱动来共同维护此队列
1.开辟个共享队列由驱动和应用共同维护
2.收发包时把数据包保存在队列中不发送但告诉protocol/nic收发成功,同时通知上层有数据包到来要处理。
3.应用收到数据包通知后读取、分析数据然后决定该报是否阻断(通过对共享数据中的某个节点的某个Flag做标记).....
4.在驱动中也建立线程监控共享队列中的数据是否在应用中做了标记(有效、已读、已处理等)然后来决定是否发送
5.我测试过ping 65500的数据包的时候系统处理不会造成丢包
.这样可以由应用程序来决定某个包能否通过。

我开始发此初帖的时候(想每来一个包然后由上面决定然后通知线面是否通过)没有考虑到网卡收发包的速度比事件通知快,走了很多弯路(第一次搞驱动,高手们多帮助我)。


[编辑 -  7/19/04 by  chili]
codingw
驱动牛犊
驱动牛犊
  • 注册日期2004-06-24
  • 最后登录2004-08-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-06-30 17:24
处理速度上不必担心,100M环境肯定没有问题。关键是处理方法要合理。SPI上做防火墙有缺陷。
Microsoft提供了一种firewall hook,也是在驱动。我猜测本意是提供FIREWARE的功能。现在也不建议采用了(见DDK),而是建议IMD做类似的工作。
IoriKingdom
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2010-04-26
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望23点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-06-30 17:02
SPI抓不到mac,spi是工作在socket之下
用winpcap吧,不过要处理WAN的话,要分析比较多的数据包
天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,曾益其所不能。
chili
驱动牛犊
驱动牛犊
  • 注册日期2004-03-31
  • 最后登录2011-03-29
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-06-30 14:51
这个问题搞了很久了,还是换种思路算了。。。。哎
再加个队列,底层建立一个线程监视..。。.
chili
驱动牛犊
驱动牛犊
  • 注册日期2004-03-31
  • 最后登录2011-03-29
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-06-30 14:19
我还想抓取Mac,Spi可以吗?

[编辑 -  6/30/04 by  chili]
上一页
游客

返回顶部