summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_zebra.c4
-rw-r--r--bgpd/rfapi/vnc_zebra.c2
-rw-r--r--isisd/isis_zebra.c4
-rw-r--r--lib/zclient.c12
-rw-r--r--lib/zclient.h3
-rw-r--r--ospf6d/ospf6_zebra.c8
-rw-r--r--ripngd/ripng_zebra.c2
7 files changed, 23 insertions, 12 deletions
diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c
index 8bc7bd3025..7c778122b9 100644
--- a/bgpd/bgp_zebra.c
+++ b/bgpd/bgp_zebra.c
@@ -1587,7 +1587,7 @@ bgp_zebra_announce (struct prefix *p, struct bgp_info *info, struct bgp *bgp,
zapi_ipv6_route (valid_nh_count ?
ZEBRA_IPV6_ROUTE_ADD : ZEBRA_IPV6_ROUTE_DELETE,
- zclient, (struct prefix_ipv6 *) p, &api);
+ zclient, (struct prefix_ipv6 *) p, NULL, &api);
}
}
}
@@ -1725,7 +1725,7 @@ bgp_zebra_withdraw (struct prefix *p, struct bgp_info *info, safi_t safi)
}
zapi_ipv6_route (ZEBRA_IPV6_ROUTE_DELETE, zclient,
- (struct prefix_ipv6 *) p, &api);
+ (struct prefix_ipv6 *) p, NULL, &api);
}
}
diff --git a/bgpd/rfapi/vnc_zebra.c b/bgpd/rfapi/vnc_zebra.c
index 608bc6d3c7..d659e964cd 100644
--- a/bgpd/rfapi/vnc_zebra.c
+++ b/bgpd/rfapi/vnc_zebra.c
@@ -582,7 +582,7 @@ vnc_zebra_route_msg (
zapi_ipv6_route ((add ? ZEBRA_IPV6_NEXTHOP_ADD :
ZEBRA_IPV6_NEXTHOP_DELETE), zclient_vnc,
- (struct prefix_ipv6 *) p, &api);
+ (struct prefix_ipv6 *) p, NULL, &api);
}
else
{
diff --git a/isisd/isis_zebra.c b/isisd/isis_zebra.c
index dfb9b4d7ab..e7bd99c3e8 100644
--- a/isisd/isis_zebra.c
+++ b/isisd/isis_zebra.c
@@ -424,7 +424,7 @@ isis_zebra_route_add_ipv6 (struct prefix *prefix,
prefix6.family = AF_INET6;
prefix6.prefixlen = prefix->prefixlen;
memcpy (&prefix6.prefix, &prefix->u.prefix6, sizeof (struct in6_addr));
- zapi_ipv6_route (ZEBRA_IPV6_ROUTE_ADD, zclient, &prefix6, &api);
+ zapi_ipv6_route (ZEBRA_IPV6_ROUTE_ADD, zclient, &prefix6, NULL, &api);
SET_FLAG (route_info->flag, ISIS_ROUTE_FLAG_ZEBRA_SYNCED);
UNSET_FLAG (route_info->flag, ISIS_ROUTE_FLAG_ZEBRA_RESYNC);
}
@@ -505,7 +505,7 @@ isis_zebra_route_del_ipv6 (struct prefix *prefix,
prefix6.family = AF_INET6;
prefix6.prefixlen = prefix->prefixlen;
memcpy (&prefix6.prefix, &prefix->u.prefix6, sizeof (struct in6_addr));
- zapi_ipv6_route (ZEBRA_IPV6_ROUTE_DELETE, zclient, &prefix6, &api);
+ zapi_ipv6_route (ZEBRA_IPV6_ROUTE_DELETE, zclient, &prefix6, NULL, &api);
UNSET_FLAG (route_info->flag, ISIS_ROUTE_FLAG_ZEBRA_SYNCED);
}
diff --git a/lib/zclient.c b/lib/zclient.c
index 42fa41c9c8..92662fd70f 100644
--- a/lib/zclient.c
+++ b/lib/zclient.c
@@ -854,12 +854,15 @@ zapi_ipv4_route_ipv6_nexthop (u_char cmd, struct zclient *zclient,
int
zapi_ipv6_route (u_char cmd, struct zclient *zclient, struct prefix_ipv6 *p,
- struct zapi_ipv6 *api)
+ struct prefix_ipv6 *src_p, struct zapi_ipv6 *api)
{
int i;
int psize;
struct stream *s;
+ /* either we have !SRCPFX && src_p == NULL, or SRCPFX && src_p != NULL */
+ assert (!(api->message & ZAPI_MESSAGE_SRCPFX) == !src_p);
+
/* Reset stream. */
s = zclient->obuf;
stream_reset (s);
@@ -878,6 +881,13 @@ zapi_ipv6_route (u_char cmd, struct zclient *zclient, struct prefix_ipv6 *p,
stream_putc (s, p->prefixlen);
stream_write (s, (u_char *)&p->prefix, psize);
+ if (CHECK_FLAG (api->message, ZAPI_MESSAGE_SRCPFX))
+ {
+ psize = PSIZE (src_p->prefixlen);
+ stream_putc (s, src_p->prefixlen);
+ stream_write (s, (u_char *)&src_p->prefix, psize);
+ }
+
/* Nexthop, ifindex, distance and metric information. */
if (CHECK_FLAG (api->message, ZAPI_MESSAGE_NEXTHOP))
{
diff --git a/lib/zclient.h b/lib/zclient.h
index 7808fd804f..6b1a18a311 100644
--- a/lib/zclient.h
+++ b/lib/zclient.h
@@ -246,7 +246,8 @@ struct zapi_ipv6
};
extern int zapi_ipv6_route (u_char cmd, struct zclient *zclient,
- struct prefix_ipv6 *p, struct zapi_ipv6 *api);
+ struct prefix_ipv6 *p, struct prefix_ipv6 *src_p,
+ struct zapi_ipv6 *api);
extern int zapi_ipv4_route_ipv6_nexthop (u_char, struct zclient *,
struct prefix_ipv4 *, struct zapi_ipv6 *);
diff --git a/ospf6d/ospf6_zebra.c b/ospf6d/ospf6_zebra.c
index a5303fb1b8..c20311e92f 100644
--- a/ospf6d/ospf6_zebra.c
+++ b/ospf6d/ospf6_zebra.c
@@ -463,9 +463,9 @@ ospf6_zebra_route_update (int type, struct ospf6_route *request)
api.distance = ospf6_distance_apply (dest, request);
if (type == REM)
- ret = zapi_ipv6_route (ZEBRA_IPV6_ROUTE_DELETE, zclient, dest, &api);
+ ret = zapi_ipv6_route (ZEBRA_IPV6_ROUTE_DELETE, zclient, dest, NULL, &api);
else
- ret = zapi_ipv6_route (ZEBRA_IPV6_ROUTE_ADD, zclient, dest, &api);
+ ret = zapi_ipv6_route (ZEBRA_IPV6_ROUTE_ADD, zclient, dest, NULL, &api);
if (ret < 0)
zlog_err ("zapi_ipv6_route() %s failed: %s",
@@ -527,7 +527,7 @@ ospf6_zebra_add_discard (struct ospf6_route *request)
dest = (struct prefix_ipv6 *) &request->prefix;
- zapi_ipv6_route (ZEBRA_IPV6_ROUTE_ADD, zclient, dest, &api);
+ zapi_ipv6_route (ZEBRA_IPV6_ROUTE_ADD, zclient, dest, NULL, &api);
if (IS_OSPF6_DEBUG_ZEBRA (SEND))
zlog_debug ("Zebra: Route add discard %s/%d",
@@ -572,7 +572,7 @@ ospf6_zebra_delete_discard (struct ospf6_route *request)
dest = (struct prefix_ipv6 *) &request->prefix;
- zapi_ipv6_route (ZEBRA_IPV6_ROUTE_DELETE, zclient, dest, &api);
+ zapi_ipv6_route (ZEBRA_IPV6_ROUTE_DELETE, zclient, dest, NULL, &api);
if (IS_OSPF6_DEBUG_ZEBRA (SEND))
zlog_debug ("Zebra: Route delete discard %s/%d",
diff --git a/ripngd/ripng_zebra.c b/ripngd/ripng_zebra.c
index 5de785a6b8..970aa14df6 100644
--- a/ripngd/ripng_zebra.c
+++ b/ripngd/ripng_zebra.c
@@ -99,7 +99,7 @@ ripng_zebra_ipv6_send (struct route_node *rp, u_char cmd)
}
zapi_ipv6_route (cmd, zclient,
- (struct prefix_ipv6 *)&rp->p, &api);
+ (struct prefix_ipv6 *)&rp->p, NULL, &api);
if (IS_RIPNG_DEBUG_ZEBRA)
{