aboutsummaryrefslogblamecommitdiff
path: root/tools/debugscripts/netstat-anr.gdb
blob: d27ae65a94f6a2bc941a2388b24bb4b661264499 (plain) (tree)



























































































































































                                                                                






                                                            
#
# $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