summaryrefslogtreecommitdiff
path: root/vrrpd/vrrp_packet.h
diff options
context:
space:
mode:
authorQuentin Young <qlyoung@cumulusnetworks.com>2018-12-07 23:36:09 +0000
committerQuentin Young <qlyoung@cumulusnetworks.com>2019-05-17 00:27:08 +0000
commit3eca38577afdd262e72740f16e0b1a6057d0aed6 (patch)
treea491a53717d07415459b53deb603b046ef66176b /vrrpd/vrrp_packet.h
parentef4cc1ebfffaf74c303fd1b5c96d739f08766751 (diff)
vrrpd: fix packet encode
* Properly encode VRRP packets * Calculate checksum appropriately * Update signature to provide caller both packet and result length Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
Diffstat (limited to 'vrrpd/vrrp_packet.h')
-rw-r--r--vrrpd/vrrp_packet.h46
1 files changed, 38 insertions, 8 deletions
diff --git a/vrrpd/vrrp_packet.h b/vrrpd/vrrp_packet.h
index 5ff08f95fe..245fada064 100644
--- a/vrrpd/vrrp_packet.h
+++ b/vrrpd/vrrp_packet.h
@@ -30,8 +30,12 @@
* Shared header for VRRPv2/v3 packets.
*/
struct vrrp_hdr {
- uint8_t version : 4;
- uint8_t type : 4;
+ /*
+ * H L H L
+ * 0000 0000
+ * ver type
+ */
+ uint8_t vertype;
uint8_t vrid;
uint8_t priority;
uint8_t naddr;
@@ -42,9 +46,13 @@ struct vrrp_hdr {
uint8_t adver_int;
} v2;
struct {
- /* advertisement interval (in centiseconds) */
- uint16_t rsvd : 4;
- uint16_t adver_int : 12;
+ /*
+ * advertisement interval (in centiseconds)
+ * H L H L
+ * 0000 000000000000
+ * rsvd adver_int
+ */
+ uint16_t adver_int;
} v3;
};
uint16_t chksum;
@@ -60,7 +68,29 @@ struct vrrp_pkt {
/*
* Builds a VRRP packet.
+ *
+ * pkt
+ * Pointer to store pointer to result buffer in
+ *
+ * vrid
+ * Virtual Router Identifier
+ *
+ * prio
+ * Virtual Router Priority
+ *
+ * max_adver_int
+ * time between ADVERTISEMENTs
+ *
+ * v6
+ * whether 'ips' is an array of v4 or v6 addresses
+ *
+ * numip
+ * number of IPvX addresses in 'ips'
+ *
+ * ips
+ * array of pointer to either struct in_addr (v6 = false) or struct in6_addr
+ * (v6 = true)
*/
-struct vrrp_pkt *vrrp_pkt_build(uint8_t vrid, uint8_t prio,
- uint16_t max_adver_int, bool v6, uint8_t numip,
- void **ips);
+ssize_t vrrp_pkt_build(struct vrrp_pkt **pkt, uint8_t vrid, uint8_t prio,
+ uint16_t max_adver_int, bool v6, uint8_t numip,
+ void **ips);