mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-11-08 20:28:43 +00:00
Refactor of struct channel and channel_config
Element struct channel_class *channel was renamed to *class in struct channel and struct channel_config. New pointers were added to structures above in both directions. This can simplify and speedup the proces of finding channel (configuration).
This commit is contained in:
parent
31de4be2bc
commit
9661370e80
30
nest/proto.c
30
nest/proto.c
@ -204,10 +204,10 @@ void rt_notify_merged(struct rt_export_request *req, const net_addr *net, struct
|
||||
struct channel *
|
||||
proto_add_channel(struct proto *p, struct channel_config *cf)
|
||||
{
|
||||
struct channel *c = mb_allocz(proto_pool, cf->channel->channel_size);
|
||||
struct channel *c = mb_allocz(proto_pool, cf->class->channel_size);
|
||||
|
||||
c->name = cf->name;
|
||||
c->channel = cf->channel;
|
||||
c->class = cf->class;
|
||||
c->proto = p;
|
||||
c->table = cf->table->table;
|
||||
rt_lock_table(c->table);
|
||||
@ -232,9 +232,12 @@ proto_add_channel(struct proto *p, struct channel_config *cf)
|
||||
c->last_state_change = current_time();
|
||||
c->reloadable = 1;
|
||||
|
||||
c->config = cf;
|
||||
cf->channel = c;
|
||||
|
||||
init_list(&c->roa_subscriptions);
|
||||
|
||||
CALL(c->channel->init, c, cf);
|
||||
CALL(c->class->init, c, cf);
|
||||
|
||||
add_tail(&p->channels, &c->n);
|
||||
|
||||
@ -247,6 +250,9 @@ void
|
||||
proto_remove_channel(struct proto *p UNUSED, struct channel *c)
|
||||
{
|
||||
ASSERT(c->channel_state == CS_DOWN);
|
||||
|
||||
c->config->channel = NULL;
|
||||
c->config = NULL;
|
||||
|
||||
CD(c, "Removed", c->name);
|
||||
|
||||
@ -379,7 +385,7 @@ channel_roa_subscribe_filter(struct channel *c, int dir)
|
||||
|
||||
#ifdef CONFIG_BGP
|
||||
/* No automatic reload for BGP channels without in_table / out_table */
|
||||
if (c->channel == &channel_bgp)
|
||||
if (c->class == &channel_bgp)
|
||||
valid = dir ? ((c->in_keep & RIK_PREFILTER) == RIK_PREFILTER) : !!c->out_table;
|
||||
#endif
|
||||
|
||||
@ -648,7 +654,7 @@ channel_do_start(struct channel *c)
|
||||
{
|
||||
c->proto->active_channels++;
|
||||
|
||||
CALL(c->channel->start, c);
|
||||
CALL(c->class->start, c);
|
||||
|
||||
channel_start_import(c);
|
||||
}
|
||||
@ -695,7 +701,7 @@ channel_do_stop(struct channel *c)
|
||||
if (c->gr_lock)
|
||||
channel_graceful_restart_unlock(c);
|
||||
|
||||
CALL(c->channel->shutdown, c);
|
||||
CALL(c->class->shutdown, c);
|
||||
|
||||
/* This have to be done in here, as channel pool is freed before channel_do_down() */
|
||||
c->out_table = NULL;
|
||||
@ -716,7 +722,7 @@ channel_do_down(struct channel *c)
|
||||
|
||||
/* The in_table and out_table are going to be freed by freeing their resource pools. */
|
||||
|
||||
CALL(c->channel->cleanup, c);
|
||||
CALL(c->class->cleanup, c);
|
||||
|
||||
/* Schedule protocol shutddown */
|
||||
if (proto_is_done(c->proto))
|
||||
@ -850,7 +856,7 @@ channel_config_new(const struct channel_class *cc, const char *name, uint net_ty
|
||||
|
||||
cf = cfg_allocz(cc->config_size);
|
||||
cf->name = name;
|
||||
cf->channel = cc;
|
||||
cf->class = cc;
|
||||
cf->parent = proto;
|
||||
cf->table = tab;
|
||||
cf->out_filter = FILTER_REJECT;
|
||||
@ -889,12 +895,12 @@ channel_config_get(const struct channel_class *cc, const char *name, uint net_ty
|
||||
struct channel_config *
|
||||
channel_copy_config(struct channel_config *src, struct proto_config *proto)
|
||||
{
|
||||
struct channel_config *dst = cfg_alloc(src->channel->config_size);
|
||||
struct channel_config *dst = cfg_alloc(src->class->config_size);
|
||||
|
||||
memcpy(dst, src, src->channel->config_size);
|
||||
memcpy(dst, src, src->class->config_size);
|
||||
memset(&dst->n, 0, sizeof(node));
|
||||
add_tail(&proto->channels, &dst->n);
|
||||
CALL(src->channel->copy_config, dst, src);
|
||||
CALL(src->class->copy_config, dst, src);
|
||||
|
||||
return dst;
|
||||
}
|
||||
@ -942,7 +948,7 @@ channel_reconfigure(struct channel *c, struct channel_config *cf)
|
||||
c->rpki_reload = cf->rpki_reload;
|
||||
|
||||
/* Execute channel-specific reconfigure hook */
|
||||
if (c->channel->reconfigure && !c->channel->reconfigure(c, cf, &import_changed, &export_changed))
|
||||
if (c->class->reconfigure && !c->class->reconfigure(c, cf, &import_changed, &export_changed))
|
||||
return 0;
|
||||
|
||||
/* If the channel is not open, it has no routes and we cannot reload it anyways */
|
||||
|
@ -448,7 +448,8 @@ extern struct channel_class channel_stats;
|
||||
struct channel_config {
|
||||
node n;
|
||||
const char *name;
|
||||
const struct channel_class *channel;
|
||||
const struct channel_class *class;
|
||||
struct channel *channel;
|
||||
|
||||
struct proto_config *parent; /* Where channel is defined (proto or template) */
|
||||
struct rtable_config *table; /* Table we're attached to */
|
||||
@ -473,8 +474,9 @@ struct channel {
|
||||
node n; /* Node in proto->channels */
|
||||
|
||||
const char *name; /* Channel name (may be NULL) */
|
||||
const struct channel_class *channel;
|
||||
const struct channel_class *class;
|
||||
struct proto *proto;
|
||||
struct channel_config *config;
|
||||
|
||||
struct rtable *table;
|
||||
const struct filter *in_filter; /* Input filter */
|
||||
|
@ -2971,7 +2971,7 @@ rt_flowspec_resolve_rte(rte *r, struct channel *c)
|
||||
struct bgp_channel *bc = (struct bgp_channel *) c;
|
||||
|
||||
if ( (rt_get_source_attr(r) == RTS_BGP)
|
||||
&& (c->channel == &channel_bgp)
|
||||
&& (c->class == &channel_bgp)
|
||||
&& (bc->base_table))
|
||||
{
|
||||
struct bgp_proto *p = SKIP_BACK(struct bgp_proto, p, bc->c.proto);
|
||||
|
@ -145,7 +145,7 @@ pipe_configure_channels(struct pipe_proto *p, struct pipe_config *cf)
|
||||
|
||||
struct channel_config pri_cf = {
|
||||
.name = "pri",
|
||||
.channel = cc->channel,
|
||||
.class = cc->class,
|
||||
.table = cc->table,
|
||||
.out_filter = cc->out_filter,
|
||||
.out_subprefix = cc->out_subprefix,
|
||||
@ -157,7 +157,7 @@ pipe_configure_channels(struct pipe_proto *p, struct pipe_config *cf)
|
||||
|
||||
struct channel_config sec_cf = {
|
||||
.name = "sec",
|
||||
.channel = cc->channel,
|
||||
.class = cc->class,
|
||||
.table = cf->peer,
|
||||
.out_filter = cc->in_filter,
|
||||
.out_subprefix = cf->in_subprefix,
|
||||
|
Loading…
Reference in New Issue
Block a user