Skip to content

Commit

Permalink
Merge pull request #8962 from donaldsharp/bgp_ll_must_be_there
Browse files Browse the repository at this point in the history
bgpd: Ensure v6 LL address is available before establishing peering
  • Loading branch information
idryzhov authored Jul 1, 2021
2 parents bc65216 + dac42f2 commit 5a1b002
Showing 1 changed file with 17 additions and 7 deletions.
24 changes: 17 additions & 7 deletions bgpd/bgp_zebra.c
Original file line number Diff line number Diff line change
Expand Up @@ -683,7 +683,7 @@ static int if_get_ipv6_global(struct interface *ifp, struct in6_addr *addr)
return 0;
}

static int if_get_ipv6_local(struct interface *ifp, struct in6_addr *addr)
static bool if_get_ipv6_local(struct interface *ifp, struct in6_addr *addr)
{
struct listnode *cnode;
struct connected *connected;
Expand All @@ -695,10 +695,10 @@ static int if_get_ipv6_local(struct interface *ifp, struct in6_addr *addr)
if (cp->family == AF_INET6)
if (IN6_IS_ADDR_LINKLOCAL(&cp->u.prefix6)) {
memcpy(addr, &cp->u.prefix6, IPV6_MAX_BYTELEN);
return 1;
return true;
}
}
return 0;
return false;
}

static int if_get_ipv4_address(struct interface *ifp, struct in_addr *addr)
Expand All @@ -724,6 +724,7 @@ bool bgp_zebra_nexthop_set(union sockunion *local, union sockunion *remote,
{
int ret = 0;
struct interface *ifp = NULL;
bool v6_ll_avail = true;

memset(nexthop, 0, sizeof(struct bgp_nexthop));

Expand Down Expand Up @@ -793,12 +794,20 @@ bool bgp_zebra_nexthop_set(union sockunion *local, union sockunion *remote,
* route-map to
* specify the global IPv6 nexthop.
*/
if_get_ipv6_local(ifp, &nexthop->v6_global);
v6_ll_avail =
if_get_ipv6_local(ifp, &nexthop->v6_global);
memcpy(&nexthop->v6_local, &nexthop->v6_global,
IPV6_MAX_BYTELEN);
} else
if_get_ipv6_local(ifp, &nexthop->v6_local);
v6_ll_avail =
if_get_ipv6_local(ifp, &nexthop->v6_local);

/*
* If we are a v4 connection and we are not doing unnumbered
* not having a v6 LL address is ok
*/
if (!v6_ll_avail && !peer->conf_if)
v6_ll_avail = true;
if (if_lookup_by_ipv4(&remote->sin.sin_addr, peer->bgp->vrf_id))
peer->shared_network = 1;
else
Expand All @@ -824,7 +833,8 @@ bool bgp_zebra_nexthop_set(union sockunion *local, union sockunion *remote,
remote->sin6.sin6_scope_id,
peer->bgp->vrf_id);
if (direct)
if_get_ipv6_local(ifp, &nexthop->v6_local);
v6_ll_avail = if_get_ipv6_local(
ifp, &nexthop->v6_local);
} else
/* Link-local address. */
{
Expand Down Expand Up @@ -871,7 +881,7 @@ bool bgp_zebra_nexthop_set(union sockunion *local, union sockunion *remote,

/* If we have identified the local interface, there is no error for now.
*/
return true;
return v6_ll_avail;
}

static struct in6_addr *
Expand Down

0 comments on commit 5a1b002

Please sign in to comment.