]> git.proxmox.com Git - mirror_frr.git/blobdiff - vrrpd/vrrp_packet.h
vrrpd: allow vrrp_shutdown() on shutdown rtr
[mirror_frr.git] / vrrpd / vrrp_packet.h
index af512877188331a4f3e5b465155f497a7572ae3e..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.
  *
@@ -153,17 +159,25 @@ size_t vrrp_pkt_adver_dump(char *buf, size_t buflen, struct vrrp_pkt *pkt);
 /*
  * Parses a VRRP packet, checking for illegal or invalid data.
  *
- * This function does not check that the local router is not the IPvX owner for
- * the addresses received; that should be done by the caller.
+ * This function parses both VRRPv2 and VRRPv3 packets. Which version is
+ * expected is determined by the version argument. For example, if version is 3
+ * and the received packet has version field 2 it will fail to parse.
+ *
+ * Note that this function only checks whether the packet itself is a valid
+ * VRRP packet. It is up to the caller to validate whether the VRID is correct,
+ * priority and timer values are correct, etc.
  *
  * family
  *    Address family of received packet
  *
+ * version
+ *   VRRP version to use for validation
+ *
  * m
  *    msghdr containing results of recvmsg() on VRRP router socket
  *
  * read
- *    return value of recvmsg() on VRRP router socket; must be non-negative
+ *    Return value of recvmsg() on VRRP router socket; must be non-negative
  *
  * src
  *    Pointer to struct ipaddr to store address of datagram sender
@@ -181,8 +195,9 @@ size_t vrrp_pkt_adver_dump(char *buf, size_t buflen, struct vrrp_pkt *pkt);
  * Returns:
  *    Size of VRRP packet, or -1 upon error
  */
-ssize_t vrrp_pkt_parse_datagram(int family, struct msghdr *m, size_t read,
-                               struct ipaddr *src, struct vrrp_pkt **pkt,
-                               char *errmsg, size_t errmsg_len);
+ssize_t vrrp_pkt_parse_datagram(int family, int version, struct msghdr *m,
+                               size_t read, struct ipaddr *src,
+                               struct vrrp_pkt **pkt, char *errmsg,
+                               size_t errmsg_len);
 
 #endif /* __VRRP_PACKET_H__ */