diff options
Diffstat (limited to 'ldpd/ldp_zebra.c')
| -rw-r--r-- | ldpd/ldp_zebra.c | 80 |
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; +} |
