Re: bgpd fix bgpctl show network

2022-08-10 Thread Theo Buehler
On Wed, Aug 10, 2022 at 11:59:30AM +0200, Claudio Jeker wrote:
> When introducing prefix_nhvalid(p) the code in network_dump_upcall()
> was not correctly adjusted:
> 
> Before:
>   if (prefix_nexthop(p) == NULL ||
>   prefix_nexthop(p)->state != NEXTHOP_REACH)
>   kf.nexthop.aid = kf.prefix.aid;
>   else
>   kf.nexthop = prefix_nexthop(p)->true_nexthop;
> 
> Now:
>   if (prefix_nhvalid(p))
>   kf.nexthop.aid = kf.prefix.aid;
>   else
>   kf.nexthop = prefix_nexthop(p)->true_nexthop;
> 
> What it should be:
> 
>   if (prefix_nhvalid(p) &&  prefix_nexthop(p) != NULL)
>   kf.nexthop = prefix_nexthop(p)->exit_nexthop;
>   else
>   kf.nexthop.aid = kf.prefix.aid;
> 
> If the nexthop is valid we want to show it but in most cases the nexthop
> of announced networks is NULL so make sure we don't dereference NULL.
> Also I think it makes more sense to show the exit_nexthop (which is what
> is shown in show rib output by default). It is also what will be sent to
> the peers.
> 
> While there adjust the code to be a bit more logical and modern.

This all makes sense and is much nicer this way.

ok

> -- 
> :wq Claudio
> 
> Index: rde.c
> ===
> RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v
> retrieving revision 1.560
> diff -u -p -r1.560 rde.c
> --- rde.c 28 Jul 2022 13:11:50 -  1.560
> +++ rde.c 10 Aug 2022 09:56:51 -
> @@ -4247,14 +4247,13 @@ network_dump_upcall(struct rib_entry *re
>   continue;
>   pt_getaddr(p->pt, &addr);
>  
> - bzero(&kf, sizeof(kf));
> - memcpy(&kf.prefix, &addr, sizeof(kf.prefix));
> - if (prefix_nhvalid(p))
> - kf.nexthop.aid = kf.prefix.aid;
> - else
> - memcpy(&kf.nexthop, &prefix_nexthop(p)->true_nexthop,
> - sizeof(kf.nexthop));
> + memset(&kf, 0, sizeof(kf));
> + kf.prefix = addr;
>   kf.prefixlen = p->pt->prefixlen;
> + if (prefix_nhvalid(p) && prefix_nexthop(p) != NULL)
> + kf.nexthop = prefix_nexthop(p)->exit_nexthop;
> + else
> + kf.nexthop.aid = kf.prefix.aid;
>   if ((asp->flags & F_ANN_DYNAMIC) == 0)
>   kf.flags = F_STATIC;
>   if (imsg_compose(ibuf_se_ctl, IMSG_CTL_SHOW_NETWORK, 0,
> 



bgpd fix bgpctl show network

2022-08-10 Thread Claudio Jeker
When introducing prefix_nhvalid(p) the code in network_dump_upcall()
was not correctly adjusted:

Before:
if (prefix_nexthop(p) == NULL ||
prefix_nexthop(p)->state != NEXTHOP_REACH)
kf.nexthop.aid = kf.prefix.aid;
else
kf.nexthop = prefix_nexthop(p)->true_nexthop;

Now:
if (prefix_nhvalid(p))
kf.nexthop.aid = kf.prefix.aid;
else
kf.nexthop = prefix_nexthop(p)->true_nexthop;

What it should be:

if (prefix_nhvalid(p) &&  prefix_nexthop(p) != NULL)
kf.nexthop = prefix_nexthop(p)->exit_nexthop;
else
kf.nexthop.aid = kf.prefix.aid;

If the nexthop is valid we want to show it but in most cases the nexthop
of announced networks is NULL so make sure we don't dereference NULL.
Also I think it makes more sense to show the exit_nexthop (which is what
is shown in show rib output by default). It is also what will be sent to
the peers.

While there adjust the code to be a bit more logical and modern.
-- 
:wq Claudio

Index: rde.c
===
RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v
retrieving revision 1.560
diff -u -p -r1.560 rde.c
--- rde.c   28 Jul 2022 13:11:50 -  1.560
+++ rde.c   10 Aug 2022 09:56:51 -
@@ -4247,14 +4247,13 @@ network_dump_upcall(struct rib_entry *re
continue;
pt_getaddr(p->pt, &addr);
 
-   bzero(&kf, sizeof(kf));
-   memcpy(&kf.prefix, &addr, sizeof(kf.prefix));
-   if (prefix_nhvalid(p))
-   kf.nexthop.aid = kf.prefix.aid;
-   else
-   memcpy(&kf.nexthop, &prefix_nexthop(p)->true_nexthop,
-   sizeof(kf.nexthop));
+   memset(&kf, 0, sizeof(kf));
+   kf.prefix = addr;
kf.prefixlen = p->pt->prefixlen;
+   if (prefix_nhvalid(p) && prefix_nexthop(p) != NULL)
+   kf.nexthop = prefix_nexthop(p)->exit_nexthop;
+   else
+   kf.nexthop.aid = kf.prefix.aid;
if ((asp->flags & F_ANN_DYNAMIC) == 0)
kf.flags = F_STATIC;
if (imsg_compose(ibuf_se_ctl, IMSG_CTL_SHOW_NETWORK, 0,