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