summaryrefslogtreecommitdiff
path: root/ldpd/ldp_zebra.c
diff options
context:
space:
mode:
Diffstat (limited to 'ldpd/ldp_zebra.c')
-rw-r--r--ldpd/ldp_zebra.c80
1 files changed, 53 insertions, 27 deletions
diff --git a/ldpd/ldp_zebra.c b/ldpd/ldp_zebra.c
index 71c0a21dd4..12954b91af 100644
--- a/ldpd/ldp_zebra.c
+++ b/ldpd/ldp_zebra.c
@@ -100,10 +100,10 @@ zebra_send_mpls_labels(int cmd, struct kroute *kr)
kr->remote_label == NO_LABEL)
return (0);
- debug_zebra_out("prefix %s/%u nexthop %s labels %s/%s (%s)",
+ debug_zebra_out("prefix %s/%u nexthop %s ifindex %u labels %s/%s (%s)",
log_addr(kr->af, &kr->prefix), kr->prefixlen,
- log_addr(kr->af, &kr->nexthop), log_label(kr->local_label),
- log_label(kr->remote_label),
+ log_addr(kr->af, &kr->nexthop), kr->ifindex,
+ log_label(kr->local_label), log_label(kr->remote_label),
(cmd == ZEBRA_MPLS_LABELS_ADD) ? "add" : "delete");
/* Reset stream. */
@@ -127,6 +127,7 @@ zebra_send_mpls_labels(int cmd, struct kroute *kr)
default:
fatalx("kr_change: unknown af");
}
+ stream_putl(s, kr->ifindex);
stream_putc(s, kr->priority);
stream_putl(s, kr->local_label);
stream_putl(s, kr->remote_label);
@@ -352,7 +353,7 @@ ldp_zebra_read_route(int command, struct zclient *zclient, zebra_size_t length,
u_char type;
u_char message_flags;
struct kroute kr;
- int nhnum, nhlen;
+ int nhnum = 0, nhlen;
size_t nhmark;
memset(&kr, 0, sizeof(kr));
@@ -373,8 +374,6 @@ ldp_zebra_read_route(int command, struct zclient *zclient, zebra_size_t length,
stream_getl(s); /* flags, unused */
stream_getw(s); /* instance, unused */
message_flags = stream_getc(s);
- if (!CHECK_FLAG(message_flags, ZAPI_MESSAGE_NEXTHOP))
- return (0);
switch (command) {
case ZEBRA_REDISTRIBUTE_IPV4_ADD:
@@ -397,16 +396,46 @@ ldp_zebra_read_route(int command, struct zclient *zclient, zebra_size_t length,
(kr.af == AF_INET6 && IN6_IS_SCOPE_EMBED(&kr.prefix.v6)))
return (0);
- nhnum = stream_getc(s);
- nhmark = stream_get_getp(s);
- stream_set_getp(s, nhmark + nhnum * (nhlen + 5));
+ 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);
+ }
+
+ if (CHECK_FLAG(message_flags, ZAPI_MESSAGE_NEXTHOP)) {
+ nhnum = stream_getc(s);
+ nhmark = stream_get_getp(s);
+ stream_set_getp(s, nhmark + nhnum * (nhlen + 5));
+ }
if (CHECK_FLAG(message_flags, ZAPI_MESSAGE_DISTANCE))
kr.priority = stream_getc(s);
if (CHECK_FLAG(message_flags, ZAPI_MESSAGE_METRIC))
stream_getl(s); /* metric, not used */
- stream_set_getp(s, nhmark);
+ if (CHECK_FLAG(message_flags, ZAPI_MESSAGE_NEXTHOP))
+ stream_set_getp(s, nhmark);
+
+ if (nhnum == 0) {
+ switch (command) {
+ case ZEBRA_REDISTRIBUTE_IPV4_ADD:
+ case ZEBRA_REDISTRIBUTE_IPV6_ADD:
+ return (0);
+ case ZEBRA_REDISTRIBUTE_IPV4_DEL:
+ case ZEBRA_REDISTRIBUTE_IPV6_DEL:
+ debug_zebra_in("route delete %s/%d (%s)",
+ log_addr(kr.af, &kr.prefix), kr.prefixlen,
+ zebra_route_string(type));
+ break;
+ default:
+ fatalx("ldp_zebra_read_route: unknown command");
+ }
+ }
/* loop through all the nexthops */
for (; nhnum > 0; nhnum--) {
@@ -426,30 +455,19 @@ ldp_zebra_read_route(int command, struct zclient *zclient, zebra_size_t length,
switch (command) {
case ZEBRA_REDISTRIBUTE_IPV4_ADD:
case ZEBRA_REDISTRIBUTE_IPV6_ADD:
- debug_zebra_in("route add %s/%d nexthop %s (%s)",
- log_addr(kr.af, &kr.prefix), kr.prefixlen,
- log_addr(kr.af, &kr.nexthop),
- zebra_route_string(type));
+ debug_zebra_in("route add %s/%d nexthop %s "
+ "ifindex %u (%s)", log_addr(kr.af, &kr.prefix),
+ kr.prefixlen, log_addr(kr.af, &kr.nexthop),
+ kr.ifindex, zebra_route_string(type));
main_imsg_compose_lde(IMSG_NETWORK_ADD, 0, &kr,
sizeof(kr));
break;
- case ZEBRA_REDISTRIBUTE_IPV4_DEL:
- case ZEBRA_REDISTRIBUTE_IPV6_DEL:
- debug_zebra_in("route delete %s/%d nexthop %s (%s)",
- log_addr(kr.af, &kr.prefix), kr.prefixlen,
- log_addr(kr.af, &kr.nexthop),
- zebra_route_string(type));
- main_imsg_compose_lde(IMSG_NETWORK_DEL, 0, &kr,
- sizeof(kr));
- break;
default:
- fatalx("ldp_zebra_read_route: unknown command");
+ break;
}
}
- if (command == ZEBRA_REDISTRIBUTE_IPV4_ADD ||
- command == ZEBRA_REDISTRIBUTE_IPV6_ADD)
- main_imsg_compose_lde(IMSG_NETWORK_ADD_END, 0, &kr, sizeof(kr));
+ main_imsg_compose_lde(IMSG_NETWORK_UPDATE, 0, &kr, sizeof(kr));
return (0);
}
@@ -485,3 +503,11 @@ ldp_zebra_init(struct thread_master *master)
zclient->redistribute_route_ipv6_add = ldp_zebra_read_route;
zclient->redistribute_route_ipv6_del = ldp_zebra_read_route;
}
+
+void
+ldp_zebra_destroy(void)
+{
+ zclient_stop(zclient);
+ zclient_free(zclient);
+ zclient = NULL;
+}