summaryrefslogtreecommitdiff
path: root/bgpd
diff options
context:
space:
mode:
authorStephen Hemminger <shemminger@vyatta.com>2011-12-06 14:51:10 +0400
committerDenis Ovsienko <infrastation@yandex.ru>2012-01-02 17:15:19 +0400
commit840faaeb00f1617649332dad82952e21e7c7fda7 (patch)
tree571cda4238b579ce571bf17cc42423fa12b9ba06 /bgpd
parent4fafd3deef6eecab229e8b35189ffbc1f1ce9806 (diff)
bgpd: store nexthop info for redistributed IPV6 routes
BGP was ignoring nexthop info for static and other redistributed routes for IPv6. Build extra attribute info to store the nexthop. See also: https://bugzilla.vyatta.com/show_bug.cgi?id=6073
Diffstat (limited to 'bgpd')
-rw-r--r--bgpd/bgp_route.c12
-rw-r--r--bgpd/bgp_route.h4
-rw-r--r--bgpd/bgp_zebra.c27
3 files changed, 31 insertions, 12 deletions
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index b7716330..98e49bcd 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -5238,7 +5238,8 @@ ALIAS (no_ipv6_aggregate_address_summary_only,
/* Redistribute route treatment. */
void
-bgp_redistribute_add (struct prefix *p, struct in_addr *nexthop,
+bgp_redistribute_add (struct prefix *p, const struct in_addr *nexthop,
+ const struct in6_addr *nexthop6,
u_int32_t metric, u_char type)
{
struct bgp *bgp;
@@ -5258,6 +5259,15 @@ bgp_redistribute_add (struct prefix *p, struct in_addr *nexthop,
if (nexthop)
attr.nexthop = *nexthop;
+#ifdef HAVE_IPV6
+ if (nexthop6)
+ {
+ struct attr_extra *extra = bgp_attr_extra_get(&attr);
+ extra->mp_nexthop_global = *nexthop6;
+ extra->mp_nexthop_len = 16;
+ }
+#endif
+
attr.med = metric;
attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
diff --git a/bgpd/bgp_route.h b/bgpd/bgp_route.h
index 3e528596..7adc573b 100644
--- a/bgpd/bgp_route.h
+++ b/bgpd/bgp_route.h
@@ -192,7 +192,9 @@ extern int bgp_nlri_parse (struct peer *, struct attr *, struct bgp_nlri *);
extern int bgp_maximum_prefix_overflow (struct peer *, afi_t, safi_t, int);
-extern void bgp_redistribute_add (struct prefix *, struct in_addr *, u_int32_t, u_char);
+extern void bgp_redistribute_add (struct prefix *, const struct in_addr *,
+ const struct in6_addr *,
+ u_int32_t, u_char);
extern void bgp_redistribute_delete (struct prefix *, u_char);
extern void bgp_redistribute_withdraw (struct bgp *, afi_t, int);
diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c
index f3baeee0..d7af349a 100644
--- a/bgpd/bgp_zebra.c
+++ b/bgpd/bgp_zebra.c
@@ -281,7 +281,8 @@ zebra_read_ipv4 (int command, struct zclient *zclient, zebra_size_t length)
inet_ntop(AF_INET, &nexthop, buf[1], sizeof(buf[1])),
api.metric);
}
- bgp_redistribute_add((struct prefix *)&p, &nexthop, api.metric, api.type);
+ bgp_redistribute_add((struct prefix *)&p, &nexthop, NULL,
+ api.metric, api.type);
}
else
{
@@ -356,23 +357,29 @@ zebra_read_ipv6 (int command, struct zclient *zclient, zebra_size_t length)
{
if (BGP_DEBUG(zebra, ZEBRA))
{
- char buf[INET6_ADDRSTRLEN];
- zlog_debug("Zebra rcvd: IPv6 route add %s %s/%d metric %u",
+ char buf[2][INET6_ADDRSTRLEN];
+ zlog_debug("Zebra rcvd: IPv6 route add %s %s/%d nexthop %s metric %u",
zebra_route_string(api.type),
- inet_ntop(AF_INET6, &p.prefix, buf, sizeof(buf)),
- p.prefixlen, api.metric);
+ inet_ntop(AF_INET6, &p.prefix, buf[0], sizeof(buf[0])),
+ p.prefixlen,
+ inet_ntop(AF_INET, &nexthop, buf[1], sizeof(buf[1])),
+ api.metric);
}
- bgp_redistribute_add ((struct prefix *)&p, NULL, api.metric, api.type);
+ bgp_redistribute_add ((struct prefix *)&p, NULL, &nexthop,
+ api.metric, api.type);
}
else
{
if (BGP_DEBUG(zebra, ZEBRA))
{
- char buf[INET6_ADDRSTRLEN];
- zlog_debug("Zebra rcvd: IPv6 route delete %s %s/%d metric %u",
+ char buf[2][INET6_ADDRSTRLEN];
+ zlog_debug("Zebra rcvd: IPv6 route delete %s %s/%d "
+ "nexthop %s metric %u",
zebra_route_string(api.type),
- inet_ntop(AF_INET6, &p.prefix, buf, sizeof(buf)),
- p.prefixlen, api.metric);
+ inet_ntop(AF_INET6, &p.prefix, buf[0], sizeof(buf[0])),
+ p.prefixlen,
+ inet_ntop(AF_INET6, &nexthop, buf[1], sizeof(buf[1])),
+ api.metric);
}
bgp_redistribute_delete ((struct prefix *) &p, api.type);
}