#ifndef _APP_STREAM_INTERNAL_H_ #define _APP_STREAM_INTERNAL_H_ #include "stream_inc/stream_base.h" #include "stream_inc/stream_project.h" #include "stream_inc/stream_proxy.h" #include "stream_inc/stream_tunnel.h" #include "stream_inc/stream_inject.h" #include "stream_inc/stream_rawpkt.h" #include "stream_inc/stream_control.h" /* 原始包结构 */ typedef struct { unsigned int magic_num; int offset_to_raw_pkt_hdr; /* 本层回调对应的数据在raw_pkt_data的偏移量 */ enum addr_type_t low_layer_type; /* 原始包最底层协议的类型, 可能是MAC(pcap捕包), 也可能是IPv4(pag捕包) */ int __lib_raw_pkt_len; /* 底层捕包库提供的包真实原始长度 */ int raw_pkt_len; /* 给上层应用看的原始包总长度, 有可能不是真实的, 比如跳过了Ethernet层 */ unsigned int hd_hash; /* 网卡硬件计算的四元组HASH, 减少平台CPU计算消耗 */ const void *__lib_raw_pkt_data; /* 底层捕包库提供的真实原始包指针 */ const void *raw_pkt_data; /* 给上层应用看的原始包头指针, 有可能跳过了Ethernet层, 根据low_layer_type判断协议类型 */ struct timeval raw_pkt_ts; /* 原始包捕获时间戳, 如果全为0则不支持此功能(如pag模式) */ const void *io_lib_pkt_reference; /* 引用底层I/O库的原始包管理结构, 例如:对于marsio来说, 即底层的mbuf结构 */ }raw_pkt_t; struct streaminfo_private { /* 对外结构放置在结构体最前, 指针地址可以互相强转 */ struct streaminfo stream_public; /* 以下变量为平台内部私有, 对外不可见 */ void *pproject; //每个工程可以自定义使用; /* ---8 bytes-- */ UCHAR layer_dir:2; /* 单包有效, 当前层的地址是否和默认规则"大端口是客户端"相同 */ UCHAR stream_dir:2; /* 流的生存期内有效, 流的存储的地址是否和默认规则"大端口是客户端"相同 */ UCHAR addr_use_as_hash:1; /* 本层的addr是否做为HASH计算和比较的参数, 如:MAC地址不参与计算 */ UCHAR addr_skip_for_layer_cmp:1;/*本层的addr是否作为地址比较的层级,如:MPLS地址不作为层数计算,直接跳过,该值默认为0,即需要比较*/ UCHAR need_update_opposite_addr:1;/*本层的addr是否在对侧来包时更新,如:MPLS标签非对称时需要在S2C侧第一个包记录本侧标签,该值默认为0,即不需要更新*/ UCHAR stream_killed_flag:1; /* 2014-08-22 lijia add, 串联模式下, 已经被插件Kill, 之后此流可直接Drop或Kill, 无需再给上层插件 */ UCHAR dirreverse; /* 建立连接时是否进行了ip地址反转, 即与"大端口是客户端"规则相反 */ UINT16 timeout;/* 每个链接的独有超时时间, 此值有两个用途, 1:用于尽早淘汰长时间无包到达的流, 以节约内存; 2:用于保护长时间无包的流, 对于IM类长时间无包但连接并未结束, 可设置较大的timeout */ unsigned short offset_to_raw_pkt_hdr; /* 本层头相对于原始包的起始地址的偏移量 */ unsigned short offset_to_ip_hdr; /* 2015-12-07 lijia add, UDP/TCP 包头相对于承载的IP包头偏移量 */ /* ===8 bytes=== */ const raw_pkt_t *raw_pkt; /* 2014-12-30 lijia add, 有些回调函数不支持原始包, 但发包又需要, 存储于private结构中 */ /* ---8 bytes-- */ unsigned int hash_slave; /* 2015-12-14 lijia add, 使用linux_jhash计算时, 可以同时得到两个以上的HASH值, 主HASH用于确定在HASH表的SLOT位置, slave_HASH用于快速比较地址是否相等 */ unsigned char hash_not_head_times;/* 2015-12-15 lijia add, 当前index不在HASH SLOT的第一位的次数 */ unsigned char cur_layer_raw_hdr_len; /* 2017-10-31 lijia add, 当前层的原始包地址长度, 因ppp头部压缩, 原来版本无法保存这个状态, 发包时也无法得知地址如何填充 */ char __pad:4; unsigned char stream_close_reason:4; /* 2019-02-14 lijia add, 对于TCP使用tcpdetail_private的link_state变量, 对于UDP之前没有, 拆分pad新增此变量 */ unsigned char gdev_block_timer; /* ===8 bytes=== */ /* ---8 bytes-- */ unsigned short stream_low_layer_tunnel_type; /* 2016-07-25 lijia add, 记录本流底层隧道类型, 0为非隧道, 其他详见:enum stream_carry_tunnel_t */ unsigned short stream_carry_up_layer_tunnel_type; /* 当前流上层的隧道类型, 比如当前流为UDP, 承载的可能是teredo隧道或L2TP隧道 */ /* 2016-07-08 lijia add, for janus hijack, 本应该存储于half_stream, 但刚收到SYN时, 还没有创建half_stream实体, 所以暂存于streaminfo_private */ unsigned short syn_opt_num; unsigned short synack_opt_num; /* ===8 bytes=== */ struct tcp_option *syn_opt_array; struct tcp_option *synack_opt_array; }; #endif