X-Git-Url: https://git.sommitrealweird.co.uk/quagga-debian.git/blobdiff_plain/6d99eb2938e976229cb50d848a1bc491532b54f9..110ea29b8fe7d11de09e19382a9a5808cfb90d32:/gdb/lib.txt diff --git a/gdb/lib.txt b/gdb/lib.txt deleted file mode 100644 index b703808..0000000 --- a/gdb/lib.txt +++ /dev/null @@ -1,295 +0,0 @@ -# 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 '. 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