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

1 /*-
2 * SPDX-License-Identifier: BSD-3-Clause
10 * Redistribution and use in source and binary forms, with or without
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * arp - display, set, and delete arp table entries
73 struct rt_msghdr *rtm);
112 while ((ch = getopt(argc, argv, "andfsSi:")) != -1) in main()
139 argc -= optind; in main()
147 xo_errx(1, "-i not applicable to this operation"); in main()
164 xo_open_list("arp-cache"); in main()
169 xo_close_list("arp-cache"); in main()
270 bcopy((char *)hp->h_addr, (char *)&reply.sin_addr, in getaddr()
309 argc -= 2; in set()
319 while (argc-- > 0) { in set()
337 argc--; argv++; in set()
360 if (!get_ifinfo(dst->sin_addr.s_addr, ea, &ifindex)) { in set()
362 inet_ntoa(dst->sin_addr)); in set()
392 struct rt_msghdr *rtm; in set_rtsock() local
395 * In the case a proxy-arp entry is being added for in set_rtsock()
402 rtm = rtmsg(RTM_GET, dst, NULL); in set_rtsock()
403 if (rtm == NULL) { in set_rtsock()
407 addr = (struct sockaddr_in *)(rtm + 1); in set_rtsock()
410 if ((sdl->sdl_family != AF_LINK) || in set_rtsock()
411 (rtm->rtm_flags & RTF_GATEWAY) || in set_rtsock()
412 !valid_type(sdl->sdl_type)) { in set_rtsock()
416 sdl_m->sdl_type = sdl->sdl_type; in set_rtsock()
417 sdl_m->sdl_index = sdl->sdl_index; in set_rtsock()
437 xo_open_list("arp-cache"); in get()
439 found = print_entries(opts.rifindex, addr->sin_addr); in get()
442 xo_emit("{d:hostname/%s} ({d:ip-address/%s}) -- no entry", in get()
443 host, inet_ntoa(addr->sin_addr)); in get()
449 xo_close_list("arp-cache"); in get()
465 struct rt_msghdr *rtm; in delete_rtsock() local
478 rtm = rtmsg(RTM_GET, dst, NULL); in delete_rtsock()
479 if (rtm == NULL) { in delete_rtsock()
483 addr = (struct sockaddr_in *)(rtm + 1); in delete_rtsock()
494 if (sdl->sdl_family == AF_LINK && in delete_rtsock()
495 !(rtm->rtm_flags & RTF_GATEWAY) && in delete_rtsock()
496 valid_type(sdl->sdl_type) ) { in delete_rtsock()
497 addr->sin_addr.s_addr = dst->sin_addr.s_addr; in delete_rtsock()
503 * is a proxy-arp entry to remove. in delete_rtsock()
512 rtm->rtm_flags |= RTF_LLDATA; in delete_rtsock()
514 printf("%s (%s) deleted\n", host, inet_ntoa(addr->sin_addr)); in delete_rtsock()
541 struct rt_msghdr *rtm; in search() local
557 xo_err(1, "route-sysctl-estimate"); in search()
570 if (st == -1) in search()
573 for (next = buf; next < lim; next += rtm->rtm_msglen) { in search()
574 rtm = (struct rt_msghdr *)next; in search()
575 sin2 = (struct sockaddr_in *)(rtm + 1); in search()
578 (opts.rifindex != sdl->sdl_index)) in search()
581 (addr != sin2->sin_addr.s_addr)) in search()
584 (*action)(sdl, sin2, rtm); in search()
596 struct sockaddr_in *addr, struct rt_msghdr *rtm) in print_entry() argument
606 xo_open_instance("arp-cache"); in print_entry()
609 hp = gethostbyaddr((caddr_t)&(addr->sin_addr), in print_entry()
610 sizeof addr->sin_addr, AF_INET); in print_entry()
614 host = hp->h_name; in print_entry()
620 xo_emit("{:hostname/%s} ({:ip-address/%s}) at ", host, in print_entry()
621 inet_ntoa(addr->sin_addr)); in print_entry()
622 if (sdl->sdl_alen) { in print_entry()
623 if ((sdl->sdl_type == IFT_ETHER || in print_entry()
624 sdl->sdl_type == IFT_L2VLAN || in print_entry()
625 sdl->sdl_type == IFT_BRIDGE) && in print_entry()
626 sdl->sdl_alen == ETHER_ADDR_LEN) in print_entry()
627 xo_emit("{:mac-address/%s}", in print_entry()
630 int n = sdl->sdl_nlen > 0 ? sdl->sdl_nlen + 1 : 0; in print_entry()
632 xo_emit("{:mac-address/%s}", link_ntoa(sdl) + n); in print_entry()
637 for (p = ifnameindex; p && p->if_index && p->if_name; p++) { in print_entry()
638 if (p->if_index == sdl->sdl_index) { in print_entry()
639 xo_emit(" on {:interface/%s}", p->if_name); in print_entry()
644 if (rtm->rtm_rmx.rmx_expire == 0) in print_entry()
652 if ((expire_time = rtm->rtm_rmx.rmx_expire - tp.tv_sec) > 0) in print_entry()
659 if (rtm->rtm_flags & RTF_ANNOUNCE) in print_entry()
662 switch(sdl->sdl_type) { in print_entry()
690 xo_close_instance("arp-cache"); in print_entry()
709 struct sockaddr_in *addr, struct rt_msghdr *rtm) in nuke_entry() argument
713 if (rtm->rtm_flags & RTF_PINNED) in nuke_entry()
716 snprintf(ip, sizeof(ip), "%s", inet_ntoa(addr->sin_addr)); in nuke_entry()
730 "usage: arp [-n] [-i interface] hostname", in usage()
731 " arp [-n] [-i interface] -a", in usage()
732 " arp -d hostname [pub]", in usage()
733 " arp -d [-i interface] -a", in usage()
734 " arp -s hostname ether_addr [temp] [reject | blackhole] [pub [only]]", in usage()
735 " arp -S hostname ether_addr [temp] [reject | blackhole] [pub [only]]", in usage()
736 " arp -f filename"); in usage()
746 static int s = -1; in rtmsg()
754 struct rt_msghdr *rtm = &m_rtmsg.m_rtm; in rtmsg() local
772 rtm->rtm_flags = opts.flags; in rtmsg()
773 rtm->rtm_version = RTM_VERSION; in rtmsg()
779 rtm->rtm_addrs |= RTA_GATEWAY; in rtmsg()
784 rtm->rtm_rmx.rmx_expire = opts.expire_time + tp.tv_sec; in rtmsg()
786 rtm->rtm_inits = RTV_EXPIRE; in rtmsg()
787 rtm->rtm_flags |= (RTF_HOST | RTF_STATIC | RTF_LLDATA); in rtmsg()
790 rtm->rtm_addrs |= RTA_DST; in rtmsg()
794 if ((s) != NULL && rtm->rtm_addrs & (w)) { \ in rtmsg()
803 rtm->rtm_msglen = cp - (char *)&m_rtmsg; in rtmsg()
805 l = rtm->rtm_msglen; in rtmsg()
806 rtm->rtm_seq = ++seq; in rtmsg()
807 rtm->rtm_type = cmd; in rtmsg()
816 } while (l > 0 && (rtm->rtm_type != cmd || rtm->rtm_seq != seq || in rtmsg()
817 rtm->rtm_pid != pid)); in rtmsg()
820 return (rtm); in rtmsg()
824 * get_ifinfo - get the hardware address and if_index of an interface
844 for (ifa = ifas; ifa != NULL; ifa = ifa->ifa_next) { in get_ifinfo()
845 if (ifa->ifa_addr == NULL || ifa->ifa_netmask == NULL) in get_ifinfo()
847 if (ifa->ifa_addr->sa_family != AF_INET) in get_ifinfo()
851 * and not point-to-point or loopback. in get_ifinfo()
853 if ((ifa->ifa_flags & in get_ifinfo()
859 ifa->ifa_netmask)->sin_addr.s_addr; in get_ifinfo()
861 ifa->ifa_addr)->sin_addr.s_addr; in get_ifinfo()
868 *pifindex = if_nametoindex(ifa->ifa_name); in get_ifinfo()
875 * Now scan through again looking for a link-level address in get_ifinfo()
878 for (ifd = ifas; ifd != NULL; ifd = ifd->ifa_next) { in get_ifinfo()
879 if (ifd->ifa_addr == NULL) in get_ifinfo()
881 if (strcmp(ifa->ifa_name, ifd->ifa_name) == 0 && in get_ifinfo()
882 ifd->ifa_addr->sa_family == AF_LINK) in get_ifinfo()
888 * Found the link-level address - copy it out in get_ifinfo()
890 dla = (struct sockaddr_dl *)ifd->ifa_addr; in get_ifinfo()
891 memcpy(hwaddr, LLADDR(dla), dla->sdl_alen); in get_ifinfo()
892 printf("using interface %s for proxy with address %s\n", ifa->ifa_name, in get_ifinfo()
894 retval = dla->sdl_alen; in get_ifinfo()