this still removes the interface info I want to see. why do you keep ignoring the advice of replaceing the long valid/invalid words by some kind of marker like we do in the RIB?
<br...@cr10.ham> $ bgpctl sh ri as 24640 flags: * = Valid, > = Selected, I = via IBGP, A = Announced can use the same here. Nexthop Route Gateway Interface *100.200.300.400 62.48.4.0/24 connected vlan206 UP, Ethernet, active 200.200.300.400 62.48.6.0/24 connected vlan207 UP, Ethernet, no carrier voila. * Claudio Jeker <clau...@openbsd.org> [2009-07-22 15:29]: > So here is another try and I guess some people will not like it. > BGP unlike other routing protocols needs to find the true nexthop because > the passed IP in the NEXT_HOP attribute can be more then one hop away. > So bgpd uses the fib (as stored in the parent) to figure out the gateway > for a nexthop. In the beginning we had some troubles with correctly > tracking those nexthops (I think all problems are fixed now but that does > not matter). bgpctl show nexthop should return all necessary information > to understand the decision bgpd did. The current output is missing the > single most important information -- the route that is used to verify this > nexthop. Without this info nobody knows why a wrong nexthop is used. > > This diff sends the kroute to bgpctl so that we can show the route which > got used. > > Nexthop State Route Prio Gateway Iface > 62.48.4.1 valid 62.48.4.0/24 4 connected fxp0 > 62.48.0.1 invalid > > Having the link state in the output would be nice but there are only about > 4-5 char left till we hit the 80-char wide wall. I tried out to use a "*" > for valid nexthops but that single char (even though the most important > one) is easily missed in longer outputs. > > I'm open to suggestions > -- > :wq Claudio > > Index: bgpctl/bgpctl.c > =================================================================== > RCS file: /cvs/src/usr.sbin/bgpctl/bgpctl.c,v > retrieving revision 1.144 > diff -u -p -r1.144 bgpctl.c > --- bgpctl/bgpctl.c 21 Jul 2009 11:49:36 -0000 1.144 > +++ bgpctl/bgpctl.c 22 Jul 2009 13:20:33 -0000 > @@ -848,35 +848,56 @@ show_fib_msg(struct imsg *imsg) > void > show_nexthop_head(void) > { > - printf("%-20s %-10s\n", "Nexthop", "State"); > + printf("%-16s %-7s %-20s%-4s %-16s %-8s\n", "Nexthop", "State", > + "Route", "Prio", "Gateway", "Iface"); > } > > int > show_nexthop_msg(struct imsg *imsg) > { > struct ctl_show_nexthop *p; > - int ifms_type; > + struct kroute *k; > + struct kroute6 *k6; > + char *s; > > switch (imsg->hdr.type) { > case IMSG_CTL_SHOW_NEXTHOP: > p = imsg->data; > - printf("%-20s %-10s", log_addr(&p->addr), > + printf("%-16s %-7s ", log_addr(&p->addr), > p->valid ? "valid" : "invalid"); > + if (!p->krvalid) { > + printf("\n"); > + return (0); > + } > + switch (p->addr.af) { > + case AF_INET: > + k = &p->kr.kr4; > + if (asprintf(&s, "%s/%u", inet_ntoa(k->prefix), > + k->prefixlen) == -1) > + err(1, NULL); > + printf("%-20s", s); > + free(s); > + printf("%4i %-16s ", k->priority, > + k->flags & F_CONNECTED ? "connected" : > + inet_ntoa(k->nexthop)); > + break; > + case AF_INET6: > + k6 = &p->kr.kr6; > + if (asprintf(&s, "%s/%u", log_in6addr(&k6->prefix), > + k6->prefixlen) == -1) > + err(1, NULL); > + printf("%-20s", s); > + free(s); > + printf("%4i %-16s ", k6->priority, > + k6->flags & F_CONNECTED ? "connected" : > + log_in6addr(&k6->nexthop)); > + break; > + default: > + printf("unknown address familiy %d\n", p->addr.af); > + return (0); > + } > if (p->kif.ifname[0]) { > printf("%-8s", p->kif.ifname); > - if (p->kif.flags & IFF_UP) { > - printf("UP"); > - ifms_type = ift2ifm(p->kif.media_type); > - if (ifms_type != 0) > - printf(", %s, %s", > - get_media_descr(ifms_type), > - get_linkstate(ifms_type, > - p->kif.link_state)); > - if (p->kif.baudrate) { > - printf(", "); > - print_baudrate(p->kif.baudrate); > - } > - } > } > printf("\n"); > break; > Index: bgpd/bgpd.h > =================================================================== > RCS file: /cvs/src/usr.sbin/bgpd/bgpd.h,v > retrieving revision 1.242 > diff -u -p -r1.242 bgpd.h > --- bgpd/bgpd.h 20 Jul 2009 15:03:16 -0000 1.242 > +++ bgpd/bgpd.h 22 Jul 2009 11:48:34 -0000 > @@ -437,10 +437,13 @@ struct pftable_msg { > > struct ctl_show_nexthop { > struct bgpd_addr addr; > - struct bgpd_addr gateway; > struct kif kif; > + union { > + struct kroute kr4; > + struct kroute6 kr6; > + } kr; > u_int8_t valid; > - u_int8_t connected; > + u_int8_t krvalid;; > }; > > struct ctl_neighbor { > Index: bgpd/kroute.c > =================================================================== > RCS file: /cvs/src/usr.sbin/bgpd/kroute.c,v > retrieving revision 1.170 > diff -u -p -r1.170 kroute.c > --- bgpd/kroute.c 20 Jul 2009 15:03:16 -0000 1.170 > +++ bgpd/kroute.c 22 Jul 2009 11:46:53 -0000 > @@ -587,26 +587,17 @@ kr_show_route(struct imsg *imsg) > case AF_INET: > kr = h->kroute; > snh.valid = kroute_validate(&kr->r); > - snh.connected = > - kr->r.flags & F_CONNECTED; > - if ((snh.gateway.v4.s_addr = > - kr->r.nexthop.s_addr) != 0) > - snh.gateway.af = AF_INET; > + snh.krvalid = 1; > + memcpy(&snh.kr.kr4, &kr->r, > + sizeof(snh.kr.kr4)); > ifindex = kr->r.ifindex; > break; > case AF_INET6: > kr6 = h->kroute; > snh.valid = kroute6_validate(&kr6->r); > - snh.connected = > - kr6->r.flags & F_CONNECTED; > - if (memcmp(&kr6->r.nexthop, > - &in6addr_any, > - sizeof(struct in6_addr)) != 0) { > - snh.gateway.af = AF_INET6; > - memcpy(&snh.gateway.v6, > - &kr6->r.nexthop, > - sizeof(struct in6_addr)); > - } > + snh.krvalid = 1; > + memcpy(&snh.kr.kr6, &kr6->r, > + sizeof(snh.kr.kr6)); > ifindex = kr6->r.ifindex; > break; > }