summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaria Matejka <mq@ucw.cz>2022-03-18 22:05:50 +0100
committerMaria Matejka <mq@ucw.cz>2022-04-06 18:14:08 +0200
commit4a23ede2b056a41456790cc20a0c3d92a7137693 (patch)
tree179c6f0ae13604cb85e9f10729818ef0b131e9a1
parent0f68515263e91dd49b2d845cdff35af40c064dc2 (diff)
Protocols have their own explicit init routines
-rw-r--r--Makefile.in10
-rw-r--r--nest/Makefile7
-rw-r--r--nest/proto.c45
-rw-r--r--nest/protocol.h4
-rw-r--r--nest/rt-dev.c6
-rw-r--r--proto/babel/Makefile1
-rw-r--r--proto/babel/babel.c6
-rw-r--r--proto/bfd/Makefile3
-rw-r--r--proto/bfd/bfd.c17
-rw-r--r--proto/bgp/Makefile3
-rw-r--r--proto/bgp/bgp.c5
-rw-r--r--proto/mrt/Makefile3
-rw-r--r--proto/mrt/mrt.c6
-rw-r--r--proto/ospf/Makefile3
-rw-r--r--proto/ospf/ospf.c6
-rw-r--r--proto/perf/Makefile1
-rw-r--r--proto/perf/perf.c6
-rw-r--r--proto/pipe/Makefile3
-rw-r--r--proto/pipe/pipe.c6
-rw-r--r--proto/radv/Makefile3
-rw-r--r--proto/radv/radv.c6
-rw-r--r--proto/rip/Makefile3
-rw-r--r--proto/rip/rip.c6
-rw-r--r--proto/rpki/Makefile3
-rw-r--r--proto/rpki/rpki.c6
-rw-r--r--proto/static/Makefile3
-rw-r--r--proto/static/static.c6
-rw-r--r--sysdep/unix/Makefile2
-rw-r--r--sysdep/unix/krt.c13
-rw-r--r--sysdep/unix/main.c2
-rw-r--r--test/bt-utils.c2
31 files changed, 131 insertions, 65 deletions
diff --git a/Makefile.in b/Makefile.in
index e0ff4a1d..0d55807b 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -82,6 +82,9 @@ conf-lex-targets := $(addprefix $(objdir)/conf/,cf-lex.o)
conf-y-targets := $(addprefix $(objdir)/conf/,cf-parse.y keywords.h commands.h)
cf-local = $(conf-y-targets): $(s)config.Y
+# nest/Makefile declarations needed for all other modules
+proto-build-c := $(addprefix $(objdir)/nest/,proto-build.c)
+
src-o-files = $(patsubst %.c,$(o)%.o,$(src))
tests-target-files = $(patsubst %.c,$(o)%,$(tests_src))
@@ -95,6 +98,13 @@ else
o = $(patsubst $(srcdir)%,$(objdir)%,$(s))
endif
+define proto-build_in =
+PROTO_BUILD += $(1)
+$(proto-build-c): $(lastword $(MAKEFILE_LIST))
+endef
+
+proto-build = $(eval $(call proto-build_in,$(1)))
+
define clean_in =
clean::
rm -f $(addprefix $(o),$(1))
diff --git a/nest/Makefile b/nest/Makefile
index 884d3950..7d451ba4 100644
--- a/nest/Makefile
+++ b/nest/Makefile
@@ -1,7 +1,12 @@
-src := a-path.c a-set.c cli.c cmds.c iface.c locks.c neighbor.c password.c proto.c rt-attr.c rt-dev.c rt-fib.c rt-show.c rt-table.c
+src := a-path.c a-set.c cli.c cmds.c iface.c locks.c neighbor.c password.c proto.c proto-build.c rt-attr.c rt-dev.c rt-fib.c rt-show.c rt-table.c
obj := $(src-o-files)
$(all-daemon)
$(cf-local)
+$(call proto-build,dev_build)
+
+$(proto-build-c): $(lastword $(MAKEFILE_LIST))
+ $(E)echo GEN $@
+ $(Q)echo "$(patsubst %,void %(void); ,$(PROTO_BUILD)) void protos_build_gen(void) { $(patsubst %, %(); ,$(PROTO_BUILD))}" > $@
tests_src := a-set_test.c a-path_test.c
tests_targets := $(tests_targets) $(tests-target-files)
diff --git a/nest/proto.c b/nest/proto.c
index 7cfb1555..7074f73a 100644
--- a/nest/proto.c
+++ b/nest/proto.c
@@ -23,9 +23,9 @@
#include "filter/f-inst.h"
pool *proto_pool;
-list proto_list;
+list STATIC_LIST_INIT(proto_list);
-static list protocol_list;
+static list STATIC_LIST_INIT(protocol_list);
struct protocol *class_to_protocol[PROTOCOL__MAX];
#define CD(c, msg, args...) ({ if (c->debug & D_STATES) log(L_TRACE "%s.%s: " msg, c->proto->name, c->name ?: "?", ## args); })
@@ -1651,6 +1651,8 @@ proto_build(struct protocol *p)
/* FIXME: convert this call to some protocol hook */
extern void bfd_init_all(void);
+void protos_build_gen(void);
+
/**
* protos_build - build a protocol list
*
@@ -1663,44 +1665,7 @@ extern void bfd_init_all(void);
void
protos_build(void)
{
- init_list(&proto_list);
- init_list(&protocol_list);
-
- proto_build(&proto_device);
-#ifdef CONFIG_RADV
- proto_build(&proto_radv);
-#endif
-#ifdef CONFIG_RIP
- proto_build(&proto_rip);
-#endif
-#ifdef CONFIG_STATIC
- proto_build(&proto_static);
-#endif
-#ifdef CONFIG_MRT
- proto_build(&proto_mrt);
-#endif
-#ifdef CONFIG_OSPF
- proto_build(&proto_ospf);
-#endif
-#ifdef CONFIG_PIPE
- proto_build(&proto_pipe);
-#endif
-#ifdef CONFIG_BGP
- proto_build(&proto_bgp);
-#endif
-#ifdef CONFIG_BFD
- proto_build(&proto_bfd);
- bfd_init_all();
-#endif
-#ifdef CONFIG_BABEL
- proto_build(&proto_babel);
-#endif
-#ifdef CONFIG_RPKI
- proto_build(&proto_rpki);
-#endif
-#ifdef CONFIG_PERF
- proto_build(&proto_perf);
-#endif
+ protos_build_gen();
proto_pool = rp_new(&root_pool, "Protocols");
proto_shutdown_timer = tm_new(proto_pool);
diff --git a/nest/protocol.h b/nest/protocol.h
index e05dd7ec..d0810a8f 100644
--- a/nest/protocol.h
+++ b/nest/protocol.h
@@ -84,8 +84,8 @@ struct protocol {
void (*copy_config)(struct proto_config *, struct proto_config *); /* Copy config from given protocol instance */
};
-void protos_build(void);
-void proto_build(struct protocol *);
+void protos_build(void); /* Called from sysdep to initialize protocols */
+void proto_build(struct protocol *); /* Called from protocol to register itself */
void protos_preconfig(struct config *);
void protos_commit(struct config *new, struct config *old, int force_restart, int type);
struct proto * proto_spawn(struct proto_config *cf, uint disabled);
diff --git a/nest/rt-dev.c b/nest/rt-dev.c
index e2e65926..05e64fc3 100644
--- a/nest/rt-dev.c
+++ b/nest/rt-dev.c
@@ -195,3 +195,9 @@ struct protocol proto_device = {
.reconfigure = dev_reconfigure,
.copy_config = dev_copy_config
};
+
+void
+dev_build(void)
+{
+ proto_build(&proto_device);
+}
diff --git a/proto/babel/Makefile b/proto/babel/Makefile
index 06b58e95..ae6aeaf2 100644
--- a/proto/babel/Makefile
+++ b/proto/babel/Makefile
@@ -2,5 +2,6 @@ src := babel.c packets.c
obj := $(src-o-files)
$(all-daemon)
$(cf-local)
+$(call proto-build,babel_build)
tests_objs := $(tests_objs) $(src-o-files)
diff --git a/proto/babel/babel.c b/proto/babel/babel.c
index b3411fc2..8040345f 100644
--- a/proto/babel/babel.c
+++ b/proto/babel/babel.c
@@ -2494,3 +2494,9 @@ struct protocol proto_babel = {
.get_route_info = babel_get_route_info,
.get_attr = babel_get_attr
};
+
+void
+babel_build(void)
+{
+ proto_build(&proto_babel);
+}
diff --git a/proto/bfd/Makefile b/proto/bfd/Makefile
index 402122fc..dbdc0a09 100644
--- a/proto/bfd/Makefile
+++ b/proto/bfd/Makefile
@@ -2,5 +2,6 @@ src := bfd.c io.c packets.c
obj := $(src-o-files)
$(all-daemon)
$(cf-local)
+$(call proto-build,bfd_build)
-tests_objs := $(tests_objs) $(src-o-files) \ No newline at end of file
+tests_objs := $(tests_objs) $(src-o-files)
diff --git a/proto/bfd/bfd.c b/proto/bfd/bfd.c
index 277f38bf..d1e97cd5 100644
--- a/proto/bfd/bfd.c
+++ b/proto/bfd/bfd.c
@@ -113,8 +113,8 @@
#define HASH_IP_EQ(a1,n1,a2,n2) ipa_equal(a1, a2) && n1 == n2
#define HASH_IP_FN(a,n) ipa_hash(a) ^ u32_hash(n)
-static list bfd_proto_list;
-static list bfd_wait_list;
+static list STATIC_LIST_INIT(bfd_proto_list);
+static list STATIC_LIST_INIT(bfd_wait_list);
const char *bfd_state_names[] = { "AdminDown", "Down", "Init", "Up" };
@@ -998,13 +998,6 @@ bfd_notify_init(struct bfd_proto *p)
* BFD protocol glue
*/
-void
-bfd_init_all(void)
-{
- init_list(&bfd_proto_list);
- init_list(&bfd_wait_list);
-}
-
static struct proto *
bfd_init(struct proto_config *c)
{
@@ -1186,3 +1179,9 @@ struct protocol proto_bfd = {
.reconfigure = bfd_reconfigure,
.copy_config = bfd_copy_config,
};
+
+void
+bfd_build(void)
+{
+ proto_build(&proto_bfd);
+}
diff --git a/proto/bgp/Makefile b/proto/bgp/Makefile
index 00aaef5e..2a4cc99c 100644
--- a/proto/bgp/Makefile
+++ b/proto/bgp/Makefile
@@ -2,5 +2,6 @@ src := attrs.c bgp.c packets.c
obj := $(src-o-files)
$(all-daemon)
$(cf-local)
+$(call proto-build,bgp_build)
-tests_objs := $(tests_objs) $(src-o-files) \ No newline at end of file
+tests_objs := $(tests_objs) $(src-o-files)
diff --git a/proto/bgp/bgp.c b/proto/bgp/bgp.c
index 52400762..8c97f7b3 100644
--- a/proto/bgp/bgp.c
+++ b/proto/bgp/bgp.c
@@ -2592,3 +2592,8 @@ struct protocol proto_bgp = {
.get_route_info = bgp_get_route_info,
.show_proto_info = bgp_show_proto_info
};
+
+void bgp_build(void)
+{
+ proto_build(&proto_bgp);
+}
diff --git a/proto/mrt/Makefile b/proto/mrt/Makefile
index 925fb102..000e1c1c 100644
--- a/proto/mrt/Makefile
+++ b/proto/mrt/Makefile
@@ -2,5 +2,6 @@ src := mrt.c
obj := $(src-o-files)
$(all-daemon)
$(cf-local)
+$(call proto-build,mrt_build)
-tests_objs := $(tests_objs) $(src-o-files) \ No newline at end of file
+tests_objs := $(tests_objs) $(src-o-files)
diff --git a/proto/mrt/mrt.c b/proto/mrt/mrt.c
index e885611a..70b2aeff 100644
--- a/proto/mrt/mrt.c
+++ b/proto/mrt/mrt.c
@@ -916,3 +916,9 @@ struct protocol proto_mrt = {
.reconfigure = mrt_reconfigure,
.copy_config = mrt_copy_config,
};
+
+void
+mrt_build(void)
+{
+ proto_build(&proto_mrt);
+}
diff --git a/proto/ospf/Makefile b/proto/ospf/Makefile
index 39e74f71..85664543 100644
--- a/proto/ospf/Makefile
+++ b/proto/ospf/Makefile
@@ -2,5 +2,6 @@ src := dbdes.c hello.c iface.c lsack.c lsalib.c lsreq.c lsupd.c neighbor.c ospf.
obj := $(src-o-files)
$(all-daemon)
$(cf-local)
+$(call proto-build,ospf_build)
-tests_objs := $(tests_objs) $(src-o-files) \ No newline at end of file
+tests_objs := $(tests_objs) $(src-o-files)
diff --git a/proto/ospf/ospf.c b/proto/ospf/ospf.c
index f9aa6cd1..4ea53942 100644
--- a/proto/ospf/ospf.c
+++ b/proto/ospf/ospf.c
@@ -1534,3 +1534,9 @@ struct protocol proto_ospf = {
.get_attr = ospf_get_attr,
.get_route_info = ospf_get_route_info
};
+
+void
+ospf_build(void)
+{
+ proto_build(&proto_ospf);
+}
diff --git a/proto/perf/Makefile b/proto/perf/Makefile
index 7877fb19..42051f43 100644
--- a/proto/perf/Makefile
+++ b/proto/perf/Makefile
@@ -2,5 +2,6 @@ src := perf.c
obj := $(src-o-files)
$(all-daemon)
$(cf-local)
+$(call proto-build,perf_build)
tests_objs := $(tests_objs) $(src-o-files)
diff --git a/proto/perf/perf.c b/proto/perf/perf.c
index 52784c14..5d228045 100644
--- a/proto/perf/perf.c
+++ b/proto/perf/perf.c
@@ -315,3 +315,9 @@ struct protocol proto_perf = {
.reconfigure = perf_reconfigure,
.copy_config = perf_copy_config,
};
+
+void
+perf_build(void)
+{
+ proto_build(&proto_perf);
+}
diff --git a/proto/pipe/Makefile b/proto/pipe/Makefile
index 5093da98..ba66027f 100644
--- a/proto/pipe/Makefile
+++ b/proto/pipe/Makefile
@@ -2,5 +2,6 @@ src := pipe.c
obj := $(src-o-files)
$(all-daemon)
$(cf-local)
+$(call proto-build,pipe_build)
-tests_objs := $(tests_objs) $(src-o-files) \ No newline at end of file
+tests_objs := $(tests_objs) $(src-o-files)
diff --git a/proto/pipe/pipe.c b/proto/pipe/pipe.c
index 97862780..c3457135 100644
--- a/proto/pipe/pipe.c
+++ b/proto/pipe/pipe.c
@@ -303,3 +303,9 @@ struct protocol proto_pipe = {
.get_status = pipe_get_status,
.show_proto_info = pipe_show_proto_info
};
+
+void
+pipe_build(void)
+{
+ proto_build(&proto_pipe);
+}
diff --git a/proto/radv/Makefile b/proto/radv/Makefile
index 05317eff..4780bee3 100644
--- a/proto/radv/Makefile
+++ b/proto/radv/Makefile
@@ -2,5 +2,6 @@ src := packets.c radv.c
obj := $(src-o-files)
$(all-daemon)
$(cf-local)
+$(call proto-build,radv_build)
-tests_objs := $(tests_objs) $(src-o-files) \ No newline at end of file
+tests_objs := $(tests_objs) $(src-o-files)
diff --git a/proto/radv/radv.c b/proto/radv/radv.c
index 540ff2a7..7985997a 100644
--- a/proto/radv/radv.c
+++ b/proto/radv/radv.c
@@ -771,3 +771,9 @@ struct protocol proto_radv = {
.get_status = radv_get_status,
.get_attr = radv_get_attr
};
+
+void
+radv_build(void)
+{
+ proto_build(&proto_radv);
+}
diff --git a/proto/rip/Makefile b/proto/rip/Makefile
index 7feabcd8..b9ff62d6 100644
--- a/proto/rip/Makefile
+++ b/proto/rip/Makefile
@@ -2,5 +2,6 @@ src := packets.c rip.c
obj := $(src-o-files)
$(all-daemon)
$(cf-local)
+$(call proto-build,rip_build)
-tests_objs := $(tests_objs) $(src-o-files) \ No newline at end of file
+tests_objs := $(tests_objs) $(src-o-files)
diff --git a/proto/rip/rip.c b/proto/rip/rip.c
index eb232316..9d8b9849 100644
--- a/proto/rip/rip.c
+++ b/proto/rip/rip.c
@@ -1342,3 +1342,9 @@ struct protocol proto_rip = {
.get_route_info = rip_get_route_info,
.get_attr = rip_get_attr
};
+
+void
+rip_build(void)
+{
+ proto_build(&proto_rip);
+}
diff --git a/proto/rpki/Makefile b/proto/rpki/Makefile
index eb09b7df..8e3a2761 100644
--- a/proto/rpki/Makefile
+++ b/proto/rpki/Makefile
@@ -2,5 +2,6 @@ src := rpki.c packets.c tcp_transport.c ssh_transport.c transport.c
obj := $(src-o-files)
$(all-daemon)
$(cf-local)
+$(call proto-build,rpki_build)
-tests_objs := $(tests_objs) $(src-o-files) \ No newline at end of file
+tests_objs := $(tests_objs) $(src-o-files)
diff --git a/proto/rpki/rpki.c b/proto/rpki/rpki.c
index be3d19ab..6e111a81 100644
--- a/proto/rpki/rpki.c
+++ b/proto/rpki/rpki.c
@@ -949,3 +949,9 @@ struct protocol proto_rpki = {
.reconfigure = rpki_reconfigure,
.get_status = rpki_get_status,
};
+
+void
+rpki_build(void)
+{
+ proto_build(&proto_rpki);
+}
diff --git a/proto/static/Makefile b/proto/static/Makefile
index e38f9b74..26aed31f 100644
--- a/proto/static/Makefile
+++ b/proto/static/Makefile
@@ -2,5 +2,6 @@ src := static.c
obj := $(src-o-files)
$(all-daemon)
$(cf-local)
+$(call proto-build,static_build)
-tests_objs := $(tests_objs) $(src-o-files) \ No newline at end of file
+tests_objs := $(tests_objs) $(src-o-files)
diff --git a/proto/static/static.c b/proto/static/static.c
index 6d3871cc..cf2e4585 100644
--- a/proto/static/static.c
+++ b/proto/static/static.c
@@ -793,3 +793,9 @@ struct protocol proto_static = {
.copy_config = static_copy_config,
.get_route_info = static_get_route_info,
};
+
+void
+static_build(void)
+{
+ proto_build(&proto_static);
+}
diff --git a/sysdep/unix/Makefile b/sysdep/unix/Makefile
index d0d36b5f..51ab98a9 100644
--- a/sysdep/unix/Makefile
+++ b/sysdep/unix/Makefile
@@ -2,6 +2,8 @@ src := alloc.c io.c krt.c log.c main.c random.c
obj := $(src-o-files)
$(all-daemon)
$(cf-local)
+$(call proto-build,kif_build)
+$(call proto-build,krt_build)
$(conf-y-targets): $(s)krt.Y
src := $(filter-out main.c, $(src))
diff --git a/sysdep/unix/krt.c b/sysdep/unix/krt.c
index 7d7ec7e6..bfd69b73 100644
--- a/sysdep/unix/krt.c
+++ b/sysdep/unix/krt.c
@@ -243,6 +243,13 @@ struct protocol proto_unix_iface = {
.copy_config = kif_copy_config
};
+void
+kif_build(void)
+{
+ proto_build(&proto_unix_iface);
+}
+
+
/*
* Tracing of routes
*/
@@ -1177,3 +1184,9 @@ struct protocol proto_unix_kernel = {
.dump = krt_dump,
#endif
};
+
+void
+krt_build(void)
+{
+ proto_build(&proto_unix_kernel);
+}
diff --git a/sysdep/unix/main.c b/sysdep/unix/main.c
index cdf0a310..71749324 100644
--- a/sysdep/unix/main.c
+++ b/sysdep/unix/main.c
@@ -906,8 +906,6 @@ main(int argc, char **argv)
open_pid_file();
protos_build();
- proto_build(&proto_unix_kernel);
- proto_build(&proto_unix_iface);
struct config *conf = read_config();
diff --git a/test/bt-utils.c b/test/bt-utils.c
index 2a7799c3..8496e185 100644
--- a/test/bt-utils.c
+++ b/test/bt-utils.c
@@ -68,8 +68,6 @@ bt_bird_init(void)
config_init();
protos_build();
- proto_build(&proto_unix_kernel);
- proto_build(&proto_unix_iface);
}
void bt_bird_cleanup(void)