]> git.proxmox.com Git - mirror_frr.git/commitdiff
pim6d: add skeleton for IPv6 PIM daemon
authorDavid Lamparter <equinox@opensourcerouting.org>
Thu, 11 Nov 2021 16:34:00 +0000 (17:34 +0100)
committerDavid Lamparter <equinox@opensourcerouting.org>
Wed, 12 Jan 2022 17:23:50 +0000 (18:23 +0100)
This newborn pim6d is essentially an empty husk, but it does build
without warnings or errors and has the build system integration prepared
and working.

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
pimd/.gitignore
pimd/pim6_main.c [new file with mode: 0644]
pimd/pimd.c
pimd/subdir.am

index b1780df7584697357283efef27fb41449690cccc..3f7347108665279c3c6b1e6cbb860d7c67c2f3b3 100644 (file)
@@ -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 (file)
index 0000000..02654e1
--- /dev/null
@@ -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();
+}
index 38e7273945f15612d7235feaedb9a5bdea7ac411..992bb931bd600edb972412a061460fe724045c9c 100644 (file)
@@ -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();
index f8bc0ff081669d39238e7360a60331d956e94fee..520b1aa1877831f87ef72c9e8432b92d12ce229a 100644 (file)
@@ -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 \