Merge branch 'patch-1' into 'master'

Update tcpreplay.c;marsio模式下options.intf1变量不会被初始化,所以添加判断是否为NULL

See merge request common_tools/tcp_burst!5
This commit is contained in:
刘学利
2019-08-14 13:34:45 +08:00

View File

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