summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQuentin Young <qlyoung@cumulusnetworks.com>2018-12-06 22:51:55 +0000
committerQuentin Young <qlyoung@cumulusnetworks.com>2019-05-17 00:27:08 +0000
commitef4cc1ebfffaf74c303fd1b5c96d739f08766751 (patch)
treea76d4f978f34c996ecb912941e1e7696ab367b1b
parent4440e3cdf7860a036836216ffa80a6ef82096901 (diff)
vrrpd: merge keepalived packet header
Pick up some smartness from keepalived. Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
-rw-r--r--vrrpd/vrrp_packet.c14
-rw-r--r--vrrpd/vrrp_packet.h27
2 files changed, 29 insertions, 12 deletions
diff --git a/vrrpd/vrrp_packet.c b/vrrpd/vrrp_packet.c
index 4cbcd771f2..a5eb40fda8 100644
--- a/vrrpd/vrrp_packet.c
+++ b/vrrpd/vrrp_packet.c
@@ -35,16 +35,16 @@ struct vrrp_pkt *vrrp_pkt_build(uint8_t vrid, uint8_t prio,
struct vrrp_pkt *pkt =
XCALLOC(MTYPE_TMP, sizeof(struct vrrp_pkt) + addrsz * numip);
- pkt->version = VRRP_VERSION;
- pkt->type = VRRP_TYPE_ADVERTISEMENT;
- pkt->vrid = vrid;
- pkt->priority = prio;
- pkt->rsvd = 0;
- pkt->max_adver_int = max_adver_int;
+ pkt->hdr.version = VRRP_VERSION;
+ pkt->hdr.type = VRRP_TYPE_ADVERTISEMENT;
+ pkt->hdr.vrid = vrid;
+ pkt->hdr.priority = prio;
+ pkt->hdr.v3.rsvd = 0;
+ pkt->hdr.v3.adver_int = max_adver_int;
for (uint8_t i = 0; i < numip; i++)
memcpy(&pkt->addrs[i].v4, ips[i], addrsz);
/* FIXME */
- pkt->cksum = 0;
+ pkt->hdr.chksum = 0;
return pkt;
}
diff --git a/vrrpd/vrrp_packet.h b/vrrpd/vrrp_packet.h
index 04116c6245..5ff08f95fe 100644
--- a/vrrpd/vrrp_packet.h
+++ b/vrrpd/vrrp_packet.h
@@ -26,15 +26,32 @@
#define VRRP_VERSION 3
#define VRRP_TYPE_ADVERTISEMENT 1
-struct vrrp_pkt {
+/*
+ * Shared header for VRRPv2/v3 packets.
+ */
+struct vrrp_hdr {
uint8_t version : 4;
uint8_t type : 4;
uint8_t vrid;
uint8_t priority;
- uint8_t num_ip;
- uint16_t rsvd : 4;
- uint16_t max_adver_int : 12;
- uint16_t cksum;
+ uint8_t naddr;
+ union {
+ struct {
+ uint8_t auth_type;
+ /* advertisement interval (in sec) */
+ uint8_t adver_int;
+ } v2;
+ struct {
+ /* advertisement interval (in centiseconds) */
+ uint16_t rsvd : 4;
+ uint16_t adver_int : 12;
+ } v3;
+ };
+ uint16_t chksum;
+};
+
+struct vrrp_pkt {
+ struct vrrp_hdr hdr;
union {
struct in_addr v4;
struct in6_addr v6;