/
vrouter.h
312 lines (277 loc) · 11.2 KB
/
vrouter.h
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
/*
* vrouter.h -- vrouter helper
*
* Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
*/
#ifndef __VROUTER_H__
#define __VROUTER_H__
#ifdef __cplusplus
extern "C" {
#endif
#include "sandesh.h"
#include "vr_types.h"
#include "vr_flow.h"
#include "vr_nexthop.h"
#include "vr_route.h"
#include "vr_response.h"
#include "vr_mpls.h"
#include "vr_index_table.h"
#define VR_NATIVE_VRF 0
#define VR_UNIX_PATH_MAX 108
#define VR_MAX_CPUS 64
#define VR_CPU_MASK 0xff
extern unsigned int vr_num_cpus;
#define VR_LOGTYPE_VROUTER (1U << 0)
#define VR_LOGTYPE_USOCK (1U << 1)
#define VR_LOGTYPE_UVHOST (1U << 2)
#define VR_LOGTYPE_DPCORE (1U << 3)
#define VR_LOG_EMERG 1U
#define VR_LOG_ALERT 2U
#define VR_LOG_CRIT 3U
#define VR_LOG_ERR 4U
#define VR_LOG_WARNING 5U
#define VR_LOG_NOTICE 6U
#define VR_LOG_INFO 7U
#define VR_LOG_DEBUG 8U
enum vr_malloc_objects_t {
VR_ASSEMBLER_TABLE_OBJECT,
VR_BRIDGE_MAC_OBJECT,
VR_BTABLE_OBJECT,
VR_BUILD_INFO_OBJECT,
VR_DEFER_OBJECT,
VR_DROP_STATS_OBJECT,
VR_DROP_STATS_REQ_OBJECT,
VR_FLOW_QUEUE_OBJECT,
VR_FLOW_REQ_OBJECT,
VR_FLOW_REQ_PATH_OBJECT,
VR_FLOW_HOLD_STAT_OBJECT,
VR_FLOW_LINK_LOCAL_OBJECT,
VR_FLOW_METADATA_OBJECT,
VR_FLOW_TABLE_INFO_OBJECT,
VR_FLOW_DEFER_DATA_OBJECT,
VR_FRAGMENT_OBJECT,
VR_FRAGMENT_QUEUE_OBJECT,
VR_FRAGMENT_QUEUE_ELEMENT_OBJECT,
VR_FRAGMENT_SCANNER_OBJECT,
VR_HPACKET_POOL_OBJECT,
VR_HTABLE_OBJECT,
VR_INTERFACE_OBJECT,
VR_INTERFACE_MAC_OBJECT,
VR_INTERFACE_REQ_OBJECT,
VR_INTERFACE_REQ_MAC_OBJECT,
VR_INTERFACE_REQ_NAME_OBJECT,
VR_INTERFACE_STATS_OBJECT,
VR_INTERFACE_TABLE_OBJECT,
VR_INTERFACE_VRF_TABLE_OBJECT,
VR_ITABLE_OBJECT,
VR_LOG_TYPES_OBJECT,
VR_MALLOC_OBJECT,
VR_MESSAGE_OBJECT,
VR_MESSAGE_RESPONSE_OBJECT,
VR_MESSAGE_DUMP_OBJECT,
VR_MEM_STATS_REQ_OBJECT,
VR_MIRROR_OBJECT,
VR_MIRROR_TABLE_OBJECT,
VR_MIRROR_META_OBJECT,
VR_MTRIE_OBJECT,
VR_MTRIE_BUCKET_OBJECT,
VR_MTRIE_STATS_OBJECT,
VR_MTRIE_TABLE_OBJECT,
VR_NEXTHOP_OBJECT,
VR_NEXTHOP_COMPONENT_OBJECT,
VR_NEXTHOP_REQ_LIST_OBJECT,
VR_NEXTHOP_REQ_ENCAP_OBJECT,
VR_NEXTHOP_REQ_OBJECT,
VR_ROUTE_TABLE_OBJECT,
VR_ROUTE_REQ_MAC_OBJECT,
VR_TIMER_OBJECT,
VR_USOCK_OBJECT,
VR_USOCK_POLL_OBJECT,
VR_USOCK_BUF_OBJECT,
VR_USOCK_IOVEC_OBJECT,
VR_VROUTER_REQ_OBJECT,
VR_BITMAP_OBJECT,
VR_VROUTER_MAX_OBJECT,
};
extern int vr_perfr;
extern int vr_mudp;
extern int vr_perfs;
extern int vr_perfp;
extern int vr_perfr1, vr_perfr2, vr_perfr3;
extern int vr_perfq1, vr_perfq2, vr_perfq3;
extern int vr_from_vm_mss_adj;
extern int vr_to_vm_mss_adj;
extern int vr_udp_coff;
extern unsigned int vr_flow_hold_limit;
extern int vr_use_linux_br;
extern int hashrnd_inited;
extern uint32_t vr_hashrnd;
#define CONTAINER_OF(member, struct_type, pointer) \
((struct_type *)((unsigned long)pointer - \
(size_t)&(((struct_type *)0)->member)))
typedef void(*vr_defer_cb)(struct vrouter *router, void *user_data);
struct vr_ip;
struct vr_timer {
void (*vt_timer)(void *);
void *vt_vr_arg;
void *vt_os_arg;
unsigned int vt_msecs;
};
struct host_os {
int (*hos_printf)(const char *, ...)
__attribute__((format(printf, 1, 2)));
void *(*hos_malloc)(unsigned int, unsigned int);
void *(*hos_zalloc)(unsigned int, unsigned int);
void (*hos_free)(void *, unsigned int);
uint64_t (*hos_vtop)(void *);
void *(*hos_page_alloc)(unsigned int);
void (*hos_page_free)(void *, unsigned int);
struct vr_packet *(*hos_palloc)(unsigned int);
struct vr_packet *(*hos_palloc_head)(struct vr_packet *, unsigned int);
struct vr_packet *(*hos_pexpand_head)(struct vr_packet *, unsigned int);
void (*hos_pfree)(struct vr_packet *, unsigned short);
struct vr_packet *(*hos_pclone)(struct vr_packet *);
void (*hos_preset)(struct vr_packet *);
int (*hos_pcopy)(unsigned char *, struct vr_packet *, unsigned int,
unsigned int);
unsigned short (*hos_pfrag_len)(struct vr_packet *);
unsigned short (*hos_phead_len)(struct vr_packet *);
void (*hos_pset_data)(struct vr_packet *, unsigned short);
unsigned int (*hos_pgso_size)(struct vr_packet *);
unsigned int (*hos_get_cpu)(void);
void (*hos_schedule_work)(unsigned int, void (*)(void *), void *);
void (*hos_delay_op)(void);
void (*hos_defer)(struct vrouter *, vr_defer_cb, void *);
void *(*hos_get_defer_data)(unsigned int);
void (*hos_put_defer_data)(void *);
void (*hos_get_time)(unsigned int*, unsigned int *);
void (*hos_get_mono_time)(unsigned int*, unsigned int *);
int (*hos_create_timer)(struct vr_timer *);
void (*hos_delete_timer)(struct vr_timer *);
void *(*hos_network_header)(struct vr_packet *);
void *(*hos_inner_network_header)(struct vr_packet *);
void *(*hos_data_at_offset)(struct vr_packet *, unsigned short);
void *(*hos_pheader_pointer)(struct vr_packet *, unsigned short,
void *);
int (*hos_pull_inner_headers)(struct vr_packet *,
unsigned short, unsigned short *,
int (*is_label_l2)(unsigned int,
unsigned int, unsigned short *));
int (*hos_pcow)(struct vr_packet *, unsigned short);
uint16_t (*hos_get_udp_src_port)(struct vr_packet *,
struct vr_forwarding_md *,
unsigned short);
int (*hos_pkt_from_vm_tcp_mss_adj)(struct vr_packet *, unsigned short);
int (*hos_pull_inner_headers_fast)(struct vr_packet *,
unsigned char, int
(*is_label_l2)(unsigned int,
unsigned int, unsigned short *),
int *, int *);
int (*hos_pkt_may_pull)(struct vr_packet *, unsigned int);
int (*hos_gro_process)(struct vr_packet *, struct vr_interface *, bool);
void (*hos_add_mpls)(struct vrouter *, unsigned);
void (*hos_del_mpls)(struct vrouter *, unsigned);
int (*hos_enqueue_to_assembler)(struct vrouter *, struct vr_packet *,
struct vr_forwarding_md *);
void (*hos_set_log_level)(unsigned int vr_log_level);
void (*hos_set_log_type)(unsigned int vr_log_type, int enable);
unsigned int (*hos_get_log_level)(void);
unsigned int *(*hos_get_enabled_log_types)(int *);
};
#define vr_printf vrouter_host->hos_printf
#define vr_malloc vrouter_host->hos_malloc
#define vr_zalloc vrouter_host->hos_zalloc
#define vr_free vrouter_host->hos_free
#define vr_vtop vrouter_host->hos_vtop
#define vr_page_alloc vrouter_host->hos_page_alloc
#define vr_page_free vrouter_host->hos_page_free
#define vr_palloc vrouter_host->hos_palloc
#define vr_palloc_head vrouter_host->hos_palloc_head
#define vr_pexpand_head vrouter_host->hos_pexpand_head
#define vr_pfree vrouter_host->hos_pfree
#define vr_pclone vrouter_host->hos_pclone
#define vr_preset vrouter_host->hos_preset
#define vr_pcopy vrouter_host->hos_pcopy
#define vr_pfrag_len vrouter_host->hos_pfrag_len
#define vr_phead_len vrouter_host->hos_phead_len
#define vr_pgso_size vrouter_host->hos_pgso_size
#define vr_pset_data vrouter_host->hos_pset_data
#define vr_get_cpu vrouter_host->hos_get_cpu
#define vr_schedule_work vrouter_host->hos_schedule_work
#define vr_delay_op vrouter_host->hos_delay_op
#define vr_defer vrouter_host->hos_defer
#define vr_get_defer_data vrouter_host->hos_get_defer_data
#define vr_put_defer_data vrouter_host->hos_put_defer_data
#define vr_get_time vrouter_host->hos_get_time
#define vr_get_mono_time vrouter_host->hos_get_mono_time
#define vr_create_timer vrouter_host->hos_create_timer
#define vr_delete_timer vrouter_host->hos_delete_timer
#define vr_network_header vrouter_host->hos_network_header
#define vr_inner_network_header vrouter_host->hos_inner_network_header
#define vr_data_at_offset vrouter_host->hos_data_at_offset
#define vr_pheader_pointer vrouter_host->hos_pheader_pointer
#define vr_pull_inner_headers vrouter_host->hos_pull_inner_headers
#define vr_pcow vrouter_host->hos_pcow
#define vr_pull_inner_headers_fast vrouter_host->hos_pull_inner_headers_fast
#define vr_get_udp_src_port vrouter_host->hos_get_udp_src_port
#define vr_pkt_from_vm_tcp_mss_adj vrouter_host->hos_pkt_from_vm_tcp_mss_adj
#define vr_pkt_may_pull vrouter_host->hos_pkt_may_pull
#define vr_gro_process vrouter_host->hos_gro_process
#define vr_enqueue_to_assembler vrouter_host->hos_enqueue_to_assembler
#define vr_set_log_level vrouter_host->hos_set_log_level
#define vr_set_log_type vrouter_host->hos_set_log_type
#define vr_get_log_level vrouter_host->hos_get_log_level
#define vr_get_enabled_log_types vrouter_host->hos_get_enabled_log_types
struct vr_malloc_stats {
int64_t ms_size;
int64_t ms_alloc;
int64_t ms_free;
};
struct vrouter {
unsigned char vr_vrrp_mac[VR_ETHER_ALEN];
unsigned char vr_mac[VR_ETHER_ALEN];
unsigned int vr_ip;
struct vr_interface **vr_interfaces;
unsigned int vr_max_interfaces;
unsigned int vr_max_nexthops;
struct vr_btable *vr_nexthops;
struct vr_rtable *vr_inet_rtable;
struct vr_rtable *vr_inet6_rtable;
struct vr_rtable *vr_inet_mcast_rtable;
struct vr_rtable *vr_bridge_rtable;
struct vr_btable *vr_flow_table;
struct vr_btable *vr_oflow_table;
struct vr_flow_table_info *vr_flow_table_info;
unsigned int vr_flow_table_info_size;
unsigned int vr_max_labels;
struct vr_btable *vr_ilm;
unsigned int vr_max_vrfs;
unsigned int vr_max_mirror_indices;
struct vr_mirror_entry **vr_mirrors;
vr_itable_t vr_mirror_md;
vr_itable_t vr_vxlan_table;
struct vr_btable *vr_fragment_table;
struct vr_btable *vr_fragment_otable;
struct vr_timer *vr_fragment_table_scanner;
struct vr_timer *vr_fragment_otable_scanner;
uint64_t **vr_pdrop_stats;
struct vr_malloc_stats **vr_malloc_stats;
uint16_t vr_link_local_ports_size;
unsigned char *vr_link_local_ports;
struct vr_interface *vr_agent_if;
struct vr_interface *vr_host_if;
struct vr_interface *vr_eth_if;
};
struct vr_defer_data {
void *vdd_data;
};
extern volatile bool vr_not_ready;
extern struct host_os *vrouter_host;
extern struct vrouter *vrouter_get(unsigned int);
extern int vrouter_init(void);
extern int vr_module_error(int, const char *, int, int);
extern int vhost_init(void);
#ifdef __cplusplus
}
#endif
#endif /* __VROUTER_H__ */