Use #define for mp_nexthop_len values

This commit is contained in:
Donald Sharp 2015-05-19 18:04:00 -07:00
parent fa5f7ad597
commit 801a9bcc7f
10 changed files with 81 additions and 73 deletions

View File

@ -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);

View File

@ -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.

View File

@ -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));

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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)
{ {

View File

@ -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;
} }
} }

View File

@ -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 */

View File

@ -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)