summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author刘学利 <[email protected]>2019-08-14 13:34:32 +0800
committer刘学利 <[email protected]>2019-08-14 13:34:32 +0800
commit0d3e52f017fd067467533572da39e8f61b5d0936 (patch)
treee45076bb58c86d4705382fd22f7f7c2cf9aeaf93
parenta0436f126f022013236f45eecee982d921918767 (diff)
Update tcpreplay.c;marsio模式下options.intf1变量不会被初始化,所以添加判断是否为NULL
-rw-r--r--src/tcpreplay.c115
1 files changed, 58 insertions, 57 deletions
diff --git a/src/tcpreplay.c b/src/tcpreplay.c
index 8b50cfc..f5e9dc8 100644
--- a/src/tcpreplay.c
+++ b/src/tcpreplay.c
@@ -102,7 +102,7 @@ extern int send_pkt_driver_mode; /* 1:pcap; 12:marsio4; */
int tcpburst_version_VERSION_20180611;
-#define PROCESS_BAR_SW (1) /* ʵʱ������ */
+#define PROCESS_BAR_SW (1) /* 实时进度条 */
#define TCP_BURST_MTU (1514)
#include <linux/types.h>
@@ -115,7 +115,7 @@ extern "C"
{
#endif
-#if PROCESS_BAR_SW /* 2013-12-04 LiJia add, for ���������ʵʱ��ʾ */
+#if PROCESS_BAR_SW /* 2013-12-04 LiJia add, for 读大包进度实时显示 */
static char *dumpfile_name;
static int dumpfile_last_file_index = -1;
static unsigned long dumpfile_total_size;
@@ -207,7 +207,7 @@ typedef struct{
static encap_args_t g_vxlan_encap_args;
-/* ascii�ַ�ת16���� */
+/* ascii字符转16进制 */
static char MESA_ascii_to_hex(char ascii)
{
char c = 0;
@@ -249,16 +249,16 @@ static char MESA_ascii_to_hex(char ascii)
return c;
}
- /* 2012-04-11 LiJia add,��MAC�ַ�����ʽת��Ϊ16����MAC��ַ.
-����:
- str: MAC��ַ�ַ���
- delim: �ַ����ָ���������Ϊ':', '-'��,��: xx:xx:xx:xx:xx:xx
- ����ַ����޷ָ�����delim��Ϊ-1.
- mac: �洢MAC��ַ������(ָ��),���Ϊ������,
- ������MAC��ַΪ11:22:33:44:55:66,��mac[0]Ϊ0x11,mac[5]Ϊ0x66.
-����ֵ:
- 0: ����
- -1:����
+ /* 2012-04-11 LiJia add,将MAC字符串形式转换为16进制MAC地址.
+参数:
+ str: MAC地址字符串
+ delim: 字符串分隔符,常见为':', '-'等,如: xx:xx:xx:xx:xx:xx
+ 如果字符串无分隔符,delim设为-1.
+ mac: 存储MAC地址的数组(指针),结果为网络序,
+ 如网卡MAC地址为11:22:33:44:55:66,则mac[0]为0x11,mac[5]为0x66.
+返回值:
+ 0: 正常
+ -1:错误
*/
static int MESA_mac_pton(const char *str, int delim, char *mac)
{
@@ -267,7 +267,7 @@ static int MESA_mac_pton(const char *str, int delim, char *mac)
const char *s = str;
int i;
- /* �������Ϸ��� */
+ /* 检查输入合法性 */
if(delim != -1)
{
if(strlen(str) != MAC_STR_LEN_DELIM)
@@ -285,10 +285,10 @@ static int MESA_mac_pton(const char *str, int delim, char *mac)
}
}
- /* �������Ϸ��ԣ�ͬʱת����16����ֵ */
+ /* 检查输入合法性,同时转换成16进制值 */
for(i = 0; i < 6; i++)
{
- mac[i] = 0; /* �����㣬��ֵ��䶼�ǻ���� */
+ mac[i] = 0; /* 先清零,赋值语句都是或操作 */
if(isxdigit(*s)==0)
{
printf("MAC string type error!\n");
@@ -377,7 +377,7 @@ static int parse_encap_cfg_file(const char *filename)
return 0;
}
-/*************************** �ڲ�ʵ�ֽӿ� ********************************/
+/*************************** 内部实现接口 ********************************/
/*
* Simple doubly linked list implementation.
@@ -419,7 +419,7 @@ static inline void __list_add(struct list_index *new_list,
*
* Insert a new entry after the specified head.
* This is good for implementing stacks.
- * lijia comment: list_add()���½ڵ����head��head->next֮��.
+ * lijia comment: list_add()把新节点插在head与head->next之间.
*/
void list_add(struct list_index *new_list, struct list_index *head)
{
@@ -434,7 +434,7 @@ void list_add(struct list_index *new_list, struct list_index *head)
*
* Insert a new entry before the specified head.
* This is useful for implementing queues.
- * lijia comment: list_add_tail()���½ڵ����head��head->prev֮��.
+ * lijia comment: list_add_tail()把新节点插在head与head->prev之间.
*/
void list_add_tail(struct list_index *new_list, struct list_index *head)
{
@@ -709,11 +709,11 @@ static int MESA_q_is_item_in_list_quick(MESA_queue_head_t *qhead_obj, MESA_list_
}
#endif
-/*************************** �ⲿ���ýӿ� ********************************/
+/*************************** 外部调用接口 ********************************/
/*
- ��һ��ʹ��MESA_listģ��ʱ��������ô˳�ʼ��ģ��.
+ 第一次使用MESA_list模块时,必须调用此初始化模块.
*/
int MESA_list_init(MESA_queue_head_t *head)
{
@@ -722,7 +722,7 @@ int MESA_list_init(MESA_queue_head_t *head)
return 0;
}
-/* ��Ϊheadʹ��ʱ, "quiddity"��Ϊһ��long�ͱ���,���ڴ洢����Ԫ������ */
+/* 做为head使用时, "quiddity"做为一个long型变量,用于存储链表元素数量 */
long MESA_get_list_count(const MESA_queue_head_t *head)
{
return (long)head->quiddity;
@@ -835,7 +835,7 @@ MESA_list_index_t *MESA_q_move_tail(MESA_queue_head_t *qhead_obj, MESA_list_inde
}
/************************ MESA_fixed_q implement *************************/
-/************************ MESA_fixed_q �ڲ�ʵ�ֽӿ�***********************/
+/************************ MESA_fixed_q 内部实现接口***********************/
MESA_fixed_q_t *__create_fixed_q_elem(long max_elem_len)
{
MESA_fixed_q_t *tq;
@@ -857,9 +857,9 @@ MESA_fixed_q_t *__create_fixed_q_elem(long max_elem_len)
}
-/************************ MESA_fixed_q �ⲿ�ӿ� **************************/
+/************************ MESA_fixed_q 外部接口 **************************/
/*
- ��һ��ʹ��MESA_fixedģ��ʱ��������ô˳�ʼ��ģ��.
+ 第一次使用MESA_fixed模块时,必须调用此初始化模块.
total_elem_num: total queue element number;
max_elem_len : max length of a queue element.
*/
@@ -875,21 +875,21 @@ int MESA_fixed_q_init(MESA_fixed_q_t *__head, long total_elem_num, long max_elem
__head->quiddity = malloc(sizeof(MESA_fixed_qelem_t));
- /* ��һ���ڵ��γ��Ի���˫������ */
+ /* 第一个节点形成自环的双向链表 */
real_head = __create_fixed_q_elem(max_elem_len);
INIT_LIST_HEAD(real_head);
- /* �����Ľڵ�������� */
+ /* 后续的节点插入链表 */
for(i = 0; i < total_elem_num; i++){
real_tail = __create_fixed_q_elem(max_elem_len);
list_add_tail(real_tail, real_head);
}
- __head->nextele = (struct list_index *)real_head; /* ͷ�ڵ�.nextele���ڴ洢��ǰ���е�ʵ�ʶ�ͷ�ڵ�ָ�� */
- __head->preele = (struct list_index *)real_head; /* ͷ�ڵ�.preele���ڴ洢��ǰ���е�ʵ�ʶ�β�ڵ�ָ�� */
+ __head->nextele = (struct list_index *)real_head; /* 头节点.nextele用于存储当前队列的实际队头节点指针 */
+ __head->preele = (struct list_index *)real_head; /* 头节点.preele用于存储当前队列的实际队尾节点指针 */
tqelem = (MESA_fixed_qelem_t *)__head->quiddity;
- list_count_init(&tqelem->data); /* ͷ�ڵ�.data���ڴ洢��ǰ���е�ʵ��Ԫ���� */
- tqelem->datalen = max_elem_len; /* ͷ�ڵ�.datalen���ڴ洢��ǰ���е�Ԫ����󳤶� */
+ list_count_init(&tqelem->data); /* 头节点.data用于存储当前队列的实际元素数 */
+ tqelem->datalen = max_elem_len; /* 头节点.datalen用于存储当前队列的元素最大长度 */
return 0;
}
@@ -1204,9 +1204,9 @@ static inline int stream_addr_cmp_udp(struct ip *iphdr, struct udphdr *udphdr)
}
-/* �޸�ԭ����IP��ַ��ʹ��Ԫ���ԭ����ͬ.
- Ϊ�˲����¼���У��ͣ��Դﵽ�ϸߵķ������ʣ�
- �ĵ�ַʱ������IP��ַ�����޸ģ����Ӻͼ��ٵ�ֵҪ���.
+/* 修改原包的IP地址,使四元组和原包不同.
+ 为了不从新计算校验和,以达到较高的发送速率,
+ 改地址时,仅对IP地址进行修改,增加和减少的值要相等.
*/
static int stream_edit_addr(u_char *pkt, int differ, struct ip* iphdr)
{
@@ -1245,7 +1245,7 @@ static int stream_edit_addr(u_char *pkt, int differ, struct ip* iphdr)
iphdr->ip_src.s_addr += differ;
iphdr->ip_dst.s_addr -= differ;
}
- }else{ /* ���Ӷ�GRE, IPinIP, 6over4��֧�� */
+ }else{ /* 增加对GRE, IPinIP, 6over4的支持 */
if(iphdr->ip_src.s_addr <= iphdr->ip_dst.s_addr){
iphdr->ip_src.s_addr += differ;
iphdr->ip_dst.s_addr -= differ;
@@ -1274,7 +1274,7 @@ static int stream_burst_send_pkt_by_marsio(struct mr_sendpath *handle, const u_c
return -1;
}
- /* �˴�ʹ��append������mtod, append�ڲ�ʵ�ʰ�����set datalen�IJ��� */
+ /* 此处使用append而不是mtod, append内部实际包括了set datalen的操作 */
real_buf = marsio_buff_append(send_mbuf[0], pktlen);
memcpy(real_buf, pkt, pktlen);
@@ -1298,7 +1298,7 @@ static stream_burst_send_pkt_multiple(void *handle, const u_char *pkt, size_t pk
return -1;
}
real_buf = marsio_buff_append(send_mbuf[0], pktlen);
- memcpy(real_buf, pkt, pktlen); /* ֻcopyһ������ */
+ memcpy(real_buf, pkt, pktlen); /* 只copy一次数据 */
for(i = 1; i < options.stream_multiple; i++){
send_mbuf[i] = marsio_buff_clone_deep(tcpburst_marsio4_instance, send_mbuf[0], MARSIO_SOCKET_ID_ANY, 0);
@@ -1311,13 +1311,13 @@ static stream_burst_send_pkt_multiple(void *handle, const u_char *pkt, size_t pk
#if 0
if(options.stream_multiple > 1){
real_buf = marsio_buff_append(send_mbuf[0], pktlen);
- memcpy(real_buf, pkt, pktlen); /* ֻcopyһ������ */
+ memcpy(real_buf, pkt, pktlen); /* 只copy一次数据 */
stream_edit_addr(real_buf, i + 1);
marsio_send_burst_with_options(tcpburst_marsio4_sendpath, 0, send_mbuf, 1, MARSIO_SEND_OPT_NO_FREE);
marsio_buff_reset(send_mbuf[0]);
for(i = 1; i < options.stream_multiple; i++){
- /* �˴�ʹ��append������mtod, append�ڲ�ʵ�ʰ�����set datalen�IJ��� */
+ /* 此处使用append而不是mtod, append内部实际包括了set datalen的操作 */
real_buf = marsio_buff_append(send_mbuf[0], pktlen);
stream_edit_addr(real_buf, i + 1);
marsio_send_burst_with_options(tcpburst_marsio4_sendpath, 0, send_mbuf, 1, MARSIO_SEND_OPT_NO_FREE);
@@ -1325,7 +1325,7 @@ static stream_burst_send_pkt_multiple(void *handle, const u_char *pkt, size_t pk
}
marsio_buff_free(tcpburst_marsio4_instance, send_mbuf, 1, MARSIO_SOCKET_ID_ANY, 0);
}else{
- /* �˴�ʹ��append������mtod, append�ڲ�ʵ�ʰ�����set datalen�IJ��� */
+ /* 此处使用append而不是mtod, append内部实际包括了set datalen的操作 */
real_buf = marsio_buff_append(send_mbuf[0], pktlen);
memcpy(real_buf, pkt, pktlen);
@@ -1346,7 +1346,7 @@ typedef struct{
/*--------int delim -------*/
unsigned char vlan_id_half_high;
- unsigned char link_layer_type : 4; /* ���㱨�ķ�װ��ʽ */
+ unsigned char link_layer_type : 4; /* 二层报文封装格式 */
unsigned char vlan_id_half_low : 4;
unsigned int online_test : 1;
unsigned int link_id : 6;
@@ -1457,8 +1457,8 @@ struct mesa_pppoe_session_hdr
unsigned short session_id;
unsigned short len;
/* to do:
- pppӦ�õ�����Ϊһ�����, Ϊ�˼򻯴���, ǿ�ƽ����PPPOE_SES����һ��,
- �����Ҫ����PPPЭ�̹���, �˽ṹ��Ҫ�Ķ�.
+ ppp应该单独作为一层存在, 为了简化处理, 强制将其和PPPOE_SES绑在一起,
+ 如果需要监听PPP协商过程, 此结构需要改动.
*/
unsigned short ppp_protocol;
} __attribute__((packed, aligned(1)));
@@ -1531,11 +1531,11 @@ static const u_char *find_iphdr(const u_char *pkt, size_t pktlen, const u_char *
struct ethhdr * eth = (struct ethhdr *)pkt;
struct ip *iphdr = NULL;
- if(1 == flush) /* ԭʼ���Ѷ���, ǿ��ˢ�¶�����ʣ�����ݰ� */
+ if(1 == flush) /* 原始包已读完, 强制刷新队列中剩余数据包 */
{
if(options.pkt_distance > 0)
{
- /* ȡ��֮ǰ�İ����� */
+ /* 取出之前的包发送 */
for(i = 0; i < options.stream_multiple; i++)
{
while((q_obj = MESA_fixed_q_get_head(&pkt_queue[i])) != NULL)
@@ -1564,7 +1564,7 @@ static const u_char *find_iphdr(const u_char *pkt, size_t pktlen, const u_char *
}
- /* ֧��TCP��UDP, GRE, IPinIPЭ�� */
+ /* 支持TCP和UDP, GRE, IPinIP协议 */
if((iphdr->ip_p != IPPROTO_TCP)
&& (iphdr->ip_p != IPPROTO_UDP)
&& (iphdr->ip_p != IPPROTO_GRE)
@@ -1584,7 +1584,7 @@ static const u_char *find_iphdr(const u_char *pkt, size_t pktlen, const u_char *
if(options.pkt_distance > 0)
{
- /* �ݴ浽���� */
+ /* 暂存到队列 */
for(i = 0; i < options.stream_multiple; i++)
{
memcpy(pbuf, pkt, pktlen);
@@ -1592,7 +1592,7 @@ static const u_char *find_iphdr(const u_char *pkt, size_t pktlen, const u_char *
MESA_fixed_q_join_tail(&pkt_queue[i], pbuf, pktlen);
}
- /* ȡ��֮ǰ�İ����� */
+ /* 取出之前的包发送 */
for(i = 0; i < options.stream_multiple; i++)
{
if(MESA_fixed_q_count(&pkt_queue[i]) >= options.pkt_distance*(i+1))
@@ -1606,11 +1606,11 @@ static const u_char *find_iphdr(const u_char *pkt, size_t pktlen, const u_char *
}
else
{
- /* ���û�а��������, ֱ�ӷ���N�����ݰ����� */
+ /* 如果没有包间距需求, 直接发送N倍数据包即可 */
for(i = 0; i < options.stream_multiple; i++)
{
memcpy(pbuf, pkt, pktlen);
- stream_edit_addr(pbuf, i+1, iphdr); /* �ں����ڲ��޸İ�ͷIP */
+ stream_edit_addr(pbuf, i+1, iphdr); /* 在函数内部修改包头IP */
stream_burst_send_pkt(sp, pkt, pktlen);
pkts_sent ++;
bytes_sent += pktlen;
@@ -1648,7 +1648,7 @@ static void *replay_files_thread(void *arg)
marsio_thread_init(tcpburst_marsio4_instance);
if(0 == loop){
- loop = 1; /* ����һ�� */
+ loop = 1; /* 至少一次 */
}
for(i = 0; i < loop; i++){
replay_file(0);
@@ -1676,13 +1676,13 @@ main(int argc, char *argv[])
#ifndef TCPREPLAY_EDIT
options.driver_mode = OPT_VALUE_DRIVER_MODE;
if(NULL == options.driver_mode){
- options.driver_mode = "pcap"; /* ûָ������, default is pcap */
+ options.driver_mode = "pcap"; /* 没指定参数, default is pcap */
}
#ifdef MARSIO
if(strncasecmp(options.driver_mode, "marsio", 6) == 0){
send_pkt_driver_mode = 12;
- marsio_send_device = get_interface(NULL, OPT_ARG(INTF1)); /* ��ȡԭʼ-i����Ľӿ����� */
- OPT_ARG(INTF1) = strdup("lo"); /* ʹ��lo�ӿ�ƭ��tcpreplay��pcap��صij�ʼ�� */
+ marsio_send_device = get_interface(NULL, OPT_ARG(INTF1)); /* 获取原始-i输出的接口名称 */
+ OPT_ARG(INTF1) = strdup("lo"); /* 使用lo接口骗过tcpreplay跟pcap相关的初始化 */
} else
#endif
if(strncasecmp(options.driver_mode, "pcap", 6) == 0){
@@ -1806,8 +1806,9 @@ main(int argc, char *argv[])
errx(-1, "Unable to gettimeofday(): %s", strerror(errno));
packet_stats(&begin, &end, bytes_sent, pkts_sent, failed);
-
- printf("%s", sendpacket_getstat(options.intf1));
+
+ if (options.intf1 != NULL)
+ printf("%s", sendpacket_getstat(options.intf1));
if (options.intf2 != NULL)
printf("%s", sendpacket_getstat(options.intf2));
}
@@ -2023,7 +2024,7 @@ post_args(void)
options.driver_mode = OPT_VALUE_DRIVER_MODE;
if(NULL == options.driver_mode){
- options.driver_mode = "pcap"; /* ûָ������, default is pcap */
+ options.driver_mode = "pcap"; /* 没指定参数, default is pcap */
}
if((strncasecmp(options.driver_mode, "pcap", 4) != 0)
&& (strncasecmp(options.driver_mode, "marsio", 6) != 0)){