]> git.proxmox.com Git - mirror_frr.git/blob - ripd/rip_main.c
ripd: support BFD integration
[mirror_frr.git] / ripd / rip_main.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* RIPd main routine.
3 * Copyright (C) 1997, 98 Kunihiro Ishiguro <kunihiro@zebra.org>
4 */
5
6 #include <zebra.h>
7
8 #include <lib/version.h>
9 #include "getopt.h"
10 #include "frrevent.h"
11 #include "command.h"
12 #include "memory.h"
13 #include "prefix.h"
14 #include "filter.h"
15 #include "keychain.h"
16 #include "log.h"
17 #include "privs.h"
18 #include "sigevent.h"
19 #include "zclient.h"
20 #include "vrf.h"
21 #include "if_rmap.h"
22 #include "libfrr.h"
23 #include "routemap.h"
24 #include "bfd.h"
25
26 #include "ripd/ripd.h"
27 #include "ripd/rip_bfd.h"
28 #include "ripd/rip_nb.h"
29 #include "ripd/rip_errors.h"
30
31 /* ripd options. */
32 static struct option longopts[] = {{0}};
33
34 /* ripd privileges */
35 zebra_capabilities_t _caps_p[] = {ZCAP_NET_RAW, ZCAP_BIND, ZCAP_SYS_ADMIN};
36
37 struct zebra_privs_t ripd_privs = {
38 #if defined(FRR_USER)
39 .user = FRR_USER,
40 #endif
41 #if defined FRR_GROUP
42 .group = FRR_GROUP,
43 #endif
44 #ifdef VTY_GROUP
45 .vty_group = VTY_GROUP,
46 #endif
47 .caps_p = _caps_p,
48 .cap_num_p = array_size(_caps_p),
49 .cap_num_i = 0};
50
51 /* Master of threads. */
52 struct event_loop *master;
53
54 static struct frr_daemon_info ripd_di;
55
56 /* SIGHUP handler. */
57 static void sighup(void)
58 {
59 zlog_info("SIGHUP received");
60
61 /* Reload config file. */
62 vty_read_config(NULL, ripd_di.config_file, config_default);
63 }
64
65 /* SIGINT handler. */
66 static void sigint(void)
67 {
68 zlog_notice("Terminating on signal");
69
70 bfd_protocol_integration_set_shutdown(true);
71 rip_vrf_terminate();
72 if_rmap_terminate();
73 rip_zclient_stop();
74 frr_fini();
75
76 exit(0);
77 }
78
79 /* SIGUSR1 handler. */
80 static void sigusr1(void)
81 {
82 zlog_rotate();
83 }
84
85 static struct frr_signal_t ripd_signals[] = {
86 {
87 .signal = SIGHUP,
88 .handler = &sighup,
89 },
90 {
91 .signal = SIGUSR1,
92 .handler = &sigusr1,
93 },
94 {
95 .signal = SIGINT,
96 .handler = &sigint,
97 },
98 {
99 .signal = SIGTERM,
100 .handler = &sigint,
101 },
102 };
103
104 static const struct frr_yang_module_info *const ripd_yang_modules[] = {
105 &frr_filter_info,
106 &frr_interface_info,
107 &frr_ripd_info,
108 &frr_route_map_info,
109 &frr_vrf_info,
110 };
111
112 FRR_DAEMON_INFO(ripd, RIP, .vty_port = RIP_VTY_PORT,
113
114 .proghelp = "Implementation of the RIP routing protocol.",
115
116 .signals = ripd_signals, .n_signals = array_size(ripd_signals),
117
118 .privs = &ripd_privs, .yang_modules = ripd_yang_modules,
119 .n_yang_modules = array_size(ripd_yang_modules),
120 );
121
122 #define DEPRECATED_OPTIONS ""
123
124 /* Main routine of ripd. */
125 int main(int argc, char **argv)
126 {
127 frr_preinit(&ripd_di, argc, argv);
128
129 frr_opt_add("" DEPRECATED_OPTIONS, longopts, "");
130
131 /* Command line option parse. */
132 while (1) {
133 int opt;
134
135 opt = frr_getopt(argc, argv, NULL);
136
137 if (opt && opt < 128 && strchr(DEPRECATED_OPTIONS, opt)) {
138 fprintf(stderr,
139 "The -%c option no longer exists.\nPlease refer to the manual.\n",
140 opt);
141 continue;
142 }
143
144 if (opt == EOF)
145 break;
146
147 switch (opt) {
148 case 0:
149 break;
150 default:
151 frr_help_exit(1);
152 }
153 }
154
155 /* Prepare master thread. */
156 master = frr_init();
157
158 /* Library initialization. */
159 rip_error_init();
160 keychain_init();
161 rip_vrf_init();
162
163 /* RIP related initialization. */
164 rip_init();
165 rip_if_init();
166 rip_cli_init();
167 rip_zclient_init(master);
168 rip_bfd_init(master);
169
170 frr_config_fork();
171 frr_run(master);
172
173 /* Not reached. */
174 return 0;
175 }