diff options
-rw-r--r-- | pimd/.gitignore | 7 | ||||
-rw-r--r-- | pimd/pim6_main.c | 214 | ||||
-rw-r--r-- | pimd/pimd.c | 2 | ||||
-rw-r--r-- | pimd/subdir.am | 32 |
4 files changed, 248 insertions, 7 deletions
diff --git a/pimd/.gitignore b/pimd/.gitignore index b1780df75..3f7347108 100644 --- a/pimd/.gitignore +++ b/pimd/.gitignore @@ -1,3 +1,4 @@ -pimd -mtracebis -test_igmpv3_join +/pimd +/pim6d +/mtracebis +/test_igmpv3_join diff --git a/pimd/pim6_main.c b/pimd/pim6_main.c new file mode 100644 index 000000000..02654e1cb --- /dev/null +++ b/pimd/pim6_main.c @@ -0,0 +1,214 @@ +/* + * PIMv6 main() + * Copyright (C) 2021 David Lamparter for NetDEF, Inc. + * Copyright (C) 2008 Everton da Silva Marques (pim_main.c) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; see the file COPYING; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <zebra.h> + +#include "lib/vrf.h" +#include "lib/filter.h" +#include "lib/plist.h" +#include "lib/routemap.h" +#include "lib/routing_nb.h" + +#include "lib/privs.h" +#include "lib/sigevent.h" +#include "lib/libfrr.h" +#include "lib/version.h" + +#include "pimd.h" +#include "pim_instance.h" +#include "pim_errors.h" +#include "pim_iface.h" +#include "pim_zebra.h" + +zebra_capabilities_t _caps_p[] = { + ZCAP_SYS_ADMIN, + ZCAP_NET_ADMIN, + ZCAP_NET_RAW, + ZCAP_BIND, +}; + +/* pimd privileges to run with */ +struct zebra_privs_t pimd_privs = { +#if defined(FRR_USER) && defined(FRR_GROUP) + .user = FRR_USER, + .group = FRR_GROUP, +#endif +#ifdef VTY_GROUP + .vty_group = VTY_GROUP, +#endif + .caps_p = _caps_p, + .cap_num_p = array_size(_caps_p), + .cap_num_i = 0, +}; + +static void pim6_terminate(void); + +static void pim6_sighup(void) +{ + zlog_info("SIGHUP received, ignoring"); +} + +static void pim6_sigint(void) +{ + zlog_notice("Terminating on signal SIGINT"); + pim6_terminate(); + exit(1); +} + +static void pim6_sigterm(void) +{ + zlog_notice("Terminating on signal SIGTERM"); + pim6_terminate(); + exit(1); +} + +static void pim6_sigusr1(void) +{ + zlog_rotate(); +} + +struct frr_signal_t pim6d_signals[] = { + { + .signal = SIGHUP, + .handler = &pim6_sighup, + }, + { + .signal = SIGUSR1, + .handler = &pim6_sigusr1, + }, + { + .signal = SIGINT, + .handler = &pim6_sigint, + }, + { + .signal = SIGTERM, + .handler = &pim6_sigterm, + }, +}; + +static const struct frr_yang_module_info *const pim6d_yang_modules[] = { + &frr_filter_info, + &frr_interface_info, + &frr_route_map_info, + &frr_vrf_info, + &frr_routing_info, +}; + +/* clang-format off */ +FRR_DAEMON_INFO(pim6d, PIM6, + .vty_port = 0, + .flags = FRR_NO_SPLIT_CONFIG, + + .proghelp = "Protocol Independent Multicast (RFC7761) for IPv6", + + .signals = pim6d_signals, + .n_signals = array_size(pim6d_signals), + + .privs = &pimd_privs, + + .yang_modules = pim6d_yang_modules, + .n_yang_modules = array_size(pim6d_yang_modules), +); +/* clang-format on */ + + +int main(int argc, char **argv, char **envp) +{ + static struct option longopts[] = { + {}, + }; + + frr_preinit(&pim6d_di, argc, argv); + frr_opt_add("", longopts, ""); + + /* this while just reads the options */ + while (1) { + int opt; + + opt = frr_getopt(argc, argv, NULL); + + if (opt == EOF) + break; + + switch (opt) { + case 0: + break; + default: + frr_help_exit(1); + } + } + + pim_router_init(); + /* TODO PIM6: temporary enable all debugs, remove later in PIMv6 work */ + router->debugs = ~0U; + + access_list_init(); + prefix_list_init(); + + /* + * Initializations + */ + pim_error_init(); + pim_vrf_init(); +#if 0 + prefix_list_add_hook(pim_prefix_list_update); + prefix_list_delete_hook(pim_prefix_list_update); + + pim_route_map_init(); + pim_init(); +#endif + + /* + * Initialize zclient "update" and "lookup" sockets + */ + if_zapi_callbacks(pim_ifp_create, pim_ifp_up, + pim_ifp_down, pim_ifp_destroy); + + /* TODO PIM6: next line is temporary since pim_cmd_init is disabled */ + if_cmd_init(NULL); + +#if 0 + pim_zebra_init(); + pim_bfd_init(); + pim_mlag_init(); + + hook_register(routing_conf_event, + routing_control_plane_protocols_name_validate); + + routing_control_plane_protocols_register_vrf_dependency(); +#endif + + frr_config_fork(); + frr_run(router->master); + + /* never reached */ + return 0; +} + +static void pim6_terminate(void) +{ + pim_vrf_terminate(); + pim_router_terminate(); + + prefix_list_reset(); + access_list_reset(); + + frr_fini(); +} diff --git a/pimd/pimd.c b/pimd/pimd.c index 38e727394..992bb931b 100644 --- a/pimd/pimd.c +++ b/pimd/pimd.c @@ -115,7 +115,6 @@ void pim_router_init(void) void pim_router_terminate(void) { - pim_mlag_terminate(); XFREE(MTYPE_ROUTER, router); } @@ -155,6 +154,7 @@ void pim_terminate(void) } pim_free(); + pim_mlag_terminate(); pim_router_terminate(); frr_fini(); diff --git a/pimd/subdir.am b/pimd/subdir.am index f8bc0ff08..520b1aa18 100644 --- a/pimd/subdir.am +++ b/pimd/subdir.am @@ -12,7 +12,7 @@ man8 += $(MANBUILD)/frr-pimd.8 man8 += $(MANBUILD)/mtracebis.8 endif -pimd_pimd_SOURCES = \ +pim_common = \ pimd/pim_assert.c \ pimd/pim_bfd.c \ pimd/pim_br.c \ @@ -32,7 +32,6 @@ pimd_pimd_SOURCES = \ pimd/pim_join.c \ pimd/pim_jp_agg.c \ pimd/pim_macro.c \ - pimd/pim_main.c \ pimd/pim_memory.c \ pimd/pim_mlag.c \ pimd/pim_mroute.c \ @@ -50,7 +49,6 @@ pimd_pimd_SOURCES = \ pimd/pim_routemap.c \ pimd/pim_rp.c \ pimd/pim_rpf.c \ - pimd/pim_signals.c \ pimd/pim_sock.c \ pimd/pim_ssm.c \ pimd/pim_ssmpingd.c \ @@ -68,12 +66,26 @@ pimd_pimd_SOURCES = \ pimd/pimd.c \ # end +pimd_pimd_SOURCES = \ + $(pim_common) \ + pimd/pim_main.c \ + pimd/pim_signals.c \ + # end + nodist_pimd_pimd_SOURCES = \ yang/frr-pim.yang.c \ yang/frr-pim-rp.yang.c \ yang/frr-igmp.yang.c \ # end +pimd_pim6d_SOURCES = \ + $(pim_common) \ + pimd/pim6_main.c \ + # end + +nodist_pimd_pim6d_SOURCES = \ + # end + noinst_HEADERS += \ pimd/pim_assert.h \ pimd/pim_bfd.h \ @@ -134,12 +146,26 @@ clippy_scan += \ pimd/pim_cmd.c \ # end +pimd_pimd_CFLAGS = $(AM_CFLAGS) -DPIM_IPV=4 pimd_pimd_LDADD = lib/libfrr.la $(LIBCAP) +if PIMD +if DEV_BUILD +# +# pim6d is only enabled for --enable-dev-build, and NOT installed currently +# (change noinst_ to sbin_ below to install it.) +# +noinst_PROGRAMS += pimd/pim6d +pimd_pim6d_CFLAGS = $(AM_CFLAGS) -DPIM_IPV=6 +pimd_pim6d_LDADD = lib/libfrr.la $(LIBCAP) +endif +endif + pimd_test_igmpv3_join_LDADD = lib/libfrr.la pimd_test_igmpv3_join_SOURCES = pimd/test_igmpv3_join.c pimd_mtracebis_LDADD = lib/libfrr.la +pimd_mtracebis_CFLAGS = $(AM_CFLAGS) -DPIM_IPV=4 pimd_mtracebis_SOURCES = pimd/mtracebis.c \ pimd/mtracebis_netlink.c \ pimd/mtracebis_routeget.c \ |