123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295 |
- # GDB macros for use with Quagga.
- #
- # Macros in this file are not daemon specific. E.g., OS or Quagga library
- # APIs.
- #
- # The macro file can be loaded with 'source <filename>'. They can then be
- # called by the user. Macros that explore more complicated structs generally
- # take pointer arguments.
- #
- # E.g.:
- #
- # (gdb) source ~paul/code/quagga/gdb/lib.txt
- # (gdb) break bgp_packet.c:613
- # Breakpoint 3 at 0x7fa883033a32: file bgp_packet.c, line 613.
- # (gdb) cont
- # ...
- # (gdb) cont
- # Breakpoint 3, bgp_write_packet (peer=0x7fa885199080) at bgp_packet.c:614
- # 614 if (CHECK_FLAG (adv->binfo->peer->cap,PEER_CAP_RESTART_RCV)
- # (gdb) dump_prefix4 &adv->rn->p
- # IPv4:10.1.1.0/24
- # (gdb) dump_prefix &adv->rn->p
- # IPv4:10.1.1.0/24
- #
- define def_ntohs
- set $data = (char *)$arg0
- set $i = 0
-
- set $_ = $data[$i++] << 8
- set $_ += $data[$i++]
- end
- document def_ntohs
- Read a 2-byte short at the given pointed to area as big-endian and
- return it in $_
- Argument: Pointer to a 2-byte, big-endian short word.
- Returns: Integer value of that word in $_
- end
- define def_ntohl
- set $data = (char *)$arg0
- set $i = 0
-
- set $_ = $data[$i++] << 24
- set $_ += $data[$i++] << 16
- set $_ += $data[$i++] << 8
- set $_ += $data[$i++]
- end
- document def_ntohl
- Read a 4-byte integer at the given pointed to area as big-endian and
- return it in $_
- Argument: Pointer to a big-endian 4-byte word.
- Returns: Integer value of that word in $_
- end
- # NB: This is in more complicated iterative form, rather than more
- # conventional and simpler recursive form, because GDB has a recursion limit
- # on macro calls (I think).
- define walk_route_table_next
- # callee saves
- set $_top = $top
- set $_node = $node
- set $_prevl = $prevl
-
- set $top = (struct route_node *)$arg0
- set $node = (struct route_node *)$arg1
- set $prevl = $node
-
- # first try left
- #echo try left\n
- set $node = $prevl->link[0]
-
- # otherwise try right
- if ($node == 0)
- #echo left null, try right\n
- set $node = $prevl->link[1]
- end
-
- # otherwise go up, till we find the first right that
- # we havn't been to yet
- if ($node == 0)
- set $node = $prevl
- while ($node != $top)
- #echo right null, try up and right\n
-
- set $prevl = $node
- set $parent = $node->parent
- set $node = $parent->link[1]
-
- if ($node != 0 && $node != $prevl)
- #echo found node \n
- loop_break
- end
-
- #echo go up\n
- set $node = $parent
- end
- end
-
- #printf "next node: 0x%x\n", $node
-
- set $_ = $node
-
- set $top = $_top
- set $node = $_node
- set $prevl = $_prevl
- end
- document walk_route_table_next
- Return the next node to visit in the given route_table (or subset of) and
- the given current node.
- Arguments:
- 1st: (struct route_node *) to the top of the route_table to walk
- 2nd: (struct route_node *) to the current node
- Returns: The (struct route_node *) for the next to visit in $_
- end
- define walk_route_table
- set $_visited = $visited
- set $_node = $node
- set $top = $_top
-
- set $node = (struct route_node *)$arg0
- set $top = (struct route_node *)$arg0
- set $visited = 0
-
- while ($node != 0)
- printf "Node: 0x%x", $node
- if ($node->info != 0)
- printf "\tinfo: 0x%x", $node->info
- set $visited = $visited + 1
- end
-
- printf "\n"
-
- walk_route_table_next $top $node
- set $node = $_
-
- # we've gotten back to the top, finish
- if ($node == $top)
- set $node = 0
- end
- end
- printf "Visited: %u\n", $visited
-
- set $top = $_top
- set $visited = $_visited
- set $node = $_node
- end
- document walk_route_table
- Walk through a routing table (or subset thereof) and dump all the non-null
- (struct route_node *)->info pointers.
- Argument: A lib/thread.h::(struct route_node *) pointing to the route_node
- under which all data should be dumped
- end
- define dump_timeval
- set $tv = (struct timeval *)$arg0
- set $day = 3600*24
-
- if $tv->tv_sec > $day
- printf "%d days, ", $tv->tv_sec / $day
- end
- if $tv->tv_sec > 3600
- printf "%dh", $tv->tv_sec / 3600
- end
- if ($tv->tv_sec % 3600) > 60
- printf "%dm", ($tv->tv_sec % 3600) / 60
- end
- printf "%d", $tv->tv_sec % 3600 % 60
- if $tv->tv_usec != 0
- printf ".%06d", $tv->tv_usec
- end
- printf "s"
- end
- document dump_timeval
- Human readable dump of a (struct timeval *) argument
- end
- define dump_s_addr
- set $addr = (char *)$arg0
-
- printf "%d.%d.%d.%d", $addr[0], $addr[1], $addr[2], $addr[3]
- end
- define dump_s6_addr
- set $a6 = (char *)$arg0
- set $field = 0
-
- while ($field < 16)
- set $i1 = $field++
- set $i2 = $field++
-
- printf "%x%x", $a6[$i1], $a6[$i2]
-
- if ($field > 2 && ($field % 4 == 0))
- printf ":"
- end
- end
- end
- document dump_s6_addr
- Interpret the memory starting at given address as an IPv6 s6_addr and
- print in human readable form.
- end
- define dump_prefix4
- set $p = (struct prefix *) $arg0
- echo IPv4:
- dump_s_addr &($p->u.prefix4)
- printf "/%d\n", $p->prefixlen
- end
- document dump_prefix4
- Textual dump of a (struct prefix4 *) argument.
- end
- define dump_prefix6
- set $p = (struct prefix *) $arg0
- echo IPv6:
- dump_s6_addr &($p->u.prefix6)
- printf "/%d\n", $p->prefixlen
- end
- document dump_prefix6
- Textual dump of a (struct prefix6 *) argument.
- end
- define dump_prefix
- set $p = $arg0
-
- if ($p->family == 2)
- dump_prefix4 $p
- end
- if ($p->family == 10)
- dump_prefix6 $p
- end
- end
- document dump_prefix
- Human readable dump of a (struct prefix *) argument.
- end
- define rn_next_down
- set $node = $arg0
- while ($node != 0)
- print/x $node
- if ($node->link[0] != 0)
- set $node = $node->link[0]
- else
- set $node = $node->link[1]
- end
- end
- end
- document rn_next_down
- Walk left-down a given route table, dumping locations of route_nodes
- Argument: A single (struct route_node *).
- end
- define rn_next_up
- set $top = (struct route_node *)$arg0
- set $node = (struct route_node *)$arg1
-
- while ($node != $top)
- echo walk up\n
-
- set $prevl = $node
- set $parent = $node->parent
- set $node = $parent->link[1]
-
- if ($node != 0 && $node != $prevl)
- echo found a node\n
- loop_break
- end
-
- echo going up\n
- set $node = $parent
- end
- output/x $node
- echo \n
- end
- document rn_next_up
- Walk up-and-right from the given route_node to the next valid route_node
- which is not the given "top" route_node
- Arguments:
- 1st: A (struct route_node *) to the top of the route table.
- 2nd: The (struct route_node *) to walk up from
- end
|