diff --git a/kroute.c b/kroute.c index 145b10a..7cdbf97 100644 --- a/kroute.c +++ b/kroute.c @@ -1107,6 +1107,8 @@ send_rtmsg_v4(int fd, int action, struct kroute *kr) hdr.rtm_fmask = RTF_REJECT|RTF_BLACKHOLE; else hdr.rtm_flags = RTF_MPATH; + if (kr->flags & F_BLACKHOLE) + hdr.rtm_flags |= RTF_BLACKHOLE; hdr.rtm_seq = kr_state.rtseq++; /* overflow doesn't matter */ hdr.rtm_msglen = sizeof(hdr); /* adjust iovec */ diff --git a/rde.c b/rde.c index 05c7379..3d1147d 100644 --- a/rde.c +++ b/rde.c @@ -501,11 +501,30 @@ rde_send_change_kroute(struct rt_node *rn, struct eigrp_route *route) memcpy(&kr.nexthop, &route->nexthop, sizeof(kr.nexthop)); else memcpy(&kr.nexthop, &route->nbr->addr, sizeof(kr.nexthop)); - kr.ifindex = route->nbr->ei->iface->ifindex; + if (route->nbr->ei) + kr.ifindex = route->nbr->ei->iface->ifindex; + else { + switch (eigrp->af) { + case AF_INET: + inet_pton(AF_INET, "127.0.0.1", &kr.nexthop.v4); + break; + case AF_INET6: + inet_pton(AF_INET, "::1", &kr.nexthop.v6); + break; + default: + fatalx("rde_send_delete_kroute: unknown af"); + break; + } + kr.flags = F_BLACKHOLE; + } if (route->type == EIGRP_ROUTE_EXTERNAL) kr.priority = rdeconf->fib_priority_external; - else - kr.priority = rdeconf->fib_priority_internal; + else { + if (route->nbr->flags & F_RDE_NBR_SUMMARY) + kr.priority = rdeconf->fib_priority_summary; + else + kr.priority = rdeconf->fib_priority_internal; + } rde_imsg_compose_parent(IMSG_KROUTE_CHANGE, 0, &kr, sizeof(kr)); @@ -529,11 +548,30 @@ rde_send_delete_kroute(struct rt_node *rn, struct eigrp_route *route) memcpy(&kr.nexthop, &route->nexthop, sizeof(kr.nexthop)); else memcpy(&kr.nexthop, &route->nbr->addr, sizeof(kr.nexthop)); - kr.ifindex = route->nbr->ei->iface->ifindex; + if (route->nbr->ei) + kr.ifindex = route->nbr->ei->iface->ifindex; + else { + switch (eigrp->af) { + case AF_INET: + inet_pton(AF_INET, "127.0.0.1", &kr.nexthop.v4); + break; + case AF_INET6: + inet_pton(AF_INET, "::1", &kr.nexthop.v6); + break; + default: + fatalx("rde_send_delete_kroute: unknown af"); + break; + } + kr.flags = F_BLACKHOLE; + } if (route->type == EIGRP_ROUTE_EXTERNAL) kr.priority = rdeconf->fib_priority_external; - else - kr.priority = rdeconf->fib_priority_internal; + else { + if (route->nbr->flags & F_RDE_NBR_SUMMARY) + kr.priority = rdeconf->fib_priority_summary; + else + kr.priority = rdeconf->fib_priority_internal; + } rde_imsg_compose_parent(IMSG_KROUTE_DELETE, 0, &kr, sizeof(kr));