Lines Matching +full:use +full:- +full:rtm

1 /*-
2 * SPDX-License-Identifier: BSD-3-Clause
7 * Redistribution and use in source and binary forms, with or without
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
169 errx(EX_USAGE, "usage: route [-j jail] [-46dnqtv] command [[modifiers] args]"); in usage()
185 while ((ch = getopt(argc, argv, "46nqdtvj:")) != -1) in main()
231 argc -= optind; in main()
240 if (jid == -1) in main()
257 if (sysctlbyname("net.fibs", (void *)&numfibs, &len, NULL, 0) == -1) in main()
258 numfibs = -1; in main()
261 if (numfibs != -1 && in main()
263 0) == -1) in main()
264 defaultfib = -1; in main()
317 while ((token = strsep(&str, "-")) != NULL) { in fiboptlist_range()
326 (numfibs != -1 && fib[i] > numfibs - 1)) in fiboptlist_range()
349 fl->fl_num = i; in fiboptlist_range()
373 snprintf(str, ALLSTRLEN - 1, "%d-%d", 0, numfibs - 1); in fiboptlist_csv()
375 snprintf(str, ALLSTRLEN - 1, "%d", 0); in fiboptlist_csv()
382 snprintf(str, ALLSTRLEN - 1, "%d", defaultfib); in fiboptlist_csv()
388 if (*token != '-' && strchr(token, '-') != NULL) { in fiboptlist_csv()
398 (numfibs != -1 && fib > numfibs - 1)) in fiboptlist_csv()
410 fl->fl_num = fib; in fiboptlist_csv()
438 argc--; in flushroutes()
440 if (**argv != '-') in flushroutes()
459 if (!--argc) in flushroutes()
475 flushroutes_fib(fl->fl_num); in flushroutes()
492 struct rt_msghdr *rtm; in flushroutes_fib_rtsock() local
513 err(EX_OSERR, "route-sysctl-estimate"); in flushroutes_fib_rtsock()
523 err(EX_OSERR, "route-sysctl-get"); in flushroutes_fib_rtsock()
529 for (next = buf; next < lim; next += rtm->rtm_msglen) { in flushroutes_fib_rtsock()
530 rtm = (struct rt_msghdr *)(void *)next; in flushroutes_fib_rtsock()
532 print_rtmsg(rtm, rtm->rtm_msglen); in flushroutes_fib_rtsock()
533 if ((rtm->rtm_flags & RTF_GATEWAY) == 0) in flushroutes_fib_rtsock()
536 struct sockaddr *sa = (struct sockaddr *)(rtm + 1); in flushroutes_fib_rtsock()
538 if (sa->sa_family != af) in flushroutes_fib_rtsock()
543 rtm->rtm_type = RTM_DELETE; in flushroutes_fib_rtsock()
544 rtm->rtm_seq = seqno; in flushroutes_fib_rtsock()
545 rlen = write(s, next, rtm->rtm_msglen); in flushroutes_fib_rtsock()
548 if (rlen < (int)rtm->rtm_msglen) { in flushroutes_fib_rtsock()
559 print_rtmsg(rtm, rlen); in flushroutes_fib_rtsock()
561 struct sockaddr *sa = (struct sockaddr *)(rtm + 1); in flushroutes_fib_rtsock()
563 printf("%-20.20s ", rtm->rtm_flags & RTF_HOST ? in flushroutes_fib_rtsock()
566 printf("%-20.20s ", routename(sa)); in flushroutes_fib_rtsock()
568 printf("-fib %-3d ", fib); in flushroutes_fib_rtsock()
586 sizeof(domain_storage) - 1) == 0 && in routename()
588 domain_storage[sizeof(domain_storage) - 1] = '\0'; in routename()
596 /* If the address is zero-filled, use "default". */ in routename()
597 if (sa->sa_len == 0 && nflag == 0) in routename()
600 switch (sa->sa_family) { in routename()
603 /* If the address is zero-filled, use "default". */ in routename()
605 ((struct sockaddr_in *)(void *)sa)->sin_addr.s_addr == in routename()
612 /* If the address is zero-filled, use "default". */ in routename()
614 IN6_IS_ADDR_UNSPECIFIED(&((struct sockaddr_in6 *)(void *)sa)->sin6_addr)) in routename()
621 switch (sa->sa_family) { in routename()
635 if (sa->sa_len == 0) in routename()
636 ss.ss_family = sa->sa_family; in routename()
638 memcpy(&ss, sa, sa->sa_len); in routename()
639 /* Expand sa->sa_len because it could be shortened. */ in routename()
640 if (sa->sa_family == AF_INET) in routename()
642 else if (sa->sa_family == AF_INET6) in routename()
664 if (sdl->sdl_nlen == 0 && in routename()
665 sdl->sdl_alen == 0 && in routename()
666 sdl->sdl_slen == 0) { in routename()
668 sdl->sdl_index); in routename()
679 u_short *splim = sp + ((sa->sa_len + 1) >> 1); in routename()
680 char *cps = rt_line + sprintf(rt_line, "(%d)", sa->sa_family); in routename()
683 while (++sp < splim && cps < cpe) /* start with sa->sa_data */ in routename()
684 if ((n = snprintf(cps, cpe - cps, " %x", *sp)) > 0) in routename()
709 switch (sa->sa_family) { in netname()
715 in = ((struct sockaddr_in *)(void *)sa)->sin_addr; in netname()
722 cp = np->n_name; in netname()
750 memcpy(&sin6, sa, sa->sa_len); in netname()
765 if (sdl->sdl_nlen == 0 && in netname()
766 sdl->sdl_alen == 0 && in netname()
767 sdl->sdl_slen == 0) { in netname()
769 sdl->sdl_index); in netname()
779 u_short *sp = (u_short *)(void *)sa->sa_data; in netname()
780 u_short *splim = sp + ((sa->sa_len + 1)>>1); in netname()
781 char *cps = net_line + sprintf(net_line, "af %d:", sa->sa_family); in netname()
785 if ((n = snprintf(cps, cpe - cps, " %x", *sp++)) > 0) in netname()
825 if (flag & RTV_EXPIRE && (value[0] == '+' || value[0] == '-')) { in set_metric()
859 if (sigaction(SIGALRM, &sa, 0) == -1) in newroute()
867 while (--argc > 0) { in newroute()
868 if (**(++argv)== '-') { in newroute()
936 if (!--argc) in newroute()
944 if (!--argc) in newroute()
949 if (!--argc) in newroute()
954 if (!--argc) in newroute()
959 if (!--argc) in newroute()
965 if (!--argc) in newroute()
972 if (!--argc) in newroute()
980 if (!--argc) in newroute()
982 if (prefixlen(*++argv) == -1) { in newroute()
999 if (!--argc) in newroute()
1063 fl->fl_error = newroute_fib(fl->fl_num, cmd, flags); in newroute()
1064 if (fl->fl_error) in newroute()
1065 fl->fl_errno = errno; in newroute()
1066 error += fl->fl_error; in newroute()
1075 if (fl->fl_error == 0) in newroute()
1088 if (fl->fl_error == 0 in newroute()
1089 && fl->fl_num >= 0) { in newroute()
1094 printf("%d", fl->fl_num); in newroute()
1095 if (fibnum-- > 1) in newroute()
1106 if (fl->fl_error != 0) { in newroute()
1114 if (fl->fl_num >= 0) in newroute()
1115 printf(" fib %d", fl->fl_num); in newroute()
1117 switch (fl->fl_errno) { in newroute()
1122 errmsg = "entry in use"; in newroute()
1138 errmsg = strerror(fl->fl_errno); in newroute()
1172 mask = 0xffffffff << (32 - bits); in inet_makemask()
1174 sin_mask->sin_addr.s_addr = htonl(mask); in inet_makemask()
1175 sin_mask->sin_len = sizeof(struct sockaddr_in); in inet_makemask()
1176 sin_mask->sin_family = AF_INET; in inet_makemask()
1189 if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr) && in inet6_makenetandmask()
1190 sin6->sin6_scope_id == 0) in inet6_makenetandmask()
1234 sa->sa_family = af; in getaddr()
1235 sa->sa_len = aflen; in getaddr()
1247 for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) { in getaddr()
1248 if (ifa->ifa_addr->sa_family != AF_LINK) in getaddr()
1251 if (strcmp(str, ifa->ifa_name) != 0) in getaddr()
1254 sdl = (struct sockaddr_dl *)(void *)ifa->ifa_addr; in getaddr()
1256 /* If we found it, then use it */ in getaddr()
1262 memcpy(sdl0, sdl, sdl->sdl_len); in getaddr()
1273 sa->sa_family = AF_LINK; in getaddr()
1288 switch (sa->sa_family) { in getaddr()
1299 hints.ai_family = sa->sa_family; in getaddr()
1302 if (ecode != 0 || res->ai_family != AF_INET6 || in getaddr()
1303 res->ai_addrlen != sizeof(struct sockaddr_in6)) in getaddr()
1305 memcpy(sa, res->ai_addr, res->ai_addrlen); in getaddr()
1338 if (inet_aton(str, &sin->sin_addr) == 0) in getaddr()
1353 mask_bits = ntohl(mask->sin_addr.s_addr); in getaddr()
1354 if ((ntohl(sin->sin_addr.s_addr) & ~mask_bits) != 0 && in getaddr()
1359 str, inet_ntoa(sin->sin_addr)); in getaddr()
1362 if (inet_aton(str, &sin->sin_addr) != 0) in getaddr()
1367 sin->sin_family = hp->h_addrtype; in getaddr()
1368 memmove((char *)&sin->sin_addr, hp->h_addr, in getaddr()
1369 MIN((size_t)hp->h_length, sizeof(sin->sin_addr))); in getaddr()
1392 p = (char *)&sin6->sin6_addr; in prefixlen()
1393 sin6->sin6_family = AF_INET6; in prefixlen()
1394 sin6->sin6_len = sizeof(*sin6); in prefixlen()
1405 p = (char *)&sin->sin_addr; in prefixlen()
1406 sin->sin_family = AF_INET; in prefixlen()
1407 sin->sin_len = sizeof(*sin); in prefixlen()
1426 return (-1); in prefixlen()
1437 struct rt_msghdr *rtm; in interfaces() local
1447 err(EX_OSERR, "route-sysctl-estimate"); in interfaces()
1460 for (next = buf; next < lim; next += rtm->rtm_msglen) { in interfaces()
1461 rtm = (struct rt_msghdr *)(void *)next; in interfaces()
1462 print_rtmsg(rtm, rtm->rtm_msglen); in interfaces()
1475 argc--; in monitor()
1477 if (**argv != '-') in monitor()
1481 if (!--argc) in monitor()
1488 (numfibs != -1 && fib > numfibs - 1)) in monitor()
1523 if (setsockopt(s, SOL_SOCKET, SO_RERROR, &n, sizeof(n)) == -1) in monitor_rtsock()
1530 if (n == -1) { in monitor_rtsock()
1564 return (errno == 0 ? 0 : -1); in rtmsg()
1587 #define rtm m_rtmsg.m_rtm in rtmsg_rtsock() macro
1588 rtm.rtm_type = cmd; in rtmsg_rtsock()
1589 rtm.rtm_flags = flags; in rtmsg_rtsock()
1590 rtm.rtm_version = RTM_VERSION; in rtmsg_rtsock()
1591 rtm.rtm_seq = ++rtm_seq; in rtmsg_rtsock()
1592 rtm.rtm_addrs = rtm_addrs; in rtmsg_rtsock()
1593 rtm.rtm_rmx = rt_metrics; in rtmsg_rtsock()
1594 rtm.rtm_inits = rtm_inits; in rtmsg_rtsock()
1602 rtm.rtm_msglen = l = cp - (char *)&m_rtmsg; in rtmsg_rtsock()
1604 print_rtmsg(&rtm, l); in rtmsg_rtsock()
1621 return (-1); in rtmsg_rtsock()
1629 (rtm.rtm_type != RTM_GET || rtm.rtm_seq != rtm_seq || in rtmsg_rtsock()
1630 rtm.rtm_pid != pid)); in rtmsg_rtsock()
1633 return (-1); in rtmsg_rtsock()
1639 print_getmsg(&rtm, l, fib); in rtmsg_rtsock()
1641 #undef rtm in rtmsg_rtsock()
1653 "RTM_REDIRECT: Told to use different route",
1688 print_rtmsg(struct rt_msghdr *rtm, size_t msglen) in print_rtmsg() argument
1700 if (rtm->rtm_version != RTM_VERSION) { in print_rtmsg()
1702 rtm->rtm_version); in print_rtmsg()
1705 if (rtm->rtm_type < nitems(msgtypes)) in print_rtmsg()
1706 (void)printf("%s: ", msgtypes[rtm->rtm_type]); in print_rtmsg()
1708 (void)printf("unknown type %d: ", rtm->rtm_type); in print_rtmsg()
1709 (void)printf("len %d, ", rtm->rtm_msglen); in print_rtmsg()
1715 msglen -= sizeof(x); \ in print_rtmsg()
1718 switch (rtm->rtm_type) { in print_rtmsg()
1721 ifm = (struct if_msghdr *)rtm; in print_rtmsg()
1722 (void)printf("if# %d, ", ifm->ifm_index); in print_rtmsg()
1723 switch (ifm->ifm_data.ifi_link_state) { in print_rtmsg()
1735 printb(ifm->ifm_flags, ifnetflags); in print_rtmsg()
1736 pmsg_addrs((char *)(ifm + 1), ifm->ifm_addrs, msglen); in print_rtmsg()
1741 ifam = (struct ifa_msghdr *)rtm; in print_rtmsg()
1742 (void)printf("metric %d, flags:", ifam->ifam_metric); in print_rtmsg()
1743 printb(ifam->ifam_flags, routeflags); in print_rtmsg()
1744 pmsg_addrs((char *)(ifam + 1), ifam->ifam_addrs, msglen); in print_rtmsg()
1750 ifmam = (struct ifma_msghdr *)rtm; in print_rtmsg()
1751 pmsg_addrs((char *)(ifmam + 1), ifmam->ifmam_addrs, msglen); in print_rtmsg()
1756 ifan = (struct if_announcemsghdr *)rtm; in print_rtmsg()
1757 (void)printf("if# %d, what: ", ifan->ifan_index); in print_rtmsg()
1758 switch (ifan->ifan_what) { in print_rtmsg()
1766 printf("#%d", ifan->ifan_what); in print_rtmsg()
1774 if (rtm->rtm_type <= RTM_RESOLVE) { in print_rtmsg()
1776 (long)rtm->rtm_pid, rtm->rtm_seq, rtm->rtm_errno); in print_rtmsg()
1777 printb(rtm->rtm_flags, routeflags); in print_rtmsg()
1778 pmsg_common(rtm, msglen); in print_rtmsg()
1780 printf("type: %u, len: %zu\n", rtm->rtm_type, msglen); in print_rtmsg()
1791 print_getmsg(struct rt_msghdr *rtm, int msglen, int fib) in print_getmsg() argument
1801 if (rtm->rtm_version != RTM_VERSION) { in print_getmsg()
1803 rtm->rtm_version); in print_getmsg()
1806 if (rtm->rtm_msglen > msglen) { in print_getmsg()
1808 rtm->rtm_msglen, msglen); in print_getmsg()
1811 if (rtm->rtm_errno) { in print_getmsg()
1812 errno = rtm->rtm_errno; in print_getmsg()
1816 cp = ((char *)(rtm + 1)); in print_getmsg()
1818 if (rtm->rtm_addrs & (1 << i)) { in print_getmsg()
1822 if ((rtm->rtm_addrs & RTA_IFP) && in print_getmsg()
1823 (sp[RTAX_IFP]->sa_family != AF_LINK || in print_getmsg()
1824 ((struct sockaddr_dl *)(void *)sp[RTAX_IFP])->sdl_nlen == 0)) in print_getmsg()
1830 if (sp[RTAX_GATEWAY] && (rtm->rtm_flags & RTF_GATEWAY)) in print_getmsg()
1836 ((struct sockaddr_dl *)(void *)sp[RTAX_IFP])->sdl_nlen, in print_getmsg()
1837 ((struct sockaddr_dl *)(void *)sp[RTAX_IFP])->sdl_data); in print_getmsg()
1839 printb(rtm->rtm_flags, routeflags); in print_getmsg()
1841 #define lock(f) ((rtm->rtm_rmx.rmx_locks & __CONCAT(RTV_,f)) ? 'L' : ' ') in print_getmsg()
1845 printf("%8lu%c ", rtm->rtm_rmx.rmx_recvpipe, lock(RPIPE)); in print_getmsg()
1846 printf("%8lu%c ", rtm->rtm_rmx.rmx_sendpipe, lock(SPIPE)); in print_getmsg()
1847 printf("%8lu%c ", rtm->rtm_rmx.rmx_ssthresh, lock(SSTHRESH)); in print_getmsg()
1848 printf("%8lu%c ", msec(rtm->rtm_rmx.rmx_rtt), lock(RTT)); in print_getmsg()
1849 printf("%8lu%c ", rtm->rtm_rmx.rmx_mtu, lock(MTU)); in print_getmsg()
1850 printf("%8lu%c ", rtm->rtm_rmx.rmx_weight, lock(WEIGHT)); in print_getmsg()
1851 if (rtm->rtm_rmx.rmx_expire > 0) in print_getmsg()
1855 printf("%8ld%c\n", (long)(rtm->rtm_rmx.rmx_expire - ts.tv_sec), in print_getmsg()
1861 pmsg_common(rtm, msglen); in print_getmsg()
1862 else if (rtm->rtm_addrs &~ RTA_IGN) { in print_getmsg()
1864 printb(rtm->rtm_addrs, addrnames); in print_getmsg()
1871 pmsg_common(struct rt_msghdr *rtm, size_t msglen) in pmsg_common() argument
1875 printb(rtm->rtm_rmx.rmx_locks, metricnames); in pmsg_common()
1877 printb(rtm->rtm_inits, metricnames); in pmsg_common()
1879 pmsg_addrs(((char *)(rtm + 1)), rtm->rtm_addrs, in pmsg_common()
1880 msglen - sizeof(struct rt_msghdr)); in pmsg_common()
1906 len -= SA_SIZE(sa); in pmsg_addrs()
1922 if (b & (1 << (i-1))) { in printb()
1944 while (kt->kt_cp != NULL && strcmp(kt->kt_cp, cp) != 0) in keyword()
1946 return (kt->kt_i); in keyword()
1956 switch (sa->sa_family) { in sodump()
1964 inet_ntoa(((struct sockaddr_in *)(void *)sa)->sin_addr)); in sodump()
1969 (void)printf("%s: inet6 %s; ", which, inet_ntop(sa->sa_family, in sodump()
1970 &((struct sockaddr_in6 *)(void *)sa)->sin6_addr, nbuf, in sodump()
1998 new = *addr - '0'; in sockaddr()
2000 new = *addr - 'a' + 10; in sockaddr()
2002 new = *addr - 'A' + 10; in sockaddr()
2025 sa->sa_len = cp - (char *)sa; in sockaddr()