]> git.proxmox.com Git - mirror_frr.git/blame - pimd/pim6_main.c
*: auto-convert to SPDX License IDs
[mirror_frr.git] / pimd / pim6_main.c
CommitLineData
acddc0ed 1// SPDX-License-Identifier: GPL-2.0-or-later
10fe382b
DL
2/*
3 * PIMv6 main()
4 * Copyright (C) 2021 David Lamparter for NetDEF, Inc.
5 * Copyright (C) 2008 Everton da Silva Marques (pim_main.c)
10fe382b
DL
6 */
7
8#include <zebra.h>
9
10#include "lib/vrf.h"
11#include "lib/filter.h"
12#include "lib/plist.h"
13#include "lib/routemap.h"
14#include "lib/routing_nb.h"
15
16#include "lib/privs.h"
17#include "lib/sigevent.h"
18#include "lib/libfrr.h"
19#include "lib/version.h"
20
21#include "pimd.h"
22#include "pim_instance.h"
23#include "pim_errors.h"
24#include "pim_iface.h"
25#include "pim_zebra.h"
e8515e32 26#include "pim_nb.h"
5d613d13 27#include "pim6_cmd.h"
5e5034b0 28#include "pim6_mld.h"
10fe382b
DL
29
30zebra_capabilities_t _caps_p[] = {
31 ZCAP_SYS_ADMIN,
32 ZCAP_NET_ADMIN,
33 ZCAP_NET_RAW,
34 ZCAP_BIND,
35};
36
37/* pimd privileges to run with */
38struct zebra_privs_t pimd_privs = {
39#if defined(FRR_USER) && defined(FRR_GROUP)
40 .user = FRR_USER,
41 .group = FRR_GROUP,
42#endif
43#ifdef VTY_GROUP
44 .vty_group = VTY_GROUP,
45#endif
46 .caps_p = _caps_p,
47 .cap_num_p = array_size(_caps_p),
48 .cap_num_i = 0,
49};
50
51static void pim6_terminate(void);
52
53static void pim6_sighup(void)
54{
55 zlog_info("SIGHUP received, ignoring");
56}
57
58static void pim6_sigint(void)
59{
60 zlog_notice("Terminating on signal SIGINT");
61 pim6_terminate();
62 exit(1);
63}
64
65static void pim6_sigterm(void)
66{
67 zlog_notice("Terminating on signal SIGTERM");
68 pim6_terminate();
69 exit(1);
70}
71
72static void pim6_sigusr1(void)
73{
74 zlog_rotate();
75}
76
77struct frr_signal_t pim6d_signals[] = {
78 {
79 .signal = SIGHUP,
80 .handler = &pim6_sighup,
81 },
82 {
83 .signal = SIGUSR1,
84 .handler = &pim6_sigusr1,
85 },
86 {
87 .signal = SIGINT,
88 .handler = &pim6_sigint,
89 },
90 {
91 .signal = SIGTERM,
92 .handler = &pim6_sigterm,
93 },
94};
95
96static const struct frr_yang_module_info *const pim6d_yang_modules[] = {
97 &frr_filter_info,
98 &frr_interface_info,
99 &frr_route_map_info,
100 &frr_vrf_info,
101 &frr_routing_info,
e8515e32 102 &frr_pim_info,
103 &frr_pim_rp_info,
104 &frr_gmp_info,
10fe382b
DL
105};
106
107/* clang-format off */
108FRR_DAEMON_INFO(pim6d, PIM6,
8a86ada1 109 .vty_port = PIM6D_VTY_PORT,
10fe382b
DL
110 .proghelp = "Protocol Independent Multicast (RFC7761) for IPv6",
111
112 .signals = pim6d_signals,
113 .n_signals = array_size(pim6d_signals),
114
115 .privs = &pimd_privs,
116
117 .yang_modules = pim6d_yang_modules,
118 .n_yang_modules = array_size(pim6d_yang_modules),
119);
120/* clang-format on */
121
10fe382b
DL
122int main(int argc, char **argv, char **envp)
123{
124 static struct option longopts[] = {
125 {},
126 };
127
128 frr_preinit(&pim6d_di, argc, argv);
129 frr_opt_add("", longopts, "");
130
131 /* this while just reads the options */
132 while (1) {
133 int opt;
134
135 opt = frr_getopt(argc, argv, NULL);
136
137 if (opt == EOF)
138 break;
139
140 switch (opt) {
141 case 0:
142 break;
143 default:
144 frr_help_exit(1);
145 }
146 }
147
148 pim_router_init();
10fe382b
DL
149
150 access_list_init();
151 prefix_list_init();
152
153 /*
154 * Initializations
155 */
156 pim_error_init();
157 pim_vrf_init();
158#if 0
159 prefix_list_add_hook(pim_prefix_list_update);
160 prefix_list_delete_hook(pim_prefix_list_update);
161
162 pim_route_map_init();
10fe382b 163#endif
334326ed 164 pim_init();
10fe382b
DL
165 /*
166 * Initialize zclient "update" and "lookup" sockets
167 */
6b88faa7 168 pim_iface_init();
10fe382b 169
5e5034b0
DL
170 gm_cli_init();
171
10fe382b 172 pim_zebra_init();
94120cb2 173#if 0
10fe382b
DL
174 pim_bfd_init();
175 pim_mlag_init();
ac529e18 176#endif
10fe382b
DL
177
178 hook_register(routing_conf_event,
179 routing_control_plane_protocols_name_validate);
180
181 routing_control_plane_protocols_register_vrf_dependency();
10fe382b
DL
182
183 frr_config_fork();
184 frr_run(router->master);
185
186 /* never reached */
187 return 0;
188}
189
190static void pim6_terminate(void)
191{
192 pim_vrf_terminate();
193 pim_router_terminate();
194
195 prefix_list_reset();
196 access_list_reset();
197
198 frr_fini();
199}