mirror of
https://git.proxmox.com/git/mirror_frr
synced 2026-01-08 04:52:34 +00:00
zebra: use proper sockaddr size in kernel_rtm
`sockaddr` `len` field is the address type size and not the mask length.
Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
(cherry picked from commit a6c0003182)
This commit is contained in:
parent
62b6a7e149
commit
0413dd7573
@ -155,23 +155,21 @@ static int kernel_rtm(int cmd, const struct prefix *p,
|
||||
switch (p->family) {
|
||||
case AF_INET:
|
||||
sin_dest.sin.sin_family = AF_INET;
|
||||
#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
|
||||
sin_dest.sin.sin_len = sizeof(sin_dest);
|
||||
sin_gate.sin.sin_len = sizeof(sin_gate);
|
||||
#endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
|
||||
sin_dest.sin.sin_addr = p->u.prefix4;
|
||||
sin_gate.sin.sin_family = AF_INET;
|
||||
#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
|
||||
sin_dest.sin.sin_len = sizeof(struct sockaddr_in);
|
||||
sin_gate.sin.sin_len = sizeof(struct sockaddr_in);
|
||||
#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
|
||||
break;
|
||||
case AF_INET6:
|
||||
sin_dest.sin6.sin6_family = AF_INET6;
|
||||
#ifdef SIN6_LEN
|
||||
sin_dest.sin6.sin6_len = sizeof(sin_dest);
|
||||
#endif /* SIN6_LEN */
|
||||
sin_dest.sin6.sin6_addr = p->u.prefix6;
|
||||
sin_gate.sin6.sin6_family = AF_INET6;
|
||||
#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
|
||||
sin_gate.sin6.sin6_len = sizeof(sin_gate);
|
||||
#endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
|
||||
#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
|
||||
sin_dest.sin6.sin6_len = sizeof(struct sockaddr_in6);
|
||||
sin_gate.sin6.sin6_len = sizeof(struct sockaddr_in6);
|
||||
#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
|
||||
break;
|
||||
}
|
||||
|
||||
@ -193,6 +191,9 @@ static int kernel_rtm(int cmd, const struct prefix *p,
|
||||
case NEXTHOP_TYPE_IPV4_IFINDEX:
|
||||
sin_gate.sin.sin_addr = nexthop->gate.ipv4;
|
||||
sin_gate.sin.sin_family = AF_INET;
|
||||
#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
|
||||
sin_gate.sin.sin_len = sizeof(struct sockaddr_in);
|
||||
#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
|
||||
ifindex = nexthop->ifindex;
|
||||
gate = true;
|
||||
break;
|
||||
@ -200,6 +201,9 @@ static int kernel_rtm(int cmd, const struct prefix *p,
|
||||
case NEXTHOP_TYPE_IPV6_IFINDEX:
|
||||
sin_gate.sin6.sin6_addr = nexthop->gate.ipv6;
|
||||
sin_gate.sin6.sin6_family = AF_INET6;
|
||||
#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
|
||||
sin_gate.sin6.sin6_len = sizeof(struct sockaddr_in6);
|
||||
#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
|
||||
ifindex = nexthop->ifindex;
|
||||
/* Under kame set interface index to link local address */
|
||||
#ifdef KAME
|
||||
@ -228,6 +232,10 @@ static int kernel_rtm(int cmd, const struct prefix *p,
|
||||
struct in_addr loopback;
|
||||
loopback.s_addr = htonl(INADDR_LOOPBACK);
|
||||
sin_gate.sin.sin_addr = loopback;
|
||||
#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
|
||||
sin_gate.sin.sin_len =
|
||||
sizeof(struct sockaddr_in);
|
||||
#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
|
||||
gate = true;
|
||||
}
|
||||
break;
|
||||
@ -240,18 +248,16 @@ static int kernel_rtm(int cmd, const struct prefix *p,
|
||||
case AF_INET:
|
||||
masklen2ip(p->prefixlen, &sin_mask.sin.sin_addr);
|
||||
sin_mask.sin.sin_family = AF_INET;
|
||||
#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
|
||||
sin_mask.sin.sin_len = sin_masklen(
|
||||
sin_mask.sin.sin_addr);
|
||||
#endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
|
||||
#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
|
||||
sin_mask.sin.sin_len = sizeof(struct sockaddr_in);
|
||||
#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
|
||||
break;
|
||||
case AF_INET6:
|
||||
masklen2ip6(p->prefixlen, &sin_mask.sin6.sin6_addr);
|
||||
sin_mask.sin6.sin6_family = AF_INET6;
|
||||
#ifdef SIN6_LEN
|
||||
sin_mask.sin6.sin6_len = sin6_masklen(
|
||||
sin_mask.sin6.sin6_addr);
|
||||
#endif /* SIN6_LEN */
|
||||
#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
|
||||
sin_mask.sin6.sin6_len = sizeof(struct sockaddr_in6);
|
||||
#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user