From 13e7449232df740f18eb58336a29cc3ebd35304d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=A8=81?= Date: Tue, 4 Dec 2018 02:31:09 +0800 Subject: [PATCH] =?UTF-8?q?Update=20tcpdump.c:830=20=E5=A2=9E=E5=8A=A0gree?= =?UTF-8?q?dy=E6=95=B0=E6=8D=AE=E6=8B=B7=E8=B4=9D=E8=B6=8A=E7=95=8C?= =?UTF-8?q?=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tcpdump.c | 147 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 75 insertions(+), 72 deletions(-) diff --git a/tcpdump.c b/tcpdump.c index 9057ece..7e3e046 100644 --- a/tcpdump.c +++ b/tcpdump.c @@ -26,35 +26,35 @@ */ /* 2016-11-29 lijia add, - 类似FTP方式, TCP连接传输命令, UDP连接传输实际捕包. - 1-随机打开本端UDP未用端口, 默认12345, 如被占用, 顺序后延; - 2-与sapp建立TCP连接, 发送本端UDP监听端口; - 3-给sapp发送捕包控制命令, 传输BPF-filter过滤字符串, + 绫讳技FTP鏂瑰紡, TCP杩炴帴浼犺緭鍛戒护, UDP杩炴帴浼犺緭瀹為檯鎹曞寘. + 1-闅忔満鎵撳紑鏈UDP鏈敤绔彛, 榛樿12345, 濡傝鍗犵敤, 椤哄簭鍚庡欢; + 2-涓巗app寤虹珛TCP杩炴帴, 鍙戦佹湰绔疷DP鐩戝惉绔彛; + 3-缁檚app鍙戦佹崟鍖呮帶鍒跺懡浠, 浼犺緭BPF-filter杩囨护瀛楃涓, - 4-从UDP端口读取sapp捕获的数据包; - 5-调用tcpdump原版流程, 解析打印或写文件。 + 4-浠嶶DP绔彛璇诲彇sapp鎹曡幏鐨勬暟鎹寘; + 5-璋冪敤tcpdump鍘熺増娴佺▼, 瑙f瀽鎵撳嵃鎴栧啓鏂囦欢銆 2018-01-19 lijia add, - 1-多个tcpdump_mesa同时启动时, 后续的连接会抢占第一个连接的数据流, 但使用第一个连接的过滤条件, - 增加TCP命令连接的确认机制, 如果sapp不回复确认包, tcpdump_mesa不启动捕包. + 1-澶氫釜tcpdump_mesa鍚屾椂鍚姩鏃, 鍚庣画鐨勮繛鎺ヤ細鎶㈠崰绗竴涓繛鎺ョ殑鏁版嵁娴, 浣嗕娇鐢ㄧ涓涓繛鎺ョ殑杩囨护鏉′欢, + 澧炲姞TCP鍛戒护杩炴帴鐨勭‘璁ゆ満鍒, 濡傛灉sapp涓嶅洖澶嶇‘璁ゅ寘, tcpdump_mesa涓嶅惎鍔ㄦ崟鍖. - 2-增加丢包计数, 如果使用-a参数指定perceptive模式, sapp在发送包时, 在源MAC地址上打上序号, - tcpdump_mesa检查序号是否连续, 以确认中间是否有丢包, 丢了几个包. + 2-澧炲姞涓㈠寘璁℃暟, 濡傛灉浣跨敤-a鍙傛暟鎸囧畾perceptive妯″紡, sapp鍦ㄥ彂閫佸寘鏃, 鍦ㄦ簮MAC鍦板潃涓婃墦涓婂簭鍙, + tcpdump_mesa妫鏌ュ簭鍙锋槸鍚﹁繛缁, 浠ョ‘璁や腑闂存槸鍚︽湁涓㈠寘, 涓簡鍑犱釜鍖. */ #define MESA_DUMP (1) #if MESA_DUMP #include "mesa_pkt_dump.h" const int tcpdump_mesa_version_VERSION_20181114 = 20181114; -int tcpdump_data_offset = 0; /* 用于跳过某些底层数据, 如vxlan, 可以直接获取或设置过滤条件看vxlan的内层数据包内容 */ -unsigned char tcpdump_thread_index_array[64]; /* 开启捕包线程id数组, 靠长度决定id数量, 每个占1字节, 命令行输入支持逗号分隔 */ +int tcpdump_data_offset = 0; /* 鐢ㄤ簬璺宠繃鏌愪簺搴曞眰鏁版嵁, 濡倂xlan, 鍙互鐩存帴鑾峰彇鎴栬缃繃婊ゆ潯浠剁湅vxlan鐨勫唴灞傛暟鎹寘鍐呭 */ +unsigned char tcpdump_thread_index_array[64]; /* 寮鍚崟鍖呯嚎绋媔d鏁扮粍, 闈犻暱搴﹀喅瀹歩d鏁伴噺, 姣忎釜鍗1瀛楄妭, 鍛戒护琛岃緭鍏ユ敮鎸侀楀彿鍒嗛殧 */ int tcpdump_thread_index_array_num = 0; const char *tcpdump_thread_index_str; int tcpdump_perceptive_flag = 0; -unsigned int perceptive_pkt_seq[256]; /* 最大支持256个线程 */ -static int greedy_seek_flag = 0; /* 偏移到最内层IP, 便于隧道模式下查找BUG */ -static int dump_to_file_flag = 0; /* 是否有-w 参数, 原有标准的WFileName变量是main()的局部变量, 不方便使用, 使用此变量表示是否写文件 */ -static int has_device_flag = 0; /* 是否有-i, -r参数, 原有标准的device变量是main()的局部变量, 不方便使用, 使用此变量表示是否从某个网卡捕包 */ -static int has_bpf_filter_flag = 0; /* 是否有正确的BPF过滤条件 */ +unsigned int perceptive_pkt_seq[256]; /* 鏈澶ф敮鎸256涓嚎绋 */ +static int greedy_seek_flag = 0; /* 鍋忕Щ鍒版渶鍐呭眰IP, 渚夸簬闅ч亾妯″紡涓嬫煡鎵綛UG */ +static int dump_to_file_flag = 0; /* 鏄惁鏈-w 鍙傛暟, 鍘熸湁鏍囧噯鐨刉FileName鍙橀噺鏄痬ain()鐨勫眬閮ㄥ彉閲, 涓嶆柟渚夸娇鐢, 浣跨敤姝ゅ彉閲忚〃绀烘槸鍚﹀啓鏂囦欢 */ +static int has_device_flag = 0; /* 鏄惁鏈-i, -r鍙傛暟, 鍘熸湁鏍囧噯鐨刣evice鍙橀噺鏄痬ain()鐨勫眬閮ㄥ彉閲, 涓嶆柟渚夸娇鐢, 浣跨敤姝ゅ彉閲忚〃绀烘槸鍚︿粠鏌愪釜缃戝崱鎹曞寘 */ +static int has_bpf_filter_flag = 0; /* 鏄惁鏈夋纭殑BPF杩囨护鏉′欢 */ extern int treat_vlan_as_mac_in_mac_sw; #endif @@ -495,7 +495,7 @@ show_devices_and_exit (void) #define Q_FLAG #endif -#if MESA_DUMP /* lijia add, 新增参数g, k, o, P */ +#if MESA_DUMP /* lijia add, 鏂板鍙傛暟g, k, o, P */ #define SHORTOPTS "aAb" B_FLAG "c:C:d" D_FLAG "eE:fF:gG:hHi:" I_FLAG j_FLAG J_FLAG "k:KlLm:M:nNo:OP:pq" Q_FLAG "r:s:StT:u" U_FLAG "vV:w:W:xXy:Yz:Z:#" #else #define SHORTOPTS "aAb" B_FLAG "c:C:d" D_FLAG "eE:fF:G:hHi:" I_FLAG j_FLAG J_FLAG "KlLm:M:nNOpq" Q_FLAG "r:s:StT:u" U_FLAG "vV:w:W:xXy:Yz:Z:#" @@ -526,7 +526,7 @@ show_devices_and_exit (void) #define OPTION_IMMEDIATE_MODE 130 #if MESA_DUMP -#define OPTION_VLAN_AS_MAC_IN_MAC 131 /* 短参数不够用了, 增加长参数 */ +#define OPTION_VLAN_AS_MAC_IN_MAC 131 /* 鐭弬鏁颁笉澶熺敤浜, 澧炲姞闀垮弬鏁 */ #endif static const struct option longopts[] = { @@ -825,21 +825,24 @@ static int MESA_dump_seek_to_inner(char *pkt_buf, int pktlen) ip4hdr_greedy = (struct mesa_ip4_hdr *)MESA_net_jump_to_layer_greedy(pkt_buf, ADDR_TYPE_MAC, __ADDR_TYPE_IP_PAIR_V4); if(ip4hdr_greedy){ if((char *)ip4hdr_greedy == first_ip_layer){ - bpf_match_pkt_len = pktlen; /* 最内层和第一层IP一样, 说明是非常标准的ethernet->IPv4包, 且无隧道, 无需memmove操作 */ + bpf_match_pkt_len = pktlen; /* 鏈鍐呭眰鍜岀涓灞侷P涓鏍, 璇存槑鏄潪甯告爣鍑嗙殑ethernet->IPv4鍖, 涓旀棤闅ч亾, 鏃犻渶memmove鎿嶄綔 */ }else{ - memmove(pkt_buf + sizeof(struct mesa_ethernet_hdr), - ip4hdr_greedy, - pktlen - ((char *)ip4hdr_greedy - pkt_buf)); - bpf_match_pkt_len = pktlen - ((char *)ip4hdr_greedy - pkt_buf) + sizeof(struct mesa_ethernet_hdr); - ehdr->ether_type = htons(ETHERTYPE_IP); /* 第一层可能不是IPV4, 比如MPLS, VLAN等, 需要改成IP, 以便bpf过滤器能正确执行 */ - } + if(pktlen - ((char *)ip4hdr_greedy - pkt_buf) > 0) + { + memmove(pkt_buf + sizeof(struct mesa_ethernet_hdr), + ip4hdr_greedy, + pktlen - ((char *)ip4hdr_greedy - pkt_buf)); + bpf_match_pkt_len = pktlen - ((char *)ip4hdr_greedy - pkt_buf) + sizeof(struct mesa_ethernet_hdr); + ehdr->ether_type = htons(ETHERTYPE_IP); /* 绗竴灞傚彲鑳戒笉鏄疘PV4, 姣斿MPLS, VLAN绛, 闇瑕佹敼鎴怚P, 浠ヤ究bpf杩囨护鍣ㄨ兘姝g‘鎵ц */ + } + } if(bpf_match_pkt_len <= 0){ return -1; } - /* 如果有正确的过滤条件, 不设采样率, 保证捕包尽量全, 符合调用者意图; - 如果没有过滤条件, 即全捕包模式, 为了尽量不影响包处理线程, 根据采样率只捕一部分包. + /* 濡傛灉鏈夋纭殑杩囨护鏉′欢, 涓嶈閲囨牱鐜, 淇濊瘉鎹曞寘灏介噺鍏, 绗﹀悎璋冪敤鑰呮剰鍥; + 濡傛灉娌℃湁杩囨护鏉′欢, 鍗冲叏鎹曞寘妯″紡, 涓轰簡灏介噺涓嶅奖鍝嶅寘澶勭悊绾跨▼, 鏍规嵁閲囨牱鐜囧彧鎹曚竴閮ㄥ垎鍖. */ bpf_match_ipv4 = 1; @@ -850,13 +853,13 @@ static int MESA_dump_seek_to_inner(char *pkt_buf, int pktlen) ip6hdr_greedy = (struct mesa_ip6_hdr *)MESA_net_jump_to_layer_greedy(pkt_buf, ADDR_TYPE_MAC, __ADDR_TYPE_IP_PAIR_V6); if(ip6hdr_greedy){ if((char *)ip6hdr_greedy == first_ip_layer){ - bpf_match_pkt_len = pktlen; /* 最内层和第一层IP一样, 说明是非常标准的ethernet->IPv6包, 且无隧道, 无需memmove操作 */ + bpf_match_pkt_len = pktlen; /* 鏈鍐呭眰鍜岀涓灞侷P涓鏍, 璇存槑鏄潪甯告爣鍑嗙殑ethernet->IPv6鍖, 涓旀棤闅ч亾, 鏃犻渶memmove鎿嶄綔 */ }else{ memmove(pkt_buf + sizeof(struct mesa_ethernet_hdr), ip6hdr_greedy, pktlen - ((char *)ip6hdr_greedy - pkt_buf)); bpf_match_pkt_len = pktlen - ((char *)ip4hdr_greedy - pkt_buf) + sizeof(struct mesa_ethernet_hdr); - ehdr->ether_type = htons(ETHERTYPE_IPv6); /* 第一层可能不是IPV6, 比如MPLS, VLAN等,需要改成IP,以便bpf过滤器能正确执行 */ + ehdr->ether_type = htons(ETHERTYPE_IPv6); /* 绗竴灞傚彲鑳戒笉鏄疘PV6, 姣斿MPLS, VLAN绛,闇瑕佹敼鎴怚P,浠ヤ究bpf杩囨护鍣ㄨ兘姝g‘鎵ц */ } if(bpf_match_pkt_len <= 0){ @@ -865,8 +868,8 @@ static int MESA_dump_seek_to_inner(char *pkt_buf, int pktlen) } - /* 如果有正确的过滤条件, 不设采样率, 保证捕包尽量全, 符合调用者意图; - 如果没有过滤条件, 即全捕包模式, 为了尽量不影响包处理线程, 根据采样率只捕一部分包. + /* 濡傛灉鏈夋纭殑杩囨护鏉′欢, 涓嶈閲囨牱鐜, 淇濊瘉鎹曞寘灏介噺鍏, 绗﹀悎璋冪敤鑰呮剰鍥; + 濡傛灉娌℃湁杩囨护鏉′欢, 鍗冲叏鎹曞寘妯″紡, 涓轰簡灏介噺涓嶅奖鍝嶅寘澶勭悊绾跨▼, 鏍规嵁閲囨牱鐜囧彧鎹曚竴閮ㄥ垎鍖. */ bpf_match_ipv6 = 1; }else{ @@ -874,14 +877,14 @@ static int MESA_dump_seek_to_inner(char *pkt_buf, int pktlen) } if(bpf_match_ipv4 || bpf_match_ipv6){ - return bpf_match_pkt_len; /* 任意头部命中即可输出 */ + return bpf_match_pkt_len; /* 浠绘剰澶撮儴鍛戒腑鍗冲彲杈撳嚭 */ } return -1; } -/* 可支持多个线程, 用逗号分隔"1,3,5,7" */ +/* 鍙敮鎸佸涓嚎绋, 鐢ㄩ楀彿鍒嗛殧"1,3,5,7" */ static int MESA_dump_thread_index_convert(const char *raw_index_str) { char *index_str = strdup(raw_index_str); @@ -889,7 +892,7 @@ static int MESA_dump_thread_index_convert(const char *raw_index_str) char *save_ptr, *section; int index = 0; - if(NULL == memchr(index_str, ',', strlen(raw_index_str))){ /* 无逗号分隔, 仅有一个, 无多线程 */ + if(NULL == memchr(index_str, ',', strlen(raw_index_str))){ /* 鏃犻楀彿鍒嗛殧, 浠呮湁涓涓, 鏃犲绾跨▼ */ tcpdump_thread_index_array[0] = atoi(raw_index_str); if(tcpdump_thread_index_array[0] >= 64){ goto err; @@ -975,8 +978,8 @@ static int pkt_dump_recv_ack(int connfd) #include /* - 此线程用于监测sapp的控制连接是否存活, 如果sapp退出了, - tcpdump_mesa也应该退出. + 姝ょ嚎绋嬬敤浜庣洃娴媠app鐨勬帶鍒惰繛鎺ユ槸鍚﹀瓨娲, 濡傛灉sapp閫鍑轰簡, + tcpdump_mesa涔熷簲璇ラ鍑. */ static void *detect_sapp_alive_thread(void *arg) { @@ -1002,7 +1005,7 @@ static int MESA_dump_start(unsigned short udp_rcv_port, unsigned short sapp_cmd_ unsigned short filter_len = 0; struct sockaddr_in sockadd; struct pkt_dump_handshake pkt_hdr; - unsigned int opt_num = 1; /* 本端接收端口为必选项 */ + unsigned int opt_num = 1; /* 鏈鎺ユ敹绔彛涓哄繀閫夐」 */ struct pkt_dump_opt opt; pthread_t pid; @@ -1049,7 +1052,7 @@ static int MESA_dump_start(unsigned short udp_rcv_port, unsigned short sapp_cmd_ /************** pkt handshake *************/ pkt_hdr.magic = htonl(PKT_DUMP_HDR_MAGIC); - pkt_hdr.version = htonl(20180119); /* 之前sapp对20180119版本做了严格校验, 此处向后兼容, 先固定用此值, 以后更新sapp后, 不再校验版本 */ + pkt_hdr.version = htonl(20180119); /* 涔嬪墠sapp瀵20180119鐗堟湰鍋氫簡涓ユ牸鏍¢獙, 姝ゅ鍚戝悗鍏煎, 鍏堝浐瀹氱敤姝ゅ, 浠ュ悗鏇存柊sapp鍚, 涓嶅啀鏍¢獙鐗堟湰 */ pkt_hdr.opt_num = htonl(opt_num); ret = write(tcp_cmd_fd, &pkt_hdr, sizeof(pkt_hdr)); if(ret < 0){ @@ -1169,7 +1172,7 @@ static void pkt_dump_signal_cb(int signo) return; } -/* 虚假丢包显示告警信息包 */ +/* 铏氬亣涓㈠寘鏄剧ず鍛婅淇℃伅鍖 */ static const char _perceptive_pkt_data[] = { @@ -1198,12 +1201,12 @@ static void _build_perceptive_pkt(pcap_handler callback, u_char *pcap_userdata, perceptive_pcap_hdr.len = 79; perceptive_pcap_hdr.caplen = 79; gettimeofday(&perceptive_pcap_hdr.ts, NULL); - callback(pcap_userdata, &perceptive_pcap_hdr, _perceptive_pkt_data); /* 刷屏模式调用print_packet(); 捕包模式调用: dump_packet() */ + callback(pcap_userdata, &perceptive_pcap_hdr, _perceptive_pkt_data); /* 鍒峰睆妯″紡璋冪敤print_packet(); 鎹曞寘妯″紡璋冪敤: dump_packet() */ } } /* - 从sapp捕包, 而非标准tcpdump从网卡捕包. + 浠巗app鎹曞寘, 鑰岄潪鏍囧噯tcpdump浠庣綉鍗℃崟鍖. */ static void MESA_dump(pcap_handler callback, u_char *pcap_userdata, char *filter, int tot_pkt, unsigned short sapp_cmd_port ) @@ -1233,12 +1236,12 @@ static void MESA_dump(pcap_handler callback, u_char *pcap_userdata, char *filter udp_rcv_fd = socket(AF_INET, SOCK_DGRAM, 0); -/* UDP不能开启SO_REUSEADDR, 否则多个进程能同时监听一个端口. +/* UDP涓嶈兘寮鍚疭O_REUSEADDR, 鍚﹀垯澶氫釜杩涚▼鑳藉悓鏃剁洃鍚竴涓鍙. opt = 1; setsockopt(udp_rcv_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int)); */ - /* 从udp_default_port开始, 选择后续第一个可用端口, 防止因端口被其他应用占用而无法启动 */ + /* 浠巙dp_default_port寮濮, 閫夋嫨鍚庣画绗竴涓彲鐢ㄧ鍙, 闃叉鍥犵鍙h鍏朵粬搴旂敤鍗犵敤鑰屾棤娉曞惎鍔 */ while(bind(udp_rcv_fd, (struct sockaddr *) &sockadd, sizeof(sockadd)) < 0){ usleep(1000); udp_default_port++; @@ -1250,7 +1253,7 @@ static void MESA_dump(pcap_handler callback, u_char *pcap_userdata, char *filter goto done; } - pperceptive = (const struct perceptive_info *)&pkt_buf[6]; /* 存于源mac地址 */ + pperceptive = (const struct perceptive_info *)&pkt_buf[6]; /* 瀛樹簬婧恗ac鍦板潃 */ while((-1 == tot_pkt) || (actual_rcv_pkt_num < tot_pkt)){ pkt_len = recv(udp_rcv_fd, pkt_buf, 65536, 0); @@ -1263,8 +1266,8 @@ static void MESA_dump(pcap_handler callback, u_char *pcap_userdata, char *filter perceptive_pkt_seq[pperceptive->thread_id] = cur_pkt_seq; } - /* 如果有-g参数, 且写了-w, 即需要保存原始包到文件, 则不进行seek操作, - 只是在没有-w 参数时, 让tcpdump能打印出包的信息, 才进行seek操作. + /* 濡傛灉鏈-g鍙傛暟, 涓斿啓浜-w, 鍗抽渶瑕佷繚瀛樺師濮嬪寘鍒版枃浠, 鍒欎笉杩涜seek鎿嶄綔, + 鍙槸鍦ㄦ病鏈-w 鍙傛暟鏃, 璁﹖cpdump鑳芥墦鍗板嚭鍖呯殑淇℃伅, 鎵嶈繘琛宻eek鎿嶄綔. */ if((greedy_seek_flag != 0) && (dump_to_file_flag == 0)){ inner_pkt_len = MESA_dump_seek_to_inner(pkt_buf, pkt_len); @@ -1279,7 +1282,7 @@ static void MESA_dump(pcap_handler callback, u_char *pcap_userdata, char *filter } gettimeofday(&phony_pcap_hdr.ts, NULL); - callback(pcap_userdata, &phony_pcap_hdr, pkt_buf); /* NOTE: 刷屏模式调用print_packet(); 捕包模式调用: dump_packet() */ + callback(pcap_userdata, &phony_pcap_hdr, pkt_buf); /* NOTE: 鍒峰睆妯″紡璋冪敤print_packet(); 鎹曞寘妯″紡璋冪敤: dump_packet() */ actual_rcv_pkt_num++; } } @@ -1298,7 +1301,7 @@ done: } #endif -static struct bpf_program fcode; /* lijia modify, 做为全局变量, 其他函数中调用 */ +static struct bpf_program fcode; /* lijia modify, 鍋氫负鍏ㄥ眬鍙橀噺, 鍏朵粬鍑芥暟涓皟鐢 */ int main(int argc, char **argv) @@ -1394,16 +1397,16 @@ main(int argc, char **argv) case 'a': /* compatibility for old -a */ #if MESA_DUMP - /* liji add, for perceptive, 让tcpdump_mesa能感知丢包的情况, + /* liji add, for perceptive, 璁﹖cpdump_mesa鑳芥劅鐭ヤ涪鍖呯殑鎯呭喌, - 使用此参数后, 必须指定过滤条件, - sapp接收到此命令选项后, 先将原始包copy到临时缓冲区, - 然后将每个线程的包统计计数记录到源MAC地址中发送过来, + 浣跨敤姝ゅ弬鏁板悗, 蹇呴』鎸囧畾杩囨护鏉′欢, + sapp鎺ユ敹鍒版鍛戒护閫夐」鍚, 鍏堝皢鍘熷鍖卌opy鍒颁复鏃剁紦鍐插尯, + 鐒跺悗灏嗘瘡涓嚎绋嬬殑鍖呯粺璁¤鏁拌褰曞埌婧怣AC鍦板潃涓彂閫佽繃鏉, - tcpdump_mesa依次检查每个线程的计数, 如果不连续, 说明中间丢包了, - 为了让捕包者能看到这个情况, - 每丢一个包, 凭空造一个虚假数据包出来, - 这样在wireshark上可以看到某个阶段是否有丢包, 丢了几个包, 当然看不到丢的是什么. + tcpdump_mesa渚濇妫鏌ユ瘡涓嚎绋嬬殑璁℃暟, 濡傛灉涓嶈繛缁, 璇存槑涓棿涓㈠寘浜, + 涓轰簡璁╂崟鍖呰呰兘鐪嬪埌杩欎釜鎯呭喌, + 姣忎涪涓涓寘, 鍑┖閫犱竴涓櫄鍋囨暟鎹寘鍑烘潵, + 杩欐牱鍦╳ireshark涓婂彲浠ョ湅鍒版煇涓樁娈垫槸鍚︽湁涓㈠寘, 涓簡鍑犱釜鍖, 褰撶劧鐪嬩笉鍒颁涪鐨勬槸浠涔. */ tcpdump_perceptive_flag = 1; #endif @@ -1626,7 +1629,7 @@ main(int argc, char **argv) break; #if MESA_DUMP - case 'o': /* vxlan偏移量, 跳过中间某些字节 */ + case 'o': /* vxlan鍋忕Щ閲, 璺宠繃涓棿鏌愪簺瀛楄妭 */ tcpdump_data_offset = atoi(optarg); if(tcpdump_data_offset < 0 || tcpdump_data_offset > 1514){ printf("args [-o offset] is invalid: %s\n", optarg); @@ -1644,7 +1647,7 @@ main(int argc, char **argv) break; #if MESA_DUMP - case 'P': /* sapp命令接收端口 */ + case 'P': /* sapp鍛戒护鎺ユ敹绔彛 */ { int tmp_int_val = atoi(optarg); if((tmp_int_val <= 0) || (tmp_int_val > 65535)){ @@ -1840,7 +1843,7 @@ main(int argc, char **argv) /**************************** cmd line parse end *************************************/ #if MESA_DUMP - device = "lo"; /* tcpdump_mesa不用指定网卡名, 默认lo */ + device = "lo"; /* tcpdump_mesa涓嶇敤鎸囧畾缃戝崱鍚, 榛樿lo */ #endif #ifdef HAVE_PCAP_FINDALLDEVS @@ -2177,7 +2180,7 @@ main(int argc, char **argv) if (pcap_compile(pd, &fcode, cmdbuf, Oflag, netmask) < 0){ error("%s", pcap_geterr(pd)); }else{ - /* 不一定有bpf filter, 此处判断一下 */ + /* 涓嶄竴瀹氭湁bpf filter, 姝ゅ鍒ゆ柇涓涓 */ if(cmdbuf){ has_bpf_filter_flag = 1; } @@ -2258,11 +2261,11 @@ main(int argc, char **argv) #if MESA_DUMP /* - 如果使用了 -g参数, 表示用最内层的IP,PORT做为过滤条件, 不能直接将bpf应用到pcap句柄, - 因为那还是用最外层过滤, 如果是隧道, 一个包也过滤不到. + 濡傛灉浣跨敤浜 -g鍙傛暟, 琛ㄧず鐢ㄦ渶鍐呭眰鐨処P,PORT鍋氫负杩囨护鏉′欢, 涓嶈兘鐩存帴灏哹pf搴旂敤鍒皃cap鍙ユ焺, + 鍥犱负閭h繕鏄敤鏈澶栧眰杩囨护, 濡傛灉鏄毀閬, 涓涓寘涔熻繃婊や笉鍒. - 此处不能加过滤条件, 而是在收到包后, 主动调用bpf_filter()再检测一遍, - 比直接在pcap底层应用bpf效率有点低. + 姝ゅ涓嶈兘鍔犺繃婊ゆ潯浠, 鑰屾槸鍦ㄦ敹鍒板寘鍚, 涓诲姩璋冪敤bpf_filter()鍐嶆娴嬩竴閬, + 姣旂洿鎺ュ湪pcap搴曞眰搴旂敤bpf鏁堢巼鏈夌偣浣. */ if(0 == greedy_seek_flag){ if (pcap_setfilter(pd, &fcode) < 0) @@ -2356,9 +2359,9 @@ main(int argc, char **argv) } else { callback = dump_packet; #if MESA_DUMP - /* 如果设定了greedy选项且有BPF规则, 需要调用MESA_dump_packet(), 偏移到内层IP再保存 */ + /* 濡傛灉璁惧畾浜唃reedy閫夐」涓旀湁BPF瑙勫垯, 闇瑕佽皟鐢∕ESA_dump_packet(), 鍋忕Щ鍒板唴灞侷P鍐嶄繚瀛 */ if((greedy_seek_flag != 0) && (has_bpf_filter_flag != 0)){ - callback = MESA_dump_packet; /* 更新callback指针 */ + callback = MESA_dump_packet; /* 鏇存柊callback鎸囬拡 */ } #endif pcap_userdata = (u_char *)p; @@ -2372,9 +2375,9 @@ main(int argc, char **argv) ndo->ndo_if_printer = get_if_printer(ndo, dlt); callback = print_packet; #if MESA_DUMP - /* 如果设定了greedy选项, 需要调用MESA_dump_print_packet(), 偏移到内层IP再处理 */ + /* 濡傛灉璁惧畾浜唃reedy閫夐」, 闇瑕佽皟鐢∕ESA_dump_print_packet(), 鍋忕Щ鍒板唴灞侷P鍐嶅鐞 */ if(greedy_seek_flag != 0){ - callback = MESA_dump_print_packet; /* 更新callback指针 */ + callback = MESA_dump_print_packet; /* 鏇存柊callback鎸囬拡 */ } #endif pcap_userdata = (u_char *)ndo; @@ -2960,7 +2963,7 @@ MESA_dump_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *raw_pk } } - /* -w参数要存储包, 实际存储的包还是用原始报文, 只是BPF用内层过滤 */ + /* -w鍙傛暟瑕佸瓨鍌ㄥ寘, 瀹為檯瀛樺偍鐨勫寘杩樻槸鐢ㄥ師濮嬫姤鏂, 鍙槸BPF鐢ㄥ唴灞傝繃婊 */ pcap_dump(user, h, raw_pkt); #ifdef HAVE_PCAP_DUMP_FLUSH if (Uflag) @@ -2993,7 +2996,7 @@ MESA_dump_print_packet(u_char *user, const struct pcap_pkthdr *h, const u_char * { int inner_pkt_len; - /* 此函数仅用于tcpdump屏幕打印, 直接修改pkt原始包, 避免再copy一次, 节约点CPU */ + /* 姝ゅ嚱鏁颁粎鐢ㄤ簬tcpdump灞忓箷鎵撳嵃, 鐩存帴淇敼pkt鍘熷鍖, 閬垮厤鍐峜opy涓娆, 鑺傜害鐐笴PU */ inner_pkt_len = MESA_dump_seek_to_inner(pkt, h->caplen); if(inner_pkt_len < 0){ return; @@ -3006,7 +3009,7 @@ MESA_dump_print_packet(u_char *user, const struct pcap_pkthdr *h, const u_char * } } - /* 改为新的修改后的数据包长度 */ + /* 鏀逛负鏂扮殑淇敼鍚庣殑鏁版嵁鍖呴暱搴 */ ((struct pcap_pkthdr *)h)->caplen = (unsigned int)inner_pkt_len; ((struct pcap_pkthdr *)h)->len = (unsigned int)inner_pkt_len;