]> git.proxmox.com Git - mirror_frr.git/blob - nhrpd/nhrp_main.c
*: add frr_run()
[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 #include <unistd.h>
11
12 #include "zebra.h"
13 #include "privs.h"
14 #include "getopt.h"
15 #include "thread.h"
16 #include "sigevent.h"
17 #include "version.h"
18 #include "log.h"
19 #include "memory.h"
20 #include "memory_vty.h"
21 #include "command.h"
22 #include "libfrr.h"
23
24 #include "nhrpd.h"
25 #include "netlink.h"
26
27 DEFINE_MGROUP(NHRPD, "NHRP")
28
29 unsigned int debug_flags = 0;
30
31 struct thread_master *master;
32 struct timeval current_time;
33
34 /* nhrpd options. */
35 struct option longopts[] = {
36 { 0 }
37 };
38
39 /* nhrpd privileges */
40 static zebra_capabilities_t _caps_p [] = {
41 ZCAP_NET_RAW,
42 ZCAP_NET_ADMIN,
43 ZCAP_DAC_OVERRIDE, /* for now needed to write to /proc/sys/net/ipv4/<if>/send_redirect */
44 };
45
46 static struct zebra_privs_t nhrpd_privs = {
47 #ifdef QUAGGA_USER
48 .user = QUAGGA_USER,
49 #endif
50 #ifdef QUAGGA_GROUP
51 .group = QUAGGA_GROUP,
52 #endif
53 #ifdef VTY_GROUP
54 .vty_group = VTY_GROUP,
55 #endif
56 .caps_p = _caps_p,
57 .cap_num_p = ZEBRA_NUM_OF(_caps_p),
58 };
59
60 static void parse_arguments(int argc, char **argv)
61 {
62 int opt;
63
64 while (1) {
65 opt = frr_getopt(argc, argv, 0);
66 if(opt < 0) break;
67
68 switch (opt) {
69 case 0:
70 break;
71 default:
72 frr_help_exit(1);
73 break;
74 }
75 }
76 }
77
78 static void nhrp_sigusr1(void)
79 {
80 zlog_rotate(NULL);
81 }
82
83 static void nhrp_request_stop(void)
84 {
85 debugf(NHRP_DEBUG_COMMON, "Exiting...");
86
87 nhrp_shortcut_terminate();
88 nhrp_nhs_terminate();
89 nhrp_zebra_terminate();
90 vici_terminate();
91 evmgr_terminate();
92 nhrp_vc_terminate();
93 vrf_terminate();
94 /* memory_terminate(); */
95 /* vty_terminate(); */
96 cmd_terminate();
97 /* signal_terminate(); */
98 zprivs_terminate(&nhrpd_privs);
99
100 debugf(NHRP_DEBUG_COMMON, "Done.");
101
102 closezlog(zlog_default);
103
104 exit(0);
105 }
106
107 static struct quagga_signal_t sighandlers[] = {
108 { .signal = SIGUSR1, .handler = &nhrp_sigusr1, },
109 { .signal = SIGINT, .handler = &nhrp_request_stop, },
110 { .signal = SIGTERM, .handler = &nhrp_request_stop, },
111 };
112
113 FRR_DAEMON_INFO(nhrpd, NHRP,
114 .vty_port = NHRP_VTY_PORT,
115
116 .proghelp = "Implementation of the NHRP routing protocol.",
117
118 .signals = sighandlers,
119 .n_signals = array_size(sighandlers),
120
121 .privs = &nhrpd_privs,
122 )
123
124 int main(int argc, char **argv)
125 {
126 frr_preinit(&nhrpd_di, argc, argv);
127 frr_opt_add("", longopts, "");
128
129 parse_arguments(argc, argv);
130
131 /* Library inits. */
132 master = frr_init();
133 nhrp_interface_init();
134 vrf_init();
135 resolver_init();
136
137 /* Run with elevated capabilities, as for all netlink activity
138 * we need privileges anyway. */
139 nhrpd_privs.change(ZPRIVS_RAISE);
140
141 netlink_init();
142 evmgr_init();
143 nhrp_vc_init();
144 nhrp_packet_init();
145 vici_init();
146 nhrp_zebra_init();
147 nhrp_shortcut_init();
148
149 nhrp_config_init();
150
151 frr_config_fork();
152 frr_run(master);
153 return 0;
154 }