summaryrefslogtreecommitdiffstats
path: root/freebsd/usr.bin/netstat/route.c
diff options
context:
space:
mode:
Diffstat (limited to 'freebsd/usr.bin/netstat/route.c')
-rw-r--r--freebsd/usr.bin/netstat/route.c64
1 files changed, 37 insertions, 27 deletions
diff --git a/freebsd/usr.bin/netstat/route.c b/freebsd/usr.bin/netstat/route.c
index 584ce132..1725c78d 100644
--- a/freebsd/usr.bin/netstat/route.c
+++ b/freebsd/usr.bin/netstat/route.c
@@ -126,7 +126,6 @@ typedef union {
static sa_u pt_u;
-static int fibnum;
static struct rtentry rtentry;
static struct radix_node rnode;
static struct radix_mask rmask;
@@ -159,8 +158,7 @@ routepr(u_long rtree)
{
struct radix_node_head **rnhp, *rnh, head;
size_t intsize;
- int i;
- int numfibs;
+ int fam, fibnum, numfibs;
intsize = sizeof(int);
if (sysctlbyname("net.my_fibnum", &fibnum, &intsize, NULL, 0) == -1)
@@ -198,15 +196,20 @@ routepr(u_long rtree)
if (kread((u_long)(rtree), (char *)(rt_tables), (numfibs *
(AF_MAX+1) * sizeof(struct radix_node_head *))) != 0)
return;
- for (i = 0; i <= AF_MAX; i++) {
+ for (fam = 0; fam <= AF_MAX; fam++) {
int tmpfib;
- if (i != AF_INET)
- tmpfib = 0;
- else
+
+ switch (fam) {
+ case AF_INET6:
+ case AF_INET:
tmpfib = fibnum;
+ break;
+ default:
+ tmpfib = 0;
+ }
rnhp = (struct radix_node_head **)*rt_tables;
/* Calculate the in-kernel address. */
- rnhp += tmpfib * (AF_MAX+1) + i;
+ rnhp += tmpfib * (AF_MAX+1) + fam;
/* Read the in kernel rhn pointer. */
if (kget(rnhp, rnh) != 0)
continue;
@@ -219,16 +222,16 @@ routepr(u_long rtree)
/* Read the rnh data. */
if (kget(rnh, head) != 0)
continue;
- if (i == AF_UNSPEC) {
+ if (fam == AF_UNSPEC) {
if (Aflag && af == 0) {
printf("Netmasks:\n");
p_tree(head.rnh_treetop);
}
- } else if (af == AF_UNSPEC || af == i) {
- size_cols(i, head.rnh_treetop);
- pr_family(i);
+ } else if (af == AF_UNSPEC || af == fam) {
+ size_cols(fam, head.rnh_treetop);
+ pr_family(fam);
do_rtent = 1;
- pr_rthdr(i);
+ pr_rthdr(fam);
p_tree(head.rnh_treetop);
}
}
@@ -654,18 +657,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);
@@ -923,6 +916,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)
{
@@ -1121,10 +1133,8 @@ ipx_phost(struct sockaddr *sa)
struct sockaddr_ipx work;
static union ipx_net ipx_zeronet;
char *p;
- struct ipx_addr in;
work = *sipx;
- in = work.sipx_addr;
work.sipx_addr.x_port = 0;
work.sipx_addr.x_net = ipx_zeronet;