diff options
author | Maria Matejka <mq@ucw.cz> | 2023-04-19 21:18:12 +0200 |
---|---|---|
committer | Maria Matejka <mq@ucw.cz> | 2023-04-22 20:48:42 +0200 |
commit | 074739e0e9baaba53f2a99edd348b76c3613b455 (patch) | |
tree | cf2402e373ec0909a76c0d05347a23385b339f1e | |
parent | 48dfcb60d61ab7aec478468bd50eb0196c332ee3 (diff) |
Global protocol list is typed to avoid typecast confusion
-rw-r--r-- | nest/proto.c | 46 | ||||
-rw-r--r-- | nest/protocol.h | 12 |
2 files changed, 31 insertions, 27 deletions
diff --git a/nest/proto.c b/nest/proto.c index cd6a3faa..280585dd 100644 --- a/nest/proto.c +++ b/nest/proto.c @@ -23,7 +23,7 @@ #include "filter/f-inst.h" pool *proto_pool; -list STATIC_LIST_INIT(proto_list); +static TLIST_LIST(proto) global_proto_list; static list STATIC_LIST_INIT(protocol_list); @@ -1190,7 +1190,7 @@ proto_new(struct proto_config *cf) } static struct proto * -proto_init(struct proto_config *c, node *n) +proto_init(struct proto_config *c, struct proto *after) { struct protocol *pr = c->protocol; struct proto *p = pr->init(c); @@ -1199,7 +1199,7 @@ proto_init(struct proto_config *c, node *n) p->proto_state = PS_DOWN; p->last_state_change = current_time(); p->vrf = c->vrf; - insert_node(&p->n, n); + proto_add_after(&global_proto_list, p, after); p->event = ev_new_init(proto_pool, proto_event, p); @@ -1430,8 +1430,6 @@ protos_commit(struct config *new, struct config *old, int force_reconfig, int ty struct proto_config *oc, *nc; struct symbol *sym; struct proto *p; - node *n; - DBG("protos_commit:\n"); if (old) @@ -1518,8 +1516,8 @@ protos_commit(struct config *new, struct config *old, int force_reconfig, int ty } struct proto *first_dev_proto = NULL; + struct proto *after = NULL; - n = NODE &(proto_list.head); WALK_LIST(nc, new->protos) if (!nc->proto) { @@ -1527,14 +1525,14 @@ protos_commit(struct config *new, struct config *old, int force_reconfig, int ty if (old) log(L_INFO "Adding protocol %s", nc->name); - p = proto_init(nc, n); - n = NODE p; + p = proto_init(nc, after); + after = p; if (p->proto == &proto_unix_iface) first_dev_proto = p; } else - n = NODE nc->proto; + after = nc->proto; DBG("Protocol start\n"); @@ -1552,7 +1550,7 @@ protos_commit(struct config *new, struct config *old, int force_reconfig, int ty } /* Start all new protocols */ - WALK_LIST_DELSAFE(p, n, proto_list) + WALK_TLIST_DELSAFE(proto, p, &global_proto_list) proto_rethink_goal(p); } @@ -1574,18 +1572,19 @@ proto_rethink_goal(struct proto *p) if (p->reconfiguring && !p->active) { struct proto_config *nc = p->cf_new; - node *n = p->n.prev; + struct proto *after = p->n.prev; + DBG("%s has shut down for reconfiguration\n", p->name); p->cf->proto = NULL; config_del_obstacle(p->cf->global); proto_remove_channels(p); - rem_node(&p->n); + proto_rem_node(&global_proto_list, p); rfree(p->event); mb_free(p->message); mb_free(p); if (!nc) return; - p = proto_init(nc, n); + p = proto_init(nc, after); } /* Determine what state we want to reach */ @@ -1601,7 +1600,7 @@ proto_rethink_goal(struct proto *p) struct proto * proto_spawn(struct proto_config *cf, uint disabled) { - struct proto *p = proto_init(cf, TAIL(proto_list)); + struct proto *p = proto_init(cf, global_proto_list.last); p->disabled = disabled; proto_rethink_goal(p); return p; @@ -1697,8 +1696,7 @@ graceful_restart_done(timer *t UNUSED) log(L_INFO "Graceful restart done"); graceful_restart_state = GRS_DONE; - struct proto *p; - WALK_LIST(p, proto_list) + WALK_TLIST(proto, p, &global_proto_list) { if (!p->gr_recovery) continue; @@ -1794,8 +1792,7 @@ protos_dump_all(void) { debug("Protocols:\n"); - struct proto *p; - WALK_LIST(p, proto_list) PROTO_LOCKED_FROM_MAIN(p) + WALK_TLIST(proto, p, &global_proto_list) PROTO_LOCKED_FROM_MAIN(p) { #define DPF(x) (p->x ? " " #x : "") debug(" protocol %s (%p) state %s with %d active channels flags: %s%s%s%s\n", @@ -2481,10 +2478,9 @@ proto_apply_cmd_symbol(const struct symbol *s, void (* cmd)(struct proto *, uint static void proto_apply_cmd_patt(const char *patt, void (* cmd)(struct proto *, uintptr_t, int), uintptr_t arg) { - struct proto *p; int cnt = 0; - WALK_LIST(p, proto_list) + WALK_TLIST(proto, p, &global_proto_list) if (!patt || patmatch(patt, p->name)) PROTO_LOCKED_FROM_MAIN(p) cmd(p, arg, cnt++); @@ -2511,7 +2507,7 @@ proto_apply_cmd(struct proto_spec ps, void (* cmd)(struct proto *, uintptr_t, in struct proto * proto_get_named(struct symbol *sym, struct protocol *pr) { - struct proto *p, *q; + struct proto *p; if (sym) { @@ -2525,7 +2521,7 @@ proto_get_named(struct symbol *sym, struct protocol *pr) else { p = NULL; - WALK_LIST(q, proto_list) + WALK_TLIST(proto, q, &global_proto_list) if ((q->proto == pr) && (q->proto_state != PS_DOWN)) { if (p) @@ -2562,9 +2558,9 @@ proto_iterate_named(struct symbol *sym, struct protocol *proto, struct proto *ol } else { - for (struct proto *p = !old ? HEAD(proto_list) : NODE_NEXT(old); - NODE_VALID(p); - p = NODE_NEXT(p)) + for (struct proto *p = old ? old->n.next : global_proto_list.first; + p; + p = p->n.next) { if ((p->proto == proto) && (p->proto_state != PS_DOWN)) { diff --git a/nest/protocol.h b/nest/protocol.h index 01153162..eccfcb73 100644 --- a/nest/protocol.h +++ b/nest/protocol.h @@ -116,9 +116,16 @@ struct proto_config { /* Protocol-specific data follow... */ }; +#define TLIST_PREFIX proto +#define TLIST_TYPE struct proto +#define TLIST_ITEM n +#define TLIST_WANT_WALK +#define TLIST_WANT_ADD_TAIL +#define TLIST_WANT_ADD_AFTER + /* Protocol statistics */ struct proto { - node n; /* Node in global proto_list */ + TLIST_DEFAULT_NODE; /* Node in global proto_list */ struct protocol *proto; /* Protocol */ struct proto_config *cf; /* Configuration data */ struct proto_config *cf_new; /* Configuration we want to switch to after shutdown (NULL=delete) */ @@ -198,6 +205,8 @@ struct proto { /* Hic sunt protocol-specific data */ }; +#include "lib/tlists.h" + struct proto_spec { const void *ptr; int patt; @@ -284,7 +293,6 @@ proto_get_router_id(struct proto_config *pc) extern pool *proto_pool; -extern list proto_list; /* * Each protocol instance runs two different state machines: |