1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
#include "sapp_api.h"
#include "sapp_private_api.h"
#include "sapp_declaration.h"
#ifdef __cplusplus
extern "C" {
#endif
/*
�豸, ·��;
id->�����豸->���豸.
#target_id pag_arg pcap_arg pfring_arg dpdk_arg
*/
packet_io_device_alias_t *g_packet_device_alias; /* ֱ���������±����target_id, ��߲���Ч�� */
int packet_device_alias_num = 0;
extern void del_last_rn(char *data, int max_len);
extern void * dl_io_device_alias(unsigned int target_id, char *device_args);
extern void * get_dl_io_device_alias_fun_symbol(void);
static int insert_to_device_alias(unsigned int target_id, char *device_args)
{
void * (*dl_io_device_alias_fun)(unsigned int target_id, char *device_args) = NULL;
if(0 == packet_device_alias_num) {
g_packet_device_alias = (packet_io_device_alias_t *)sapp_mem_calloc(SAPP_MEM_FIX_GLOBAL_VAL, MEM_STAT_GLOBAL_THREAD_ID,sizeof(packet_io_device_alias_t) * (target_id + 1));
packet_device_alias_num = target_id + 1;
}else{
if(packet_device_alias_num <= (int)target_id){
g_packet_device_alias = (packet_io_device_alias_t *)sapp_mem_realloc(SAPP_MEM_FIX_GLOBAL_VAL, MEM_STAT_GLOBAL_THREAD_ID,g_packet_device_alias, sizeof(packet_io_device_alias_t) * (target_id + 1));
packet_device_alias_num = target_id + 1;
}
}
//dl_io_device_alias_fun = (void * (*)(unsigned int, char *))get_dl_io_device_alias_fun_symbol();
dl_io_device_alias_fun = dl_io_fun_list.dl_io_device_alias;
if(NULL == dl_io_device_alias_fun){
return -1;
}
g_packet_device_alias[target_id].target_id = target_id;
g_packet_device_alias[target_id].device_args = sapp_strdup(device_args);
g_packet_device_alias[target_id].dl_io_param = dl_io_device_alias_fun(target_id, device_args);
return 0;
}
static int parse_send_raw_pkt_conf(void)
{
FILE *fp;
char conf_buf[1024];
const char *delim = "\t ";
char *saveptr;
char *section;
int column_index = 0; /* �ڼ��� */
unsigned int tid;
fp = fopen(ABBR_SEND_RAW_PKT_CONF_FILE, "r");
if(NULL == fp){
sapp_log(RLOG_LV_FATAL, 1, 1, "open send raw pkt config file '%s' error!\n", ABBR_SEND_RAW_PKT_CONF_FILE);
return -1;
}
while(fgets(conf_buf, 1024, fp)){
if('#' == conf_buf[0] || ' ' == conf_buf[0] || '\r' == conf_buf[0] || '\n' == conf_buf[0]){
continue;
}
del_last_rn(conf_buf, 1024);
/* ��һ��Ϊ target_id */
section = strtok_r(conf_buf, delim, &saveptr);
if(NULL == section){
return -1;
}
tid = strtoul(section, NULL, 0);
if(tid > 1000){
sapp_log(RLOG_LV_INFO, 1, 1,"[Warning] in '%s', target_id is too large!\n", ABBR_SEND_RAW_PKT_CONF_FILE);
sleep(1);
}
column_index = 0;
section = strtok_r(NULL, delim, &saveptr);
while(g_packet_io_cap_mode != column_index){ /* �ҵ���ǰ����ģʽ��Ӧ���� */
section = strtok_r(NULL, delim, &saveptr);
if(NULL == section){
sapp_log(RLOG_LV_FATAL, 1, 1,"packet_io_mode is %d, but in %s not found related args!\n", g_packet_io_cap_mode, ABBR_SEND_RAW_PKT_CONF_FILE);
return -1;
}
column_index++;
}
insert_to_device_alias(tid, section);
while(strtok_r(NULL, delim, &saveptr)); /* clear strtok buf */
}
fclose(fp);
return 0;
}
int packet_io_device_alias_init(void)
{
if(parse_send_raw_pkt_conf() < 0){
return -1;
}
return 0;
}
void packet_io_device_alias_destroy(void)
{
int i;
for(i = 0; i < packet_device_alias_num; i++){
SAPP_GLOBAL_FREE(g_packet_device_alias[i].device_args);
if(dl_io_fun_list.dl_io_device_alias_free){
(*dl_io_fun_list.dl_io_device_alias_free)(g_packet_device_alias[i].target_id, g_packet_device_alias[i].dl_io_param);
}
}
SAPP_GLOBAL_FREE(g_packet_device_alias);
packet_device_alias_num = 0;
}
#ifdef __cplusplus
}
#endif
|