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 @@ -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,灏哅AC瀛楃涓插舰寮忚浆鎹负16杩涘埗MAC鍦板潃. +鍙傛暟: + str: MAC鍦板潃瀛楃涓 + delim: 瀛楃涓插垎闅旂锛屽父瑙佷负':', '-'绛,濡: xx:xx:xx:xx:xx:xx + 濡傛灉瀛楃涓叉棤鍒嗛殧绗︼紝delim璁句负-1. + mac: 瀛樺偍MAC鍦板潃鐨勬暟缁(鎸囬拡),缁撴灉涓虹綉缁滃簭, + 濡傜綉鍗AC鍦板潃涓11:22:33:44:55:66,鍒檓ac[0]涓0x11,mac[5]涓0x66. +杩斿洖鍊: + 0: 姝e父 + -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涓巋ead->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涓巋ead->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模块时,必须调用此初始化模块. + 绗竴娆′娇鐢∕ESA_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"鍋氫负涓涓猯ong鍨嬪彉閲,鐢ㄤ簬瀛樺偍閾捐〃鍏冪礌鏁伴噺 */ 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模块时,必须调用此初始化模块. + 绗竴娆′娇鐢∕ESA_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地址进行修改,增加和减少的值要相等. +/* 淇敼鍘熷寘鐨処P鍦板潃锛屼娇鍥涘厓缁勫拰鍘熷寘涓嶅悓. + 涓轰簡涓嶄粠鏂拌绠楁牎楠屽拰锛屼互杈惧埌杈冮珮鐨勫彂閫侀熺巼锛 + 鏀瑰湴鍧鏃讹紝浠呭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{ /* 澧炲姞瀵笹RE, 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的操作 */ + /* 姝ゅ浣跨敤append鑰屼笉鏄痬tod, append鍐呴儴瀹為檯鍖呮嫭浜唖et 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); /* 鍙猚opy涓娆℃暟鎹 */ 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); /* 鍙猚opy涓娆℃暟鎹 */ 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的操作 */ + /* 姝ゅ浣跨敤append鑰屼笉鏄痬tod, append鍐呴儴瀹為檯鍖呮嫭浜唖et 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的操作 */ + /* 姝ゅ浣跨敤append鑰屼笉鏄痬tod, append鍐呴儴瀹為檯鍖呮嫭浜唖et 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搴旇鍗曠嫭浣滀负涓灞傚瓨鍦, 涓轰簡绠鍖栧鐞, 寮哄埗灏嗗叾鍜孭PPOE_SES缁戝湪涓璧, + 濡傛灉闇瑕佺洃鍚琍PP鍗忓晢杩囩▼, 姝ょ粨鏋勯渶瑕佹敼鍔. */ 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鍜孶DP, 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倍数据包即可 */ + /* 濡傛灉娌℃湁鍖呴棿璺濋渶姹, 鐩存帴鍙戦丯鍊嶆暟鎹寘鍗冲彲 */ 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); /* 鍦ㄥ嚱鏁板唴閮ㄤ慨鏀瑰寘澶碔P */ 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相关的初始化 */ + marsio_send_device = get_interface(NULL, OPT_ARG(INTF1)); /* 鑾峰彇鍘熷-i杈撳嚭鐨勬帴鍙e悕绉 */ + OPT_ARG(INTF1) = strdup("lo"); /* 浣跨敤lo鎺ュ彛楠楄繃tcpreplay璺焢cap鐩稿叧鐨勫垵濮嬪寲 */ } 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)){