On 2016 Dec 05 (Mon) at 15:39:31 +0100 (+0100), Peter Hessler wrote:
:On 2016 Sep 30 (Fri) at 10:16:19 +0200 (+0200), Peter Hessler wrote:
::This diff makes route get and route monitor work.  sockaddr_bfd is so we
::can play like the other RTAX_* indexes in rti_info of route messages.
::
::OK?
::
::
::$ route -n monitor                                            
::got message of size 128 on Wed Sep 28 21:35:32 2016
::RTM_BFD: bidirectional forwarding detection: len 128
::BFD mode async state down remotestate down laststate admindown error 0
::localdiscr 4002401056 remotediscr 0 localdiag none remotediag none
::uptime 04m46s lastuptime 00s mintx 1000000 minrx 1 minecho 0 multiplier 3
::
::sockaddrs: <DST,IFA>
:: 192.168.50.1 192.168.50.61
::
::$ route -n get 192.168.50.1
::   route to: 192.168.50.1
::destination: 192.168.50.1
::       mask: 255.255.255.255
::  interface: vio0
:: if address: 192.168.50.61
::   priority: 4 (connected)
::      flags: <UP,HOST,DONE,LLINFO,CLONED,CACHED,BFD>
::BFD mode async state down remotestate down laststate admindown error 0
::localdiscr 4002401056 remotediscr 0 localdiag none remotediag none
::uptime 05m13s lastuptime 00s mintx 1000000 minrx 1 minecho 0 multiplier 3
::     use       mtu    expire
::       8         0       879 
::sockaddrs: <DST,GATEWAY,NETMASK,IFP,IFA>
::
:
:Here is a new diff, generated against -current.  No changes to the code.
:
:OK?
:

ping

:
:Index: sbin/route/Makefile
:===================================================================
:RCS file: /cvs/src/sbin/route/Makefile,v
:retrieving revision 1.13
:diff -u -p -u -p -r1.13 Makefile
:--- sbin/route/Makefile        19 Jul 2013 14:41:46 -0000      1.13
:+++ sbin/route/Makefile        5 Dec 2016 10:34:48 -0000
:@@ -4,7 +4,7 @@ PROG=  route
: MAN=  route.8
: SRCS= route.c show.c
: 
:-CFLAGS+=      -Wall
:+CFLAGS+=      -Wall -DBFD
: 
: route.o .depend lint tags: keywords.h
: 
:Index: sbin/route/route.c
:===================================================================
:RCS file: /cvs/src/sbin/route/route.c,v
:retrieving revision 1.192
:diff -u -p -u -p -r1.192 route.c
:--- sbin/route/route.c 24 Sep 2016 19:36:49 -0000      1.192
:+++ sbin/route/route.c 5 Dec 2016 10:34:48 -0000
:@@ -100,6 +100,7 @@ const char *bfd_state(unsigned int);
: const char *bfd_diag(unsigned int);
: const char *bfd_calc_uptime(time_t);
: void   print_bfdmsg(struct rt_msghdr *);
:+void   print_sabfd(struct sockaddr_bfd *);
: #endif
: const char *get_linkstate(int, int);
: void   print_rtmsg(struct rt_msghdr *, int);
:@@ -1439,6 +1440,9 @@ print_getmsg(struct rt_msghdr *rtm, int 
:       struct sockaddr *dst = NULL, *gate = NULL, *mask = NULL, *ifa = NULL;
:       struct sockaddr_dl *ifp = NULL;
:       struct sockaddr_rtlabel *sa_rl = NULL;
:+#ifdef BFD
:+      struct sockaddr_bfd *sa_bfd = NULL;
:+#endif
:       struct sockaddr *mpls = NULL;
:       struct sockaddr *sa;
:       char *cp;
:@@ -1487,6 +1491,11 @@ print_getmsg(struct rt_msghdr *rtm, int 
:                               case RTA_LABEL:
:                                       sa_rl = (struct sockaddr_rtlabel *)sa;
:                                       break;
:+#ifdef BFD
:+                              case RTA_BFD:
:+                                      sa_bfd = (struct sockaddr_bfd *)sa;
:+                                      break;
:+#endif
:                               }
:                               ADVANCE(cp, sa);
:                       }
:@@ -1519,6 +1528,10 @@ print_getmsg(struct rt_msghdr *rtm, int 
:       printf("\n");
:       if (sa_rl != NULL)
:               printf("      label: %s\n", sa_rl->sr_label);
:+#ifdef BFD
:+      if (sa_bfd)
:+              print_sabfd(sa_bfd);
:+#endif
: 
: #define lock(f)       ((rtm->rtm_rmx.rmx_locks & __CONCAT(RTV_,f)) ? 'L' : ' 
')
:       relative_expire = rtm->rtm_rmx.rmx_expire ?
:@@ -1621,12 +1634,21 @@ void
: print_bfdmsg(struct rt_msghdr *rtm)
: {
:       struct bfd_msghdr *bfdm = (struct bfd_msghdr *)rtm;
:+
:+      printf("\n");
:+      print_sabfd(&bfdm->bm_sa);
:+      pmsg_addrs(((char *)rtm + rtm->rtm_hdrlen), rtm->rtm_addrs);
:+}
:+
:+void
:+print_sabfd(struct sockaddr_bfd *sa_bfd)
:+{
:       struct timeval tv;
: 
:       gettimeofday(&tv, NULL);
: 
:-      printf(" mode ");
:-      switch (bfdm->bm_mode) {
:+      printf("BFD mode ");
:+      switch (sa_bfd->bs_mode) {
:       case BFD_MODE_ASYNC:
:               printf("async");
:               break;
:@@ -1634,27 +1656,26 @@ print_bfdmsg(struct rt_msghdr *rtm)
:               printf("demand");
:               break;
:       default:
:-              printf("unknown %u", bfdm->bm_mode);
:+              printf("unknown %u", sa_bfd->bs_mode);
:               break;
:       }
:-      printf(" state %s", bfd_state(bfdm->bm_state));
:-      printf(" remotestate %s", bfd_state(bfdm->bm_remotestate));
:-      printf(" laststate %s", bfd_state(bfdm->bm_laststate));
:-
:-      printf(" error %d", bfdm->bm_error);
:-      printf(" localdiscr %u", bfdm->bm_localdiscr);
:-      printf(" remotediscr %u", bfdm->bm_remotediscr);
:-      printf(" localdiag %s", bfd_diag(bfdm->bm_localdiag));
:-      printf(" remotediag %s", bfd_diag(bfdm->bm_remotediag));
:-      printf(" uptime %s", bfd_calc_uptime(tv.tv_sec - bfdm->bm_uptime));
:-      printf(" lastuptime %s", bfd_calc_uptime(bfdm->bm_lastuptime));
:-
:-      printf(" mintx %u", bfdm->bm_mintx);
:-      printf(" minrx %u", bfdm->bm_minrx);
:-      printf(" minecho %u", bfdm->bm_minecho);
:-      printf(" multiplier %u", bfdm->bm_multiplier);
:-
:-      pmsg_addrs(((char *)rtm + rtm->rtm_hdrlen), rtm->rtm_addrs);
:+      printf(" state %s", bfd_state(sa_bfd->bs_state));
:+      printf(" remotestate %s", bfd_state(sa_bfd->bs_remotestate));
:+      printf(" laststate %s", bfd_state(sa_bfd->bs_laststate));
:+
:+      printf(" error %d", sa_bfd->bs_error);
:+      printf(" localdiscr %u", sa_bfd->bs_localdiscr);
:+      printf(" remotediscr %u", sa_bfd->bs_remotediscr);
:+      printf(" localdiag %s", bfd_diag(sa_bfd->bs_localdiag));
:+      printf(" remotediag %s", bfd_diag(sa_bfd->bs_remotediag));
:+      printf(" uptime %s", bfd_calc_uptime(tv.tv_sec - sa_bfd->bs_uptime));
:+      printf(" lastuptime %s", bfd_calc_uptime(sa_bfd->bs_lastuptime));
:+
:+      printf(" mintx %u", sa_bfd->bs_mintx);
:+      printf(" minrx %u", sa_bfd->bs_minrx);
:+      printf(" minecho %u", sa_bfd->bs_minecho);
:+      printf(" multiplier %u", sa_bfd->bs_multiplier);
:+      printf("\n");
: }
: #endif /* BFD */
: 
:Index: sys/net/bfd.c
:===================================================================
:RCS file: /cvs/src/sys/net/bfd.c,v
:retrieving revision 1.41
:diff -u -p -u -p -r1.41 bfd.c
:--- sys/net/bfd.c      24 Sep 2016 19:29:55 -0000      1.41
:+++ sys/net/bfd.c      5 Dec 2016 10:34:48 -0000
:@@ -144,7 +144,6 @@ struct pool         bfd_pool, bfd_pool_neigh, b
: struct taskq  *bfdtq;
: 
: 
:-struct bfd_config *bfd_lookup(struct rtentry *);
: void           bfddestroy(void);
: 
: struct socket *bfd_listener(struct bfd_config *, unsigned int);
:Index: sys/net/bfd.h
:===================================================================
:RCS file: /cvs/src/sys/net/bfd.h,v
:retrieving revision 1.9
:diff -u -p -u -p -r1.9 bfd.h
:--- sys/net/bfd.h      20 Sep 2016 10:41:43 -0000      1.9
:+++ sys/net/bfd.h      5 Dec 2016 10:34:48 -0000
:@@ -53,31 +53,44 @@
: #define BFD_FLAG_D                    0x02
: #define BFD_FLAG_M                    0x01
: 
:+struct sockaddr_bfd {
:+      __uint8_t       bs_len;         /* total length */
:+      sa_family_t     bs_family;      /* address family */
:+      /* above matches sockaddr_storage */
:+
:+      uint16_t        bs_mode;
:+      uint32_t        bs_mintx;
:+      uint32_t        bs_minrx;
:+      uint32_t        bs_minecho;
:+      uint16_t        bs_multiplier;
:+
:+      time_t          bs_uptime;
:+      time_t          bs_lastuptime;
:+      int             bs_state;
:+      int             bs_remotestate;
:+      int             bs_laststate;
:+      int             bs_error;
:+
:+      uint32_t        bs_localdiscr;
:+      uint32_t        bs_localdiag;
:+      uint32_t        bs_remotediscr;
:+      uint32_t        bs_remotediag;
:+};
:+
: struct bfd_msghdr {
:       unsigned short  bm_msglen;
:       unsigned char   bm_version;
:       unsigned char   bm_type;
:       unsigned short  bm_hdrlen;
:+      u_short         bm_index;
:+      u_short         bm_tableid;
:+      u_char          bm_priority;
:+      u_char          bm_mpls;
:       int             bm_addrs;
:+      int             bm_flags;
:       /* above matches rtm_msghdr */
: 
:-      uint16_t        bm_mode;
:-      uint32_t        bm_mintx;
:-      uint32_t        bm_minrx;
:-      uint32_t        bm_minecho;
:-      uint16_t        bm_multiplier;
:-
:-      time_t          bm_uptime;
:-      time_t          bm_lastuptime;
:-      int             bm_state;
:-      int             bm_remotestate;
:-      int             bm_laststate;
:-      int             bm_error;
:-
:-      uint32_t        bm_localdiscr;
:-      uint32_t        bm_localdiag;
:-      uint32_t        bm_remotediscr;
:-      uint32_t        bm_remotediag;
:+      struct sockaddr_bfd     bm_sa;  /* bfd msg for userland */
: };
: 
: #ifdef _KERNEL
:@@ -124,6 +137,8 @@ struct bfd_config {
:       int                      bc_minecho;
:       int                      bc_multiplier;
: };
:+
:+struct bfd_config *bfd_lookup(struct rtentry *);
: 
: int            bfdset(struct rtentry *);
: void           bfdclear(struct rtentry *);
:Index: sys/net/route.h
:===================================================================
:RCS file: /cvs/src/sys/net/route.h,v
:retrieving revision 1.149
:diff -u -p -u -p -r1.149 route.h
:--- sys/net/route.h    21 Nov 2016 10:30:42 -0000      1.149
:+++ sys/net/route.h    5 Dec 2016 10:34:48 -0000
:@@ -259,6 +259,7 @@ struct rt_msghdr {
: #define RTA_SRC               0x100   /* source sockaddr present */
: #define RTA_SRCMASK   0x200   /* source netmask present */
: #define       RTA_LABEL       0x400   /* route label present */
:+#define RTA_BFD               0x800   /* bfd present */
: 
: /*
:  * Index offsets for sockaddr array for alternate internal encoding.
:@@ -274,7 +275,8 @@ struct rt_msghdr {
: #define RTAX_SRC      8       /* source sockaddr present */
: #define RTAX_SRCMASK  9       /* source netmask present */
: #define RTAX_LABEL    10      /* route label present */
:-#define RTAX_MAX      11      /* size of array to allocate */
:+#define RTAX_BFD      11      /* bfd present */
:+#define RTAX_MAX      12      /* size of array to allocate */
: 
: /*
:  * setsockopt defines used for the filtering.
:@@ -357,6 +359,7 @@ struct socket;
: struct ifnet;
: struct sockaddr_in6;
: struct bfd_config;
:+struct sockaddr_bfd;
: 
: void   route_init(void);
: int    route_output(struct mbuf *, ...);
:@@ -365,6 +368,7 @@ int         route_usrreq(struct socket *, int, 
: void   rt_ifmsg(struct ifnet *);
: void   rt_ifannouncemsg(struct ifnet *, int);
: void   rt_bfdmsg(struct bfd_config *);
:+struct sockaddr *bfd2sa(struct bfd_config *, struct sockaddr_bfd *);
: void   rt_maskedcopy(struct sockaddr *,
:           struct sockaddr *, struct sockaddr *);
: struct sockaddr *rt_plen2mask(struct rtentry *, struct sockaddr_in6 *);
:Index: sys/net/rtsock.c
:===================================================================
:RCS file: /cvs/src/sys/net/rtsock.c,v
:retrieving revision 1.210
:diff -u -p -u -p -r1.210 rtsock.c
:--- sys/net/rtsock.c   29 Nov 2016 10:22:30 -0000      1.210
:+++ sys/net/rtsock.c   5 Dec 2016 10:34:48 -0000
:@@ -472,6 +472,9 @@ route_output(struct mbuf *m, ...)
:       struct rawcb            *rp = NULL;
:       struct sockaddr_rtlabel  sa_rl;
:       struct sockaddr_in6      sa_mask;
:+#ifdef BFD
:+      struct sockaddr_bfd      sa_bfd;
:+#endif
: #ifdef MPLS
:       struct sockaddr_mpls     sa_mpls, *psa_mpls;
: #endif
:@@ -705,6 +708,14 @@ report:
:                   rt_plen2mask(rt, &sa_mask);
:               info.rti_info[RTAX_LABEL] =
:                   rtlabel_id2sa(rt->rt_labelid, &sa_rl);
:+#ifdef BFD
:+              if (rt->rt_flags & RTF_BFD) {
:+                      struct bfd_config *bfd;
:+                      bfd = bfd_lookup(rt);
:+                      bfd2sa(bfd, &sa_bfd);
:+                      info.rti_info[RTAX_BFD] = (struct sockaddr *)&sa_bfd;
:+              }
:+#endif
: #ifdef MPLS
:               if (rt->rt_flags & RTF_MPLS) {
:                       bzero(&sa_mpls, sizeof(sa_mpls));
:@@ -1355,6 +1366,7 @@ void
: rt_bfdmsg(struct bfd_config *bfd)
: {
:       struct bfd_msghdr       *bfdm;
:+      struct sockaddr_bfd      sa_bfd;
:       struct mbuf             *m;
:       struct rt_addrinfo       info;
: 
:@@ -1368,28 +1380,45 @@ rt_bfdmsg(struct bfd_config *bfd)
:       if (m == NULL)
:               return;
:       bfdm = mtod(m, struct bfd_msghdr *);
:+      bfdm->bm_addrs = info.rti_addrs;
: 
:-      bfdm->bm_mode = bfd->bc_mode;
:-      bfdm->bm_mintx = bfd->bc_mintx;
:-      bfdm->bm_minrx = bfd->bc_minrx;
:-      bfdm->bm_minecho = bfd->bc_minecho;
:-      bfdm->bm_multiplier = bfd->bc_multiplier;
:-
:-      bfdm->bm_uptime = bfd->bc_time->tv_sec;
:-      bfdm->bm_lastuptime = bfd->bc_lastuptime;
:-      bfdm->bm_state = bfd->bc_state;
:-      bfdm->bm_remotestate = bfd->bc_neighbor->bn_rstate;
:-      bfdm->bm_laststate = bfd->bc_laststate;
:-      bfdm->bm_error = bfd->bc_error;
:-
:-      bfdm->bm_localdiscr = bfd->bc_neighbor->bn_ldiscr;
:-      bfdm->bm_localdiag = bfd->bc_neighbor->bn_ldiag;
:-      bfdm->bm_remotediscr = bfd->bc_neighbor->bn_rdiscr;
:-      bfdm->bm_remotediag = bfd->bc_neighbor->bn_rdiag;
:+      bfd2sa(bfd, &sa_bfd);
:+      memcpy(&bfdm->bm_sa, &sa_bfd, sizeof(sa_bfd));
: 
:-      route_proto.sp_protocol = 0;
:+      route_proto.sp_protocol = info.rti_info[RTAX_DST]->sa_family;
:       route_input(m, &route_proto, &route_src, &route_dst);
: }
:+
:+struct sockaddr *
:+bfd2sa(struct bfd_config *bfd, struct sockaddr_bfd *sa_bfd)
:+{
:+      if (bfd == NULL)
:+              return (NULL);
:+
:+      memset(sa_bfd, 0, sizeof(*sa_bfd));
:+      sa_bfd->bs_len = sizeof(*sa_bfd);
:+      sa_bfd->bs_family = bfd->bc_rt->rt_dest->sa_family;
:+
:+      sa_bfd->bs_mode = bfd->bc_mode;
:+      sa_bfd->bs_mintx = bfd->bc_mintx;
:+      sa_bfd->bs_minrx = bfd->bc_minrx;
:+      sa_bfd->bs_minecho = bfd->bc_minecho;
:+      sa_bfd->bs_multiplier = bfd->bc_multiplier;
:+
:+      sa_bfd->bs_uptime = bfd->bc_time->tv_sec;
:+      sa_bfd->bs_lastuptime = bfd->bc_lastuptime;
:+      sa_bfd->bs_state = bfd->bc_state;
:+      sa_bfd->bs_remotestate = bfd->bc_neighbor->bn_rstate;
:+      sa_bfd->bs_laststate = bfd->bc_laststate;
:+      sa_bfd->bs_error = bfd->bc_error;
:+
:+      sa_bfd->bs_localdiscr = bfd->bc_neighbor->bn_ldiscr;
:+      sa_bfd->bs_localdiag = bfd->bc_neighbor->bn_ldiag;
:+      sa_bfd->bs_remotediscr = bfd->bc_neighbor->bn_rdiscr;
:+      sa_bfd->bs_remotediag = bfd->bc_neighbor->bn_rdiag;
:+
:+      return ((struct sockaddr *)sa_bfd);
:+}
: #endif /* BFD */
: 
: /*
:@@ -1402,6 +1431,10 @@ sysctl_dumpentry(struct rtentry *rt, voi
:       int                      error = 0, size;
:       struct rt_addrinfo       info;
:       struct ifnet            *ifp;
:+#ifdef BFD
:+      struct bfd_config       *bfd;
:+      struct sockaddr_bfd      sa_bfd;
:+#endif
: #ifdef MPLS
:       struct sockaddr_mpls     sa_mpls;
: #endif
:@@ -1436,6 +1469,12 @@ sysctl_dumpentry(struct rtentry *rt, voi
:       }
:       if_put(ifp);
:       info.rti_info[RTAX_LABEL] = rtlabel_id2sa(rt->rt_labelid, &sa_rl);
:+#ifdef BFD
:+      if (rt->rt_flags & RTF_BFD) {
:+              bfd = bfd_lookup(rt);
:+              info.rti_info[RTAX_BFD] = bfd2sa(bfd, &sa_bfd);
:+      }
:+#endif
: #ifdef MPLS
:       if (rt->rt_flags & RTF_MPLS) {
:               bzero(&sa_mpls, sizeof(sa_mpls));
:
:
:-- 
:Imagination is the one weapon in the war against reality.
:               -- Jules de Gaultier
:

-- 
This land is full of trousers!
this land is full of mausers!
        And pussycats to eat them when the sun goes down!
                -- Firesign Theater

Reply via email to