FD.io VPP  v21.01
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 void vrrp_vr_event (vrrp_vr_t * vr, vrrp_vr_state_t new_state);
211 
212 
213 always_inline void
215 {
216  vrrp_vr_config_t *vrc = &vr->config;
217  vrrp_vr_runtime_t *vrt = &vr->runtime;
218 
219  vrt->skew = (((256 - vrc->priority) * vrt->master_adv_int) / 256);
220 }
221 
222 always_inline void
224 {
225  vrrp_vr_runtime_t *vrt = &vr->runtime;
226 
227  vrt->master_down_int = (3 * vrt->master_adv_int) + vrt->skew;
228 }
229 
232 {
233  vrrp_main_t *vmp = &vrrp_main;
235  uword *p;
236 
237  clib_memset (&key, 0, sizeof (key));
238 
239  key.sw_if_index = sw_if_index;
240  key.vr_id = vr_id;
241  key.is_ipv6 = (is_ipv6 != 0);
242 
243  p = mhash_get (&vmp->vr_index_by_key, &key);
244  if (p)
245  return pool_elt_at_index (vmp->vrs, p[0]);
246 
247  return 0;
248 }
249 
252 {
253  vrrp_main_t *vmp = &vrrp_main;
254 
255  if (pool_is_free_index (vmp->vrs, vr_index))
256  return 0;
257 
258  return pool_elt_at_index (vmp->vrs, vr_index);
259 }
260 
263 {
264  vrrp_main_t *vmp = &vrrp_main;
265  uword *p;
266  vrrp4_arp_key_t key4;
267  vrrp6_nd_key_t key6;
268 
269  if (is_ipv6)
270  {
271  key6.sw_if_index = sw_if_index;
272  key6.addr = ((ip6_address_t *) addr)[0];
273  p = hash_get_mem (vmp->vrrp6_nd_lookup, &key6);
274  }
275  else
276  {
277  key4.sw_if_index = sw_if_index;
278  key4.addr = ((ip4_address_t *) addr)[0];
279  p = hash_get (vmp->vrrp4_arp_lookup, key4.as_u64);
280  }
281 
282  if (p)
283  return p[0];
284 
285  return ~0;
286 }
287 
290 {
291  vrrp_main_t *vrm = &vrrp_main;
292 
293  if (sw_if_index == ~0)
294  return NULL;
295 
296  vec_validate (vrm->vrrp_intfs, sw_if_index);
297  return vec_elt_at_index (vrm->vrrp_intfs, sw_if_index);
298 }
299 
300 always_inline int
302 {
303  vrrp_intf_t *intf = vrrp_intf_get (sw_if_index);
304 
305  if (intf)
306  return vec_len (intf->vr_indices[is_ipv6]);
307 
308  return 0;
309 }
310 
313 {
314  return ((vr->config.flags & VRRP_VR_IPV6) != 0);
315 }
316 
319 {
320  return ((vr->config.flags & VRRP_VR_UNICAST) != 0);
321 }
322 
325 {
326  return (vr->config.priority == 255);
327 }
328 
331 {
332  return vec_len (vr->config.vr_addrs);
333 }
334 
337 {
338  return vec_len (vr->config.peer_addrs);
339 }
340 
343 {
344  return ((vr->config.flags & VRRP_VR_ACCEPT) != 0);
345 }
346 
349 {
350  vrrp_main_t *vmp = &vrrp_main;
351 
352  return vr - vmp->vrs;
353 }
354 
357 {
358  u8 rv;
359 
360  if (vr->tracking.interfaces_dec < (u32) vr->config.priority)
361  rv = vr->config.priority - vr->tracking.interfaces_dec;
362  else
363  rv = 1;
364 
365  return rv;
366 }
367 
368 #endif /* __included_vrrp_h__ */
369 
370 /*
371  * fd.io coding-style-patch-verification: ON
372  *
373  * Local Variables:
374  * eval: (c-set-style "gnu")
375  * End:
376  */
#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:318
u32 sw_if_index
Definition: vrrp.h:71
static u32 vrrp_vr_index(vrrp_vr_t *vr)
Definition: vrrp.h:348
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:1578
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:251
u8 data[128]
Definition: ipsec_types.api:90
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:710
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:324
int vrrp_vr_tracking_ifs_add_del(vrrp_vr_t *vr, vrrp_vr_tracking_if_t *track_ifs, u8 is_add)
Definition: vrrp.c:998
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:342
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:546
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:223
static u8 vrrp_vr_n_vr_addrs(vrrp_vr_t *vr)
Definition: vrrp.h:330
static u8 vrrp_vr_is_ipv6(vrrp_vr_t *vr)
Definition: vrrp.h:312
vrrp_main_t vrrp_main
Definition: vrrp.c:25
u8 len
Definition: ip_types.api:103
int vrrp_vr_multicast_group_join(vrrp_vr_t *vr)
Definition: vrrp_packet.c:681
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:298
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:356
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:955
int vrrp_vr_add_del(u8 is_add, vrrp_vr_config_t *conf)
Definition: vrrp.c:622
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:803
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:86
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:289
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:301
clib_error_t * vrrp_plugin_api_hookup(vlib_main_t *vm)
Definition: vrrp_api.c:528
static vrrp_vr_t * vrrp_vr_lookup(u32 sw_if_index, u8 vr_id, u8 is_ipv6)
Definition: vrrp.h:231
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:214
static u8 vrrp_vr_n_peer_addrs(vrrp_vr_t *vr)
Definition: vrrp.h:336
void vrrp_vr_event(vrrp_vr_t *vr, vrrp_vr_state_t new_state)
Definition: vrrp_api.c:507
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:262
vrrp_vr_flags
Definition: vrrp.api:21