123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- #
- # $FreeBSD$
- #
- document netstat-anr
- Print routing tables as 'netstat -anr' does.
- end
- set $debug = 0
- set $AF_INET = 2
- set $AF_LINK = 18
- set $RNF_ROOT = 2
- set $RNF_ACTIVE = 4
- set $RTF_UP = 0x1
- set $RTF_GATEWAY = 0x2
- set $RTF_HOST = 0x4
- set $RTF_STATIC = 0x800
- #
- # XXX: alas, we can't script "show endian"
- #
- if (machine[0] == 'a' && machine[1] == 'm' && machine[2] == 'd') || \
- (machine[0] == 'i' && machine[1] == '3' && machine[2] == '8')
- set $byteswap = 1
- else
- set $byteswap = 0
- end
- define routename
- if ($byteswap)
- printf "%u.%u.%u.%u", \
- $arg0 & 0xff, ($arg0 >> 8) & 0xff, \
- ($arg0 >> 16) & 0xff, ($arg0 >> 24) & 0xff
- else
- printf "%u.%u.%u.%u", \
- ($arg0 >> 24) & 0xff, ($arg0 >> 16) & 0xff, \
- ($arg0 >> 8) & 0xff, $arg0 & 0xff
- end
- end
- define domask
- set $i = 0
- set $b = 0
- while $b < 32
- if ($arg0 & (1 << $b))
- set $i = $i + 1
- end
- set $b = $b + 1
- end
- printf "/%d", $i
- end
- define p_flags
- if ($arg0 & $RTF_UP)
- printf "U"
- end
- if ($arg0 & $RTF_GATEWAY)
- printf "G"
- end
- if ($arg0 & $RTF_HOST)
- printf "H"
- end
- if ($arg0 & $RTF_STATIC)
- printf "S"
- end
- end
- define p_sockaddr
- set $sa = (struct sockaddr *)$arg0
- set $flags = $arg2
- if ($sa->sa_family == $AF_INET)
- set $sin = (struct sockaddr_in *)$arg0
- set $mask = (struct sockaddr_in *)$arg1
- if ($flags & $RTF_HOST)
- routename $sin->sin_addr.s_addr
- else
- routename $sin->sin_addr.s_addr
- if ($mask != 0)
- domask $mask->sin_addr.s_addr
- else
- domask 0
- end
- end
- end
- if ($sa->sa_family == $AF_LINK)
- set $sdl = (struct sockaddr_dl *)$arg0
- if ($sdl->sdl_nlen == 0 && $sdl->sdl_alen == 0 && \
- $sdl->sdl_slen == 0)
- printf "link#%d", $sdl->sdl_index
- end
- end
- end
- define p_rtentry
- set $rte = (struct rtentry *)$arg0
- set $rn = (struct radix_node *)$arg0
- set $sa = ((struct sockaddr **)($rn->rn_u.rn_leaf.rn_Key))
- set $sam = ((struct sockaddr **)($rn->rn_u.rn_leaf.rn_Mask))
- set $gw = $rte->rt_gateway
- p_sockaddr $sa $sam $rte->rt_flags
- printf "\t"
- p_sockaddr $gw 0 $RTF_HOST
- printf "\t"
- p_flags $rte->rt_flags
- printf "\t"
- if ($rte->rt_ifp != 0)
- printf "%s", $rte->rt_ifp->if_xname
- end
- printf "\n"
- end
- define p_rtree
- set $rn_$arg0 = (struct radix_node *)$arg1
- set $left_$arg0 = $arg0 + 1
- set $right_$arg0 = $arg0 + 2
- set $duped_$arg0 = $arg0 + 3
- if ($rn_$arg0->rn_bit < 0 || ($rn_$arg0->rn_flags & $RNF_ACTIVE) == 0)
- if ($debug == 1)
- printf "print "
- p $rn_$arg0
- end
- if (($rn_$arg0->rn_flags & ($RNF_ACTIVE | $RNF_ROOT)) == \
- $RNF_ACTIVE)
- p_rtentry $rn_$arg0
- end
- if (($rn_$arg0->rn_flags & $RNF_ACTIVE) != 0 && \
- $rn_$arg0->rn_u.rn_leaf.rn_Dupedkey != 0)
- if ($debug == 1)
- printf "duped "
- p $rn_$arg0
- end
- p_rtree $duped_$arg0 $rn_$arg0->rn_u.rn_leaf.rn_Dupedkey
- end
- else
- if ($rn_$arg0->rn_u.rn_node.rn_R != 0)
- if ($debug == 1)
- printf "right "
- p $rn_$arg0
- end
- p_rtree $right_$arg0 $rn_$arg0->rn_u.rn_node.rn_R
- end
- if ($rn_$arg0->rn_u.rn_node.rn_L != 0)
- if ($debug == 1)
- printf "left "
- p $rn_$arg0
- end
- p_rtree $left_$arg0 $rn_$arg0->rn_u.rn_node.rn_L
- end
- end
- end
- define netstat-anr
- printf "Routing tables\n\nInternet:\n"
- set $af = $AF_INET
- set $rt = (struct radix_node_head **)rt_tables + $af
- printf "Destination\tGateway\tFlags\tNetif\n"
- p_rtree 0 $rt->rnh_treetop
- end
|