mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2025-03-11 17:08:46 +00:00
broken includes for cbors
This commit is contained in:
parent
b7bc3d195a
commit
9fb61e6034
client
nest
proto
sysdep/unix
@ -169,7 +169,7 @@ void write_args_cbor(char *cmd_buffer, struct cbor_writer *w)
|
||||
while (l>pt)
|
||||
{
|
||||
size_t next_space = 0;
|
||||
while (next_space + pt < l && cmd_buffer[next_space + pt] != ' ')
|
||||
while (next_space + pt < l && cmd_buffer[next_space + pt] != ' ' && l>pt)
|
||||
next_space++;
|
||||
cbor_open_block_with_length(w, 1);
|
||||
cbor_add_string(w, "arg");
|
||||
@ -244,6 +244,7 @@ make_cmd_cbor(char *cmd_buffer)
|
||||
{
|
||||
cbor_add_string(w, "down");
|
||||
server_send_byte(cbor_buf, w->pt);
|
||||
die("Shutdown from client");
|
||||
return;
|
||||
}
|
||||
lp_flush(lp);
|
||||
@ -394,7 +395,6 @@ server_got_reply(char *x)
|
||||
{
|
||||
int code;
|
||||
int len = 0;
|
||||
fprintf(stdout, "got reply<%s>", x);
|
||||
|
||||
if (*x == '+') /* Async reply */
|
||||
PRINTF(len, ">>> %s\n", x+1);
|
||||
|
@ -1,4 +1,4 @@
|
||||
src := a-path.c a-set.c cli.c cmds.c iface.c locks.c mpls.c neighbor.c password.c proto.c proto-build.c rt-attr.c rt-dev.c rt-fib.c rt-show.c rt-table.c
|
||||
src := a-path.c a-set.c cli.c cmds.c iface.c locks.c mpls.c neighbor.c password.c proto.c proto-build.c rt-attr.c rt-dev.c rt-fib.c rt-show.c rt-table.c cbor.c cbor_shortcuts.c
|
||||
obj := $(src-o-files)
|
||||
$(all-daemon)
|
||||
$(cf-local)
|
||||
|
51
nest/cbor.c
51
nest/cbor.c
@ -1,20 +1,13 @@
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "nest/cbor.h"
|
||||
|
||||
|
||||
|
||||
struct cbor_writer {
|
||||
int pt; // where will next byte go
|
||||
int capacity;
|
||||
int8_t *cbor;
|
||||
struct linpool *lp;
|
||||
};
|
||||
|
||||
void write_item(struct cbor_writer *writer, uint8_t major, u64 num);
|
||||
void write_item(struct cbor_writer *writer, uint8_t major, uint64_t num);
|
||||
void check_memory(struct cbor_writer *writer, int add_size);
|
||||
|
||||
|
||||
|
||||
struct cbor_writer *cbor_init(byte *buff, uint capacity, struct linpool *lp)
|
||||
struct cbor_writer *cbor_init(uint8_t *buff, uint32_t capacity, struct linpool *lp)
|
||||
{
|
||||
struct cbor_writer *writer = (struct cbor_writer*)lp_alloc(lp, sizeof(struct cbor_writer));
|
||||
writer->cbor = buff;
|
||||
@ -44,12 +37,12 @@ void cbor_close_block_or_list(struct cbor_writer *writer)
|
||||
writer->pt++;
|
||||
}
|
||||
|
||||
void cbor_open_block_with_length(struct cbor_writer *writer, int length)
|
||||
void cbor_open_block_with_length(struct cbor_writer *writer, uint32_t length)
|
||||
{
|
||||
write_item(writer, 5, length);
|
||||
}
|
||||
|
||||
void cbor_open_list_with_length(struct cbor_writer *writer, int length)
|
||||
void cbor_open_list_with_length(struct cbor_writer *writer, uint32_t length)
|
||||
{
|
||||
write_item(writer, 4, length);
|
||||
}
|
||||
@ -67,7 +60,7 @@ void cbor_add_int(struct cbor_writer *writer, int64_t item)
|
||||
}
|
||||
}
|
||||
|
||||
void cbor_add_ipv4(struct cbor_writer *writer, u32 addr)
|
||||
void cbor_add_ipv4(struct cbor_writer *writer, uint32_t addr)
|
||||
{
|
||||
write_item(writer, 6, 52); // 6 is TAG, 52 is tag number for ipv4
|
||||
write_item(writer, 2, 4); // bytestring of length 4
|
||||
@ -78,18 +71,22 @@ void cbor_add_ipv4(struct cbor_writer *writer, u32 addr)
|
||||
}
|
||||
}
|
||||
|
||||
void cbor_add_ipv6(struct cbor_writer *writer, u64 addr)
|
||||
void cbor_add_ipv6(struct cbor_writer *writer, uint32_t addr[4])
|
||||
{
|
||||
write_item(writer, 6, 54); // 6 is TAG, 54 is tag number for ipv6
|
||||
write_item(writer, 2, 8); // bytestring of length 8
|
||||
for (int i = 7; i>=0; i--)
|
||||
write_item(writer, 2, 16); // bytestring of length 8
|
||||
for (int j = 0; j < 4; j++)
|
||||
{
|
||||
writer->cbor[writer->pt] = (addr>>(i*8)) & 0xff;
|
||||
writer->pt++;
|
||||
for (int i = 3; i>=0; i--)
|
||||
{
|
||||
writer->cbor[writer->pt] = (addr[j]>>(i*8)) & 0xff;
|
||||
writer->pt++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void cbor_add_ipv4_prefix(struct cbor_writer *writer, u32 addr, int prefix)
|
||||
|
||||
void cbor_add_ipv4_prefix(struct cbor_writer *writer, uint32_t addr, uint32_t prefix)
|
||||
{
|
||||
write_item(writer, 6, 52); // 6 is TAG, 52 is tag number for ipv4
|
||||
cbor_open_block_with_length(writer, 2);
|
||||
@ -103,7 +100,7 @@ void cbor_add_ipv4_prefix(struct cbor_writer *writer, u32 addr, int prefix)
|
||||
}
|
||||
|
||||
|
||||
void cbor_add_ipv6_prefix(struct cbor_writer *writer, struct ip6_addr addr, int prefix)
|
||||
void cbor_add_ipv6_prefix(struct cbor_writer *writer, uint32_t addr[4], uint32_t prefix)
|
||||
{
|
||||
write_item(writer, 6, 54); // 6 is TAG, 54 is tag number for ipv6
|
||||
cbor_open_block_with_length(writer, 2);
|
||||
@ -113,14 +110,14 @@ void cbor_add_ipv6_prefix(struct cbor_writer *writer, struct ip6_addr addr, int
|
||||
{
|
||||
for (int i = 3; i>=0; i--)
|
||||
{
|
||||
writer->cbor[writer->pt] = (addr.addr[j]>>(i*8)) & 0xff;
|
||||
writer->cbor[writer->pt] = (addr[j]>>(i*8)) & 0xff;
|
||||
writer->pt++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void cbor_add_uint(struct cbor_writer *writer, u64 item)
|
||||
void cbor_add_uint(struct cbor_writer *writer, uint64_t item)
|
||||
{
|
||||
write_item(writer, 0, item);
|
||||
}
|
||||
@ -139,7 +136,7 @@ void cbor_add_string(struct cbor_writer *writer, const char *string)
|
||||
writer->pt+=length;
|
||||
}
|
||||
|
||||
void cbor_nonterminated_string(struct cbor_writer *writer, const char *string, uint length)
|
||||
void cbor_nonterminated_string(struct cbor_writer *writer, const char *string, uint32_t length)
|
||||
{
|
||||
write_item(writer, 3, length); // 3 is major, then goes length of string and string
|
||||
check_memory(writer, length);
|
||||
@ -147,12 +144,12 @@ void cbor_nonterminated_string(struct cbor_writer *writer, const char *string, u
|
||||
writer->pt+=length;
|
||||
}
|
||||
|
||||
void write_item(struct cbor_writer *writer, uint8_t major, u64 num)
|
||||
void write_item(struct cbor_writer *writer, uint8_t major, uint64_t num)
|
||||
{
|
||||
//log("write major %i %li", major, num);
|
||||
major = major<<5;
|
||||
check_memory(writer, 10);
|
||||
if (num > ((u64)1<<(4*8))-1)
|
||||
if (num > ((uint64_t)1<<(4*8))-1)
|
||||
{ // We need 8 bytes to encode the num
|
||||
major += 0x1b; // reserving those bytes
|
||||
writer->cbor[writer->pt] = major;
|
||||
|
47
nest/cbor.h
Normal file
47
nest/cbor.h
Normal file
@ -0,0 +1,47 @@
|
||||
#ifndef CBOR_H
|
||||
#define CBOR_H
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
struct cbor_writer {
|
||||
int pt; // where will next byte go
|
||||
int capacity;
|
||||
int8_t *cbor;
|
||||
struct linpool *lp;
|
||||
};
|
||||
|
||||
|
||||
struct cbor_writer *cbor_init(uint8_t *buff, uint32_t capacity, struct linpool *lp);
|
||||
|
||||
void cbor_open_block(struct cbor_writer *writer);
|
||||
|
||||
void cbor_open_list(struct cbor_writer *writer);
|
||||
|
||||
void cbor_close_block_or_list(struct cbor_writer *writer);
|
||||
|
||||
void cbor_open_block_with_length(struct cbor_writer *writer, uint32_t length);
|
||||
|
||||
void cbor_open_list_with_length(struct cbor_writer *writer, uint32_t length);
|
||||
|
||||
|
||||
void cbor_add_int(struct cbor_writer *writer, int64_t item);
|
||||
|
||||
void cbor_add_ipv4(struct cbor_writer *writer, uint32_t addr);
|
||||
|
||||
void cbor_add_ipv6(struct cbor_writer *writer, uint32_t addr[4]);
|
||||
|
||||
void cbor_add_ipv4_prefix(struct cbor_writer *writer, uint32_t addr, uint32_t prefix);
|
||||
|
||||
|
||||
void cbor_add_ipv6_prefix(struct cbor_writer *writer, uint32_t addr[4], uint32_t prefix);
|
||||
|
||||
|
||||
void cbor_add_uint(struct cbor_writer *writer, uint64_t item);
|
||||
|
||||
void cbor_add_tag(struct cbor_writer *writer, int item);
|
||||
|
||||
void cbor_add_string(struct cbor_writer *writer, const char *string);
|
||||
|
||||
void cbor_nonterminated_string(struct cbor_writer *writer, const char *string, uint32_t length);
|
||||
|
||||
#endif
|
@ -10,7 +10,7 @@
|
||||
#include "proto/ospf/ospf_for_cbor.c"
|
||||
|
||||
|
||||
uint compare_str(byte *str1, uint length, const char *str2) {
|
||||
uint compare_byte_str(byte *str1, uint length, const char *str2) {
|
||||
if (length != strlen(str2)) {
|
||||
return 0;
|
||||
}
|
||||
@ -22,8 +22,85 @@ uint compare_str(byte *str1, uint length, const char *str2) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
int64_t preprocess_time(btime t) {
|
||||
return tm_get_real_time(t) TO_S ;
|
||||
|
||||
static char *
|
||||
proto_state_name_stolen_for_cbor(struct proto *p)
|
||||
{
|
||||
switch (p->proto_state)
|
||||
{
|
||||
case PS_DOWN: return p->active ? "flush" : "down";
|
||||
case PS_START: return "start";
|
||||
case PS_UP: return "up";
|
||||
case PS_STOP: return "stop";
|
||||
default: return "???";
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
cmd_show_protocols_cbor(byte *tbuf, uint capacity, struct arg_list *args, struct linpool *lp)
|
||||
{
|
||||
log("in cmd_show_protocols_cbor");
|
||||
struct cbor_writer *w = cbor_init(tbuf, capacity, lp);
|
||||
cbor_open_block_with_length(w, 1);
|
||||
|
||||
cbor_add_string(w, "show_protocols:message");
|
||||
cbor_open_block_with_length(w, 2);
|
||||
cbor_add_string(w, "table");
|
||||
cbor_open_list(w);
|
||||
int all = 0;
|
||||
int protocol = -1;
|
||||
if (args->pt > 0 && compare_byte_str(args->args[0].arg, args->args[0].len, "all"))
|
||||
{
|
||||
all = 1;
|
||||
}
|
||||
|
||||
if (args->pt - all > 0)
|
||||
{
|
||||
protocol = all;
|
||||
}
|
||||
|
||||
struct proto *p;
|
||||
|
||||
WALK_LIST(p, proto_list)
|
||||
{
|
||||
if (protocol == -1 || compare_byte_str(args->args[protocol].arg, args->args[protocol].len, p->name))
|
||||
{
|
||||
cbor_open_block(w);
|
||||
cbor_string_string(w, "name", p->name);
|
||||
cbor_string_string(w, "proto", p->proto->name);
|
||||
cbor_string_string(w, "table", p->main_channel ? p->main_channel->table->name : "---");
|
||||
cbor_string_string(w, "state", proto_state_name_stolen_for_cbor(p));
|
||||
cbor_string_int(w, "since", preprocess_time(p->last_state_change));
|
||||
byte buf[256];
|
||||
buf[0] = 0;
|
||||
if (p->proto->get_status)
|
||||
p->proto->get_status(p, buf);
|
||||
cbor_string_string(w, "info", buf);
|
||||
|
||||
if (all)
|
||||
{
|
||||
if (p->cf->dsc)
|
||||
cbor_string_string(w, "description", p->cf->dsc);
|
||||
if (p->message)
|
||||
cbor_string_string(w, "message", p->message);
|
||||
if (p->cf->router_id)
|
||||
cbor_string_int(w, "router_id", p->cf->router_id);
|
||||
if (p->vrf_set)
|
||||
cbor_string_string(w, "vrf", p->vrf ? p->vrf->name : "default");
|
||||
|
||||
if (p->proto->show_proto_info_cbor)
|
||||
p->proto->show_proto_info_cbor(w, p);
|
||||
else
|
||||
{
|
||||
struct channel *c;
|
||||
WALK_LIST(c, p->channels)
|
||||
channel_show_info(c);
|
||||
}
|
||||
}
|
||||
cbor_close_block_or_list(w);
|
||||
}
|
||||
}
|
||||
cbor_close_block_or_list(w);
|
||||
}
|
||||
|
||||
extern pool *rt_table_pool;
|
||||
@ -122,7 +199,7 @@ int parse_show_symbols_arg(struct argument *argument)
|
||||
int param_vals[] = {SYM_TABLE, SYM_FILTER, SYM_FUNCTION, SYM_PROTO, SYM_TEMPLATE, SYM_CONSTANT, SYM_VARIABLE}; // defined in conf.h
|
||||
for (size_t j = 0; j < sizeof(params)/sizeof(char*); j++)
|
||||
{
|
||||
if (compare_str(argument->arg, argument->len, params[j]))
|
||||
if (compare_byte_str(argument->arg, argument->len, params[j]))
|
||||
{
|
||||
return param_vals[j];
|
||||
}
|
||||
@ -154,7 +231,7 @@ cmd_show_symbols_cbor(byte *tbuf, uint capacity, struct arg_list *args, struct l
|
||||
{
|
||||
HASH_WALK(scope->hash, next, sym)
|
||||
{
|
||||
if (compare_str(args->args[args->pt - 1].arg, args->args[args->pt - 1].len, sym->name))
|
||||
if (compare_byte_str(args->args[args->pt - 1].arg, args->args[args->pt - 1].len, sym->name))
|
||||
{
|
||||
cbor_add_string(w, "name");
|
||||
cbor_nonterminated_string(w, args->args[args->pt - 1].arg, args->args[args->pt - 1].len);
|
||||
@ -229,8 +306,8 @@ cbor_get_proto_name(struct argument *arg, enum protocol_class proto_type, struct
|
||||
struct proto *q;
|
||||
WALK_LIST(q, proto_list)
|
||||
{
|
||||
log("%s %s %i %i %i", arg->arg, q->name, compare_str(arg->arg, arg->len, q->name) , (q->proto_state != PS_DOWN) , (q->proto->class == proto_type));
|
||||
if (compare_str(arg->arg, arg->len, q->name) && (q->proto_state != PS_DOWN) && (q->proto->class == proto_type))
|
||||
log("%s %s %i %i %i", arg->arg, q->name, compare_byte_str(arg->arg, arg->len, q->name) , (q->proto_state != PS_DOWN) , (q->proto->class == proto_type));
|
||||
if (compare_byte_str(arg->arg, arg->len, q->name) && (q->proto_state != PS_DOWN) && (q->proto->class == proto_type))
|
||||
{
|
||||
return q;
|
||||
}
|
||||
@ -252,15 +329,15 @@ cmd_show_ospf_cbor(byte *tbuf, uint capacity, struct arg_list *args, struct linp
|
||||
if (args->pt == 0)
|
||||
{
|
||||
cbor_open_block_with_length(w, 1);
|
||||
cbor_string_string(w, "not implemented", "show everything about ospf");
|
||||
cbor_string_string(w, "not_implemented", "show everything about ospf");
|
||||
return w->pt;
|
||||
}
|
||||
|
||||
if (compare_str(args->args[0].arg, args->args[0].len, "topology"))
|
||||
if (compare_byte_str(args->args[0].arg, args->args[0].len, "topology"))
|
||||
{
|
||||
cbor_open_block(w);
|
||||
struct proto *proto;
|
||||
int all_ospf = (args->pt > 1) && compare_str(args->args[1].arg, args->args[1].len, "all");
|
||||
int all_ospf = (args->pt > 1) && compare_byte_str(args->args[1].arg, args->args[1].len, "all");
|
||||
if (args->pt - all_ospf > 1) // if there is protocol name
|
||||
{
|
||||
proto = cbor_get_proto_name(&args->args[args->pt -1], PROTOCOL_OSPF, w);
|
||||
@ -280,7 +357,7 @@ cmd_show_ospf_cbor(byte *tbuf, uint capacity, struct arg_list *args, struct linp
|
||||
return w->pt;
|
||||
} else {
|
||||
cbor_open_block_with_length(w, 1);
|
||||
cbor_add_string(w, "not implemented");
|
||||
cbor_add_string(w, "not_implemented");
|
||||
cbor_nonterminated_string(w, args->args[0].arg, args->args[0].len);
|
||||
return w->pt;
|
||||
}
|
||||
|
@ -1,9 +1,13 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "nest/cbor.c"
|
||||
#include "nest/cbor_shortcuts.h"
|
||||
|
||||
|
||||
int64_t preprocess_time(btime t) {
|
||||
return tm_get_real_time(t) TO_S ;
|
||||
}
|
||||
|
||||
void cbor_string_string(struct cbor_writer *writer, char *key, const char *value) {
|
||||
cbor_add_string(writer, key);
|
||||
cbor_add_string(writer, value);
|
||||
@ -24,7 +28,7 @@ void cbor_string_ipv4(struct cbor_writer *writer, char *key, u32 value) {
|
||||
cbor_add_ipv4(writer, value);
|
||||
}
|
||||
|
||||
void cbor_string_ipv6(struct cbor_writer *writer, char *key, u64 value) {
|
||||
void cbor_string_ipv6(struct cbor_writer *writer, char *key, u32 value[4]) {
|
||||
cbor_add_string(writer, key);
|
||||
cbor_add_ipv6(writer, value);
|
||||
}
|
||||
@ -57,15 +61,18 @@ void cbor_add_net(struct cbor_writer *writer, const net_addr *N) {
|
||||
cbor_add_ipv4_prefix(writer, n->ip4.prefix, n->ip4.pxlen);
|
||||
return;
|
||||
case NET_IP6:
|
||||
cbor_add_ipv6_prefix(writer, n->ip6.prefix, n->ip6.pxlen);
|
||||
cbor_add_ipv6_prefix(writer, n->ip6.prefix.addr, n->ip6.pxlen);
|
||||
return;
|
||||
case NET_VPN4:
|
||||
cbor_add_ipv4_prefix(writer, n->vpn4.prefix, n->vpn4.pxlen);
|
||||
return;
|
||||
case NET_VPN6:
|
||||
cbor_add_ipv6_prefix(writer, n->vpn6.prefix, n->vpn6.pxlen);
|
||||
cbor_add_ipv6_prefix(writer, n->vpn6.prefix.addr, n->vpn6.pxlen);
|
||||
return;
|
||||
default:
|
||||
bug("net type unsupported by cbor (yet).");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
24
nest/cbor_shortcuts.h
Normal file
24
nest/cbor_shortcuts.h
Normal file
@ -0,0 +1,24 @@
|
||||
#ifndef CBOR_SHORTCUTS_H
|
||||
#define CBOR_SHORTCUTS_H
|
||||
|
||||
#include "nest/cbor.h"
|
||||
#include "sysdep/config.h"
|
||||
#include "lib/birdlib.h"
|
||||
#include "nest/protocol.h"
|
||||
#include "lib/ip.h"
|
||||
|
||||
int64_t preprocess_time(btime t);
|
||||
|
||||
void cbor_string_string(struct cbor_writer *writer, char *key, const char *value);
|
||||
|
||||
void cbor_string_int(struct cbor_writer *writer, char *key, int64_t value);
|
||||
|
||||
void cbor_string_uint(struct cbor_writer *writer, char *key, u64 value);
|
||||
void cbor_string_ipv4(struct cbor_writer *writer, char *key, u32 value);
|
||||
void cbor_string_ipv6(struct cbor_writer *writer, char *key, u32 value[4]);
|
||||
void cbor_named_block_two_ints(struct cbor_writer *writer, char *key, char *name1, int val1, char *name2, int val2);
|
||||
void cbor_write_to_file(struct cbor_writer *writer, char *filename);
|
||||
|
||||
void cbor_add_net(struct cbor_writer *writer, const net_addr *N);
|
||||
|
||||
#endif
|
100
nest/proto.c
100
nest/proto.c
@ -2136,6 +2136,106 @@ channel_show_info(struct channel *c)
|
||||
channel_show_stats(c);
|
||||
}
|
||||
|
||||
void
|
||||
channel_show_info_cbor(struct cbor_writer *w, struct channel *c)
|
||||
{
|
||||
static char *c_states[] = { "DOWN", "START", "UP", "FLUSHING" };
|
||||
cbor_add_string(w, "channel");
|
||||
cbor_open_block(w);
|
||||
cbor_string_string(w, "name", c->name);
|
||||
cbor_string_string(w, "state", c_states[c->channel_state]);
|
||||
cbor_string_int(w, "preference", c->preference);
|
||||
cbor_string_string(w, "input_filter", filter_name(c->in_filter));
|
||||
cbor_string_string(w, "output_filter", filter_name(c->out_filter));
|
||||
|
||||
if (graceful_restart_state == GRS_ACTIVE)
|
||||
{
|
||||
cbor_string_int(w, "gr_pending", c->gr_lock);
|
||||
cbor_string_int(w, "gr_waiting", c->gr_wait);
|
||||
}
|
||||
|
||||
channel_show_limit_cbor(w, &c->rx_limit, "recieve_limit");
|
||||
channel_show_limit_cbor(w, &c->in_limit, "import_limit");
|
||||
channel_show_limit_cbor(w, &c->out_limit, "export_limit");
|
||||
|
||||
if (c->channel_state != CS_DOWN)
|
||||
channel_show_stats_cbor(w, c);
|
||||
}
|
||||
|
||||
void
|
||||
channel_show_stats_cbor(struct cbor_writer *w, struct channel *c)
|
||||
{
|
||||
struct proto_stats *s = &c->stats;
|
||||
cbor_add_string(w, "channel_stats");
|
||||
cbor_open_block(w);
|
||||
|
||||
|
||||
if (c->in_keep_filtered)
|
||||
{
|
||||
cbor_string_int(w, "imported", s->imp_routes);
|
||||
cbor_string_int(w, "filtered", s->filt_routes);
|
||||
cbor_string_int(w, "exported", s->exp_routes);
|
||||
cbor_string_int(w, "preffered", s->pref_routes);
|
||||
}
|
||||
else
|
||||
{
|
||||
cbor_string_int(w, "imported", s->imp_routes);
|
||||
cbor_string_int(w, "exported", s->exp_routes);
|
||||
cbor_string_int(w, "preffered", s->pref_routes);
|
||||
}
|
||||
|
||||
cbor_add_string(w, "import_updates");
|
||||
cbor_open_list_with_length(w, 5);
|
||||
cbor_add_int(w, s->imp_updates_received);
|
||||
cbor_add_int(w, s->imp_updates_invalid);
|
||||
cbor_add_int(w, s->imp_updates_filtered);
|
||||
cbor_add_int(w, s->imp_updates_ignored);
|
||||
cbor_add_int(w, s->imp_updates_accepted);
|
||||
|
||||
cbor_add_string(w, "import_withdraws");
|
||||
cbor_open_list_with_length(w, 5);
|
||||
cbor_add_int(w, s->imp_withdraws_received);
|
||||
cbor_add_int(w, s->imp_withdraws_invalid);
|
||||
cbor_add_int(w, -1);
|
||||
cbor_add_int(w, s->imp_withdraws_ignored);
|
||||
cbor_add_int(w, s->imp_withdraws_accepted);
|
||||
|
||||
cbor_add_string(w, "export_updates");
|
||||
cbor_open_list_with_length(w, 5);
|
||||
cbor_add_int(w, s->exp_updates_received);
|
||||
cbor_add_int(w, s->exp_updates_rejected);
|
||||
cbor_add_int(w, s->exp_updates_filtered);
|
||||
cbor_add_int(w, -1);
|
||||
cbor_add_int(w, s->exp_updates_accepted);
|
||||
|
||||
cbor_add_string(w, "import_withdraws");
|
||||
cbor_open_list_with_length(w, 5);
|
||||
cbor_add_int(w, s->exp_withdraws_received);
|
||||
cbor_add_int(w, -1);
|
||||
cbor_add_int(w, -1);
|
||||
cbor_add_int(w, -1);
|
||||
cbor_add_int(w, s->exp_withdraws_accepted);
|
||||
|
||||
cbor_close_block_or_list(w);
|
||||
}
|
||||
|
||||
void channel_show_limit_cbor(struct cbor_writer *w, struct channel_limit *l, const char *dsc)
|
||||
{
|
||||
cbor_add_string(w, dsc);
|
||||
cbor_open_block(w);
|
||||
if (!l->action)
|
||||
{
|
||||
cbor_close_block_or_list(w);
|
||||
return;
|
||||
}
|
||||
|
||||
cbor_string_int(w, "limit", l->limit);
|
||||
cbor_string_int(w, "hit", l->state);
|
||||
cbor_string_string(w, "action", channel_limit_name(l));
|
||||
|
||||
cbor_close_block_or_list(w);
|
||||
}
|
||||
|
||||
void
|
||||
channel_cmd_debug(struct channel *c, uint mask)
|
||||
{
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include "lib/event.h"
|
||||
#include "nest/route.h"
|
||||
#include "conf/conf.h"
|
||||
#include "nest/cbor_shortcuts.h"
|
||||
|
||||
struct iface;
|
||||
struct ifa;
|
||||
@ -85,6 +86,7 @@ struct protocol {
|
||||
void (*get_route_info)(struct rte *, byte *buf); /* Get route information (for `show route' command) */
|
||||
int (*get_attr)(const struct eattr *, byte *buf, int buflen); /* ASCIIfy dynamic attribute (returns GA_*) */
|
||||
void (*show_proto_info)(struct proto *); /* Show protocol info (for `show protocols all' command) */
|
||||
void (*show_proto_info_cbor)(struct cbor_writer *w, struct proto *); /* Show protocol info (for `show protocols all' command) for cbor */
|
||||
void (*copy_config)(struct proto_config *, struct proto_config *); /* Copy config from given protocol instance */
|
||||
};
|
||||
|
||||
@ -287,7 +289,10 @@ void channel_graceful_restart_unlock(struct channel *c);
|
||||
#define DEFAULT_GR_WAIT 240
|
||||
|
||||
void channel_show_limit(struct channel_limit *l, const char *dsc);
|
||||
void channel_show_limit_cbor(struct cbor_writer *w, struct channel_limit *l, const char *dsc);
|
||||
void channel_show_info(struct channel *c);
|
||||
void channel_show_info_cbor(struct cbor_writer *w, struct channel *c);
|
||||
void channel_show_stats_cbor(struct cbor_writer *w, struct channel *c);
|
||||
void channel_cmd_debug(struct channel *c, uint mask);
|
||||
|
||||
void proto_cmd_show(struct proto *, uintptr_t, int);
|
||||
|
331
proto/bgp/bgp.c
331
proto/bgp/bgp.c
@ -2406,6 +2406,28 @@ bgp_show_afis(int code, char *s, u32 *afis, uint count)
|
||||
cli_msg(code, b.start);
|
||||
}
|
||||
|
||||
static void
|
||||
bgp_show_afis_cbor(struct cbor_writer *w, char *s, u32 *afis, uint count)
|
||||
{
|
||||
cbor_add_string(w, s);
|
||||
cbor_open_list(w);
|
||||
for (u32 *af = afis; af < (afis + count); af++)
|
||||
{
|
||||
cbor_open_block(w);
|
||||
const struct bgp_af_desc *desc = bgp_get_af_desc(*af);
|
||||
if (desc)
|
||||
cbor_string_string(w, "name", desc->name);
|
||||
else
|
||||
{
|
||||
cbor_string_int(w, "afi", BGP_AFI(*af));
|
||||
cbor_string_int(w, "safi", BGP_SAFI(*af));
|
||||
}
|
||||
cbor_close_block_or_list(w);
|
||||
}
|
||||
|
||||
cbor_close_block_or_list(w);
|
||||
}
|
||||
|
||||
const char *
|
||||
bgp_format_role_name(u8 role)
|
||||
{
|
||||
@ -2548,6 +2570,163 @@ bgp_show_capabilities(struct bgp_proto *p UNUSED, struct bgp_caps *caps)
|
||||
cli_msg(-1006, " Role: %s", bgp_format_role_name(caps->role));
|
||||
}
|
||||
|
||||
static void
|
||||
bgp_show_capabilities_cbor(struct cbor_writer *w, struct bgp_proto *p UNUSED, struct bgp_caps *caps)
|
||||
{
|
||||
cbor_add_string(w, "capabilities");
|
||||
cbor_open_block(w);
|
||||
struct bgp_af_caps *ac;
|
||||
uint any_mp_bgp = 0;
|
||||
uint any_gr_able = 0;
|
||||
uint any_add_path = 0;
|
||||
uint any_ext_next_hop = 0;
|
||||
uint any_llgr_able = 0;
|
||||
u32 *afl1 = alloca(caps->af_count * sizeof(u32));
|
||||
u32 *afl2 = alloca(caps->af_count * sizeof(u32));
|
||||
uint afn1, afn2;
|
||||
|
||||
WALK_AF_CAPS(caps, ac)
|
||||
{
|
||||
any_mp_bgp |= ac->ready;
|
||||
any_gr_able |= ac->gr_able;
|
||||
any_add_path |= ac->add_path;
|
||||
any_ext_next_hop |= ac->ext_next_hop;
|
||||
any_llgr_able |= ac->llgr_able;
|
||||
}
|
||||
|
||||
if (any_mp_bgp)
|
||||
{
|
||||
cbor_add_string(w, "multiprotocol");
|
||||
cbor_open_block(w);
|
||||
|
||||
afn1 = 0;
|
||||
WALK_AF_CAPS(caps, ac)
|
||||
if (ac->ready)
|
||||
afl1[afn1++] = ac->afi;
|
||||
|
||||
bgp_show_afis_cbor(w, "AF_announced:", afl1, afn1);
|
||||
cbor_close_block_or_list(w);
|
||||
}
|
||||
|
||||
if (caps->route_refresh)
|
||||
{
|
||||
cbor_add_string(w, "route_refresh");
|
||||
cbor_open_list_with_length(w, 0);
|
||||
}
|
||||
|
||||
if (any_ext_next_hop)
|
||||
{
|
||||
afn1 = 0;
|
||||
WALK_AF_CAPS(caps, ac)
|
||||
if (ac->ext_next_hop)
|
||||
afl1[afn1++] = ac->afi;
|
||||
|
||||
bgp_show_afis_cbor(w, "IPv6_nexthop:", afl1, afn1);
|
||||
}
|
||||
|
||||
if (caps->ext_messages)
|
||||
{
|
||||
cbor_add_string(w, "extended_message");
|
||||
cbor_open_list_with_length(w, 0);
|
||||
}
|
||||
|
||||
if (caps->gr_aware)
|
||||
{
|
||||
cbor_add_string(w, "graceful_restart");
|
||||
cbor_open_list_with_length(w, 0);
|
||||
}
|
||||
|
||||
if (any_gr_able)
|
||||
{
|
||||
/* Continues from gr_aware */
|
||||
cbor_string_int(w, "restart_time", caps->gr_time);
|
||||
if (caps->gr_flags & BGP_GRF_RESTART)
|
||||
{
|
||||
cbor_add_string(w, "restart_recovery");
|
||||
cbor_open_list_with_length(w, 0);
|
||||
}
|
||||
|
||||
afn1 = afn2 = 0;
|
||||
WALK_AF_CAPS(caps, ac)
|
||||
{
|
||||
if (ac->gr_able)
|
||||
afl1[afn1++] = ac->afi;
|
||||
|
||||
if (ac->gr_af_flags & BGP_GRF_FORWARDING)
|
||||
afl2[afn2++] = ac->afi;
|
||||
}
|
||||
|
||||
bgp_show_afis_cbor(w, "AF_supported", afl1, afn1);
|
||||
bgp_show_afis_cbor(w, "AF_preserved", afl2, afn2);
|
||||
}
|
||||
|
||||
if (caps->as4_support)
|
||||
{
|
||||
cbor_add_string(w, "4-octet_AS_numbers");
|
||||
cbor_open_list_with_length(w, 0);
|
||||
}
|
||||
|
||||
if (any_add_path)
|
||||
{
|
||||
cli_msg(-1006, " ADD-PATH");
|
||||
|
||||
afn1 = afn2 = 0;
|
||||
WALK_AF_CAPS(caps, ac)
|
||||
{
|
||||
if (ac->add_path & BGP_ADD_PATH_RX)
|
||||
afl1[afn1++] = ac->afi;
|
||||
|
||||
if (ac->add_path & BGP_ADD_PATH_TX)
|
||||
afl2[afn2++] = ac->afi;
|
||||
}
|
||||
|
||||
bgp_show_afis_cbor(w, "add_path_RX", afl1, afn1);
|
||||
bgp_show_afis_cbor(w, "add_path_TX", afl2, afn2);
|
||||
}
|
||||
|
||||
if (caps->enhanced_refresh)
|
||||
{
|
||||
cbor_add_string(w, "enhanced_refresh");
|
||||
cbor_open_list_with_length(w, 0);
|
||||
}
|
||||
|
||||
if (caps->llgr_aware)
|
||||
{
|
||||
cbor_add_string(w, "long_lived_gr");
|
||||
cbor_open_list_with_length(w, 0);
|
||||
}
|
||||
|
||||
if (any_llgr_able)
|
||||
{
|
||||
u32 stale_time = 0;
|
||||
|
||||
afn1 = afn2 = 0;
|
||||
WALK_AF_CAPS(caps, ac)
|
||||
{
|
||||
stale_time = MAX(stale_time, ac->llgr_time);
|
||||
|
||||
if (ac->llgr_able && ac->llgr_time)
|
||||
afl1[afn1++] = ac->afi;
|
||||
|
||||
if (ac->llgr_flags & BGP_GRF_FORWARDING)
|
||||
afl2[afn2++] = ac->afi;
|
||||
}
|
||||
|
||||
/* Continues from llgr_aware */
|
||||
cbor_string_int(w, "ll_stale_time", stale_time);
|
||||
|
||||
bgp_show_afis_cbor(w, "AF_supported", afl1, afn1);
|
||||
bgp_show_afis_cbor(w, "AF_preserved", afl2, afn2);
|
||||
}
|
||||
|
||||
if (caps->hostname)
|
||||
cbor_string_string(w, "hostname", caps->hostname);
|
||||
|
||||
if (caps->role != BGP_ROLE_UNDEFINED)
|
||||
cbor_string_string(w, "role", bgp_format_role_name(caps->role));
|
||||
cbor_close_block_or_list(w);
|
||||
}
|
||||
|
||||
static void
|
||||
bgp_show_proto_info(struct proto *P)
|
||||
{
|
||||
@ -2662,6 +2841,155 @@ bgp_show_proto_info(struct proto *P)
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
bgp_show_proto_info_cbor(struct cbor_writer *w, struct proto *P)
|
||||
{
|
||||
struct bgp_proto *p = (struct bgp_proto *) P;
|
||||
|
||||
cbor_add_string(w, "bgp");
|
||||
cbor_open_block(w);
|
||||
|
||||
cbor_string_string(w, "state", bgp_state_dsc(p));
|
||||
|
||||
if (bgp_is_dynamic(p) && p->cf->remote_range)
|
||||
{
|
||||
cbor_add_string(w, "neighbor_range");
|
||||
cbor_add_net(w, p->cf->remote_range);
|
||||
}
|
||||
else
|
||||
{
|
||||
cbor_string_ipv4(w, "neighbor_addr", *p->remote_ip.addr);
|
||||
cbor_string_string(w, "iface", p->cf->iface->name);
|
||||
}
|
||||
|
||||
if ((p->conn == &p->outgoing_conn) && (p->cf->remote_port != BGP_PORT))
|
||||
cbor_string_int(w, "neighbor_port", p->cf->remote_port);
|
||||
|
||||
cbor_string_int(w, "neighbor_as", p->remote_as);
|
||||
cbor_string_int(w, "local_as", p->cf->local_as);
|
||||
|
||||
if (p->gr_active_num)
|
||||
{
|
||||
cbor_add_string(w, "gr_active");
|
||||
cbor_open_list_with_length(w, 0);
|
||||
}
|
||||
|
||||
if (P->proto_state == PS_START)
|
||||
{
|
||||
struct bgp_conn *oc = &p->outgoing_conn;
|
||||
|
||||
if ((p->start_state < BSS_CONNECT) &&
|
||||
(tm_active(p->startup_timer)))
|
||||
{
|
||||
cbor_string_int(w, "error_wait_remains", tm_remains(p->startup_timer));
|
||||
cbor_string_int(w, "error_delay", p->startup_delay);
|
||||
}
|
||||
|
||||
if ((oc->state == BS_ACTIVE) &&
|
||||
(tm_active(oc->connect_timer)))
|
||||
{
|
||||
cbor_string_int(w, "connect_remains", tm_remains(oc->connect_timer));
|
||||
cbor_string_int(w, "connect_delay", p->cf->connect_delay_time);
|
||||
}
|
||||
|
||||
if (p->gr_active_num && tm_active(p->gr_timer))
|
||||
cbor_string_int(w, "restart_time", tm_remains(p->gr_timer));
|
||||
}
|
||||
else if (P->proto_state == PS_UP)
|
||||
{
|
||||
cbor_add_string(w, "neighbor_id");
|
||||
cbor_add_ipv4(w, p->remote_id);
|
||||
cli_msg(-1006, " Local capabilities");
|
||||
cbor_add_string(w, "local_cap");
|
||||
cbor_open_block_with_length(w, 1);
|
||||
bgp_show_capabilities_cbor(w, p, p->conn->local_caps);
|
||||
cbor_add_string(w, "neighbor_cap");
|
||||
cbor_open_block_with_length(w, 1);
|
||||
bgp_show_capabilities(p, p->conn->remote_caps);
|
||||
|
||||
cbor_add_string(w, "session");
|
||||
cbor_open_list(w);
|
||||
if (p->is_internal)
|
||||
cbor_add_string(w, "internal");
|
||||
else
|
||||
cbor_add_string(w, "external");
|
||||
if (p->cf->multihop)
|
||||
cbor_add_string(w, "multihop");
|
||||
if (p->rr_client)
|
||||
cbor_add_string(w, "route-reflector");
|
||||
if (p->rs_client)
|
||||
cbor_add_string(w, "route-server");
|
||||
if (p->as4_session)
|
||||
cbor_add_string(w, "AS4");
|
||||
cbor_close_block_or_list(w);
|
||||
|
||||
cbor_add_string(w, "source_address");
|
||||
cbor_add_ipv6(w, p->local_ip.addr);
|
||||
|
||||
cbor_string_int(w, "hold_timer", tm_remains(p->conn->hold_timer));
|
||||
cbor_string_int(w, "hold_t_base", p->conn->hold_time);
|
||||
|
||||
cbor_string_int(w, "keepalive_timer", tm_remains(p->conn->keepalive_timer));
|
||||
cbor_string_int(w, "keepalive_t_base", p->conn->keepalive_time);
|
||||
}
|
||||
|
||||
if ((p->last_error_class != BE_NONE) &&
|
||||
(p->last_error_class != BE_MAN_DOWN))
|
||||
{
|
||||
const char *err1 = bgp_err_classes[p->last_error_class];
|
||||
const char *err2 = bgp_last_errmsg(p);
|
||||
cli_msg(-1006, " Last error: %s%s", err1, err2);
|
||||
}
|
||||
|
||||
{
|
||||
struct bgp_channel *c;
|
||||
cbor_add_string(w, "channels");
|
||||
cbor_open_block(w);
|
||||
WALK_LIST(c, p->p.channels)
|
||||
{
|
||||
channel_show_info_cbor(w, &c->c);
|
||||
|
||||
if (c->c.channel != &channel_bgp)
|
||||
continue;
|
||||
|
||||
if (p->gr_active_num)
|
||||
cbor_string_string(w, "neighbor_gr", bgp_gr_states[c->gr_active]);
|
||||
|
||||
if (c->stale_timer && tm_active(c->stale_timer))
|
||||
cbor_string_int(w, "llstale_timer", tm_remains(c->stale_timer));
|
||||
|
||||
if (c->c.channel_state == CS_UP)
|
||||
{
|
||||
if (ipa_zero(c->link_addr))
|
||||
{
|
||||
cbor_add_string(w, "next_hop");
|
||||
cbor_add_ipv6(w, c->next_hop_addr.addr);
|
||||
}
|
||||
else
|
||||
{
|
||||
cbor_add_string(w, "next_hop1");
|
||||
cbor_add_ipv6(w, c->next_hop_addr.addr);
|
||||
cbor_add_string(w, "next_hop2");
|
||||
cbor_add_ipv6(w, c->link_addr.addr);
|
||||
}
|
||||
}
|
||||
|
||||
if (c->igp_table_ip4)
|
||||
cbor_string_string(w, "igp_ipv4_table", c->igp_table_ip4->name);
|
||||
|
||||
if (c->igp_table_ip6)
|
||||
cbor_string_string(w, "igp_ipv6_table", c->igp_table_ip6->name);
|
||||
|
||||
if (c->base_table)
|
||||
cbor_string_string(w, "base_table", c->base_table->name);
|
||||
}
|
||||
cbor_close_block_or_list(w);
|
||||
}
|
||||
cbor_close_block_or_list(w);
|
||||
}
|
||||
|
||||
|
||||
|
||||
const struct channel_class channel_bgp = {
|
||||
.channel_size = sizeof(struct bgp_channel),
|
||||
.config_size = sizeof(struct bgp_channel_config),
|
||||
@ -2689,7 +3017,8 @@ struct protocol proto_bgp = {
|
||||
.get_status = bgp_get_status,
|
||||
.get_attr = bgp_get_attr,
|
||||
.get_route_info = bgp_get_route_info,
|
||||
.show_proto_info = bgp_show_proto_info
|
||||
.show_proto_info = bgp_show_proto_info,
|
||||
.show_proto_info_cbor = bgp_show_proto_info_cbor
|
||||
};
|
||||
|
||||
void bgp_build(void)
|
||||
|
@ -1345,6 +1345,36 @@ bmp_show_proto_info(struct proto *P)
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
bmp_show_proto_info_cbor(struct cbor_writer *w, struct proto *P)
|
||||
{
|
||||
struct bmp_proto *p = (void *) P;
|
||||
|
||||
cbor_add_string(w, "bmp");
|
||||
cbor_open_block(w);
|
||||
|
||||
if (P->proto_state != PS_DOWN)
|
||||
{
|
||||
if (p->station_ip > 1<<(8*4))
|
||||
cbor_string_ipv6(w, "station_address", p->station_ip);
|
||||
else
|
||||
cbor_string_ipv4(w, "station_address", p->station_ip);
|
||||
cbor_string_int(w, "station_port", p->station_port);
|
||||
|
||||
if (!ipa_zero(p->local_addr))
|
||||
{
|
||||
if (p->local_addr > 1<<(8*4))
|
||||
cbor_string_ipv6(w, "local_address", p->local_addr);
|
||||
else
|
||||
cbor_string_ipv4(w, "local_address", p->local_addr);
|
||||
}
|
||||
|
||||
if (p->sock_err)
|
||||
cbor_string_int(w, "last_error", p->sock_err);
|
||||
}
|
||||
cbor_close_block_or_string(w);
|
||||
}
|
||||
|
||||
struct protocol proto_bmp = {
|
||||
.name = "BMP",
|
||||
.template = "bmp%d",
|
||||
@ -1358,6 +1388,7 @@ struct protocol proto_bmp = {
|
||||
.reconfigure = bmp_reconfigure,
|
||||
.get_status = bmp_get_status,
|
||||
.show_proto_info = bmp_show_proto_info,
|
||||
.show_proto_info_cbor = bmp_show_proto_info_cbor,
|
||||
};
|
||||
|
||||
void
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "ospf.h"
|
||||
#include "nest/cbor_shortcuts.c"
|
||||
#include "nest/cbor_shortcuts.h"
|
||||
|
||||
|
||||
static inline void
|
||||
|
@ -40,6 +40,7 @@
|
||||
#include "conf/conf.h"
|
||||
#include "filter/filter.h"
|
||||
#include "lib/string.h"
|
||||
#include "nest/cbor_shortcuts.h"
|
||||
|
||||
#include "pipe.h"
|
||||
|
||||
@ -248,6 +249,52 @@ pipe_show_stats(struct pipe_proto *p)
|
||||
s2->imp_withdraws_ignored, s2->imp_withdraws_accepted);
|
||||
}
|
||||
|
||||
static void
|
||||
pipe_show_stats_cbor(struct cbor_writer *w, struct pipe_proto *p)
|
||||
{
|
||||
struct proto_stats *s1 = &p->pri->stats;
|
||||
struct proto_stats *s2 = &p->sec->stats;
|
||||
|
||||
cbor_add_string(w, "stats");
|
||||
cbor_open_block(w);
|
||||
cbor_string_int(w, "imported_routes", s1->imp_routes);
|
||||
cbor_string_int(w, "exported_routes", s2->imp_routes);
|
||||
|
||||
cbor_add_string(w, "import_updates");
|
||||
cbor_open_list_with_length(w, 5);
|
||||
cbor_add_int(w, s2->exp_updates_received);
|
||||
cbor_add_int(w, s2->exp_updates_rejected + s1->imp_updates_invalid);
|
||||
cbor_add_int(w, s2->exp_updates_filtered);
|
||||
cbor_add_int(w, s1->imp_updates_ignored);
|
||||
cbor_add_int(w, s1->imp_updates_accepted);
|
||||
|
||||
cbor_add_string(w, "import_withdraws");
|
||||
cbor_open_block_with_length(w, 5);
|
||||
cbor_add_int(w, s2->exp_withdraws_received);
|
||||
cbor_add_int(w, s1->imp_withdraws_invalid);
|
||||
cbor_add_int(w, -1);
|
||||
cbor_add_int(w, s1->imp_withdraws_ignored);
|
||||
cbor_add_int(w, s1->imp_withdraws_accepted);
|
||||
|
||||
cbor_add_string(w, "export_updates");
|
||||
cbor_open_block_with_length(w, 5);
|
||||
cbor_add_int(w, s1->exp_updates_received);
|
||||
cbor_add_int(w, s1->exp_updates_rejected + s2->imp_updates_invalid);
|
||||
cbor_add_int(w, s1->exp_updates_filtered);
|
||||
cbor_add_int(w, s2->imp_updates_ignored);
|
||||
cbor_add_int(w, s2->imp_updates_accepted);
|
||||
|
||||
cbor_add_string(w, "export_withdraws");
|
||||
cbor_open_block_with_length(w, 5);
|
||||
cbor_add_int(w, s1->exp_withdraws_received);
|
||||
cbor_add_int(w, s2->imp_withdraws_invalid);
|
||||
cbor_add_int(w, -1);
|
||||
cbor_add_int(w, s2->imp_withdraws_ignored);
|
||||
cbor_add_int(w, s2->imp_withdraws_accepted);
|
||||
|
||||
cbor_close_block_or_list(w);
|
||||
}
|
||||
|
||||
static const char *pipe_feed_state[] = { [ES_DOWN] = "down", [ES_FEEDING] = "feed", [ES_READY] = "up" };
|
||||
|
||||
static void
|
||||
@ -270,6 +317,30 @@ pipe_show_proto_info(struct proto *P)
|
||||
pipe_show_stats(p);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
pipe_show_proto_info_cbor(struct cbor_writer *w, struct proto *P)
|
||||
{
|
||||
struct pipe_proto *p = (void *) P;
|
||||
cbor_add_string(w, "pipe");
|
||||
cbor_open_block(w);
|
||||
|
||||
cbor_string_string(w, "table", p->pri->table->name);
|
||||
cbor_string_string(w, "peer_table", p->sec->table->name);
|
||||
cbor_string_string(w, "import_state", pipe_feed_state[p->sec->export_state]);
|
||||
cbor_string_string(w, "export_state", pipe_feed_state[p->pri->export_state]);
|
||||
cbor_string_string(w, "import_filter", filter_name(p->sec->out_filter));
|
||||
cbor_string_string(w, "export_filter", filter_name(p->pri->out_filter));
|
||||
|
||||
channel_show_limit_cbor(w, &p->pri->in_limit, "import_limit");
|
||||
channel_show_limit_cbor(w, &p->sec->in_limit, "export_limit");
|
||||
|
||||
if (P->proto_state != PS_DOWN)
|
||||
pipe_show_stats_cbor(w, p);
|
||||
|
||||
cbor_close_block_or_list(w);
|
||||
}
|
||||
|
||||
void
|
||||
pipe_update_debug(struct proto *P)
|
||||
{
|
||||
@ -290,7 +361,8 @@ struct protocol proto_pipe = {
|
||||
.reconfigure = pipe_reconfigure,
|
||||
.copy_config = pipe_copy_config,
|
||||
.get_status = pipe_get_status,
|
||||
.show_proto_info = pipe_show_proto_info
|
||||
.show_proto_info = pipe_show_proto_info,
|
||||
.show_proto_info_cbor = pipe_show_proto_info_cbor
|
||||
};
|
||||
|
||||
void
|
||||
|
@ -96,6 +96,7 @@
|
||||
#include "rpki.h"
|
||||
#include "lib/string.h"
|
||||
#include "nest/cli.h"
|
||||
#include "nest/cbor_shortcuts.h"
|
||||
|
||||
/* Return values for reconfiguration functions */
|
||||
#define NEED_RESTART 0
|
||||
@ -890,6 +891,95 @@ rpki_show_proto_info(struct proto *P)
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
rpki_show_proto_info_timer_cbor(struct cbor_writer *w, const char *name, uint num, timer *t)
|
||||
{
|
||||
cbor_add_string(w, name);
|
||||
cbor_open_block(w);
|
||||
if (tm_active(t))
|
||||
{
|
||||
cbor_string_int(w, "time", preprocess_time(tm_remains(t)));
|
||||
cbor_string_int(w, "num", num);
|
||||
}
|
||||
cbor_close_block_or_list(w);
|
||||
}
|
||||
|
||||
static void
|
||||
rpki_show_proto_info_cbor(struct cbor_writer *w, struct proto *P)
|
||||
{
|
||||
struct rpki_proto *p = (struct rpki_proto *) P;
|
||||
struct rpki_config *cf = (void *) p->p.cf;
|
||||
struct rpki_cache *cache = p->cache;
|
||||
|
||||
if (P->proto_state == PS_DOWN)
|
||||
return;
|
||||
|
||||
cbor_add_string(w, "rpki");
|
||||
cbor_open_block(w);
|
||||
|
||||
if (cache)
|
||||
{
|
||||
const char *transport_name = "---";
|
||||
uint default_port = 0;
|
||||
|
||||
switch (cf->tr_config.type)
|
||||
{
|
||||
#if HAVE_LIBSSH
|
||||
case RPKI_TR_SSH:
|
||||
transport_name = "SSHv2";
|
||||
default_port = RPKI_SSH_PORT;
|
||||
break;
|
||||
#endif
|
||||
case RPKI_TR_TCP:
|
||||
transport_name = "Unprotected over TCP";
|
||||
default_port = RPKI_TCP_PORT;
|
||||
break;
|
||||
};
|
||||
|
||||
cbor_string_string(w, "cache_server", cf->hostname);
|
||||
|
||||
if (cf->port != default_port)
|
||||
cbor_string_int(w, "cache_port", cf->port);
|
||||
|
||||
cbor_string_string(w, "status", rpki_cache_state_to_str(cache->state));
|
||||
cbor_string_string(w, "transport", transport_name);
|
||||
cbor_string_int(w, "cache_version", cache->version);
|
||||
|
||||
if (cache->request_session_id)
|
||||
cbor_string_string(w, "session_id", "-");
|
||||
else
|
||||
cbor_string_int(w, "session_id", cache->session_id);
|
||||
|
||||
if (cache->last_update)
|
||||
{
|
||||
cbor_string_int(w, "serial_num", cache->serial_num);
|
||||
cbor_string_int(w, "last_update", preprocess_time(current_time() - cache->last_update));
|
||||
}
|
||||
|
||||
rpki_show_proto_info_timer_cbor(w, "Refresh timer", cache->refresh_interval, cache->refresh_timer);
|
||||
rpki_show_proto_info_timer_cbor(w, "Retry timer", cache->retry_interval, cache->retry_timer);
|
||||
rpki_show_proto_info_timer_cbor(w, "Expire timer", cache->expire_interval, cache->expire_timer);
|
||||
|
||||
if (p->roa4_channel)
|
||||
channel_show_info_cbor(w, p->roa4_channel);
|
||||
else
|
||||
{
|
||||
cbor_add_string(w, "no_roa4");
|
||||
cbor_open_list_with_length(w, 0);
|
||||
}
|
||||
|
||||
if (p->roa6_channel)
|
||||
channel_show_info_cbor(w, p->roa6_channel);
|
||||
else
|
||||
{
|
||||
cbor_add_string(w, "no_roa6");
|
||||
cbor_open_list_with_length(w, 0);
|
||||
}
|
||||
}
|
||||
cbor_close_block_or_list(w);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* RPKI Protocol Configuration
|
||||
*/
|
||||
@ -959,6 +1049,7 @@ struct protocol proto_rpki = {
|
||||
.postconfig = rpki_postconfig,
|
||||
.channel_mask = (NB_ROA4 | NB_ROA6),
|
||||
.show_proto_info = rpki_show_proto_info,
|
||||
.show_proto_info_cbor = rpki_show_proto_info_cbor,
|
||||
.shutdown = rpki_shutdown,
|
||||
.copy_config = rpki_copy_config,
|
||||
.reconfigure = rpki_reconfigure,
|
||||
|
@ -991,8 +991,8 @@ main(int argc, char **argv)
|
||||
if (!parse_and_exit)
|
||||
{
|
||||
test_old_bird(path_control_socket);
|
||||
//cli_init_unix(use_uid, use_gid);
|
||||
if (path_control_socket_yi)
|
||||
cli_init_unix(use_uid, use_gid);
|
||||
/*if (path_control_socket_yi)
|
||||
{
|
||||
yi_init_unix(use_uid, use_gid);
|
||||
}
|
||||
@ -1000,7 +1000,7 @@ main(int argc, char **argv)
|
||||
path_control_socket_yi = "bird.ctl";
|
||||
log(L_INFO "before function");
|
||||
yi_init_unix(use_uid, use_gid);
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
if (use_gid)
|
||||
|
Loading…
x
Reference in New Issue
Block a user