]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Refactor of struct channel and channel_config
authorVojtech Vilimek <vojtech.vilimek@nic.cz>
Wed, 20 Jul 2022 10:25:20 +0000 (12:25 +0200)
committerVojtech Vilimek <vojtech.vilimek@nic.cz>
Wed, 20 Jul 2022 10:25:20 +0000 (12:25 +0200)
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).

nest/proto.c
nest/protocol.h
nest/rt-table.c
proto/pipe/pipe.c

index 72e479d725632e2f64455b7f936842833df0da22..73f9263cb68306ee5715199a6475c3ce04ed4984 100644 (file)
@@ -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 */
index a2511eb8c22aabe21039e69db8a80144644c1948..b4298852122820b25ea3f6f8e06dbbfbbe509a93 100644 (file)
@@ -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 */
index e7281b2e41fe0261a5b632299cf379112983cbda..ed294c39034f9a1789f7e2986f1d6d25e675b8fa 100644 (file)
@@ -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);
index 351db36ba3652aef2450a8930352c14e5b212c89..968166963355f6138153633196fafb39a209373d 100644 (file)
@@ -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,