]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
SKIP_BACK_DECLARE: easier embedded-to-parent typecasting
authorMaria Matejka <mq@ucw.cz>
Fri, 26 Apr 2024 10:14:33 +0000 (12:14 +0200)
committerMaria Matejka <mq@ucw.cz>
Sat, 25 May 2024 17:37:16 +0000 (19:37 +0200)
19 files changed:
lib/birdlib.h
lib/lockfree.c
lib/resource.c
lib/slab.c
nest/iface.c
nest/locks.c
nest/mpls.c
nest/proto.c
nest/rt-attr.c
nest/rt-show.c
nest/rt-table.c
proto/aggregator/aggregator.c
proto/bfd/bfd.c
proto/bgp/attrs.c
proto/bgp/bgp.c
proto/bgp/packets.c
proto/pipe/pipe.c
sysdep/unix/io-loop.c
sysdep/unix/log.c

index 5271f0121b78d4bedb37bf4514100da58a13d395..9a1a3e6d14098f0561c4e9547d167b9bf1f4e493 100644 (file)
@@ -32,6 +32,7 @@
     s *_ptr = ((s *)((char *)_orig - OFFSETOF(s, i))); \
     SAME_TYPE(&_ptr->i, _orig); \
     _ptr; })
+#define SKIP_BACK_DECLARE(s, n, i, p) s *n = SKIP_BACK(s, i, p)
 #define BIRD_ALIGN(s, a) (((s)+a-1)&~(a-1))
 #define BIRD_SET_ALIGNED_POINTER(ptr, val)  do { \
   size_t _alignment = _Alignof(typeof(*ptr)); \
index ff205f95c0d02ffb93242d61f700962473dde752..a50fafc12f2add8209069e1aae30a02b8f6596e6 100644 (file)
@@ -14,7 +14,7 @@
 
 void lfuc_unlock_deferred(struct deferred_call *dc)
 {
-  struct lfuc_unlock_queue_item *luqi = SKIP_BACK(struct lfuc_unlock_queue_item, dc, dc);
+  SKIP_BACK_DECLARE(struct lfuc_unlock_queue_item, luqi, dc, dc);
   lfuc_unlock_immediately(luqi->c, luqi->el, luqi->ev);
 }
 
index 5685ef05447cb2d53729a66da45c29c4fe721b6a..441e5e3d0c8f4ef54b477429a4d20d47645f58be 100644 (file)
@@ -489,7 +489,7 @@ mb_allocz(pool *p, unsigned size)
 void *
 mb_realloc(void *m, unsigned size)
 {
-  struct mblock *b = SKIP_BACK(struct mblock, data, m);
+  SKIP_BACK_DECLARE(struct mblock, b, data, m);
   struct pool *p = resource_parent(&b->r);
 
   ASSERT_DIE(DG_IS_LOCKED(p->domain));
@@ -514,7 +514,7 @@ mb_free(void *m)
   if (!m)
     return;
 
-  struct mblock *b = SKIP_BACK(struct mblock, data, m);
+  SKIP_BACK_DECLARE(struct mblock, b, data, m);
   rfree(&b->r);
 }
 
index 7d2c87e9e18b775a4eb177ea47679c0bce90ec04..935e35460fd6f316de187241546f3957b891f448 100644 (file)
@@ -101,7 +101,7 @@ sl_allocz(slab *s)
 void
 sl_free(void *oo)
 {
-  struct sl_obj *o = SKIP_BACK(struct sl_obj, data, oo);
+  SKIP_BACK_DECLARE(struct sl_obj, o, data, oo);
 
   rem_node(&o->n);
   xfree(o);
index c6251d90b2b1233b00457af6f24c1fe008b871f5..1e6374790cd55e217e6a0301a12d231bf13bfa88 100644 (file)
@@ -286,7 +286,7 @@ if_enqueue_notify(struct iface_notification x)
 static inline void
 ifa_send_notify(struct iface_subscription *s, unsigned c, struct ifa *a)
 {
-  struct proto *p = SKIP_BACK(struct proto, iface_sub, s);
+  SKIP_BACK_DECLARE(struct proto, p, iface_sub, s);
 
   if (s->ifa_notify &&
       (p->proto_state != PS_DOWN) &&
@@ -328,7 +328,7 @@ ifa_notify_change(unsigned c, struct ifa *a)
 static inline void
 if_send_notify(struct iface_subscription *s, unsigned c, struct iface *i)
 {
-  struct proto *p = SKIP_BACK(struct proto, iface_sub, s);
+  SKIP_BACK_DECLARE(struct proto, p, iface_sub, s);
 
   if (s->if_notify &&
       (p->proto_state != PS_DOWN) &&
@@ -655,7 +655,7 @@ iface_unsubscribe(struct iface_subscription *s)
 {
   IFACE_LOCK;
 
-  struct proto *p = SKIP_BACK(struct proto, iface_sub, s);
+  SKIP_BACK_DECLARE(struct proto, p, iface_sub, s);
   WALK_TLIST_DELSAFE(proto_neigh, n, &p->neighbors)
     neigh_unlink(n);
 
index cd9c139518e03b51d8838bb0f25209d935bdfb09..f4d87243c29b3cdfb3359f7eafff3c7fb70ae01c 100644 (file)
@@ -59,7 +59,7 @@ static void
 olock_free(resource *r)
 {
   /* Called externally from rfree() */
-  struct object_lock *l = SKIP_BACK(struct object_lock, r, r);
+  SKIP_BACK_DECLARE(struct object_lock, l, r, r);
   node *n;
 
   OBJ_LOCK;
@@ -79,7 +79,7 @@ olock_free(resource *r)
       n = HEAD(l->waiters);
       if (NODE_VALID(n))
        {
-         struct object_lock *q = SKIP_BACK(struct object_lock, n, n);
+         SKIP_BACK_DECLARE(struct object_lock, q, n, n);
 
          /* Remove this candidate from waiters list */
          rem_node(n);
index eceaeba482f71e2cad15f6b9274e2ecf16c19ca9..76ca0d2ba7333816bb36c0c6efa7737d3bef36c7 100644 (file)
@@ -1241,7 +1241,7 @@ mpls_announce_fec(struct mpls_fec_map *m, struct mpls_fec *fec, ea_list *src)
   const struct eattr *heea = ea_find_by_class(src, &ea_gen_hostentry);
   if (heea) {
     /* The same hostentry, but different dependent table */
-    struct hostentry_adata *head = SKIP_BACK(struct hostentry_adata, ad, heea->u.ad);
+    SKIP_BACK_DECLARE(struct hostentry_adata, head, ad, heea->u.ad);
     struct hostentry *he = head->he;
     ea_set_hostentry(&e.attrs, m->channel->table, he->owner, he->addr, he->link,
        HOSTENTRY_LABEL_COUNT(head), head->labels);
@@ -1295,7 +1295,7 @@ mpls_apply_fec(rte *r, struct mpls_fec *fec)
 int
 mpls_handle_rte(struct channel *c, const net_addr *n, rte *r, struct mpls_fec **fecp)
 {
-  struct mpls_channel *mc = SKIP_BACK(struct mpls_channel, c, c->proto->mpls_channel);
+  SKIP_BACK_DECLARE(struct mpls_channel, mc, c, c->proto->mpls_channel);
   struct mpls_fec_map *m = mc->mpls_map;
   struct mpls_fec *fec = *fecp = NULL;
 
index 5a8240e221d56cba3f447dd4eeabe92252902187..cddbac909cb03b810202690af43a5e121a5593d8 100644 (file)
@@ -79,14 +79,14 @@ channel_log_state_change(struct channel *c)
 void
 channel_import_log_state_change(struct rt_import_request *req, u8 state)
 {
-  struct channel *c = SKIP_BACK(struct channel, in_req, req);
+  SKIP_BACK_DECLARE(struct channel, c, in_req, req);
   CD(c, "Channel import state changed to %s", rt_import_state_name(state));
 }
 
 void
 channel_export_log_state_change(struct rt_export_request *req, u8 state)
 {
-  struct channel *c = SKIP_BACK(struct channel, out_req, req);
+  SKIP_BACK_DECLARE(struct channel, c, out_req, req);
   CD(c, "Channel export state changed to %s", rt_export_state_name(state));
 
   switch (state)
@@ -104,7 +104,7 @@ channel_export_log_state_change(struct rt_export_request *req, u8 state)
 void
 channel_refeed_log_state_change(struct rt_export_request *req, u8 state)
 {
-  struct channel *c = SKIP_BACK(struct channel, refeed_req, req);
+  SKIP_BACK_DECLARE(struct channel, c, refeed_req, req);
   CD(c, "Channel export state changed to %s", rt_export_state_name(state));
 
   switch (state)
@@ -123,21 +123,21 @@ channel_refeed_log_state_change(struct rt_export_request *req, u8 state)
 static void
 channel_dump_import_req(struct rt_import_request *req)
 {
-  struct channel *c = SKIP_BACK(struct channel, in_req, req);
+  SKIP_BACK_DECLARE(struct channel, c, in_req, req);
   debug("  Channel %s.%s import request %p\n", c->proto->name, c->name, req);
 }
 
 static void
 channel_dump_export_req(struct rt_export_request *req)
 {
-  struct channel *c = SKIP_BACK(struct channel, out_req, req);
+  SKIP_BACK_DECLARE(struct channel, c, out_req, req);
   debug("  Channel %s.%s export request %p\n", c->proto->name, c->name, req);
 }
 
 static void
 channel_dump_refeed_req(struct rt_export_request *req)
 {
-  struct channel *c = SKIP_BACK(struct channel, refeed_req, req);
+  SKIP_BACK_DECLARE(struct channel, c, refeed_req, req);
   debug("  Channel %s.%s refeed request %p\n", c->proto->name, c->name, req);
 }
 
@@ -448,7 +448,7 @@ channel_roa_in_reload_done(struct channel_import_request *req)
 static void
 channel_roa_in_changed(struct settle *se)
 {
-  struct roa_subscription *s = SKIP_BACK(struct roa_subscription, settle, se);
+  SKIP_BACK_DECLARE(struct roa_subscription, s, settle, se);
   struct channel *c = s->c;
 
   CD(c, "Reload triggered by RPKI change");
@@ -472,7 +472,7 @@ channel_roa_out_reload_done(struct channel_feeding_request *req)
 static void
 channel_roa_out_changed(struct settle *se)
 {
-  struct roa_subscription *s = SKIP_BACK(struct roa_subscription, settle, se);
+  SKIP_BACK_DECLARE(struct roa_subscription, s, settle, se);
   struct channel *c = s->c;
 
   CD(c, "Feeding triggered by RPKI change");
@@ -495,7 +495,7 @@ channel_roa_out_changed(struct settle *se)
 static void
 channel_export_one_roa(struct rt_export_request *req, const net_addr *net, struct rt_pending_export *first)
 {
-  struct roa_subscription *s = SKIP_BACK(struct roa_subscription, req, req);
+  SKIP_BACK_DECLARE(struct roa_subscription, s, req, req);
 
   switch (net->type)
   {
@@ -517,7 +517,7 @@ channel_export_one_roa(struct rt_export_request *req, const net_addr *net, struc
 static void
 channel_dump_roa_req(struct rt_export_request *req)
 {
-  struct roa_subscription *s = SKIP_BACK(struct roa_subscription, req, req);
+  SKIP_BACK_DECLARE(struct roa_subscription, s, req, req);
   struct channel *c = s->c;
 
   debug("  Channel %s.%s ROA %s change notifier request %p\n",
@@ -573,7 +573,7 @@ channel_roa_subscribe(struct channel *c, rtable *tab, int dir)
 static void
 channel_roa_unsubscribed(struct rt_export_request *req)
 {
-  struct roa_subscription *s = SKIP_BACK(struct roa_subscription, req, req);
+  SKIP_BACK_DECLARE(struct roa_subscription, s, req, req);
   struct channel *c = s->c;
 
   rem_node(&s->roa_node);
@@ -781,7 +781,7 @@ channel_del_obstacle(struct channel *c)
 void
 channel_import_stopped(struct rt_import_request *req)
 {
-  struct channel *c = SKIP_BACK(struct channel, in_req, req);
+  SKIP_BACK_DECLARE(struct channel, c, in_req, req);
 
   mb_free(c->in_req.name);
   c->in_req.name = NULL;
@@ -792,7 +792,7 @@ channel_import_stopped(struct rt_import_request *req)
 static void
 channel_export_stopped(struct rt_export_request *req)
 {
-  struct channel *c = SKIP_BACK(struct channel, out_req, req);
+  SKIP_BACK_DECLARE(struct channel, c, out_req, req);
 
   /* The hook has already stopped */
   req->hook = NULL;
@@ -825,7 +825,7 @@ channel_export_stopped(struct rt_export_request *req)
 static void
 channel_refeed_stopped(struct rt_export_request *req)
 {
-  struct channel *c = SKIP_BACK(struct channel, refeed_req, req);
+  SKIP_BACK_DECLARE(struct channel, c, refeed_req, req);
 
   req->hook = NULL;
 
@@ -996,7 +996,7 @@ channel_schedule_reload(struct channel *c, struct channel_import_request *cir)
 static void
 channel_reload_stopped(struct rt_export_request *req)
 {
-  struct channel *c = SKIP_BACK(struct channel, reload_req, req);
+  SKIP_BACK_DECLARE(struct channel, c, reload_req, req);
 
   req->hook = NULL;
 
@@ -1014,7 +1014,7 @@ channel_reload_stopped(struct rt_export_request *req)
 static void
 channel_reload_log_state_change(struct rt_export_request *req, u8 state)
 {
-  struct channel *c = SKIP_BACK(struct channel, reload_req, req);
+  SKIP_BACK_DECLARE(struct channel, c, reload_req, req);
 
   if (state == TES_READY)
   {
@@ -1028,7 +1028,7 @@ channel_reload_log_state_change(struct rt_export_request *req, u8 state)
 static void
 channel_reload_dump_req(struct rt_export_request *req)
 {
-  struct channel *c = SKIP_BACK(struct channel, reload_req, req);
+  SKIP_BACK_DECLARE(struct channel, c, reload_req, req);
   debug("  Channel %s.%s import reload request %p\n", c->proto->name, c->name, req);
 }
 
@@ -2893,7 +2893,7 @@ struct channel_cmd_reload_import_request {
 static void
 channel_reload_out_done(struct channel_feeding_request *cfr)
 {
-  struct channel_cmd_reload_feeding_request *ccrfr = SKIP_BACK(struct channel_cmd_reload_feeding_request, cfr, cfr);
+  SKIP_BACK_DECLARE(struct channel_cmd_reload_feeding_request, ccrfr, cfr, cfr);
   if (atomic_fetch_sub_explicit(&ccrfr->prr->counter, 1, memory_order_acq_rel) == 1)
     ev_send_loop(&main_birdloop, &ccrfr->prr->ev);
 }
@@ -2901,7 +2901,7 @@ channel_reload_out_done(struct channel_feeding_request *cfr)
 static void
 channel_reload_in_done(struct channel_import_request *cir)
 {
-  struct channel_cmd_reload_import_request *ccrir = SKIP_BACK(struct channel_cmd_reload_import_request, cir, cir);
+  SKIP_BACK_DECLARE(struct channel_cmd_reload_import_request, ccrir, cir, cir);
   if (atomic_fetch_sub_explicit(&ccrir->prr->counter, 1, memory_order_acq_rel) == 1)
     ev_send_loop(&main_birdloop, &ccrir->prr->ev);
 }
index 1ed849e42958100f6d27bbdb7af900dbd4228a5d..99a8cb3f34a8f8b0a42eb01f66d72363649ad0d8 100644 (file)
@@ -628,7 +628,7 @@ ea_class_free(struct ea_class *cl)
 static void
 ea_class_ref_free(resource *r)
 {
-  struct ea_class_ref *ref = SKIP_BACK(struct ea_class_ref, r, r);
+  SKIP_BACK_DECLARE(struct ea_class_ref, ref, r, r);
   if (!--ref->class->uc)
     ea_class_free(ref->class);
 }
@@ -636,7 +636,7 @@ ea_class_ref_free(resource *r)
 static void
 ea_class_ref_dump(resource *r, unsigned indent UNUSED)
 {
-  struct ea_class_ref *ref = SKIP_BACK(struct ea_class_ref, r, r);
+  SKIP_BACK_DECLARE(struct ea_class_ref, ref, r, r);
   debug("name \"%s\", type=%d\n", ref->class->name, ref->class->type);
 }
 
index 1c978d72542048a6178d680cc41709bbbc7b152b..299342dc6c41c58e534ab71f4d0daff6fc87a438 100644 (file)
@@ -223,14 +223,14 @@ rt_show_net_export_bulk(struct rt_export_request *req, const net_addr *n,
     struct rt_pending_export *first UNUSED, struct rt_pending_export *last UNUSED,
     const rte **feed, uint count)
 {
-  struct rt_show_data *d = SKIP_BACK(struct rt_show_data, req, req);
+  SKIP_BACK_DECLARE(struct rt_show_data, d, req, req);
   return rt_show_net(d, n, feed, count);
 }
 
 static void
 rt_show_export_stopped_cleanup(struct rt_export_request *req)
 {
-  struct rt_show_data *d = SKIP_BACK(struct rt_show_data, req, req);
+  SKIP_BACK_DECLARE(struct rt_show_data, d, req, req);
 
   /* The hook is now invalid */
   req->hook = NULL;
@@ -319,7 +319,7 @@ rt_show_cont(struct rt_show_data *d)
 static void
 rt_show_export_stopped(struct rt_export_request *req)
 {
-  struct rt_show_data *d = SKIP_BACK(struct rt_show_data, req, req);
+  SKIP_BACK_DECLARE(struct rt_show_data, d, req, req);
 
   /* The hook is now invalid */
   req->hook = NULL;
index 9743d342a23b639ba0768b963315835ea78faa27..33b6623b578f805111d6a28072b154c4b52e9ddf 100644 (file)
@@ -385,7 +385,7 @@ static net *
 net_route(struct rtable_reading *tr, const net_addr *n)
 {
   ASSERT(tr->t->addr_type == n->type);
-  net_addr_union *nu = SKIP_BACK(net_addr_union, n, n);
+  SKIP_BACK_DECLARE(net_addr_union, nu, n, n);
 
   const struct f_trie *trie = atomic_load_explicit(&tr->t->trie, memory_order_acquire);
 
@@ -460,7 +460,7 @@ net_route(struct rtable_reading *tr, const net_addr *n)
 int
 net_roa_check(rtable *tp, const net_addr *n, u32 asn)
 {
-  net_addr_union *nu = SKIP_BACK(net_addr_union, n, n);
+  SKIP_BACK_DECLARE(net_addr_union, nu, n, n);
   int anything = 0;
 
 #define TW(ipv) do {                                                           \
@@ -1185,7 +1185,7 @@ rte_export(struct rt_export_hook *hook, struct rt_pending_export *rpe)
     uint count = 0;
     const rte **feed = NULL;
 
-    const struct netindex *i = SKIP_BACK(struct netindex, addr, (net_addr (*)[0]) n);
+    const SKIP_BACK_DECLARE(struct netindex, i, addr, (net_addr (*)[0]) n);
     ASSERT_DIE(i->index < atomic_load_explicit(&hook->tab->routes_block_size, memory_order_relaxed));
 
     struct rt_pending_export *last;
@@ -1266,7 +1266,7 @@ rte_announce(struct rtable_private *tab, const struct netindex *i, net *net, con
   if (old_best_valid)
     old_best->sender->stats.pref--;
 
-  struct rt_pending_export *rpe = SKIP_BACK(struct rt_pending_export, li, lfjour_push_prepare(&tab->journal));
+  SKIP_BACK_DECLARE(struct rt_pending_export, rpe, li, lfjour_push_prepare(&tab->journal));
 
   if (!rpe)
   {
@@ -1345,8 +1345,8 @@ rt_send_export_event(struct rt_export_hook *hook)
 static void
 rt_cleanup_export(struct lfjour *j, struct lfjour_item *i)
 {
-  struct rtable_private *tab = SKIP_BACK(struct rtable_private, journal, j);
-  struct rt_pending_export *rpe = SKIP_BACK(struct rt_pending_export, li, i);
+  SKIP_BACK_DECLARE(struct rtable_private, tab, journal, j);
+  SKIP_BACK_DECLARE(struct rt_pending_export, rpe, li, i);
 
   /* Unlink this export from struct network */
   ASSERT_DIE(rpe->new || rpe->old);
@@ -1415,7 +1415,7 @@ rt_import_cleared(void *_ih)
 static void
 rt_cleanup_done(struct lfjour *j, u64 begin_seq, u64 end_seq)
 {
-  struct rtable_private *tab = SKIP_BACK(struct rtable_private, journal, j);
+  SKIP_BACK_DECLARE(struct rtable_private, tab, journal, j);
   ASSERT_DIE(DG_IS_LOCKED(tab->lock.rtable));
 
   if (~end_seq)
@@ -1838,7 +1838,7 @@ rte_recalculate(struct rtable_private *table, struct rt_import_hook *c, struct n
 int
 channel_preimport(struct rt_import_request *req, rte *new, const rte *old)
 {
-  struct channel *c = SKIP_BACK(struct channel, in_req, req);
+  SKIP_BACK_DECLARE(struct channel, c, in_req, req);
 
   if (new && !old)
     if (CHANNEL_LIMIT_PUSH(c, RX))
@@ -2329,7 +2329,7 @@ rt_table_export_start_feed(struct rtable_private *tab, struct rt_export_hook *ho
   };
   lfjour_register(&tab->journal, &hook->recipient);
 
-  struct rt_pending_export *rpe = SKIP_BACK(struct rt_pending_export, li, atomic_load_explicit(&hook->recipient.last, memory_order_relaxed));
+  SKIP_BACK_DECLARE(struct rt_pending_export, rpe, li, atomic_load_explicit(&hook->recipient.last, memory_order_relaxed));
   req_trace(req, D_STATES, "Export initialized, last export %p (%lu)", rpe, rpe ? rpe->seq : 0);
 
   bmap_init(&hook->seq_map, hook->pool, 16);
@@ -2579,7 +2579,7 @@ rt_dump_hooks(rtable *tp)
 
   WALK_TLIST(lfjour_recipient, r, &tab->journal.recipients)
   {
-    struct rt_export_hook *eh = SKIP_BACK(struct rt_export_hook, recipient, r);
+    SKIP_BACK_DECLARE(struct rt_export_hook, eh, recipient, r);
     eh->req->dump_req(eh->req);
     debug("  Export hook %p requested by %p:"
        " refeed_pending=%u last_state_change=%t export_state=%u\n",
@@ -2677,7 +2677,7 @@ struct rt_flowspec_link {
 static void
 rt_flowspec_export_one(struct rt_export_request *req, const net_addr *net, struct rt_pending_export *first)
 {
-  struct rt_flowspec_link *ln = SKIP_BACK(struct rt_flowspec_link, req, req);
+  SKIP_BACK_DECLARE(struct rt_flowspec_link, ln, req, req);
   rtable *dst_pub = ln->dst;
   ASSUME(rt_is_flow(dst_pub));
 
@@ -2712,14 +2712,14 @@ rt_flowspec_export_one(struct rt_export_request *req, const net_addr *net, struc
 static void
 rt_flowspec_dump_req(struct rt_export_request *req)
 {
-  struct rt_flowspec_link *ln = SKIP_BACK(struct rt_flowspec_link, req, req);
+  SKIP_BACK_DECLARE(struct rt_flowspec_link, ln, req, req);
   debug("  Flowspec link for table %s (%p)\n", ln->dst->name, req);
 }
 
 static void
 rt_flowspec_log_state_change(struct rt_export_request *req, u8 state)
 {
-  struct rt_flowspec_link *ln = SKIP_BACK(struct rt_flowspec_link, req, req);
+  SKIP_BACK_DECLARE(struct rt_flowspec_link, ln, req, req);
   rt_trace(ln->dst, D_STATES, "Flowspec link from %s export state changed to %s",
       ln->src->name, rt_export_state_name(state));
 }
@@ -2788,7 +2788,7 @@ rt_flowspec_link(rtable *src_pub, rtable *dst_pub)
 static void
 rt_flowspec_link_stopped(struct rt_export_request *req)
 {
-  struct rt_flowspec_link *ln = SKIP_BACK(struct rt_flowspec_link, req, req);
+  SKIP_BACK_DECLARE(struct rt_flowspec_link, ln, req, req);
   rtable *dst = ln->dst;
 
   mb_free(ln);
@@ -2832,7 +2832,7 @@ rt_flowspec_reset_trie(struct rtable_private *tab)
 static void
 rt_free(resource *_r)
 {
-  struct rtable_private *r = SKIP_BACK(struct rtable_private, r, _r);
+  SKIP_BACK_DECLARE(struct rtable_private, r, r, _r);
 
   DBG("Deleting routing table %s\n", r->name);
   ASSERT_DIE(r->use_count == 0);
@@ -2854,7 +2854,7 @@ rt_free(resource *_r)
 static void
 rt_res_dump(resource *_r, unsigned indent)
 {
-  struct rtable_private *r = SKIP_BACK(struct rtable_private, r, _r);
+  SKIP_BACK_DECLARE(struct rtable_private, r, r, _r);
 
   debug("name \"%s\", addr_type=%s, rt_count=%u, use_count=%d\n",
       r->name, net_label[r->addr_type], r->rt_count, r->use_count);
@@ -3610,7 +3610,7 @@ rt_flowspec_update_rte(struct rtable_private *tab, const rte *r, rte *new)
   if (!bc->base_table)
     return 0;
 
-  struct bgp_proto *p = SKIP_BACK(struct bgp_proto, p, bc->c.proto);
+  SKIP_BACK_DECLARE(struct bgp_proto, p, p, bc->c.proto);
 
   enum flowspec_valid old = rt_get_flowspec_valid(r),
                      valid = rt_flowspec_check(bc->base_table, tab, r->net, r->attrs, p->is_interior);
@@ -3638,7 +3638,7 @@ rt_flowspec_resolve_rte(rte *r, struct channel *c)
      && (c->class == &channel_bgp)
      && (bc->base_table))
   {
-    struct bgp_proto *p = SKIP_BACK(struct bgp_proto, p, bc->c.proto);
+    SKIP_BACK_DECLARE(struct bgp_proto, p, p, bc->c.proto);
     RT_LOCKED(c->in_req.hook->table, tab)
       valid = rt_flowspec_check(
          bc->base_table, tab,
@@ -4367,7 +4367,7 @@ void channel_reload_export_bulk(struct rt_export_request *req, const net_addr *n
     struct rt_pending_export *first, struct rt_pending_export *last,
     const rte **feed, uint count)
 {
-  struct channel *c = SKIP_BACK(struct channel, reload_req, req);
+  SKIP_BACK_DECLARE(struct channel, c, reload_req, req);
 
   for (uint i=0; i<count; i++)
     if (feed[i]->sender == c->in_req.hook)
@@ -4497,14 +4497,14 @@ hc_notify_dump_req(struct rt_export_request *req)
 static void
 hc_notify_log_state_change(struct rt_export_request *req, u8 state)
 {
-  struct hostcache *hc = SKIP_BACK(struct hostcache, req, req);
+  SKIP_BACK_DECLARE(struct hostcache, hc, req, req);
   rt_trace(hc->tab, D_STATES, "HCU Export state changed to %s", rt_export_state_name(state));
 }
 
 static void
 hc_notify_export_one(struct rt_export_request *req, const net_addr *net, struct rt_pending_export *first)
 {
-  struct hostcache *hc = SKIP_BACK(struct hostcache, req, req);
+  SKIP_BACK_DECLARE(struct hostcache, hc, req, req);
 
   RT_LOCKED(hc->tab, tab)
     if (ev_active(tab->hcu_event) || !trie_match_net(hc->trie, net))
@@ -4576,7 +4576,7 @@ rt_free_hostcache(struct rtable_private *tab)
   node *n;
   WALK_LIST(n, hc->hostentries)
     {
-      struct hostentry *he = SKIP_BACK(struct hostentry, ln, n);
+      SKIP_BACK_DECLARE(struct hostentry, he, ln, n);
       ea_free(he->src);
 
       if (!lfuc_finished(&he->uc))
index cc1b2862627a4a821a1662322eb6db4baa64d2cd..be8609c8ce9e1d45d81b2920f181da745241b94a 100644 (file)
@@ -210,7 +210,7 @@ HASH_DEFINE_REHASH_FN(AGGR_BUCK, struct aggregator_bucket);
 static void
 aggregator_rt_notify(struct proto *P, struct channel *src_ch, const net_addr *net, rte *new, const rte *old)
 {
-  struct aggregator_proto *p = SKIP_BACK(struct aggregator_proto, p, P);
+  SKIP_BACK_DECLARE(struct aggregator_proto, p, p, P);
   ASSERT_DIE(src_ch == p->src);
   struct aggregator_bucket *new_bucket = NULL, *old_bucket = NULL;
   struct aggregator_route *old_route = NULL;
@@ -316,7 +316,7 @@ aggregator_rt_notify(struct proto *P, struct channel *src_ch, const net_addr *ne
 static int
 aggregator_preexport(struct channel *C, struct rte *new)
 {
-  struct aggregator_proto *p = SKIP_BACK(struct aggregator_proto, p, C->proto);
+  SKIP_BACK_DECLARE(struct aggregator_proto, p, p, C->proto);
   /* Reject our own routes */
   if (new->sender == p->dst->in_req.hook)
     return -1;
@@ -334,7 +334,7 @@ aggregator_preexport(struct channel *C, struct rte *new)
 static void
 aggregator_postconfig(struct proto_config *CF)
 {
-  struct aggregator_config *cf = SKIP_BACK(struct aggregator_config, c, CF);
+  SKIP_BACK_DECLARE(struct aggregator_config, cf, c, CF);
 
   if (!cf->dst->table)
     cf_error("Source table not specified");
@@ -357,8 +357,8 @@ static struct proto *
 aggregator_init(struct proto_config *CF)
 {
   struct proto *P = proto_new(CF);
-  struct aggregator_proto *p = SKIP_BACK(struct aggregator_proto, p, P);
-  struct aggregator_config *cf = SKIP_BACK(struct aggregator_config, c, CF);
+  SKIP_BACK_DECLARE(struct aggregator_proto, p, p, P);
+  SKIP_BACK_DECLARE(struct aggregator_config, cf, c, CF);
 
   proto_configure_channel(P, &p->src, cf->src);
   proto_configure_channel(P, &p->dst, cf->dst);
@@ -377,7 +377,7 @@ aggregator_init(struct proto_config *CF)
 static int
 aggregator_start(struct proto *P)
 {
-  struct aggregator_proto *p = SKIP_BACK(struct aggregator_proto, p, P);
+  SKIP_BACK_DECLARE(struct aggregator_proto, p, p, P);
 
   p->bucket_slab = sl_new(P->pool, sizeof(struct aggregator_bucket) + AGGR_DATA_MEMSIZE);
   HASH_INIT(p->buckets, P->pool, AGGR_BUCK_ORDER);
@@ -396,7 +396,7 @@ aggregator_start(struct proto *P)
 static int
 aggregator_shutdown(struct proto *P)
 {
-  struct aggregator_proto *p = SKIP_BACK(struct aggregator_proto, p, P);
+  SKIP_BACK_DECLARE(struct aggregator_proto, p, p, P);
 
   HASH_WALK_DELSAFE(p->buckets, next_hash, b)
   {
@@ -424,8 +424,8 @@ aggregator_shutdown(struct proto *P)
 static int
 aggregator_reconfigure(struct proto *P, struct proto_config *CF)
 {
-  struct aggregator_proto *p = SKIP_BACK(struct aggregator_proto, p, P);
-  struct aggregator_config *cf = SKIP_BACK(struct aggregator_config, c, CF);
+  SKIP_BACK_DECLARE(struct aggregator_proto, p, p, P);
+  SKIP_BACK_DECLARE(struct aggregator_config, cf, c, CF);
 
   TRACE(D_EVENTS, "Reconfiguring");
 
index 3e371f0f6ea7f0a0782ac16cf0d3b77de25b70b7..de3e58b29e53be5213d32cee274bb25c6bb543bc 100644 (file)
@@ -567,7 +567,7 @@ bfd_reconfigure_session(struct bfd_proto *p, struct bfd_session *s)
 
   ASSERT_DIE(birdloop_inside(p->p.loop));
 
-  struct bfd_request *req = SKIP_BACK(struct bfd_request, n, HEAD(s->request_list));
+  SKIP_BACK_DECLARE(struct bfd_request, req, n, HEAD(s->request_list));
   s->cf = bfd_merge_options(s->ifa->cf, &req->opts);
 
   u32 tx = (s->loc_state == BFD_STATE_UP) ? s->cf.min_tx_int : s->cf.idle_tx_int;
@@ -780,7 +780,7 @@ bfd_pickup_requests(void *_data UNUSED)
     node *n;
     WALK_LIST(n, bfd_global.proto_list)
     {
-      struct bfd_proto *p = SKIP_BACK(struct bfd_proto, bfd_node, n);
+      SKIP_BACK_DECLARE(struct bfd_proto, p, bfd_node, n);
       birdloop_enter(p->p.loop);
       BFD_LOCK;
 
@@ -845,7 +845,7 @@ bfd_drop_requests(struct bfd_proto *p)
   {
     WALK_LIST_FIRST(n, s->request_list)
     {
-      struct bfd_request *req = SKIP_BACK(struct bfd_request, n, n);
+      SKIP_BACK_DECLARE(struct bfd_request, req, n, n);
       rem_node(&req->n);
       add_tail(&bfd_global.pickup_list, &req->n);
       req->session = NULL;
index c431846774f802b9bd2d5a9b09e2c27fc5e34ca7..4aef0cb09bd10f72c26827cc52bf2e3414d56897 100644 (file)
@@ -1860,7 +1860,7 @@ bgp_done_prefix(struct bgp_channel *c, struct bgp_prefix *px, struct bgp_bucket
 static void
 bgp_pending_tx_rfree(resource *r)
 {
-  struct bgp_pending_tx *ptx = SKIP_BACK(struct bgp_pending_tx, r, r);
+  SKIP_BACK_DECLARE(struct bgp_pending_tx, ptx, r, r);
 
   HASH_WALK(ptx->prefix_hash, next, n)
     rt_unlock_source(rt_find_source_global(n->path_id));
@@ -1913,7 +1913,7 @@ static void
 bgp_out_table_feed(void *data)
 {
   struct bgp_out_export_hook *hook = data;
-  struct bgp_channel *bc = SKIP_BACK(struct bgp_channel, prefix_exporter, hook->h.table);
+  SKIP_BACK_DECLARE(struct bgp_channel, bc, prefix_exporter, hook->h.table);
   struct bgp_pending_tx *c = bc->ptx;
 
   int max = 512;
@@ -2012,7 +2012,7 @@ bgp_out_table_export_start(struct rt_exporter *re, struct rt_export_request *req
   req->hook = rt_alloc_export(re, req->pool, sizeof(struct bgp_out_export_hook));
   req->hook->req = req;
 
-  struct bgp_out_export_hook *hook = SKIP_BACK(struct bgp_out_export_hook, h, req->hook);
+  SKIP_BACK_DECLARE(struct bgp_out_export_hook, hook, h, req->hook);
 
   hook->h.event.hook = bgp_out_table_feed;
   rt_init_export(re, req->hook);
@@ -2720,7 +2720,7 @@ bgp_rte_modify_stale(struct rt_export_request *req, const net_addr *n,
     struct rt_pending_export *first, struct rt_pending_export *last,
     const rte **feed, uint count)
 {
-  struct bgp_channel *c = SKIP_BACK(struct bgp_channel, stale_feed, req);
+  SKIP_BACK_DECLARE(struct bgp_channel, c, stale_feed, req);
   struct rt_import_hook *irh = c->c.in_req.hook;
 
   /* Find our routes among others */
index 932ef5416a1ac0ac19fcf88df6ed92d91cb228f1..6739ac16c601c37fa55f026b93a8c39ea0ddb253 100644 (file)
@@ -268,7 +268,7 @@ bgp_listen_create(void *_ UNUSED)
 
     /* Get the first request to match */
     struct bgp_listen_request *req = HEAD(bgp_listen_pending);
-    struct bgp_proto *p = SKIP_BACK(struct bgp_proto, listen, req);
+    SKIP_BACK_DECLARE(struct bgp_proto, p, listen, req);
     rem_node(&req->n);
 
     /* First try to find existing socket */
@@ -922,14 +922,14 @@ bgp_graceful_restart_feed_done(struct rt_export_request *req)
 static void
 bgp_graceful_restart_feed_dump_req(struct rt_export_request *req)
 {
-  struct bgp_channel *c = SKIP_BACK(struct bgp_channel, stale_feed, req);
+  SKIP_BACK_DECLARE(struct bgp_channel, c, stale_feed, req);
   debug("  BGP-GR %s.%s export request %p\n", c->c.proto->name, c->c.name, req);
 }
 
 static void
 bgp_graceful_restart_feed_log_state_change(struct rt_export_request *req, u8 state)
 {
-  struct bgp_channel *c = SKIP_BACK(struct bgp_channel, stale_feed, req);
+  SKIP_BACK_DECLARE(struct bgp_channel, c, stale_feed, req);
   struct bgp_proto *p = (void *) c->c.proto;
   BGP_TRACE(D_EVENTS, "Long-lived graceful restart export state changed to %s", rt_export_state_name(state));
 
@@ -1339,7 +1339,7 @@ bgp_find_proto(sock *sk)
 
   WALK_LIST(req, bs->requests)
   {
-    struct bgp_proto *p = SKIP_BACK(struct bgp_proto, listen, req);
+    SKIP_BACK_DECLARE(struct bgp_proto, p, listen, req);
     if ((p->p.proto == &proto_bgp) &&
        (ipa_equal(p->remote_ip, sk->daddr) || bgp_is_dynamic(p)) &&
        (!p->cf->remote_range || ipa_in_netX(sk->daddr, p->cf->remote_range)) &&
index f57d7b53d5263abc182e48058b5b636995824c8e..1cf6f32c974b8b5a0323a0d6dbb47fb6d477c863 100644 (file)
@@ -1149,7 +1149,7 @@ bgp_apply_mpls_labels(struct bgp_parse_state *s, ea_list **to, u32 lnum, u32 lab
   if (s->channel->cf->gw_mode == GW_DIRECT)
   {
     eattr *e = ea_find(*to, &ea_gen_nexthop);
-    struct nexthop_adata_mpls *namp = SKIP_BACK(struct nexthop_adata_mpls, nhad.ad, e->u.ptr);
+    SKIP_BACK_DECLARE(struct nexthop_adata_mpls, namp, nhad.ad, e->u.ptr);
 
     namp->nhad.nh.labels = lnum;
     memcpy(namp->nhad.nh.label, labels, lnum * sizeof(u32));
index 2cea47415198a5ece1e94baa2bef5e7341f98dc8..e8cb084e4bcf77a2c4dfd1834100e3031fd37981 100644 (file)
@@ -99,7 +99,7 @@ pipe_preexport(struct channel *C, rte *e)
 void
 pipe_import_by_refeed_free(struct channel_feeding_request *cfr)
 {
-  struct import_to_export_reload *reload = SKIP_BACK(struct import_to_export_reload, cfr, cfr);
+  SKIP_BACK_DECLARE(struct import_to_export_reload, reload, cfr, cfr);
   reload->cir->done(reload->cir);
 }
 
index fd0d9a2530b27233d67fca52f9138bef7b84b70f..0853204e89700996cd63f5ed954caafb8397eefe 100644 (file)
@@ -482,7 +482,7 @@ sockets_prepare(struct birdloop *loop, struct pfd *pfd)
   node *n;
   WALK_LIST(n, loop->sock_list)
   {
-    sock *s = SKIP_BACK(sock, n, n);
+    SKIP_BACK_DECLARE(sock, s, n, n);
     uint w = sk_want_events(s);
 
     if (!w)
@@ -1244,7 +1244,7 @@ bird_thread_show_loop(struct bird_thread_show_data *tsd, struct birdloop *loop)
 static void
 bird_thread_show(struct bird_thread_syncer *sync)
 {
-  struct bird_thread_show_data *tsd = SKIP_BACK(struct bird_thread_show_data, sync, sync);
+  SKIP_BACK_DECLARE(struct bird_thread_show_data, tsd, sync, sync);
 
   if (!tsd->lp)
     tsd->lp = lp_new(tsd->sync.pool);
@@ -1276,7 +1276,7 @@ bird_thread_show(struct bird_thread_syncer *sync)
 static void
 cmd_show_threads_done(struct bird_thread_syncer *sync)
 {
-  struct bird_thread_show_data *tsd = SKIP_BACK(struct bird_thread_show_data, sync, sync);
+  SKIP_BACK_DECLARE(struct bird_thread_show_data, tsd, sync, sync);
   ASSERT_DIE(birdloop_inside(&main_birdloop));
 
   tsd->cli->cont = NULL;
index f8ffb0de64d6de846a942ab824eb258c47c4701b..6046364d59fe1c5e6746bee622244bd38bf9628d 100644 (file)
@@ -110,7 +110,7 @@ struct log_thread_syncer {
 static void
 lts_done(struct bird_thread_syncer *sync)
 {
-  struct log_thread_syncer *lts = SKIP_BACK(struct log_thread_syncer, sync, sync);
+  SKIP_BACK_DECLARE(struct log_thread_syncer, lts, sync, sync);
 
   log_lock();
   if (lts->lc_close)