ndp.c (173412) | ndp.c (186119) |
---|---|
1/* $FreeBSD: head/usr.sbin/ndp/ndp.c 173412 2007-11-07 10:53:41Z kevlo $ */ | 1/* $FreeBSD: head/usr.sbin/ndp/ndp.c 186119 2008-12-15 06:10:57Z qingli $ */ |
2/* $KAME: ndp.c,v 1.104 2003/06/27 07:48:39 itojun Exp $ */ 3 4/* 5 * Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions --- 99 unchanged lines hidden (view full) --- 109#include <unistd.h> 110#include "gmt2local.h" 111 112/* packing rule for routing socket */ 113#define ROUNDUP(a) \ 114 ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long)) 115#define ADVANCE(x, n) (x += ROUNDUP((n)->sa_len)) 116 | 2/* $KAME: ndp.c,v 1.104 2003/06/27 07:48:39 itojun Exp $ */ 3 4/* 5 * Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions --- 99 unchanged lines hidden (view full) --- 109#include <unistd.h> 110#include "gmt2local.h" 111 112/* packing rule for routing socket */ 113#define ROUNDUP(a) \ 114 ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long)) 115#define ADVANCE(x, n) (x += ROUNDUP((n)->sa_len)) 116 |
117#define NEXTADDR(w, s) \ 118 if (rtm->rtm_addrs & (w)) { \ 119 bcopy((char *)&s, cp, sizeof(s)); cp += sizeof(s);} 120 121 |
|
117static pid_t pid; 118static int nflag; 119static int tflag; 120static int32_t thiszone; /* time difference with gmt */ 121static int s = -1; 122static int repeat = 0; 123 124char ntop_buf[INET6_ADDRSTRLEN]; /* inet_ntop() */ --- 298 unchanged lines hidden (view full) --- 423 if (rtmsg(RTM_GET) < 0) { 424 errx(1, "RTM_GET(%s) failed", host); 425 /* NOTREACHED */ 426 } 427 sin = (struct sockaddr_in6 *)(rtm + 1); 428 sdl = (struct sockaddr_dl *)(ROUNDUP(sin->sin6_len) + (char *)sin); 429 if (IN6_ARE_ADDR_EQUAL(&sin->sin6_addr, &sin_m.sin6_addr)) { 430 if (sdl->sdl_family == AF_LINK && | 122static pid_t pid; 123static int nflag; 124static int tflag; 125static int32_t thiszone; /* time difference with gmt */ 126static int s = -1; 127static int repeat = 0; 128 129char ntop_buf[INET6_ADDRSTRLEN]; /* inet_ntop() */ --- 298 unchanged lines hidden (view full) --- 428 if (rtmsg(RTM_GET) < 0) { 429 errx(1, "RTM_GET(%s) failed", host); 430 /* NOTREACHED */ 431 } 432 sin = (struct sockaddr_in6 *)(rtm + 1); 433 sdl = (struct sockaddr_dl *)(ROUNDUP(sin->sin6_len) + (char *)sin); 434 if (IN6_ARE_ADDR_EQUAL(&sin->sin6_addr, &sin_m.sin6_addr)) { 435 if (sdl->sdl_family == AF_LINK && |
431 (rtm->rtm_flags & RTF_LLINFO) && | |
432 !(rtm->rtm_flags & RTF_GATEWAY)) { 433 switch (sdl->sdl_type) { 434 case IFT_ETHER: case IFT_FDDI: case IFT_ISO88023: 435 case IFT_ISO88024: case IFT_ISO88025: 436 goto overwrite; 437 } 438 } 439 /* --- 54 unchanged lines hidden (view full) --- 494 * Delete a neighbor cache entry 495 */ 496int 497delete(host) 498 char *host; 499{ 500 struct sockaddr_in6 *sin = &sin_m; 501 register struct rt_msghdr *rtm = &m_rtmsg.m_rtm; | 436 !(rtm->rtm_flags & RTF_GATEWAY)) { 437 switch (sdl->sdl_type) { 438 case IFT_ETHER: case IFT_FDDI: case IFT_ISO88023: 439 case IFT_ISO88024: case IFT_ISO88025: 440 goto overwrite; 441 } 442 } 443 /* --- 54 unchanged lines hidden (view full) --- 498 * Delete a neighbor cache entry 499 */ 500int 501delete(host) 502 char *host; 503{ 504 struct sockaddr_in6 *sin = &sin_m; 505 register struct rt_msghdr *rtm = &m_rtmsg.m_rtm; |
506 register char *cp = m_rtmsg.m_space; |
|
502 struct sockaddr_dl *sdl; 503 struct addrinfo hints, *res; 504 int gai_error; 505 506 getsocket(); 507 sin_m = blank_sin; 508 509 bzero(&hints, sizeof(hints)); --- 14 unchanged lines hidden (view full) --- 524 if (rtmsg(RTM_GET) < 0) { 525 errx(1, "RTM_GET(%s) failed", host); 526 /* NOTREACHED */ 527 } 528 sin = (struct sockaddr_in6 *)(rtm + 1); 529 sdl = (struct sockaddr_dl *)(ROUNDUP(sin->sin6_len) + (char *)sin); 530 if (IN6_ARE_ADDR_EQUAL(&sin->sin6_addr, &sin_m.sin6_addr)) { 531 if (sdl->sdl_family == AF_LINK && | 507 struct sockaddr_dl *sdl; 508 struct addrinfo hints, *res; 509 int gai_error; 510 511 getsocket(); 512 sin_m = blank_sin; 513 514 bzero(&hints, sizeof(hints)); --- 14 unchanged lines hidden (view full) --- 529 if (rtmsg(RTM_GET) < 0) { 530 errx(1, "RTM_GET(%s) failed", host); 531 /* NOTREACHED */ 532 } 533 sin = (struct sockaddr_in6 *)(rtm + 1); 534 sdl = (struct sockaddr_dl *)(ROUNDUP(sin->sin6_len) + (char *)sin); 535 if (IN6_ARE_ADDR_EQUAL(&sin->sin6_addr, &sin_m.sin6_addr)) { 536 if (sdl->sdl_family == AF_LINK && |
532 (rtm->rtm_flags & RTF_LLINFO) && | |
533 !(rtm->rtm_flags & RTF_GATEWAY)) { 534 goto delete; 535 } 536 /* 537 * IPv4 arp command retries with sin_other = SIN_PROXY here. 538 */ 539 fprintf(stderr, "delete: cannot delete non-NDP entry\n"); 540 return 1; 541 } 542 543delete: 544 if (sdl->sdl_family != AF_LINK) { 545 printf("cannot locate %s\n", host); 546 return (1); 547 } | 537 !(rtm->rtm_flags & RTF_GATEWAY)) { 538 goto delete; 539 } 540 /* 541 * IPv4 arp command retries with sin_other = SIN_PROXY here. 542 */ 543 fprintf(stderr, "delete: cannot delete non-NDP entry\n"); 544 return 1; 545 } 546 547delete: 548 if (sdl->sdl_family != AF_LINK) { 549 printf("cannot locate %s\n", host); 550 return (1); 551 } |
552 /* 553 * need to reinit the field because it has rt_key 554 * but we want the actual address 555 */ 556 NEXTADDR(RTA_DST, sin_m); |
|
548 if (rtmsg(RTM_DELETE) == 0) { 549 struct sockaddr_in6 s6 = *sin; /* XXX: for safety */ 550 551#ifdef __KAME__ 552 if (IN6_IS_ADDR_LINKLOCAL(&s6.sin6_addr)) { 553 s6.sin6_scope_id = ntohs(*(u_int16_t *)&s6.sin6_addr.s6_addr[2]); 554 *(u_int16_t *)&s6.sin6_addr.s6_addr[2] = 0; 555 } --- 42 unchanged lines hidden (view full) --- 598 W_IF, W_IF, "Netif", "Expire", "S", "Flags"); 599 600again:; 601 mib[0] = CTL_NET; 602 mib[1] = PF_ROUTE; 603 mib[2] = 0; 604 mib[3] = AF_INET6; 605 mib[4] = NET_RT_FLAGS; | 557 if (rtmsg(RTM_DELETE) == 0) { 558 struct sockaddr_in6 s6 = *sin; /* XXX: for safety */ 559 560#ifdef __KAME__ 561 if (IN6_IS_ADDR_LINKLOCAL(&s6.sin6_addr)) { 562 s6.sin6_scope_id = ntohs(*(u_int16_t *)&s6.sin6_addr.s6_addr[2]); 563 *(u_int16_t *)&s6.sin6_addr.s6_addr[2] = 0; 564 } --- 42 unchanged lines hidden (view full) --- 607 W_IF, W_IF, "Netif", "Expire", "S", "Flags"); 608 609again:; 610 mib[0] = CTL_NET; 611 mib[1] = PF_ROUTE; 612 mib[2] = 0; 613 mib[3] = AF_INET6; 614 mib[4] = NET_RT_FLAGS; |
615#ifdef RTF_LLINFO |
|
606 mib[5] = RTF_LLINFO; | 616 mib[5] = RTF_LLINFO; |
617#else 618 mib[5] = 0; 619#endif |
|
607 if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) 608 err(1, "sysctl(PF_ROUTE estimate)"); 609 if (needed > 0) { 610 if ((buf = malloc(needed)) == NULL) 611 err(1, "malloc"); 612 if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) 613 err(1, "sysctl(PF_ROUTE, NET_RT_FLAGS)"); 614 lim = buf + needed; --- 273 unchanged lines hidden (view full) --- 888 rtm->rtm_flags &= ~RTF_HOST; 889 rtm->rtm_addrs |= RTA_NETMASK; 890 } 891#endif 892 /* FALLTHROUGH */ 893 case RTM_GET: 894 rtm->rtm_addrs |= RTA_DST; 895 } | 620 if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) 621 err(1, "sysctl(PF_ROUTE estimate)"); 622 if (needed > 0) { 623 if ((buf = malloc(needed)) == NULL) 624 err(1, "malloc"); 625 if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) 626 err(1, "sysctl(PF_ROUTE, NET_RT_FLAGS)"); 627 lim = buf + needed; --- 273 unchanged lines hidden (view full) --- 901 rtm->rtm_flags &= ~RTF_HOST; 902 rtm->rtm_addrs |= RTA_NETMASK; 903 } 904#endif 905 /* FALLTHROUGH */ 906 case RTM_GET: 907 rtm->rtm_addrs |= RTA_DST; 908 } |
896#define NEXTADDR(w, s) \ 897 if (rtm->rtm_addrs & (w)) { \ 898 bcopy((char *)&s, cp, sizeof(s)); cp += SA_SIZE(&s);} | |
899 900 NEXTADDR(RTA_DST, sin_m); 901 NEXTADDR(RTA_GATEWAY, sdl_m); 902#if 0 /* we don't support ipv6addr/128 type proxying */ 903 memset(&so_mask.sin6_addr, 0xff, sizeof(so_mask.sin6_addr)); 904 NEXTADDR(RTA_NETMASK, so_mask); 905#endif 906 --- 704 unchanged lines hidden (view full) --- 1611{ 1612 int s; 1613 1614 /* Default */ 1615 s = (tvp->tv_sec + thiszone) % 86400; 1616 (void)printf("%02d:%02d:%02d.%06u ", 1617 s / 3600, (s % 3600) / 60, s % 60, (u_int32_t)tvp->tv_usec); 1618} | 909 910 NEXTADDR(RTA_DST, sin_m); 911 NEXTADDR(RTA_GATEWAY, sdl_m); 912#if 0 /* we don't support ipv6addr/128 type proxying */ 913 memset(&so_mask.sin6_addr, 0xff, sizeof(so_mask.sin6_addr)); 914 NEXTADDR(RTA_NETMASK, so_mask); 915#endif 916 --- 704 unchanged lines hidden (view full) --- 1621{ 1622 int s; 1623 1624 /* Default */ 1625 s = (tvp->tv_sec + thiszone) % 86400; 1626 (void)printf("%02d:%02d:%02d.%06u ", 1627 s / 3600, (s % 3600) / 60, s % 60, (u_int32_t)tvp->tv_usec); 1628} |
1629 1630#undef NEXTADDR |
|