diff --git a/usr.sbin/ospf6ctl/ospf6ctl.c b/usr.sbin/ospf6ctl/ospf6ctl.c index e19a1270f7e..fa1dc2cfd77 100644 --- a/usr.sbin/ospf6ctl/ospf6ctl.c +++ b/usr.sbin/ospf6ctl/ospf6ctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ospf6ctl.c,v 1.50 2019/05/26 09:27:09 remi Exp $ */ +/* $OpenBSD: ospf6ctl.c,v 1.51 2020/04/05 18:19:04 denis Exp $ */ /* * Copyright (c) 2005 Claudio Jeker @@ -1103,10 +1103,10 @@ show_rib_msg(struct imsg *imsg) errx(1, "Invalid route type"); } - printf("%-20s %-17s %-12s %-9s %-7d %s\n", dstnet, + printf("%-20s %-16s%s %-12s %-9s %-7d %s\n", dstnet, log_in6addr_scope(&rt->nexthop, rt->ifindex), - path_type_name(rt->p_type), dst_type_name(rt->d_type), - rt->cost, + rt->connected ? "C" : " ", path_type_name(rt->p_type), + dst_type_name(rt->d_type), rt->cost, rt->uptime == 0 ? "-" : fmt_timeframe_core(rt->uptime)); free(dstnet); break; diff --git a/usr.sbin/ospf6d/ospf6d.h b/usr.sbin/ospf6d/ospf6d.h index a9e4de02a99..797d3cd8e43 100644 --- a/usr.sbin/ospf6d/ospf6d.h +++ b/usr.sbin/ospf6d/ospf6d.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ospf6d.h,v 1.45 2020/01/21 20:38:52 remi Exp $ */ +/* $OpenBSD: ospf6d.h,v 1.46 2020/04/05 18:19:04 denis Exp $ */ /* * Copyright (c) 2004, 2007 Esben Norby @@ -483,6 +483,7 @@ struct ctl_rt { enum dst_type d_type; u_int8_t flags; u_int8_t prefixlen; + u_int8_t connected; }; struct ctl_sum { diff --git a/usr.sbin/ospf6d/rde.c b/usr.sbin/ospf6d/rde.c index f7d82512e7a..c1f8e746888 100644 --- a/usr.sbin/ospf6d/rde.c +++ b/usr.sbin/ospf6d/rde.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rde.c,v 1.85 2020/03/29 11:59:11 denis Exp $ */ +/* $OpenBSD: rde.c,v 1.86 2020/04/05 18:19:04 denis Exp $ */ /* * Copyright (c) 2004, 2005 Claudio Jeker @@ -886,6 +886,9 @@ rde_send_change_kroute(struct rt_node *r) TAILQ_FOREACH(rn, &r->nexthop, entry) { if (rn->invalid) continue; + if (rn->connected) + /* skip self-originated routes */ + continue; krcount++; bzero(&kr, sizeof(kr)); @@ -899,8 +902,12 @@ rde_send_change_kroute(struct rt_node *r) kr.ext_tag = r->ext_tag; imsg_add(wbuf, &kr, sizeof(kr)); } - if (krcount == 0) - fatalx("rde_send_change_kroute: no valid nexthop found"); + if (krcount == 0) { + /* no valid nexthop or self originated, so remove */ + ibuf_free(wbuf); + rde_send_delete_kroute(r); + return; + } imsg_close(&iev_main->ibuf, wbuf); imsg_event_add(iev_main); diff --git a/usr.sbin/ospf6d/rde_spf.c b/usr.sbin/ospf6d/rde_spf.c index 9d675dc87c6..8972914e670 100644 --- a/usr.sbin/ospf6d/rde_spf.c +++ b/usr.sbin/ospf6d/rde_spf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rde_spf.c,v 1.27 2020/03/29 11:59:11 denis Exp $ */ +/* $OpenBSD: rde_spf.c,v 1.28 2020/04/05 18:19:04 denis Exp $ */ /* * Copyright (c) 2005 Esben Norby @@ -897,7 +897,9 @@ rt_nexthop_add(struct rt_node *r, struct v_nexthead *vnh, u_int16_t type, rn->ifindex = vn->ifindex; rn->adv_rtr.s_addr = adv_rtr.s_addr; rn->uptime = now.tv_sec; - rn->connected = vn->prev == spf_root; + rn->connected = (type == LSA_TYPE_NETWORK && + vn->prev == spf_root) || + (IN6_IS_ADDR_UNSPECIFIED(&vn->nexthop)); rn->invalid = 0; r->invalid = 0; @@ -952,21 +954,24 @@ rt_dump(struct in_addr area, pid_t pid, u_int8_t r_type) fatalx("rt_dump: invalid RIB type"); } + memset(&rtctl, 0, sizeof(rtctl)); + rtctl.prefix = r->prefix; + rtctl.area.s_addr = r->area.s_addr; + rtctl.cost = r->cost; + rtctl.cost2 = r->cost2; + rtctl.p_type = r->p_type; + rtctl.d_type = r->d_type; + rtctl.flags = r->flags; + rtctl.prefixlen = r->prefixlen; + TAILQ_FOREACH(rn, &r->nexthop, entry) { if (rn->invalid) continue; - rtctl.prefix = r->prefix; + rtctl.connected = rn->connected; rtctl.nexthop = rn->nexthop; rtctl.ifindex = rn->ifindex; - rtctl.area.s_addr = r->area.s_addr; rtctl.adv_rtr.s_addr = rn->adv_rtr.s_addr; - rtctl.cost = r->cost; - rtctl.cost2 = r->cost2; - rtctl.p_type = r->p_type; - rtctl.d_type = r->d_type; - rtctl.flags = r->flags; - rtctl.prefixlen = r->prefixlen; rtctl.uptime = now.tv_sec - rn->uptime; rde_imsg_compose_ospfe(IMSG_CTL_SHOW_RIB, 0, pid,