vrrp: add plugin providing vrrp support
[vpp.git] / src / plugins / vrrp / vrrp_packet.h
1
2 /*
3  * vrrp_packet.h - vrrp protocol/packet definitions
4  *
5  * Copyright 2019-2020 Rubicon Communications, LLC (Netgate)
6  *
7  * SPDX-License-Identifier: Apache-2.0
8  *
9  */
10 #ifndef __included_vrrp_packet_h__
11 #define __included_vrrp_packet_h__
12
13 #include <vnet/vnet.h>
14
15 typedef CLIB_PACKED (struct
16                      {
17                      /* 4 bits for version (always 2 or 3), 4 bits for type (always 1) */
18                      u8 vrrp_version_and_type;
19                      /* VR ID */
20                      u8 vr_id;
21                      /* priority of sender on this VR. value of 0 means a master is abdicating */
22                      u8 priority;
23                      /* count of addresses being backed up by the VR */
24                      u8 n_addrs;
25                      /* max advertisement interval - first 4 bits are reserved and must be 0 */
26                      u16 rsvd_and_max_adv_int;
27                      /* checksum */
28                      u16 checksum;
29                      }) vrrp_header_t;
30
31 typedef CLIB_PACKED (struct
32                      {
33                      ip4_header_t ip4; vrrp_header_t vrrp;
34                      }) ip4_and_vrrp_header_t;
35
36 typedef CLIB_PACKED (struct
37                      {
38                      ip6_header_t ip6; vrrp_header_t vrrp;
39                      }) ip6_and_vrrp_header_t;
40
41 /* the high 4 bits of the advertisement interval are "reserved" and
42  * should be ignored on reception. swap byte order and mask out those bits.
43  */
44 always_inline u16
45 vrrp_adv_int_from_packet (vrrp_header_t * pkt)
46 {
47   return clib_net_to_host_u16 (pkt->rsvd_and_max_adv_int) & ((u16) 0x0fff);
48 }
49
50 #endif /* __included_vrrp_packet_h__ */
51
52 /*
53  * fd.io coding-style-patch-verification: ON
54  *
55  * Local Variables:
56  * eval: (c-set-style "gnu")
57  * End:
58  */