第一范文网 - 专业文章范例文档资料分享平台

OpenDPI 源码分析 - 图文

来源:用户分享 时间:2025/5/26 5:32:18 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

OpenDPI源代码分析

其它的初始化代码比较简单,就不细说了。

3. runPcapLoop

终于轮到核心函数出场了,虽然是核心函数,但其实它并没有做什么事,真正重要的事情都让那些回调函数给做了,其不过是组织协调一些那些回调函数罢了。 3.1 pcap_loop

一开始用的是pcap的loop函数,老套路,没什么好讲的。如果对这四个参数不熟悉的话建议上网查一查,但与我们这个程序关系不大。 3.2 pcap_packet_callback

这个函数的前半部分,主要是对pcap传过来的packet做些分析,然后其会的调用packet_processing 3.3 packet_processing

这个函数算是倒数第二个重要的函数了,所以我会的仔细的分析一下 3.3.1 先初始化要用的变量:

3.3.2 然后通过ip地址,用get_id这个函数,查找全局变量osdpi_ids,找到或者建

立一个与指定ip地址相关联的id

3.3.3 然后通过对packet进行分析,找到或者建立与这个packet对应的全局变量

osdpi_flows中的flow

有兴趣的同学可以看看ipoque_unique_flow_ipv4_and_6_struct这个结构体,看看OpenDPI是怎么定义一个flow的:

OpenDPI源代码分析

3.3.4 只处理unfragmented的packet,如果这个packet符合所有条件,那么最终会

的调用ipoque_detection_process_packet来完成最后要做的事:

注意一下这几行代码,ipoque_detection_process_packet会的返回检测到的协议的类型,相应的全局变量protocol_counter和protocol_counter_bytes就会增加,然后该packet所对应的flow的类型就会被设定。

3.3.5 ipoque_detection_process_packet

终于轮到这个函数出场了,我们先来看看这个函数的参数:

参数1:ipoque_struct,嗯,就是那个核心的结构体。最核心的结构体出现在最核心的函数里一点也不让人意外 参数2:flow,嗯,就是该packet对应的全局变量的那个表示flow的结构体,后者存在的目的就是为了表示该packet的一些设计flow的信息,出现在这里也完全不令人意外

参数3:packet,这个肯定得有,没有的话就不用分析了 参数4:指明packet的长度,谁叫packet是个指针呢

参数5:current_tick,我还是不知道这是干嘛的,只知道和时间有关(这个程序里和时间有关的东西我理解的都不是很好) 参数6和参数7:这两个其实是一样的,都是全局变量表示的osdpi_ids,嗯,和参数2一样,出现在这里理所应当。

既然参数我们看的都差不多懂了(除了current_tick没懂,其它参数也就只能是这么几个了,OpenDPI真的没啥其它东西可做参数了),那么分析起来就容易多了:

OpenDPI源代码分析

第一个遇到的重要函数是:ipq_init_packet_header:

他初始化了ipoque_struct->packet这个成员,并把flow中的一些信息复制到了该成员中(即让ipoque_struct->packet继承其所属的flow中的packet前辈的记忆)

然后遇到第二个重要的函数:ipoque_connection_tracking

这个函数主要设置ipoque_struct中的packet和flow的状态,有很大一部分代码和tcp的状态有关,可以详细的看一看

然后,设置ipq_selction packet bitmask,该标志位来源的依据主要来自之前对于flow和packet的分析(ipoque_connection_tracking)

换句话说,该标志位表明这个packet拥有何种属性(如是否为IP?是否为IPV4?是否有PAYLOAD?)

接下来是一句非常关键的语句:

packet->detected_protocol_stack[0]:

如果这个packet不是属于一个flow的(低于四层),那么在ipq_init_packet_header中,其会的被设置为IPOQUE_PROTOCOL_UNKNOWN:

否则,则来自于flow的继承:

最后,当这一切都处理好了之后,就是四个for循环了:

这个的意思现在再看的话就很明白不过了吧: 第一行:需要为tcp

第二行:需要payload非空

第三行:开始调用has_payload的回调函数们

第四行:进行判断,判定有无必要对这个packet调用回调函数:比如这个packet是IPV6的,但是某个has_payload的回调函数所对应的协议是绝对没有IPV6的,那么就不用大费周章的去调用了。

OpenDPI源代码分析

整个OpenDPI的demo差不多就分析到这里,下个礼拜开始看具体的协议。

搜索更多关于: OpenDPI 源码分析 - 图文 的文档
OpenDPI 源码分析 - 图文.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c34gdt60rmv62h60030qm_2.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top