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