netstat-anr.gdb 3.3 KB

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