]> git.proxmox.com Git - mirror_frr.git/blobdiff - vrrpd/vrrp_packet.h
Merge pull request #5793 from ton31337/fix/formatting_show_bgp_summary_failed
[mirror_frr.git] / vrrpd / vrrp_packet.h
index 2061b63c6132ba5f64cf5410e102e694f29b0303..082935f080d4628d10e4398df5128ed833883d85 100644 (file)
@@ -28,8 +28,6 @@
 
 #define VRRP_TYPE_ADVERTISEMENT 1
 
-extern const char *vrrp_packet_names[16];
-
 /*
  * Shared header for VRRPv2/v3 packets.
  */
@@ -70,6 +68,10 @@ struct vrrp_pkt {
         * When used, this is actually an array of one or the other, not an
         * array of union. If N v4 addresses are stored then
         * sizeof(addrs) == N * sizeof(struct in_addr).
+        *
+        * Under v2, the last 2 entries in this array are the authentication
+        * data fields. We don't support auth in v2 so these are always just 8
+        * bytes of 0x00.
         */
        union {
                struct in_addr v4;
@@ -77,17 +79,18 @@ struct vrrp_pkt {
        } addrs[];
 } __attribute__((packed));
 
-#define VRRP_PKT_SIZE(_f, _naddr)                                              \
+#define VRRP_PKT_SIZE(_f, _ver, _naddr)                                        \
        ({                                                                     \
                size_t _asz = ((_f) == AF_INET) ? sizeof(struct in_addr)       \
                                                : sizeof(struct in6_addr);     \
-               sizeof(struct vrrp_hdr) + (_asz * (_naddr));                   \
+               size_t _auth = 2 * sizeof(uint32_t) * (3 - (_ver));            \
+               sizeof(struct vrrp_hdr) + (_asz * (_naddr)) + _auth;           \
        })
 
-#define VRRP_MIN_PKT_SIZE_V4 VRRP_PKT_SIZE(AF_INET, 1)
-#define VRRP_MAX_PKT_SIZE_V4 VRRP_PKT_SIZE(AF_INET, 255)
-#define VRRP_MIN_PKT_SIZE_V6 VRRP_PKT_SIZE(AF_INET6, 1)
-#define VRRP_MAX_PKT_SIZE_V6 VRRP_PKT_SIZE(AF_INET6, 255)
+#define VRRP_MIN_PKT_SIZE_V4 VRRP_PKT_SIZE(AF_INET, 3, 1)
+#define VRRP_MAX_PKT_SIZE_V4 VRRP_PKT_SIZE(AF_INET, 2, 255)
+#define VRRP_MIN_PKT_SIZE_V6 VRRP_PKT_SIZE(AF_INET6, 3, 1)
+#define VRRP_MAX_PKT_SIZE_V6 VRRP_PKT_SIZE(AF_INET6, 3, 255)
 
 #define VRRP_MIN_PKT_SIZE VRRP_MIN_PKT_SIZE_V4
 #define VRRP_MAX_PKT_SIZE VRRP_MAX_PKT_SIZE_V6
@@ -130,6 +133,9 @@ ssize_t vrrp_pkt_adver_build(struct vrrp_pkt **pkt, struct ipaddr *src,
                             uint16_t max_adver_int, uint8_t numip,
                             struct ipaddr **ips);
 
+/* free memory allocated by vrrp_pkt_adver_build's pkt arg */
+void vrrp_pkt_free(struct vrrp_pkt *pkt);
+
 /*
  * Dumps a VRRP ADVERTISEMENT packet to a string.
  *