summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author杨威 <[email protected]>2018-12-04 02:31:09 +0800
committer杨威 <[email protected]>2018-12-04 02:31:09 +0800
commit13e7449232df740f18eb58336a29cc3ebd35304d (patch)
tree0bda00636511b0a3c71c68557f4e9fccfc05316b
parente3fca62644610e1fcaf5c36f411360ca4c868e6b (diff)
Update tcpdump.c:830 增加greedy数据拷贝越界检查
-rw-r--r--tcpdump.c147
1 files 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-与sapp建立TCP连接, 发送本端UDP监听端口;
+ 3-给sapp发送捕包控制命令, 传输BPF-filter过滤字符串,
- 4-��UDP�˿ڶ�ȡsapp��������ݰ�;
- 5-����tcpdumpԭ������, ������ӡ��д�ļ���
+ 4-从UDP端口读取sapp捕获的数据包;
+ 5-调用tcpdump原版流程, 解析打印或写文件。
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; /* ��������ijЩ�ײ�����, ��vxlan, ����ֱ�ӻ�ȡ�����ù���������vxlan���ڲ����ݰ����� */
-unsigned char tcpdump_thread_index_array[64]; /* ���������߳�id����, �����Ⱦ���id����, ÿ��ռ1�ֽ�, ����������֧�ֶ��ŷָ� */
+int tcpdump_data_offset = 0; /* 用于跳过某些底层数据, 如vxlan, 可以直接获取或设置过滤条件看vxlan的内层数据包内容 */
+unsigned char tcpdump_thread_index_array[64]; /* 开启捕包线程id数组, 靠长度决定id数量, 每个占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()�ľֲ�����, ������ʹ��, ʹ�ô˱�����ʾ�Ƿ��ij���������� */
-static int has_bpf_filter_flag = 0; /* �Ƿ�����ȷ��BPF�������� */
+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过滤条件 */
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һ��, ˵���Ƿdz���׼��ethernet->IPv4��, ��������, ����memmove���� */
+ bpf_match_pkt_len = pktlen; /* 最内层和第一层IP一样, 说明是非常标准的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��, ��Ҫ�ij�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); /* 第一层可能不是IPV4, 比如MPLS, VLAN等, 需要改成IP, 以便bpf过滤器能正确执行 */
+ }
+ }
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һ��, ˵���Ƿdz���׼��ethernet->IPv6��, ��������, ����memmove���� */
+ bpf_match_pkt_len = pktlen; /* 最内层和第一层IP一样, 说明是非常标准的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��,��Ҫ�ij�IP,�Ա�bpf����������ȷִ�� */
+ ehdr->ether_type = htons(ETHERTYPE_IPv6); /* 第一层可能不是IPV6, 比如MPLS, VLAN等,需要改成IP,以便bpf过滤器能正确执行 */
}
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 <pthread.h>
/*
- ���߳����ڼ��sapp�Ŀ��������Ƿ���, ���sapp�˳���,
- tcpdump_mesaҲӦ���˳�.
+ 此线程用于监测sapp的控制连接是否存活, 如果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����, ���DZ�׼tcpdump����������.
+ 从sapp捕包, 而非标准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不能开启SO_REUSEADDR, 否则多个进程能同时监听一个端口.
opt = 1;
setsockopt(udp_rcv_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int));
*/
- /* ��udp_default_port��ʼ, ѡ�������һ�����ö˿�, ��ֹ��˿ڱ�����Ӧ��ռ�ö��޷����� */
+ /* 从udp_default_port开始, 选择后续第一个可用端口, 防止因端口被其他应用占用而无法启动 */
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]; /* 存于源mac地址 */
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 参数时, 让tcpdump能打印出包的信息, 才进行seek操作.
*/
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, 让tcpdump_mesa能感知丢包的情况,
- ʹ�ô˲�����, ����ָ����������,
- sapp���յ�������ѡ���, �Ƚ�ԭʼ��copy����ʱ������,
- Ȼ��ÿ���̵߳İ�ͳ�Ƽ�����¼��ԴMAC��ַ�з��͹���,
+ 使用此参数后, 必须指定过滤条件,
+ sapp接收到此命令选项后, 先将原始包copy到临时缓冲区,
+ 然后将每个线程的包统计计数记录到源MAC地址中发送过来,
- tcpdump_mesa���μ��ÿ���̵߳ļ���, ���������, ˵���м䶪����,
- Ϊ���ò������ܿ���������,
- ÿ��һ����, ƾ����һ��������ݰ�����,
- ������wireshark�Ͽ��Կ���ij���׶��Ƿ��ж���, ���˼�����, ��Ȼ������������ʲô.
+ tcpdump_mesa依次检查每个线程的计数, 如果不连续, 说明中间丢包了,
+ 为了让捕包者能看到这个情况,
+ 每丢一个包, 凭空造一个虚假数据包出来,
+ 这样在wireshark上可以看到某个阶段是否有丢包, 丢了几个包, 当然看不到丢的是什么.
*/
tcpdump_perceptive_flag = 1;
#endif
@@ -1626,7 +1629,7 @@ main(int argc, char **argv)
break;
#if MESA_DUMP
- case 'o': /* vxlanƫ����, �����м�ijЩ�ֽ� */
+ 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参数, 表示用最内层的IP,PORT做为过滤条件, 不能直接将bpf应用到pcap句柄,
+ 因为那还是用最外层过滤, 如果是隧道, 一个包也过滤不到.
- �˴����ܼӹ�������, �������յ�����, ��������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�ٱ��� */
+ /* 如果设定了greedy选项且有BPF规则, 需要调用MESA_dump_packet(), 偏移到内层IP再保存 */
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�ٴ��� */
+ /* 如果设定了greedy选项, 需要调用MESA_dump_print_packet(), 偏移到内层IP再处理 */
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原始包, 避免再copy一次, 节约点CPU */
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;