]> git.proxmox.com Git - mirror_frr.git/blob - nhrpd/nhrp_main.c
zebra: Allow ns delete to happen after under/over flow checks
[mirror_frr.git] / nhrpd / nhrp_main.c
1 /* NHRP daemon main functions
2 * Copyright (c) 2014-2015 Timo Teräs
3 *
4 * This file is free software: you may copy, redistribute and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 2 of the License, or
7 * (at your option) any later version.
8 */
9
10 #ifdef HAVE_CONFIG_H
11 #include "config.h"
12 #endif
13
14 #include <unistd.h>
15
16 #include "zebra.h"
17 #include "privs.h"
18 #include "getopt.h"
19 #include "thread.h"
20 #include "sigevent.h"
21 #include "version.h"
22 #include "log.h"
23 #include "memory.h"
24 #include "memory_vty.h"
25 #include "command.h"
26 #include "libfrr.h"
27
28 #include "nhrpd.h"
29 #include "netlink.h"
30 #include "nhrp_errors.h"
31
32 DEFINE_MGROUP(NHRPD, "NHRP")
33
34 unsigned int debug_flags = 0;
35
36 struct thread_master *master;
37 struct timeval current_time;
38
39 /* nhrpd options. */
40 struct option longopts[] = {{0}};
41
42 /* nhrpd privileges */
43 static zebra_capabilities_t _caps_p[] = {
44 ZCAP_NET_RAW, ZCAP_NET_ADMIN,
45 ZCAP_DAC_OVERRIDE, /* for now needed to write to
46 /proc/sys/net/ipv4/<if>/send_redirect */
47 };
48
49 struct zebra_privs_t nhrpd_privs = {
50 #if defined(FRR_USER) && defined(FRR_GROUP)
51 .user = FRR_USER,
52 .group = FRR_GROUP,
53 #endif
54 #ifdef VTY_GROUP
55 .vty_group = VTY_GROUP,
56 #endif
57 .caps_p = _caps_p,
58 .cap_num_p = ZEBRA_NUM_OF(_caps_p),
59 };
60
61 static void parse_arguments(int argc, char **argv)
62 {
63 int opt;
64
65 while (1) {
66 opt = frr_getopt(argc, argv, 0);
67 if (opt < 0)
68 break;
69
70 switch (opt) {
71 case 0:
72 break;
73 default:
74 frr_help_exit(1);
75 break;
76 }
77 }
78 }
79
80 static void nhrp_sigusr1(void)
81 {
82 zlog_rotate();
83 }
84
85 static void nhrp_request_stop(void)
86 {
87 debugf(NHRP_DEBUG_COMMON, "Exiting...");
88 frr_early_fini();
89
90 nhrp_shortcut_terminate();
91 nhrp_nhs_terminate();
92 nhrp_zebra_terminate();
93 vici_terminate();
94 evmgr_terminate();
95 nhrp_vc_terminate();
96 vrf_terminate();
97
98 debugf(NHRP_DEBUG_COMMON, "Done.");
99 frr_fini();
100
101 exit(0);
102 }
103
104 static struct quagga_signal_t sighandlers[] = {
105 {
106 .signal = SIGUSR1,
107 .handler = &nhrp_sigusr1,
108 },
109 {
110 .signal = SIGINT,
111 .handler = &nhrp_request_stop,
112 },
113 {
114 .signal = SIGTERM,
115 .handler = &nhrp_request_stop,
116 },
117 };
118
119 static const struct frr_yang_module_info *nhrpd_yang_modules[] = {
120 &frr_interface_info,
121 };
122
123 FRR_DAEMON_INFO(nhrpd, NHRP, .vty_port = NHRP_VTY_PORT,
124
125 .proghelp = "Implementation of the NHRP routing protocol.",
126
127 .signals = sighandlers, .n_signals = array_size(sighandlers),
128
129 .privs = &nhrpd_privs, .yang_modules = nhrpd_yang_modules,
130 .n_yang_modules = array_size(nhrpd_yang_modules), )
131
132 int main(int argc, char **argv)
133 {
134 frr_preinit(&nhrpd_di, argc, argv);
135 frr_opt_add("", longopts, "");
136
137 parse_arguments(argc, argv);
138
139 /* Library inits. */
140 master = frr_init();
141 nhrp_error_init();
142 vrf_init(NULL, NULL, NULL, NULL, NULL);
143 nhrp_interface_init();
144 resolver_init();
145
146 /* Run with elevated capabilities, as for all netlink activity
147 * we need privileges anyway. */
148 nhrpd_privs.change(ZPRIVS_RAISE);
149
150 netlink_init();
151 evmgr_init();
152 nhrp_vc_init();
153 nhrp_packet_init();
154 vici_init();
155 nhrp_zebra_init();
156 nhrp_shortcut_init();
157
158 nhrp_config_init();
159
160 frr_config_fork();
161 frr_run(master);
162 return 0;
163 }