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差不多就分析到这里,下个礼拜开始看具体的协议。
相关推荐: