Lines Matching +full:use +full:- +full:rtm
3 /*-
4 * SPDX-License-Identifier: BSD-3-Clause
9 * Redistribution and use in source and binary forms, with or without
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
40 * Redistribution and use in source and binary forms, with or without
58 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
61 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
71 * ndp - display, set, delete and flush neighbor cache
116 if (rtm->rtm_addrs & (w)) { \
123 static int s = -1;
189 assert(tm->tm_gmtoff > INT32_MIN && tm->tm_gmtoff < INT32_MAX); in utc_offset()
191 return (tm->tm_gmtoff); in utc_offset()
210 while ((ch = getopt(argc, argv, "acd:f:Ii:nprstA:HPR")) != -1) in main()
261 argc -= optind; in main()
278 xo_open_list("neighbor-cache"); in main()
280 xo_close_list("neighbor-cache"); in main()
439 argc -= 2; in set()
453 while (argc-- > 0) { in set()
467 struct rt_msghdr *rtm = &(m_rtmsg.m_rtm); in set() local
476 sin = (struct sockaddr_in6 *)(rtm + 1); in set()
477 sdl = (struct sockaddr_dl *)(ALIGN(sin->sin6_len) + (char *)sin); in set()
478 if (IN6_ARE_ADDR_EQUAL(&sin->sin6_addr, &sin_m.sin6_addr)) { in set()
479 if (sdl->sdl_family == AF_LINK && in set()
480 !(rtm->rtm_flags & RTF_GATEWAY)) { in set()
481 if (valid_type(sdl->sdl_type)) in set()
489 if (sdl->sdl_family != AF_LINK) { in set()
493 sdl_m.sdl_type = sdl->sdl_type; in set()
494 sdl_m.sdl_index = sdl->sdl_index; in set()
508 sin6->sin6_family = AF_INET6; in getaddr()
509 sin6->sin6_len = sizeof(*sin6); in getaddr()
510 sin6->sin6_addr = ((struct sockaddr_in6 *)res->ai_addr)->sin6_addr; in getaddr()
511 sin6->sin6_scope_id = in getaddr()
512 ((struct sockaddr_in6 *)res->ai_addr)->sin6_scope_id; in getaddr()
533 getnameinfo((struct sockaddr *)sin, sin->sin6_len, host_buf, in get()
536 xo_errx(1, "%s (%s) -- no entry", host, host_buf); in get()
548 register struct rt_msghdr *rtm = &m_rtmsg.m_rtm; in delete_rtsock() local
566 sin = (struct sockaddr_in6 *)(rtm + 1); in delete_rtsock()
567 sdl = (struct sockaddr_dl *)(ALIGN(sin->sin6_len) + (char *)sin); in delete_rtsock()
568 if (IN6_ARE_ADDR_EQUAL(&sin->sin6_addr, &sin_m.sin6_addr)) { in delete_rtsock()
569 if (sdl->sdl_family == AF_LINK && in delete_rtsock()
570 !(rtm->rtm_flags & RTF_GATEWAY)) { in delete_rtsock()
573 xo_warnx("delete: cannot delete non-NDP entry"); in delete_rtsock()
578 if (sdl->sdl_family != AF_LINK) { in delete_rtsock()
587 rtm->rtm_flags |= RTF_LLDATA; in delete_rtsock()
590 sin->sin6_len, host_buf, in delete_rtsock()
593 xo_open_instance("neighbor-cache"); in delete_rtsock()
595 char *ifname = if_indextoname(sdl->sdl_index, ifix_buf); in delete_rtsock()
601 inet_ntop(AF_INET6, &sin->sin6_addr, abuf, sizeof(abuf)); in delete_rtsock()
605 xo_close_instance("neighbor-cache"); in delete_rtsock()
620 struct rt_msghdr *rtm; in dump_rtsock() local
635 "{T:/%%-%d.%ds} {T:/%%-%d.%ds} {T:/%%%d.%ds} {T:/%%-9.9s} {T:/%%1s} {T:/%%5s}\n", in dump_rtsock()
639 xo_open_list("neighbor-cache"); in dump_rtsock()
669 for (next = buf; next && next < lim; next += rtm->rtm_msglen) { in dump_rtsock()
672 rtm = (struct rt_msghdr *)next; in dump_rtsock()
673 sin = (struct sockaddr_in6 *)(rtm + 1); in dump_rtsock()
675 ALIGN(sin->sin6_len)); in dump_rtsock()
679 * has a non-AF_LINK gateway (e.g. fe80::xx%lo0 on FreeBSD in dump_rtsock()
690 if (sdl->sdl_family != AF_LINK) in dump_rtsock()
693 if (!(rtm->rtm_flags & RTF_HOST)) in dump_rtsock()
697 if (IN6_ARE_ADDR_EQUAL(&addr->sin6_addr, in dump_rtsock()
698 &sin->sin6_addr) == 0 || in dump_rtsock()
699 addr->sin6_scope_id != sin->sin6_scope_id) in dump_rtsock()
701 } else if (IN6_IS_ADDR_MULTICAST(&sin->sin6_addr)) in dump_rtsock()
704 if (IN6_IS_ADDR_LINKLOCAL(&sin->sin6_addr) || in dump_rtsock()
705 IN6_IS_ADDR_MC_LINKLOCAL(&sin->sin6_addr)) { in dump_rtsock()
707 if (sin->sin6_scope_id == 0) in dump_rtsock()
708 sin->sin6_scope_id = sdl->sdl_index; in dump_rtsock()
710 getnameinfo((struct sockaddr *)sin, sin->sin6_len, host_buf, in dump_rtsock()
714 if (rtm->rtm_flags & RTF_WASCLONED) in dump_rtsock()
717 if (rtm->rtm_flags & RTF_CLONED) in dump_rtsock()
720 if (rtm->rtm_flags & RTF_PINNED) in dump_rtsock()
734 if (W_ADDR + W_LL - addrwidth > llwidth) in dump_rtsock()
735 llwidth = W_ADDR + W_LL - addrwidth; in dump_rtsock()
736 ifname = if_indextoname(sdl->sdl_index, ifix_buf); in dump_rtsock()
742 if (W_ADDR + W_LL + W_IF - addrwidth - llwidth > ifwidth) in dump_rtsock()
743 ifwidth = W_ADDR + W_LL + W_IF - addrwidth - llwidth; in dump_rtsock()
745 xo_open_instance("neighbor-cache"); in dump_rtsock()
749 "{:address/%%-%d.%ds/%%s} {:mac-address/%%-%d.%ds/%%s} {:interface/%%%d.%ds/%%s}", in dump_rtsock()
754 expire = rtm->rtm_rmx.rmx_expire; in dump_rtsock()
755 int expire_in = expire - now.tv_sec; in dump_rtsock()
757 xo_emit("{d:/ %-9.9s}{e:expires_sec/%d}", sec2str(expire_in), expire_in); in dump_rtsock()
759 xo_emit("{d:/ %-9.9s}{en:permanent/true}", "permanent"); in dump_rtsock()
761 xo_emit("{d:/ %-9.9s}{e:expires_sec/%d}", "expired", expire_in); in dump_rtsock()
764 switch (rtm->rtm_rmx.rmx_state) { in dump_rtsock()
792 xo_emit(" {:neighbor-state/%s}", lle_state); in dump_rtsock()
794 isrouter = rtm->rtm_flags & RTF_GATEWAY; in dump_rtsock()
795 prbs = rtm->rtm_rmx.rmx_pksent; in dump_rtsock()
800 if ((rtm->rtm_addrs & RTA_NETMASK) == 0) { in dump_rtsock()
803 (rtm->rtm_flags & RTF_ANNOUNCE) ? "p" : ""); in dump_rtsock()
807 (sdl->sdl_len + (char *)sdl); in dump_rtsock()
810 !IN6_IS_ADDR_UNSPECIFIED(&sin->sin6_addr) ? "P" : "", in dump_rtsock()
811 (sin->sin6_len != sizeof(struct sockaddr_in6)) ? "W" : "", in dump_rtsock()
812 (rtm->rtm_flags & RTF_ANNOUNCE) ? "p" : ""); in dump_rtsock()
816 (rtm->rtm_flags & RTF_ANNOUNCE) ? "p" : ""); in dump_rtsock()
819 xo_emit(" {:nd-flags/%s}", flgbuf); in dump_rtsock()
825 xo_close_instance("neighbor-cache"); in dump_rtsock()
837 xo_close_list("neighbor-cache"); in dump_rtsock()
892 if (sdl->sdl_alen == ETHER_ADDR_LEN) { in ether_str()
895 } else if (sdl->sdl_alen) { in ether_str()
896 int n = sdl->sdl_nlen > 0 ? sdl->sdl_nlen + 1 : 0; in ether_str()
923 xo_error("usage: ndp [-nt] hostname\n"); in usage()
924 xo_error(" ndp [-nt] -a | -c | -p | -r | -H | -P | -R\n"); in usage()
925 xo_error(" ndp [-nt] -A wait\n"); in usage()
926 xo_error(" ndp [-nt] -d hostname\n"); in usage()
927 xo_error(" ndp [-nt] -f filename\n"); in usage()
928 xo_error(" ndp [-nt] -i interface [flags...]\n"); in usage()
930 xo_error(" ndp [-nt] -I [interface|delete]\n"); in usage()
932 xo_error(" ndp [-nt] -s nodename etheraddr [temp] [proxy]\n"); in usage()
942 register struct rt_msghdr *rtm = &m_rtmsg.m_rtm; in rtmsg() local
950 rtm->rtm_flags = opts.flags; in rtmsg()
951 rtm->rtm_version = RTM_VERSION; in rtmsg()
957 rtm->rtm_addrs |= RTA_GATEWAY; in rtmsg()
959 rtm->rtm_rmx.rmx_expire = opts.expire_time; in rtmsg()
960 rtm->rtm_inits = RTV_EXPIRE; in rtmsg()
962 rtm->rtm_flags |= (RTF_HOST | RTF_STATIC | RTF_LLDATA); in rtmsg()
965 rtm->rtm_addrs |= RTA_DST; in rtmsg()
971 rtm->rtm_msglen = cp - (char *)&m_rtmsg; in rtmsg()
973 l = rtm->rtm_msglen; in rtmsg()
974 rtm->rtm_seq = ++seq; in rtmsg()
975 rtm->rtm_type = cmd; in rtmsg()
984 } while (l > 0 && (rtm->rtm_type != cmd || rtm->rtm_seq != seq || in rtmsg()
985 rtm->rtm_pid != pid)); in rtmsg()
1018 if (*cp == '-') { in ifinfo()
1196 xo_open_list("router-list"); in rtrlist()
1203 if (getnameinfo((struct sockaddr *)&p->rtaddr, in rtrlist()
1204 p->rtaddr.sin6_len, host_buf, sizeof(host_buf), NULL, 0, in rtrlist()
1210 inet_ntop(AF_INET6, &p->rtaddr.sin6_addr, abuf, sizeof(abuf)); in rtrlist()
1214 xo_open_instance("router-list"); in rtrlist()
1217 if_indextoname(p->if_index, ifix_buf)); in rtrlist()
1220 if (p->flags & ND_RA_FLAG_MANAGED) { in rtrlist()
1224 if (p->flags & ND_RA_FLAG_OTHER) { in rtrlist()
1229 if (p->flags & ND_RA_FLAG_IPV6_ONLY) { in rtrlist()
1237 rtpref = ((p->flags & ND_RA_FLAG_RTPREF_MASK) >> 3) & 0xff; in rtrlist()
1241 if (p->expire == 0) in rtrlist()
1245 sec2str(p->expire - now.tv_sec), in rtrlist()
1246 (long)p->expire - now.tv_sec); in rtrlist()
1247 xo_close_instance("router-list"); in rtrlist()
1250 xo_close_list("router-list"); in rtrlist()
1280 xo_open_list("prefix-list"); in plist()
1285 n = (struct in6_prefix *)&advrtr[p->advrtrs]; in plist()
1287 xo_open_instance("prefix-list"); in plist()
1288 if (getnameinfo((struct sockaddr *)&p->prefix, in plist()
1289 p->prefix.sin6_len, namebuf, sizeof(namebuf), in plist()
1293 p->prefixlen, if_indextoname(p->if_index, ifix_buf)); in plist()
1302 if (p->raflags.onlink) { in plist()
1306 if (p->raflags.autonomous) { in plist()
1310 if (p->flags & NDPRF_ONLINK) { in plist()
1314 if (p->flags & NDPRF_DETACHED) { in plist()
1319 if (p->flags & NDPRF_HOME) { in plist()
1326 int expire_in = p->expire - now.tv_sec; in plist()
1328 if (p->vltime == ND6_INFINITE_LIFETIME) in plist()
1329 xo_emit(" vltime=infinity{e:valid-lifetime/%lu}", in plist()
1330 (unsigned long)p->vltime); in plist()
1332 xo_emit(" vltime={:valid-lifetime/%lu}", in plist()
1333 (unsigned long)p->vltime); in plist()
1334 if (p->pltime == ND6_INFINITE_LIFETIME) in plist()
1335 xo_emit(", pltime=infinity{e:preferred-lifetime/%lu}", in plist()
1336 (unsigned long)p->pltime); in plist()
1338 xo_emit(", pltime={:preferred-lifetime/%lu}", in plist()
1339 (unsigned long)p->pltime); in plist()
1340 if (p->expire == 0) in plist()
1342 else if (p->expire >= now.tv_sec) in plist()
1347 xo_emit(", ref={:refcount/%d}", p->refcnt); in plist()
1353 if (p->advrtrs) { in plist()
1359 xo_open_list("advertising-routers"); in plist()
1360 for (j = 0; j < p->advrtrs; j++) { in plist()
1363 xo_open_instance("advertising-routers"); in plist()
1365 sin6->sin6_len, namebuf, sizeof(namebuf), in plist()
1369 inet_ntop(AF_INET6, &sin6->sin6_addr, abuf, in plist()
1375 nbi = getnbrinfo(&sin6->sin6_addr, in plist()
1376 p->if_index, 0); in plist()
1379 switch (nbi->state) { in plist()
1393 xo_close_instance("advertising-routers"); in plist()
1395 xo_close_list("advertising-routers"); in plist()
1398 xo_close_instance("prefix-list"); in plist()
1402 xo_close_list("prefix-list"); in plist()
1499 xo_emit("ND default interface = {:default-interface/%s}\n", ifname); in getdefif()
1523 n = snprintf(p, ep - p, "%dd", days); in sec2str()
1524 if (n < 0 || n >= ep - p) in sec2str()
1530 n = snprintf(p, ep - p, "%dh", hours); in sec2str()
1531 if (n < 0 || n >= ep - p) in sec2str()
1537 n = snprintf(p, ep - p, "%dm", mins); in sec2str()
1538 if (n < 0 || n >= ep - p) in sec2str()
1542 snprintf(p, ep - p, "%ds", secs); in sec2str()
1557 sec = (tvp->tv_sec + thiszone) % 86400; in ts_print()
1559 tvp->tv_sec, tvp->tv_usec, in ts_print()
1560 sec / 3600, (sec % 3600) / 60, sec % 60, (u_int32_t)tvp->tv_usec); in ts_print()