#include <time.h>
-#include "nest/cbor_parse.c"
+#include "nest/cbor_parse_tools.h"
+#include "nest/cbor_shortcuts.h"
void print_with_size(byte *string, int len)
{
}
}
+void print_as_time(long int t)
+{
+ int t1 = t TO_S;
+ int t2 = t - t1 S;
+ while (t2 > 999)
+ t2 = t2/10;
+ printf("%i.%i", t1, t2);
+}
+
void print_with_size_(byte *string, int len)
{
for (int i = 0; i < len; i++)
}
}
+void print_with_size_add_space(byte *string, int len, int desired_len)
+{
+ for (int i = 0; i < len; i++)
+ {
+ putc(string[i], stdout);
+ }
+ for (int i = 0; i < desired_len - len; i++)
+ {
+ putc(' ', stdout);
+ }
+}
+
void print_ip_addr(struct buff_reader *buf_read)
{
struct value val = get_value(buf_read); // tag
+ char buff[NET_MAX_TEXT_LENGTH+1];
+ int tag = val.val;
val = get_value(buf_read); // bytestring
- for (int i = 0; i < val.val-1; i++)
+ if (tag == 52)
{
- printf("%i.", buf_read->buff[buf_read->pt + i]);
+ for (int i = 0; i < val.val-1; i++)
+ {
+ printf("%i.", buf_read->buff[buf_read->pt + i]);
+ }
+ printf("%i", buf_read->buff[buf_read->pt + val.val-1]);
+ }
+ else
+ {
+ ip6_addr a;// = (ip6_addr*) &buf_read->buff[buf_read->pt];
+ for (int i = 0; i < 4; i++)
+ {
+ a.addr[i] = 0;
+ for (int j = 0; j < 4; j++)
+ {
+ a.addr[i] = a.addr[i] << 8;
+ a.addr[i] += buf_read->buff[buf_read->pt + 4 * i + j];
+ }
+ }
+ ip6_ntop(a, buff);
+ printf("%s", buff);
}
- printf("%i", buf_read->buff[buf_read->pt + val.val]);
buf_read->pt+=val.val;
}
}
+void print_string_string(struct buff_reader *buf_read, char *str)
+{
+ discard_key(buf_read);
+ printf("%s", str);
+ struct value val = get_value(buf_read);
+ print_with_size(&buf_read->buff[buf_read->pt], val.val);
+ printf("\n");
+ buf_read->pt += val.val;
+}
void print_lsa_router(struct buff_reader *buf_read)
{
}
}
+void print_channel_show_limit(struct buff_reader *buf_read)
+{
+ struct value val = get_value(buf_read);
+ int siz = val.val;
+ buf_read->pt += val.val;
+ val = get_value(buf_read); //block
+ val = get_value(buf_read);
+ if (val_is_break(val))
+ return;
+ buf_read->pt += val.val;
+ printf(" ");
+ print_with_size(&buf_read->buff[buf_read->pt], siz);
+ for(int i = 0; i < 16 - siz; i++)
+ putc(' ', stdout);
+ val = get_value(buf_read);
+ printf("%ld ", val.val);
+ val = get_value(buf_read);
+ print_with_size(&buf_read->buff[buf_read->pt], val.val);
+ buf_read->pt += val.val;
+ printf("\n Action: ");
+ val = get_value(buf_read);
+ print_with_size(&buf_read->buff[buf_read->pt], val.val);
+ val = get_value(buf_read);
+}
+
+void print_route_change_line(struct buff_reader *buf_read)
+{
+ for (int i = 0; i < 5; i++)
+ {
+ struct value val = get_value(buf_read);
+ if (val.major == UINT)
+ printf(" %10lu", val.val);
+ else
+ printf(" ---");
+ }
+ printf("\n");
+}
+
+void print_pipe_show_stats(struct buff_reader *buf_read)
+{
+ struct value val = get_value(buf_read); //open block
+ discard_key(buf_read);
+ val = get_value(buf_read);
+ printf(" Routes: %lu imported, ", val.val);
+ discard_key(buf_read);
+ val = get_value(buf_read);
+ printf("%lu exported\n", val.val);
+ printf(" Route change stats: received rejected filtered ignored accepted\n");
+ discard_key(buf_read); //import_updates
+ val = get_value(buf_read); //open list
+ printf(" Import updates: ");
+ print_route_change_line(buf_read);
+ discard_key(buf_read);
+ val = get_value(buf_read); //open list
+ printf(" Import withdraws: ");
+ print_route_change_line(buf_read);
+ discard_key(buf_read);
+ val = get_value(buf_read); //open list
+ printf(" Export updates: ");
+ print_route_change_line(buf_read);
+ discard_key(buf_read);
+ val = get_value(buf_read); //open list
+ printf(" Export withdraws: ");
+ print_route_change_line(buf_read);
+ val = get_value(buf_read); //close block
+}
+
+void print_show_protocols_rpki(struct buff_reader *buf_read)
+{
+ struct value val = get_value(buf_read); //open block
+ discard_key(buf_read);
+ val = get_value(buf_read);
+ printf(" Cache server: ");
+ print_with_size_(&buf_read->buff[buf_read->pt], val.val);
+ printf("\n");
+ buf_read->pt += val.val;
+ if (compare_buff_str(buf_read, val.val, "cache_port"))
+ {
+ buf_read->pt += val.val;
+ val = get_value(buf_read);
+ printf(" Cache port: %lu\n", val.val);
+ val = get_value(buf_read);
+ }
+
+ print_string_string(buf_read, " Status: ");
+ print_string_string(buf_read, " Transport: ");
+
+ discard_key(buf_read);
+ val = get_value(buf_read);
+ printf(" Protocol version: %lu\n", val.val);
+
+ discard_key(buf_read);
+ printf(" Session ID: ");
+ val = get_value(buf_read);
+ if (val.major == TEXT)
+ {
+ printf("---\n");
+ buf_read->pt += val.val;
+ }
+ else
+ printf("%lu\n", val.val);
+
+ val = get_value(buf_read);
+ if (compare_buff_str(buf_read, val.val, "serial_num"))
+ {
+ buf_read->pt += val.val;
+ val = get_value(buf_read);
+ printf(" Serial number: %lu\n", val.val);
+ discard_key(buf_read);
+ val = get_value(buf_read);
+ printf(" Last update: before %lu s\n", val.val);
+ }
+ else
+ {
+ printf(" Serial number: ---\n");
+ printf(" Last update: ---\n");
+ }
+ val = get_value(buf_read);
+}
+
+void print_channel_show_stats(struct buff_reader *buf_read)
+{
+ struct value val = get_value(buf_read); //open block
+ discard_key(buf_read);
+ val = get_value(buf_read);
+ printf(" Routes: %lu imported, ", val.val);
+ val = get_value(buf_read);
+ if (compare_buff_str(buf_read, val.val, "serial_num"))
+ {
+ buf_read->pt += val.val;
+ val = get_value(buf_read);
+ printf("%lu filtered, ", val.val);
+ val = get_value(buf_read);
+ }
+ buf_read->pt += val.val;
+ val = get_value(buf_read);
+ printf("%lu exported, ", val.val);
+ discard_key(buf_read);
+ val = get_value(buf_read);
+ printf("%lu preferred\n", val.val);
+
+ printf(" Route change stats: received rejected filtered ignored accepted\n");
+ discard_key(buf_read); //import_updates
+ val = get_value(buf_read); //open list
+ printf(" Import updates: ");
+ print_route_change_line(buf_read);
+
+ discard_key(buf_read); //import_updates
+ val = get_value(buf_read); //open list
+ printf(" Import withdraws: ");
+ print_route_change_line(buf_read);
+
+ discard_key(buf_read); //import_updates
+ val = get_value(buf_read); //open list
+ printf(" Export updates: ");
+ print_route_change_line(buf_read);
+
+ discard_key(buf_read); //import_updates
+ val = get_value(buf_read); //open list
+ printf(" Export withdraws: ");
+ print_route_change_line(buf_read);
+
+ val = get_value(buf_read); //close block
+}
+
+void print_channel_show_info(struct buff_reader *buf_read)
+{
+ print_string_string(buf_read, " Channel ");
+
+ print_string_string(buf_read, " State: ");
+
+ print_string_string(buf_read, " Table: ");
+
+ discard_key(buf_read);
+ struct value val = get_value(buf_read);
+ printf(" Preference: %ld\n", val.val);
+
+ print_string_string(buf_read, " Input filter: ");
+
+ print_string_string(buf_read, " Output filter: ");
+
+ int pt = buf_read->pt;
+ val = get_value(buf_read);
+ if (compare_buff_str(buf_read, val.val, "gr_pending"))
+ {
+ buf_read->pt += val.val;
+ printf(" GR recovery: ");
+ val = get_value(buf_read);
+ if (val.val)
+ printf(" pending");
+ discard_key(buf_read);
+ val = get_value(buf_read);
+ if (val.val)
+ printf(" waiting");
+ printf("\n");
+ }
+ else
+ {
+ buf_read->pt = pt; // this is not nice, but we need the name of the block.
+ //If the name of the block is allways same, we would need to create lists for limits.
+ }
+ print_channel_show_limit(buf_read);
+ print_channel_show_limit(buf_read);
+ print_channel_show_limit(buf_read);
+
+ val = get_value(buf_read);
+ if (!val_is_break(val))
+ {
+ buf_read->pt += val.val;
+ print_channel_show_stats(buf_read);
+ val = get_value(buf_read);
+ }
+}
+
+void print_bgp_show_afis(struct buff_reader *buf_read)
+{
+ struct value val = get_value(buf_read); //open list
+ val = get_value(buf_read); //open block (or break)
+ while (!val_is_break(val))
+ {
+ val = get_value(buf_read); //key
+ if (compare_buff_str(buf_read, val.val, "name"))
+ {
+ buf_read->pt += val.val;
+ printf(" ");
+ val = get_value(buf_read);
+ print_with_size(&buf_read->buff[buf_read->pt], val.val);
+ printf("\n");
+ buf_read->pt += val.val;
+ }
+ else
+ {
+ buf_read->pt += val.val;
+ val = get_value(buf_read);
+ printf(" <%lu/", val.val);
+ discard_key(buf_read);
+ val = get_value(buf_read);
+ printf("%lu>\n", val.val);
+ }
+
+ val = get_value(buf_read); //close block
+ val = get_value(buf_read); //close list or open block
+ }
+
+}
+
+void print_bgp_capabilities(struct buff_reader *buf_read)
+{
+ printf("<debug capabilities <%s>, %x %x>\n", &buf_read->buff[buf_read->pt], buf_read->buff[buf_read->pt], buf_read->buff[buf_read->pt+1]);
+ discard_key(buf_read);
+ struct value val = get_value(buf_read); //open block
+ printf("<debug: val major %i, val val %li>\n", val.major, val.val);
+ val = get_value(buf_read);
+ if (compare_buff_str(buf_read, val.val, "AF_announced"))
+ {
+ buf_read->pt += val.val;
+ printf(" Multiprotocol\n");
+ printf(" AF announced:");
+ print_bgp_show_afis(buf_read);
+ val = get_value(buf_read);
+ }
+ if (compare_buff_str(buf_read, val.val, "route_refresh"))
+ {
+ buf_read->pt += val.val;
+ printf(" Route refresh\n");
+ val = get_value(buf_read); //zero list
+ val = get_value(buf_read);
+ }
+ if (compare_buff_str(buf_read, val.val, "IPv6_nexthop"))
+ {
+ buf_read->pt += val.val;
+ printf(" Extended next hop\n");
+ printf(" IPv6 nexthop:\n");
+ print_bgp_show_afis(buf_read);
+ val = get_value(buf_read);
+ }
+ if (compare_buff_str(buf_read, val.val, "extended_message"))
+ {
+ buf_read->pt += val.val;
+ printf(" Extended message\n");
+ val = get_value(buf_read); //zero list
+ val = get_value(buf_read);
+ }
+ if (compare_buff_str(buf_read, val.val, "graceful_restart"))
+ {
+ buf_read->pt += val.val;
+ printf(" Graceful restart\n");
+ val = get_value(buf_read); //zero list
+ val = get_value(buf_read);
+ }
+ if (compare_buff_str(buf_read, val.val, "restart_time"))
+ {
+ buf_read->pt += val.val;
+ discard_key(buf_read);
+ val = get_value(buf_read);
+ printf(" Restart time: %lu", val.val);
+ val = get_value(buf_read);
+ if (compare_buff_str(buf_read, val.val, "restart_recovery"))
+ {
+ buf_read->pt += val.val;
+ printf(" Restart recovery\n");
+ val = get_value(buf_read); //zero list
+ val = get_value(buf_read);
+ }
+ discard_key(buf_read);
+ printf(" AF supported:\n");
+ print_bgp_show_afis(buf_read);
+ printf(" AF preserved:\n");
+ discard_key(buf_read);
+ print_bgp_show_afis(buf_read);
+ val = get_value(buf_read);
+ }
+ if (compare_buff_str(buf_read, val.val, "4-octet_AS_numbers"))
+ {
+ buf_read->pt += val.val;
+ printf(" 4-octet AS numbers\n");
+ val = get_value(buf_read); //zero list
+ val = get_value(buf_read);
+ }
+ if (compare_buff_str(buf_read, val.val, "add_path_RX"))
+ {
+ buf_read->pt += val.val;
+ printf(" RX:\n");
+ print_bgp_show_afis(buf_read);
+ printf(" TX:\n");
+ discard_key(buf_read);
+ print_bgp_show_afis(buf_read);
+ val = get_value(buf_read);
+ }
+ if (compare_buff_str(buf_read, val.val, "enhanced_refresh"))
+ {
+ buf_read->pt += val.val;
+ printf(" Enhanced refresh\n");
+ val = get_value(buf_read); //zero list
+ val = get_value(buf_read);
+ }
+ if (compare_buff_str(buf_read, val.val, "long_lived_gr"))
+ {
+ buf_read->pt += val.val;
+ printf(" Long-lived graceful restart\n");
+ val = get_value(buf_read); //zero list
+ val = get_value(buf_read);
+ }
+ if (compare_buff_str(buf_read, val.val, "ll_stale_time"))
+ {
+ buf_read->pt += val.val;
+ val = get_value(buf_read);
+ printf(" LL stale time: %lu\n", val.val);
+ discard_key(buf_read);
+ printf(" AF supported:\n");
+ print_bgp_show_afis(buf_read);
+ printf(" AF preserved:\n");
+ discard_key(buf_read);
+ print_bgp_show_afis(buf_read);
+ val = get_value(buf_read);
+ }
+ if (compare_buff_str(buf_read, val.val, "hostname"))
+ {
+ buf_read->pt += val.val;
+ val = get_value(buf_read);
+ printf(" Hostname: ");
+ print_with_size(&buf_read->buff[buf_read->pt], val.val);
+ printf("\n");
+ val = get_value(buf_read);
+ }
+ if (compare_buff_str(buf_read, val.val, "role"))
+ {
+ buf_read->pt += val.val;
+ val = get_value(buf_read);
+ printf(" Role: ");
+ print_with_size(&buf_read->buff[buf_read->pt], val.val);
+ printf("\n");
+ val = get_value(buf_read);
+ }
+}
+
+void print_show_protocols_bgp(struct buff_reader *buf_read)
+{
+ struct value val = get_value(buf_read); //open block
+ discard_key(buf_read);
+ printf(" BGP state: ");
+ val = get_value(buf_read);
+ print_with_size(&buf_read->buff[buf_read->pt], val.val);
+ printf("\n");
+ buf_read->pt += val.val;
+ val = get_value(buf_read);
+ if (compare_buff_str(buf_read, val.val, "neighbor_range"))
+ {
+ buf_read->pt += val.val;
+ printf(" Neighbor range: ");
+ print_ip_prefix(buf_read);
+ printf("\n");
+ }
+ else
+ {
+ buf_read->pt += val.val;
+ printf(" Neighbor address: ");
+ print_ip_addr(buf_read);
+ discard_key(buf_read);
+ val = get_value(buf_read);
+ print_with_size(&buf_read->buff[buf_read->pt], val.val);
+ buf_read->pt += val.val;
+ printf("\n");
+ }
+ val = get_value(buf_read);
+ if (compare_buff_str(buf_read, val.val, "neighbor_port"))
+ {
+ buf_read->pt += val.val;
+ val = get_value(buf_read);
+ printf(" Neighbor port: %lu\n", val.val);
+ discard_key(buf_read);
+ }
+ else
+ {
+ printf("<debug ");
+ print_with_size(&buf_read->buff[buf_read->pt], val.val);
+ printf("debug >");
+ buf_read->pt += val.val;
+ }
+ val = get_value(buf_read);
+ printf("<debug maj %i val %li>\n", val.major, val.val);
+ for (int i = 0; i< 30; i++)
+ {
+ printf("<debug capabilities %x>\n", buf_read->buff[buf_read->pt+i]);
+ }
+
+ printf(" Neighbor AS: %lu\n", val.val);
+ //discard_key(buf_read);
+ printf("<debug");
+ val = get_value(buf_read);
+ printf(" maj %i val %li>\n ", val.major, val.val);
+ print_with_size(&buf_read->buff[buf_read->pt], val.val);
+ buf_read->pt += val.val;
+ printf(" debug>\n");
+ val = get_value(buf_read);
+ printf("<debug maj %i val %li>\n", val.major, val.val);
+ printf(" Local AS: %lu\n", val.val);
+
+ val = get_value(buf_read);
+ printf("<debug maj %i val %li>\n", val.major, val.val);
+ if (compare_buff_str(buf_read, val.val, "gr_active"))
+ {
+ printf(" Neighbor graceful restart active\n");
+ buf_read->pt += val.val;
+ val = get_value(buf_read); //null list
+ val = get_value(buf_read);
+ }
+ if (compare_buff_str(buf_read, val.val, "error_wait_remains"))
+ {
+ buf_read->pt += val.val;
+ val = get_value(buf_read);
+ printf(" Error wait: %lu/", val.val);
+ discard_key(buf_read);
+ val = get_value(buf_read);
+ printf("%lu\n", val.val);
+ val = get_value(buf_read);
+ }
+ if (compare_buff_str(buf_read, val.val, "connect_remains"))
+ {
+ buf_read->pt += val.val;
+ val = get_value(buf_read);
+ printf(" Connect delay: %lu/", val.val);
+ discard_key(buf_read);
+ val = get_value(buf_read);
+ printf("%lu\n", val.val);
+ val = get_value(buf_read);
+ }
+ if (compare_buff_str(buf_read, val.val, "connect_remains"))
+ {
+ buf_read->pt += val.val;
+ val = get_value(buf_read);
+ printf(" Connect delay: %lu/-\n", val.val);
+ val = get_value(buf_read);
+ }
+ if (compare_buff_str(buf_read, val.val, "neighbor_id"))
+ {
+ buf_read->pt += val.val;
+ printf(" Neighbor ID: ");
+ printf("<debug capabilities <%s>, %x %x>\n", &buf_read->buff[buf_read->pt], buf_read->buff[buf_read->pt], buf_read->buff[buf_read->pt+1]);
+ for (int i = 0; i< 30; i++)
+ {
+ printf("<debug capabilities %x>\n", buf_read->buff[buf_read->pt+i]);
+ }
+ print_ip_addr(buf_read);
+ printf("\n");
+ printf(" Local capabilities\n");
+ print_bgp_capabilities(buf_read);
+ printf(" Neighbor capabilities\n");
+ print_bgp_capabilities(buf_read);
+ discard_key(buf_read);
+ printf(" Session: ");
+ val = get_value(buf_read); //open list
+ val = get_value(buf_read);
+ while (!val_is_break(val))
+ {
+ print_with_size(&buf_read->buff[buf_read->pt], val.val);
+ printf(" ");
+ buf_read->pt += val.val;
+ val = get_value(buf_read);
+ }
+ printf("\n");
+ discard_key(buf_read);
+ printf(" Source address: ");
+ print_ip_addr(buf_read);
+ printf("\n");
+
+ discard_key(buf_read);
+ val = get_value(buf_read);
+ printf(" Hold timer: ");
+ print_as_time(val.val);
+ printf("/");
+ discard_key(buf_read);
+ val = get_value(buf_read);
+ printf("%lu\n", val.val);
+
+ discard_key(buf_read);
+ val = get_value(buf_read);
+ printf(" Keepalive timer: ");
+ print_as_time(val.val);
+ printf("/");
+ discard_key(buf_read);
+ val = get_value(buf_read);
+ printf("%lu\n", val.val);
+ }
+ if (compare_buff_str(buf_read, val.val, "last_err1"))
+ {
+ buf_read->pt += val.val;
+ printf(" Last error: ");
+ discard_key(buf_read);
+ print_with_size(&buf_read->buff[buf_read->pt], val.val);
+ printf(" ");
+ discard_key(buf_read);
+ print_with_size(&buf_read->buff[buf_read->pt], val.val);
+ printf("\n");
+ val = get_value(buf_read);
+ }
+
+ discard_key(buf_read); //channels
+ val = get_value(buf_read); //open list
+ val = get_value(buf_read); //open block
+ while (!val_is_break(val))
+ {
+ discard_key(buf_read); //channel
+ val = get_value(buf_read); //open block
+
+ print_channel_show_info(buf_read);
+ val = get_value(buf_read);
+ if (compare_buff_str(buf_read, val.val, "neighbor_gr"))
+ {
+ buf_read->pt += val.val;
+ printf(" Neighbor GR: ");
+ print_with_size(&buf_read->buff[buf_read->pt], val.val);
+ printf("\n");
+ val = get_value(buf_read);
+ }
+ if (compare_buff_str(buf_read, val.val, "llstale_timer"))
+ {
+ buf_read->pt += val.val;
+ val = get_value(buf_read);
+ printf(" LL stale timer: ");
+ print_as_time(val.val);
+ printf("/-");
+ val = get_value(buf_read);
+ }
+ if (compare_buff_str(buf_read, val.val, "next_hop"))
+ {
+ buf_read->pt += val.val;
+ printf(" BGP Next hop: ");
+ print_ip_addr(buf_read);
+ printf("\n");
+ val = get_value(buf_read);
+ }
+ if (compare_buff_str(buf_read, val.val, "next_hop1"))
+ {
+ buf_read->pt += val.val;
+ printf(" BGP Next hop: ");
+ print_ip_addr(buf_read);
+ discard_key(buf_read);
+ printf(" ");
+ print_ip_addr(buf_read);
+ printf("\n");
+ val = get_value(buf_read);
+ }
+ if (compare_buff_str(buf_read, val.val, "igp_ipv4_table"))
+ {
+ buf_read->pt += val.val;
+ val = get_value(buf_read);
+ printf(" IGP IPv4 table: ");
+ print_with_size(&buf_read->buff[buf_read->pt], val.val);
+ printf("\n");
+ val = get_value(buf_read);
+ }
+ if (compare_buff_str(buf_read, val.val, "igp_ipv4_table"))
+ {
+ buf_read->pt += val.val;
+ printf(" IGP IPv6 table: ");
+ print_with_size(&buf_read->buff[buf_read->pt], val.val);
+ printf("\n");
+ val = get_value(buf_read);
+ }
+ if (compare_buff_str(buf_read, val.val, "igp_ipv4_table"))
+ {
+ buf_read->pt += val.val;
+ printf(" Base table: ");
+ print_with_size(&buf_read->buff[buf_read->pt], val.val);
+ printf("\n");
+ val = get_value(buf_read);
+ }
+ val = get_value(buf_read);
+ }
+ val = get_value(buf_read);
+ printf("<debug: val major %i, val val %li>\n", val.major, val.val);
+}
+
+void print_show_protocols(struct buff_reader *buf_read)
+{
+ struct value val = get_value(buf_read);
+ ASSERT(val.major == BLOCK);
+ discard_key(buf_read); //table
+ val = get_value(buf_read);
+ ASSERT(val.major == ARRAY);
+ val = get_value(buf_read);
+ printf("%-10s %-10s %-10s %-6s %-18s %s\n",
+ "Name", "Proto", "Table", "State", "Since", "Info");
+ while (!val_is_break(val))
+ {
+ ASSERT(val.major == BLOCK);
+ discard_key(buf_read); //name
+ val = get_value(buf_read);
+ print_with_size_add_space(&buf_read->buff[buf_read->pt], val.val, 11);
+ buf_read->pt += val.val;
+ discard_key(buf_read); //proto
+ val = get_value(buf_read);
+ print_with_size_add_space(&buf_read->buff[buf_read->pt], val.val, 11);
+ buf_read->pt += val.val;
+ discard_key(buf_read); //table
+ val = get_value(buf_read);
+ print_with_size_add_space(&buf_read->buff[buf_read->pt], val.val, 11);
+ buf_read->pt += val.val;
+ discard_key(buf_read); //state
+ val = get_value(buf_read);
+ print_with_size_add_space(&buf_read->buff[buf_read->pt], val.val, 7);
+ buf_read->pt += val.val;
+ discard_key(buf_read); // since
+ val = get_value(buf_read);
+ print_time(val.val);
+ printf(" ");
+ discard_key(buf_read); //info
+ val = get_value(buf_read);
+ print_with_size(&buf_read->buff[buf_read->pt], val.val);
+ buf_read->pt += val.val;
+ printf("\n");
+
+ val = get_value(buf_read);
+ if (!val_is_break(val))
+ {
+ if (compare_buff_str(buf_read, val.val, "description"))
+ {
+ buf_read->pt += val.val;
+ val = get_value(buf_read);
+ printf(" Description: ");
+ print_with_size(&buf_read->buff[buf_read->pt], val.val);
+ printf("\n");
+ buf_read->pt += val.val;
+ val = get_value(buf_read);
+ }
+ if (compare_buff_str(buf_read, val.val, "message"))
+ {
+ buf_read->pt += val.val;
+ val = get_value(buf_read);
+ printf(" Message: ");
+ print_with_size(&buf_read->buff[buf_read->pt], val.val);
+ printf("\n");
+ buf_read->pt += val.val;
+ val = get_value(buf_read);
+ }
+ if (compare_buff_str(buf_read, val.val, "router_id"))
+ {
+ buf_read->pt += val.val;
+ printf(" Router ID: ");
+ print_ip_addr(buf_read);
+ val = get_value(buf_read);
+ }
+ if (compare_buff_str(buf_read, val.val, "vfr"))
+ {
+ buf_read->pt += val.val;
+ val = get_value(buf_read);
+ printf(" VRF: ");
+ print_with_size(&buf_read->buff[buf_read->pt], val.val);
+ printf("\n");
+ buf_read->pt += val.val;
+ val = get_value(buf_read);
+ }
+ if (val_is_break(val))
+ {
+ return;
+ }
+ ASSERT(val.major == TEXT);
+
+ if (compare_buff_str(buf_read, val.val, "rpki"))
+ {
+ buf_read->pt += val.val;
+ print_show_protocols_rpki(buf_read);
+ printf("\n");
+ }
+ else if (compare_buff_str(buf_read, val.val, "pipe"))
+ {
+ buf_read->pt += val.val;
+ val = get_value(buf_read); //open block
+ printf(" Channel %s\n", "main");
+ print_string_string(buf_read, " Table: ");
+ print_string_string(buf_read, " Peer table: ");
+ print_string_string(buf_read, " Table: ");
+ print_string_string(buf_read, " Import state: ");
+ print_string_string(buf_read, " Export state: ");
+ print_string_string(buf_read, " Import filter: ");
+ print_string_string(buf_read, " Export filter: ");
+ print_channel_show_limit(buf_read);
+ print_channel_show_limit(buf_read);
+ val = get_value(buf_read);
+ if (!val_is_break(val))
+ {
+ buf_read->pt += val.val; // discarding key "stats"
+ print_pipe_show_stats(buf_read);
+ val = get_value(buf_read);
+ }
+ printf("\n");
+ }
+ else if (compare_buff_str(buf_read, val.val, "bgp"))
+ {
+ buf_read->pt += val.val;
+ print_show_protocols_bgp(buf_read);
+ val = get_value(buf_read);
+ printf("<debug: val major %i, val val %li>\n", val.major, val.val);
+ printf("\n");
+ }
+ else
+ {
+ buf_read->pt += val.val;
+ val = get_value(buf_read);
+ while(!val_is_break(val))
+ {
+ print_channel_show_info(buf_read);
+ val = get_value(buf_read);
+ if (val.major == TEXT)
+ {
+ buf_read->pt += val.val;
+ val = get_value(buf_read);
+ }
+ }
+ printf("\n");
+ }
+ }
+ val = get_value(buf_read);
+ printf("<debug: val major %i, val val %li>\n", val.major, val.val);
+ }
+}
+
void print_cbor_response(byte *cbor, int len)
{
+ //
+ FILE *write_ptr;
+
+ write_ptr = fopen("arrived.cbor", "wb");
+
+ fwrite(cbor, len, 1, write_ptr);
+ fclose(write_ptr);
+ //
struct buff_reader buf_read;
buf_read.buff = cbor;
buf_read.size = len;
buf_read.pt += val.val;
print_show_ospf(&buf_read);
}
+ else if (compare_buff_str(&buf_read, val.val, "show_protocols:message"))
+ {
+ buf_read.pt += val.val;
+ print_show_protocols(&buf_read);
+ }
printf("\nbird>");
fflush(stdout);
}
-
-
-