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;
#define PROCESS_BAR_SW (1) /* ʵʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
#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 <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 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<EFBFBD>ַ<EFBFBD>ת16<EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/* 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,<EFBFBD><EFBFBD>MAC<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽת<EFBFBD><EFBFBD>Ϊ16<EFBFBD><EFBFBD><EFBFBD><EFBFBD>MAC<EFBFBD><EFBFBD>ַ.
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
str: MAC<EFBFBD><EFBFBD>ַ<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>
delim: <EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ':', '-'<EFBFBD><EFBFBD>,<2C><>: xx:xx:xx:xx:xx:xx
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>޷ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>delim<EFBFBD><EFBFBD>Ϊ-1.
mac: <EFBFBD>MAC<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><D6B8>),<2C><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MAC<EFBFBD><EFBFBD>ַΪ11:22:33:44:55:66,<EFBFBD><EFBFBD>mac[0]Ϊ0x11,mac[5]Ϊ0x66.
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
0: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
-1:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/* 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;
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><EFBFBD><EFBFBD> */
/* 检查输入合法性 */
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)
}
}
/* <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++)
{
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)
{
printf("MAC string type error!\n");
@@ -377,7 +377,7 @@ static int parse_encap_cfg_file(const char *filename)
return 0;
}
/*************************** <EFBFBD>ڲ<EFBFBD>ʵ<EFBFBD>ֽӿ<EFBFBD> ********************************/
/*************************** 内部实现接口 ********************************/
/*
* 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()<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)
{
@@ -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()<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)
{
@@ -709,11 +709,11 @@ static int MESA_q_is_item_in_list_quick(MESA_queue_head_t *qhead_obj, MESA_list_
}
#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)
{
@@ -722,7 +722,7 @@ int MESA_list_init(MESA_queue_head_t *head)
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)
{
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 <EFBFBD>ڲ<EFBFBD>ʵ<EFBFBD>ֽӿ<EFBFBD>***********************/
/************************ 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 <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;
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));
/* <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);
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++){
real_tail = __create_fixed_q_elem(max_elem_len);
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->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->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); /* ͷ<EFBFBD>ڵ<EFBFBD>.data<EFBFBD><EFBFBD><EFBFBD>ڴ洢<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ʵ<EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
tqelem->datalen = max_elem_len; /* ͷ<EFBFBD>ڵ<EFBFBD>.datalen<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; /* 头节点.datalen用于存储当前队列的元素最大长度 */
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>ͬ.
Ϊ<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地址使四元组和原包不同.
为了不从新计算校验和,以达到较高的发送速率,
改地址时仅对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{ /* <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){
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;
}
/* <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);
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һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
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һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
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++){
/* <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);
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{
/* <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);
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; /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD>װ<EFBFBD><EFBFBD>ʽ */
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Ӧ<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>,
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>PPPЭ<EFBFBD>̹<EFBFBD><EFBFBD><EFBFBD>, <20>˽ṹ<CBBD><E1B9B9>Ҫ<EFBFBD>Ķ<EFBFBD>.
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) /* ԭʼ<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)
{
/* ȡ<EFBFBD><EFBFBD>֮ǰ<EFBFBD>İ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/* 取出之前的包发送 */
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 *
}
/* ֧<EFBFBD><EFBFBD>TCP<EFBFBD><EFBFBD>UDP, GRE, IPinIPЭ<EFBFBD><EFBFBD> */
/* 支持TCPUDP, 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)
{
/* <EFBFBD>ݴ浽<EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/* 暂存到队列 */
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);
}
/* ȡ<EFBFBD><EFBFBD>֮ǰ<EFBFBD>İ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/* 取出之前的包发送 */
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
{
/* <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++)
{
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);
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; /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD> */
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"; /* ûָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, 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)); /* <EFBFBD><EFBFBD>ȡԭʼ-i<><69><EFBFBD><EFBFBD><EFBFBD>Ľӿ<C4BD><D3BF><EFBFBD><EFBFBD><EFBFBD> */
OPT_ARG(INTF1) = strdup("lo"); /* ʹ<EFBFBD><EFBFBD>lo<EFBFBD>ӿ<EFBFBD>ƭ<EFBFBD><EFBFBD>tcpreplay<EFBFBD><EFBFBD>pcap<EFBFBD><EFBFBD><EFBFBD>صij<EFBFBD>ʼ<EFBFBD><EFBFBD> */
marsio_send_device = get_interface(NULL, OPT_ARG(INTF1)); /* 获取原始-i输出的接口名称 */
OPT_ARG(INTF1) = strdup("lo"); /* 使用lo接口骗过tcpreplaypcap相关的初始化 */
} 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"; /* ûָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, 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)){