【智能路由器】ndpi深度报文分析源码框架

合集下载

【智能路由器】ndpi深度报文之协议器讲解

【智能路由器】ndpi深度报文之协议器讲解

【智能路由器】ndpi深度报文分析之协议分析器ndpi协议分析器结构框架每个协议分析器都必须定义一个独有的id,例如:/*ndpi_protocol_ids.h*/#define NDPI_PROTOCOL_QQ 4812协议分析器格式#include "ndpi_utils.h"#ifdef NDPI_PROTOCOL_QQ.....#endif协议分析器的初始化函数,初始化函数中调用ndpi_set_bitmask_protocol_detection来输入自己的注册信息,以及处理数据包的类型void init_qq_dissector(struct ndpi_detection_module_struct *ndpi_struct, u_int32_t *id, NDPI_PROTOCOL_BITMASK *detection_bitmask){ndpi_set_bitmask_protocol_detection("QQ", ndpi_struct, detection_bitmask, *id,NDPI_PROTOCOL_QQ,ndpi_search_qq,NDPI_SELECTION_BITMASK_PROTOCOL_V4_V6_UDP_WITH_PAYLOAD,SA VE_DETECTION_BITMASK_AS_UNKNOWN,ADD_TO_DETECTION_BITMASK);*id += 1;}一个回调函数,用来处理数据包,这个函数就是初始化中注册的函数,这个函数将细分情况,然后交给实际的分析函数,这里分别是ndpi_search_qq_udp和ndpi_search_qq_tcp。

虽然也可以直接在这里分析处理,但这样会显得层次结构不清晰void ndpi_search_qq(struct ndpi_detection_module_struct *ndpi_struct, struct ndpi_flow_struct *flow){struct ndpi_packet_struct *packet = &flow->packet;if (packet->udp != NULL && flow->detected_protocol_stack[0] != NDPI_PROTOCOL_QQ) ndpi_search_qq_udp(ndpi_struct, flow);if (packet->tcp != NULL && flow->detected_protocol_stack[0] != NDPI_PROTOCOL_QQ) ndpi_search_qq_tcp(ndpi_struct, flow);}协议分析器的框架就到此为止,然后将初始化函数添加到ndpi_main.c文件的ndpi_init_protocol_defaults函数中,像这样:static void ndpi_init_protocol_defaults(struct ndpi_detection_module_struct *ndpi_mod) {int i;ndpi_port_range ports_a[MAX_DEFAULT_PORTS], ports_b[MAX_DEFAULT_PORTS];u_int16_t no_master[2] = { NDPI_PROTOCOL_NO_MASTER_PROTO, NDPI_PROTOCOL_NO_MASTER_PROTO },custom_master[2];/* Reset all settings */memset(ndpi_mod->proto_defaults, 0, sizeof(ndpi_mod->proto_defaults));//......ndpi_set_proto_defaults(ndpi_mod, NDPI_PROTOCOL_FUN, NDPI_PROTOCOL_QQ,no_master,no_master, "QQ",ndpi_build_default_ports(ports_a, 0, 0, 0, 0, 0) /* TCP */,ndpi_build_default_ports(ports_b, 0, 0, 0, 0, 0) /* UDP */);//......}宏定义NDPI_PROTOCOL_LONG_STRING和NDPI_PROTOCOL_SHORT_STRING中添加协议名称字符串。

路由协议配置与分析毕业论文

路由协议配置与分析毕业论文

摘要互联网的成功发展给人民生活带来巨大变化,它的影响已经渗透到社会的各个方面,并产生了巨大的经济效益和社会效益。

但随着互联网应用的发展,基于IPv4的互联网在实际应用中越来越暴露出其不足之处。

这些问题已经成为制约互联网发展的重要障碍,于是IPv6技术应运而生。

近年来,IPv6在世界围得到了广泛的关注和研究。

下一代路由协议中针对用于IPv6的路由信息协议(RIPng)和开放最短路径优先( OSPFv3 )协议的研究与实验已成为IPv6协议栈研究的重要组成部分。

本文在深刻理解路由协议理论知识的基础上,对基于下一代网络协议IPv6 的RIPng ( 路由信息协议 )和OSPFv3( 开放最短路径优先 )路由选择协议的基本工作原理、报文格式等进行了具体介绍和分析,并采用Cisco Packet Tracer 模拟路由器实现RIPng和OSPFv3协议的多协议配置。

关键词: 路由器 IPv6 OSPFv3 RIPngAbstractThe Internet's success to the people's life development produce huge changes, its influence has penetrated into every aspect of society, and has produced great economic benefits and social benefit. But as the Internet application development, based on the Internet in the practical application of IPv4 in more and more exposed its disadvantages. These problems have become the important obstacle of restricting the Internet development, so IPv6 technology arises at the historic moment.In recent years, IPv6 worldwide received extensive attention and research. The next generation of routing protocol to IPv6 used for the routing information protocol (RIPng) and open shortest path first (OSPFv3) agreement with the experimental study of IPv6 protocol stack has become an integral part of the study of.This article, in the profound understanding routing protocol theory knowledge, on the basis of next generation network protocol based on the RIPng IPv6 (routing information protocol) and OSPFv3 (open shortest path is preferred) routing protocol's basic working principle, message format etc are introduced and analyzed in this paper, and the Cisco Packet Tracersimulation RIPng routers and OSPFv3 protocol .KEYWORDS:router IPv6 OSPFv3 RIPng目录第一章绪论1第二章路由协议现状分析1一、RIPng现状分析1(一)RIPng简介1(二)RIPng的报文格式比较分析3(三)RIPv1、RIPv2和RIPng的比较4(四)RIPng存在的问题与改进方向6(五)RIPng的发展趋势6二、OSPF V3现状分析7(一)OSPFv3简介7(二)OSPFv3与OSPFv2的报文类型比较分析8(三)OSPFv3与OSPFv2的LSA 类型比较分析8 第三章基于IPV6的多路由协议网络设计9一、Packet Tracer软件简介9二、使用多种路由协议的原因10三、IP V6多路由协议配置10(一)技术原理10(二)网络拓扑图11(三)IP配置表12(四)基本配置12(五)路由重发布配置19(六)用show ipv6 route命令测试20参考文献26致27路由协议配置与分析第一章绪论随着互联网在社会生活各个领域的广泛应用和商业化的深入发展,现有的网络基础设施和网络服务已经难以满足和支持大规模的网络应用,如交互式远程实时教学、远程医疗(手术)、协同工作、科研、数字化图书馆、虚拟实验室等。

【智能路由器】ndpi深度报文源码框架讲解

【智能路由器】ndpi深度报文源码框架讲解

【智能路由器】ndpi深度报文分析源码框架某些需求可能会要求路由能精确的分析出流经路由的流量是属于什么类型,比如qq,facebook,支付宝、京东……正好,有这么一个基于opendpi框架的深度报文分析的工具——ndpindpi是在opendpi的基础上编写而来的协议分析工具。

源代码编译后生成两个部分,一个是内核层的xt_ndpi.ko模块,用来实时分析流量,另一个是应用层的lib库,给ndpiReader这个工具提供库,用来分析抓包工具提供的文件或者底层网卡提供的数据包。

开发者必须为其想要分析的app的流量对应开发一个协议分析器,ndpi已经提供了不少现成的协议分析器,如http,QQ,twitter,vmware,yahoo,mysql,pplive等等。

本篇博客中作者arvik只叙述ndpi源码中形成内核层的xt_ndpi.ko模块的源码部分。

之后可能会写一篇介绍ndpi中已有的QQ协议分析器是怎么分析出OICQ协议以识别流量类型和一篇实战型依葫芦画瓢编写微信协议分析器的博客。

ndpi的分析过程:当底层一帧数据被送入ndpi钩子的时候,流经结构大致如下:1. 打包该数据帧,搜集l3、l4层报头信息2. 查询链接跟踪(如果已被标识,则直接获取到该数据帧所属协议类型)3. 从链接跟踪中未获取流量所属协议类型,则进入深度报文分析过程4. 率先进行协议猜测,调用相应的协议分析器分析5. 猜测协议错误、此时ndpi会分类遍历相关类型的协议分析器进行分析,直至分析出结果或遍历完所有相关的协议分析器6. 将分析出的协议类型标记到链接跟踪中,以便下次可直接从连接跟踪中拿到协议类型先来看内核模块代码:几个重要结构ndpi_detection_module_struct:各种协议分析器都将自己的信息都保存在该结构中struct ndpi_detection_module_struct {NDPI_PROTOCOL_BITMASK detection_bitmask; //等价于struct xxx { uint32_t fds_bits[8]}; struct xxx dection; 其中fds_bits[8]每一位可代表一种协议,最多可代表256中协议NDPI_PROTOCOL_BITMASK generic_http_packet_bitmask;u_int32_t current_ts;u_int32_t ticks_per_second;#ifdef NDPI_ENABLE_DEBUG_MESSAGESvoid *user_data;#endif/* 各种类型回调函数数组,每个协议都会对应一个回调函数*/struct ndpi_call_function_struct callback_buffer[NDPI_MAX_SUPPORTED_PROTOCOLS + 1];u_int32_t callback_buffer_size;struct ndpi_call_function_struct callback_buffer_tcp_no_payload[NDPI_MAX_SUPPORTED_PROTOCOLS + 1];u_int32_t callback_buffer_size_tcp_no_payload;struct ndpi_call_function_struct callback_buffer_tcp_payload[NDPI_MAX_SUPPORTED_PROTOCOLS + 1];u_int32_t callback_buffer_size_tcp_payload;struct ndpi_call_function_struct callback_buffer_udp[NDPI_MAX_SUPPORTED_PROTOCOLS + 1];u_int32_t callback_buffer_size_udp;struct ndpi_call_function_struct callback_buffer_non_tcp_udp[NDPI_MAX_SUPPORTED_PROTOCOLS + 1];u_int32_t callback_buffer_size_non_tcp_udp;ndpi_default_ports_tree_node_t *tcpRoot, *udpRoot;#ifdef NDPI_ENABLE_DEBUG_MESSAGES/* 调试信息相关回调*/ndpi_debug_function_ptr ndpi_debug_printf;const char *ndpi_debug_print_file;const char *ndpi_debug_print_function;u_int32_t ndpi_debug_print_line;#endif/* misc parameters */u_int32_t tcp_max_retransmission_window_size;u_int32_t directconnect_connection_ip_tick_timeout;/* 注册子协议处理函数数组*/struct ndpi_subprotocol_conf_structsubprotocol_conf[NDPI_MAX_SUPPORTED_PROTOCOLS + 1];u_int ndpi_num_supported_protocols;u_int ndpi_num_custom_protocols;/* 用于HTTP/DNS/HTTPS host 匹配*/ndpi_automa host_automa, /* Used for DNS/HTTPS */content_automa, /* Used for HTTP subprotocol_detection */subprotocol_automa, /* Used for HTTP subprotocol_detection */bigrams_automa, impossible_bigrams_automa; /* TOR *//* IP-based protocol detection */void *protocols_ptree;//部分协议的私有参数/* irc parameters */u_int32_t irc_timeout;/* gnutella parameters */u_int32_t gnutella_timeout;/* battlefield parameters */u_int32_t battlefield_timeout;/* thunder parameters */u_int32_t thunder_timeout;/* SoulSeek parameters */u_int32_t soulseek_connection_ip_tick_timeout;/* rtsp parameters */u_int32_t rtsp_connection_timeout;/* tvants parameters */u_int32_t tvants_connection_timeout;/* rstp */u_int32_t orb_rstp_ts_timeout;/* yahoo */u_int8_t yahoo_detect_http_connections;u_int32_t yahoo_lan_video_timeout;u_int32_t zattoo_connection_timeout;u_int32_t jabber_stun_timeout;u_int32_t jabber_file_transfer_timeout;#ifdef NDPI_ENABLE_DEBUG_MESSAGES#define NDPI_IP_STRING_SIZE 40char ip_string[NDPI_IP_STRING_SIZE];#endifu_int8_t ip_version_limit;#ifdef NDPI_PROTOCOL_BITTORRENTstruct hash_ip4p_table *bt_ht;#ifdef NDPI_DETECTION_SUPPORT_IPV6struct hash_ip4p_table *bt6_ht;#endif#ifdef BT_ANNOUNCEstruct bt_announce *bt_ann;int bt_ann_len;#endif#endif//默认协议结构体数组ndpi_proto_defaults_tproto_defaults[NDPI_MAX_SUPPORTED_PROTOCOLS+NDPI_MAX_NUM_CUSTOM_PRO TOCOLS];//分别是http、dns和网络方向探测允许标识位u_int8_t http_dont_dissect_response:1, dns_dissect_response:1,direction_detect_disable:1; /* disable internal detection of packet direction */};ndpi_flow_struct:携带一系列数据包组成的数据流信息,协议分析已经完成的部分信息都会保存在流中,当然也会保存部分协议分析器分析的私有数据信息struct ndpi_flow_struct {u_int16_t detected_protocol_stack[NDPI_PROTOCOL_HISTORY_SIZE];#ifndef WIN32__attribute__ ((__packed__))#endifu_int16_t protocol_stack_info;/* init parameter, internal used to set up timestamp,... */u_int16_t guessed_protocol_id, guessed_host_protocol_id;u_int8_t protocol_id_already_guessed:1, host_already_guessed:1, init_finished:1, setup_packet_direction:1, packet_direction:1;/*if ndpi_struct->direction_detect_disable == 1tcp sequence number connection tracking*/u_int32_t next_tcp_seq_nr[2];/*the tcp / udp / other l4 value unionused to reduce the number of bytes for tcp or udp protocol states */union {struct ndpi_flow_tcp_struct tcp;struct ndpi_flow_udp_struct udp;} l4;/*Pointer to src or dstthat identifies theserver of this connection*/struct ndpi_id_struct *server_id;/* HTTP host or DNS query */u_char host_server_name[192];/* Via HTTP User-Agent */u_char detected_os[32];/* Via HTTP X-Forwarded-For */u_char nat_ip[24];/* Bittorrent hash */u_char bittorent_hash[20];/*This structure below will not not stay inside the protosstructure below as HTTP is used by many subprotocolssuch as FaceBook, Google... so it is hard to knowwhen to use it or not. Thus we leave it outside for thetime being.*/struct {ndpi_http_method method;char *url, *content_type;} http;union {/* the only fields useful for nDPI and ntopng */struct {u_int8_t num_queries, num_answers, reply_code;u_int16_t query_type, query_class, rsp_type;} dns;struct {u_int8_t request_code;u_int8_t version;} ntp;struct {char client_certificate[48], server_certificate[48];} ssl;} protos;/*** ALL protocol specific 64 bit variables here ***//* protocols which have marked a connection as this connection cannot be protocol XXX, multiple u_int64_t */NDPI_PROTOCOL_BITMASK excluded_protocol_bitmask;u_int8_t num_stun_udp_pkts;#ifdef NDPI_PROTOCOL_REDISu_int8_t redis_s2d_first_char, redis_d2s_first_char;#endifu_int16_t packet_counter; // can be 0 - 65000u_int16_t packet_direction_counter[2];u_int16_t byte_counter[2];#ifdef NDPI_PROTOCOL_BITTORRENTu_int8_t bittorrent_stage; // can be 0 - 255#endif#ifdef NDPI_PROTOCOL_DIRECTCONNECTu_int32_t directconnect_stage:2; // 0 - 1#endif#ifdef NDPI_PROTOCOL_SIP#ifdef NDPI_PROTOCOL_YAHOOu_int32_t sip_yahoo_voice:1;#endif#endif#ifdef NDPI_PROTOCOL_HTTPu_int32_t http_detected:1;#endif#ifdef NDPI_PROTOCOL_RTSPu_int32_t rtsprdt_stage:2;u_int32_t rtsp_control_flow:1;#endif#ifdef NDPI_PROTOCOL_YAHOOu_int32_t yahoo_detection_finished:2;#endif#ifdef NDPI_PROTOCOL_ZATTOOu_int32_t zattoo_stage:3;#endif#ifdef NDPI_PROTOCOL_QQu_int32_t qq_stage:3;#endif#ifdef NDPI_PROTOCOL_THUNDERu_int32_t thunder_stage:2; // 0 - 3#endif#ifdef NDPI_PROTOCOL_OSCARu_int32_t oscar_ssl_voice_stage:3;u_int32_t oscar_video_voice:1;#endif#ifdef NDPI_PROTOCOL_FLORENSIAu_int32_t florensia_stage:1;#endif#ifdef NDPI_PROTOCOL_SOCKSu_int32_t socks5_stage:2; // 0 - 3u_int32_t socks4_stage:2; // 0 - 3#endif#ifdef NDPI_PROTOCOL_EDONKEYu_int32_t edonkey_stage:2; // 0 - 3 #endif#ifdef NDPI_PROTOCOL_FTP_CONTROLu_int32_t ftp_control_stage:2;#endif#ifdef NDPI_PROTOCOL_RTMPu_int32_t rtmp_stage:2;#endif#ifdef NDPI_PROTOCOL_PANDOu_int32_t pando_stage:3;#endif#ifdef NDPI_PROTOCOL_STEAMu_int32_t steam_stage:3;u_int32_t steam_stage1:3; // 0 - 4u_int32_t steam_stage2:2; // 0 - 2u_int32_t steam_stage3:2; // 0 - 2#endif#ifdef NDPI_PROTOCOL_PPLIVEu_int32_t pplive_stage1:3; // 0 - 6u_int32_t pplive_stage2:2; // 0 - 2u_int32_t pplive_stage3:2; // 0 - 2#endif#ifdef NDPI_PROTOCOL_STARCRAFTu_int32_t starcraft_udp_stage : 3; // 0-7#endif/* internal structures to save functions calls */struct ndpi_packet_struct packet;struct ndpi_flow_struct *flow;struct ndpi_id_struct *src;struct ndpi_id_struct *dst;};初始化ndpi的初始化在ndpi_init_detection_module()函数中,该函数申请好一个ndpi_detection_module_struct结构的空间后,初始化了一些协议的私有参数后就交给ndpi_init_protocol_defaults了。

BCMP报文分析

BCMP报文分析

③BCMP Server发送“注册应答”报文
BCMP Server端收到“注册请求”BCMP IP协议报文后,则按照IP地址分配规则给该设备分配管理IP地址,并 将管理VLAN、管理IP地址、默认网关等信息封装到报文中,发送“注册应答”BCMP IP协议报文 在BCMP proxy上打印消息或抓包验证“注册应答”报文格式与内容是否正确(在Server端无法抓取),报文 如下: [13-12-29]53 00 00 01 9B 56 00 9C 7C 08 D9 27 A9 1E 00 00 S....V..|..'.... ----------------应答报文 (HS MAC) [13-12-29]00 00 00 00 88 02 14 0E 0E 70 FF 00 00 00 14 01 .........p...... --------------- --------- ----管理ip 子网掩码 [13-12-29]01 01 00 14 02 00 A1 76 33 00 00 00 00 00 00 00 .......v3....... ----- ---- -----默认网关 管理V v2版本 V3 [13-12-29]00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ [13-12-30]Oct 27 10:58:59 %EBCMP-DEBUG-PACKET: BCMP_V5_RES::entry>manageModuleID = 1. [13-12-30]Oct 27 10:58:59 %EBCMP-DEBUG-PACKET: TX BCMP l2 packet on intf E10/14. rc = 0.

NDP报文(有更新)

NDP报文(有更新)

03114121516232431NDP 协议通用报文格式NDP 报文格式说明1.前一个首部的下一个首部字段值为582.每个分组的消息主体有各种字段组成。

可能包含很多选项字段特别说明:1.邻居发现分组的传播限制在单条链路内部。

这是通过为所有的邻居发现分组使用跳数限制值255来强制的。

由于来自链外街道的邻居发现分组的跳数限制小于255,所以,接收节点可以通过检测跳数限制字段来拒绝这种分组通用选项格式TLV邻居发现选项类型及格式报文类型 可能的选项路由器请求报文 源链路层地址路由器广告报文 源链路层地址、MTU 、前缀信息、路由信息邻居请求报文 源链路层地址邻居广告报文 目标链路层地址重定向报文 目标链路层地址和重定向首部源链路层地址选项目标链路层地址选项前缀信息选项2331MTU 选项2331路由信息选项233103114121516232431路由器请求报文格式03114121516232431路由器广告报文格式03114121516232431扩展的路由器广告报文格式03114121516232431邻居请求报文格式03114121516232431邻居广告报文格式03114121516232431重定向报文格式路由器请求报文说明1.作为NDP 分组,跳数限制为2552.源地址为分配给发送口的地址(不一定是LLA )或::,目的地址为ff02::23.发送端知道自己的链路层地址,就会在报文中包含源链路层地址选项4.如果源ip 是::,RS 中一定不能有源链路层地址选项。

5.接收端必须悄悄的忽略哪些不认识的和其他认识的选项,就是不产生任何ICMPv6错误报文,并继续对报文处理路由器通告报文说明1.作为NDP 分组,跳数限制为2552.源地址为LLA ,目的地址为ff02::1或RS 源端的单播地址3.主动发送和响应RS 发送。

当前跳数限制:要放入所有输出分组的IPv6首部的跳数限制字段的默认值。

NDP的各种报文

NDP的各种报文

Change in IPv6
New value of 6 Removed Traffic Class field Payload Length field Removed to Fragment header Removed to Fragment header Removed to Fragment header Hop Limit field Next Header field Removed Same, new 128-bit length Same, new 128-bit length Removed (extension headers)
介绍:该字段由传送路径上的每个节点和路由器读取并处理
用途:主要用于巨型数据包(RFC2675)和路由器警报(RFC 2711),
e.g :RSVP,MLD report etc) 报文格式: Next Header(8-bit):标识下一个包头 Hdr ext Len(8-bit):Hop-by-hop option的长度,不统计前1个字节
IPv6 NDP
1.相关模块:
Router/Prefix Discovery Address Autoconfigration Duplicate Address Detection Address Resolution Host Sending algorithm (for host) Neighbor Unreachability Detection Redirect
2.需要用到的地址类型:
节点组播地址(FF02::1) 节点组播地址 路由器组播地址(FF02::2) 路由器组播地址 被请求节点组播地址(FF02::1:FFXX:XXXX) 被请求节点组播地址 本地链路地址(FE80::/10) 本地链路地址 未指定地址(::) 未指定地址

OpenDPI-源码分析

OpenDPI-源码分析

OpenDPI-1.3.0源代码分析:1.OpenDPI_demo中的main函数:该main函数主要由七个子函数组成,他们分别为:1.1parseOptions:处理给定的参数,比如运行时指定的:-f ./http.pcap,分析参数是否正确。

该函数不是非常重要,但如果我们改写程序时想要程序能有新的功能,可以在这里添加类似开关的代码,如定义一些宏。

1.2setupDetection:非常重要的初始化函数,其会的初始化整个程序的最重要的数据结构:ipoque_struct,所有协议的回调函数都是在这里进行绑定的,下面两个函数会的进行重点分析:除了初始化ipoque_struct外,还会的给几个全局变量分配内存,这些全局变量包括:osdpi_ids:所有id对应的变量,每个id用来连接一个IP与一个表示该IP的IDosdpi_flows:所有flow对应的变量,每个flows用来连接一个flow与一个表示该flow 的KEYprotocol_counter,protocol_counter_bytes:与协议相关的计数器,类型为数组1.3openPcapFile:常规的打开pcap文件1.4runPcapLoop:处理pcap的主循环,这个程序的灵魂,其会的最终通过回调函数来调用各个协议的分析函数。

1.5closePcapFile:常规的关闭pcap文件1.6printResults:输出统计结果的数据,请注意观察下面的两个循环:你会发现最终我们的结果存在与prot_long_str,protocol_counter,protocol_counter_bytes以及osdpi_flows这几个全局变量中,所以这几个变量我们在分析的时候需要着重分析。

这些全局变量的初始化详见1.21.7terminateDetection:处理程序的善后工作,比如free掉我们在1.2里建立的那几个全局变量。

换句话说,如果我们在程序运行中间使用了ctrl+c中断了程序,那么就会造成内存泄漏。

osip源代码框架详解

osip源代码框架详解

Osipणᩲ⑤ҷۅḚᶊ᪪ᢧPrepared by Mao minghua Date2009.09.25Reviewed by DateApproved by DateRevision HistoryVersion Author Reviewed By Comments Issued Date 0.1Mao minghuaᦣẴosipֲᔩ৪োঞ෭ݭ4Ẵ4OSIP ࣙՈ⑤ᵤ53.1osip Ոtransaction Ոevent Ոѻ53.1.1ᯊ఼Ոѻẋ࣏63.1.2থՈџ73.2osip Ոtransaction Ոevent ˊ⌕73.2.1ICT Ո໘ˊ⌕83.2.2IST Ո໘ˊ⌕93.2.3NICT Ո໘ˊ⌕93.2.4NIST Ո໘ˊ⌕93.3Osip Ոᢧᵤ103.3.1sip णᩲՈᢧᵤᭈˊ⌕103.3.2Osip Ոᢧᵤ123.3.3uri Ոᢧᵤ143.3.4ϾᮄՈणᩲheader153.4osip Ոtransaction Ո੥ˊ163.5osip Ёdialog Ո੥ˊ18EXOSIP ࣙՈ⑤ᵤ194.1Lib Ո߱࣪੠⏄204.2Lib ՈЏˊඃ234.2.12xx ᑨਘՈₑথ໘ˊᴎࠊ244.2.2Exosip_execute 244.2.2.1Exosip_read_message Ո໘ˊ264.2.2.2eXosip_process_response_out_of_transaction Ո໘ˊ⌕˖294.2.3eXosip_automatic_action ˊ⌕294.3Call Ո໘ˊ304.3.1Call ՈৰϾINVITE 304.3.2INVITE ՈACK ᑨਘՈ߯੠থễ324.3.3dialog ݙՈ᪻Ո߯੠থễ334.3.4Dialog ݙanswer Ո߯੠থễ334.4Register Ո໘ˊ344.4.1Ͼ᳡ࡵ఼354.4.2Ͼ⊼Ո⊼ᯊᯊⒸ354.4.3থễϾregister35Osip⑤ҷۅḚᶊ᪪ᢧ෭ݭЁ᭛ICT Invite Client Transaction ,QYLWHିIST Invite Server Transaction ,QYLWHିNICT Not Invite Client Transaction ☢,QYLWHିNIST Not Invite Server Transaction ☢,QYLWHିIMS IP Multimedia Subsystem IPPSVT Packet service video telephony SIP Session Initiation Protocol UDP User Datagram Protocol URLUniform Resource LocatorՈosipणᩲЎϸϾ⑤ࣙˈᭈϾणᩲϬlibՈᔶˈ೼ݙᾬϬࠄӏࡵˈ₋ϢTCP/IPणᩲՈਚˈ᠔ҹ೼ՓϬϞˊӏࡵָϬlibՈ᥹ষDŽ಴Ў೼Lib ݙᾬϬࠄڣᯊ఼ǃথễ਍Ոӏࡵˈ໐ৠᯊ◄Ϭࠄᅮᯊ఼ˈ᠔ҹ೼lib ՈݙᾬϬḲՈᮍϡذՈẔᰃ৺ᯊ఼ᯊˈẝ೼ᶤCPUՈܕᯊⒸDŽৠᯊᭈϾlibɴњᇍcall, notify਍Ո੥ˊˈЎњɴₑܹˈ೼ᑨϬਃϬ໮ՈᴵϟˈݙᾬϬՈֵোₓ੠⏅ՈՓϬˈ೼ϟ☦ՈߚᵤЁϡ⍝ঞࠄֵোₓ੠⏅ࠊDŽLibsipणᩲՈሖЎϸϾlibࣙˈᑩՈosip libࣙᅲɴᇍऩϾ᪻ǃᑨਘǃACK Ո໘ˊˈࣙᣀmessageՈᢧᵤǃᣐǃݙᆍset ੠getˈऩϾ᪻Ոtransactionּ᪡԰ҹঞỞ঳ᔶՈϔϾdialogՈ᪡԰DŽLibՈexosip lib೼ᑩosip libՈᅲɴ෎ˈᅲɴᇍsipणᩲˊỿՈ੥ˊDŽExosipՈᰃsipणᩲՈϮࡵ⌕ˈࣙᣀcallՈᭈˊˈnotifyՈᭈˊˈpublishՈ੥ˊˈregisterՈ੥ˊˈoptionՈ੥ˊˈreferՈ੥ˊ੠subscriptionՈ੥ˊˈ݊Ё᳔ՈЎcall ੠registerՈ੥ˊˈẝϸϾЎsipणᩲɴՈᾬˈ঺Ͼࡳ࿁ЎsipणᩲDŽҢẝ޴ϾϮࡵՈ੥ˊ⌕থˈ೼ϮࡵՈᑩϬࠄּԐՈϔѯࡳ࿁ˈབ⊼Ոᩨˈথễmessageˈ᥹messageˈ↣Ͼ᪻੠ᑨਘᔶՈtransactionˈ໮Ͼtransaction໐៤ՈdialogDŽ೼messageՈ໘ˊᮍˈৃҹߚЎϸˈϔЎথễՈmessageˈ಴ЎᰃЏথễˈ᠔ҹϞˊሖᰃҔՈmessage ˈlibষկϬDŽϔЎ᥹ࠄՈmessageˈ಴Ўϡکᰃાˈ᠔ҹ◄ᵤߎᴹՈmessageՈֵᙃᴹẟᜐˊˈẝᾬՈ໘ˊ೼udp.cЁDŽϾlibՈ߱࣪೼exOsipЁҟDŽ Osip Ո⑤೼osipࣙЁ᳔ՈࣙᣀmessageՈּ݇᪡԰ˈ݊Ё᳔ₑᡅՈЎmessageՈᢧᵤˈेҢቻࠄՈϔϾmessageЁᢧᵤϣϾ࿁ˊՈmessage᭄᥂ᵘˉüosip_message_tDŽϢmessageᵘּ݇Ո᪡԰ࣙᣀmessage᭄᥂ᵘՈֵᙃᅝsipणᩲϾmessage৪І˗messageᵘՈ߱࣪੠₎˗messageᵘՈᣋ᪡԰˗ҹঞҢmessageᵘЁቻᵤՈ៤Ոؐ੠᪂า৘Ͼ៤ՈؐDŽ೼messageՈᢧᵤᾬˈ┨њmessageՈ༈໪ˈẜࣙᣀbodyՈᢧᵤˈ⍝ঞࠄsdpणᩲˈࣙᣀᇍ↣Ͼsdp ՈᢧᵤDŽ೼osipࣙЁˈ᪂ϾϢৠϔϾּ᪻݇Ո᠔᳝messageՈ▊transaction ˈ೼থễ៪᥹ࠄϔϾᮄՈ᪻Ոᯊ׭Ͼtransactionˈ݊ЁACK੠CANCEL ᰃ↨ṇĽ⅞Ոˈᇍ2xxᑨਘՈACK੠߱INVITEᰃৠϔϾtransaction Ոˈ໐ᇍ2xxՈ᪻ᰃՈtransactionՈˈ᠔ҹ݊ₑ᪡԰ϵUACᴹࠊˈ໐ϡ೼INVITEՈtransactionݙᾬẟᜐࠊDŽCANCELՈ᪻┨њᴀᵯϾtransaction ໪ˈḍणᩲCANCELՈ᪻Ոtransaction ˈབࡳӮCANCELּᑨՈtransactionDŽ೼osipࣙЁৠḋdialogּ݇᪡԰ˈࣙᣀdialogՈᓎˈdialogᙃՈᄬˈdialogՈঞ┨਍᪡԰DŽ݊ᅗˈࣙᣀЁՓϬࠄՈ⏅੠ֵোₓঞֵোˈݙᾬϬࠄՈˈϬՈⓣ(ẟ)ˈϔѯՈˈᅮᯊ఼ҹঞ਍ՈᅮDŽẝᾬ↨ṇ੄ˈ໐ᰃ᳔ߑ᭄ˈָϬሖDŽ .1osip Ոtransaction Ոevent ՈѻtransactionՈ࣪ᰃϵᴹՈˈᔧtransactionᯊˈḍՈ੠ᔧࠡtransactionՈᴹ໘ˊ᪩eventDŽTransactionՈџЎϸ˖ϔЎᅮᯊ఼ˈ೼᪂Ոᅮᯊ఼ᯊᯊӮּᑨՈᅮᯊ఼˗঺ЎџˈབথễϾ᪻ǃᑨਘ៪᥹ࠄϔϾ᪻ǃᑨਘˈথễϾACK੠᥹ࠄϔϾACKˈेᰃϵՈџDŽ .1.1ᯊ఼Ոѻẋ࣏ICT ǃIST ǃNICT ੠NISTՈᅮᯊ఼ՈџˈᇍϾtransactionˈ݊ᅮᯊᰃ᳝ՈˈICTЁTIMEOUT_B ՈˈTIMEOUT_Bᯊ఼থˈӮথkill transactionՈ᪡԰DŽᔧtransactionffЁ᳝ˊՈџᯊˈϡ໘ˊᅮᯊ఼ˈָಲˈ᠔ҹ೼transactionffЁՈџՈ᭄ₓᰃϡ໮ՈDŽ᠔᳝Ոᅮᯊ఼ߑ᭄᫇ϬᑩৠϔϾᅮᯊ఼ߑ᭄__osip_transaction_need_timer_x_event DŽ᪩ߑ᭄Ӯ᪩ᯊ఼ᰃ৺ˈЎ(timer->tv_sec == -1)ˈབˈẔᔧࠡᯊⒸᰃ৺ẋᅮᯊ఼Ё᪂ՈᯊⒸˈབᰃˈ߭Ոᅮᯊ఼DŽЎᅮᯊ఼ϾऩՈӏࡵˈ᠔ҹᰃ₋Ոᮍᰃ৺Ոᅮᯊ఼ˈ໐ϡᰃḍᯊЁẟᜐˈ಴↨ṇऴϬிDŽᯊ఼Ոਃ੠Ϭ᥹ষosip_gettimeofday ੠add_gettimeofdayDŽᯊ఼Ո᱉ᯊᯊⒸˈे᪂ϾᮄՈᅮᯊ఼DŽপϾᅮᯊ఼ˈᯊ఼Ոtimer->tv_sev Ў-1DŽ .1.2থՈџࣙᣀϾᮄՈinvite ǃresponse ǃackՈথễ៪᥹ˈ┨њᇍ2xxՈᑨਘack໪ˈ݊Ո੠ᑨਘϾᮄՈtransactionˈϾᮄՈsipeventDŽ .2osip Ոtransaction Ոevent೼sip णᩲЁЎњՈ໘ˊtransactionˈḍणᩲՈᦣẴˈЎϡৠՈtransactionˈߚЎICT ǃIST ǃNICT ੠NISTDŽϡৠՈtransactionϡৠՈ໘ˊ⌕੠ˈҹঞՓϬࠄϡৠՈᅮᯊ఼DŽICT ǃIST ǃNICT ੠NISTՈߑ᭄໘ˊᮍˈЎˊ੠ՓϬ⊼ߑ᭄ˈ⑤ЁՓϬњϾܼˊϡৠିtransactionՈ˖ict_fsmǃist_fsm ǃnist_fsm ੠nist_fsmDŽosipᵘབϟ˖struct osip {void *application_context;/**< User defined Pointer *//* list of transactions for ict, ist, nict, nist */osip_list_t osip_ict_transactions;/**< list of ict transactions */osip_list_t osip_ist_transactions;/**< list of ist transactions */osip_list_t osip_nict_transactions;/**< list of nict transactions */osip_list_t osip_nist_transactions;/**< list of nist transactions */ĂĂ}ˊ⌕བϟ೒˖೒ 5-1˖transactionՈevent.2.1ICTՈ໘ˊ⌕བϞ೒ˈICT ˊᯊ˖3)osipˊ඗ᵘЁՈosip_ict_transactionsˈབˈָಲOSIP_SUCCESS5)ЁϾ᭄ˈᄬtransactionࠄᯊ᭄ඈ10)᠔᳝transaction ˈosip_fifo_trygetϾtransactionЁՈџˈ᫇Ϭosip_transaction_executeˊ↣Ͼџˈָࠄ᠔᳝transactionЁՈ᠔᳝ˊˈಲDŽOsip_transacton_execute ᯊˈḍՈ᭄osip_transaction_t * transactionЁՈtransactionde ࠄՈܼˊবict_fsmˈevent Ոtype੠transactionՈϬfsm_callmethod೼᭛fsm_misc.cˈᰃߑ᭄ՈষüࠄeventՈ໘ˊߑ᭄ˈϬ໘ˊߑ᭄ẟᜐeventՈ໘ˊDŽICTՈּ݇eventՈ⊼ˊߑ᭄೼ict_fsm.c੠ict.cDŽICTϬࠄњ3Ͼᅮᯊ఼˖TIMEOUT_A ǃTIMEOUT_B ੠TIMEOUT_DDŽ೼client঳থễInvite໐◄ՈICT ՈtransactionᯊˈTIMEOUT_BˈᯊЎ64*DEFAULT_T1(DEFAULT_TI Ў500ms)ˈTIMEOUT_BЎᭈϾtransactionՈϣᯊˈབẋẝϾᯊⒸˈtransactionDŽབৠϬՈᰃ≵ՈUDPˈ߭าTIMEOUT_A ˈTIMEOUT_DՈⒸ╘ᯊⒸЎDEFAULT_T1੠64* DEFAULT_T1DŽབϬՈᰃ☦ՈTCPঞּ݇णᩲˈ߭ϬTCPݙᾬՈₑࠊˈϡ೼SIPणᩲՈࠊˈ᠔ҹϡਃTIMEOUT_A ੠TIMEOUT_D DŽTIMEOUT_AˊInviteՈˈ೼Inviteথễᯊˈਃᯊ఼TIMEOUT_Aˈ೼᱉ᯊᯊⒸݙẜࠄresponseՈᯊ׭ˈₑথ᪩Invite DŽTIMEOUT_DϬˊACKˈᔧࠄՈresponseϡᰃ>˙300ᯊˈclient঳থễACKˈᔧₑࠄ᪩invite Ոresponseᯊˈₑথ᪩ACKˈserver঳೼killtranctionࠄACKDŽ .2.2IST Ո໘ˊ⌕ৠICT Ո໘ˊ⌕ˈ໘ˊosipЁՈosip_ist_transactionDŽISTՈּ݇eventՈ⊼ˊߑ᭄೼ist_fsm.c੠ist.cDŽISTϬњᯊ఼TIMEOUT_GǃTIMEOUT_H੠TIMEOUT_IDŽՓϬᮍϢICTLˈणᩲDŽ .2.3NICT Ո໘ˊ⌕ৠICTՈ໘ˊ⌕ˈ໘ˊosipЁՈosip_nict_transactionDŽNICTՈּ݇eventՈ⊼ˊߑ᭄೼nict_fsm.c੠nict.cDŽNICTϬњᯊ఼TIMEOUT_EǃTIMEOUT_F ੠TIMEOUT_KDŽ .2.4NIST Ո໘ˊ⌕ৠICTՈ໘ˊ⌕ˈ໘ˊosipЁՈosip_nist_transactionDŽNISTՈּ݇eventՈ⊼ˊߑ᭄೼nist_fsm.c੠nist.cDŽNISTϬњᯊ఼TIMEOUT_JDŽ .3OsipՈᢧ.3.1sipणᩲՈᢧᵤᭈˊ⌕ᔧࠄϔϾmessageՈᯊ׭ˈ◄ᵤ᪩messageˈϣϾҷˊՈ᭄᥂ᵘˈ᪩ᵘᅮЎstruct osip_messageˈ᪩ᵘᅮՈϔϾmessageՈּܼ݇ᙃˈẝѯֵᙃЏᰃկtransaction੠dialogঞdialogՈབcallˈnotify਍ՈՓϬDŽᇍϔϾmessageՈᢧᵤ⌕བϟ೒᠔˖೼᥹ࠄϔϾmessageᯊˈ᫇Ϭߑ᭄osip_message_parseẟᜐmessageՈᢧᵤDŽϬߑ᭄osip_util_replace_all_lws messageЁՈɴՈ ‘\r\n\tÿǃþ\r\tÿǃþ\n\tÿǃþ\r\n ÿǃþ\r ÿǃþ\n ÿЎˈmessageᰃҹþ\0ÿЎ඗ՈˈmessageՈheaders੠ᰃҹ’\r\n\r\n’ЎՈˈࠄ’\r\n\r\n’Ўˈेheaders bodyՈߚɴՈ\t ǃ\r ǃ\nDŽϵѢsipणᩲˈ↣Ͼheadersᰃˈ໐Ո༈Ͼᄫ৪ϡЎ៪\tˈ᠔ҹϸϾheaderՈ\r\nϡӮˈՈᰃϔϾܕmultiՈheaderՈݙᾬϾؐПՈĀ\r\n\tā៪Ā\r\nāDŽབϟ˖᳝Ͼheaderˈ݊ЁSubject Ͼؐߎɴˈ RouteϾؐߎɴˈ໐ˈᰃߚҹ៪\tˈ໐Subject ੠Routeˈᰃ៪\tՈˈosip_util_replace_all_lwsߑ᭄ᇚRoute header valueЁՈϸՈ\r\n\t࣪Ўˈे೼ỿЎϔDŽSubject: Lunchute: <:a ce@tl nta co <:bo b@bi co<sip:carol@>Ͼmessageϵϝˈᰃmessage Ոstartlineˈ᪩ẝᰃϔϾsipՈmessage ˈࣙᣀsipˈ᪻៪ᑨਘˈؐˈҹ\r\nЎ੠headersՈߚ╘৪DŽ᪩\r\nϡӮosip_util_replace_all_lwsЎˈབ᪻ՈINVITE sip:bob@IP .0៪ᑨਘՈIP .0 200 O ˈ೼ϾϾDŽՈᢧᵤϵosip_me ssa st lin pa se ẟᜐᵤˈᢧᵤࠄme ssa Ոିˈme ssa Ոsipv sionҹঞme ssa Ոst s_cod ˈᔧst s_cod Ў߱࣪ؐ0ᯊˈ᪩me ssa ЎϔϾ᪻ˈ৺߭ЎᑨਘDŽ᪻Ոst lin ϵosip_me ssa st lin pa se ẟᜐᵤˈࠄ᪻Ոst i;ᑨਘՈst lin ϵosip_me ssa st lin pa se spẟᜐᵤDŽlin ՈᢧᵤᰃɴՈϾՈẟᜐᵤՈˈᇚᵤ඗ᄬ೼osip_me ssa Ո඗ᵘЁDŽᵤme ssg Ոsˈ᫇Ϭߑ᭄ msg s_pa seDŽosipՈᵤDŽབmessageЁ೼headersϡᰃ඗৪’\0’ˈ߭ණᵤmessageՈˈ᫇Ϭߑ᭄msg_osip_body_parseẟᜐᵤDŽMessage ՈbodyᵤheadersᵤЁᄬՈcontentेbodyՈ˖content_type ˈབcontent_typeЁՈtypeϡЎmultipartˈेϡmimeՈcontentˈbodyЁህϾˈָᇚϾbodyᵤЎϔϾݙᆍ˗བtype ЎmultitypeˈϾՈbody೼ϔϾᭈՈbodyˈ߭ҹ”--”Ўߚ╘৪ᢧᵤbodyˈᇚbodyЎ໮ϾmimeՈᄫ৪Іˈ↣ϾᢧᵤՈbodyݙᆍᄬ೼osip_messageᵘЁՈbodiesᵘ៤ЁDŽ .3.2OsipՈᢧᵤ೼ᢧᵤmessage ՈheaderՈᯊ׭ˈ಴ЎՈosip_util_replace_all_lws࣪њϾheaderݙᾬɴՈ\rǃ\n ੠\tЎˈ᠔ҹ↣ϾheaderҹՓϬ\r\nЎߚ╘৪ẟᜐ╘DŽབ৪Іstart_of_headerࠄ৪”\0”ˈ߭headerᵤˈಲࡳ˗᫇Ϭ__osip_find_next_crlfࠄẝϾheaderՈ඗৪ᄬ೼end_of_headerЁ˗བstart_of_headerЎ\r៪\nˈ߭ᵤࠄ\r\n\r\n ेheadersՈ඗৪Іˈ߭ẘಲࡳˈᄬstart_of_header ࠄbodyЁˈेbodyᰃҢ\r\n৪ІᵤՈˈ᠔ҹ೼bodyᵤᯊˈ◄ẋ\r\nঞПՈ˗ḍheaderݙᾬ╘৪Ā˖āˈপheaderՈhname ੠hvalueˈ݊Ёhvalue೼ᶤѯhnameՈϟᰃܕЎՈˈϬosip_message_set_multiple_headerᴹᵤ᪩headerՈhvalue৪І˗ᢧᵤ៤ࡳˈาstart_of_headerЎᏆᵤՈheaderՈend_of_header ˈᓔᵤϟϔϾheaderDŽ೼osip_message_set_multiple_headerЁˈᇚheadersЎϸˈϔབϞЁՈSubjectˈϾؐˈ߭Ϭosip_message_set__headerẟᜐᵤ˗ϔབϞЁՈRouterˈܕϾؐˈḍsipणᩲˈ↣ϾؐПҹĀˈāẟᜐ╘ˈ᠔ҹ◄Ͼhvalue৪Іˈḍ”,”ᇚhvalue╘Ͼؐˈ↣Ͼؐ᫇Ϭosip_message_set__header ẟᜐᵤᄬᵤ඗ࠄosip_messageՈ᭄᥂ЁDŽ಴ЎhvalueϬোᇚؐᴹˈ᠔ҹ◄Ľ߿ˊĀˈāᰃ৺ɴ೼োݙᾬՈDŽ೼ো໪ᾬՈĀˈāᠡᰃheaderؐՈߚ╘৪ˈ໐ݙᾬՈĀˈāাᰃϔϾheaderؐՈϔDŽosipЁosip_message_set__headerᇍmessage headersՈᢧᵤ₋Ϭ⊼ߑ᭄Ոᮍɴˈ₋Ϭẝ࢑೼ᴀᕜՈẟᜐՈheaderՈ⏏ˈϡӮࠄᭈϾՈḚDŽOsip_parser_cfg.cЁᅮheaderᵤ᠔ՓϬࠄՈܼˊব˖static__osip_message_config_t pconfig[NUMBER_OF_HEADERS];__osip_message_config_tՈ඗ᵘᅮབϟ˖typedef struct ___osip_message_config_t {char *hname;int (*setheader) (osip_message_t *, const char *); int ignored_when_invalid;}__osip_message_config_t;hname ЎsipणᩲՈ༈Ոᄫ৪Іˈẝѯᄫ৪І೼osip_const.hЁ˗ߑ᭄setheaderЎ᪩णᩲheaderՈᇍᑨՈᢧᵤߑ᭄˗ignored_when_invalid Ўᰃ৺᪩header ᵤՈˈ᪩ᷛؐЎ1ᯊˈ೼ᢧᵤ᪩णᩲheaderথễᯊˈ᪩⏝ˈ┨sipणՈ޴Ͼᖙheader ໪ˈ݊ᑨ᪩ϬDŽЎњՈḍheaderՈhnameˈࠄᇍᑨՈsetheaderᵤߑ᭄ˈ₋ϬњhashՈᶹˈḍhnameϾhashؐˈϾϡৠՈhnameᇍᑨࠄৠϔϾhashؐЁˈҹᦤՈDŽ᫇Ϭ__osip_message_is_known_header (hname)ࠄ೼᭄ඈЁՈindex,Ϭ__osip_message_call_method (my_index, sip, hvalue)ᵤणᩲheaderˈᵤՈᄬ೼඗ᵘosip_message_t * dest,ЁDŽϾheaderࣙ৿ϾỞϬՈ᪡԰˖header৪ІՈᢧᵤߑ᭄ˈेϞࠄՈosip_message_set_xxxᵤߑ᭄˗headerᵤՈ඗ᵘՈቻߑ᭄ˈosip_message_get_xxxߑ᭄˗ḍheaderᵤՈ඗ᵘϣ৪ІՈߑ᭄˖osip_xxx_str˗headerᵤՈ඗ᵘՈcopyߑ᭄osip_xxx_clone ˗headerᵤՈ඗ᵘՈᰃ৺ߑ᭄˖osip_xxx_free˗ҹঞheaderᵤ඗ᵘՈ߱࣪ߑ᭄˖osip_xxx_init DŽᇍ↣ϾheaderՈ޴Ͼּ݇᪡԰᳔ՈᰃᦤणᩲՈᭈϾheaderՈᭈ᪡԰ˈࣙᣀosip_message_init ˈosip_message_free ˈosip_message_clone ੠osip_message_parse DŽ .3.3uriՈᢧᵤՈheaderՈᢧᵤᰃּՈˈ݊Ё᭄᳝ՈᾬՈheaderՈᢧᵤӮ↨ṇ໡ᴖˈ᳔Ո᳝from ǃto ǃcontact਍ˈ಴Ў┨њᴀᵯ᭄П໪ˈ݊ؐЁՈrequest_uriᴀҹࣙ৿᭄ˈ໐ẝϸ᭄Пᰃ᳝ՈDŽSipणᩲheaderՈЎ header’s name, header’s value ੠header’s parameterDŽ݊Ёname ੠valueϬĀ˖ā╘ˈvalue ϢparameterϬĀ˗ā╘ˈparameterϬĀ˗āּߚ╘DŽ೼඗ᵘᅮЁheaderՈvalueheaderࣙ৿ՈֵᙃẟᜐᵘবՈᅮˈ໐བࣙ৿parameter߭Ͼgen_params Ոˈ᠔᳝Ոparameterᄬ೼ẝϾЁDŽབϟ☦fromՈᅮˈࣙ৿fromՈৡঞϔϾurlˈঞּ݇Ոparameter˖struct osip_from {char *displayname; /**< Display Name */ osip_uri_t *url; /**< url */osip_list_t gen_params; /**< other From parameters */ };ᇍᑨparameter ՈᢧᵤָϬ__osip_generic_param_parseallˈ᪩ߑ᭄ᢧᵤheaderՈऩϾhvalue৪ІЁࣙ৿Ո᠔᳝parameter ˈ೼ߑ᭄ݙᾬĀ˗āᇚ৪ІЎ޴Ͼparameterˈᵤ↣Ͼparameter ˈᇚᵤ඗ᄬ೼gen_paramsЁDŽParameterՈЎpname=pvalue ˈ਍োϸDŽFrom ǃto ǃcontactҹঞviaЁⒸɴurl DŽurlՈᢧᵤ᥹ষЎosip_uri_parseˈЎurlՈᄫ৪ІˈᢧᵤՈ඗ᵘᄬ೼඗ᵘosip_uri_tЁDŽurlࣙ৿ݙᆍ˖urlՈ෎ᴀᙃˈurl Ոheader੠urlՈ᭄ᾬDŽᓔϢheaderϬĀ?āẟᜐ╘ˈheaderϬ”&”ẟᜐ╘ˈheaderϢ᭄ᾬϬ”;”ẟᜐ╘ˈ᭄ПϬĀ˗āẟᜐ╘DŽHeaderϬߑ᭄osip_uri_parse_headersẟᜐᵤˈ඗ᄬ೼osip_uri_tᵘЁՈurl_headersЁ˗parameterϬߑ᭄osip_uri_parse_paramsẟᵤˈ݊඗ᄬ೼osip_uri_t Ոurl_paramsЁDŽ೼from ǃto ǃcontact ਍ࣙ৿url ՈheaderЁˈབurlЁࣙ৿parameterˈ߭ϾurlϬĀ<āĀ>āᴹˈҹϾurlDŽ᠔ҹᢧᵤfrom ਍headerᯊ◄ᰃ৺ࣙ৿”<”৪DŽ .3.4ϾᮄՈणᩲheader1)ϾϔϾᇍ᪩ẟᜐᵤՈ᭛ˈ2)ࣙ৿ϾheaderϬࠄՈ޴ϾᴀϬ᪡԰ˈ3)བ᪩headerĽ⅞Ոˊˈ4)ּ݇Ո໘ˊߑ᭄ˈ5)6)Ўosip_xxx.c ੠osip_xxx.h7)೼parser_initЁ⊼ՈheaderՈᢧᵤߑ᭄ˈ8)static__osip_message_config_t pconfig[NUMBER_OF_HEADERS]ЁՈNUMBER_OF_HEADERS ؐDŽ9)೼osip_const.hЁ⏏ՈheaderՈˈ10)osipՈּ݇Ո೼᪩11)೼osip_message.cosip_message_initߑ᭄Ё⏏ᇍ᪩headerּ݇ᵘՈ߱࣪᪡԰DŽ೼osip_message_freeߑ᭄Ёৠ12)ᇍ᪩headerՈּ݇᪡԰ˈ13)೼osip_message_cloneЁ⏏ᇍ᪩headerՈcloneּ݇᪡԰DŽ14)೼osip_message_to_str.cЁՈ_osip_message_to_strߑ᭄Ё⏏᪩header࣪ЎstringՈߑ᭄⊼DŽ15)བ᪩headerϡ16)ₑ17)Ͼߎɴˈ18)ेϡ19)multiple headerˈ20)߭೼osip_message_parse.cՈ osip_message_set_multiple_headerߑ᭄Ё⏏ᇍ᪩headerՈ໘ˊDŽ21)೼osip_message.hՈ༈ЁՈosip_messageᵘЁ⏏ᇍ᪩headerՈ඗ᵘDŽ22)೼osip_headers.hЁ⏏ՈheaderՈ༈ϬDŽ .4osip ՈtransactionՈ੥transaction Ո᪡԰Џࣙᣀtransaction Ո߱࣪ǃtransaction Ոfree ǃtransactionՈǃҢtransactionЁቻᙃ੠᪂าtransactionᙃDŽsipणᩲẴϔϾtransaction ϵ5Ͼᖙ˖from ǃto ǃtopviaǃcall-id ੠cseqˈẝ5ϾᾬϾtransactionˈབˈ᪩transactionาDŽ᠔ҹᇍ↣ϾᾬՈ᪂าϾ᪂าߑ᭄˖__osip_transaction_set_topvia Ϭาtopviaˈᇍথễ঳topviaЎՈviaˈᇍ঳topviaЎᇚmessageথࠄՈ᳔Ͼsip-proxyࡵ఼ˈ__osip_transaction_set_fromϬาmessageՈথễ঳ˈ__osip_transaction_set_toϬาmessageՈ᥹঳ˈ__osip_transaction_set_call_idϬาϾdialogՈؐˈ᪩ؐᰃՈˈᯊⒸݙϣՈcal_idᰃϡּৠՈˈ__osip_transaction_set_cseqϬาcseqؐˈ᪩ؐ೼ৠϔϾdialogݙᾬᰃϔՈˈेৠϔϾdialogՈՈtransaction Ոcseq↨ࠡՈtransaction Ոؐˈᣝsipणᩲ݊ؐৃҹᰃ᭄ˈҷɴЁབᰃregisterˈҢ1ˈབᰃregisterՈdialogˈҢ20DŽTransactionՈ߱࣪থϣ೼᥹ࠄϔϾᮄՈ᪻៪থễϾ᪻Ոᯊ׭ˈ᪩ҹঞẋᢧᵤ៤ЎϔϾৃҹָϬ᪻ᙃՈ඗ᵘosip_message_tDŽ݊߱࣪ẋ࣏བϞ᠔Ẵˈ೼᪂า5Ͼᾬˈẜ࣪eventՈⓣˈҹঞḍosip_message_t Ոtype ࣪ՓϬࠄՈᅮᯊ఼ᵘˈབICT Ոict_contextDŽ݊ᅗՈ߱࣪೼exosip Ёᅲɴˈּ݇Ոབyour_instance ǃin_socket ǃout_socket ੠recordᰃexosipЁᇍtransactionՈ੥ˊ໐᪂าՈDŽTransaction ЁՈeventՈּ݇᪡԰೼བ᠔ẴDŽ೼transactionՈЁˈḍRFC3261Ո᳔sipणᩲՈᦣẴˈϵtopviaՈbranch_idᰃ৺ּৠᴹˈབּৠˈህᰃৠϔϾtransactionՈ᪻੠ᑨਘঞACKˈЎᆍᴀՈtransactionՈ߭ˈৠᯊcall_id, cseq, from_tag, to_tag ᴹtransactionDŽབϟ೒ˈЎˊՈtransactionˈ᠔᳝Ոtransaction೼osip_tᵘՈЁˈᣝˊՈϡৠߚЎথễՈINVITE੠ᑨਘǃ݊ᅗ੠ᑨਘˈ᥹ࠄՈINVITE੠ᑨਘǃ݊ᅗ੠ᑨਘDŽstruct osip {void *application_context; /**< User defined Pointer */ /* list of transactions for ict, ist, nict, nist */osip_list_t osip_ict_transactions; /**< list of ict transactions */ osip_list_t osip_ist_transactions; /**< list of ist transactions */ osip_list_t osip_nict_transactions; /**< list of nict transactions */ osip_list_t osip_nist_transactions; /**< list of nist transactions */……#if defined(HAVE_DICT_DICT_H)dict *osip_ict_hastable; /**< htable of ict transactions */ dict *osip_ist_hastable; /**< htable of ist transactions */ dict *osip_nict_hastable; /**< htable of nict transactions */ dict *osip_nist_hastable; /**< htable of nist transactions */#endif };೼transactionՈẋ࣏ЁˈབᰃথߎՈ᪻ˈ಴ЎᴀഄՈtransactionϾϡₑՈtransaction_idˈ᠔ҹ↨‑transaction_idेৃ˗ᇍincoming Ոmessage,བᰃrequest ˈ߭ऍbranch_id៪ЎᆍᴀẟᜐtransactionՈ↨‑ˈᣝणᩲRFC3261Ո17-2-3Ոᮍẟᜐ˗བincoming Ոmessage ᰃresponseˈ߭ऍbranch_id៪ḍRFC3261Ո17-1-3Ոᢈ߭ẟᜐDŽ.5osip ЁdialogՈ੥dialogՈּ݇Ո੥ˊ᪡԰ࣙᣀdialogՈ߱࣪ᓎẋ࣏ˈdialogՈ⏄freeẋ࣏ˈҹঞdialogՈDŽ໪dialogЁᄬּ݇Ոϵᙃ੠cseqᙃDŽDialogᵘབϟˈϵcall_id ǃlocal_tag ੠remote_tagϾdialog˖struct osip_dialog {char *call_id; /**< Call-ID*/ char *local_tag; /**< local tag */ char *remote_tag; /**< remote tag */ osip_list_t route_set; /**< route set */ int local_cseq; /**< last local cseq */ int remote_cseq; /**< last remote cseq*/ osip_to_t *remote_uri; /**< remote_uri */ osip_from_t *local_uri; /**< local_uri */osip_contact_t *remote_contact_uri; /**< remote contact_uri */ int secure; /**< use secure transport layer */osip_dialog_type_t type; /**< type of dialog (CALLEE or CALLER) */state_t state; /**< DIALOG_EARLY || DIALOG_CONFIRMED || DIALOG_CLOSED */void *your_instance; /**< for application data reference */ };೼dialogՈ߱࣪ᯊˈ◄ᰃclient঳៪server঳ᴹdialogᵘЁՈcall_idǃlocal_tag ੠remote_tagՈؐDŽḍᰃclient঳៪server঳ᴹdialog ՈtypeˈาdialogՈDŽᔧخЎclient঳ˈᰃ೼᥹ࠄথߎՈrequest Ոresponseᯊˈ᫇Ϭosip_dialog_init_as_uacẟᜐ࣪dialog˗བᰃ᥹ࠄserver঳থễẋᴹՈrequestˈ߭Ϭosip_dialog_init_as_uac_with_remote_request ẟᜐdialogՈ߱࣪DŽབᰃserver঳ˈ᫇Ϭosip_dialog_init_as_uasẟᜐ࣪dialogDŽ೼dialogՈᯊˈᔧᰃclient঳ᯊˈ᫇Ϭosip_dialog_match_as_uacẟᜐDŽẔࠄՈresponse ੠dialogЁՈcall_id ˈto_tag ੠from_tagᰃ৺ˈབˈ߭ऍࠄњ᪩dialogDŽЎᆍՈᴀˈ೼dialog Ոto៪ࠄՈmessage Ոto headertagՈϟˈ↨ṇdialog ੠message Ոfrom_uri, to_uri DŽབˈ߭ৠḋՈdialogDŽᔧᰃserver঳ᯊˈ᫇Ϭosip_dialog_match_as_uasẟᜐDŽ݊Ϣclient঳ՈּৠDŽᇍfrom_tag ੠to_tagՈˊˈ೼transactionՈẋ࣏ЁৠḋϬࠄDŽ ExosipՈ⑤೼exosipࣙЁࣙ৿ˊϬՈ݇call ǃmessage ǃoption ǃreferǃregisterǃsubscription ǃpublish ੠insubscription ՈAPIˈẝѯAPIՈᅲɴ೼exՈcЁDŽЎẝѯ᥹ষẟᜐࡵՈߑ᭄ˈࣙᣀ੠osip libẟᜐՈᾬՈᅲɴ೼ҹjՈ⑤Ёབjcall.cˈ݊Ёjrequest.c ੠jresponse.cɴњrequest ੠response ՈmessageՈỞϬᵘɴDŽৠᯊexosipɴњՈϡৠՈՈsipणᩲẟᜐˈߚЎextl_dtls.c ǃextl_tcp.c ǃextl_tls.c ੠extl_udp.c ˈᅗҹ⊼Ոᮍ೼LibՈᯊ׭ࠄlibՈЁDŽЎњՈỞˈ೼ϸϾඃϬpipeՈᮍẟᜐɴˈབϬ໮ˈẝᾬ೼ᯊӮDŽᇍ᥹ࠄՈmessageẟᜐՈỿˊ೼᭛udp.cЁˈẝᾬᰃᭈϾणᩲ↨ṇ໡ᴖՈDŽ◄sipणᩲՈẴ੠ҷɴḚẟᜐˊՈDŽ.1LibՈ߱Ͼsip Ոlib ϾՈ੥ˊ඗ᵘstruct exosip_t eXosipˈ᪩೼libϬП࣪ˈ߱࣪ߑ᭄Ўexconf.cՈeXosip_initߑ᭄DŽExosip_tᵘབϟ˖ struct eXosip_tt{struct eXtl_protocol *eXtl;char transport[10];char *user_agent;eXosip_call_t *j_calls; /* my calls */#ifndef MINISIZEeXosip_subscribe_t *j_subscribes; /* my friends */eXosip_notify_t *j_notifies; /* my susbscribers */#endifosip_list_t j_transactions;eXosip_reg_t *j_reg; /* my registrations */#ifndef MINISIZEeXosip_pub_t *j_pub; /* my publications */#endif#ifdef OSIP_MTvoid *j_cond;void *j_mutexlock;#endifosip_t *j_osip;int j_stop_ua;#ifdef OSIP_MTvoid *j_thread;jpipe_t *j_socketctl;jpipe_t *j_socketctl_event;#endifosip_fifo_t *j_events;jauthinfo_t *authinfos;int keep_alive;int learn_port;#ifndef MINISIZEint http_port;char http_proxy[256];char http_outbound_proxy[256];int dontsend_101;#endifint use_rport;char ipv4_for_gateway[256];char ipv6_for_gateway[256];#ifndef MINISIZEchar event_package[256];#endifstruct eXosip_dns_cache dns_entries[MAX_EXOSIP_DNS_ENTRY];struct eXosip_account_info account_entries[MAX_EXOSIP_ACCOUNT_INFO];struct eXosip_http_auth http_auths[MAX_EXOSIP_HTTP_AUTH];CbSipCallback cbsipCallback;p_access_network_info *p_a_n_i; digest_cave_response *cav_v; };೼᪩ᵘЁˈ᳔ₑᡅՈ޴Ͼ៤བϟ˖1)int j_stop_ua;णᩲ੠ذՈࠊ᭄ˈ2)ᔧj_stop_ua Ў0ᯊˈ3)libˈ4)Ў0ᯊˈ5)libDŽ6)eXosip_call_t *j_calls; j_callsϬˊܼՈỞˈ7)᠔᳝Ոcall೼ẝϾ඗ᵘЁᔶϾᵘDŽCallᵘབϟ˖struct eXosip_call_t {int c_id;eXosip_dialog_t *c_dialogs; osip_transaction_t *c_inc_tr; osip_transaction_t *c_out_tr;int c_retry; /* avoid too many unsuccessfull retry */ void *external_reference;eXosip_call_t *next; eXosip_call_t *parent; };݊ЁՈc_id ЎߚՈcall_id ˈc_dialogs ЎৠϔϾcall ЁՈdialogՈ▊DŽc_inc_tr ੠c_out_tr Ў᪩call ᯊՈ߱࣪Ոtransaction ˈϔϾ঳ᇍϾcallϡᰃclient ঳ህᰃserver ঳ˈ᠔ҹc_inc_tr ੠c_out_tr Ͼᰃ᳝transactionՈˈ݊Ё᳝ϾЎNULL DŽ8)eXosip_reg_t *j_reg; j_regˊsip Ո⊼9)ࡵˈ10)᠔᳝register ּ݇Ոtransaction೼j_regЁᔶϾDŽḍsip णᩲˈ11)ՈϔՈ⊼਍ࠄẟᜐˈ12)᠔ҹৠ13)Ͼregisterϡ14)callˈৠ15)ᯊ᳝Ͼtransactionᄬ೼DŽ16)struct eXtl_protocol *eXtl;ЎՓϬՈՈणᩲˈ17)೼exosipՈ߱࣪Ё◄าˈ18)೼ɴ೼њ4ϡৠ19)Ոɴᮍˈ20)ՈᅲɴҹϔϾ඗ᵘՈᔶᄬ೼ˈ21)೼exosip_t࣪ᯊ⊼ࠄexosipՈextlЁDŽ22)osip_list_t j_transactions;ϬˊܼՈ┨ᰃẜಲՈtransactionDŽẝѯtransaction ϡ23)call ៪register៪ᰃcall ǃregisterЁ┨ՈtransactionDŽ24)osip_t *j_osip; Ўosip lib Ո੥ˊ඗ᵘˈ25)osip LibՈ඗ᵘ೼ϔϾӏࡵЁϾবᄬ೼ˈ26)ϬˊܼՈsip णᩲЁߎɴՈtransaction DŽḍՈᦣẴˈৠ27)Ͼtransaction ৠ28)ᯊᝯj_osip ˊ੠call/reg ˊˈ29)᠔ҹᔧϾtransaction ┨ᯊˈ30)Ңj_osip Ёᇚ᪩transactionҢ੥ˊ඗ᵘЁ┨ˈৠ31)ᯊҢcall ៪reg Ё┨ˈ32)ࠄj_transaction ЁDŽ೼j_osip ࣪ᯊˈ33)࣪њ4ϡৠ34)Ոtransaction Ո੥ˊˈৠ35)ᯊ߱࣪њmessage header Ոᢧᵤߑ᭄Ոܼˈ36)೼ߑ᭄increase_ref_countЁ߱࣪DŽৠ37)ᯊosip lib Ўњɴₑܹˈ38)ᇍᝯ࣪Ո⃵᭄ẟᜐ᭄DŽ39)ϟ☦ϾᄫϢणᩲՈᩨˈ40)೼registerᯊቻࠄᩨᙃˈ41)೼callᯊ◄ᇚᙃ⏏ࠄhttp_anth ៪proxy_anthЁҹ೼ẟᜐcallᯊ࿁ẋᩨDŽp_access_network_info *p_a_n_i; digest_cave_response *cav_v; jauthinfo_t *authinfos;struct eXosip_dns_cache dns_entries[MAX_EXOSIP_DNS_ENTRY];struct eXosip_account_info account_entries[MAX_EXOSIP_ACCOUNT_INFO];struct eXosip_http_auth http_auths[MAX_EXOSIP_HTTP_AUTH];42)೼OSIP_MTݙᾬՈᰃЎњ໐43)Ոֵোₓǃ⏅੠ඃՈỞՈpipe DŽ݊Ёpipeẋњˈ44)೼ିunixЁָϬpipe ˈ45)೼windowsЁ₋Ϭsocket ᴹpipeDŽ46)೼MINISIZEݙᾬՈЎᠽᴀˈ47)ᔧpublish ˈ48)notify਍ࡳ࿁ᯊˈ49)ҹਃϬDŽ࣪Ո⌕བϟˈेܼ߱࣪ˊবexosipՈ៤Ոؐ˖osip libmessage ᪡԰ǃ᥹message ᪡԰ǃtransaction Ոkill ᪡exosip Ёᇍtransaction ǃdialog ǃcall ǃregister਍Ոˈẝѯ᪡԰ϵՈexosip ˈ᠔ҹ೼ẟᜐẝѯ᪡԰ᯊӮಲexosip ೼osip ЁՈಲߑ᭄DŽ೼߱࣪exosipᯊӮẝѯಲߑ᭄ˈ೼eXosip_set_callbacksߑ᭄Ёᅲɴˈẝѯ⊼ߑ᭄Ոᅲɴ೼jcallback.c ЁᅲɴDŽexosip lib Ո⏄Ϭߑ᭄eXosip_quit ˈ݊᪡԰Ϣexosip_initՈ᪡԰ּˈ݊าj_stop_uaЎ0ˈՓˊඃˊsip णᩲՈrejister ੠call DŽ᠔᳝Ոݙᄬˈ₎exosipᄬՈ᠔᳝Ոcall ǃregister ੠ϬࠄՈdialog ঞtransactionDŽ೼exosipՈ߱࣪Ёˈᾬ੠Ϯࡵּ݇Ոᄫ೼exosip Ո໪ᾬẟᜐ࣪DŽབՈ߱࣪೼ߑ᭄eXosip_listen_addr ˈeXosip_masquerade_contactˈeXosip_set_user_agent ˈeXosip_add_authentication_info Ёᅲɴˈsip_reg.c Ոwinmain ˈ᪩ߑ᭄ᰃregister Ոਃߑ᭄ˈ࣪register ϬࠄՈ޴ϾؐˈSip_reg.c ᰃᇍlib ᑨϬՈϔϾDŽ.2LibՈЏ೼exosip lib ࣪៤ࡳПˈབϬ໮ˈ߭೼ᮄՈඃЁϔexosip_execute ˈ೼ЏЁᠻeXosip_automatic_action˗བϬ໮ˈ߭೼ऩЁ↣Ͼexosip libՈџˈexosip_execute ੠eXosip_automatic_action DŽ೼ЏЁ↣exosip LibࣙϞՈexEventˈ೼໘ˊexEvent ᯊӮˊcall Ё200ᑨਘՈₑথᴎࠊDŽ .2.12xxᑨਘՈₑথ໘ˊᴎࠊ೼eXosip_retransmit_lost200okЁᇍ2xxՈᑨਘẟᜐₑথࠊˈḍsipणᩲˈ಴Ў2xxՈₑᰃ◄sipणᩲẟᜐࠊՈˈᔧথễ2xxᑨਘˈ೼ᢈᯊⒸݙ≵ࠄACKᑨਘˈ߭ₑ2xxᑨਘDŽ݊ₑՈᯊⒸ╘Ў1sˈҹˈࠄ4࢖ᯊ↣╘Ў4sDŽ2xxՈₑথՈذথϣ೼ϸ˖ϔЎ2xxᑨਘথễᯊˈ೼থễ9ࠄᇍ঳থễՈACKᑨਘˈ߭ₑথˈcallՈỞɴՈњˈ߭᪩call˗Ў೼থễ2xxᑨਘПˈ᥹ࠄњᇍ঳ՈACKᑨਘˈ᪩ACKᑨਘẝϾdialogˈ߭া2xxՈথễˈৠᯊ₎dialogЁᄬՈ2xxᙃˈาdialogЁՈ2xxₑ᭄ЎذDŽ .2.2Exosip_executeexosip_executeՈᠻ↨ṇ੄ˈ಴Ў೼ඃteminateՈϟˈඃexosip_executeˈ᠔ҹ೼exosip_executeݙᾬּ݇Ո᪡԰ेৃDŽ݊བϟ˖eXosip_executeᯊˈmessageˈ᠔ҹẔᜐඃ࣏ϔָ೼֕਀ᰃ৺᳝থễՈmessage ˈᰃ੥ˊ࣏Ϭ᥹ᜐথễՈDŽ೼ˊ᥹Ոmessage ᯊৃ࿁Ոcall ǃᮄՈtransactionˈϣՈtransactionՈeventˈẜ᳝exosip ՈeventDŽ݊Ёexosip ՈeventᰃϞ᡹ඝ੥ˊ࣏Ոˈ೼੥ˊ࣏ЁḍՈᅲᜐ໘ˊDŽ݊࿁Ո৘eventՈᅮ೼᭛exosip.h Ոtypedef enumeXosip_event_type ЁDŽ೼ϔϾmessage ᑊخњˊП(гৃ࿁᳝ᮄՈmessageˊ)ˈexosip_execute ˊosip Ё4ᴵtransaction ⏂ᜬЁՈᅮᯊ఼ˈབᯊ఼ᯊˈ߭Ոᅮᯊ఼ᑊtransactionՈџЁˈ✊ৢᜐ4ᴵtransaction⏂ᜬЁՈ↣ϾtransactionՈџˈ݊ЁࣙᇍmessageՈˊDŽẝՈҷ೼osip lib᳝ߚDŽ೼໘ˊϞ☦ˈᓔՈcall ǃregistration ੠publicationDŽ݊Ё೼registration ੠publicationՈ₎Ոᯊ׭ˈᰃ݊ЁՈtransation Ңregistration ੠publicationՈЁߴ┨ˈ✊ৢ೼exosipՈj_transaction ⏂ᜬЁDŽ᪩⏂ᜬЁՈtransaction೼eXosip_release_terminated_callsЁ₎DŽৠᯊˈབሖՓϬՈᰃUDPˈ߭Ϭ_eXosip_keep_alive ЎregistrationথUDP ՈỞˈUDPᯊ᪩঳ষDŽ .2.2.1Exosip_read_messageExosip_read_message ϬՈሖणˈ᫇ϬሖՈtl_read_message ҢTCP/IP ሖmessage DŽབҢሖmessage ˈ߭Ѹඝ_eXosip_handle_incoming_message ᜐ໘ˊDŽ೼_eXosip_handle_incoming_messageЁˈ᪩message ˈབˈ೼ᢧˈẔmessage ЁՈᖙᡅcall_id number DŽབ੥ˊ࣏೼exosip Ё⊼њmessageՈˊˈ߭ಲ᪩ߑDŽ✊message ՈିˈẔᑊܲ᪩message ՈѻՈtransaction ՈeventՈିˈ಴Ўᰃ᥹message ˈ᠔ҹିЎRCV_XXX ˈ೼থễmessage ᯊˈѻSND_XXXՈevent DŽ಴ЎᰃᮄՈmessage ˈ᳝ৃ࿁ˈϔᰃ࿁೼ՈtransactionˈेᰃᶤϾ᪻∖Ոᑨਘ៪ACK ˗བϡ࿁ˈḍmessage ЁՈᗕˈབᰃ0,ᰃϔϾ∖ˈ໐ϨϾ᪻∖ϡ࿁೼Ոtransactionˈ᠔ҹᰃϔϾᮄ∖ˈᇍᮄ∖Ո໘ˊ೼eXosip_process_newrequest Ё˗བstatus ϡЎ0ˈ߭ᰃϔϾresponse ˈ಴Ўresponse ᰃᇍϔϾrequest Ոಲˈ໐থễrequest Ոᯊ׭೼঳এњᮄՈtransactionˈབˊˈ᪩response ᪩ऍϔϾ೼Ոtransactionˈɴ೼≵᳝ˈ᪩response ᰃϔϾ᪳থễՈresponse ˈᇍresponse Ո໘ˊ೼eXosip_process_response_out_of_transaction ЁDŽExosip_read_messageՈ໘ˊ⌕࣏བ˖eXosip_process_newrequesta)message b)ctx_type c)d)ҹ঳Ўserver ˈe)message ᮶ϡf)ᰃINVITE ˈg)гϡh)ᰃACK ˈৠi)ᯊϡj)ᰃ݊ᅗREQUEST Ոˈk)ָ߭᥹Ͼmessage DŽl)ᰃACK ˈm)ཱི߭ᰃᇍ200Ոresponse ՈϔϾಲDŽϡn)এՈtransaction DŽo)ᰃCANCEL ˈp)ָ߭᥹eXosip_process_cancel ᜐ໘ˊDŽq)᪩message ᰃ৺ѢϔϾdialog ˈr)಴Ўdialog transactionՈᴵӊਘˈs)Ͼtransaction ৃҹѢৠt)ϔϾdialogDŽབϔϾdialog ˈu)߭᪩Ոmessage Ոcseq_number ੠dialog ЁՈcseq_number Ո໻ᇣˈv)᳝໻Ѣdialog ЁՈremote cseq number ˈw)Ոmessage ᰃϔϾ᪳Ոrequest ˈx)߭᪩messageᑊẘಲDŽy)ᰃINVITEᑊϨ᳝ᅮ᪩Ոˈz)߭ܜথễϔϾ100ՈᯊᑨਘDŽaa)ϾmessageϔϾdialogi.ᑊϨϡii.ᰃACK੠BYEˈiii.߭Ͼdialogᰃ৺Ꮖˈiv.᮶᪩dialogথễ៪᥹BYE∖ˈv.߭sipᷛvi.ޚথễϔϾ481Ո᪳ᦤਘDŽvii.ϡviii.ᰃACK ˈix.಴ЎᏆՈড়ˈৠx.ᯊϔϾdialog ˈxi.᠔ҹ◄᪩messagedialog Ոremotecseq DŽxii.message ᰃINVITE1.ϾdialogЁ᳔ՈϔϾ᥹ՈINVITE ᰃ৺Ꮖᗕˈ2.᳝ˈ3.߭sipᷛ4.ޚᇚϾnew INVITEߴ┨ˈ5.ᑊথễϔϾ500Ոᦤ᪳ਘDŽ6.Ͼdialog Ё᳔ՈϔϾথễՈINVITE ᰃ৺Ꮖᗕˈ7.᳝ˈ8.߭sipᷛ9.ޚᇚϾnew INVITEߴ┨ˈ10.ᑊথễϔϾ491Ոᦤ᪳ਘDŽ11.৺߭᪩INVITE ᰃϾড়Ո᪻∖ˈ12.߭᳈dialog Ոroute set ˈ13.಴Ў᪩INVITE ᑊϡ14.ᰃ߯᪩dialog ՈৰϔϾ᪻∖ˈ15.᠔ҹ᫇ϬeXosip_process_reinviteˊ᪩INVITE∖DŽxiii.message ᰃBYE ∖1.᪩BYE ∖Ոˈ2.ᰃ৺ࣙto tag ˈ3.಴Ў঳থՈresponse ᳝to tag ˈ4.᠔ҹᇍ঳থễՈBYE᪩ᰃϔϾࣙto tag Ոড়ՈmessageDŽ5.dialog Ёᰃ৺ᏆBYE ˈ6.BYEˈ7.ᇍᮍথњBYE ∖ˈ8.ָ᥹ಲ໡9.500᪳ᦤਘ10.৺߭ϬeXosip_process_bye ˊBYE ∖DŽxiv.ᰃACK ˈxv.ָ᥹ϬeXosip_process_ack ˊ᪩ACK ∖xvi.ᰃ݊ᅗ∖ˈxvii.߭ϬeXosip_process_message_within_dialogˊ᪩∖DŽbb)৺߭ˈcc)᳝ϔϾdialog ˈdd)ᰃܼՈϔϾ᪻∖i.ᰃACK ˈii.᪩200ՈACK ᳝dialog ˈiii.᠔ҹᰃϔϾ᪳ՈACK ˈiv.ָ᥹message ेৃˈv.಴ЎᰃACK ˈvi.᠔ҹᑊ᳝ᓎএtransaction ˈvii.ϡviii.ᇍtransaction ᜐ᪡DŽix.ᰃINFO ˈx.ָ᥹ಲ໡xi.481ਘDŽxii.ᰃINVITE ˈxiii.ϬeXosip_process_new_inviteˊẝϾᮄ∖ˈxiv.᪩∖ড়ˈxv.߭ϔϾᮄՈcall ˈxvi.ᑊϨ೼callϞϣϔϾdialog ˈxvii.᪩dialog ᰃ᳡xviii.঳Ոdialog ˈxix.಴Ў঳ᰃUAS DŽxx.ᰃBYE ∖ˈxxi.߭੠ACK ϔḋˈxxii.᪩BYE ∖≵᳝dialog ˈxxiii.ಲ໡xxiv.ϔϾ481Ո᪳ᦤਘỞᇍ঳◄Ոdialog ϡxxv.೼DŽxxvi.ᰃ݊ᅗ∖ˈxxvii.߭಴Ўᰃϡxxviii.sip ᷛxxix.ޚՈ᪻∖ᮍˈxxx.᠔ҹՈtransactionߴ┨ՈⓣЁेৃDŽ.2.2.2eXosip_process_response_out_of_transaction˖a)಴Ўmessage Ўᑨਘˈ໐b)Ϩ᳝transaction ˈc)᠔ҹᰃϔϾ᪳ՈᑨਘDŽmessage Ոড়ˈd)ϡe)ˈf)ָ᥹ᑊẘಲg)᠔ҹՈcall Ոdialog ˈh)᪩responseᰃ৺dialog៪ᰃẜ᳝ᓎএdialog Ոcalli)᳝ϔϾcall ˈj)᪩response Ϣcallˈk)ָ᥹DŽl)#ifndef MINISIZE ˈm)ϨऍϔϾdialog ˈn)o)њ200ਘˈp)ৃ࿁಴ᰃᇍᮍ᳝᥹঳থễՈACKˈq)ᰃ঳Ոtransaction ೼᥹200ਘᯊᏆkillњˈr)᠔ҹ≵᳝transaction ˈs)ᰃњdialogDŽབ200ਘՈcseq੠঳থễՈcseq Ոnumber ਍ˈt)߭থễACKਘDŽ໘ˊϞẴˈu)᪩messageᑊẘಲDŽv)ᰃњcall ˈw)dialog ᳝ᓎএˈx)ᰃඝ200ਘᰃϔϾ᪳Ոᑨਘˈy)৺߭call Ոc_out_tr transactionDŽ߭Ў᪩200ਘᯊᓎএϔϾdialogᑊথễACKಲˈz)✊ৢথễϔϾBYE∖඗᪩call ˈaa)಴Ў᪩callথễ᪳њDŽ.2.3eXosip_automatic_action ˊ⌕࣏᪩ߑϬѢˊાՈcall ǃregisterǃnotify ǃpublish਍ˈ೼᥹ಲЎ401៪407៪◄থՈˈẟᜐₑDŽa)᠔᳝Ոcall:i.c_id < 1߭ϡii.Ϭ໘ˊˈiii.call ՈidѢ1Ոᰃᝯߴ┨Ոᰃ᳝ᝯˊߎj_calls⏂ᜬՈcallDŽiv.᪩call Ոdialog᳝ᓎএ᰻ˈv.ᰃ঳থễϔϾINVITE∖ᓎএՈᮄcall ˈvi.ᰃᇍ঳থễՈৰϔϾINVITE ˈvii.߭ᴀ঳ಲϔϾresponse ˈviii.೼ಲresponseՈᯊ׭ˈix.dialogህᝯএњDŽ1.এ᪩callՈৰϔϾINVITE ∖ᓎএ᰻ՈtransactionՈᗕˈ2.ˈ3.ᑊϨ᪩call᳝ࠄᯊᯊⒸ120࢖ˈ4.ϨՈಲ໡ 5.ՈᗕЎ401៪407ˈ6.߭থễ∖ˈ7.ᑊϨҢಲ໡8.ЁᦤপDŽₑথ⃵᭄Ў3⃵ˈ9.3⃵ˈ10.߭਍ָࠄ᪩callᯊ඗DŽৠ11.Ϟˈ12.ಲ໡13.ਘՈstatus Ў[300, 399]ˈ14.߭থễ∖ˈ15.ᑊϨḰথễՈˈ16.17.থễ⃵᭄гЎ3⃵DŽẝϬ_eXosip_call_retry_request ᜐ໘ˊDŽx.call Ё᠔᳝Ոdialog ˈxi.ᇍѢdialog೼Ոdialog ᜐ໘ˊˈxii.ˊᮍৠxiii.Ϟˈxiv.гᰃẔˈxv.ϔЎᑨਘstatus Ў401៪407Ոᩨ᪳ᦤˈxvi.ϔЎ[300, 399]server঳ՈথᦤDŽb)᠔᳝Ոregister ˈc)ˊr_id >=1 Ϩ᳝transaction Ոregister ˈd)r_id < 1៪᳝last transaction Ոregister ᰃᏆߴ┨Ոregister ˈe)ϡf)ˊDŽi.থᯊⒸϡii.Ў0ˈiii.᮶᪩registerϔָₑথễˈiv.ϨᯊⒸᯊˈv.᪩registerҢ⊼೼Ꮖ900࢖ˈvi.߭ϬeXosip_register_send_registerᜐₑDŽvii.ᯊⒸ೼Ў໻ѢՈₑᯊⒸ-60࢖ˈviii.гথˈix.᮶њₑᯊⒸˈx.ᖙ◄೼ₑᯊՈ60࢖ህᓔথDŽxi.៪ˈ໐xii.ϨࡿϞ⃵⊼ᯊⒸ120࢖ˈxiii.ᑊϨ᳝᥹xiv.Ոᑨਘ៪ਘϡxv.ᰃ៤Ոᑨਘˈxvi.߭гথDŽxvii.ˈxviii.ेৰϔ⃵⊼ˈxix.Ϩᰃ಴Ўᩨ໐xx.Ո⊼ˈxxi.߭DŽབᰃWPDIF ˈxxii.߭ಲ໡xxiii.ЁՈᩨnonceᰃ৺੠Ϟϔ⃵ᯊՈnonce ּؐৠˈxxiv.ৠxxv.߭থ˗ϡxxvi.ᰃWPDIF ˈxxvii.ָ߭᥹থDŽЎњWPDIFՈ៤ˈxxviii.೼ৰϔ⃵⊼ᯊˈxxix.ᦤ⃵᳡xxx.঳Ոಲ໡xxxi.ЁՈnonceؐˈxxxii.ҹ೼ᰃ৺থՈᯊ׭ᴵӊЎDŽg)Notify ǃsubscription ǃpubՈ໘ˊৠh)callDŽ.3Call೼exosip libЁ┨њϔָ೼ẔᜐՈ໘ˊᇍ঳থễՈmessageՈඃ࣏໪ˈẜᦤկњ঳Ўথễ঳থễrequest ǃACK DŽ಴Ў᠔᳝Ոmessage ѢϾtransaction ˈ໐ϨᇍmessageՈ໘ˊ᳔೼transaction Ոevent Ёẟᜐ໘ˊˈ᠔ҹ᠔᳝ᦤկՈࣙcall ǃnotify ǃpublish ǃregister ǃsubscription ǃrefer ਍ࡳᰃỞϔϾtransaction ϞՈeventϢϔָẔᜐՈ໘ˊඃ࣏ᜐˈevent ˈ໘ˊඃ࣏೼Ḳ᠔᳝transaction ᯊӮˊࠄeventˈϾevent এे໘ˊՈᯊ׭ˈ߭ৃҹeventՈ໘ˊඃ࣏ˈ໐ϡ◄਍ࠄ᪩ˊඃ࣏ˊࠄ᪩transaction DŽExosip lib ᦤկњcall Ո4˖ৰϔ⃵ᓎএϔϾcall Ոinitial invite থễ˗೼dialog Ё߯থễՈ݊ᅗrequest ˗೼dialog Ё߯থễᇍҢᇍ঳থễՈrequest Ոresponse ˗೼invite ∖Ёಲᇍ঳response ՈACK Ո߯੠থễDŽ .3.1CallՈৰϔϾINVITE೼excall_api.cЁՈeXosip_call_build_initial_invite ੠eXosip_call_send_initial_invite ᦤњ঳থϔϾᮄՈcallᯊՈ᥹DŽeXosip_call_build_initial_inviteՈ⌕࣏བ˖。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

【智能路由器】ndpi深度报文分析源码框架某些需求可能会要求路由能精确的分析出流经路由的流量是属于什么类型,比如qq,facebook,支付宝、京东……正好,有这么一个基于opendpi框架的深度报文分析的工具——ndpindpi是在opendpi的基础上编写而来的协议分析工具。

源代码编译后生成两个部分,一个是内核层的xt_ndpi.ko模块,用来实时分析流量,另一个是应用层的lib库,给ndpiReader这个工具提供库,用来分析抓包工具提供的文件或者底层网卡提供的数据包。

开发者必须为其想要分析的app的流量对应开发一个协议分析器,ndpi已经提供了不少现成的协议分析器,如http,QQ,twitter,vmware,yahoo,mysql,pplive等等。

本篇博客中作者arvik只叙述ndpi源码中形成内核层的xt_ndpi.ko模块的源码部分。

之后可能会写一篇介绍ndpi中已有的QQ协议分析器是怎么分析出OICQ协议以识别流量类型和一篇实战型依葫芦画瓢编写微信协议分析器的博客。

ndpi的分析过程:当底层一帧数据被送入ndpi钩子的时候,流经结构大致如下:1. 打包该数据帧,搜集l3、l4层报头信息2. 查询链接跟踪(如果已被标识,则直接获取到该数据帧所属协议类型)3. 从链接跟踪中未获取流量所属协议类型,则进入深度报文分析过程4. 率先进行协议猜测,调用相应的协议分析器分析5. 猜测协议错误、此时ndpi会分类遍历相关类型的协议分析器进行分析,直至分析出结果或遍历完所有相关的协议分析器6. 将分析出的协议类型标记到链接跟踪中,以便下次可直接从连接跟踪中拿到协议类型先来看内核模块代码:几个重要结构ndpi_detection_module_struct:各种协议分析器都将自己的信息都保存在该结构中struct ndpi_detection_module_struct {NDPI_PROTOCOL_BITMASK detection_bitmask; //等价于struct xxx { uint32_t fds_bits[8]}; struct xxx dection; 其中fds_bits[8]每一位可代表一种协议,最多可代表256中协议NDPI_PROTOCOL_BITMASK generic_http_packet_bitmask;u_int32_t current_ts;u_int32_t ticks_per_second;#ifdef NDPI_ENABLE_DEBUG_MESSAGESvoid *user_data;#endif/* 各种类型回调函数数组,每个协议都会对应一个回调函数*/struct ndpi_call_function_struct callback_buffer[NDPI_MAX_SUPPORTED_PROTOCOLS + 1];u_int32_t callback_buffer_size;struct ndpi_call_function_struct callback_buffer_tcp_no_payload[NDPI_MAX_SUPPORTED_PROTOCOLS + 1];u_int32_t callback_buffer_size_tcp_no_payload;struct ndpi_call_function_struct callback_buffer_tcp_payload[NDPI_MAX_SUPPORTED_PROTOCOLS + 1];u_int32_t callback_buffer_size_tcp_payload;struct ndpi_call_function_struct callback_buffer_udp[NDPI_MAX_SUPPORTED_PROTOCOLS + 1];u_int32_t callback_buffer_size_udp;struct ndpi_call_function_struct callback_buffer_non_tcp_udp[NDPI_MAX_SUPPORTED_PROTOCOLS + 1];u_int32_t callback_buffer_size_non_tcp_udp;ndpi_default_ports_tree_node_t *tcpRoot, *udpRoot;#ifdef NDPI_ENABLE_DEBUG_MESSAGES/* 调试信息相关回调*/ndpi_debug_function_ptr ndpi_debug_printf;const char *ndpi_debug_print_file;const char *ndpi_debug_print_function;u_int32_t ndpi_debug_print_line;#endif/* misc parameters */u_int32_t tcp_max_retransmission_window_size;u_int32_t directconnect_connection_ip_tick_timeout;/* 注册子协议处理函数数组*/struct ndpi_subprotocol_conf_structsubprotocol_conf[NDPI_MAX_SUPPORTED_PROTOCOLS + 1];u_int ndpi_num_supported_protocols;u_int ndpi_num_custom_protocols;/* 用于HTTP/DNS/HTTPS host 匹配*/ndpi_automa host_automa, /* Used for DNS/HTTPS */content_automa, /* Used for HTTP subprotocol_detection */subprotocol_automa, /* Used for HTTP subprotocol_detection */bigrams_automa, impossible_bigrams_automa; /* TOR *//* IP-based protocol detection */void *protocols_ptree;//部分协议的私有参数/* irc parameters */u_int32_t irc_timeout;/* gnutella parameters */u_int32_t gnutella_timeout;/* battlefield parameters */u_int32_t battlefield_timeout;/* thunder parameters */u_int32_t thunder_timeout;/* SoulSeek parameters */u_int32_t soulseek_connection_ip_tick_timeout;/* rtsp parameters */u_int32_t rtsp_connection_timeout;/* tvants parameters */u_int32_t tvants_connection_timeout;/* rstp */u_int32_t orb_rstp_ts_timeout;/* yahoo */u_int8_t yahoo_detect_http_connections;u_int32_t yahoo_lan_video_timeout;u_int32_t zattoo_connection_timeout;u_int32_t jabber_stun_timeout;u_int32_t jabber_file_transfer_timeout;#ifdef NDPI_ENABLE_DEBUG_MESSAGES#define NDPI_IP_STRING_SIZE 40char ip_string[NDPI_IP_STRING_SIZE];#endifu_int8_t ip_version_limit;#ifdef NDPI_PROTOCOL_BITTORRENTstruct hash_ip4p_table *bt_ht;#ifdef NDPI_DETECTION_SUPPORT_IPV6struct hash_ip4p_table *bt6_ht;#endif#ifdef BT_ANNOUNCEstruct bt_announce *bt_ann;int bt_ann_len;#endif#endif//默认协议结构体数组ndpi_proto_defaults_tproto_defaults[NDPI_MAX_SUPPORTED_PROTOCOLS+NDPI_MAX_NUM_CUSTOM_PRO TOCOLS];//分别是http、dns和网络方向探测允许标识位u_int8_t http_dont_dissect_response:1, dns_dissect_response:1,direction_detect_disable:1; /* disable internal detection of packet direction */};ndpi_flow_struct:携带一系列数据包组成的数据流信息,协议分析已经完成的部分信息都会保存在流中,当然也会保存部分协议分析器分析的私有数据信息struct ndpi_flow_struct {u_int16_t detected_protocol_stack[NDPI_PROTOCOL_HISTORY_SIZE];#ifndef WIN32__attribute__ ((__packed__))#endifu_int16_t protocol_stack_info;/* init parameter, internal used to set up timestamp,... */u_int16_t guessed_protocol_id, guessed_host_protocol_id;u_int8_t protocol_id_already_guessed:1, host_already_guessed:1, init_finished:1, setup_packet_direction:1, packet_direction:1;/*if ndpi_struct->direction_detect_disable == 1tcp sequence number connection tracking*/u_int32_t next_tcp_seq_nr[2];/*the tcp / udp / other l4 value unionused to reduce the number of bytes for tcp or udp protocol states */union {struct ndpi_flow_tcp_struct tcp;struct ndpi_flow_udp_struct udp;} l4;/*Pointer to src or dstthat identifies theserver of this connection*/struct ndpi_id_struct *server_id;/* HTTP host or DNS query */u_char host_server_name[192];/* Via HTTP User-Agent */u_char detected_os[32];/* Via HTTP X-Forwarded-For */u_char nat_ip[24];/* Bittorrent hash */u_char bittorent_hash[20];/*This structure below will not not stay inside the protosstructure below as HTTP is used by many subprotocolssuch as FaceBook, Google... so it is hard to knowwhen to use it or not. Thus we leave it outside for thetime being.*/struct {ndpi_http_method method;char *url, *content_type;} http;union {/* the only fields useful for nDPI and ntopng */struct {u_int8_t num_queries, num_answers, reply_code;u_int16_t query_type, query_class, rsp_type;} dns;struct {u_int8_t request_code;u_int8_t version;} ntp;struct {char client_certificate[48], server_certificate[48];} ssl;} protos;/*** ALL protocol specific 64 bit variables here ***//* protocols which have marked a connection as this connection cannot be protocol XXX, multiple u_int64_t */NDPI_PROTOCOL_BITMASK excluded_protocol_bitmask;u_int8_t num_stun_udp_pkts;#ifdef NDPI_PROTOCOL_REDISu_int8_t redis_s2d_first_char, redis_d2s_first_char;#endifu_int16_t packet_counter; // can be 0 - 65000u_int16_t packet_direction_counter[2];u_int16_t byte_counter[2];#ifdef NDPI_PROTOCOL_BITTORRENTu_int8_t bittorrent_stage; // can be 0 - 255#endif#ifdef NDPI_PROTOCOL_DIRECTCONNECTu_int32_t directconnect_stage:2; // 0 - 1#endif#ifdef NDPI_PROTOCOL_SIP#ifdef NDPI_PROTOCOL_YAHOOu_int32_t sip_yahoo_voice:1;#endif#endif#ifdef NDPI_PROTOCOL_HTTPu_int32_t http_detected:1;#endif#ifdef NDPI_PROTOCOL_RTSPu_int32_t rtsprdt_stage:2;u_int32_t rtsp_control_flow:1;#endif#ifdef NDPI_PROTOCOL_YAHOOu_int32_t yahoo_detection_finished:2;#endif#ifdef NDPI_PROTOCOL_ZATTOOu_int32_t zattoo_stage:3;#endif#ifdef NDPI_PROTOCOL_QQu_int32_t qq_stage:3;#endif#ifdef NDPI_PROTOCOL_THUNDERu_int32_t thunder_stage:2; // 0 - 3#endif#ifdef NDPI_PROTOCOL_OSCARu_int32_t oscar_ssl_voice_stage:3;u_int32_t oscar_video_voice:1;#endif#ifdef NDPI_PROTOCOL_FLORENSIAu_int32_t florensia_stage:1;#endif#ifdef NDPI_PROTOCOL_SOCKSu_int32_t socks5_stage:2; // 0 - 3u_int32_t socks4_stage:2; // 0 - 3#endif#ifdef NDPI_PROTOCOL_EDONKEYu_int32_t edonkey_stage:2; // 0 - 3 #endif#ifdef NDPI_PROTOCOL_FTP_CONTROLu_int32_t ftp_control_stage:2;#endif#ifdef NDPI_PROTOCOL_RTMPu_int32_t rtmp_stage:2;#endif#ifdef NDPI_PROTOCOL_PANDOu_int32_t pando_stage:3;#endif#ifdef NDPI_PROTOCOL_STEAMu_int32_t steam_stage:3;u_int32_t steam_stage1:3; // 0 - 4u_int32_t steam_stage2:2; // 0 - 2u_int32_t steam_stage3:2; // 0 - 2#endif#ifdef NDPI_PROTOCOL_PPLIVEu_int32_t pplive_stage1:3; // 0 - 6u_int32_t pplive_stage2:2; // 0 - 2u_int32_t pplive_stage3:2; // 0 - 2#endif#ifdef NDPI_PROTOCOL_STARCRAFTu_int32_t starcraft_udp_stage : 3; // 0-7#endif/* internal structures to save functions calls */struct ndpi_packet_struct packet;struct ndpi_flow_struct *flow;struct ndpi_id_struct *src;struct ndpi_id_struct *dst;};初始化ndpi的初始化在ndpi_init_detection_module()函数中,该函数申请好一个ndpi_detection_module_struct结构的空间后,初始化了一些协议的私有参数后就交给ndpi_init_protocol_defaults了。

相关文档
最新文档