]>
Commit | Line | Data |
---|---|---|
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" | |
26 | ||
819dc8bb DL |
27 | DEFINE_MGROUP(NHRPD, "NHRP") |
28 | ||
2fb975da TT |
29 | unsigned int debug_flags = 0; |
30 | ||
31 | struct thread_master *master; | |
32 | struct timeval current_time; | |
2fb975da TT |
33 | |
34 | /* nhrpd options. */ | |
35 | struct option longopts[] = { | |
2fb975da TT |
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 = { | |
54b7b88b HWC |
47 | #if defined(FRR_USER) && defined(FRR_GROUP) |
48 | .user = FRR_USER, | |
49 | .group = FRR_GROUP, | |
2fb975da TT |
50 | #endif |
51 | #ifdef VTY_GROUP | |
52 | .vty_group = VTY_GROUP, | |
53 | #endif | |
54 | .caps_p = _caps_p, | |
55 | .cap_num_p = ZEBRA_NUM_OF(_caps_p), | |
56 | }; | |
57 | ||
4f04a76b | 58 | static void parse_arguments(int argc, char **argv) |
2fb975da TT |
59 | { |
60 | int opt; | |
61 | ||
62 | while (1) { | |
4f04a76b | 63 | opt = frr_getopt(argc, argv, 0); |
2fb975da TT |
64 | if(opt < 0) break; |
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 | ||
76 | static void nhrp_sigusr1(void) | |
77 | { | |
dd8376fe | 78 | zlog_rotate(); |
2fb975da TT |
79 | } |
80 | ||
81 | static void nhrp_request_stop(void) | |
82 | { | |
83 | debugf(NHRP_DEBUG_COMMON, "Exiting..."); | |
84 | ||
85 | nhrp_shortcut_terminate(); | |
86 | nhrp_nhs_terminate(); | |
87 | nhrp_zebra_terminate(); | |
88 | vici_terminate(); | |
89 | evmgr_terminate(); | |
90 | nhrp_vc_terminate(); | |
91 | vrf_terminate(); | |
92 | /* memory_terminate(); */ | |
93 | /* vty_terminate(); */ | |
94 | cmd_terminate(); | |
95 | /* signal_terminate(); */ | |
96 | zprivs_terminate(&nhrpd_privs); | |
97 | ||
2fb975da TT |
98 | debugf(NHRP_DEBUG_COMMON, "Done."); |
99 | ||
dd8376fe | 100 | closezlog(); |
2fb975da TT |
101 | |
102 | exit(0); | |
103 | } | |
104 | ||
105 | static struct quagga_signal_t sighandlers[] = { | |
106 | { .signal = SIGUSR1, .handler = &nhrp_sigusr1, }, | |
107 | { .signal = SIGINT, .handler = &nhrp_request_stop, }, | |
108 | { .signal = SIGTERM, .handler = &nhrp_request_stop, }, | |
109 | }; | |
110 | ||
4f04a76b DL |
111 | FRR_DAEMON_INFO(nhrpd, NHRP, |
112 | .vty_port = NHRP_VTY_PORT, | |
113 | ||
114 | .proghelp = "Implementation of the NHRP routing protocol.", | |
115 | ||
116 | .signals = sighandlers, | |
117 | .n_signals = array_size(sighandlers), | |
118 | ||
119 | .privs = &nhrpd_privs, | |
120 | ) | |
121 | ||
2fb975da TT |
122 | int main(int argc, char **argv) |
123 | { | |
4f04a76b | 124 | frr_preinit(&nhrpd_di, argc, argv); |
eb05883f | 125 | frr_opt_add("", longopts, ""); |
2fb975da | 126 | |
4f04a76b | 127 | parse_arguments(argc, argv); |
2fb975da TT |
128 | |
129 | /* Library inits. */ | |
4f04a76b | 130 | master = frr_init(); |
2fb975da TT |
131 | nhrp_interface_init(); |
132 | vrf_init(); | |
133 | resolver_init(); | |
134 | ||
135 | /* Run with elevated capabilities, as for all netlink activity | |
136 | * we need privileges anyway. */ | |
137 | nhrpd_privs.change(ZPRIVS_RAISE); | |
138 | ||
139 | netlink_init(); | |
140 | evmgr_init(); | |
141 | nhrp_vc_init(); | |
142 | nhrp_packet_init(); | |
143 | vici_init(); | |
144 | nhrp_zebra_init(); | |
145 | nhrp_shortcut_init(); | |
146 | ||
147 | nhrp_config_init(); | |
148 | ||
eb05883f | 149 | frr_config_fork(); |
16077f2f | 150 | frr_run(master); |
2fb975da TT |
151 | return 0; |
152 | } |