bfdd: fix single hop IPv6 configurations

Don't assume IPv6 will always be multi hop and handle the single hop
link-local address case.

Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
This commit is contained in:
Rafael Zalamena 2019-03-06 17:50:04 -03:00
parent 0ff3b1118b
commit 2435b7defe

View File

@ -208,13 +208,17 @@ int bfd_session_enable(struct bfd_session *bs)
/* Set the IPv6 scope id for link-local addresses. */ /* Set the IPv6 scope id for link-local addresses. */
if (BFD_CHECK_FLAG(bs->flags, BFD_SESS_FLAG_IPV6)) { if (BFD_CHECK_FLAG(bs->flags, BFD_SESS_FLAG_IPV6)) {
sin6 = &bs->mhop.peer.sa_sin6; sin6 = (BFD_CHECK_FLAG(bs->flags, BFD_SESS_FLAG_MH))
? &bs->mhop.peer.sa_sin6
: &bs->shop.peer.sa_sin6;
if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr))
sin6->sin6_scope_id = bs->ifp != NULL sin6->sin6_scope_id = bs->ifp != NULL
? bs->ifp->ifindex ? bs->ifp->ifindex
: IFINDEX_INTERNAL; : IFINDEX_INTERNAL;
sin6 = &bs->mhop.local.sa_sin6; sin6 = (BFD_CHECK_FLAG(bs->flags, BFD_SESS_FLAG_MH))
? &bs->mhop.local.sa_sin6
: &bs->local_address.sa_sin6;
if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr))
sin6->sin6_scope_id = bs->ifp != NULL sin6->sin6_scope_id = bs->ifp != NULL
? bs->ifp->ifindex ? bs->ifp->ifindex