Line data Source code
1 : /*
2 : * vrouter.h -- vrouter helper
3 : *
4 : * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
5 : * Copyright Contributors to the OpenSDN project
6 : */
7 : #ifndef __VROUTER_H__
8 : #define __VROUTER_H__
9 :
10 : #ifdef __cplusplus
11 : extern "C" {
12 : #endif
13 :
14 : #include "sandesh.h"
15 : #include "vr_types.h"
16 : #include "vr_interface.h"
17 : #include "vr_qos.h"
18 : #include "vr_flow.h"
19 : #include "vr_bridge.h"
20 : #include "vr_interface.h"
21 : #include "vr_nexthop.h"
22 : #include "vr_route.h"
23 : #include "vr_response.h"
24 : #include "vr_mpls.h"
25 : #include "vr_index_table.h"
26 : #include "vr_mem.h"
27 : #include "vr_offloads.h"
28 : #include "vr_pkt_droplog.h"
29 : #include "vr_fragment.h"
30 : #include "vr_message.h"
31 : #include "vr_info.h"
32 :
33 : #define VR_NATIVE_VRF 0
34 : #define VR_UNIX_PATH_MAX 108
35 : #define VR_MAX_CPUS 256
36 :
37 : #define VR_CPU_MASK 0xffff
38 : extern unsigned int vr_num_cpus;
39 :
40 : #define VR_LOGTYPE_VROUTER (1U << 0)
41 : #define VR_LOGTYPE_USOCK (1U << 1)
42 : #define VR_LOGTYPE_UVHOST (1U << 2)
43 : #define VR_LOGTYPE_DPCORE (1U << 3)
44 :
45 : #define VR_LOG_EMERG 1U
46 : #define VR_LOG_ALERT 2U
47 : #define VR_LOG_CRIT 3U
48 : #define VR_LOG_ERR 4U
49 : #define VR_LOG_WARNING 5U
50 : #define VR_LOG_NOTICE 6U
51 : #define VR_LOG_INFO 7U
52 : #define VR_LOG_DEBUG 8U
53 :
54 : #define VR_RX_HANDLER_PASS 255
55 :
56 : enum vr_malloc_objects_t {
57 : VR_ASSEMBLER_TABLE_OBJECT,
58 : VR_BRIDGE_MAC_OBJECT,
59 : VR_BRIDGE_TABLE_DATA_OBJECT,
60 : VR_BTABLE_OBJECT,
61 : VR_BUILD_INFO_OBJECT,
62 : VR_DEFER_OBJECT,
63 : VR_DROP_STATS_OBJECT,
64 : VR_DROP_STATS_REQ_OBJECT,
65 : VR_PKT_DROP_LOG_OBJECT,
66 : VR_PKT_DROP_LOG_REQ_OBJECT,
67 : VR_FLOW_QUEUE_OBJECT,
68 : VR_FLOW_REQ_OBJECT,
69 : VR_FLOW_REQ_PATH_OBJECT,
70 : VR_FLOW_HOLD_STAT_OBJECT,
71 : VR_FLOW_LINK_LOCAL_OBJECT,
72 : VR_FLOW_METADATA_OBJECT,
73 : VR_FLOW_DEFER_DATA_OBJECT,
74 : VR_FLOW_TABLE_DATA_OBJECT,
75 : VR_FLOW_TABLE_INFO_OBJECT,
76 : VR_FRAGMENT_OBJECT,
77 : VR_FRAGMENT_QUEUE_OBJECT,
78 : VR_FRAGMENT_QUEUE_ELEMENT_OBJECT,
79 : VR_FRAGMENT_SCANNER_OBJECT,
80 : VR_HPACKET_POOL_OBJECT,
81 : VR_HTABLE_OBJECT,
82 : VR_INTERFACE_OBJECT,
83 : VR_INTERFACE_BRIDGE_LOCK_OBJECT,
84 : VR_INTERFACE_FAT_FLOW_CONFIG_OBJECT,
85 : VR_INTERFACE_MAC_OBJECT,
86 : VR_INTERFACE_MIRROR_META_OBJECT,
87 : VR_INTERFACE_REQ_OBJECT,
88 : VR_INTERFACE_REQ_BRIDGE_ID_OBJECT,
89 : VR_INTERFACE_REQ_MAC_OBJECT,
90 : VR_INTERFACE_REQ_MIRROR_META_OBJECT,
91 : VR_INTERFACE_REQ_NAME_OBJECT,
92 : VR_INTERFACE_REQ_PBB_MAC_OBJECT,
93 : VR_INTERFACE_REQ_TO_LCORE_ERRORS_OBJECT,
94 : VR_INTERFACE_STATS_OBJECT,
95 : VR_INTERFACE_TABLE_OBJECT,
96 : VR_INTERFACE_TO_LCORE_ERRORS_OBJECT,
97 : VR_INTERFACE_VRF_TABLE_OBJECT,
98 : VR_INTERFACE_QUEUE_OBJECT,
99 : VR_INTERFACE_BOND_OBJECT,
100 : VR_ITABLE_OBJECT,
101 : VR_LOG_TYPES_OBJECT,
102 : VR_MALLOC_OBJECT,
103 : VR_MESSAGE_OBJECT,
104 : VR_MESSAGE_RESPONSE_OBJECT,
105 : VR_MESSAGE_DUMP_OBJECT,
106 : VR_MEM_OBJECT,
107 : VR_MEM_STATS_REQ_OBJECT,
108 : VR_MIRROR_OBJECT,
109 : VR_MIRROR_TABLE_OBJECT,
110 : VR_MIRROR_META_OBJECT,
111 : VR_MTRIE_OBJECT,
112 : VR_MTRIE_BUCKET_OBJECT,
113 : VR_MTRIE_STATS_OBJECT,
114 : VR_MTRIE_TABLE_OBJECT,
115 : VR_NETWORK_ADDRESS_OBJECT,
116 : VR_NEXTHOP_OBJECT,
117 : VR_NEXTHOP_COMPONENT_OBJECT,
118 : VR_NEXTHOP_REQ_BMAC_OBJECT,
119 : VR_NEXTHOP_REQ_LIST_OBJECT,
120 : VR_NEXTHOP_REQ_ENCAP_OBJECT,
121 : VR_NEXTHOP_REQ_OBJECT,
122 : VR_ROUTE_TABLE_OBJECT,
123 : VR_ROUTE_REQ_MAC_OBJECT,
124 : VR_TIMER_OBJECT,
125 : VR_USOCK_OBJECT,
126 : VR_USOCK_POLL_OBJECT,
127 : VR_USOCK_BUF_OBJECT,
128 : VR_USOCK_IOVEC_OBJECT,
129 : VR_VROUTER_REQ_OBJECT,
130 : VR_BITMAP_OBJECT,
131 : VR_QOS_MAP_OBJECT,
132 : VR_FC_OBJECT,
133 : VR_INTERFACE_FAT_FLOW_IPV4_EXCLUDE_LIST_OBJECT,
134 : VR_INTERFACE_FAT_FLOW_IPV6_EXCLUDE_LIST_OBJECT,
135 : VR_VRF_TABLE_ENTRY_OBJECT,
136 : VR_VRF_TABLE_OBJECT,
137 : VR_INFO_REQ_OBJECT,
138 : VR_VROUTER_MAX_OBJECT,
139 : };
140 :
141 : extern int vr_perfr;
142 : extern int vr_mudp;
143 : extern int vr_perfs;
144 : extern int vr_perfp;
145 : extern int vr_perfr1, vr_perfr2, vr_perfr3;
146 : extern int vr_perfq1, vr_perfq2, vr_perfq3;
147 : extern int vr_from_vm_mss_adj;
148 : extern int vr_to_vm_mss_adj;
149 : extern int vr_udp_coff;
150 : extern unsigned int vr_flow_hold_limit;
151 : extern int vr_use_linux_br;
152 : extern int hashrnd_inited;
153 : extern uint32_t vr_hashrnd;
154 : extern unsigned int vr_priority_tagging;
155 :
156 : #define CONTAINER_OF(member, struct_type, pointer) \
157 : ((struct_type *)((uintptr_t)pointer - \
158 : (uintptr_t)&(((struct_type *)0)->member)))
159 :
160 :
161 : typedef void(*vr_defer_cb)(struct vrouter *router, void *user_data);
162 :
163 : struct vr_ip;
164 :
165 : struct vr_timer {
166 : void (*vt_timer)(void *);
167 : void *vt_vr_arg;
168 : #if (defined(__linux__) && defined(__KERNEL__))
169 : struct timer_list timer;
170 : #else
171 : void *vt_os_arg;
172 : #endif
173 : unsigned int vt_stop_timer;
174 : unsigned int vt_msecs;
175 : };
176 :
177 : struct host_os {
178 : int (*hos_printf)(const char *, ...) __attribute__format__(printf, 1, 2);
179 : void *(*hos_malloc)(unsigned int, unsigned int);
180 : void *(*hos_zalloc)(unsigned int, unsigned int);
181 : void (*hos_free)(void *, unsigned int);
182 : uint64_t (*hos_vtop)(void *);
183 : void *(*hos_page_alloc)(unsigned int);
184 : void (*hos_page_free)(void *, unsigned int);
185 :
186 : struct vr_packet *(*hos_palloc)(unsigned int);
187 : struct vr_packet *(*hos_palloc_head)(struct vr_packet *, unsigned int);
188 : struct vr_packet *(*hos_pexpand_head)(struct vr_packet *, unsigned int);
189 : void (*hos_pfree)(struct vr_packet *, unsigned short);
190 : struct vr_packet *(*hos_pclone)(struct vr_packet *);
191 : void (*hos_preset)(struct vr_packet *);
192 : int (*hos_pcopy)(unsigned char *, struct vr_packet *, unsigned int,
193 : unsigned int);
194 : unsigned short (*hos_pfrag_len)(struct vr_packet *);
195 : unsigned short (*hos_phead_len)(struct vr_packet *);
196 : void (*hos_pset_data)(struct vr_packet *, unsigned short);
197 : unsigned int (*hos_pgso_size)(struct vr_packet *);
198 :
199 : unsigned int (*hos_get_cpu)(void);
200 : int (*hos_schedule_work)(unsigned int, void (*)(void *), void *);
201 : void (*hos_delay_op)(void);
202 : void (*hos_defer)(struct vrouter *, vr_defer_cb, void *);
203 : void *(*hos_get_defer_data)(unsigned int);
204 : void (*hos_put_defer_data)(void *);
205 : void (*hos_get_time)(uint64_t *, uint64_t *);
206 : void (*hos_get_mono_time)(uint64_t *, uint64_t *);
207 : int (*hos_create_timer)(struct vr_timer *);
208 : int (*hos_restart_timer)(struct vr_timer *);
209 : void (*hos_delete_timer)(struct vr_timer *);
210 :
211 : void *(*hos_network_header)(struct vr_packet *);
212 : void *(*hos_inner_network_header)(struct vr_packet *);
213 : void *(*hos_data_at_offset)(struct vr_packet *, unsigned short);
214 : void *(*hos_pheader_pointer)(struct vr_packet *, unsigned short,
215 : void *);
216 : int (*hos_pull_inner_headers)(struct vr_packet *,
217 : unsigned short, unsigned short *,
218 : int (*is_label_l2)(unsigned int,
219 : unsigned int, unsigned short *));
220 : int (*hos_pcow)(struct vr_packet **, unsigned short);
221 : uint16_t (*hos_get_udp_src_port)(struct vr_packet *,
222 : struct vr_forwarding_md *,
223 : unsigned short);
224 : int (*hos_pkt_from_vm_tcp_mss_adj)(struct vr_packet *, uint16_t);
225 : int (*hos_pull_inner_headers_fast)(struct vr_packet *,
226 : unsigned char, int
227 : (*is_label_l2)(unsigned int,
228 : unsigned int, unsigned short *),
229 : int *, int *);
230 : int (*hos_pkt_may_pull)(struct vr_packet *, unsigned int);
231 : int (*hos_gro_process)(struct vr_packet *, struct vr_interface *, bool);
232 : void (*hos_add_mpls)(struct vrouter *, unsigned);
233 : void (*hos_del_mpls)(struct vrouter *, unsigned);
234 : int (*hos_enqueue_to_assembler)(struct vrouter *, struct vr_packet *,
235 : struct vr_forwarding_md *);
236 : void (*hos_fragment_sync_assemble)(struct vr_fragment_queue_element *);
237 : void (*hos_set_log_level)(unsigned int vr_log_level);
238 : void (*hos_set_log_type)(unsigned int vr_log_type, int enable);
239 : unsigned int (*hos_get_log_level)(void);
240 : unsigned int *(*hos_get_enabled_log_types)(int *);
241 : void (*hos_soft_reset)(struct vrouter *);
242 : int (*hos_is_frag_limit_exceeded)(void);
243 : void (*hos_register_nic)(struct vr_interface* vif, vr_interface_req* vifr);
244 : bool hos_nl_broadcast_supported;
245 : int (*hos_huge_page_config)(uint64_t *, int, int *, int, int *, int, int8_t *, uint32_t *);
246 : void *(*hos_huge_page_mem_get)(int, unsigned char **);
247 : int (*hos_offload_flow_create)(struct vr_offload_flow *oflow);
248 : int (*hos_offload_flow_destroy)(struct vr_offload_flow *oflow);
249 : void (*hos_offload_prepare)(struct vr_packet *pkt, struct vr_forwarding_md *fmd);
250 : void (*hos_set_dump_packets)(int);
251 : int (*hos_get_dump_packets)(void);
252 : void (*hos_flow_bucket_lock)(struct vr_flow_entry *);
253 : void (*hos_flow_bucket_unlock)(struct vr_flow_entry *);
254 : /* Register vr_info callback functions. */
255 : FOREACH_VR_INFO_CB_DECLARATION();
256 : };
257 :
258 : #define VR_INFO_DECLARATION_COMMON(MSG, CB, PLTFRM) \
259 : int vr_##CB(VR_INFO_ARGS);
260 :
261 : #define FOREACH_VR_INFO_DECLARATION_COMMON() \
262 : VR_INFO_REG(VR_INFO_DECLARATION_COMMON)
263 :
264 : /* Below macro would be expanded for declaring the kernel callback function
265 : * used for vr_info */
266 : FOREACH_VR_INFO_DECLARATION_COMMON()
267 :
268 : #define vr_printf vrouter_host->hos_printf
269 : #define vr_malloc vrouter_host->hos_malloc
270 : #define vr_zalloc vrouter_host->hos_zalloc
271 : #define vr_free vrouter_host->hos_free
272 : #define vr_vtop vrouter_host->hos_vtop
273 : #define vr_page_alloc vrouter_host->hos_page_alloc
274 : #define vr_page_free vrouter_host->hos_page_free
275 : #define vr_palloc vrouter_host->hos_palloc
276 : #define vr_palloc_head vrouter_host->hos_palloc_head
277 : #define vr_pexpand_head vrouter_host->hos_pexpand_head
278 : #define vr_pfree vrouter_host->hos_pfree
279 : #define vr_pclone vrouter_host->hos_pclone
280 : #define vr_preset vrouter_host->hos_preset
281 : #define vr_pcopy vrouter_host->hos_pcopy
282 : #define vr_pfrag_len vrouter_host->hos_pfrag_len
283 : #define vr_phead_len vrouter_host->hos_phead_len
284 : #define vr_pgso_size vrouter_host->hos_pgso_size
285 : #define vr_pset_data vrouter_host->hos_pset_data
286 : #define vr_get_cpu vrouter_host->hos_get_cpu
287 : #define vr_schedule_work vrouter_host->hos_schedule_work
288 : #define vr_delay_op vrouter_host->hos_delay_op
289 : #define vr_defer vrouter_host->hos_defer
290 : #define vr_get_defer_data vrouter_host->hos_get_defer_data
291 : #define vr_put_defer_data vrouter_host->hos_put_defer_data
292 : #define vr_get_time vrouter_host->hos_get_time
293 : #define vr_get_mono_time vrouter_host->hos_get_mono_time
294 : #define vr_create_timer vrouter_host->hos_create_timer
295 : #define vr_restart_timer vrouter_host->hos_restart_timer
296 : #define vr_delete_timer vrouter_host->hos_delete_timer
297 : #define vr_network_header vrouter_host->hos_network_header
298 : #define vr_inner_network_header vrouter_host->hos_inner_network_header
299 : #define vr_data_at_offset vrouter_host->hos_data_at_offset
300 : #define vr_pheader_pointer vrouter_host->hos_pheader_pointer
301 : #define vr_pull_inner_headers vrouter_host->hos_pull_inner_headers
302 : #define vr_pcow vrouter_host->hos_pcow
303 : #define vr_pull_inner_headers_fast vrouter_host->hos_pull_inner_headers_fast
304 : #define vr_get_udp_src_port vrouter_host->hos_get_udp_src_port
305 : #define vr_pkt_from_vm_tcp_mss_adj vrouter_host->hos_pkt_from_vm_tcp_mss_adj
306 : #define vr_pkt_may_pull vrouter_host->hos_pkt_may_pull
307 : #define vr_gro_process vrouter_host->hos_gro_process
308 : #define vr_enqueue_to_assembler vrouter_host->hos_enqueue_to_assembler
309 : #define vr_fragment_sync_assemble vrouter_host->hos_fragment_sync_assemble
310 : #define vr_set_log_level vrouter_host->hos_set_log_level
311 : #define vr_set_log_type vrouter_host->hos_set_log_type
312 : #define vr_get_log_level vrouter_host->hos_get_log_level
313 : #define vr_get_enabled_log_types vrouter_host->hos_get_enabled_log_types
314 : #define vr_soft_reset vrouter_host->hos_soft_reset
315 : #define vr_register_nic vrouter_host->hos_register_nic
316 : #define vr_nl_broadcast_supported vrouter_host->hos_nl_broadcast_supported
317 : #define vr_huge_page_config vrouter_host->hos_huge_page_config
318 : #define vr_huge_page_mem_get vrouter_host->hos_huge_page_mem_get
319 : #define vr_offload_flow_destroy vrouter_host->hos_offload_flow_destroy
320 : #define vr_offload_flow_create vrouter_host->hos_offload_flow_create
321 : #define vr_offload_prepare vrouter_host->hos_offload_prepare
322 : #define vr_set_dump_packets vrouter_host->hos_set_dump_packets
323 : #define vr_get_dump_packets vrouter_host->hos_get_dump_packets
324 : #define vr_flow_bucket_lock vrouter_host->hos_flow_bucket_lock
325 : #define vr_flow_bucket_unlock vrouter_host->hos_flow_bucket_unlock
326 :
327 : extern struct host_os *vrouter_host;
328 :
329 : struct vr_malloc_stats {
330 : int64_t ms_size;
331 : int64_t ms_alloc;
332 : int64_t ms_free;
333 : };
334 :
335 : #define VMM_STATE_ALLOCED 1
336 :
337 : extern unsigned int vr_memory_alloc_checks;
338 :
339 : __attribute__packed__open__
340 : struct vr_malloc_md {
341 : char vmm_magic[3];
342 : uint8_t vmm_state;
343 : unsigned int vmm_object;
344 : } __attribute__packed__close__;
345 :
346 : static inline void
347 0 : vr_malloc_md_set(void *mem, unsigned int object)
348 : {
349 : struct vr_malloc_md *vmm;
350 :
351 0 : vmm = (struct vr_malloc_md *)mem;
352 0 : memcpy(vmm->vmm_magic, "MEM", sizeof(vmm->vmm_magic));
353 0 : vmm->vmm_state = VMM_STATE_ALLOCED;
354 0 : vmm->vmm_object = object;
355 :
356 0 : return;
357 : }
358 :
359 : static inline void
360 0 : vr_malloc_md_check(void *mem, unsigned int object)
361 : {
362 : struct vr_malloc_md *vmm;
363 :
364 0 : vmm = (struct vr_malloc_md *)((uint8_t *)mem - sizeof(*vmm));
365 0 : if (vmm->vmm_state != VMM_STATE_ALLOCED)
366 0 : goto bug;
367 0 : if (strncmp(vmm->vmm_magic, "MEM", sizeof(vmm->vmm_magic)))
368 0 : goto bug;
369 0 : if (vmm->vmm_object != object)
370 0 : goto bug;
371 :
372 0 : memset(vmm, 0, sizeof(*vmm));
373 :
374 0 : return;
375 0 : bug:
376 0 : vr_printf("vrouter BUG: Inconsistent state of memory %p\n", mem);
377 0 : vr_printf("vrouter BUG: state %u object %u expected %u\n",
378 0 : vmm->vmm_state, vmm->vmm_object, object);
379 0 : vr_printf("vrouter BUG: MAGIC %c%c%c\n",
380 0 : vmm->vmm_magic[0], vmm->vmm_magic[1], vmm->vmm_magic[2]);
381 0 : memset(vmm, 0, sizeof(*vmm));
382 0 : return;
383 : }
384 :
385 : struct vrouter {
386 : unsigned char vr_vrrp_mac[VR_ETHER_ALEN];
387 : unsigned char vr_mac[VR_ETHER_ALEN];
388 : unsigned int vr_ip;
389 :
390 : struct vr_interface **vr_interfaces;
391 : /* Generation number is incrementing every time it is used. */
392 : unsigned int vr_generation_num;
393 : unsigned int vr_max_interfaces;
394 :
395 : unsigned int vr_max_nexthops;
396 : struct vr_btable *vr_nexthops;
397 : struct vr_rtable *vr_inet_rtable;
398 : struct vr_rtable *vr_inet_mcast_rtable;
399 : struct vr_rtable *vr_bridge_table;
400 :
401 : vr_htable_t vr_flow_table;
402 : struct vr_flow_table_info *vr_flow_table_info;
403 : unsigned int vr_flow_table_info_size;
404 :
405 : unsigned int vr_max_labels;
406 : struct vr_btable *vr_ilm;
407 :
408 : unsigned int vr_max_vrfs;
409 : unsigned int vr_max_mirror_indices;
410 : struct vr_mirror_entry **vr_mirrors;
411 : struct vr_vrf_table_entry **vr_vrf_table;
412 : vr_itable_t vr_vxlan_table;
413 :
414 : vr_htable_t vr_fragment_table;
415 : struct vr_timer *vr_fragment_table_scanner;
416 :
417 : uint64_t **vr_pdrop_stats;
418 : struct vr_malloc_stats **vr_malloc_stats;
419 :
420 : uint16_t vr_link_local_ports_size;
421 : unsigned char *vr_link_local_ports;
422 :
423 : struct vr_forwarding_class **vr_qos_map;
424 : struct vr_forwarding_class *vr_fc_table;
425 :
426 : struct vr_interface *vr_agent_if;
427 : struct vr_interface *vr_host_if;
428 : struct vr_interface *vr_eth_if[VR_MAX_PHY_INF];
429 : struct vr_pkt_drop_st *vr_pkt_drop;
430 : unsigned char vr_num_phy_interfaces:2;
431 : unsigned char vr_l3mh_intf_bitpos:3;
432 : unsigned char unused:3;
433 : };
434 :
435 : static inline int
436 403 : is_vrouter_multihomed (struct vrouter *router)
437 : {
438 403 : if (router->vr_num_phy_interfaces > 1) {
439 70 : return 1;
440 : }
441 333 : return 0;
442 : }
443 :
444 : struct vr_defer_data {
445 : void *vdd_data;
446 : };
447 :
448 : extern volatile bool vr_not_ready;
449 :
450 : extern struct vrouter *vrouter_get(unsigned int);
451 : extern unsigned int vrouter_generation_num_get(struct vrouter *router);
452 :
453 : extern int vrouter_init(void);
454 : extern void vrouter_exit(bool);
455 : extern int vr_module_error(int, const char *, int, int);
456 : extern int vhost_init(void);
457 :
458 : extern bool vr_is_ipv6_underlay_enabled(void);
459 : extern void vr_set_ipv6_underlay_enabled(void);
460 : extern bool vr_force_ipv6_underlay_enabled;
461 :
462 : #ifdef __cplusplus
463 : }
464 : #endif
465 :
466 : #endif /* __VROUTER_H__ */
|