summaryrefslogtreecommitdiff
path: root/include/private/packet_io_internal.h
blob: 40b6557b3c4744a655dc5cd216fdfc476701da30 (plain)
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
#ifndef _PACKET_IO_INTERNAL_H_
#define _PACKET_IO_INTERNAL_H_
#include <linux/limits.h>
#include <netinet/in.h>
#include "private/mesa_net.h"
#include "stream_inc/stream_base.h"
#include "stream_internal.h"
#include "packet_io.h"

#ifdef __cplusplus
extern "C" {
#endif

/* 802.1Q��802.1AD ͷ����ʽ��ʵ��һ��, ֻ��ethernet type��һ��, ���Dz����ֵĻ�, ע�����ݰ����д�, ͨ����Щֵ����addr.pkttype�ֶ�,������������ */
#define ADDR_TYPE_8021Q_ABBR	(0x81)
#define ADDR_TYPE_8021AD_ABBR	(0x88)

#ifndef RTE_CACHE_LINE_SIZE
	#define RTE_CACHE_LINE_SIZE 64
	#define __sapp_aligned(a) __attribute__((__aligned__(a)))
	#define __sapp_cache_aligned __sapp_aligned(RTE_CACHE_LINE_SIZE)
#endif

#define KILL_TCP_PHONY_POINTER			((void *)0x1A2B3C4D5E6F)
#define INDEPENDENT_SEND_QUEUE_MAX_NUM	(256) /* ����Լ��������߳�, ֧�ֵ�����Ͷ�������, ��ֵ��Ҫ������marsioģʽ, ��������libpcap��ʵ��Ӱ��, Ϊ��ͳһ, ���ܸ���64!! */

typedef struct{
	int threadnum; 
	int raw_ipv4_fd; /* �����ڷ���IPv4��rst�� */
	int raw_ipv6_fd; /* �����ڷ���IPv6��rst�� */
	int raw_udp_fd;
	int raw_eth_fd; /* �����ڷ���Ethernetԭʼ���� */
	unsigned char *send_buf;
	void *low_level_send_handle; /* �ײ㷢�����, ���ݵײ�����, ͨ��dl_io_get_send_handle()��ȡ */
	int sendtype; /* ������Zhuanyong���� */
	struct sockaddr saddr_raw_eth;
	unsigned long tot_send_pkt;
	unsigned long tot_send_byte;
	unsigned long tot_send_err;
	void *user_arg; /* 2018-08-31 lijia add, for PanGu, ʹ�ô���vxlan����rst�� */
}MESA_send_handle;

/* 2012-07-10 LiJia add, ��������ģʽ���ɸ��������ļ����ݣ����Ĺ���ģʽ: 
   Ŀǰ֧������ģʽ:
	0: ����ģʽ�� ����Ҫ������ֻ����;
	1: ����ģʽ�� ����������+����, ����ʹ��IP��socket, ͨ��ϵͳ·��ȷ�����Ŀ���������;
	2: ����ģʽ�� ˫��������+����;
	3: �߼�����ģʽ�� ���������豸���ض������ע.
*/
#define __NET_CONN_PARALLEL		(0x1)	/* ����ģʽ */
#define __NET_CONN_SERIAL			(0x2)	/* ����ģʽ */

#define __NET_CONN_SENPACKET		(0x10)	/* ���������� */
#define __NET_CONN_NO_SENPACKET	(0x20)	/* ����Ҫ���� */

#define __NET_CONN_GDEV			(0x100)	/* ���������豸 */

#define __NET_CONN_LINK_LAYER		(0x1000) /* ��Ҫ������·��MAC��ַ */

#define __NET_CONN_PARA_ETH		(0x2000) /* 2013-11-08 add, ��Ҫ��������ģʽ�µ�MAC��ַ */

#define NET_CONN_PARA_NOSEND	(__NET_CONN_PARALLEL | __NET_CONN_NO_SENPACKET)
#define NET_CONN_PARALLEL		(__NET_CONN_PARALLEL | __NET_CONN_SENPACKET | __NET_CONN_PARA_ETH)
#define NET_CONN_SERIAL_2CARD	(__NET_CONN_SERIAL   | __NET_CONN_SENPACKET | __NET_CONN_LINK_LAYER)
#define NET_CONN_SERIAL_GDEV	(__NET_CONN_SERIAL   | __NET_CONN_SENPACKET | __NET_CONN_GDEV | __NET_CONN_LINK_LAYER)

#define CAP_FILTER_STR_LEN			(1024)
#define DEV_NAME_STR_LEN			(32)

#define VXLAN_HDR_RESERVED_LEN	(14+8+8+20) /* ����vxlan���ݰ�Ԥ����ͷ���ռ�, ʹ��ip_socket����, ����������mac, ��inner_eth+vxlan+outer_udp+outer_ip */

struct sendpacket_mac_table{
	unsigned char src_mac[6];
	unsigned char rcv_dir;
	char __pad1__;	 /* ʹmac��ʼ��ַ8�ֽڶ��� */
	unsigned char dst_mac[6];
	char __pad2__[2];/* ʹmac��ʼ��ַ8�ֽڶ��� */
};

typedef struct{
	union{
		char dev_name[128];	/* for pcap, pag, marsio, etc. */
		unsigned int port_id;	/* for DPDK */
		void *sendpath; /* for marsio4.1 */
	};
}send_raw_args_t;


enum io_status_t{
	IO_STATUS_ETH = 0,				/* 0 */
	IO_STATUS_IPV4 = 1,				/* 1, ����IPv4��ַ����Ԫ����Ϣ */
	IO_STATUS_IPV6,				/* 2, ����IPv6��ַ����Ԫ����Ϣ */
	IO_STATUS_VLAN,				/* 3 */
	IO_STATUS_ARP,					/* 4 */
	IO_STATUS_GRE,					/* 5 */
	IO_STATUS_MPLS,				/* 6 */
	IO_STATUS_PPPOE_SES,			/* 7 */
	IO_STATUS_TCP_PKT,				/* 8, TCP�������, �������ֽ���, SYN��SYN/ACK��RST�����ȵ� */
	IO_STATUS_UDP_PKT,				/* 9, UDP�������, �������ֽ��� */
	IO_STATUS_L2TP,				/* 10 */
	IO_STATUS_PPP,					/* 11 */
	IO_STATUS_TCP_STREAM,			/* 12 TCP�������, ��ǰ��������, ÿ���½�����, ÿ��ɾ�������� */
	IO_STATUS_UDP_STREAM,			/* 13 UDP�������, ��ǰ��������, ÿ���½�����, ÿ��ɾ�������� */
	IO_STATUS_STREAM_HASH,		/* 14 HASH �������, ������ͻ��������, ƽ�����ҳ��ȵ� */
	IO_STATUS_MAX,					/* 15 */
};

typedef struct{
	unsigned long long pkt_num;
	unsigned long long pkt_byte;
}packet_io_status_base_t; /* ��������, ÿ��Э�����Ͷ��еIJ��� */

typedef struct{
	packet_io_status_base_t *packet_io_status[IO_STATUS_MAX]; /* ʵ�ʴ洢�ṹ�ɾ���Э�����;��� */
}packet_io_status_t;






struct dl_io_lib_name{
	int cap_mode;
	const char *prefix;
	const char *lib_name;
};

typedef struct{
	unsigned int target_id; /* �����ļ��е�ID */
	char *device_args;    /* �����ļ��е�ԭʼ�����ַ���, ��Ҫ������Ļص�����ת����io_io_param; */
	union{ /* ����ת����ĵײ㷢�Ͳ���, �������marsio������˵, ����struct mr_sendpath; ����pcapģʽ��˵, �����豸����"eth1"��. */
		void *dl_io_param;
		char *string_param;
		int int_param;
		long long llong_param;
	};
}packet_io_device_alias_t;
extern packet_io_device_alias_t *g_packet_device_alias;

enum timestamp_level{
	TS_LEVEL_LIB			=	0,	/* pcap_hand, libpcap���õ�,�����֮ǰ */
	TS_LEVEL_WORK			=	1,	/* pcap_worker, �Ӷ�����ȡ�� */
	TS_LEVEL_IP_ENTRY		=	2,	
	TS_LEVEL_BEFORE_PLUG	= 	3,
	TS_LEVEL_AFTER_PLUG	=	4,
	__TS_LEVEL_MAX		=	5,
};

/* ��ʱ�洢���ڹ���ÿ���ͷ�IJ���, ��ip->id, ip->ttl, tcp->flags, tcp->win������ */
typedef struct{
	void *layer_args[__ADDR_TYPE_MAX] __sapp_cache_aligned;
	//long __pad[6];
}layer_args_t ;


int MESA_get_dev_mac(const char *device, unsigned char mac[6]);
int MESA_mac_pton(const char *str, int delim, char *mac);
int sendpacket_init_new(int tot_thread_num);
int packet_io_set_max_rand_value(int rand_max);
int packet_io_set_rand_key(int rand_key);
MESA_send_handle *packet_io_get_send_handle(int thread_id);
int packet_io_send(MESA_send_handle *send_handle,int datalen,int send_type, 
					int low_layer_type, int dir,int thread_num, char *feedback_buf, 
					int *feedback_buf_len, const raw_pkt_t *raw_pkt);

void sysinfo_output(void);
int is_proxy_stream(const struct streaminfo *pstream);
int packet_io_send_raw(int thread_num, char *data, int datalen,unsigned int target_id);
extern void ipv4_frag_exit(void);
extern void ipv6_frag_exit(void);
extern int set_gre_hdr(struct mesa_gre_hdr *stack_gre_addr, const void *this_layer_data);
extern int calc_gre_hdr_len(const struct mesa_gre_hdr *gre_hdr);
extern int packet_io_status_vlan_init(void);
extern int get_pkt_len_from_eth_hdr(const struct mesa_ethernet_hdr *ehdr);
extern int packet_io_send_fake_pkt_by_gdev(MESA_send_handle *send_handle, enum addr_type_t addrtype, 
	char *data, int datalen, int dir_reverse,char *feedback_buf, int *feedback_buf_len);
unsigned long long MESA_rand_range(unsigned long long start, unsigned long long end);
int __MESA_rst_tcp(struct streaminfo *stream, unsigned char rst_th_flags, int rst_pkt_num, unsigned char snd_rst_dir, 
							unsigned short signature_seed1, unsigned short signature_seed2);
int __sapp_inject_pkt(struct streaminfo *raw_stream, enum sapp_inject_opt sio, 
        const void *payload, int payload_len, unsigned char snd_routedir, void *user_arg);			

int __sapp_inject_ctrl_pkt(struct streaminfo *stream, enum sapp_inject_opt sio, const void *payload, int payload_len, unsigned char snd_routedir);

int packet_io_hook_input(raw_pkt_t *raw_pkt, unsigned char dir, int thread_num);
int packet_io_hook_input_mirror(raw_pkt_t *raw_pkt, unsigned char dir, int thread_num);
int packet_io_hook_forward(raw_pkt_t *raw_pkt, unsigned char dir, int thread_num);
int packet_io_hook_sendto(const raw_pkt_t *raw_pkt, unsigned char route_dir, char *send_pkt_data, void *send_pkt_io_reference);
void sapp_pkt_dump_by_raw_pkt(int tid, const void *pkt, int pkt_len, int has_layer2_hdr, unsigned short eth_pro_host_order, enum _pkt_classify class_val);
unsigned int dpdk_rte_crc_hash(const char *sipaddr, const char *dipaddr, int addrlen, unsigned int orin_hash);
void sendpacket_destroy(int tot_thread_num);
void send_handle_destroy(int thread_index);
int deal_gtp_calc_gtp_hdr_len(const struct gtp_hdr *gtph);


/********************** funcitons for dynamic link ***********************/
extern int dl_io_set_cap_level(int cap_level);
extern int dl_io_set_cap_mode(int cap_mode);
extern int dl_io_set_topology_mode(int topology_mode);
extern int dl_io_set_capdev_parallel(const char *cap_dev);
extern int dl_io_set_capdev_serial(const char *up_dev, const char *down_dev);
extern int dl_io_set_capture_filter(const char *filter_rule);
extern int dl_io_set_cap_buf_queue(int queue_num_max);
extern int dl_io_set_work_thread_num(int thread_num_max);
extern long dl_io_get_app_drop_num(int thread_num);
extern long dl_io_get_lib_drop_num(void);
extern unsigned char * dl_io_get_sendbuf(void *, int );
extern void dl_io_free_sendbuf(void *, int thread_num);
extern void * dl_io_get_send_handle(int  thread_num);
extern int dl_io_low_level_send(void *phandle, unsigned char *data,int datalen,
						int eth_carry_layer_addr_type, int dir,int thread_num, const raw_pkt_t *raw_pkt); /* ����ethernet�� */
extern int dl_io_raw_pkt_send(void *phandle, unsigned char *data,int datalen, void *arg, int thread_num); /* ȫ��ԭʼ�� */
extern int dl_io_init(int argc, char *argv[]);
extern void dl_io_run(void);
extern int dl_io_register_cb(PACKET_IO_CB_T fun);
extern int dl_io_register_exit_cb(PACKET_IO_EXIT_CB_T exit_fun); 
extern int dl_io_get_version(void);
extern void * dl_io_device_alias(unsigned int target_id, char *device_args);

/********************** funcitons for dynamic link ***********************/


/********************** pcap funcitons for dynamic link ***********************/
extern int pcap_dl_io_set_cap_level(int cap_level);
extern int pcap_dl_io_set_cap_mode(int cap_mode);
extern int pcap_dl_io_set_topology_mode(int topology_mode);
extern int pcap_dl_io_set_capdev_parallel(const char *cap_dev);
extern int pcap_dl_io_set_capdev_serial(const char *up_dev, const char *down_dev);
extern int pcap_dl_io_set_capture_filter(const char *filter_rule);
extern int pcap_dl_io_set_cap_buf_queue(int queue_num_max);
extern int pcap_dl_io_set_work_thread_num(int thread_num_max);
extern long pcap_dl_io_get_app_drop_num(int thread_num);
extern long pcap_dl_io_get_lib_drop_num(void);
extern unsigned char * pcap_dl_io_get_sendbuf(void *, int );
extern void pcap_dl_io_free_sendbuf(void *, int thread_num);
extern void * pcap_dl_io_get_send_handle(int  thread_num);
extern int pcap_dl_io_low_level_send(void *phandle, unsigned char *data,int datalen,
						int eth_carry_layer_addr_type, int dir,int thread_num, const raw_pkt_t *raw_pkt); /* ����ethernet�� */
extern int pcap_dl_io_raw_pkt_send(void *phandle, unsigned char *data,int datalen, void *arg, int thread_num, unsigned char, const raw_pkt_t *raw_pkt); /* ȫ��ԭʼ�� */
extern int pcap_dl_io_init(int argc, char *argv[]);
extern void pcap_dl_io_run(void);
extern int pcap_dl_io_register_cb(PACKET_IO_CB_T fun);
extern int pcap_dl_io_register_exit_cb(PACKET_IO_EXIT_CB_T exit_fun); 
extern int pcap_dl_io_get_version(void);
extern void * pcap_dl_io_device_alias(unsigned int target_id, char *device_args);
void packet_io_under_ddos_run(void);
int packet_io_under_ddos_init(void);
void packet_io_under_ddos_destroy(void);
int packet_io_under_ddos_should_bypass(int thread_index);
void update_under_ddos_stream_state(struct streaminfo *pstream);
int packet_io_under_ddos_global_status(void);
void pcap_dl_io_destroy(void);
void pcap_dl_io_stop(void);
void pcap_dl_io_device_alias_free(unsigned int target_id, char *dev_args);
extern int pcap_dl_io_smart_offload(int device_index, unsigned char *pkt_ptr, int pkt_len, unsigned char dir, int thread_num);
extern int pcap_dl_io_forward_rawpkt(const raw_pkt_t *raw_pkt, int thread_seq);
extern void pcap_dl_io_free_rawpkt(const raw_pkt_t *raw_pkt, int thread_seq);
extern struct rawpkt_metadata *pcap_dl_io_get1_rawpkt_meta(const raw_pkt_t *raw_pkt,int thread_seq);
extern void pcap_dl_io_free_rawpkt_meta(struct rawpkt_metadata *, int thread_seq);

/********************** pcap funcitons for dynamic link ***********************/


/********************** pag funcitons for dynamic link ***********************/
extern int pag_dl_io_set_cap_level(int cap_level);
extern int pag_dl_io_set_cap_mode(int cap_mode);
extern int pag_dl_io_set_topology_mode(int topology_mode);
extern int pag_dl_io_set_capdev_parallel(const char *cap_dev);
extern int pag_dl_io_set_capdev_serial(const char *up_dev, const char *down_dev);
extern int pag_dl_io_set_capture_filter(const char *filter_rule);
extern int pag_dl_io_set_cap_buf_queue(int queue_num_max);
extern int pag_dl_io_set_work_thread_num(int thread_num_max);
extern long pag_dl_io_get_app_drop_num(int thread_num);
extern long pag_dl_io_get_lib_drop_num(void);
extern unsigned char * pag_dl_io_get_sendbuf(void *, int );
extern void pag_dl_io_free_sendbuf(void *, int thread_num);
extern void * pag_dl_io_get_send_handle(int  thread_num);
extern int pag_dl_io_low_level_send(void *phandle, unsigned char *data,int datalen,
						int eth_carry_layer_addr_type, int dir,int thread_num); /* ����ethernet�� */
extern int pag_dl_io_raw_pkt_send(void *phandle, unsigned char *data,int datalen, void *arg, int thread_num); /* ȫ��ԭʼ�� */
extern int pag_dl_io_init(int argc, char *argv[]);
extern void pag_dl_io_run(void);
extern int pag_dl_io_register_cb(PACKET_IO_CB_T fun);
extern int pag_dl_io_register_exit_cb(PACKET_IO_EXIT_CB_T exit_fun); 
extern int pag_dl_io_get_version(void);
extern void * pag_dl_io_device_alias(unsigned int target_id, char *device_args);
extern void pcap_dl_io_free_send_handle(int thread_seq, void *_handle);
extern int pag_dl_io_smart_offload(int device_index, unsigned char *pkt_ptr, int pkt_len, unsigned char dir, int thread_num);

/********************** pag funcitons for dynamic link ***********************/


/********************** marsio funcitons for dynamic link *********************/
extern int marsio_dl_io_set_cap_level(int cap_level);
extern int marsio_dl_io_set_cap_mode(int cap_mode);
extern int marsio_dl_io_set_topology_mode(int topology_mode);
extern int marsio_dl_io_set_capdev_parallel(const char *cap_dev);
extern int marsio_dl_io_set_capdev_serial(const char *up_dev, const char *down_dev);
extern int marsio_dl_io_set_capture_filter(const char *filter_rule);
extern int marsio_dl_io_set_cap_buf_queue(int queue_num_max);
extern int marsio_dl_io_set_work_thread_num(int thread_num_max);
extern long marsio_dl_io_get_app_drop_num(int thread_num);
extern long marsio_dl_io_get_lib_drop_num(void);
extern unsigned char * marsio_dl_io_get_sendbuf(void *, int );
extern void marsio_dl_io_free_sendbuf(void *, int thread_num);
extern void * marsio_dl_io_get_send_handle(int  thread_num);
extern int marsio_dl_io_low_level_send(void *phandle, unsigned char *data,int datalen,
						int eth_carry_layer_addr_type, int dir,int thread_num, const raw_pkt_t *raw_pkt); /* ����ethernet�� */
extern int marsio_dl_io_raw_pkt_send(void *phandle, unsigned char *data,int datalen, void *arg, int thread_num, unsigned char routedir,const raw_pkt_t *raw_pkt); /* ȫ��ԭʼ�� */
extern int marsio_dl_io_init(int argc, char *argv[]);
extern void marsio_dl_io_run(void);
extern int marsio_dl_io_register_cb(PACKET_IO_CB_T fun);
extern int marsio_dl_io_register_exit_cb(PACKET_IO_EXIT_CB_T exit_fun); 
extern int marsio_dl_io_get_version(void);
extern void * marsio_dl_io_device_alias(unsigned int target_id, char *device_args);
extern int marsio_dl_io_send_only_thread_init(void);
extern void marsio_dl_io_destroy(void);
extern int marsio_dl_io_smart_offload(int device_index, unsigned char *pkt_ptr, int pkt_len, unsigned char dir, int thread_num);
extern int marsio_dl_io_forward_rawpkt(const raw_pkt_t *raw_pkt, int thread_seq);
extern void marsio_dl_io_free_rawpkt(const raw_pkt_t *raw_pkt, int thread_seq);
extern struct rawpkt_metadata *marsio_dl_io_get1_rawpkt_meta(const raw_pkt_t *raw_pkt, int thread_seq);
extern void marsio_dl_io_free_rawpkt_meta(struct rawpkt_metadata *, int thread_seq);

/********************** marsio funcitons for dynamic link *********************/

/********************** tun funcitons for dynamic link ***********************/
extern int tun_dl_io_set_cap_level(int cap_level);
extern int tun_dl_io_set_cap_mode(int cap_mode);
extern int tun_dl_io_set_topology_mode(int topology_mode);
extern int tun_dl_io_set_capdev_parallel(const char *cap_dev);
extern int tun_dl_io_set_capdev_serial(const char *up_dev, const char *down_dev);
extern int tun_dl_io_set_capture_filter(const char *filter_rule);
extern int tun_dl_io_set_cap_buf_queue(int queue_num_max);
extern int tun_dl_io_set_work_thread_num(int thread_num_max);
extern long tun_dl_io_get_app_drop_num(int thread_num);
extern long tun_dl_io_get_lib_drop_num(void);
extern unsigned char * tun_dl_io_get_sendbuf(void *, int );
extern void tun_dl_io_free_sendbuf(void *, int thread_num);
extern void * tun_dl_io_get_send_handle(int  thread_num);
extern int tun_dl_io_low_level_send(void *phandle, unsigned char *data,int datalen,
						int eth_carry_layer_addr_type, int dir,int thread_num, const raw_pkt_t *raw_pkt); /* ����ethernet�� */
extern int tun_dl_io_raw_pkt_send(void *phandle, unsigned char *data,int datalen, void *arg, int thread_num); /* ȫ��ԭʼ�� */
extern int tun_dl_io_init(int argc, char *argv[]);
extern void tun_dl_io_run(void);
extern int tun_dl_io_register_cb(PACKET_IO_CB_T fun);
extern int tun_dl_io_register_exit_cb(PACKET_IO_EXIT_CB_T exit_fun); 
extern int tun_dl_io_get_version(void);
extern void * tun_dl_io_device_alias(unsigned int target_id, char *device_args);
extern int tun_dl_io_smart_offload(int device_index, unsigned char *pkt_ptr, int pkt_len, unsigned char dir, int thread_num);


/********************** tun funcitons for dynamic link ***********************/



#ifdef __cplusplus
}
#endif

#endif