Re: ospf6d: update to connected routes

2020-04-05 Thread Remi Locherer
On Wed, Apr 01, 2020 at 08:50:45PM +0200, Denis Fondras wrote:
> Handle connected routes as ospfd(8) does.
> 
> (diff to ospf6d and ospf6ctl)

OK remi@

> 
> Index: ospf6ctl/ospf6ctl.c
> ===
> RCS file: /cvs/src/usr.sbin/ospf6ctl/ospf6ctl.c,v
> retrieving revision 1.50
> diff -u -p -r1.50 ospf6ctl.c
> --- ospf6ctl/ospf6ctl.c   26 May 2019 09:27:09 -  1.50
> +++ ospf6ctl/ospf6ctl.c   1 Apr 2020 18:16:12 -
> @@ -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(>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;
> Index: ospf6d/ospf6d.h
> ===
> RCS file: /cvs/src/usr.sbin/ospf6d/ospf6d.h,v
> retrieving revision 1.45
> diff -u -p -r1.45 ospf6d.h
> --- ospf6d/ospf6d.h   21 Jan 2020 20:38:52 -  1.45
> +++ ospf6d/ospf6d.h   1 Apr 2020 18:16:12 -
> @@ -483,6 +483,7 @@ struct ctl_rt {
>   enum dst_typed_type;
>   u_int8_t flags;
>   u_int8_t prefixlen;
> + u_int8_t connected;
>  };
>  
>  struct ctl_sum {
> Index: ospf6d/rde.c
> ===
> RCS file: /cvs/src/usr.sbin/ospf6d/rde.c,v
> retrieving revision 1.85
> diff -u -p -r1.85 rde.c
> --- ospf6d/rde.c  29 Mar 2020 11:59:11 -  1.85
> +++ ospf6d/rde.c  1 Apr 2020 18:16:12 -
> @@ -886,6 +886,9 @@ rde_send_change_kroute(struct rt_node *r
>   TAILQ_FOREACH(rn, >nexthop, entry) {
>   if (rn->invalid)
>   continue;
> + if (rn->connected)
> + /* skip self-originated routes */
> + continue;
>   krcount++;
>  
>   bzero(, sizeof(kr));
> @@ -899,8 +902,12 @@ rde_send_change_kroute(struct rt_node *r
>   kr.ext_tag = r->ext_tag;
>   imsg_add(wbuf, , 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(_main->ibuf, wbuf);
>   imsg_event_add(iev_main);
> Index: ospf6d/rde_spf.c
> ===
> RCS file: /cvs/src/usr.sbin/ospf6d/rde_spf.c,v
> retrieving revision 1.27
> diff -u -p -r1.27 rde_spf.c
> --- ospf6d/rde_spf.c  29 Mar 2020 11:59:11 -  1.27
> +++ ospf6d/rde_spf.c  1 Apr 2020 18:16:12 -
> @@ -897,7 +897,9 @@ rt_nexthop_add(struct rt_node *r, struct
>   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(>nexthop));
>   rn->invalid = 0;
>  
>   r->invalid = 0;
> @@ -952,21 +954,24 @@ rt_dump(struct in_addr area, pid_t pid, 
>   fatalx("rt_dump: invalid RIB type");
>   }
>  
> + memset(, 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, >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;
> - 

ospf6d: update to connected routes

2020-04-01 Thread Denis Fondras
Handle connected routes as ospfd(8) does.

(diff to ospf6d and ospf6ctl)

Index: ospf6ctl/ospf6ctl.c
===
RCS file: /cvs/src/usr.sbin/ospf6ctl/ospf6ctl.c,v
retrieving revision 1.50
diff -u -p -r1.50 ospf6ctl.c
--- ospf6ctl/ospf6ctl.c 26 May 2019 09:27:09 -  1.50
+++ ospf6ctl/ospf6ctl.c 1 Apr 2020 18:16:12 -
@@ -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(>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;
Index: ospf6d/ospf6d.h
===
RCS file: /cvs/src/usr.sbin/ospf6d/ospf6d.h,v
retrieving revision 1.45
diff -u -p -r1.45 ospf6d.h
--- ospf6d/ospf6d.h 21 Jan 2020 20:38:52 -  1.45
+++ ospf6d/ospf6d.h 1 Apr 2020 18:16:12 -
@@ -483,6 +483,7 @@ struct ctl_rt {
enum dst_typed_type;
u_int8_t flags;
u_int8_t prefixlen;
+   u_int8_t connected;
 };
 
 struct ctl_sum {
Index: ospf6d/rde.c
===
RCS file: /cvs/src/usr.sbin/ospf6d/rde.c,v
retrieving revision 1.85
diff -u -p -r1.85 rde.c
--- ospf6d/rde.c29 Mar 2020 11:59:11 -  1.85
+++ ospf6d/rde.c1 Apr 2020 18:16:12 -
@@ -886,6 +886,9 @@ rde_send_change_kroute(struct rt_node *r
TAILQ_FOREACH(rn, >nexthop, entry) {
if (rn->invalid)
continue;
+   if (rn->connected)
+   /* skip self-originated routes */
+   continue;
krcount++;
 
bzero(, sizeof(kr));
@@ -899,8 +902,12 @@ rde_send_change_kroute(struct rt_node *r
kr.ext_tag = r->ext_tag;
imsg_add(wbuf, , 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(_main->ibuf, wbuf);
imsg_event_add(iev_main);
Index: ospf6d/rde_spf.c
===
RCS file: /cvs/src/usr.sbin/ospf6d/rde_spf.c,v
retrieving revision 1.27
diff -u -p -r1.27 rde_spf.c
--- ospf6d/rde_spf.c29 Mar 2020 11:59:11 -  1.27
+++ ospf6d/rde_spf.c1 Apr 2020 18:16:12 -
@@ -897,7 +897,9 @@ rt_nexthop_add(struct rt_node *r, struct
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(>nexthop));
rn->invalid = 0;
 
r->invalid = 0;
@@ -952,21 +954,24 @@ rt_dump(struct in_addr area, pid_t pid, 
fatalx("rt_dump: invalid RIB type");
}
 
+   memset(, 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, >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;