xref: /freebsd/tools/debugscripts/netstat-anr.gdb (revision d0b2dbfa0ecf2bbc9709efc5e20baf8e4b44bbbf)
1*1ab64a61SGleb Smirnoff#
2*1ab64a61SGleb Smirnoff#
3*1ab64a61SGleb Smirnoff
4*1ab64a61SGleb Smirnoffdocument netstat-anr
5*1ab64a61SGleb SmirnoffPrint routing tables as 'netstat -anr' does.
6*1ab64a61SGleb Smirnoffend
7*1ab64a61SGleb Smirnoff
8*1ab64a61SGleb Smirnoffset $debug = 0
9*1ab64a61SGleb Smirnoff
10*1ab64a61SGleb Smirnoffset $AF_INET = 2
11*1ab64a61SGleb Smirnoffset $AF_LINK = 18
12*1ab64a61SGleb Smirnoff
13*1ab64a61SGleb Smirnoffset $RNF_ROOT = 2
14*1ab64a61SGleb Smirnoffset $RNF_ACTIVE = 4
15*1ab64a61SGleb Smirnoff
16*1ab64a61SGleb Smirnoffset $RTF_UP		= 0x1
17*1ab64a61SGleb Smirnoffset $RTF_GATEWAY	= 0x2
18*1ab64a61SGleb Smirnoffset $RTF_HOST		= 0x4
19*1ab64a61SGleb Smirnoffset $RTF_STATIC		= 0x800
20*1ab64a61SGleb Smirnoff
21*1ab64a61SGleb Smirnoff#
22*1ab64a61SGleb Smirnoff# XXX: alas, we can't script "show endian"
23*1ab64a61SGleb Smirnoff#
24*1ab64a61SGleb Smirnoffif (machine[0] == 'a' && machine[1] == 'm' && machine[2] == 'd') || \
25*1ab64a61SGleb Smirnoff   (machine[0] == 'i' && machine[1] == '3' && machine[2] == '8')
26*1ab64a61SGleb Smirnoff	set $byteswap = 1
27*1ab64a61SGleb Smirnoffelse
28*1ab64a61SGleb Smirnoff	set $byteswap = 0
29*1ab64a61SGleb Smirnoffend
30*1ab64a61SGleb Smirnoff
31*1ab64a61SGleb Smirnoffdefine routename
32*1ab64a61SGleb Smirnoff	if ($byteswap)
33*1ab64a61SGleb Smirnoff		printf "%u.%u.%u.%u", \
34*1ab64a61SGleb Smirnoff		    $arg0 & 0xff, ($arg0 >> 8) & 0xff, \
35*1ab64a61SGleb Smirnoff		    ($arg0 >> 16) & 0xff, ($arg0 >> 24) & 0xff
36*1ab64a61SGleb Smirnoff	else
37*1ab64a61SGleb Smirnoff		printf "%u.%u.%u.%u", \
38*1ab64a61SGleb Smirnoff		    ($arg0 >> 24) & 0xff, ($arg0 >> 16) & 0xff, \
39*1ab64a61SGleb Smirnoff		    ($arg0 >> 8) & 0xff, $arg0 & 0xff
40*1ab64a61SGleb Smirnoff	end
41*1ab64a61SGleb Smirnoffend
42*1ab64a61SGleb Smirnoff
43*1ab64a61SGleb Smirnoffdefine domask
44*1ab64a61SGleb Smirnoff	set $i = 0
45*1ab64a61SGleb Smirnoff	set $b = 0
46*1ab64a61SGleb Smirnoff	while $b < 32
47*1ab64a61SGleb Smirnoff		if ($arg0 & (1 << $b))
48*1ab64a61SGleb Smirnoff			set $i = $i + 1
49*1ab64a61SGleb Smirnoff		end
50*1ab64a61SGleb Smirnoff		set $b = $b + 1
51*1ab64a61SGleb Smirnoff	end
52*1ab64a61SGleb Smirnoff	printf "/%d", $i
53*1ab64a61SGleb Smirnoffend
54*1ab64a61SGleb Smirnoff
55*1ab64a61SGleb Smirnoffdefine p_flags
56*1ab64a61SGleb Smirnoff	if ($arg0 & $RTF_UP)
57*1ab64a61SGleb Smirnoff		printf "U"
58*1ab64a61SGleb Smirnoff	end
59*1ab64a61SGleb Smirnoff	if ($arg0 & $RTF_GATEWAY)
60*1ab64a61SGleb Smirnoff		printf "G"
61*1ab64a61SGleb Smirnoff	end
62*1ab64a61SGleb Smirnoff	if ($arg0 & $RTF_HOST)
63*1ab64a61SGleb Smirnoff		printf "H"
64*1ab64a61SGleb Smirnoff	end
65*1ab64a61SGleb Smirnoff	if ($arg0 & $RTF_STATIC)
66*1ab64a61SGleb Smirnoff		printf "S"
67*1ab64a61SGleb Smirnoff	end
68*1ab64a61SGleb Smirnoffend
69*1ab64a61SGleb Smirnoff
70*1ab64a61SGleb Smirnoffdefine p_sockaddr
71*1ab64a61SGleb Smirnoff	set $sa = (struct sockaddr *)$arg0
72*1ab64a61SGleb Smirnoff	set $flags = $arg2
73*1ab64a61SGleb Smirnoff	if ($sa->sa_family == $AF_INET)
74*1ab64a61SGleb Smirnoff		set $sin = (struct sockaddr_in *)$arg0
75*1ab64a61SGleb Smirnoff		set $mask = (struct sockaddr_in *)$arg1
76*1ab64a61SGleb Smirnoff		if ($flags & $RTF_HOST)
77*1ab64a61SGleb Smirnoff			routename $sin->sin_addr.s_addr
78*1ab64a61SGleb Smirnoff		else
79*1ab64a61SGleb Smirnoff			routename $sin->sin_addr.s_addr
80*1ab64a61SGleb Smirnoff			if ($mask != 0)
81*1ab64a61SGleb Smirnoff				domask $mask->sin_addr.s_addr
82*1ab64a61SGleb Smirnoff			else
83*1ab64a61SGleb Smirnoff				domask 0
84*1ab64a61SGleb Smirnoff			end
85*1ab64a61SGleb Smirnoff		end
86*1ab64a61SGleb Smirnoff	end
87*1ab64a61SGleb Smirnoff	if ($sa->sa_family == $AF_LINK)
88*1ab64a61SGleb Smirnoff		set $sdl = (struct sockaddr_dl *)$arg0
89*1ab64a61SGleb Smirnoff		if ($sdl->sdl_nlen == 0 && $sdl->sdl_alen == 0 && \
90*1ab64a61SGleb Smirnoff		    $sdl->sdl_slen == 0)
91*1ab64a61SGleb Smirnoff			printf "link#%d", $sdl->sdl_index
92*1ab64a61SGleb Smirnoff		end
93*1ab64a61SGleb Smirnoff	end
94*1ab64a61SGleb Smirnoffend
95*1ab64a61SGleb Smirnoff
96*1ab64a61SGleb Smirnoffdefine p_rtentry
97*1ab64a61SGleb Smirnoff	set $rte = (struct rtentry *)$arg0
98*1ab64a61SGleb Smirnoff	set $rn = (struct radix_node *)$arg0
99*1ab64a61SGleb Smirnoff	set $sa = ((struct sockaddr **)($rn->rn_u.rn_leaf.rn_Key))
100*1ab64a61SGleb Smirnoff	set $sam = ((struct sockaddr **)($rn->rn_u.rn_leaf.rn_Mask))
101*1ab64a61SGleb Smirnoff	set $gw = $rte->rt_gateway
102*1ab64a61SGleb Smirnoff
103*1ab64a61SGleb Smirnoff	p_sockaddr $sa $sam $rte->rt_flags
104*1ab64a61SGleb Smirnoff	printf "\t"
105*1ab64a61SGleb Smirnoff	p_sockaddr $gw 0 $RTF_HOST
106*1ab64a61SGleb Smirnoff	printf "\t"
107*1ab64a61SGleb Smirnoff	p_flags $rte->rt_flags
108*1ab64a61SGleb Smirnoff	printf "\t"
109*1ab64a61SGleb Smirnoff	if ($rte->rt_ifp != 0)
110*1ab64a61SGleb Smirnoff		printf "%s", $rte->rt_ifp->if_xname
111*1ab64a61SGleb Smirnoff	end
112*1ab64a61SGleb Smirnoff	printf "\n"
113*1ab64a61SGleb Smirnoffend
114*1ab64a61SGleb Smirnoff
115*1ab64a61SGleb Smirnoffdefine p_rtree
116*1ab64a61SGleb Smirnoff	set $rn_$arg0 = (struct radix_node *)$arg1
117*1ab64a61SGleb Smirnoff	set $left_$arg0 = $arg0 + 1
118*1ab64a61SGleb Smirnoff	set $right_$arg0 = $arg0 + 2
119*1ab64a61SGleb Smirnoff	set $duped_$arg0 = $arg0 + 3
120*1ab64a61SGleb Smirnoff
121*1ab64a61SGleb Smirnoff	if ($rn_$arg0->rn_bit < 0 || ($rn_$arg0->rn_flags & $RNF_ACTIVE) == 0)
122*1ab64a61SGleb Smirnoff		if ($debug == 1)
123*1ab64a61SGleb Smirnoff			printf "print "
124*1ab64a61SGleb Smirnoff			p $rn_$arg0
125*1ab64a61SGleb Smirnoff		end
126*1ab64a61SGleb Smirnoff		if (($rn_$arg0->rn_flags & ($RNF_ACTIVE | $RNF_ROOT)) == \
127*1ab64a61SGleb Smirnoff		    $RNF_ACTIVE)
128*1ab64a61SGleb Smirnoff			p_rtentry $rn_$arg0
129*1ab64a61SGleb Smirnoff		end
130*1ab64a61SGleb Smirnoff		if (($rn_$arg0->rn_flags & $RNF_ACTIVE) != 0 && \
131*1ab64a61SGleb Smirnoff		    $rn_$arg0->rn_u.rn_leaf.rn_Dupedkey != 0)
132*1ab64a61SGleb Smirnoff			if ($debug == 1)
133*1ab64a61SGleb Smirnoff				printf "duped "
134*1ab64a61SGleb Smirnoff				p $rn_$arg0
135*1ab64a61SGleb Smirnoff			end
136*1ab64a61SGleb Smirnoff			p_rtree $duped_$arg0 $rn_$arg0->rn_u.rn_leaf.rn_Dupedkey
137*1ab64a61SGleb Smirnoff		end
138*1ab64a61SGleb Smirnoff	else
139*1ab64a61SGleb Smirnoff		if ($rn_$arg0->rn_u.rn_node.rn_R != 0)
140*1ab64a61SGleb Smirnoff			if ($debug == 1)
141*1ab64a61SGleb Smirnoff				printf "right "
142*1ab64a61SGleb Smirnoff				p $rn_$arg0
143*1ab64a61SGleb Smirnoff			end
144*1ab64a61SGleb Smirnoff			p_rtree $right_$arg0 $rn_$arg0->rn_u.rn_node.rn_R
145*1ab64a61SGleb Smirnoff		end
146*1ab64a61SGleb Smirnoff		if ($rn_$arg0->rn_u.rn_node.rn_L != 0)
147*1ab64a61SGleb Smirnoff			if ($debug == 1)
148*1ab64a61SGleb Smirnoff				printf "left "
149*1ab64a61SGleb Smirnoff				p $rn_$arg0
150*1ab64a61SGleb Smirnoff			end
151*1ab64a61SGleb Smirnoff			p_rtree $left_$arg0 $rn_$arg0->rn_u.rn_node.rn_L
152*1ab64a61SGleb Smirnoff		end
153*1ab64a61SGleb Smirnoff	end
154*1ab64a61SGleb Smirnoffend
155*1ab64a61SGleb Smirnoff
156*1ab64a61SGleb Smirnoffdefine netstat-anr
157*1ab64a61SGleb Smirnoff	printf "Routing tables\n\nInternet:\n"
158*1ab64a61SGleb Smirnoff	set $af = $AF_INET
159*1ab64a61SGleb Smirnoff	set $rt = (struct radix_node_head **)rt_tables + $af
160*1ab64a61SGleb Smirnoff	printf "Destination\tGateway\tFlags\tNetif\n"
161*1ab64a61SGleb Smirnoff	p_rtree 0 $rt->rnh_treetop
162*1ab64a61SGleb Smirnoffend
163