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:
115
src/tcpreplay.c
115
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) /* ʵʱ<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()把新节点插在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()<EFBFBD><EFBFBD><EFBFBD>½ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>head<EFBFBD><EFBFBD>head->prev֮<EFBFBD><EFBFBD>.
|
||||
* 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
|
||||
|
||||
/*************************** <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> */
|
||||
/* 支持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)
|
||||
{
|
||||
/* <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接口骗过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"; /* ûָ<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)){
|
||||
|
||||
Reference in New Issue
Block a user