mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-12-22 17:51:53 +00:00
BIRD sends notification to clients about interface updates
Adds a list of all connected cli clients to deamon. Send to all cli clients notification about interfaces states up and down.
This commit is contained in:
parent
df0f4cc92f
commit
0fc263c985
23
nest/cli.c
23
nest/cli.c
@ -68,8 +68,10 @@
|
|||||||
#include "nest/cli.h"
|
#include "nest/cli.h"
|
||||||
#include "conf/conf.h"
|
#include "conf/conf.h"
|
||||||
#include "lib/string.h"
|
#include "lib/string.h"
|
||||||
|
#include "client/reply_codes.h"
|
||||||
|
|
||||||
pool *cli_pool;
|
pool *cli_pool;
|
||||||
|
static list cli_client_list;
|
||||||
|
|
||||||
static byte *
|
static byte *
|
||||||
cli_alloc_out(cli *c, int size)
|
cli_alloc_out(cli *c, int size)
|
||||||
@ -310,6 +312,7 @@ cli_new(void *priv)
|
|||||||
c->parser_pool = lp_new(c->pool, 4096);
|
c->parser_pool = lp_new(c->pool, 4096);
|
||||||
c->rx_buf = mb_alloc(c->pool, CLI_RX_BUF_SIZE);
|
c->rx_buf = mb_alloc(c->pool, CLI_RX_BUF_SIZE);
|
||||||
ev_schedule(c->event);
|
ev_schedule(c->event);
|
||||||
|
add_tail(&cli_client_list, &c->cli_client_node);
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -401,6 +404,7 @@ cli_free(cli *c)
|
|||||||
c->cleanup(c);
|
c->cleanup(c);
|
||||||
if (c == cmd_reconfig_stored_cli)
|
if (c == cmd_reconfig_stored_cli)
|
||||||
cmd_reconfig_stored_cli = NULL;
|
cmd_reconfig_stored_cli = NULL;
|
||||||
|
rem2_node(&c->cli_client_node);
|
||||||
rfree(c->pool);
|
rfree(c->pool);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -416,4 +420,23 @@ cli_init(void)
|
|||||||
cli_pool = rp_new(&root_pool, "CLI");
|
cli_pool = rp_new(&root_pool, "CLI");
|
||||||
init_list(&cli_log_hooks);
|
init_list(&cli_log_hooks);
|
||||||
cli_log_inited = 1;
|
cli_log_inited = 1;
|
||||||
|
init_list(&cli_client_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cli_notify_all_clients - send push notification to all cli clients
|
||||||
|
*
|
||||||
|
* Send a notification to all command line clients about some news.
|
||||||
|
* Client could then send a request for pulling symbols.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
cli_notify_all_clients(void)
|
||||||
|
{
|
||||||
|
struct cli *cli;
|
||||||
|
node *n;
|
||||||
|
WALK_LIST2(cli, n, cli_client_list, cli_client_node)
|
||||||
|
{
|
||||||
|
cli_printf(cli, RC_NOTIFY, "");
|
||||||
|
cli_write_trigger(cli);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,7 @@ struct cli_out {
|
|||||||
|
|
||||||
typedef struct cli {
|
typedef struct cli {
|
||||||
node n; /* Node in list of all log hooks */
|
node n; /* Node in list of all log hooks */
|
||||||
|
node cli_client_node; /* Node in list of all cli clients */
|
||||||
pool *pool;
|
pool *pool;
|
||||||
void *priv; /* Private to sysdep layer */
|
void *priv; /* Private to sysdep layer */
|
||||||
byte *rx_buf, *rx_pos, *rx_aux; /* sysdep */
|
byte *rx_buf, *rx_pos, *rx_aux; /* sysdep */
|
||||||
@ -65,6 +66,7 @@ void cli_free(cli *);
|
|||||||
void cli_kick(cli *);
|
void cli_kick(cli *);
|
||||||
void cli_written(cli *);
|
void cli_written(cli *);
|
||||||
void cli_echo(uint class, byte *msg);
|
void cli_echo(uint class, byte *msg);
|
||||||
|
void cli_notify_all_clients(void);
|
||||||
|
|
||||||
static inline int cli_access_restricted(void)
|
static inline int cli_access_restricted(void)
|
||||||
{
|
{
|
||||||
|
@ -105,6 +105,7 @@ cmd_send_symbols(void)
|
|||||||
|
|
||||||
struct iface *i;
|
struct iface *i;
|
||||||
WALK_LIST(i, iface_list)
|
WALK_LIST(i, iface_list)
|
||||||
|
if (!(i->flags & IF_SHUTDOWN))
|
||||||
cli_msg(RC_INTERFACE_NAME, "\"%s\"", i->name);
|
cli_msg(RC_INTERFACE_NAME, "\"%s\"", i->name);
|
||||||
|
|
||||||
cli_msg(0, "");
|
cli_msg(0, "");
|
||||||
|
@ -206,27 +206,32 @@ if_notify_change(unsigned c, struct iface *i)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (c & IF_CHANGE_DOWN)
|
if (c & IF_CHANGE_DOWN)
|
||||||
|
{
|
||||||
neigh_if_down(i);
|
neigh_if_down(i);
|
||||||
|
|
||||||
if (c & IF_CHANGE_DOWN)
|
|
||||||
WALK_LIST(a, i->addrs)
|
WALK_LIST(a, i->addrs)
|
||||||
{
|
{
|
||||||
a->flags = (i->flags & ~IA_FLAGS) | (a->flags & IA_FLAGS);
|
a->flags = (i->flags & ~IA_FLAGS) | (a->flags & IA_FLAGS);
|
||||||
ifa_notify_change_(IF_CHANGE_DOWN, a);
|
ifa_notify_change_(IF_CHANGE_DOWN, a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cli_notify_all_clients();
|
||||||
|
}
|
||||||
|
|
||||||
WALK_LIST(p, proto_list)
|
WALK_LIST(p, proto_list)
|
||||||
if_send_notify(p, c, i);
|
if_send_notify(p, c, i);
|
||||||
|
|
||||||
if (c & IF_CHANGE_UP)
|
if (c & IF_CHANGE_UP)
|
||||||
|
{
|
||||||
WALK_LIST(a, i->addrs)
|
WALK_LIST(a, i->addrs)
|
||||||
{
|
{
|
||||||
a->flags = (i->flags & ~IA_FLAGS) | (a->flags & IA_FLAGS);
|
a->flags = (i->flags & ~IA_FLAGS) | (a->flags & IA_FLAGS);
|
||||||
ifa_notify_change_(IF_CHANGE_UP, a);
|
ifa_notify_change_(IF_CHANGE_UP, a);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c & IF_CHANGE_UP)
|
|
||||||
neigh_if_up(i);
|
neigh_if_up(i);
|
||||||
|
cli_notify_all_clients();
|
||||||
|
}
|
||||||
|
|
||||||
if ((c & (IF_CHANGE_UP | IF_CHANGE_DOWN | IF_CHANGE_LINK)) == IF_CHANGE_LINK)
|
if ((c & (IF_CHANGE_UP | IF_CHANGE_DOWN | IF_CHANGE_LINK)) == IF_CHANGE_LINK)
|
||||||
neigh_if_link(i);
|
neigh_if_link(i);
|
||||||
|
Loading…
Reference in New Issue
Block a user