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;
}
#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;