mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-07 15:33:56 +00:00
Use #define for mp_nexthop_len values
This commit is contained in:
parent
fa5f7ad597
commit
801a9bcc7f
@ -456,8 +456,8 @@ attrhash_key_make (void *p)
|
|||||||
|
|
||||||
#ifdef HAVE_IPV6
|
#ifdef HAVE_IPV6
|
||||||
MIX(extra->mp_nexthop_len);
|
MIX(extra->mp_nexthop_len);
|
||||||
key = jhash(extra->mp_nexthop_global.s6_addr, 16, key);
|
key = jhash(extra->mp_nexthop_global.s6_addr, IPV6_MAX_BYTELEN, key);
|
||||||
key = jhash(extra->mp_nexthop_local.s6_addr, 16, key);
|
key = jhash(extra->mp_nexthop_local.s6_addr, IPV6_MAX_BYTELEN, key);
|
||||||
#endif /* HAVE_IPV6 */
|
#endif /* HAVE_IPV6 */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1584,24 +1584,24 @@ bgp_mp_reach_parse (struct bgp_attr_parser_args *args,
|
|||||||
/* Nexthop length check. */
|
/* Nexthop length check. */
|
||||||
switch (attre->mp_nexthop_len)
|
switch (attre->mp_nexthop_len)
|
||||||
{
|
{
|
||||||
case 4:
|
case BGP_ATTR_NHLEN_IPV4:
|
||||||
stream_get (&attre->mp_nexthop_global_in, s, 4);
|
stream_get (&attre->mp_nexthop_global_in, s, IPV4_MAX_BYTELEN);
|
||||||
/* Probably needed for RFC 2283 */
|
/* Probably needed for RFC 2283 */
|
||||||
if (attr->nexthop.s_addr == 0)
|
if (attr->nexthop.s_addr == 0)
|
||||||
memcpy(&attr->nexthop.s_addr, &attre->mp_nexthop_global_in, 4);
|
memcpy(&attr->nexthop.s_addr, &attre->mp_nexthop_global_in, IPV4_MAX_BYTELEN);
|
||||||
break;
|
break;
|
||||||
case 12:
|
case BGP_ATTR_NHLEN_VPNV4:
|
||||||
stream_getl (s); /* RD high */
|
stream_getl (s); /* RD high */
|
||||||
stream_getl (s); /* RD low */
|
stream_getl (s); /* RD low */
|
||||||
stream_get (&attre->mp_nexthop_global_in, s, 4);
|
stream_get (&attre->mp_nexthop_global_in, s, IPV4_MAX_BYTELEN);
|
||||||
break;
|
break;
|
||||||
#ifdef HAVE_IPV6
|
#ifdef HAVE_IPV6
|
||||||
case 16:
|
case BGP_ATTR_NHLEN_IPV6_GLOBAL:
|
||||||
stream_get (&attre->mp_nexthop_global, s, 16);
|
stream_get (&attre->mp_nexthop_global, s, IPV6_MAX_BYTELEN);
|
||||||
break;
|
break;
|
||||||
case 32:
|
case BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL:
|
||||||
stream_get (&attre->mp_nexthop_global, s, 16);
|
stream_get (&attre->mp_nexthop_global, s, IPV6_MAX_BYTELEN);
|
||||||
stream_get (&attre->mp_nexthop_local, s, 16);
|
stream_get (&attre->mp_nexthop_local, s, IPV6_MAX_BYTELEN);
|
||||||
if (! IN6_IS_ADDR_LINKLOCAL (&attre->mp_nexthop_local))
|
if (! IN6_IS_ADDR_LINKLOCAL (&attre->mp_nexthop_local))
|
||||||
{
|
{
|
||||||
char buf1[INET6_ADDRSTRLEN];
|
char buf1[INET6_ADDRSTRLEN];
|
||||||
@ -1614,7 +1614,7 @@ bgp_mp_reach_parse (struct bgp_attr_parser_args *args,
|
|||||||
inet_ntop (AF_INET6, &attre->mp_nexthop_local,
|
inet_ntop (AF_INET6, &attre->mp_nexthop_local,
|
||||||
buf2, INET6_ADDRSTRLEN));
|
buf2, INET6_ADDRSTRLEN));
|
||||||
|
|
||||||
attre->mp_nexthop_len = 16;
|
attre->mp_nexthop_len = IPV6_MAX_BYTELEN;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#endif /* HAVE_IPV6 */
|
#endif /* HAVE_IPV6 */
|
||||||
@ -2189,9 +2189,9 @@ bgp_packet_mpattr_start (struct stream *s, afi_t afi, safi_t safi,
|
|||||||
assert (attr->extra);
|
assert (attr->extra);
|
||||||
bpacket_attr_vec_arr_set_vec (vecarr, BGP_ATTR_VEC_NH, s, attr);
|
bpacket_attr_vec_arr_set_vec (vecarr, BGP_ATTR_VEC_NH, s, attr);
|
||||||
stream_putc (s, attre->mp_nexthop_len);
|
stream_putc (s, attre->mp_nexthop_len);
|
||||||
stream_put (s, &attre->mp_nexthop_global, 16);
|
stream_put (s, &attre->mp_nexthop_global, IPV6_MAX_BYTELEN);
|
||||||
if (attre->mp_nexthop_len == 32)
|
if (attre->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL)
|
||||||
stream_put (s, &attre->mp_nexthop_local, 16);
|
stream_put (s, &attre->mp_nexthop_local, IPV6_MAX_BYTELEN);
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -2760,7 +2760,8 @@ bgp_dump_routes_attr (struct stream *s, struct attr *attr,
|
|||||||
#ifdef HAVE_IPV6
|
#ifdef HAVE_IPV6
|
||||||
/* Add a MP_NLRI attribute to dump the IPv6 next hop */
|
/* Add a MP_NLRI attribute to dump the IPv6 next hop */
|
||||||
if (prefix != NULL && prefix->family == AF_INET6 && attr->extra &&
|
if (prefix != NULL && prefix->family == AF_INET6 && attr->extra &&
|
||||||
(attr->extra->mp_nexthop_len == 16 || attr->extra->mp_nexthop_len == 32) )
|
(attr->extra->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL ||
|
||||||
|
attr->extra->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL) )
|
||||||
{
|
{
|
||||||
int sizep;
|
int sizep;
|
||||||
struct attr_extra *attre = attr->extra;
|
struct attr_extra *attre = attr->extra;
|
||||||
@ -2776,9 +2777,9 @@ bgp_dump_routes_attr (struct stream *s, struct attr *attr,
|
|||||||
|
|
||||||
/* Next hop */
|
/* Next hop */
|
||||||
stream_putc(s, attre->mp_nexthop_len);
|
stream_putc(s, attre->mp_nexthop_len);
|
||||||
stream_put(s, &attre->mp_nexthop_global, 16);
|
stream_put(s, &attre->mp_nexthop_global, IPV6_MAX_BYTELEN);
|
||||||
if (attre->mp_nexthop_len == 32)
|
if (attre->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL)
|
||||||
stream_put(s, &attre->mp_nexthop_local, 16);
|
stream_put(s, &attre->mp_nexthop_local, IPV6_MAX_BYTELEN);
|
||||||
|
|
||||||
/* SNPA */
|
/* SNPA */
|
||||||
stream_putc(s, 0);
|
stream_putc(s, 0);
|
||||||
|
@ -47,6 +47,12 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|||||||
#define BGP_ATTR_MIN_LEN 3 /* Attribute flag, type length. */
|
#define BGP_ATTR_MIN_LEN 3 /* Attribute flag, type length. */
|
||||||
#define BGP_ATTR_DEFAULT_WEIGHT 32768
|
#define BGP_ATTR_DEFAULT_WEIGHT 32768
|
||||||
|
|
||||||
|
/* Valid lengths for mp_nexthop_len */
|
||||||
|
#define BGP_ATTR_NHLEN_IPV4 IPV4_MAX_BYTELEN
|
||||||
|
#define BGP_ATTR_NHLEN_VPNV4 12
|
||||||
|
#define BGP_ATTR_NHLEN_IPV6_GLOBAL IPV6_MAX_BYTELEN
|
||||||
|
#define BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL (IPV6_MAX_BYTELEN * 2)
|
||||||
|
|
||||||
/* Additional/uncommon BGP attributes.
|
/* Additional/uncommon BGP attributes.
|
||||||
* lazily allocated as and when a struct attr
|
* lazily allocated as and when a struct attr
|
||||||
* requires it.
|
* requires it.
|
||||||
|
@ -343,13 +343,13 @@ bgp_dump_attr (struct peer *peer, struct attr *attr, char *buf, size_t size)
|
|||||||
char addrbuf[BUFSIZ];
|
char addrbuf[BUFSIZ];
|
||||||
|
|
||||||
/* Add MP case. */
|
/* Add MP case. */
|
||||||
if (attr->extra->mp_nexthop_len == 16
|
if (attr->extra->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL
|
||||||
|| attr->extra->mp_nexthop_len == 32)
|
|| attr->extra->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL)
|
||||||
snprintf (buf + strlen (buf), size - strlen (buf), ", mp_nexthop %s",
|
snprintf (buf + strlen (buf), size - strlen (buf), ", mp_nexthop %s",
|
||||||
inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
|
inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
|
||||||
addrbuf, BUFSIZ));
|
addrbuf, BUFSIZ));
|
||||||
|
|
||||||
if (attr->extra->mp_nexthop_len == 32)
|
if (attr->extra->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL)
|
||||||
snprintf (buf + strlen (buf), size - strlen (buf), "(%s)",
|
snprintf (buf + strlen (buf), size - strlen (buf), "(%s)",
|
||||||
inet_ntop (AF_INET6, &attr->extra->mp_nexthop_local,
|
inet_ntop (AF_INET6, &attr->extra->mp_nexthop_local,
|
||||||
addrbuf, BUFSIZ));
|
addrbuf, BUFSIZ));
|
||||||
|
@ -120,17 +120,17 @@ bgp_info_nexthop_cmp (struct bgp_info *bi1, struct bgp_info *bi2)
|
|||||||
{
|
{
|
||||||
switch (ae1->mp_nexthop_len)
|
switch (ae1->mp_nexthop_len)
|
||||||
{
|
{
|
||||||
case 4:
|
case BGP_ATTR_NHLEN_IPV4:
|
||||||
case 12:
|
case BGP_ATTR_NHLEN_VPNV4:
|
||||||
compare = IPV4_ADDR_CMP (&ae1->mp_nexthop_global_in,
|
compare = IPV4_ADDR_CMP (&ae1->mp_nexthop_global_in,
|
||||||
&ae2->mp_nexthop_global_in);
|
&ae2->mp_nexthop_global_in);
|
||||||
break;
|
break;
|
||||||
#ifdef HAVE_IPV6
|
#ifdef HAVE_IPV6
|
||||||
case 16:
|
case BGP_ATTR_NHLEN_IPV6_GLOBAL:
|
||||||
compare = IPV6_ADDR_CMP (&ae1->mp_nexthop_global,
|
compare = IPV6_ADDR_CMP (&ae1->mp_nexthop_global,
|
||||||
&ae2->mp_nexthop_global);
|
&ae2->mp_nexthop_global);
|
||||||
break;
|
break;
|
||||||
case 32:
|
case BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL:
|
||||||
compare = IPV6_ADDR_CMP (&ae1->mp_nexthop_global,
|
compare = IPV6_ADDR_CMP (&ae1->mp_nexthop_global,
|
||||||
&ae2->mp_nexthop_global);
|
&ae2->mp_nexthop_global);
|
||||||
if (!compare)
|
if (!compare)
|
||||||
@ -145,7 +145,8 @@ bgp_info_nexthop_cmp (struct bgp_info *bi1, struct bgp_info *bi2)
|
|||||||
/* This can happen if one IPv6 peer sends you global and link-local
|
/* This can happen if one IPv6 peer sends you global and link-local
|
||||||
* nexthops but another IPv6 peer only sends you global
|
* nexthops but another IPv6 peer only sends you global
|
||||||
*/
|
*/
|
||||||
else if (ae1->mp_nexthop_len == 16 || ae1->mp_nexthop_len == 32)
|
else if (ae1->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL ||
|
||||||
|
ae1->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL)
|
||||||
{
|
{
|
||||||
compare = IPV6_ADDR_CMP (&ae1->mp_nexthop_global,
|
compare = IPV6_ADDR_CMP (&ae1->mp_nexthop_global,
|
||||||
&ae2->mp_nexthop_global);
|
&ae2->mp_nexthop_global);
|
||||||
|
@ -110,9 +110,9 @@ bgp_nexthop_onlink (afi_t afi, struct attr *attr)
|
|||||||
#ifdef HAVE_IPV6
|
#ifdef HAVE_IPV6
|
||||||
else if (afi == AFI_IP6)
|
else if (afi == AFI_IP6)
|
||||||
{
|
{
|
||||||
if (attr->extra->mp_nexthop_len == 32)
|
if (attr->extra->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL)
|
||||||
return 1;
|
return 1;
|
||||||
else if (attr->extra->mp_nexthop_len == 16)
|
else if (attr->extra->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL)
|
||||||
{
|
{
|
||||||
if (IN6_IS_ADDR_LINKLOCAL (&attr->extra->mp_nexthop_global))
|
if (IN6_IS_ADDR_LINKLOCAL (&attr->extra->mp_nexthop_global))
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -372,7 +372,7 @@ make_prefix (int afi, struct bgp_info *ri, struct prefix *p)
|
|||||||
break;
|
break;
|
||||||
#ifdef HAVE_IPV6
|
#ifdef HAVE_IPV6
|
||||||
case AFI_IP6:
|
case AFI_IP6:
|
||||||
if (ri->attr->extra->mp_nexthop_len != 16
|
if (ri->attr->extra->mp_nexthop_len != BGP_ATTR_NHLEN_IPV6_GLOBAL
|
||||||
|| IN6_IS_ADDR_LINKLOCAL (&ri->attr->extra->mp_nexthop_global))
|
|| IN6_IS_ADDR_LINKLOCAL (&ri->attr->extra->mp_nexthop_global))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
@ -1141,7 +1141,7 @@ bgp_announce_check (struct bgp_info *ri, struct peer *peer, struct prefix *p,
|
|||||||
/* IPv6 global nexthop must be included. */
|
/* IPv6 global nexthop must be included. */
|
||||||
memcpy (&attr->extra->mp_nexthop_global, &peer->nexthop.v6_global,
|
memcpy (&attr->extra->mp_nexthop_global, &peer->nexthop.v6_global,
|
||||||
IPV6_MAX_BYTELEN);
|
IPV6_MAX_BYTELEN);
|
||||||
attr->extra->mp_nexthop_len = 16;
|
attr->extra->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL;
|
||||||
}
|
}
|
||||||
#endif /* HAVE_IPV6 */
|
#endif /* HAVE_IPV6 */
|
||||||
}
|
}
|
||||||
@ -1154,16 +1154,16 @@ bgp_announce_check (struct bgp_info *ri, struct peer *peer, struct prefix *p,
|
|||||||
PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED) )
|
PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED) )
|
||||||
{
|
{
|
||||||
if ( IN6_IS_ADDR_LINKLOCAL (&attr->extra->mp_nexthop_local) )
|
if ( IN6_IS_ADDR_LINKLOCAL (&attr->extra->mp_nexthop_local) )
|
||||||
attr->extra->mp_nexthop_len=32;
|
attr->extra->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL;
|
||||||
else
|
else
|
||||||
attr->extra->mp_nexthop_len=16;
|
attr->extra->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Default nexthop_local treatment for non-RS-Clients */
|
/* Default nexthop_local treatment for non-RS-Clients */
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Link-local address should not be transit to different peer. */
|
/* Link-local address should not be transit to different peer. */
|
||||||
attr->extra->mp_nexthop_len = 16;
|
attr->extra->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL;
|
||||||
|
|
||||||
/* Set link-local address for shared network peer. */
|
/* Set link-local address for shared network peer. */
|
||||||
if (peer->shared_network
|
if (peer->shared_network
|
||||||
@ -1171,17 +1171,17 @@ bgp_announce_check (struct bgp_info *ri, struct peer *peer, struct prefix *p,
|
|||||||
{
|
{
|
||||||
memcpy (&attr->extra->mp_nexthop_local, &peer->nexthop.v6_local,
|
memcpy (&attr->extra->mp_nexthop_local, &peer->nexthop.v6_local,
|
||||||
IPV6_MAX_BYTELEN);
|
IPV6_MAX_BYTELEN);
|
||||||
attr->extra->mp_nexthop_len = 32;
|
attr->extra->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If bgpd act as BGP-4+ route-reflector, do not send link-local
|
/* If bgpd act as BGP-4+ route-reflector, do not send link-local
|
||||||
address.*/
|
address.*/
|
||||||
if (reflect)
|
if (reflect)
|
||||||
attr->extra->mp_nexthop_len = 16;
|
attr->extra->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL;
|
||||||
|
|
||||||
/* If BGP-4+ link-local nexthop is not link-local nexthop. */
|
/* If BGP-4+ link-local nexthop is not link-local nexthop. */
|
||||||
if (! IN6_IS_ADDR_LINKLOCAL (&peer->nexthop.v6_local))
|
if (! IN6_IS_ADDR_LINKLOCAL (&peer->nexthop.v6_local))
|
||||||
attr->extra->mp_nexthop_len = 16;
|
attr->extra->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -1459,14 +1459,14 @@ subgroup_announce_check (struct bgp_info *ri, struct update_subgroup *subgrp,
|
|||||||
*/
|
*/
|
||||||
if (p->family == AF_INET6)
|
if (p->family == AF_INET6)
|
||||||
{
|
{
|
||||||
attr->extra->mp_nexthop_len = 16;
|
attr->extra->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL;
|
||||||
if (!reflect)
|
if (!reflect)
|
||||||
{
|
{
|
||||||
if (peer->shared_network ||
|
if (peer->shared_network ||
|
||||||
(CHECK_FLAG (peer->af_flags[afi][safi],
|
(CHECK_FLAG (peer->af_flags[afi][safi],
|
||||||
PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED) &&
|
PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED) &&
|
||||||
IN6_IS_ADDR_LINKLOCAL (&attr->extra->mp_nexthop_local)))
|
IN6_IS_ADDR_LINKLOCAL (&attr->extra->mp_nexthop_local)))
|
||||||
attr->extra->mp_nexthop_len = 32;
|
attr->extra->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clear off link-local nexthop in source, if not needed. This may help
|
/* Clear off link-local nexthop in source, if not needed. This may help
|
||||||
@ -1673,7 +1673,7 @@ bgp_announce_check_rsclient (struct bgp_info *ri, struct peer *rsclient,
|
|||||||
/* IPv6 global nexthop must be included. */
|
/* IPv6 global nexthop must be included. */
|
||||||
memcpy (&attr->extra->mp_nexthop_global, &rsclient->nexthop.v6_global,
|
memcpy (&attr->extra->mp_nexthop_global, &rsclient->nexthop.v6_global,
|
||||||
IPV6_MAX_BYTELEN);
|
IPV6_MAX_BYTELEN);
|
||||||
attr->extra->mp_nexthop_len = 16;
|
attr->extra->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL;
|
||||||
}
|
}
|
||||||
#endif /* HAVE_IPV6 */
|
#endif /* HAVE_IPV6 */
|
||||||
}
|
}
|
||||||
@ -1688,9 +1688,9 @@ bgp_announce_check_rsclient (struct bgp_info *ri, struct peer *rsclient,
|
|||||||
PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED) )
|
PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED) )
|
||||||
{
|
{
|
||||||
if ( IN6_IS_ADDR_LINKLOCAL (&attre->mp_nexthop_local) )
|
if ( IN6_IS_ADDR_LINKLOCAL (&attre->mp_nexthop_local) )
|
||||||
attre->mp_nexthop_len=32;
|
attre->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL;
|
||||||
else
|
else
|
||||||
attre->mp_nexthop_len=16;
|
attre->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Default nexthop_local treatment for RS-Clients */
|
/* Default nexthop_local treatment for RS-Clients */
|
||||||
@ -1701,9 +1701,9 @@ bgp_announce_check_rsclient (struct bgp_info *ri, struct peer *rsclient,
|
|||||||
(rsclient->ifindex == from->ifindex))
|
(rsclient->ifindex == from->ifindex))
|
||||||
{
|
{
|
||||||
if ( IN6_IS_ADDR_LINKLOCAL (&attre->mp_nexthop_local) )
|
if ( IN6_IS_ADDR_LINKLOCAL (&attre->mp_nexthop_local) )
|
||||||
attre->mp_nexthop_len=32;
|
attre->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL;
|
||||||
else
|
else
|
||||||
attre->mp_nexthop_len=16;
|
attre->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set link-local address for shared network peer. */
|
/* Set link-local address for shared network peer. */
|
||||||
@ -1712,11 +1712,11 @@ bgp_announce_check_rsclient (struct bgp_info *ri, struct peer *rsclient,
|
|||||||
{
|
{
|
||||||
memcpy (&attre->mp_nexthop_local, &rsclient->nexthop.v6_local,
|
memcpy (&attre->mp_nexthop_local, &rsclient->nexthop.v6_local,
|
||||||
IPV6_MAX_BYTELEN);
|
IPV6_MAX_BYTELEN);
|
||||||
attre->mp_nexthop_len = 32;
|
attre->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL;
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
attre->mp_nexthop_len = 16;
|
attre->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -1880,7 +1880,7 @@ subgroup_announce_check_rsclient (struct bgp_info *ri,
|
|||||||
/* IPv6 global nexthop must be included. */
|
/* IPv6 global nexthop must be included. */
|
||||||
memcpy (&attr->extra->mp_nexthop_global, &rsclient->nexthop.v6_global,
|
memcpy (&attr->extra->mp_nexthop_global, &rsclient->nexthop.v6_global,
|
||||||
IPV6_MAX_BYTELEN);
|
IPV6_MAX_BYTELEN);
|
||||||
attr->extra->mp_nexthop_len = 16;
|
attr->extra->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL;
|
||||||
}
|
}
|
||||||
#endif /* HAVE_IPV6 */
|
#endif /* HAVE_IPV6 */
|
||||||
}
|
}
|
||||||
@ -1895,9 +1895,9 @@ subgroup_announce_check_rsclient (struct bgp_info *ri,
|
|||||||
PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED) )
|
PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED) )
|
||||||
{
|
{
|
||||||
if ( IN6_IS_ADDR_LINKLOCAL (&attre->mp_nexthop_local) )
|
if ( IN6_IS_ADDR_LINKLOCAL (&attre->mp_nexthop_local) )
|
||||||
attre->mp_nexthop_len=32;
|
attre->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL;
|
||||||
else
|
else
|
||||||
attre->mp_nexthop_len=16;
|
attre->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Default nexthop_local treatment for RS-Clients */
|
/* Default nexthop_local treatment for RS-Clients */
|
||||||
@ -1908,9 +1908,9 @@ subgroup_announce_check_rsclient (struct bgp_info *ri,
|
|||||||
(rsclient->ifindex == from->ifindex))
|
(rsclient->ifindex == from->ifindex))
|
||||||
{
|
{
|
||||||
if ( IN6_IS_ADDR_LINKLOCAL (&attre->mp_nexthop_local) )
|
if ( IN6_IS_ADDR_LINKLOCAL (&attre->mp_nexthop_local) )
|
||||||
attre->mp_nexthop_len=32;
|
attre->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL;
|
||||||
else
|
else
|
||||||
attre->mp_nexthop_len=16;
|
attre->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set link-local address for shared network peer. */
|
/* Set link-local address for shared network peer. */
|
||||||
@ -1919,11 +1919,11 @@ subgroup_announce_check_rsclient (struct bgp_info *ri,
|
|||||||
{
|
{
|
||||||
memcpy (&attre->mp_nexthop_local, &rsclient->nexthop.v6_local,
|
memcpy (&attre->mp_nexthop_local, &rsclient->nexthop.v6_local,
|
||||||
IPV6_MAX_BYTELEN);
|
IPV6_MAX_BYTELEN);
|
||||||
attre->mp_nexthop_len = 32;
|
attre->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL;
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
attre->mp_nexthop_len = 16;
|
attre->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -6378,7 +6378,7 @@ bgp_redistribute_add (struct prefix *p, const struct in_addr *nexthop,
|
|||||||
{
|
{
|
||||||
struct attr_extra *extra = bgp_attr_extra_get(&attr);
|
struct attr_extra *extra = bgp_attr_extra_get(&attr);
|
||||||
extra->mp_nexthop_global = *nexthop6;
|
extra->mp_nexthop_global = *nexthop6;
|
||||||
extra->mp_nexthop_len = 16;
|
extra->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -6930,11 +6930,11 @@ route_vty_out_tag (struct vty *vty, struct prefix *p,
|
|||||||
assert (attr->extra);
|
assert (attr->extra);
|
||||||
char buf[BUFSIZ];
|
char buf[BUFSIZ];
|
||||||
char buf1[BUFSIZ];
|
char buf1[BUFSIZ];
|
||||||
if (attr->extra->mp_nexthop_len == 16)
|
if (attr->extra->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL)
|
||||||
vty_out (vty, "%s",
|
vty_out (vty, "%s",
|
||||||
inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
|
inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
|
||||||
buf, BUFSIZ));
|
buf, BUFSIZ));
|
||||||
else if (attr->extra->mp_nexthop_len == 32)
|
else if (attr->extra->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL)
|
||||||
vty_out (vty, "%s(%s)",
|
vty_out (vty, "%s(%s)",
|
||||||
inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
|
inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
|
||||||
buf, BUFSIZ),
|
buf, BUFSIZ),
|
||||||
@ -7304,7 +7304,7 @@ route_vty_out_detail (struct vty *vty, struct bgp *bgp, struct prefix *p,
|
|||||||
|
|
||||||
#ifdef HAVE_IPV6
|
#ifdef HAVE_IPV6
|
||||||
/* display nexthop local */
|
/* display nexthop local */
|
||||||
if (attr->extra && attr->extra->mp_nexthop_len == 32)
|
if (attr->extra && attr->extra->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL)
|
||||||
{
|
{
|
||||||
if (json_paths)
|
if (json_paths)
|
||||||
{
|
{
|
||||||
|
@ -2091,7 +2091,7 @@ route_match_ipv6_next_hop (void *rule, struct prefix *prefix,
|
|||||||
if (IPV6_ADDR_SAME (&bgp_info->attr->extra->mp_nexthop_global, rule))
|
if (IPV6_ADDR_SAME (&bgp_info->attr->extra->mp_nexthop_global, rule))
|
||||||
return RMAP_MATCH;
|
return RMAP_MATCH;
|
||||||
|
|
||||||
if (bgp_info->attr->extra->mp_nexthop_len == 32 &&
|
if (bgp_info->attr->extra->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL &&
|
||||||
IPV6_ADDR_SAME (&bgp_info->attr->extra->mp_nexthop_local, rule))
|
IPV6_ADDR_SAME (&bgp_info->attr->extra->mp_nexthop_local, rule))
|
||||||
return RMAP_MATCH;
|
return RMAP_MATCH;
|
||||||
|
|
||||||
@ -2194,7 +2194,7 @@ route_set_ipv6_nexthop_global (void *rule, struct prefix *prefix,
|
|||||||
|
|
||||||
/* Set nexthop length. */
|
/* Set nexthop length. */
|
||||||
if (bgp_info->attr->extra->mp_nexthop_len == 0)
|
if (bgp_info->attr->extra->mp_nexthop_len == 0)
|
||||||
bgp_info->attr->extra->mp_nexthop_len = 16;
|
bgp_info->attr->extra->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL;
|
||||||
|
|
||||||
SET_FLAG(bgp_info->attr->rmap_change_flags,
|
SET_FLAG(bgp_info->attr->rmap_change_flags,
|
||||||
BATTR_RMAP_NEXTHOP_CHANGED);
|
BATTR_RMAP_NEXTHOP_CHANGED);
|
||||||
@ -2260,8 +2260,8 @@ route_set_ipv6_nexthop_local (void *rule, struct prefix *prefix,
|
|||||||
(bgp_attr_extra_get (bgp_info->attr))->mp_nexthop_local = *address;
|
(bgp_attr_extra_get (bgp_info->attr))->mp_nexthop_local = *address;
|
||||||
|
|
||||||
/* Set nexthop length. */
|
/* Set nexthop length. */
|
||||||
if (bgp_info->attr->extra->mp_nexthop_len != 32)
|
if (bgp_info->attr->extra->mp_nexthop_len != BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL)
|
||||||
bgp_info->attr->extra->mp_nexthop_len = 32;
|
bgp_info->attr->extra->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL;
|
||||||
|
|
||||||
SET_FLAG(bgp_info->attr->rmap_change_flags,
|
SET_FLAG(bgp_info->attr->rmap_change_flags,
|
||||||
BATTR_RMAP_NEXTHOP_CHANGED);
|
BATTR_RMAP_NEXTHOP_CHANGED);
|
||||||
@ -2353,8 +2353,8 @@ route_set_ipv6_nexthop_peer (void *rule, struct prefix *prefix,
|
|||||||
/* The next hop value will be set as part of packet rewrite. */
|
/* The next hop value will be set as part of packet rewrite. */
|
||||||
|
|
||||||
/* Set nexthop length. */
|
/* Set nexthop length. */
|
||||||
if (bgp_info->attr->extra->mp_nexthop_len != 32)
|
if (bgp_info->attr->extra->mp_nexthop_len != BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL)
|
||||||
bgp_info->attr->extra->mp_nexthop_len = 32;
|
bgp_info->attr->extra->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -2362,7 +2362,7 @@ route_set_ipv6_nexthop_peer (void *rule, struct prefix *prefix,
|
|||||||
|
|
||||||
/* Set nexthop length. */
|
/* Set nexthop length. */
|
||||||
if (bgp_info->attr->extra->mp_nexthop_len == 0)
|
if (bgp_info->attr->extra->mp_nexthop_len == 0)
|
||||||
bgp_info->attr->extra->mp_nexthop_len = 16;
|
bgp_info->attr->extra->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -617,7 +617,7 @@ subgroup_default_originate (struct update_subgroup *subgrp, int withdraw)
|
|||||||
/* IPv6 global nexthop must be included. */
|
/* IPv6 global nexthop must be included. */
|
||||||
memcpy (&ae->mp_nexthop_global, &peer->nexthop.v6_global,
|
memcpy (&ae->mp_nexthop_global, &peer->nexthop.v6_global,
|
||||||
IPV6_MAX_BYTELEN);
|
IPV6_MAX_BYTELEN);
|
||||||
ae->mp_nexthop_len = 16;
|
ae->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL;
|
||||||
|
|
||||||
/* If the peer is on shared nextwork and we have link-local
|
/* If the peer is on shared nextwork and we have link-local
|
||||||
nexthop set it. */
|
nexthop set it. */
|
||||||
@ -626,7 +626,7 @@ subgroup_default_originate (struct update_subgroup *subgrp, int withdraw)
|
|||||||
{
|
{
|
||||||
memcpy (&ae->mp_nexthop_local, &peer->nexthop.v6_local,
|
memcpy (&ae->mp_nexthop_local, &peer->nexthop.v6_local,
|
||||||
IPV6_MAX_BYTELEN);
|
IPV6_MAX_BYTELEN);
|
||||||
ae->mp_nexthop_len = 32;
|
ae->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* HAVE_IPV6 */
|
#endif /* HAVE_IPV6 */
|
||||||
|
@ -885,11 +885,11 @@ bgp_info_to_ipv6_nexthop (struct bgp_info *info)
|
|||||||
struct in6_addr *nexthop = NULL;
|
struct in6_addr *nexthop = NULL;
|
||||||
|
|
||||||
/* Only global address nexthop exists. */
|
/* Only global address nexthop exists. */
|
||||||
if (info->attr->extra->mp_nexthop_len == 16)
|
if (info->attr->extra->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL)
|
||||||
nexthop = &info->attr->extra->mp_nexthop_global;
|
nexthop = &info->attr->extra->mp_nexthop_global;
|
||||||
|
|
||||||
/* If both global and link-local address present. */
|
/* If both global and link-local address present. */
|
||||||
if (info->attr->extra->mp_nexthop_len == 32)
|
if (info->attr->extra->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL)
|
||||||
{
|
{
|
||||||
/* Workaround for Cisco's nexthop bug. */
|
/* Workaround for Cisco's nexthop bug. */
|
||||||
if (IN6_IS_ADDR_UNSPECIFIED (&info->attr->extra->mp_nexthop_global)
|
if (IN6_IS_ADDR_UNSPECIFIED (&info->attr->extra->mp_nexthop_global)
|
||||||
@ -1186,7 +1186,7 @@ bgp_zebra_announce (struct prefix *p, struct bgp_info *info, struct bgp *bgp,
|
|||||||
|
|
||||||
if (nexthop)
|
if (nexthop)
|
||||||
{
|
{
|
||||||
if (info->attr->extra->mp_nexthop_len == 32)
|
if (info->attr->extra->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL)
|
||||||
if (info->peer->nexthop.ifp)
|
if (info->peer->nexthop.ifp)
|
||||||
ifindex = info->peer->nexthop.ifp->ifindex;
|
ifindex = info->peer->nexthop.ifp->ifindex;
|
||||||
|
|
||||||
@ -1224,7 +1224,7 @@ bgp_zebra_announce (struct prefix *p, struct bgp_info *info, struct bgp *bgp,
|
|||||||
if (nexthop == NULL)
|
if (nexthop == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (mpinfo->attr->extra->mp_nexthop_len == 32)
|
if (mpinfo->attr->extra->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL)
|
||||||
if (mpinfo->peer->nexthop.ifp)
|
if (mpinfo->peer->nexthop.ifp)
|
||||||
ifindex = mpinfo->peer->nexthop.ifp->ifindex;
|
ifindex = mpinfo->peer->nexthop.ifp->ifindex;
|
||||||
|
|
||||||
@ -1391,11 +1391,11 @@ bgp_zebra_withdraw (struct prefix *p, struct bgp_info *info, safi_t safi)
|
|||||||
nexthop = NULL;
|
nexthop = NULL;
|
||||||
|
|
||||||
/* Only global address nexthop exists. */
|
/* Only global address nexthop exists. */
|
||||||
if (info->attr->extra->mp_nexthop_len == 16)
|
if (info->attr->extra->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL)
|
||||||
nexthop = &info->attr->extra->mp_nexthop_global;
|
nexthop = &info->attr->extra->mp_nexthop_global;
|
||||||
|
|
||||||
/* If both global and link-local address present. */
|
/* If both global and link-local address present. */
|
||||||
if (info->attr->extra->mp_nexthop_len == 32)
|
if (info->attr->extra->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL)
|
||||||
{
|
{
|
||||||
nexthop = &info->attr->extra->mp_nexthop_local;
|
nexthop = &info->attr->extra->mp_nexthop_local;
|
||||||
if (info->peer->nexthop.ifp)
|
if (info->peer->nexthop.ifp)
|
||||||
|
Loading…
Reference in New Issue
Block a user