| 1807 | } |
| 1808 | |
| 1809 | static void |
| 1810 | print_getmsg(struct rt_msghdr *rtm, int msglen, int fib) |
| 1811 | { |
| 1812 | struct sockaddr *sp[RTAX_MAX]; |
| 1813 | struct timespec ts; |
| 1814 | char *cp; |
| 1815 | int i; |
| 1816 | |
| 1817 | memset(sp, 0, sizeof(sp)); |
| 1818 | (void)printf(" route to: %s\n", |
| 1819 | routename((struct sockaddr *)&so[RTAX_DST])); |
| 1820 | if (rtm->rtm_version != RTM_VERSION) { |
| 1821 | warnx("routing message version %d not understood", |
| 1822 | rtm->rtm_version); |
| 1823 | return; |
| 1824 | } |
| 1825 | if (rtm->rtm_msglen > msglen) { |
| 1826 | warnx("message length mismatch, in packet %d, returned %d", |
| 1827 | rtm->rtm_msglen, msglen); |
| 1828 | return; |
| 1829 | } |
| 1830 | if (rtm->rtm_errno) { |
| 1831 | errno = rtm->rtm_errno; |
| 1832 | warn("message indicates error %d", errno); |
| 1833 | return; |
| 1834 | } |
| 1835 | cp = ((char *)(rtm + 1)); |
| 1836 | for (i = 0; i < RTAX_MAX; i++) |
| 1837 | if (rtm->rtm_addrs & (1 << i)) { |
| 1838 | sp[i] = (struct sockaddr *)cp; |
| 1839 | cp += SA_SIZE((struct sockaddr *)cp); |
| 1840 | } |
| 1841 | if ((rtm->rtm_addrs & RTA_IFP) && |
| 1842 | (sp[RTAX_IFP]->sa_family != AF_LINK || |
| 1843 | ((struct sockaddr_dl *)(void *)sp[RTAX_IFP])->sdl_nlen == 0)) |
| 1844 | sp[RTAX_IFP] = NULL; |
| 1845 | if (sp[RTAX_DST]) |
| 1846 | (void)printf("destination: %s\n", routename(sp[RTAX_DST])); |
| 1847 | if (sp[RTAX_NETMASK]) |
| 1848 | (void)printf(" mask: %s\n", routename(sp[RTAX_NETMASK])); |
| 1849 | if (sp[RTAX_GATEWAY] && (rtm->rtm_flags & RTF_GATEWAY)) |
| 1850 | (void)printf(" gateway: %s\n", routename(sp[RTAX_GATEWAY])); |
| 1851 | if (fib >= 0) |
| 1852 | (void)printf(" fib: %u\n", (unsigned int)fib); |
| 1853 | if (sp[RTAX_IFP]) |
| 1854 | (void)printf(" interface: %.*s\n", |
| 1855 | ((struct sockaddr_dl *)(void *)sp[RTAX_IFP])->sdl_nlen, |
| 1856 | ((struct sockaddr_dl *)(void *)sp[RTAX_IFP])->sdl_data); |
| 1857 | (void)printf(" flags: "); |
| 1858 | printb(rtm->rtm_flags, routeflags); |
| 1859 | |
| 1860 | #define lock(f) ((rtm->rtm_rmx.rmx_locks & __CONCAT(RTV_,f)) ? 'L' : ' ') |
| 1861 | #define msec(u) (((u) + 500) / 1000) /* usec to msec */ |
| 1862 | printf("\n%9s %9s %9s %9s %9s %10s %9s\n", "recvpipe", |
| 1863 | "sendpipe", "ssthresh", "rtt,msec", "mtu ", "weight", "expire"); |
| 1864 | printf("%8lu%c ", rtm->rtm_rmx.rmx_recvpipe, lock(RPIPE)); |
| 1865 | printf("%8lu%c ", rtm->rtm_rmx.rmx_sendpipe, lock(SPIPE)); |
| 1866 | printf("%8lu%c ", rtm->rtm_rmx.rmx_ssthresh, lock(SSTHRESH)); |