]> git.proxmox.com Git - mirror_frr.git/blame - nhrpd/nhrp_main.c
lib: autocomple vrf list authorises default vrf name
[mirror_frr.git] / nhrpd / nhrp_main.c
CommitLineData
2fb975da
TT
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"
819dc8bb 20#include "memory_vty.h"
2fb975da 21#include "command.h"
4f04a76b 22#include "libfrr.h"
2fb975da
TT
23
24#include "nhrpd.h"
25#include "netlink.h"
aed07011 26#include "nhrp_errors.h"
2fb975da 27
819dc8bb
DL
28DEFINE_MGROUP(NHRPD, "NHRP")
29
2fb975da
TT
30unsigned int debug_flags = 0;
31
32struct thread_master *master;
33struct timeval current_time;
2fb975da
TT
34
35/* nhrpd options. */
996c9314 36struct option longopts[] = {{0}};
2fb975da
TT
37
38/* nhrpd privileges */
996c9314
LB
39static zebra_capabilities_t _caps_p[] = {
40 ZCAP_NET_RAW, ZCAP_NET_ADMIN,
41 ZCAP_DAC_OVERRIDE, /* for now needed to write to
42 /proc/sys/net/ipv4/<if>/send_redirect */
2fb975da
TT
43};
44
26efbc7b 45struct zebra_privs_t nhrpd_privs = {
54b7b88b
HWC
46#if defined(FRR_USER) && defined(FRR_GROUP)
47 .user = FRR_USER,
48 .group = FRR_GROUP,
2fb975da
TT
49#endif
50#ifdef VTY_GROUP
51 .vty_group = VTY_GROUP,
52#endif
53 .caps_p = _caps_p,
54 .cap_num_p = ZEBRA_NUM_OF(_caps_p),
55};
56
4f04a76b 57static void parse_arguments(int argc, char **argv)
2fb975da
TT
58{
59 int opt;
60
61 while (1) {
4f04a76b 62 opt = frr_getopt(argc, argv, 0);
996c9314
LB
63 if (opt < 0)
64 break;
2fb975da
TT
65
66 switch (opt) {
67 case 0:
68 break;
2fb975da 69 default:
4f04a76b 70 frr_help_exit(1);
2fb975da
TT
71 break;
72 }
73 }
74}
75
76static void nhrp_sigusr1(void)
77{
dd8376fe 78 zlog_rotate();
2fb975da
TT
79}
80
81static void nhrp_request_stop(void)
82{
83 debugf(NHRP_DEBUG_COMMON, "Exiting...");
03951374 84 frr_early_fini();
2fb975da
TT
85
86 nhrp_shortcut_terminate();
87 nhrp_nhs_terminate();
88 nhrp_zebra_terminate();
89 vici_terminate();
90 evmgr_terminate();
91 nhrp_vc_terminate();
92 vrf_terminate();
2fb975da 93
2fb975da 94 debugf(NHRP_DEBUG_COMMON, "Done.");
03951374 95 frr_fini();
2fb975da
TT
96
97 exit(0);
98}
99
100static struct quagga_signal_t sighandlers[] = {
996c9314
LB
101 {
102 .signal = SIGUSR1,
103 .handler = &nhrp_sigusr1,
104 },
105 {
106 .signal = SIGINT,
107 .handler = &nhrp_request_stop,
108 },
109 {
110 .signal = SIGTERM,
111 .handler = &nhrp_request_stop,
112 },
2fb975da
TT
113};
114
996c9314 115FRR_DAEMON_INFO(nhrpd, NHRP, .vty_port = NHRP_VTY_PORT,
4f04a76b 116
996c9314 117 .proghelp = "Implementation of the NHRP routing protocol.",
4f04a76b 118
996c9314 119 .signals = sighandlers, .n_signals = array_size(sighandlers),
4f04a76b 120
996c9314 121 .privs = &nhrpd_privs, )
4f04a76b 122
2fb975da
TT
123int main(int argc, char **argv)
124{
4f04a76b 125 frr_preinit(&nhrpd_di, argc, argv);
eb05883f 126 frr_opt_add("", longopts, "");
2fb975da 127
4f04a76b 128 parse_arguments(argc, argv);
2fb975da
TT
129
130 /* Library inits. */
4f04a76b 131 master = frr_init();
aed07011 132 nhrp_error_init();
6df85364 133 vrf_init(NULL, NULL, NULL, NULL);
818c8515 134 nhrp_interface_init();
2fb975da
TT
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
eb05883f 151 frr_config_fork();
16077f2f 152 frr_run(master);
2fb975da
TT
153 return 0;
154}