diff options
| author | Quentin Young <qlyoung@cumulusnetworks.com> | 2019-03-13 17:18:36 +0000 |
|---|---|---|
| committer | Quentin Young <qlyoung@cumulusnetworks.com> | 2019-05-17 00:27:08 +0000 |
| commit | c2034b2550eb29a1564994838c94720e1a78ba8e (patch) | |
| tree | 65fcd3773a8afc3f0ff4a24ad0bf0898bd00d45d /vrrpd/vrrp_packet.c | |
| parent | 8b28e459a17c661972362723ada9bf15e3957601 (diff) | |
vrrpd: include auth fields in v2 packet
Based on looking at other vendors, seems I misinterpreted the RFC - type
0 auth (no authentication) still requires the authentication fields to
be present, just set to all zero.
This should fix VRRPv2 interop with other vendors.
Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
Diffstat (limited to 'vrrpd/vrrp_packet.c')
| -rw-r--r-- | vrrpd/vrrp_packet.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/vrrpd/vrrp_packet.c b/vrrpd/vrrp_packet.c index 970c8d7d7e..102750eafe 100644 --- a/vrrpd/vrrp_packet.c +++ b/vrrpd/vrrp_packet.c @@ -119,7 +119,7 @@ ssize_t vrrp_pkt_adver_build(struct vrrp_pkt **pkt, struct ipaddr *src, addrsz = IPADDRSZ(ips[0]); } - size_t pktsize = VRRP_PKT_SIZE(v6 ? AF_INET6 : AF_INET, numip); + size_t pktsize = VRRP_PKT_SIZE(v6 ? AF_INET6 : AF_INET, version, numip); *pkt = XCALLOC(MTYPE_VRRP_PKT, pktsize); (*pkt)->hdr.vertype |= version << 4; @@ -283,9 +283,10 @@ ssize_t vrrp_pkt_parse_datagram(int family, int version, struct msghdr *m, VRRP_PKT_VCHECK(((*pkt)->hdr.vertype & 0x0F) == 1, "Bad type %" PRIu8, (*pkt)->hdr.vertype & 0x0f); - /* # addresses check */ - size_t ves = VRRP_PKT_SIZE(family, (*pkt)->hdr.naddr); - VRRP_PKT_VCHECK(pktsize == ves, "Packet has incorrect # addresses"); + /* Exact size check */ + size_t ves = VRRP_PKT_SIZE(family, pktver, (*pkt)->hdr.naddr); + VRRP_PKT_VCHECK(pktsize == ves, "Packet has incorrect # addresses%s", + pktver == 2 ? " or missing auth fields" : ""); /* auth type check */ if (version == 2) |
