From 42956e1602c569841f15f37ea83faf9af3bd1b25 Mon Sep 17 00:00:00 2001 From: lijia Date: Thu, 15 Nov 2018 11:25:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0-g=E5=8F=82=E6=95=B0,=20?= =?UTF-8?q?=E5=B9=B6=E9=80=9A=E8=BF=87=E6=8E=A7=E5=88=B6=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E4=BC=A0=E8=BE=93=E7=BB=99sapp.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mesa_pkt_dump.h | 4 ++++ tcpdump.c | 30 +++++++++++++++++++++++++++--- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/mesa_pkt_dump.h b/mesa_pkt_dump.h index 5abc7ff..7dedb4b 100644 --- a/mesa_pkt_dump.h +++ b/mesa_pkt_dump.h @@ -1,6 +1,9 @@ #ifndef _MESA_PKT_DUMP_H_ #define _MESA_PKT_DUMP_H_ 1 +#define MESA_PKT_DUM_H_VER (20181115) + + /* 用于DPDK-3.0, PFRING模式下, 驱动独占网卡时, 通过平台实时捕包. */ @@ -14,6 +17,7 @@ enum pkt_dump_opt_t{ PKT_DUMP_OPT_THREAD_INDEX, PKT_DUMP_OPT_ACK, /* sapp返回给tcpdump_mesa的ack包 */ PKT_DUMP_OPT_PERCEPTIVE, /* 明察秋毫模式, 可以发现丢包数量 */ + PKT_DUMP_OPT_GREEDY_SEEK, /* 偏移到最内层IP, 便于隧道模式下查找BUG */ }; /* 网络序, 便于以后在其他系统如ARM, PowerPC, MIPS上移植 */ diff --git a/tcpdump.c b/tcpdump.c index 246805a..a890e07 100644 --- a/tcpdump.c +++ b/tcpdump.c @@ -959,7 +959,11 @@ static int pkt_dump_recv_ack(int connfd) } #include -static void *detect_sapp_thread(void *arg) +/* + 此线程用于监测sapp的控制连接是否存活, 如果sapp退出了, + tcpdump_mesa也应该退出. +*/ +static void *detect_sapp_alive_thread(void *arg) { int tcp_cmd_fd = (int)arg; int ret; @@ -1020,9 +1024,17 @@ static int MESA_dump_start(unsigned short udp_rcv_port, unsigned short sapp_cmd_ opt_num++; } + if(greedy_seek_flag != 0){ + if(tcpdump_data_offset != 0){ + printf("option -o and -g is exclusive, can't use at same time!\n"); + exit(1); + } + opt_num++; + } + /************** pkt handshake *************/ pkt_hdr.magic = htonl(PKT_DUMP_HDR_MAGIC); - pkt_hdr.version = htonl(tcpdump_mesa_version_VERSION_20181114); + 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){ @@ -1106,12 +1118,24 @@ static int MESA_dump_start(unsigned short udp_rcv_port, unsigned short sapp_cmd_ } } + /************** greedy seek *************/ + if(greedy_seek_flag != 0){ + opt.opt_type = htons(PKT_DUMP_OPT_GREEDY_SEEK); + opt.opt_len = 0; + ret = write(tcp_cmd_fd, &opt, sizeof(opt)); + if(ret < 0){ + printf("connection down!\n"); + exit(1); + } + } + + /********** after send opt, start recv sapp ACK *******/ if(pkt_dump_recv_ack(tcp_cmd_fd) < 0){ printf("connection down!\n"); exit(1); } - pthread_create(&pid, NULL, detect_sapp_thread, (void *)tcp_cmd_fd); + pthread_create(&pid, NULL, detect_sapp_alive_thread, (void *)tcp_cmd_fd); return tcp_cmd_fd; }