summaryrefslogtreecommitdiff
path: root/bgpd/bgp_zebra.c
diff options
context:
space:
mode:
Diffstat (limited to 'bgpd/bgp_zebra.c')
-rw-r--r--bgpd/bgp_zebra.c43
1 files changed, 25 insertions, 18 deletions
diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c
index 6c21230a..5c0dbb88 100644
--- a/bgpd/bgp_zebra.c
+++ b/bgpd/bgp_zebra.c
@@ -236,12 +236,10 @@ zebra_read_ipv4 (int command, struct zclient *zclient, zebra_size_t length)
{
struct stream *s;
struct zapi_ipv4 api;
- unsigned long ifindex;
struct in_addr nexthop;
struct prefix_ipv4 p;
s = zclient->ibuf;
- ifindex = 0;
nexthop.s_addr = 0;
/* Type, flags, message. */
@@ -264,7 +262,7 @@ zebra_read_ipv4 (int command, struct zclient *zclient, zebra_size_t length)
if (CHECK_FLAG (api.message, ZAPI_MESSAGE_IFINDEX))
{
api.ifindex_num = stream_getc (s);
- ifindex = stream_getl (s);
+ stream_getl (s); /* ifindex, unused */
}
if (CHECK_FLAG (api.message, ZAPI_MESSAGE_DISTANCE))
api.distance = stream_getc (s);
@@ -285,7 +283,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
{
@@ -313,12 +312,10 @@ zebra_read_ipv6 (int command, struct zclient *zclient, zebra_size_t length)
{
struct stream *s;
struct zapi_ipv6 api;
- unsigned long ifindex;
struct in6_addr nexthop;
struct prefix_ipv6 p;
s = zclient->ibuf;
- ifindex = 0;
memset (&nexthop, 0, sizeof (struct in6_addr));
/* Type, flags, message. */
@@ -341,7 +338,7 @@ zebra_read_ipv6 (int command, struct zclient *zclient, zebra_size_t length)
if (CHECK_FLAG (api.message, ZAPI_MESSAGE_IFINDEX))
{
api.ifindex_num = stream_getc (s);
- ifindex = stream_getl (s);
+ stream_getl (s); /* ifindex, unused */
}
if (CHECK_FLAG (api.message, ZAPI_MESSAGE_DISTANCE))
api.distance = stream_getc (s);
@@ -360,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);
}
@@ -644,7 +647,7 @@ bgp_nexthop_set (union sockunion *local, union sockunion *remote,
}
void
-bgp_zebra_announce (struct prefix *p, struct bgp_info *info, struct bgp *bgp)
+bgp_zebra_announce (struct prefix *p, struct bgp_info *info, struct bgp *bgp, safi_t safi)
{
int flags;
u_char distance;
@@ -703,6 +706,7 @@ bgp_zebra_announce (struct prefix *p, struct bgp_info *info, struct bgp *bgp)
api.type = ZEBRA_ROUTE_BGP;
api.message = 0;
+ api.safi = safi;
SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP);
api.nexthop_num = 1 + bgp_info_mpath_count (info);
api.nexthop = (struct in_addr **)STREAM_DATA (bgp_nexthop_buf);
@@ -783,6 +787,7 @@ bgp_zebra_announce (struct prefix *p, struct bgp_info *info, struct bgp *bgp)
api.flags = flags;
api.type = ZEBRA_ROUTE_BGP;
api.message = 0;
+ api.safi = safi;
SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP);
api.nexthop_num = 1;
api.nexthop = &nexthop;
@@ -809,7 +814,7 @@ bgp_zebra_announce (struct prefix *p, struct bgp_info *info, struct bgp *bgp)
}
void
-bgp_zebra_withdraw (struct prefix *p, struct bgp_info *info)
+bgp_zebra_withdraw (struct prefix *p, struct bgp_info *info, safi_t safi)
{
int flags;
struct peer *peer;
@@ -843,6 +848,7 @@ bgp_zebra_withdraw (struct prefix *p, struct bgp_info *info)
api.type = ZEBRA_ROUTE_BGP;
api.message = 0;
+ api.safi = safi;
SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP);
api.nexthop_num = 1;
api.nexthop = &nexthop;
@@ -898,6 +904,7 @@ bgp_zebra_withdraw (struct prefix *p, struct bgp_info *info)
api.flags = flags;
api.type = ZEBRA_ROUTE_BGP;
api.message = 0;
+ api.safi = safi;
SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP);
api.nexthop_num = 1;
api.nexthop = &nexthop;