From ec3bbc9829499fb0aa89e9ede55825b0cd081408 Mon Sep 17 00:00:00 2001 From: yangwei Date: Thu, 31 Oct 2024 12:06:54 +0800 Subject: 馃巿 perf(dup_pkt stat update): remove polling entry MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/private/sapp_mem.h | 23 ++- include/private/stream_internal.h | 315 ++++++++++++++++---------------- src/common/sapp_mem.c | 39 +--- src/dealpkt/duplicate_pkt_distinguish.c | 44 ++++- src/sapp_dev/sapp_init.c | 2 - 5 files changed, 206 insertions(+), 217 deletions(-) diff --git a/include/private/sapp_mem.h b/include/private/sapp_mem.h index 84f4107..30f8743 100644 --- a/include/private/sapp_mem.h +++ b/include/private/sapp_mem.h @@ -5,32 +5,32 @@ extern "C" { #endif -#define MEM_STAT_GLOBAL_THREAD_ID -1 /* 全局变量内存的thread_id, 其实没有用, 保持接口一致, 用于非IO线程 */ +#define MEM_STAT_GLOBAL_THREAD_ID -1 /* 全锟街憋拷锟斤拷锟节达拷锟絫hread_id, 锟斤拷实没锟斤拷锟斤拷, 锟斤拷锟街接匡拷一锟斤拷, 锟斤拷锟节凤拷IO锟竭筹拷 */ typedef enum{ __SAPP_MEM_TYPE_INIT = 0, - SAPP_MEM_STACK_LOCAL, /* 函数栈里临时申请的内存, 函数返回就会被释放 */ + SAPP_MEM_STACK_LOCAL, /* 锟斤拷锟斤拷栈锟斤拷锟斤拷时锟斤拷锟斤拷锟斤拷诖锟, 锟斤拷锟斤拷锟斤拷锟截就会被锟酵凤拷 */ SAPP_MEM_FIX_GLOBAL_VAL, SAPP_MEM_FIX_GLOBAL_STREAM, - SAPP_MEM_FIX_PLUG_CTRL, /* 插件管理初始化必需的相关数据结构, 跟每个流动态挂载的插件无关 */ + SAPP_MEM_FIX_PLUG_CTRL, /* 锟斤拷锟斤拷锟斤拷锟斤拷锟绞硷拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷萁峁, 锟斤拷每锟斤拷锟斤拷锟斤拷态锟斤拷锟截的诧拷锟斤拷薰锟 */ /******************************************* - 以上是全局变量, 或初始化后不变的内存 + 锟斤拷锟斤拷锟斤拷全锟街憋拷锟斤拷, 锟斤拷锟绞硷拷锟斤拷蟛槐锟斤拷锟节达拷 *******************************************/ __SAPP_FIX_DYN_SEPARATOR, /******************************************* - 以下是多线程动态内存 + 锟斤拷锟斤拷锟角讹拷锟竭程讹拷态锟节达拷 *******************************************/ - SAPP_MEM_DYN_MEM_HDR, /* 为了增加这个统计, 增加的内存头部消耗 */ - SAPP_MEM_DYN_IP_FRAG_PKT, /* 不太容易区别ipv4和ipv6, 此处统一计数 */ + SAPP_MEM_DYN_MEM_HDR, /* 为锟斤拷锟斤拷锟斤拷锟斤拷锟酵筹拷锟, 锟斤拷锟接碉拷锟节达拷头锟斤拷锟斤拷锟斤拷 */ + SAPP_MEM_DYN_IP_FRAG_PKT, /* 锟斤拷太锟斤拷锟斤拷锟斤拷锟斤拷ipv4锟斤拷ipv6, 锟剿达拷统一锟斤拷锟斤拷 */ SAPP_MEM_DYN_TCP_STREAM, SAPP_MEM_DYN_UDP_STREAM, - SAPP_MEM_DYN_TCP_HALF_STREAM, /* c2s, s2c半流结构 */ + SAPP_MEM_DYN_TCP_HALF_STREAM, /* c2s, s2c锟斤拷锟斤拷锟结构 */ SAPP_MEM_DYN_UDP_HALF_STREAM, - SAPP_MEM_DYN_PLUG_CTRL, /* 每个流插件管理必需的相关数据结构, 但不包括业务插件使用的内存 */ + SAPP_MEM_DYN_PLUG_CTRL, /* 每锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷萁峁, 锟斤拷锟斤拷锟斤拷锟斤拷业锟斤拷锟斤拷使锟矫碉拷锟节达拷 */ SAPP_MEM_DYN_TCP_UNORDER, SAPP_MEM_DYN_TCP_SYN_OPT, SAPP_MEM_DYN_TCP_POLLING_RAW_PKT, @@ -39,11 +39,11 @@ typedef enum{ SAPP_MEM_DYN_UDP_DETAIL, SAPP_MEM_DYN_TCP_FLOW_STAT, SAPP_MEM_DYN_UDP_FLOW_STAT, - SAPP_MEM_DYN_TCP_PROJECT, /* 仅包括project必需的管理结构, 但不包括插件在project_add时申请的内存 */ + SAPP_MEM_DYN_TCP_PROJECT, /* 锟斤拷锟斤拷锟斤拷project锟斤拷锟斤拷墓锟斤拷锟斤拷峁, 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟絧roject_add时锟斤拷锟斤拷锟斤拷诖锟 */ SAPP_MEM_DYN_UDP_PROJECT, SAPP_MEM_DYN_TCP_BRIDGE, SAPP_MEM_DYN_UDP_BRIDGE, - SAPP_MEM_DYN_PADDR, /* 每层地址所占的内存, 就不分具体协议了, 太麻烦了!! */ + SAPP_MEM_DYN_PADDR, /* 每锟斤拷锟街凤拷锟秸硷拷锟斤拷诖锟, 锟酵诧拷锟街撅拷锟斤拷协锟斤拷锟斤拷, 太锟介烦锟斤拷!! */ SAPP_MEM_DYN_DETAIN_PKT, SAPP_MEM_DYN_SID_LIST, SAPP_MEM_DYN_BLOOM_FILTER, @@ -69,7 +69,6 @@ void sapp_mem_stat_output(void); #define SAPP_GLOBAL_FREE(mem) do{if(mem){sapp_mem_free(SAPP_MEM_FIX_GLOBAL_VAL, MEM_STAT_GLOBAL_THREAD_ID, (void *)mem); mem = NULL;}}while(0) #endif -int bloomfilter_get_mem_stat(int tseq, long long *mem_blocks, long long *mem_bytes); #ifdef __cplusplus } diff --git a/include/private/stream_internal.h b/include/private/stream_internal.h index c57f5f0..e103920 100644 --- a/include/private/stream_internal.h +++ b/include/private/stream_internal.h @@ -20,19 +20,19 @@ //#define STREAM_RAWPKT_MD5_CHECK "48fdc3294bced1c74a853e197db8fd67" //#define STREAM_TUNNEL_MD5_CHECK "d20aa6b4f5683b7b0040676547997be0" -#define IP_PORT_UNION_VERSION (1) /* 是否将IP-PORT合并 */ -#define COMPAT_PAPP_FOR_BENCHMARK (0) /* 2015-01-07 lijia add, 同papp对比结果时, 临时关闭嵌套、各种隧道协议, 否则不一致 */ -#define USE_RBTREE_INSTEAD_LIST (0) /* 当HASH冲突时, 使用红黑树代替链表, 避免特殊情况下遍历 */ -//#define USE_LINUX_KERNEL_HASH_ALGO (1) /* 使用LINUX内核HASH算法 */ +#define IP_PORT_UNION_VERSION (1) /* 锟角凤拷IP-PORT锟较诧拷 */ +#define COMPAT_PAPP_FOR_BENCHMARK (0) /* 2015-01-07 lijia add, 同papp锟皆比斤拷锟绞, 锟斤拷时锟截憋拷嵌锟阶★拷锟斤拷锟斤拷锟斤拷锟斤拷协锟斤拷, 锟斤拷锟斤拷一锟斤拷 */ +#define USE_RBTREE_INSTEAD_LIST (0) /* 锟斤拷HASH锟斤拷突时, 使锟矫猴拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟, 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷卤锟斤拷锟 */ +//#define USE_LINUX_KERNEL_HASH_ALGO (1) /* 使锟斤拷LINUX锟节猴拷HASH锟姐法 */ -#define SAPP_INSECTICIDE (0) /* 杀虫(DEBUG)临时开关, 在遇到莫名其妙的BUG时临时启用, 尽早发现问题, 早死早超生 */ +#define SAPP_INSECTICIDE (0) /* 杀锟斤拷(DEBUG)锟斤拷时锟斤拷锟斤拷, 锟斤拷锟斤拷锟斤拷莫锟斤拷锟斤拷锟斤拷锟紹UG时锟斤拷时锟斤拷锟斤拷, 锟斤拷锟界发锟斤拷锟斤拷锟斤拷, 锟斤拷锟斤拷锟界超锟斤拷 */ -//#define CYCLE_PKT_DUMP (1 && DEBUG) /* 2015-04-16 lijia add, 解决在线流量无故coredump, 但找不到原因 */ -#define CYCLE_PKT_DUMP (1) /* 2015-04-16 lijia add, 解决在线流量无故coredump, 但找不到原因 */ +//#define CYCLE_PKT_DUMP (1 && DEBUG) /* 2015-04-16 lijia add, 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷薰锟絚oredump, 锟斤拷锟揭诧拷锟斤拷原锟斤拷 */ +#define CYCLE_PKT_DUMP (1) /* 2015-04-16 lijia add, 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷薰锟絚oredump, 锟斤拷锟揭诧拷锟斤拷原锟斤拷 */ -#define PCAP_CAP_FROM_IP (0) /* 为了模拟pag等在线环境, 让pcap也模拟从IPv4头部开始获取 */ +#define PCAP_CAP_FROM_IP (0) /* 为锟斤拷模锟斤拷pag锟斤拷锟斤拷锟竭伙拷锟斤拷, 锟斤拷pcap也模锟斤拷锟絀Pv4头锟斤拷锟斤拷始锟斤拷取 */ -//#define NON_PKT_THREAD_SEND_QUEUE (64) /* 纯发包处理线程最大发送队列数量 */ +//#define NON_PKT_THREAD_SEND_QUEUE (64) /* 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟竭筹拷锟斤拷锟斤拷投锟斤拷锟斤拷锟斤拷锟 */ #define IKNOW_ENABLE (0) @@ -54,7 +54,7 @@ #define sapp_get_struct_header(ptr, type, member) container_of(ptr, type, member) -#define RAW_PKT_MAGIC_NUM (0xF1E2D3C4) /* 1:用于兼容旧项目, 在call_old构造旧数据结构时,识别原始包的来源; 2:安全性检测 */ +#define RAW_PKT_MAGIC_NUM (0xF1E2D3C4) /* 1:锟斤拷锟节硷拷锟捷撅拷锟斤拷目, 锟斤拷call_old锟斤拷锟斤拷锟斤拷锟斤拷萁峁故,识锟斤拷原始锟斤拷锟斤拷锟斤拷源; 2:锟斤拷全锟皆硷拷锟 */ #define SAPP_DESTROY_DONE_FLAG (0x7FFFFFFF) @@ -68,55 +68,55 @@ struct detain_pkt; struct rawpkt_metadata; -/* 原始包结构 */ +/* 原始锟斤拷锟结构 */ typedef struct { /* ---8 bytes-- */ unsigned int magic_num; - int offset_to_raw_pkt_hdr; /* 本层回调对应的数据在raw_pkt_data的偏移量 */ + int offset_to_raw_pkt_hdr; /* 锟斤拷锟斤拷氐锟斤拷锟接︼拷锟斤拷锟斤拷锟斤拷锟絩aw_pkt_data锟斤拷偏锟斤拷锟斤拷 */ /* ===8 bytes=== */ /* ---8 bytes-- */ - enum addr_type_t low_layer_type; /* 原始包最底层协议的类型, 可能是MAC(pcap捕包), 也可能是IPv4(pag捕包) */ - int __lib_raw_pkt_len; /* 底层捕包库提供的包真实原始长度 */ + enum addr_type_t low_layer_type; /* 原始锟斤拷锟斤拷撞锟叫拷锟斤拷锟斤拷锟斤拷, 锟斤拷锟斤拷锟斤拷MAC(pcap锟斤拷锟斤拷), 也锟斤拷锟斤拷锟斤拷IPv4(pag锟斤拷锟斤拷) */ + int __lib_raw_pkt_len; /* 锟阶层捕锟斤拷锟斤拷锟结供锟侥帮拷锟斤拷实原始锟斤拷锟斤拷 */ /* ===8 bytes=== */ /* ---8 bytes-- */ - int raw_pkt_len; /* 给上层应用看的原始包总长度, 有可能不是真实的, 比如跳过了Ethernet层 */ - unsigned int hd_hash; /* 网卡硬件计算的四元组HASH, 减少平台CPU计算消耗 */ + int raw_pkt_len; /* 锟斤拷锟较诧拷应锟矫匡拷锟斤拷原始锟斤拷锟杰筹拷锟斤拷, 锟叫匡拷锟杰诧拷锟斤拷锟斤拷实锟斤拷, 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷Ethernet锟斤拷 */ + unsigned int hd_hash; /* 锟斤拷锟斤拷硬锟斤拷锟斤拷锟斤拷锟斤拷锟皆拷锟紿ASH, 锟斤拷锟斤拷平台CPU锟斤拷锟斤拷锟斤拷锟斤拷 */ /* ===8 bytes=== */ - const void *__lib_raw_pkt_data; /* 底层捕包库提供的真实原始包指针 */ - const void *raw_pkt_data; /* 给上层应用看的原始包头指针, 有可能跳过了Ethernet层, 根据low_layer_type判断协议类型 */ + const void *__lib_raw_pkt_data; /* 锟阶层捕锟斤拷锟斤拷锟结供锟斤拷锟斤拷实原始锟斤拷指锟斤拷 */ + const void *raw_pkt_data; /* 锟斤拷锟较诧拷应锟矫匡拷锟斤拷原始锟斤拷头指锟斤拷, 锟叫匡拷锟斤拷锟斤拷锟斤拷锟斤拷Ethernet锟斤拷, 锟斤拷锟斤拷low_layer_type锟叫讹拷协锟斤拷锟斤拷锟斤拷 */ - struct timeval raw_pkt_ts; /* 原始包捕获时间戳, 如果全为0则不支持此功能(如pag模式) */ + struct timeval raw_pkt_ts; /* 原始锟斤拷锟斤拷锟斤拷时锟斤拷锟, 锟斤拷锟饺0锟斤拷支锟街此癸拷锟斤拷(锟斤拷pag模式) */ //2*8 Bytes - const void *io_lib_pkt_reference; /* 引用底层I/O库的原始包管理结构, 例如:对于marsio来说, 即底层的mbuf结构 */ + const void *io_lib_pkt_reference; /* 锟斤拷锟矫底诧拷I/O锟斤拷锟皆硷拷锟斤拷锟斤拷锟斤拷峁, 锟斤拷锟斤拷:锟斤拷锟斤拷marsio锟斤拷说, 锟斤拷锟阶诧拷锟絤buf锟结构 */ /* ---8 bytes-- */ - int payload_len; /* 负载长度 */ - int device_index;/* 有多块网卡时, 要保证从哪个卡进就从哪个卡出 */ + int payload_len; /* 锟斤拷锟截筹拷锟斤拷 */ + int device_index;/* 锟叫讹拷锟斤拷锟斤拷锟绞, 要锟斤拷证锟斤拷锟侥革拷锟斤拷锟斤拷锟酵达拷锟侥革拷锟斤拷锟斤拷 */ /* ===8 bytes=== */ /* ---8 bytes-- */ unsigned char route_dir:1; - unsigned char is_overlay_pkt:1; /* 表示是真实链路中的数据包, 要无条件回注, 即本机看起来像一根网线; 否则要丢弃 */ + unsigned char is_overlay_pkt:1; /* 锟斤拷示锟斤拷锟斤拷实锟斤拷路锟叫碉拷锟斤拷锟捷帮拷, 要锟斤拷锟斤拷锟斤拷锟斤拷注, 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷一锟斤拷锟斤拷锟斤拷; 锟斤拷锟斤拷要锟斤拷锟斤拷 */ unsigned char is_ctrl_pkt:1; - unsigned char diagnose_error_to_dump:1; /* 是某种错误数据包, 期望pkt_dump存储或udp socket发送给tcpdump_mesa */ - unsigned char drop_current_pkt_flag:1; /* 插件调用MSO_DROP_CURRENT_PKT设置丢弃当前包, 每次处理完要清空 */ + unsigned char diagnose_error_to_dump:1; /* 锟斤拷某锟街达拷锟斤拷锟斤拷锟捷帮拷, 锟斤拷锟斤拷pkt_dump锟芥储锟斤拷udp socket锟斤拷锟酵革拷tcpdump_mesa */ + unsigned char drop_current_pkt_flag:1; /* 锟斤拷锟斤拷锟斤拷锟組SO_DROP_CURRENT_PKT锟斤拷锟矫讹拷锟斤拷锟斤拷前锟斤拷, 每锟轿达拷锟斤拷锟斤拷要锟斤拷锟 */ unsigned char mac_flipping_enable:1; unsigned char padding_flags:2; //1 Bytes unsigned char padding[2]; - unsigned char overlay_layer_bytes; /* 串联封装层长度, 比如vxlan模式下是50字节 */ + unsigned char overlay_layer_bytes; /* 锟斤拷锟斤拷锟斤拷装锟姐长锟斤拷, 锟斤拷锟斤拷vxlan模式锟斤拷锟斤拷50锟街斤拷 */ //3 Bytes //4 Bytes - unsigned short vlan_flipping_couple[2]; /*2020-09-28 lijia add, in host order, vlan flipping for adev, index0表示收到当前包的vlan_id, index1表示原包转发的vlan_id */ + unsigned short vlan_flipping_couple[2]; /*2020-09-28 lijia add, in host order, vlan flipping for adev, index0锟斤拷示锟秸碉拷锟斤拷前锟斤拷锟斤拷vlan_id, index1锟斤拷示原锟斤拷转锟斤拷锟斤拷vlan_id */ //4Bytes /* ===8 bytes=== */ struct detain_pkt *d_pkt; - struct rawpkt_metadata *meta_route_dir[2];// 发送所需的metadata, 用于在调用low_level_send时, 填充marsio 4.6后需要的信息. + struct rawpkt_metadata *meta_route_dir[2];// 锟斤拷锟斤拷锟斤拷锟斤拷锟絤etadata, 锟斤拷锟斤拷锟节碉拷锟斤拷low_level_send时, 锟斤拷锟絤arsio 4.6锟斤拷锟斤拷要锟斤拷锟斤拷息. struct segment_id_list *append_list; struct segment_id_list *prepend_list; unsigned long long stream_trace_id; @@ -144,10 +144,10 @@ struct buf_unorder struct buf_unorder *prev; //void *data; //UINT32 len; - void *this_ip_hdr; /* 可能来源于真实原始包, 也可能来源于重组的IP分片包,靠'ip_reassemble_pkt'区别 */ + void *this_ip_hdr; /* 锟斤拷锟斤拷锟斤拷源锟斤拷锟斤拷实原始锟斤拷, 也锟斤拷锟斤拷锟斤拷源锟斤拷锟斤拷锟斤拷锟絀P锟斤拷片锟斤拷,锟斤拷'ip_reassemble_pkt'锟斤拷锟斤拷 */ struct mesa_tcp_hdr *this_tcp_hdr; - void *tcpdata; /* TCP的数据部分指针, 不含TCP头 */ - UINT16 tcpdatalen; /* TCP的数据部分长度 */ + void *tcpdata; /* TCP锟斤拷锟斤拷锟捷诧拷锟斤拷指锟斤拷, 锟斤拷锟斤拷TCP头 */ + UINT16 tcpdatalen; /* TCP锟斤拷锟斤拷锟捷诧拷锟街筹拷锟斤拷 */ UINT16 urg_ptr; char fin; char urg; @@ -155,80 +155,80 @@ struct buf_unorder unsigned char ip_reassemble_pkt; UINT32 seq; UINT32 ack; - raw_ipfrag_list_t *ipfrag_list; /* 如果当前包是IP分片重组的包, 需要存储所有IP分片包链表 */ - raw_pkt_t raw_pkt; /* 乱序包存储原始包 */ + raw_ipfrag_list_t *ipfrag_list; /* 锟斤拷锟斤拷锟角帮拷锟斤拷锟絀P锟斤拷片锟斤拷锟斤拷陌锟, 锟斤拷要锟芥储锟斤拷锟斤拷IP锟斤拷片锟斤拷锟斤拷锟斤拷 */ + raw_pkt_t raw_pkt; /* 锟斤拷锟斤拷锟斤拷娲⒃硷拷锟 */ }; -/*半流结构体定义:*/ +/*锟斤拷锟斤拷锟结构锟藉定锟藉:*/ struct half_tcpstream { UCHAR *data; - UINT32 offset; /*data中第一个字节在TCP数据流中的偏移量*/ - UINT32 count; /*从连接建立起到现在为止,到达的数据总长度字节数*/ - UINT32 count_new; /*本次新到的数据字节数*/ - UINT32 count_ideal; /*从连接建立起到现在为止,理论上应该到达的数据总长度*/ - UINT32 pktcout; /*本侧累计到达的包个数, 包括重传包, ACK, 但不含SYN */ - UINT32 totallost; /*本侧累计丢包长度*/ - UINT32 seq; /*本侧数据期待的seq序号*/ - UINT32 first_data_seq; /*本侧数据起始的的seq序号*/ + UINT32 offset; /*data锟叫碉拷一锟斤拷锟街斤拷锟斤拷TCP锟斤拷锟斤拷锟斤拷锟叫碉拷偏锟斤拷锟斤拷*/ + UINT32 count; /*锟斤拷锟斤拷锟接斤拷锟斤拷锟斤拷锟斤拷锟斤拷为止锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷艹锟斤拷锟斤拷纸锟斤拷锟*/ + UINT32 count_new; /*锟斤拷锟斤拷锟铰碉拷锟斤拷锟斤拷锟斤拷锟街斤拷锟斤拷*/ + UINT32 count_ideal; /*锟斤拷锟斤拷锟接斤拷锟斤拷锟斤拷锟斤拷锟斤拷为止锟斤拷锟斤拷锟斤拷锟斤拷应锟矫碉拷锟斤拷锟斤拷锟斤拷锟斤拷艹锟斤拷锟*/ + UINT32 pktcout; /*锟斤拷锟斤拷锟桔计碉拷锟斤拷陌锟斤拷锟斤拷锟, 锟斤拷锟斤拷锟截达拷锟斤拷, ACK, 锟斤拷锟斤拷锟斤拷SYN */ + UINT32 totallost; /*锟斤拷锟斤拷锟桔计讹拷锟斤拷锟斤拷锟斤拷*/ + UINT32 seq; /*锟斤拷锟斤拷锟斤拷锟斤拷锟节达拷锟斤拷seq锟斤拷锟*/ + UINT32 first_data_seq; /*锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷始锟侥碉拷seq锟斤拷锟*/ - //UINT32 ack_seq; /*本侧数据最后使用的应答号, 2017-08-02 lijia modify , 移动至struct tcpdetail_private */ + //UINT32 ack_seq; /*锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟绞癸拷玫锟接︼拷锟斤拷, 2017-08-02 lijia modify , 锟狡讹拷锟斤拷struct tcpdetail_private */ - UINT16 window; /*本侧数据滑动窗口大小*/ + UINT16 window; /*锟斤拷锟斤拷锟斤拷锟捷伙拷锟斤拷锟斤拷锟节达拷小*/ UCHAR __pad__; UCHAR finstate; /*fin状态*/ - UINT16 unorder_cnt;/* 2014-11-27 lijia modify, 某些流乱序数巨大, UCHAR型不够, 扩展为UINT16 */ - UINT16 maxunorder; /* 2014-11-27 lijia modify, 某些流乱序数巨大, UCHAR型不够, 扩展为UINT16 */ - struct buf_unorder *unorderlist; /*乱序包的链表*/ - struct buf_unorder *unorderlisttail; /*乱序包的链表尾部指针*/ + UINT16 unorder_cnt;/* 2014-11-27 lijia modify, 某些锟斤拷锟斤拷锟斤拷锟斤拷锟睫达拷, UCHAR锟酵诧拷锟斤拷, 锟斤拷展为UINT16 */ + UINT16 maxunorder; /* 2014-11-27 lijia modify, 某些锟斤拷锟斤拷锟斤拷锟斤拷锟睫达拷, UCHAR锟酵诧拷锟斤拷, 锟斤拷展为UINT16 */ + struct buf_unorder *unorderlist; /*锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟*/ + struct buf_unorder *unorderlisttail; /*锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟轿诧拷锟街革拷锟*/ }; -/* 保存每个流两个方向第一个包, 用于polling entry发包使用 */ +/* 锟斤拷锟斤拷每锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟揭伙拷锟斤拷锟, 锟斤拷锟斤拷polling entry锟斤拷锟斤拷使锟斤拷 */ typedef struct { const raw_pkt_t *raw_pkt_stream_dir[2]; - struct rawpkt_metadata* meta_stream_dir[2];// 每个流的metadata按[0:c2s, 1:s2c]方向存储在polling_inject_context中, update_raw_pkt函数调用时,按方向填充到返回的rawpkt中 + struct rawpkt_metadata* meta_stream_dir[2];// 每锟斤拷锟斤拷锟斤拷metadata锟斤拷[0:c2s, 1:s2c]锟斤拷锟斤拷娲拷锟絧olling_inject_context锟斤拷, update_raw_pkt锟斤拷锟斤拷锟斤拷锟斤拷时锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷涞斤拷锟斤拷氐锟絩awpkt锟斤拷 }polling_inject_context_t; struct streaminfo_private { - /* 对外结构放置在结构体最前, 指针地址可以互相强转 */ + /* 锟斤拷锟斤拷峁癸拷锟斤拷锟斤拷诮峁癸拷锟斤拷锟角, 指锟斤拷锟街凤拷锟斤拷曰锟斤拷锟角孔 */ struct streaminfo stream_public; - struct streaminfo_private *pfather_pr; /* 真实流量的上层流指针, 包括了vxlan等封装层, stream_public.pfather是给业务插件看的,不包括vxlan层的 */ - /* 以下变量为平台内部私有, 对外不可见 */ + struct streaminfo_private *pfather_pr; /* 锟斤拷实锟斤拷锟斤拷锟斤拷锟较诧拷锟斤拷指锟斤拷, 锟斤拷锟斤拷锟斤拷vxlan锟饺凤拷装锟斤拷, stream_public.pfather锟角革拷业锟斤拷锟斤拷锟斤拷锟斤拷,锟斤拷锟斤拷锟斤拷vxlan锟斤拷锟 */ + /* 锟斤拷锟铰憋拷锟斤拷为平台锟节诧拷私锟斤拷, 锟斤拷锟解不锟缴硷拷 */ void *cur_plugin_cb_func; - void *pproject; //每个工程可以自定义使用; + void *pproject; //每锟斤拷锟斤拷锟教匡拷锟斤拷锟皆讹拷锟斤拷使锟矫o拷 /* ---8 bytes-- */ - UCHAR layer_dir:2; /* 单包有效, 当前层的地址是否和默认规则"大端口是客户端"相同 */ - UCHAR stream_dir:1; /* 流的生存期内有效, 流的存储的地址是否和默认规则"大端口是客户端"相同 */ - UCHAR stream_c2s_route_dir:1; /* c2s方向的包, 对应的链路route dir方向, 用于获取inbound, outbound流量 */ - UCHAR addr_use_as_hash:1; /* 本层的addr是否做为HASH计算和比较的参数, 如:MAC地址不参与计算 */ + UCHAR layer_dir:2; /* 锟斤拷锟斤拷锟斤拷效, 锟斤拷前锟斤拷牡锟街凤拷欠锟斤拷默锟较癸拷锟斤拷"锟斤拷丝锟斤拷强突锟斤拷锟"锟斤拷同 */ + UCHAR stream_dir:1; /* 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷效, 锟斤拷锟侥存储锟侥碉拷址锟角凤拷锟侥拷瞎锟斤拷锟"锟斤拷丝锟斤拷强突锟斤拷锟"锟斤拷同 */ + UCHAR stream_c2s_route_dir:1; /* c2s锟斤拷锟斤拷陌锟, 锟斤拷应锟斤拷锟斤拷路route dir锟斤拷锟斤拷, 锟斤拷锟节伙拷取inbound, outbound锟斤拷锟斤拷 */ + UCHAR addr_use_as_hash:1; /* 锟斤拷锟斤拷锟絘ddr锟角凤拷锟斤拷为HASH锟斤拷锟斤拷捅冉系牟锟斤拷锟, 锟斤拷:MAC锟斤拷址锟斤拷锟斤拷锟斤拷锟斤拷锟 */ UCHAR set_special_timeout:1; - 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包头偏移量 */ + UCHAR need_update_opposite_addr:1;/*锟斤拷锟斤拷锟絘ddr锟角凤拷锟节对诧拷锟斤拷锟斤拷时锟斤拷锟铰o拷锟界:MPLS锟斤拷签锟角对筹拷时锟斤拷要锟斤拷S2C锟斤拷锟揭伙拷锟斤拷锟斤拷锟铰硷拷锟斤拷锟斤拷签,锟斤拷值默锟斤拷为0锟斤拷锟斤拷锟斤拷锟斤拷要锟斤拷锟斤拷*/ + UCHAR stream_killed_flag:1; /* 2014-08-22 lijia add, 锟斤拷锟斤拷模式锟斤拷, 锟窖撅拷锟斤拷锟斤拷锟終ill, 之锟斤拷锟斤拷锟斤拷锟街憋拷锟紻rop锟斤拷Kill, 锟斤拷锟斤拷锟劫革拷锟较诧拷锟斤拷 */ + UCHAR dirreverse; /* 锟斤拷锟斤拷锟斤拷锟斤拷时锟角凤拷锟斤拷锟斤拷锟絠p锟斤拷址锟斤拷转, 锟斤拷锟斤拷"锟斤拷丝锟斤拷强突锟斤拷锟"锟斤拷锟斤拷锟洁反 */ + UINT16 timeout;/* 每锟斤拷锟斤拷锟接的讹拷锟叫筹拷时时锟斤拷, 锟斤拷值锟斤拷锟斤拷锟斤拷锟斤拷途, 1:锟斤拷锟节撅拷锟斤拷锟斤拷汰锟斤拷时锟斤拷锟睫帮拷锟斤拷锟斤拷锟斤拷锟, 锟皆斤拷约锟节达拷; 2:锟斤拷锟节憋拷锟斤拷锟斤拷时锟斤拷锟睫帮拷锟斤拷锟斤拷, 锟斤拷锟斤拷IM锟洁长时锟斤拷锟睫帮拷锟斤拷锟斤拷锟接诧拷未锟斤拷锟斤拷, 锟斤拷锟斤拷锟矫较达拷锟絫imeout */ + unsigned short offset_to_raw_pkt_hdr; /* 锟斤拷锟斤拷头锟斤拷锟斤拷锟皆硷拷锟斤拷锟斤拷锟绞硷拷锟街凤拷锟狡拷锟斤拷锟 */ + unsigned short offset_to_ip_hdr; /* 2015-12-07 lijia add, UDP/TCP 锟斤拷头锟斤拷锟斤拷诔锟斤拷氐锟絀P锟斤拷头偏锟斤拷锟斤拷 */ /* ===8 bytes=== */ - const raw_pkt_t *raw_pkt; /* 2014-12-30 lijia add, 有些回调函数不支持原始包, 但发包又需要, 存储于private结构中 */ + 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头部压缩, 原来版本无法保存这个状态, 发包时也无法得知地址如何填充 */ + 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头锟斤拷压锟斤拷, 原锟斤拷锟芥本锟睫凤拷锟斤拷锟斤拷锟斤拷锟阶刺, 锟斤拷锟斤拷时也锟睫凤拷锟斤拷知锟斤拷址锟斤拷锟斤拷锟斤拷 */ unsigned char __pad:1; unsigned char packet_process_context:1; unsigned char is_ctrl_pkt:1; unsigned char plugin_process_context:1; /* 2019-09-07 lijia add, for polling entry send packet */ - unsigned char stream_close_reason:4; /* 2019-02-14 lijia add, 对于TCP使用tcpdetail_private的link_state变量, 对于UDP之前没有, 拆分pad新增此变量 */ + unsigned char stream_close_reason:4; /* 2019-02-14 lijia add, 锟斤拷锟斤拷TCP使锟斤拷tcpdetail_private锟斤拷link_state锟斤拷锟斤拷, 锟斤拷锟斤拷UDP之前没锟斤拷, 锟斤拷锟絧ad锟斤拷锟斤拷锟剿憋拷锟斤拷 */ 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 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=== */ @@ -243,67 +243,67 @@ struct streaminfo_private struct segment_id_list *sid_append_list; struct segment_id_list *sid_prepend_list; - /* 全局流id, stream_index历史上已经表示单机内唯一id, 此处要保证集群所有机器不重复, 所以新建变量; - 高位 --- 低位 + /* 全锟斤拷锟斤拷id, stream_index锟斤拷史锟斤拷锟窖撅拷锟斤拷示锟斤拷锟斤拷锟斤拷唯一id, 锟剿达拷要锟斤拷证锟斤拷群锟斤拷锟叫伙拷锟斤拷锟斤拷锟截革拷, 锟斤拷锟斤拷锟铰斤拷锟斤拷锟斤拷; + 锟斤拷位 --- 锟斤拷位 1 | 12bit device_id | 8bit thread_id | 28bit timestamp in sec | 15bit sequence per thread */ unsigned long long global_stream_id; unsigned long long stream_create_timestamp_ms; unsigned long long stream_lastupdate_timestamp_ms; /* ---8 bytes-- */ - unsigned char layer_index:4; /* 表示当前层的计数, 从最底层开始,一般是ethernet开始, 从0开始计数, 4bit最多支持15层嵌套, 也能防止隧道嵌套攻击(目前还没捕到过包) */ - unsigned char create_dir_by_well_known_port:1; /* UDP或TCP按data建连接, 命中well_known_port规则, 而不是按大端口是客户端原则创建流 */ + unsigned char layer_index:4; /* 锟斤拷示锟斤拷前锟斤拷募锟斤拷锟, 锟斤拷锟斤拷撞憧,一锟斤拷锟斤拷ethernet锟斤拷始, 锟斤拷0锟斤拷始锟斤拷锟斤拷, 4bit锟斤拷锟街э拷锟15锟斤拷嵌锟斤拷, 也锟杰凤拷止锟斤拷锟斤拷嵌锟阶癸拷锟斤拷(目前锟斤拷没锟斤拷锟斤拷锟斤拷锟斤拷) */ + unsigned char create_dir_by_well_known_port:1; /* UDP锟斤拷TCP锟斤拷data锟斤拷锟斤拷锟斤拷, 锟斤拷锟斤拷well_known_port锟斤拷锟斤拷, 锟斤拷锟斤拷锟角帮拷锟斤拷丝锟斤拷强突锟斤拷锟皆拷虼唇锟斤拷锟 */ char __pad2:3; - char has_duplicate_pkt; /* 当前流曾经有过重复数据包, 后续的流量应该每个都检测 */ + char has_duplicate_pkt; /* 锟斤拷前锟斤拷锟斤拷锟斤拷锟叫癸拷锟截革拷锟斤拷锟捷帮拷, 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷应锟斤拷每锟斤拷锟斤拷锟斤拷锟 */ char under_ddos_bypass; char __pad3[3]; /* ===8 bytes=== */ unsigned char ip_ttl_c2s; unsigned char ip_ttl_s2c; - void *stream_bridge; /* 20210425 lijia add, 类似project功能, 支持同步和异步两种模式, 原有project类似异步模式 */ + void *stream_bridge; /* 20210425 lijia add, 锟斤拷锟斤拷project锟斤拷锟斤拷, 支锟斤拷同锟斤拷锟斤拷锟届步锟斤拷锟斤拷模式, 原锟斤拷project锟斤拷锟斤拷锟届步模式 */ }; struct tcpdetail_private { - /* 对外结构放置在结构体最前, 指针地址可以互相强转 */ + /* 锟斤拷锟斤拷峁癸拷锟斤拷锟斤拷诮峁癸拷锟斤拷锟角, 指锟斤拷锟街凤拷锟斤拷曰锟斤拷锟角孔 */ struct tcpdetail tcpdetail_public; /* ---8 bytes-- */ UCHAR multisynflag:2; // multi syn - UCHAR ignore_rst_fin:1; //不会因rst, fin结束, 只能因超时或lru结束 - UCHAR drop_stream_flag:1; //2019-11-20 lijia add, 语义同DROPPKT, 只不过作用域是整个stream - UCHAR auto_remedy_flag:1; //是否启用FD补救 - UCHAR needackflag:1; //需要上传ack报文 + UCHAR ignore_rst_fin:1; //锟斤拷锟斤拷锟斤拷rst, fin锟斤拷锟斤拷, 只锟斤拷锟斤拷时锟斤拷lru锟斤拷锟斤拷 + UCHAR drop_stream_flag:1; //2019-11-20 lijia add, 锟斤拷锟斤拷同DROPPKT, 只锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷stream + UCHAR auto_remedy_flag:1; //锟角凤拷锟斤拷锟斤拷FD锟斤拷锟斤拷 + UCHAR needackflag:1; //锟斤拷要锟较达拷ack锟斤拷锟斤拷 UCHAR takeoverflag:1; - UCHAR has_lost_pkt_flag:1; //2020-08-23 lijia add, 本流曾经丢过包标志位 - UCHAR tcpstateflag; // 用于记录tcp的会话SYN相关状态 - UCHAR link_state; // 链接的状态 + UCHAR has_lost_pkt_flag:1; //2020-08-23 lijia add, 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷志位 + UCHAR tcpstateflag; // 锟斤拷锟节硷拷录tcp锟侥会话SYN锟斤拷锟阶刺 + UCHAR link_state; // 锟斤拷锟接碉拷状态 UCHAR creat_mod; - UINT16 tcpoverlen; // modify by lqy 20150225, 记录当前包与上一个包的重叠tcp长度; - UCHAR offload_stream_flag; //2022-04-13 liuxueli add, 作用域是整个stream + UINT16 tcpoverlen; // modify by lqy 20150225, 锟斤拷录锟斤拷前锟斤拷锟斤拷锟斤拷一锟斤拷锟斤拷锟斤拷锟截碉拷tcp锟斤拷锟饺o拷 + UCHAR offload_stream_flag; //2022-04-13 liuxueli add, 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷stream UCHAR pad; /* ===8 bytes=== */ time_t offload_stream_timestamp_s; - struct half_tcpstream *pclient; //到client的TCP连接信息 - struct half_tcpstream *pserver; //到 server的TCP连接信息 - UINT32 iserverseq; //链接建立时临时存储seq, 此值是C2S->SYN+1 - UINT32 iclientseq; //链接建立时临时存储seq, 此值是S2C->SYN+1 + struct half_tcpstream *pclient; //锟斤拷client锟斤拷TCP锟斤拷锟斤拷锟斤拷息 + struct half_tcpstream *pserver; //锟斤拷 server锟斤拷TCP锟斤拷锟斤拷锟斤拷息 + UINT32 iserverseq; //锟斤拷锟接斤拷锟斤拷时锟斤拷时锟芥储seq, 锟斤拷值锟斤拷C2S->SYN+1 + UINT32 iclientseq; //锟斤拷锟接斤拷锟斤拷时锟斤拷时锟芥储seq, 锟斤拷值锟斤拷S2C->SYN+1 /* NOTE: - 为何first_ack_seq不放在half_tcpstream里? - 因half_tcpstream是在收到第一个带有负载的包才分配的, - 如果在tcp_deal_ack()函数中设置, 如果是S2C方向, 那么第一个S2C数据包到达时, 已经不是first_ack_seq了. - 还可以防止DDOS攻击. + 为锟斤拷first_ack_seq锟斤拷锟斤拷锟斤拷half_tcpstream锟斤拷? + 锟斤拷half_tcpstream锟斤拷锟斤拷锟秸碉拷锟斤拷一锟斤拷锟斤拷锟叫革拷锟截的帮拷锟脚凤拷锟斤拷锟, + 锟斤拷锟斤拷锟絫cp_deal_ack()锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷, 锟斤拷锟斤拷锟絊2C锟斤拷锟斤拷, 锟斤拷么锟斤拷一锟斤拷S2C锟斤拷锟捷帮拷锟斤拷锟斤拷时, 锟窖撅拷锟斤拷锟斤拷first_ack_seq锟斤拷. + 锟斤拷锟斤拷锟皆凤拷止DDOS锟斤拷锟斤拷. */ - UINT32 C2S_first_ack_seq; /* 2017-08-02 lijia modify, C2S侧第一个ACK号, 和half_tcpstream->ack_seq一起可以计算出单向流对侧的数据总量 */ - UINT32 C2S_ack_seq; /* 2017-08-02 lijia add, C2S侧当前的ACK号 */ - UINT32 S2C_first_ack_seq; /* 2017-08-02 lijia modify, C2S侧第一个ACK号, 和half_tcpstream->ack_seq一起可以计算出单向流对侧的数据总量 */ - UINT32 S2C_ack_seq; /* 2017-08-02 lijia add, S2C侧当前的ACK号 */ - void *apme; //应用层上下文 - void *pAllpktpme; //无状态的tcp管理上下文 - struct tcp_flow_stat *flow_stat; /* 2016-07-14 lijia add, 用于记录TCP纯data包的计数, 实际内存分配和释放由project模块完成, 可能为NULL, */ - struct tcp_flow_stat *deduce_flow_stat; /* 2018-10-30 lijia add, 用于记录靠序号推断出理论上传输的数据, 包含丢包的长度; 以及单向流情况下, 对端应该收到的数据 */ + UINT32 C2S_first_ack_seq; /* 2017-08-02 lijia modify, C2S锟斤拷锟揭伙拷锟紸CK锟斤拷, 锟斤拷half_tcpstream->ack_seq一锟斤拷锟斤拷约锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟皆诧拷锟斤拷锟斤拷锟斤拷锟斤拷锟 */ + UINT32 C2S_ack_seq; /* 2017-08-02 lijia add, C2S锟洁当前锟斤拷ACK锟斤拷 */ + UINT32 S2C_first_ack_seq; /* 2017-08-02 lijia modify, C2S锟斤拷锟揭伙拷锟紸CK锟斤拷, 锟斤拷half_tcpstream->ack_seq一锟斤拷锟斤拷约锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟皆诧拷锟斤拷锟斤拷锟斤拷锟斤拷锟 */ + UINT32 S2C_ack_seq; /* 2017-08-02 lijia add, S2C锟洁当前锟斤拷ACK锟斤拷 */ + void *apme; //应锟矫诧拷锟斤拷锟斤拷锟斤拷 + void *pAllpktpme; //锟斤拷状态锟斤拷tcp锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷 + struct tcp_flow_stat *flow_stat; /* 2016-07-14 lijia add, 锟斤拷锟节硷拷录TCP锟斤拷data锟斤拷锟侥硷拷锟斤拷, 实锟斤拷锟节达拷锟斤拷锟斤拷锟酵凤拷锟斤拷project模锟斤拷锟斤拷锟, 锟斤拷锟斤拷为NULL, */ + struct tcp_flow_stat *deduce_flow_stat; /* 2018-10-30 lijia add, 锟斤拷锟节硷拷录锟斤拷锟斤拷锟斤拷贫铣锟斤拷锟斤拷锟斤拷洗锟斤拷锟斤拷锟斤拷锟斤拷, 锟斤拷锟斤拷锟斤拷锟斤拷锟侥筹拷锟斤拷; 锟皆硷拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟, 锟皆讹拷应锟斤拷锟秸碉拷锟斤拷锟斤拷锟斤拷 */ unsigned short rtt_csc; unsigned short rtt_scs; long long last_c2s_pkt_rcv_time; @@ -312,12 +312,12 @@ struct tcpdetail_private struct udpdetail_private { - /* 对外结构放置在结构体最前, 指针地址可以互相强转 */ + /* 锟斤拷锟斤拷峁癸拷锟斤拷锟斤拷诮峁癸拷锟斤拷锟角, 指锟斤拷锟街凤拷锟斤拷曰锟斤拷锟角孔 */ struct udpdetail udpdetail_public; - void *apme; //应用层上下文 - struct udp_flow_stat *flow_stat; /* 2015-12-28 lijia add, udpdetail中的详细计数(64bit), 实际内存分配和释放由project模块完成, 可能为NULL */ - UCHAR drop_stream_flag; //2020-06-02 lijia add, 语义同DROPPKT, 只不过作用域是整个stream - UCHAR offload_stream_flag; //2022-04-13 liuxueli add, 作用域是整个stream + void *apme; //应锟矫诧拷锟斤拷锟斤拷锟斤拷 + struct udp_flow_stat *flow_stat; /* 2015-12-28 lijia add, udpdetail锟叫碉拷锟斤拷细锟斤拷锟斤拷(64bit), 实锟斤拷锟节达拷锟斤拷锟斤拷锟酵凤拷锟斤拷project模锟斤拷锟斤拷锟, 锟斤拷锟斤拷为NULL */ + UCHAR drop_stream_flag; //2020-06-02 lijia add, 锟斤拷锟斤拷同DROPPKT, 只锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷stream + UCHAR offload_stream_flag; //2022-04-13 liuxueli add, 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷stream UCHAR pad[6]; time_t offload_stream_timestamp_s; }; @@ -325,98 +325,98 @@ struct udpdetail_private /* 2015-02-26 lijia add, for stream-addr-list ntop, pton */ typedef struct{ struct streaminfo stream; - char addr_value[MAX_ADDR_BIN_VALUE_LEN]; /* 为了paddr不用再malloc, 提高性能, 在stream后面追加一块缓存 */ + char addr_value[MAX_ADDR_BIN_VALUE_LEN]; /* 为锟斤拷paddr锟斤拷锟斤拷锟斤拷malloc, 锟斤拷锟斤拷锟斤拷锟, 锟斤拷stream锟斤拷锟斤拷追锟斤拷一锟介缓锟斤拷 */ }addr_continuous_bin_t; typedef struct{ enum addr_type_t addr_type_bin; - UCHAR stream_type;/* 用于识别ADDR_TYPE_IPV4是TCP还是UDP */ + UCHAR stream_type;/* 锟斤拷锟斤拷识锟斤拷ADDR_TYPE_IPV4锟斤拷TCP锟斤拷锟斤拷UDP */ const char *addr_type_str; const char *addr_type_prefix; - const char *addr_type_prefix_with_delim; /* 带分隔符的前缀, 用于比较字符串, 防止IPv4和IPv4_TCP字符串比较时混淆, 如果用IPv4:, IPv4_TCP:就不存在混淆风险 */ + const char *addr_type_prefix_with_delim; /* 锟斤拷锟街革拷锟斤拷锟斤拷前缀, 锟斤拷锟节比斤拷锟街凤拷锟斤拷, 锟斤拷止IPv4锟斤拷IPv4_TCP锟街凤拷锟斤拷锟饺斤拷时锟斤拷锟斤拷, 锟斤拷锟斤拷锟絀Pv4:, IPv4_TCP:锟酵诧拷锟斤拷锟节伙拷锟斤拷锟斤拷锟斤拷 */ int (*addr_n2p_fun)(const struct layer_addr *paddr, char *buf, int buf_len); int (*addr_p2n_fun)(char *addr_str, addr_continuous_bin_t *addr_bin_val); const char *addr_type_string_abbreviation; }addr_convert_t; struct pptp_stream_key{ - UINT32 sip; /* TCP-SYN包的源IP, 如果是按data建连接, 根据pptp->message_type判断, REQ类请求包的源IP认为是sip */ + UINT32 sip; /* TCP-SYN锟斤拷锟斤拷源IP, 锟斤拷锟斤拷前锟絛ata锟斤拷锟斤拷锟斤拷, 锟斤拷锟斤拷pptp->message_type锟叫讹拷, REQ锟斤拷锟斤拷锟斤拷锟斤拷锟皆碔P锟斤拷为锟斤拷sip */ UINT32 dip; /* sip,dip are network order */ - UINT16 sip_side_call_id; /* 网络数据包中由sip发出的GRE包的callid, 实际意义表示peer call id, network order */ - UINT16 dip_side_call_id; /* 网络数据包中由dip发出的GRE包的callid, 实际意义表示peer call id, network order */ - //struct streaminfo_private *stream_pr; /* TODO 1, 用于保存地址链表, 目前仅用了最底层的IP和call_id */ + UINT16 sip_side_call_id; /* 锟斤拷锟斤拷锟斤拷锟捷帮拷锟斤拷锟斤拷sip锟斤拷锟斤拷锟斤拷GRE锟斤拷锟斤拷callid, 实锟斤拷锟斤拷锟斤拷锟绞緋eer call id, network order */ + UINT16 dip_side_call_id; /* 锟斤拷锟斤拷锟斤拷锟捷帮拷锟斤拷锟斤拷dip锟斤拷锟斤拷锟斤拷GRE锟斤拷锟斤拷callid, 实锟斤拷锟斤拷锟斤拷锟绞緋eer call id, network order */ + //struct streaminfo_private *stream_pr; /* TODO 1, 锟斤拷锟节憋拷锟斤拷锟街凤拷锟斤拷锟, 目前锟斤拷锟斤拷锟斤拷锟斤拷撞锟斤拷IP锟斤拷call_id */ }; -/* PPTP协议解析层管理结构, sapp内部使用 */ +/* PPTP协锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟结构, sapp锟节诧拷使锟斤拷 */ struct pptp_info_pri{ struct MESA_tunnel_info tunnel_context; struct pptp_stream_key pptp_key; - stSessionInfo ssinfo; /* 调用业务层上下文信息 */ - void *biz_pme; /* 业务层自定义数据 */ - struct streaminfo *my_stream; /* pptp底层UDP流 */ + stSessionInfo ssinfo; /* 锟斤拷锟斤拷业锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟较 */ + void *biz_pme; /* 业锟斤拷锟斤拷远锟斤拷锟斤拷锟斤拷锟 */ + struct streaminfo *my_stream; /* pptp锟阶诧拷UDP锟斤拷 */ unsigned char threadnum; - char insert_hash_flag; /* 控制连接已将key插入HASH表 */ - char content_notify_biz_flag; /* 是否已经调用过业务插件, 告之content_type */ + char insert_hash_flag; /* 锟斤拷锟斤拷锟斤拷锟斤拷锟窖斤拷key锟斤拷锟斤拷HASH锟斤拷 */ + char content_notify_biz_flag; /* 锟角凤拷锟窖撅拷锟斤拷锟矫癸拷业锟斤拷锟斤拷, 锟斤拷之content_type */ }; -/* 私有pptp地址, pptp_addr提供给业务插件, 其中gre_layer_len用于FD时快速识别本层头部长度 */ +/* 私锟斤拷pptp锟斤拷址, pptp_addr锟结供锟斤拷业锟斤拷锟斤拷, 锟斤拷锟斤拷gre_layer_len锟斤拷锟斤拷FD时锟斤拷锟斤拷识锟金本诧拷头锟斤拷锟斤拷锟斤拷 */ struct layer_addr_pptp_pri{ struct layer_addr_pptp pptp_addr; int gre_layer_len; }; struct l2tp_stream_key{ - UINT32 sip; /* L2TP隧道主动发起方的IP, 即控制类型SCCRQ, ICRQ, SCCCN等包的源IP, network order */ - UINT32 dip; /* L2TP隧道服务器端的IP, network order */ + UINT32 sip; /* L2TP锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟金方碉拷IP, 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷SCCRQ, ICRQ, SCCCN锟饺帮拷锟斤拷源IP, network order */ + UINT32 dip; /* L2TP锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟剿碉拷IP, network order */ UINT16 sport; /* network order */ UINT16 dport; /* network order */ - UINT16 sip_side_tunnel_id; /* sip测发来包的tunnelid, network order */ - UINT16 sip_side_session_id; /* sip测发来包的tunnelid, network order */ - UINT16 dip_side_tunnel_id; /* dip测发来包的tunnelid, network order */ - UINT16 dip_side_session_id; /* dip测发来包的tunnelid, network order */ - //struct streaminfo_private *stream_pr; /* TODO 1, 用于保存地址链表, 目前仅用了最底层的IP和call_id */ + UINT16 sip_side_tunnel_id; /* sip锟解发锟斤拷锟斤拷锟斤拷tunnelid, network order */ + UINT16 sip_side_session_id; /* sip锟解发锟斤拷锟斤拷锟斤拷tunnelid, network order */ + UINT16 dip_side_tunnel_id; /* dip锟解发锟斤拷锟斤拷锟斤拷tunnelid, network order */ + UINT16 dip_side_session_id; /* dip锟解发锟斤拷锟斤拷锟斤拷tunnelid, network order */ + //struct streaminfo_private *stream_pr; /* TODO 1, 锟斤拷锟节憋拷锟斤拷锟街凤拷锟斤拷锟, 目前锟斤拷锟斤拷锟斤拷锟斤拷撞锟斤拷IP锟斤拷call_id */ }; struct l2tp_info_pri{ struct MESA_tunnel_info tunnel_context; struct l2tp_stream_key l2tp_key; - stSessionInfo ssinfo; /* 调用业务层上下文 */ + stSessionInfo ssinfo; /* 锟斤拷锟斤拷业锟斤拷锟斤拷锟斤拷锟斤拷锟 */ void *biz_pme; - const struct streaminfo *my_stream; /* l2tp底层UDP流 */ + const struct streaminfo *my_stream; /* l2tp锟阶诧拷UDP锟斤拷 */ unsigned char thread_seq; - char content_notify_biz_flag; /* 是否已经调用过业务插件, 告之content_type */ + char content_notify_biz_flag; /* 锟角凤拷锟窖撅拷锟斤拷锟矫癸拷业锟斤拷锟斤拷, 锟斤拷之content_type */ }; #define STATSD_SEND_MSS (1472) -/* 全局唯一的全局变量, 通常是开关类配置项, 或不常变化的全局变量, 如流表数等, 多用于只读 */ +/* 全锟斤拷唯一锟斤拷全锟街憋拷锟斤拷, 通锟斤拷锟角匡拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷, 锟津不筹拷锟戒化锟斤拷全锟街憋拷锟斤拷, 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷, 锟斤拷锟斤拷锟斤拷只锟斤拷 */ struct sapp_global_single_t{ - int signal_take_over_sw; /* 是否接管常见系统信号, 如SIGSEGV, SIGABRT等等 */ - int ipentry_priority_over_ipfrag; /* IP_entry优先级高于IP_frag_entry, 默认为0, 适应WY串联特定需求 */ - //int kill_tcp_with_gdev; /* FD未生效时, 借助gdev串联规则 */ - int cfg_send_tcp_offload_sw; /* 超过网卡MTU时, 主动切片成多个小于MTU的包发送 */ - //int cfg_kill_tcp_rst_num; /* kill_tcp发送rst包数量 */ - //int cfg_kill_tcp_rst_signature; /* kill_tcp发送的rst是否需要指纹信息, 用于识别 */ - //int tuple4_reuse_time_interval; /* 四元组重用的最小间隔时间 */ + int signal_take_over_sw; /* 锟角凤拷庸艹锟斤拷锟较低筹拷藕锟, 锟斤拷SIGSEGV, SIGABRT锟饺碉拷 */ + int ipentry_priority_over_ipfrag; /* IP_entry锟斤拷锟饺硷拷锟斤拷锟斤拷IP_frag_entry, 默锟斤拷为0, 锟斤拷应WY锟斤拷锟斤拷锟截讹拷锟斤拷锟斤拷 */ + //int kill_tcp_with_gdev; /* FD未锟斤拷效时, 锟斤拷锟斤拷gdev锟斤拷锟斤拷锟斤拷锟斤拷 */ + int cfg_send_tcp_offload_sw; /* 锟斤拷锟斤拷锟斤拷锟斤拷MTU时, 锟斤拷锟斤拷锟斤拷片锟缴讹拷锟叫★拷锟組TU锟侥帮拷锟斤拷锟斤拷 */ + //int cfg_kill_tcp_rst_num; /* kill_tcp锟斤拷锟斤拷rst锟斤拷锟斤拷锟斤拷 */ + //int cfg_kill_tcp_rst_signature; /* kill_tcp锟斤拷锟酵碉拷rst锟角凤拷锟斤拷要指锟斤拷锟斤拷息, 锟斤拷锟斤拷识锟斤拷 */ + //int tuple4_reuse_time_interval; /* 锟斤拷元锟斤拷锟斤拷锟矫碉拷锟斤拷小锟斤拷锟绞憋拷锟 */ //void *fs2_handle; const char *fs2_server_ip; unsigned short fs2_server_port_host; short __pad1; - //int send_fake_pkt_mode; /* 2018-10-26 lijia add, for PanGu, 由于缺少FD路由, 需借用串联GDEV发送rst包, DNS-fake包等,mode 0: 协议栈三层发包, 1:协议栈二层发包,3:gdev注入发包,此模式下send_fake_pkt_gdev_sport有效 */ - //int send_fake_pkt_gdev_sport; /* 2018-10-26 lijia add, for PanGu, 用于选择vxlan源端口 */ + //int send_fake_pkt_mode; /* 2018-10-26 lijia add, for PanGu, 锟斤拷锟斤拷缺锟斤拷FD路锟斤拷, 锟斤拷锟斤拷么锟斤拷锟紾DEV锟斤拷锟斤拷rst锟斤拷, DNS-fake锟斤拷锟斤拷,mode 0锟斤拷 协锟斤拷栈锟斤拷锟姐发锟斤拷锟斤拷 1锟斤拷协锟斤拷栈锟斤拷锟姐发锟斤拷锟斤拷3锟斤拷gdev注锟诫发锟斤拷锟斤拷锟斤拷模式锟斤拷send_fake_pkt_gdev_sport锟斤拷效 */ + //int send_fake_pkt_gdev_sport; /* 2018-10-26 lijia add, for PanGu, 锟斤拷锟斤拷选锟斤拷vxlan源锟剿匡拷 */ int send_fake_pkt_sip; }; -#define TIMESTAMP_SINGLE_PKT_REGION (4) /* 单包延时统计区间 */ -#define TIMESTAMP_SINGLE_PKT_REGION_MAX (5) /* 包括超过统计区间的值 */ +#define TIMESTAMP_SINGLE_PKT_REGION (4) /* 锟斤拷锟斤拷锟斤拷时统锟斤拷锟斤拷锟斤拷 */ +#define TIMESTAMP_SINGLE_PKT_REGION_MAX (5) /* 锟斤拷锟斤拷锟斤拷锟斤拷统锟斤拷锟斤拷锟斤拷锟街 */ typedef struct{ - unsigned int runtime_pkt_max_delay; /* 单包最大处理延时 */ - unsigned long long pkt_total_num[TIMESTAMP_SINGLE_PKT_REGION_MAX]; /* 记录包处理延时的总包数, 按区域统计 */ - unsigned long long pkt_total_time; /* 最近一段时间的总延时, 用于计算平均单包处理延时 */ + unsigned int runtime_pkt_max_delay; /* 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟绞 */ + unsigned long long pkt_total_num[TIMESTAMP_SINGLE_PKT_REGION_MAX]; /* 锟斤拷录锟斤拷锟斤拷锟斤拷锟斤拷时锟斤拷锟杰帮拷锟斤拷, 锟斤拷锟斤拷锟斤拷统锟斤拷 */ + unsigned long long pkt_total_time; /* 锟斤拷锟揭伙拷锟绞憋拷锟斤拷锟斤拷锟斤拷时, 锟斤拷锟节硷拷锟斤拷平锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷时 */ }timestamp_record_region_t; -/* 多线程全局变量, 例如数据包统计信息, 通常值会实时变化 */ +/* 锟斤拷锟竭筹拷全锟街憋拷锟斤拷, 锟斤拷锟斤拷锟斤拷锟捷帮拷统锟斤拷锟斤拷息, 通锟斤拷值锟斤拷实时锟戒化 */ struct sapp_global_mthread_t{ int ipv6_pkt_type_flag; /* ipv6 packet type, normal, or rebuild */ int pptp_hash_max_search_times; @@ -424,28 +424,28 @@ struct sapp_global_mthread_t{ char __pad1[4]; double pptp_hash_avg_search_times; double l2tp_hash_avg_search_times; - int tcp_stream_special_timeout_num; /* 设置单独超时时间的流, 默认不允许超过总流表的10% */ - int udp_stream_special_timeout_num;/* 设置单独超时时间的流, 默认不允许超过总流表的10% */ + int tcp_stream_special_timeout_num; /* 锟斤拷锟矫碉拷锟斤拷锟斤拷时时锟斤拷锟斤拷锟, 默锟较诧拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷10% */ + int udp_stream_special_timeout_num;/* 锟斤拷锟矫碉拷锟斤拷锟斤拷时时锟斤拷锟斤拷锟, 默锟较诧拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷10% */ timestamp_record_region_t runtime_record; - timestamp_record_region_t runtime_record_driver; /* 驱动从网卡拿到包, 到平台拿到包的延时 */ + timestamp_record_region_t runtime_record_driver; /* 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟矫碉拷锟斤拷, 锟斤拷平台锟矫碉拷锟斤拷锟斤拷锟斤拷时 */ }__attribute__ ((aligned (64))); typedef struct{ #ifdef DEBUG - unsigned int magic; /* malloc后填充0x4D4D4D4D, 即MMMM 的16进制; free后填充0xFEFEFEFE */ + unsigned int magic; /* malloc锟斤拷锟斤拷锟0x4D4D4D4D, 锟斤拷MMMM 锟斤拷16锟斤拷锟斤拷; free锟斤拷锟斤拷锟0xFEFEFEFE */ #endif unsigned int user_buf_size; }sapp_private_mem_t; /* - vxlan ppp和hdlc字段基本不变, 不像ethernet, 涉及到反向发包, 要将mac地址颠倒方向. - 所以不再创建一个新的streaminfo结构, 浪费内存也耗费CPU, 意义不大, - 将hdlc, ppp的字段和vxlan合并, 类似ip层和tcp/udp的关系一样. + vxlan ppp锟斤拷hdlc锟街段伙拷锟斤拷锟斤拷锟斤拷, 锟斤拷锟斤拷ethernet, 锟芥及锟斤拷锟斤拷锟津发帮拷, 要锟斤拷mac锟斤拷址锟竭碉拷锟斤拷锟斤拷. + 锟斤拷锟皆诧拷锟劫达拷锟斤拷一锟斤拷锟铰碉拷streaminfo锟结构, 锟剿凤拷锟节达拷也锟侥凤拷CPU, 锟斤拷锟藉不锟斤拷, + 锟斤拷hdlc, ppp锟斤拷锟街段猴拷vxlan锟较诧拷, 锟斤拷锟斤拷ip锟斤拷锟絫cp/udp锟侥癸拷系一锟斤拷. */ struct layer_addr_vxlan_private{ struct layer_addr_vxlan addr_public; - unsigned char actual_total_len; /* 真正的网络传输中的vxlan头部地址长度, 包括后续追加的hdlc, ppp字段 */ + unsigned char actual_total_len; /* 锟斤拷锟斤拷锟斤拷锟斤拷锟界传锟斤拷锟叫碉拷vxlan头锟斤拷锟斤拷址锟斤拷锟斤拷, 锟斤拷锟斤拷锟斤拷锟斤拷追锟接碉拷hdlc, ppp锟街讹拷 */ union{ struct hdlc_net_hdr inner_hdlc; struct layer_ppp_hdr inner_ppp; @@ -523,7 +523,6 @@ void packet_io_device_alias_destroy(void); void sapp_dup_pkt_destroy(void); const char *stream_bridge_id_to_name(int bridge_id); void sapp_printf(const char *fmt, ...); -int sapp_mem_init(void); #ifdef __cplusplus } diff --git a/src/common/sapp_mem.c b/src/common/sapp_mem.c index 0b1395b..09f33a5 100644 --- a/src/common/sapp_mem.c +++ b/src/common/sapp_mem.c @@ -190,9 +190,9 @@ void sapp_mem_stat_output(void) char time_string[128]; /* - 防止哪天新增了一个类型, 而忘了加到 mem_stat_name_tuple[] 数组里, 或者顺序不对, 此处要校验一下. + 锟斤拷止锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷一锟斤拷锟斤拷锟斤拷, 锟斤拷锟斤拷锟剿加碉拷 mem_stat_name_tuple[] 锟斤拷锟斤拷锟斤拷, 锟斤拷锟斤拷顺锟津不讹拷, 锟剿达拷要校锟斤拷一锟斤拷. - TODO: 其实初始化验证一次就行, 没必要每次输出日志时都检查!! + TODO: 锟斤拷实锟斤拷始锟斤拷锟斤拷证一锟轿撅拷锟斤拷, 没锟斤拷要每锟斤拷锟斤拷锟斤拷锟街臼憋拷锟斤拷锟斤拷!! */ int stat_name_tuple_num = sizeof(mem_stat_name_tuple)/sizeof(mem_stat_name_tuple_t); assert(stat_name_tuple_num == __SAPP_MEM_TYPE_MAX); @@ -231,7 +231,7 @@ void sapp_mem_stat_output(void) fix_realtime_stat.mem_used_block[stat_index] += mem_used_stat->mem_used_block[stat_index]; fix_realtime_stat.mem_used_bytes[stat_index] += mem_used_stat->mem_used_bytes[stat_index]; } - /* 固定内存使用输出, SAPP_MEM_FIX_GLOBAL_VAL 比较特殊, 直接从全局变量中获取 */ + /* 锟教讹拷锟节达拷使锟斤拷锟斤拷锟, SAPP_MEM_FIX_GLOBAL_VAL 锟饺斤拷锟斤拷锟斤拷, 直锟接达拷全锟街憋拷锟斤拷锟叫伙拷取 */ fix_realtime_stat.mem_used_block[SAPP_MEM_FIX_GLOBAL_VAL] = g_sapp_global_mem_used_block; fix_realtime_stat.mem_used_bytes[SAPP_MEM_FIX_GLOBAL_VAL] = g_sapp_global_mem_used_bytes; @@ -249,7 +249,7 @@ void sapp_mem_stat_output(void) fprintf(fp, "\n%7s\n", "Dynamic"); - /* 先把多个线程的数值求和 */ + /* 锟饺把讹拷锟斤拷叱痰锟斤拷锟街碉拷锟斤拷 */ for(tseq=0;tseqmthread_volatile[tseq]->mem_used_stat; for(stat_index = __SAPP_MEM_TYPE_INIT+1; stat_index < __SAPP_MEM_TYPE_MAX; stat_index++){ @@ -288,37 +288,6 @@ void sapp_mem_stat_output(void) fclose(fp); } -char bloomfilter_stat_polling_entry(struct streaminfo *nouse1, void **nouse2, int thread_seq, void *nouse3) -{ - static time_t last_get_time[SAPP_MAX_THREADS] = {}; - - if(ABBR_CURRENT_TIME <= last_get_time[thread_seq]) - { - return POLLING_STATE_IDLE; - } - - long long blocks = 0, bytes = 0; - bloomfilter_get_mem_stat(thread_seq, &blocks, &bytes); - - sapp_global_val->mthread_volatile[thread_seq]->mem_used_stat.mem_used_block[SAPP_MEM_DYN_BLOOM_FILTER] = blocks; - sapp_global_val->mthread_volatile[thread_seq]->mem_used_stat.mem_used_bytes[SAPP_MEM_DYN_BLOOM_FILTER] = bytes; - - last_get_time[thread_seq] = ABBR_CURRENT_TIME; - return POLLING_STATE_WORK; -} - -int sapp_mem_init(void) -{ - if(sapp_global_val->config.packet_io.dup_pkt_para.kickout_udp_stream_enabled - || sapp_global_val->config.packet_io.dup_pkt_para.dup_pkt_distinguish_ipv4_tcp - || sapp_global_val->config.packet_io.dup_pkt_para.dup_pkt_distinguish_ipv4_udp - || sapp_global_val->config.packet_io.dup_pkt_para.dup_pkt_distinguish_all_inject) - { - stream_register_fun(FUN_TYPE_POLLING, (char (*)(void))bloomfilter_stat_polling_entry, 0); - } - return 0; -} - #ifdef __cplusplus } #endif diff --git a/src/dealpkt/duplicate_pkt_distinguish.c b/src/dealpkt/duplicate_pkt_distinguish.c index 54a1593..9b0fea0 100644 --- a/src/dealpkt/duplicate_pkt_distinguish.c +++ b/src/dealpkt/duplicate_pkt_distinguish.c @@ -8,22 +8,25 @@ extern "C" { #include "ap_bloom.h" #include "dablooms.h" + + + /* 璇嗗埆鍥犺矾鐢辩瓥鐣ュ鑷寸殑閲嶅娴侀噺, 棣栨鏀跺埌鏁版嵁鍖呭姞鍏loom filter, 姣忎釜娴佺殑鍓峃涓寘鎵弿bloom filter, 閲嶅鐨勬暟鎹寘鐩存帴杞彂鍗冲彲. - ip灞傜殑ttl, hop涓嶈兘绠椾负key, 鍥犱负缁忚繃浜嗗嚑璺宠矾鐢卞櫒鍙堝洖缁曚簡, ttl鑲畾浼氬彉锟??, 鑰屼笂灞傜殑鏁版嵁鍖呯‘瀹炴槸閲嶅锟??. + ip灞傜殑ttl, hop涓嶈兘绠椾负key, 鍥犱负缁忚繃浜嗗嚑璺宠矾鐢卞櫒鍙堝洖缁曚簡, ttl鑲畾浼氬彉锟??, 鑰屼笂灞傜殑鏁版嵁鍖呯‘瀹炴槸閲嶅锟??. */ /* 2021-05-18 lijia close ipv6 protocol: 閲嶅娴侀噺璇嗗埆bloom filter鍙ユ焺, 鏍规嵁娴侀噺鏂瑰悜鍜屽崗璁殑涓嶅悓, 鍔熻兘鍒嗕负涓夌被, - IPv6鍥犱负娌℃湁Ipid瀛楁, 鏃犳硶鍖哄埆鐪熸鐨勫簲鐢ㄥ眰閲嶄紶鍜岄噸澶嶆祦锟??, 寮鍚簡浼氬鑷存柇缃戞垨鑰匔T, 鎵浠ヤ笉鏀寔!!! + IPv6鍥犱负娌℃湁Ipid瀛楁, 鏃犳硶鍖哄埆鐪熸鐨勫簲鐢ㄥ眰閲嶄紶鍜岄噸澶嶆祦锟??, 寮鍚簡浼氬鑷存柇缃戞垨鑰匔T, 鎵浠ヤ笉鏀寔!!! - 瀵逛簬IPv6鐨勪袱绉嶆儏锟??: - 1)濡傛灉寮鍚簡浠g悊绛栫暐, 閲嶄紶鍖呰璇嗗埆鎴愪簡閲嶅鍖呯殑锟??, sapp灏辩洿鎺ASS锟??, 瀹為檯閭d釜鍖呮槸鐪熷疄閫氫俊鍙屾柟鍙戠殑, 娌℃湁缁忚繃tfe澶勭悊, 鍙兘灏辨柇缃戜簡. - 2)濡傛灉寮鍚簡firewall鐨刣rop绛栫暐, 绗竴娆rop鎴愬姛锟??, 浣嗗簲鐢ㄥ眰浼氶噸锟??, 閲嶄紶鍖呰璇嗗埆鎴愪簡閲嶅鍖呯殑锟??, sapp灏辩洿鎺ASS锟??, 瀵艰嚧CT. + 瀵逛簬IPv6鐨勪袱绉嶆儏锟??: + 1)濡傛灉寮鍚簡浠g悊绛栫暐, 閲嶄紶鍖呰璇嗗埆鎴愪簡閲嶅鍖呯殑锟??, sapp灏辩洿鎺ASS锟??, 瀹為檯閭d釜鍖呮槸鐪熷疄閫氫俊鍙屾柟鍙戠殑, 娌℃湁缁忚繃tfe澶勭悊, 鍙兘灏辨柇缃戜簡. + 2)濡傛灉寮鍚簡firewall鐨刣rop绛栫暐, 绗竴娆rop鎴愬姛锟??, 浣嗗簲鐢ㄥ眰浼氶噸锟??, 閲嶄紶鍖呰璇嗗埆鎴愪簡閲嶅鍖呯殑锟??, sapp灏辩洿鎺ASS锟??, 瀵艰嚧CT. */ void *bloom_new(const sapp_dup_pkt_t *dup_conf, struct timeval now, long now_ms) @@ -221,6 +224,24 @@ int bloomfilter_get_mem_stat(int tseq, long long *mem_blocks, long long *mem_byt return 0; } +__thread time_t t_last_get_time = 0; +void bloom_mem_stat_update(int thread_seq, time_t now) +{ + if(now <= t_last_get_time) + { + return; + } + + long long blocks = 0, bytes = 0; + bloomfilter_get_mem_stat(thread_seq, &blocks, &bytes); + + sapp_global_val->mthread_volatile[thread_seq]->mem_used_stat.mem_used_block[SAPP_MEM_DYN_BLOOM_FILTER] = blocks; + sapp_global_val->mthread_volatile[thread_seq]->mem_used_stat.mem_used_bytes[SAPP_MEM_DYN_BLOOM_FILTER] = bytes; + + t_last_get_time = now; + return; +} + int sapp_dup_stream_search(struct streaminfo *a_stream) { void *key=NULL; @@ -237,6 +258,7 @@ int sapp_dup_stream_search(struct streaminfo *a_stream) } struct timeval now={g_CurrentTime, 0}; + bloom_mem_stat_update(a_stream->threadnum, g_CurrentTime); return bloom_check(sapp_global_val->mthread_volatile[a_stream->threadnum]->dup_pkt_distinguish_handle, key, key_len, &sapp_global_val->config.packet_io.dup_pkt_para, now, g_current_time_ms); } @@ -256,6 +278,7 @@ void sapp_dup_stream_add(struct streaminfo *a_stream) key_len=sizeof(struct stream_tuple4_v6); } struct timeval now={g_CurrentTime, 0}; + bloom_mem_stat_update(a_stream->threadnum, g_CurrentTime); bloom_add(sapp_global_val->mthread_volatile[a_stream->threadnum]->dup_pkt_distinguish_handle, key, key_len, &sapp_global_val->config.packet_io.dup_pkt_para, now, g_current_time_ms); } @@ -276,8 +299,8 @@ static inline int sapp_set_dup_pkt_key(enum addr_type_t addr_type, enum stream_t if (stream_type == STREAM_TYPE_UDP) { const struct mesa_udp_hdr *uhdr = (const struct mesa_udp_hdr *)l4_hdr; - l4->tcp_seq = 0x5A5A5A5A; /* udp娌℃湁, 浣嗚锟??0鍙兘瀵规煇浜沨ash鍑芥暟涓嶅弸锟??, 姝ゅ璁句釜鍥哄畾锟?? */ - l4->tcp_ack = 0xA5A5A5A5; /* udp娌℃湁, 浣嗚锟??0鍙兘瀵规煇浜沨ash鍑芥暟涓嶅弸锟??, 姝ゅ璁句釜鍥哄畾锟?? */ + l4->tcp_seq = 0x5A5A5A5A; /* udp娌℃湁, 浣嗚锟??0鍙兘瀵规煇浜沨ash鍑芥暟涓嶅弸锟??, 姝ゅ璁句釜鍥哄畾锟?? */ + l4->tcp_ack = 0xA5A5A5A5; /* udp娌℃湁, 浣嗚锟??0鍙兘瀵规煇浜沨ash鍑芥暟涓嶅弸锟??, 姝ゅ璁句釜鍥哄畾锟?? */ l4->sport = uhdr->uh_sport; l4->dport = uhdr->uh_dport; l4->checksum = uhdr->uh_sum; @@ -315,7 +338,7 @@ int sapp_dup_pkt_identify(int tid, struct streaminfo_private *pstream_pr, int is_dup_pkt = 0; union sapp_dup_pkt_key dup_bloom_key; struct timeval now={g_CurrentTime, 0}; - + bloom_mem_stat_update(tid, g_CurrentTime); size_t key_len = sapp_set_dup_pkt_key((enum addr_type_t)pstream_pr->stream_public.addr.addrtype, (enum stream_type_t)pstream_pr->stream_public.type, ip_hdr, (void *)l4_hdr, &dup_bloom_key); is_dup_pkt= bloom_check(sapp_global_val->mthread_volatile[tid]->dup_pkt_distinguish_handle, (const char*)&dup_bloom_key, key_len, &sapp_global_val->config.packet_io.dup_pkt_para, now, g_current_time_ms); if(is_dup_pkt != 0){ @@ -333,6 +356,7 @@ void sapp_dup_pkt_mark_l4(struct streaminfo *a_stream, const void *ip_hdr, const union sapp_dup_pkt_key dup_bloom_key; size_t key_len = 0; int ret = 0; + bloom_mem_stat_update(tid, g_CurrentTime); struct timeval now={g_CurrentTime, 0}; key_len = sapp_set_dup_pkt_key((enum addr_type_t)a_stream->addr.addrtype, (enum stream_type_t)a_stream->type, ip_hdr, l4_hdr, &dup_bloom_key); bloom_add(sapp_global_val->mthread_volatile[tid]->dup_pkt_distinguish_handle, (const char*)&dup_bloom_key, key_len, &sapp_global_val->config.packet_io.dup_pkt_para, now, g_current_time_ms); @@ -351,8 +375,8 @@ int sapp_dup_pkt_init(void) return 0; } - /* 娴侀噺鍏ュ彛鏈変笁涓紑锟??, 璇嗗埆鍙ユ焺鍙湁涓锟??, - 鎷嗗垎鍙ユ焺澶氳楄垂鍐呭瓨, 涓斿垽鏂椂姣忎釜鍖呴渶瑕佹壂鎻忓涓彞锟??, + /* 娴侀噺鍏ュ彛鏈変笁涓紑锟??, 璇嗗埆鍙ユ焺鍙湁涓锟??, + 鎷嗗垎鍙ユ焺澶氳楄垂鍐呭瓨, 涓斿垽鏂椂姣忎釜鍖呴渶瑕佹壂鎻忓涓彞锟??, 鍙兘濂藉鍙槸鍑嗙‘鐜囬珮浜嗕竴鐐圭偣鑰屽凡 */ struct timeval now={time(NULL), 0}; for(i = 0; i < sapp_global_val->config.cpu.worker_threads; i++){ diff --git a/src/sapp_dev/sapp_init.c b/src/sapp_dev/sapp_init.c index ddac21e..007ba02 100644 --- a/src/sapp_dev/sapp_init.c +++ b/src/sapp_dev/sapp_init.c @@ -303,8 +303,6 @@ int MESA_platform_init(int argc, char *argv[]) sapp_set_current_state(SAPP_STATE_PKT_IO_INITED); - sapp_mem_init(); - sapp_runtime_log(RLOG_LV_DEBUG, "sapp platform init success"); return 0; -- cgit v1.2.3