Line data Source code
1 : /*
2 : * libfrr overall management functions
3 : *
4 : * Copyright (C) 2016 David Lamparter for NetDEF, Inc.
5 : *
6 : * This program is free software; you can redistribute it and/or modify it
7 : * under the terms of the GNU General Public License as published by the Free
8 : * Software Foundation; either version 2 of the License, or (at your option)
9 : * any later version.
10 : *
11 : * This program is distributed in the hope that it will be useful, but WITHOUT
12 : * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 : * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 : * more details.
15 : *
16 : * You should have received a copy of the GNU General Public License along
17 : * with this program; see the file COPYING; if not, write to the Free Software
18 : * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 : */
20 :
21 : #ifndef _ZEBRA_FRR_H
22 : #define _ZEBRA_FRR_H
23 :
24 : #include "typesafe.h"
25 : #include "sigevent.h"
26 : #include "privs.h"
27 : #include "thread.h"
28 : #include "log.h"
29 : #include "getopt.h"
30 : #include "module.h"
31 : #include "hook.h"
32 : #include "northbound.h"
33 :
34 : #ifdef __cplusplus
35 : extern "C" {
36 : #endif
37 :
38 : /* The following options disable specific command line options that
39 : * are not applicable for a particular daemon.
40 : */
41 : #define FRR_NO_PRIVSEP (1 << 0)
42 : #define FRR_NO_TCPVTY (1 << 1)
43 : #define FRR_LIMITED_CLI (1 << 2)
44 : #define FRR_NO_SPLIT_CONFIG (1 << 3)
45 : #define FRR_NO_PID (1 << 4)
46 : #define FRR_NO_CFG_PID_DRY (FRR_NO_PID | FRR_NO_SPLIT_CONFIG)
47 : #define FRR_NO_ZCLIENT (1 << 5)
48 : /* If FRR_DETACH_LATER is used, the daemon will keep its parent running
49 : * until frr_detach() is called. Normally "somedaemon -d" returns once the
50 : * main event loop is reached in the daemon; use this for extra startup bits.
51 : *
52 : * Does nothing if -d isn't used.
53 : */
54 : #define FRR_DETACH_LATER (1 << 6)
55 :
56 : PREDECL_DLIST(log_args);
57 : struct log_arg {
58 : struct log_args_item itm;
59 :
60 : char target[0];
61 : };
62 54 : DECLARE_DLIST(log_args, struct log_arg, itm);
63 :
64 : enum frr_cli_mode {
65 : FRR_CLI_CLASSIC = 0,
66 : FRR_CLI_TRANSACTIONAL,
67 : };
68 :
69 : struct frr_daemon_info {
70 : unsigned flags;
71 :
72 : const char *progname;
73 : const char *name;
74 : const char *logname;
75 : unsigned short instance;
76 : struct frrmod_runtime *module;
77 :
78 : char *vty_addr;
79 : int vty_port;
80 : char *vty_sock_path;
81 : bool dryrun;
82 : bool daemon_mode;
83 : bool terminal;
84 : enum frr_cli_mode cli_mode;
85 :
86 : struct thread *read_in;
87 : const char *config_file;
88 : const char *backup_config_file;
89 : const char *pid_file;
90 : #ifdef HAVE_SQLITE3
91 : const char *db_file;
92 : #endif
93 : const char *vty_path;
94 : const char *module_path;
95 : const char *script_path;
96 :
97 : const char *pathspace;
98 : bool zpathspace;
99 :
100 : struct log_args_head early_logging[1];
101 : const char *early_loglevel;
102 :
103 : const char *proghelp;
104 : void (*printhelp)(FILE *target);
105 : const char *copyright;
106 : char startinfo[128];
107 :
108 : struct frr_signal_t *signals;
109 : size_t n_signals;
110 :
111 : struct zebra_privs_t *privs;
112 :
113 : const struct frr_yang_module_info *const *yang_modules;
114 : size_t n_yang_modules;
115 :
116 : bool log_always;
117 :
118 : /* Optional upper limit on the number of fds used in select/poll */
119 : uint32_t limit_fds;
120 : };
121 :
122 : /* execname is the daemon's executable (and pidfile and configfile) name,
123 : * i.e. "zebra" or "bgpd"
124 : * constname is the daemons source-level name, primarily for the logging ID,
125 : * i.e. "ZEBRA" or "BGP"
126 : *
127 : * note that this macro is also a latch-on point for other changes (e.g.
128 : * upcoming module support) that need to place some per-daemon things. Each
129 : * daemon should have one of these.
130 : */
131 : #define FRR_DAEMON_INFO(execname, constname, ...) \
132 : static struct frr_daemon_info execname##_di = {.name = #execname, \
133 : .logname = #constname, \
134 : .module = THIS_MODULE, \
135 : __VA_ARGS__}; \
136 : FRR_COREMOD_SETUP(.name = #execname, \
137 : .description = #execname " daemon", \
138 : .version = FRR_VERSION, ); \
139 : MACRO_REQUIRE_SEMICOLON() /* end */
140 :
141 : extern void frr_init_vtydir(void);
142 : extern void frr_preinit(struct frr_daemon_info *daemon, int argc, char **argv);
143 : extern void frr_opt_add(const char *optstr, const struct option *longopts,
144 : const char *helpstr);
145 : extern int frr_getopt(int argc, char *const argv[], int *longindex);
146 :
147 : extern __attribute__((__noreturn__)) void frr_help_exit(int status);
148 :
149 : extern struct thread_master *frr_init(void);
150 : extern const char *frr_get_progname(void);
151 : extern enum frr_cli_mode frr_get_cli_mode(void);
152 : extern uint32_t frr_get_fd_limit(void);
153 : extern bool frr_is_startup_fd(int fd);
154 :
155 : /* call order of these hooks is as ordered here */
156 : DECLARE_HOOK(frr_early_init, (struct thread_master * tm), (tm));
157 : DECLARE_HOOK(frr_late_init, (struct thread_master * tm), (tm));
158 : /* fork() happens between late_init and config_pre */
159 : DECLARE_HOOK(frr_config_pre, (struct thread_master * tm), (tm));
160 : DECLARE_HOOK(frr_config_post, (struct thread_master * tm), (tm));
161 :
162 : extern void frr_config_fork(void);
163 :
164 : extern void frr_run(struct thread_master *master);
165 : extern void frr_detach(void);
166 :
167 : extern bool frr_zclient_addr(struct sockaddr_storage *sa, socklen_t *sa_len,
168 : const char *path);
169 :
170 : /* these two are before the protocol daemon does its own shutdown
171 : * it's named this way being the counterpart to frr_late_init */
172 : DECLARE_KOOH(frr_early_fini, (), ());
173 : extern void frr_early_fini(void);
174 : /* and these two are after the daemon did its own cleanup */
175 : DECLARE_KOOH(frr_fini, (), ());
176 : extern void frr_fini(void);
177 :
178 : extern char config_default[512];
179 : extern char frr_zclientpath[256];
180 : extern const char frr_sysconfdir[];
181 : extern char frr_vtydir[256];
182 : extern const char frr_moduledir[];
183 : extern const char frr_scriptdir[];
184 :
185 : extern char frr_protoname[];
186 : extern char frr_protonameinst[];
187 : /* always set in the spot where we *would* fork even if we don't do so */
188 : extern bool frr_is_after_fork;
189 :
190 : extern bool debug_memstats_at_exit;
191 :
192 : #ifdef __cplusplus
193 : }
194 : #endif
195 :
196 : #endif /* _ZEBRA_FRR_H */
|