FD.io VPP  v20.09-64-g4f7b92f0a
Vector Packet Processing
vrrp.h
Go to the documentation of this file.
1 
2 /*
3  * vrrp.h - vrrp plug-in header file
4  *
5  * Copyright 2019-2020 Rubicon Communications, LLC (Netgate)
6  *
7  * SPDX-License-Identifier: Apache-2.0
8  *
9  */
10 #ifndef __included_vrrp_h__
11 #define __included_vrrp_h__
12 
13 #include <vnet/vnet.h>
14 #include <vnet/ip/ip.h>
15 #include <vnet/ethernet/ethernet.h>
16 
17 #include <vppinfra/hash.h>
18 #include <vppinfra/error.h>
19 
20 /* VRRP configuration */
21 typedef enum vrrp_vr_flags
22 {
26  VRRP_VR_IPV6 = 0x8,
28 
29 typedef struct vrrp_vr_key
30 {
35 
36 /* *INDENT-OFF* */
37 typedef CLIB_PACKED
38 (struct vrrp4_arp_key {
39  union {
40  struct {
43  };
44  u64 as_u64;
45  };
46 }) vrrp4_arp_key_t;
47 /* *INDENT-ON* */
48 
49 /* *INDENT-OFF* */
50 typedef CLIB_PACKED
51 (struct vrrp6_nd_key {
53  ip6_address_t addr;
54 }) vrrp6_nd_key_t;
55 /* *INDENT-ON* */
56 
57 typedef struct vrrp_vr_tracking_if
58 {
62 
63 typedef struct vrrp_vr_tracking
64 {
68 
69 typedef struct vrrp_vr_config
70 {
76  ip46_address_t *vr_addrs;
77  ip46_address_t *peer_addrs;
79 
80 #define foreach_vrrp_vr_state \
81 _(0, INIT, "Initialize") \
82 _(1, BACKUP, "Backup") \
83 _(2, MASTER, "Master") \
84 _(3, INTF_DOWN, "Interface Down")
85 
86 /* VRRP runtime data */
87 typedef enum vrrp_vr_state
88 {
89 #define _(v,f,n) VRRP_VR_STATE_##f = v,
91 #undef _
93 
94 typedef struct vrrp_vr_runtime
95 {
96  vrrp_vr_state_t state;
104 
105 /* Per-VR data */
106 typedef struct vrrp_vr
107 {
111 } vrrp_vr_t;
112 
113 /* Timers */
114 typedef enum vrrp_vr_timer_type
115 {
119 
120 typedef struct vrrp_vr_timer
121 {
123  f64 expire_time; /* monotonic, relative to vlib_time_now() */
124  vrrp_vr_timer_type_t type;
126 
127 typedef struct
128 {
129  /* vectors of vr indices which are configured on this interface
130  * 0 -> ipv4, 1 -> ipv6 */
131  u32 *vr_indices[2];
132 
133  /* vector of VR indices which track the state of this interface
134  * 0 -> ipv4, 1*/
135  u32 *tracking_vrs[2];
136 
137  /* multicast adjacency indices. 0 -> ipv4, 1 -> ipv6 */
138  adj_index_t mcast_adj_index[2];
139 
140  /* number of VRs in master state on sw intf. 0 -> ipv4, 1 -> ipv6 */
141  u8 n_master_vrs[2];
142 
143 } vrrp_intf_t;
144 
145 typedef struct
146 {
147  /* API message ID base */
149 
150  /* pool of VRs */
152 
153  /* pool of timers and ordered vector of pool indices */
156 
157  /* number of running VRs - don't register for VRRP proto if not running */
159 
160  /* hash mapping a VR key to a pool entry */
162 
163  /* hashes mapping sw_if_index and address to a vr index */
166 
167  /* vector of interface data indexed by sw_if_index */
169 
170  /* convenience */
174 
176 } vrrp_main_t;
177 
178 extern vrrp_main_t vrrp_main;
179 
182 
183 /* Periodic function events */
184 #define VRRP_EVENT_VR_TIMER_UPDATE 1
185 #define VRRP_EVENT_VR_STOP 2
186 #define VRRP_EVENT_PERIODIC_ENABLE_DISABLE 3
187 
189 
190 int vrrp_vr_add_del (u8 is_add, vrrp_vr_config_t * conf);
191 int vrrp_vr_start_stop (u8 is_start, vrrp_vr_key_t * vr_key);
192 extern u8 *format_vrrp_vr (u8 * s, va_list * args);
193 extern u8 *format_vrrp_vr_key (u8 * s, va_list * args);
194 extern u8 *format_vrrp_vr_state (u8 * s, va_list * args);
195 extern u8 *format_vrrp_packet_hdr (u8 * s, va_list * args);
196 void vrrp_vr_timer_set (vrrp_vr_t * vr, vrrp_vr_timer_type_t type);
197 void vrrp_vr_timer_cancel (vrrp_vr_t * vr);
198 void vrrp_vr_transition (vrrp_vr_t * vr, vrrp_vr_state_t new_state,
199  void *data);
200 int vrrp_vr_set_peers (vrrp_vr_key_t * key, ip46_address_t * peers);
202 int vrrp_adv_send (vrrp_vr_t * vr, int shutdown);
204 u16 vrrp_adv_csum (void *l3_hdr, void *payload, u8 is_ipv6, u16 len);
206  u8 priority, u8 is_add);
208  vrrp_vr_tracking_if_t * track_ifs,
209  u8 is_add);
210 
211 
212 always_inline void
214 {
215  vrrp_vr_config_t *vrc = &vr->config;
216  vrrp_vr_runtime_t *vrt = &vr->runtime;
217 
218  vrt->skew = (((256 - vrc->priority) * vrt->master_adv_int) / 256);
219 }
220 
221 always_inline void
223 {
224  vrrp_vr_runtime_t *vrt = &vr->runtime;
225 
226  vrt->master_down_int = (3 * vrt->master_adv_int) + vrt->skew;
227 }
228 
231 {
232  vrrp_main_t *vmp = &vrrp_main;
234  uword *p;
235 
236  clib_memset (&key, 0, sizeof (key));
237 
238  key.sw_if_index = sw_if_index;
239  key.vr_id = vr_id;
240  key.is_ipv6 = (is_ipv6 != 0);
241 
242  p = mhash_get (&vmp->vr_index_by_key, &key);
243  if (p)
244  return pool_elt_at_index (vmp->vrs, p[0]);
245 
246  return 0;
247 }
248 
251 {
252  vrrp_main_t *vmp = &vrrp_main;
253 
254  if (pool_is_free_index (vmp->vrs, vr_index))
255  return 0;
256 
257  return pool_elt_at_index (vmp->vrs, vr_index);
258 }
259 
262 {
263  vrrp_main_t *vmp = &vrrp_main;
264  uword *p;
265  vrrp4_arp_key_t key4;
266  vrrp6_nd_key_t key6;
267 
268  if (is_ipv6)
269  {
270  key6.sw_if_index = sw_if_index;
271  key6.addr = ((ip6_address_t *) addr)[0];
272  p = hash_get_mem (vmp->vrrp6_nd_lookup, &key6);
273  }
274  else
275  {
276  key4.sw_if_index = sw_if_index;
277  key4.addr = ((ip4_address_t *) addr)[0];
278  p = hash_get (vmp->vrrp4_arp_lookup, key4.as_u64);
279  }
280 
281  if (p)
282  return p[0];
283 
284  return ~0;
285 }
286 
289 {
290  vrrp_main_t *vrm = &vrrp_main;
291 
292  if (sw_if_index == ~0)
293  return NULL;
294 
295  vec_validate (vrm->vrrp_intfs, sw_if_index);
296  return vec_elt_at_index (vrm->vrrp_intfs, sw_if_index);
297 }
298 
299 always_inline int
301 {
302  vrrp_intf_t *intf = vrrp_intf_get (sw_if_index);
303 
304  if (intf)
305  return vec_len (intf->vr_indices[is_ipv6]);
306 
307  return 0;
308 }
309 
312 {
313  return ((vr->config.flags & VRRP_VR_IPV6) != 0);
314 }
315 
318 {
319  return ((vr->config.flags & VRRP_VR_UNICAST) != 0);
320 }
321 
324 {
325  return (vr->config.priority == 255);
326 }
327 
330 {
331  return vec_len (vr->config.vr_addrs);
332 }
333 
336 {
337  return vec_len (vr->config.peer_addrs);
338 }
339 
342 {
343  return ((vr->config.flags & VRRP_VR_ACCEPT) != 0);
344 }
345 
348 {
349  vrrp_main_t *vmp = &vrrp_main;
350 
351  return vr - vmp->vrs;
352 }
353 
356 {
357  u8 rv;
358 
359  if (vr->tracking.interfaces_dec < (u32) vr->config.priority)
360  rv = vr->config.priority - vr->tracking.interfaces_dec;
361  else
362  rv = 1;
363 
364  return rv;
365 }
366 
367 #endif /* __included_vrrp_h__ */
368 
369 /*
370  * fd.io coding-style-patch-verification: ON
371  *
372  * Local Variables:
373  * eval: (c-set-style "gnu")
374  * End:
375  */
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
Definition: vec.h:509
struct vrrp_vr_timer vrrp_vr_timer_t
u32 timer_index
Definition: vrrp.h:102
u8 * format_vrrp_vr_state(u8 *s, va_list *args)
Definition: vrrp_format.c:47
Definition: mhash.h:46
u8 vr_id
Definition: vrrp.h:32
static u8 vrrp_vr_is_unicast(vrrp_vr_t *vr)
Definition: vrrp.h:317
u32 sw_if_index
Definition: vrrp.h:71
static u32 vrrp_vr_index(vrrp_vr_t *vr)
Definition: vrrp.h:347
vlib_node_registration_t vrrp_node
vrrp_vr_tracking_t tracking
Definition: vrrp.h:110
Definition: vrrp.h:106
u64 as_u64
Definition: bihash_doc.h:63
vrrp_vr_timer_t * vr_timers
Definition: vrrp.h:154
unsigned long u64
Definition: types.h:89
void vrrp_vr_transition(vrrp_vr_t *vr, vrrp_vr_state_t new_state, void *data)
Definition: vrrp.c:282
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
struct vrrp_vr_key vrrp_vr_key_t
vlib_node_registration_t vrrp_periodic_node
(constructor) VLIB_REGISTER_NODE (vrrp_periodic_node)
vrrp_vr_t * vrs
Definition: vrrp.h:151
f64 last_sent
Definition: vrrp.h:101
vlib_main_t * vm
Definition: in2out_ed.c:1582
vrrp_vr_state_t state
Definition: vrrp.h:96
vhost_vring_addr_t addr
Definition: vhost_user.h:111
unsigned char u8
Definition: types.h:56
static vrrp_vr_t * vrrp_vr_lookup_index(u32 vr_index)
Definition: vrrp.h:250
u8 data[128]
Definition: ipsec_types.api:89
double f64
Definition: types.h:142
struct vrrp_vr_config vrrp_vr_config_t
uword * vrrp6_nd_lookup
Definition: vrrp.h:165
u16 master_adv_int
Definition: vrrp.h:97
struct vrrp_vr_tracking_if vrrp_vr_tracking_if_t
int vrrp_vr_start_stop(u8 is_start, vrrp_vr_key_t *vr_key)
Definition: vrrp.c:696
u8 * format_vrrp_vr(u8 *s, va_list *args)
Definition: vrrp_format.c:92
#define foreach_vrrp_vr_state
Definition: vrrp.h:80
vrrp_vr_config_t config
Definition: vrrp.h:108
#define vec_elt_at_index(v, i)
Get vector value at index i checking that i is in bounds.
static u8 vrrp_vr_is_owner(vrrp_vr_t *vr)
Definition: vrrp.h:323
int vrrp_vr_tracking_ifs_add_del(vrrp_vr_t *vr, vrrp_vr_tracking_if_t *track_ifs, u8 is_add)
Definition: vrrp.c:984
unsigned int u32
Definition: types.h:88
u16 skew
Definition: vrrp.h:98
u16 master_down_int
Definition: vrrp.h:99
u16 vrrp_adv_csum(void *l3_hdr, void *payload, u8 is_ipv6, u16 len)
Definition: vrrp_packet.c:143
static u8 vrrp_vr_accept_mode_enabled(vrrp_vr_t *vr)
Definition: vrrp.h:341
mac_address_t mac
Definition: vrrp.h:100
i32 priority
Definition: ipsec.api:95
mhash_t vr_index_by_key
Definition: vrrp.h:161
u8 * format_vrrp_packet_hdr(u8 *s, va_list *args)
Definition: vrrp_format.c:124
vl_api_fib_path_type_t type
Definition: fib_types.api:123
u16 n_vrs_started
Definition: vrrp.h:158
#define hash_get(h, key)
Definition: hash.h:249
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
Definition: pool.h:534
u8 * format_vrrp_vr_key(u8 *s, va_list *args)
Definition: vrrp_format.c:65
u8 priority
Definition: vrrp.h:73
u32 sw_if_index
Definition: vrrp.h:31
vrrp_vr_flags_t flags
Definition: vrrp.h:75
unsigned short u16
Definition: types.h:57
int vrrp_garp_or_na_send(vrrp_vr_t *vr)
Definition: vrrp_packet.c:459
u8 vr_id
Definition: vrrp.h:72
#define always_inline
Definition: ipsec.h:28
vrrp_vr_runtime_t runtime
Definition: vrrp.h:109
static void vrrp_vr_master_down_compute(vrrp_vr_t *vr)
Definition: vrrp.h:222
static u8 vrrp_vr_n_vr_addrs(vrrp_vr_t *vr)
Definition: vrrp.h:329
static u8 vrrp_vr_is_ipv6(vrrp_vr_t *vr)
Definition: vrrp.h:311
vrrp_main_t vrrp_main
Definition: vrrp.c:25
u8 len
Definition: ip_types.api:92
int vrrp_vr_multicast_group_join(vrrp_vr_t *vr)
Definition: vrrp_packet.c:682
u8 is_ipv6
Definition: vrrp.h:33
enum vrrp_vr_timer_type vrrp_vr_timer_type_t
#define pool_is_free_index(P, I)
Use free bitmap to query whether given index is free.
Definition: pool.h:299
u32 adj_index_t
An index for adjacencies.
Definition: adj_types.h:30
static u8 vrrp_vr_priority(vrrp_vr_t *vr)
Definition: vrrp.h:355
u32 * vr_indices[2]
Definition: vrrp.h:131
u32 vr_index
Definition: vrrp.h:122
struct vrrp_vr_tracking vrrp_vr_tracking_t
u32 intf_output_node_idx
Definition: vrrp.h:175
static uword * mhash_get(mhash_t *h, const void *key)
Definition: mhash.h:110
int vrrp_vr_tracking_if_add_del(vrrp_vr_t *vr, u32 sw_if_index, u8 priority, u8 is_add)
Definition: vrrp.c:941
int vrrp_vr_add_del(u8 is_add, vrrp_vr_config_t *conf)
Definition: vrrp.c:608
vrrp_intf_t * vrrp_intfs
Definition: vrrp.h:168
int vrrp_adv_send(vrrp_vr_t *vr, int shutdown)
Definition: vrrp_packet.c:272
int vrrp_vr_set_peers(vrrp_vr_key_t *key, ip46_address_t *peers)
Definition: vrrp.c:789
struct vrrp_vr vrrp_vr_t
vrrp_vr_tracking_if_t * interfaces
Definition: vrrp.h:65
void vrrp_vr_timer_set(vrrp_vr_t *vr, vrrp_vr_timer_type_t type)
Definition: vrrp_periodic.c:89
enum vrrp_vr_flags vrrp_vr_flags_t
u16 msg_id_base
Definition: vrrp.h:148
enum vrrp_vr_state vrrp_vr_state_t
typedef key
Definition: ipsec_types.api:85
struct _vlib_node_registration vlib_node_registration_t
ethernet_main_t * ethernet_main
Definition: vrrp.h:173
static vrrp_intf_t * vrrp_intf_get(u32 sw_if_index)
Definition: vrrp.h:288
void vrrp_vr_timer_cancel(vrrp_vr_t *vr)
Definition: vrrp_periodic.c:58
u32 interfaces_dec
Definition: vrrp.h:66
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
vrrp_vr_timer_type
Definition: vrrp.h:114
vrrp_vr_state
Definition: vrrp.api:74
u64 uword
Definition: types.h:112
typedef CLIB_PACKED(struct vrrp4_arp_key { union { struct { u32 sw_if_index;ip4_address_t addr;};u64 as_u64;};}) vrrp4_arp_key_t
static int vrrp_intf_num_vrs(u32 sw_if_index, u8 is_ipv6)
Definition: vrrp.h:300
clib_error_t * vrrp_plugin_api_hookup(vlib_main_t *vm)
Definition: vrrp_api.c:492
static vrrp_vr_t * vrrp_vr_lookup(u32 sw_if_index, u8 vr_id, u8 is_ipv6)
Definition: vrrp.h:230
vnet_main_t * vnet_main
Definition: vrrp.h:172
#define hash_get_mem(h, key)
Definition: hash.h:269
uword * vrrp4_arp_lookup
Definition: vrrp.h:164
ip46_address_t * vr_addrs
Definition: vrrp.h:76
struct vrrp_vr_runtime vrrp_vr_runtime_t
u16 adv_interval
Definition: vrrp.h:74
f64 expire_time
Definition: vrrp.h:123
ip46_address_t * peer_addrs
Definition: vrrp.h:77
vrrp_vr_timer_type_t type
Definition: vrrp.h:124
static void vrrp_vr_skew_compute(vrrp_vr_t *vr)
Definition: vrrp.h:213
static u8 vrrp_vr_n_peer_addrs(vrrp_vr_t *vr)
Definition: vrrp.h:335
u32 * pending_timers
Definition: vrrp.h:155
vlib_main_t * vlib_main
Definition: vrrp.h:171
static u32 vrrp_vr_lookup_address(u32 sw_if_index, u8 is_ipv6, void *addr)
Definition: vrrp.h:261
vrrp_vr_flags
Definition: vrrp.api:21