struct stream *s;
struct zapi_ipv6 api;
struct in6_addr nexthop;
- struct prefix_ipv6 p;
+ struct prefix_ipv6 p, src_p;
unsigned int ifindex;
int i;
struct bgp *bgp;
p.prefixlen = MIN(IPV6_MAX_PREFIXLEN, stream_getc (s));
stream_get (&p.prefix, s, PSIZE (p.prefixlen));
+ memset (&src_p, 0, sizeof (struct prefix_ipv6));
+ src_p.family = AF_INET6;
+ if (CHECK_FLAG (api.message, ZAPI_MESSAGE_SRCPFX))
+ {
+ src_p.prefixlen = stream_getc (s);
+ stream_get (&src_p.prefix, s, PSIZE (src_p.prefixlen));
+ }
+
+ if (src_p.prefixlen)
+ /* we completely ignore srcdest routes for now. */
+ return 0;
+
/* Nexthop, ifindex, distance, metric. */
if (CHECK_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP))
{
struct stream *s;
struct zapi_ipv6 api;
struct in6_addr nexthop;
- struct prefix_ipv6 p;
+ struct prefix_ipv6 p, src_p;
s = zclient->ibuf;
memset (&nexthop, 0, sizeof (struct in6_addr));
p.prefixlen = stream_getc (s);
stream_get (&p.prefix, s, PSIZE (p.prefixlen));
+ memset (&src_p, 0, sizeof (struct prefix_ipv6));
+ src_p.family = AF_INET6;
+ if (CHECK_FLAG (api.message, ZAPI_MESSAGE_SRCPFX))
+ {
+ src_p.prefixlen = stream_getc (s);
+ stream_get (&src_p.prefix, s, PSIZE (src_p.prefixlen));
+ }
+
+ if (src_p.prefixlen)
+ /* we completely ignore srcdest routes for now. */
+ return 0;
+
/* Nexthop, ifindex, distance, metric. */
if (CHECK_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP))
{
(kr.af == AF_INET6 && IN6_IS_SCOPE_EMBED(&kr.prefix.v6)))
return (0);
+ if (kr.af == AF_INET6 &&
+ CHECK_FLAG(message_flags, ZAPI_MESSAGE_SRCPFX)) {
+ uint8_t src_prefixlen;
+
+ src_prefixlen = stream_getc(s);
+
+ /* we completely ignore srcdest routes for now. */
+ if (src_prefixlen)
+ return (0);
+ }
+
nhnum = stream_getc(s);
nhmark = stream_get_getp(s);
stream_set_getp(s, nhmark + nhnum * (nhlen + 5));
struct stream *s;
struct zapi_ipv6 api;
unsigned long ifindex;
- struct prefix_ipv6 p;
+ struct prefix_ipv6 p, src_p;
struct in6_addr *nexthop;
if (ospf6 == NULL)
p.prefixlen = MIN(IPV6_MAX_PREFIXLEN, stream_getc (s));
stream_get (&p.prefix, s, PSIZE (p.prefixlen));
+ memset (&src_p, 0, sizeof (struct prefix_ipv6));
+ src_p.family = AF_INET6;
+ if (CHECK_FLAG (api.message, ZAPI_MESSAGE_SRCPFX))
+ {
+ src_p.prefixlen = stream_getc (s);
+ stream_get (&src_p.prefix, s, PSIZE (src_p.prefixlen));
+ }
+
+ if (src_p.prefixlen)
+ /* we completely ignore srcdest routes for now. */
+ return 0;
+
/* Nexthop, ifindex, distance, metric. */
if (CHECK_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP))
{
struct zapi_ipv6 api;
unsigned long ifindex;
struct in6_addr nexthop;
- struct prefix_ipv6 p;
+ struct prefix_ipv6 p, src_p;
s = zclient->ibuf;
ifindex = 0;
p.prefixlen = MIN(IPV6_MAX_PREFIXLEN, stream_getc (s));
stream_get (&p.prefix, s, PSIZE (p.prefixlen));
+ memset (&src_p, 0, sizeof (struct prefix_ipv6));
+ src_p.family = AF_INET6;
+ if (CHECK_FLAG (api.message, ZAPI_MESSAGE_SRCPFX))
+ {
+ src_p.prefixlen = stream_getc (s);
+ stream_get (&src_p.prefix, s, PSIZE (src_p.prefixlen));
+ }
+
+ if (src_p.prefixlen)
+ /* we completely ignore srcdest routes for now. */
+ return 0;
+
/* Nexthop, ifindex, distance, metric. */
if (CHECK_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP))
{