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