- Hide the internal scope address representation of the KAME IPv6

stack from the output of `netstat -ani'.
- The node-local multicast address in the output of `netstat -rn'
  should be handled as well.

Spotted by:	Bernd Walter <ticso__at__cicely7.cicely.de>
This commit is contained in:
Hajimu UMEMOTO 2011-01-20 15:22:01 +00:00
parent 1e659efff7
commit cd05232a21
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=217642
3 changed files with 35 additions and 21 deletions

View File

@ -59,6 +59,9 @@ __FBSDID("$FreeBSD$");
#include <err.h>
#include <errno.h>
#include <libutil.h>
#ifdef INET6
#include <netdb.h>
#endif
#include <signal.h>
#include <stdint.h>
#include <stdio.h>
@ -75,7 +78,7 @@ static void sidewaysintpr(int, u_long);
static void catchalarm(int);
#ifdef INET6
static char ntop_buf[INET6_ADDRSTRLEN]; /* for inet_ntop() */
static char addr_buf[NI_MAXHOST]; /* for getnameinfo() */
#endif
/*
@ -339,13 +342,14 @@ intpr(int interval1, u_long ifnetaddr, void (*pfunc)(char *))
#ifdef INET6
case AF_INET6:
sockin6 = (struct sockaddr_in6 *)sa;
in6_fillscopeid(&ifaddr.in6.ia_addr);
printf("%-13.13s ",
netname6(&ifaddr.in6.ia_addr,
&ifaddr.in6.ia_prefixmask.sin6_addr));
printf("%-17.17s ",
inet_ntop(AF_INET6,
&sockin6->sin6_addr,
ntop_buf, sizeof(ntop_buf)));
in6_fillscopeid(sockin6);
getnameinfo(sa, sa->sa_len, addr_buf,
sizeof(addr_buf), 0, 0, NI_NUMERICHOST);
printf("%-17.17s ", addr_buf);
network_layer = 1;
break;
@ -465,13 +469,13 @@ intpr(int interval1, u_long ifnetaddr, void (*pfunc)(char *))
break;
#ifdef INET6
case AF_INET6:
in6_fillscopeid(&msa.in6);
getnameinfo(&msa.sa, msa.sa.sa_len,
addr_buf, sizeof(addr_buf), 0, 0,
NI_NUMERICHOST);
printf("%*s %-19.19s(refs: %d)\n",
Wflag ? 27 : 25, "",
inet_ntop(AF_INET6,
&msa.in6.sin6_addr,
ntop_buf,
sizeof(ntop_buf)),
ifma.ifma_refcount);
addr_buf, ifma.ifma_refcount);
break;
#endif /* INET6 */
case AF_LINK:

View File

@ -101,6 +101,7 @@ void mrt6_stats(u_long);
struct sockaddr_in6;
struct in6_addr;
void in6_fillscopeid(struct sockaddr_in6 *);
char *routename6(struct sockaddr_in6 *);
const char *netname6(struct sockaddr_in6 *, struct in6_addr *);
void inet6print(struct in6_addr *, int, const char *, int);

View File

@ -633,18 +633,8 @@ fmt_sockaddr(struct sockaddr *sa, struct sockaddr *mask, int flags)
case AF_INET6:
{
struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)sa;
struct in6_addr *in6 = &sa6->sin6_addr;
/*
* XXX: This is a special workaround for KAME kernels.
* sin6_scope_id field of SA should be set in the future.
*/
if (IN6_IS_ADDR_LINKLOCAL(in6) ||
IN6_IS_ADDR_MC_LINKLOCAL(in6)) {
/* XXX: override is ok? */
sa6->sin6_scope_id = (u_int32_t)ntohs(*(u_short *)&in6->s6_addr[2]);
*(u_short *)&in6->s6_addr[2] = 0;
}
in6_fillscopeid(sa6);
if (flags & RTF_HOST)
cp = routename6(sa6);
@ -895,6 +885,25 @@ netname(in_addr_t in, u_long mask)
#undef NSHIFT
#ifdef INET6
void
in6_fillscopeid(struct sockaddr_in6 *sa6)
{
#if defined(__KAME__)
/*
* XXX: This is a special workaround for KAME kernels.
* sin6_scope_id field of SA should be set in the future.
*/
if (IN6_IS_ADDR_LINKLOCAL(&sa6->sin6_addr) ||
IN6_IS_ADDR_MC_NODELOCAL(&sa6->sin6_addr) ||
IN6_IS_ADDR_MC_LINKLOCAL(&sa6->sin6_addr)) {
/* XXX: override is ok? */
sa6->sin6_scope_id =
ntohs(*(u_int16_t *)&sa6->sin6_addr.s6_addr[2]);
sa6->sin6_addr.s6_addr[2] = sa6->sin6_addr.s6_addr[3] = 0;
}
#endif
}
const char *
netname6(struct sockaddr_in6 *sa6, struct in6_addr *mask)
{