1 /*
2  * Zebra API server.
3  * Portions:
4  *   Copyright (C) 1997-1999  Kunihiro Ishiguro
5  *   Copyright (C) 2015-2018  Cumulus Networks, Inc.
6  *   et al.
7  *
8  * This program is free software; you can redistribute it and/or modify it
9  * under the terms of the GNU General Public License as published by the Free
10  * Software Foundation; either version 2 of the License, or (at your option)
11  * any later version.
12  *
13  * This program is distributed in the hope that it will be useful, but WITHOUT
14  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
16  * more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with this program; see the file COPYING; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 #ifndef _ZEBRA_ZSERV_H
24 #define _ZEBRA_ZSERV_H
25 
26 /* clang-format off */
27 #include <stdint.h>           /* for uint32_t, uint8_t */
28 #include <time.h>             /* for time_t */
29 
30 #include "lib/route_types.h"  /* for ZEBRA_ROUTE_MAX */
31 #include "lib/zebra.h"        /* for AFI_MAX */
32 #include "lib/vrf.h"          /* for vrf_bitmap_t */
33 #include "lib/zclient.h"      /* for redist_proto */
34 #include "lib/stream.h"       /* for stream, stream_fifo */
35 #include "lib/thread.h"       /* for thread, thread_master */
36 #include "lib/linklist.h"     /* for list */
37 #include "lib/workqueue.h"    /* for work_queue */
38 #include "lib/hook.h"         /* for DECLARE_HOOK, DECLARE_KOOH */
39 
40 #include "zebra/zebra_vrf.h"  /* for zebra_vrf */
41 /* clang-format on */
42 
43 #ifdef __cplusplus
44 extern "C" {
45 #endif
46 
47 /* Default port information. */
48 #define ZEBRA_VTY_PORT                2601
49 
50 /* Default configuration filename. */
51 #define DEFAULT_CONFIG_FILE "zebra.conf"
52 
53 #define ZEBRA_RMAP_DEFAULT_UPDATE_TIMER 5 /* disabled by default */
54 
55 
56 /* Stale route marker timer */
57 #define ZEBRA_DEFAULT_STALE_UPDATE_DELAY 1
58 
59 /* Count of stale routes processed in timer context */
60 #define ZEBRA_MAX_STALE_ROUTE_COUNT 50000
61 
62 /* Graceful Restart information */
63 struct client_gr_info {
64 	/* VRF for which GR enabled */
65 	vrf_id_t vrf_id;
66 
67 	/* AFI */
68 	afi_t current_afi;
69 
70 	/* Stale time and GR cap */
71 	uint32_t stale_removal_time;
72 	enum zserv_client_capabilities capabilities;
73 
74 	/* GR commands */
75 	bool do_delete;
76 	bool gr_enable;
77 	bool stale_client;
78 
79 	/* Route sync and enable flags for AFI/SAFI */
80 	bool af_enabled[AFI_MAX][SAFI_MAX];
81 	bool route_sync[AFI_MAX][SAFI_MAX];
82 
83 	/* Book keeping */
84 	struct prefix *current_prefix;
85 	void *stale_client_ptr;
86 	struct thread *t_stale_removal;
87 
88 	TAILQ_ENTRY(client_gr_info) gr_info;
89 };
90 
91 /* Client structure. */
92 struct zserv {
93 	/* Client pthread */
94 	struct frr_pthread *pthread;
95 
96 	/* Client file descriptor. */
97 	int sock;
98 
99 	/* Attributes used to permit access to zapi clients from
100 	 * other pthreads: the client has a busy counter, and a
101 	 * 'closed' flag. These attributes are managed using a
102 	 * lock, via the acquire_client() and release_client() apis.
103 	 */
104 	int busy_count;
105 	bool is_closed;
106 
107 	/* Input/output buffer to the client. */
108 	pthread_mutex_t ibuf_mtx;
109 	struct stream_fifo *ibuf_fifo;
110 	pthread_mutex_t obuf_mtx;
111 	struct stream_fifo *obuf_fifo;
112 
113 	/* Private I/O buffers */
114 	struct stream *ibuf_work;
115 	struct stream *obuf_work;
116 
117 	/* Buffer of data waiting to be written to client. */
118 	struct buffer *wb;
119 
120 	/* Threads for read/write. */
121 	struct thread *t_read;
122 	struct thread *t_write;
123 
124 	/* Event for message processing, for the main pthread */
125 	struct thread *t_process;
126 
127 	/* Event for the main pthread */
128 	struct thread *t_cleanup;
129 
130 	/* This client's redistribute flag. */
131 	struct redist_proto mi_redist[AFI_MAX][ZEBRA_ROUTE_MAX];
132 	vrf_bitmap_t redist[AFI_MAX][ZEBRA_ROUTE_MAX];
133 
134 	/* Redistribute default route flag. */
135 	vrf_bitmap_t redist_default[AFI_MAX];
136 
137 	/* Router-id information. */
138 	vrf_bitmap_t ridinfo[AFI_MAX];
139 
140 	bool notify_owner;
141 
142 	/* Indicates if client is synchronous. */
143 	bool synchronous;
144 
145 	/* client's protocol and session info */
146 	uint8_t proto;
147 	uint16_t instance;
148 	uint32_t session_id;
149 
150 	/*
151 	 * Interested for MLAG Updates, and also stores the client
152 	 * interested message mask
153 	 */
154 	bool mlag_updates_interested;
155 	uint32_t mlag_reg_mask1;
156 
157 	/* Statistics */
158 	uint32_t redist_v4_add_cnt;
159 	uint32_t redist_v4_del_cnt;
160 	uint32_t redist_v6_add_cnt;
161 	uint32_t redist_v6_del_cnt;
162 	uint32_t v4_route_add_cnt;
163 	uint32_t v4_route_upd8_cnt;
164 	uint32_t v4_route_del_cnt;
165 	uint32_t v6_route_add_cnt;
166 	uint32_t v6_route_del_cnt;
167 	uint32_t v6_route_upd8_cnt;
168 	uint32_t connected_rt_add_cnt;
169 	uint32_t connected_rt_del_cnt;
170 	uint32_t ifup_cnt;
171 	uint32_t ifdown_cnt;
172 	uint32_t ifadd_cnt;
173 	uint32_t ifdel_cnt;
174 	uint32_t if_bfd_cnt;
175 	uint32_t bfd_peer_add_cnt;
176 	uint32_t bfd_peer_upd8_cnt;
177 	uint32_t bfd_peer_del_cnt;
178 	uint32_t bfd_peer_replay_cnt;
179 	uint32_t vrfadd_cnt;
180 	uint32_t vrfdel_cnt;
181 	uint32_t if_vrfchg_cnt;
182 	uint32_t bfd_client_reg_cnt;
183 	uint32_t vniadd_cnt;
184 	uint32_t vnidel_cnt;
185 	uint32_t l3vniadd_cnt;
186 	uint32_t l3vnidel_cnt;
187 	uint32_t macipadd_cnt;
188 	uint32_t macipdel_cnt;
189 	uint32_t prefixadd_cnt;
190 	uint32_t prefixdel_cnt;
191 	uint32_t v4_nh_watch_add_cnt;
192 	uint32_t v4_nh_watch_rem_cnt;
193 	uint32_t v6_nh_watch_add_cnt;
194 	uint32_t v6_nh_watch_rem_cnt;
195 	uint32_t vxlan_sg_add_cnt;
196 	uint32_t vxlan_sg_del_cnt;
197 	uint32_t local_es_add_cnt;
198 	uint32_t local_es_del_cnt;
199 	uint32_t local_es_evi_add_cnt;
200 	uint32_t local_es_evi_del_cnt;
201 	uint32_t error_cnt;
202 
203 	time_t nh_reg_time;
204 	time_t nh_dereg_time;
205 	time_t nh_last_upd_time;
206 
207 	/*
208 	 * Session information.
209 	 *
210 	 * These are not synchronous with respect to each other. For instance,
211 	 * last_read_cmd may contain a value that has been read in the future
212 	 * relative to last_read_time.
213 	 */
214 
215 	/* monotime of client creation */
216 	_Atomic uint32_t connect_time;
217 	/* monotime of last message received */
218 	_Atomic uint32_t last_read_time;
219 	/* monotime of last message sent */
220 	_Atomic uint32_t last_write_time;
221 	/* command code of last message read */
222 	_Atomic uint32_t last_read_cmd;
223 	/* command code of last message written */
224 	_Atomic uint32_t last_write_cmd;
225 
226 	/*
227 	 * Number of instances configured with
228 	 * graceful restart
229 	 */
230 	uint32_t gr_instance_count;
231 	time_t restart_time;
232 
233 	/*
234 	 * Graceful restart information for
235 	 * each instance
236 	 */
237 	TAILQ_HEAD(info_list, client_gr_info) gr_info_queue;
238 };
239 
240 #define ZAPI_HANDLER_ARGS                                                      \
241 	struct zserv *client, struct zmsghdr *hdr, struct stream *msg,         \
242 		struct zebra_vrf *zvrf
243 
244 /* Hooks for client connect / disconnect */
245 DECLARE_HOOK(zserv_client_connect, (struct zserv *client), (client));
246 DECLARE_KOOH(zserv_client_close, (struct zserv *client), (client));
247 
248 #define DYNAMIC_CLIENT_GR_DISABLED(_client)                                    \
249 	((_client->proto <= ZEBRA_ROUTE_CONNECT)                               \
250 	 || !(_client->gr_instance_count))
251 
252 /*
253  * Initialize Zebra API server.
254  *
255  * Installs CLI commands and creates the client list.
256  */
257 extern void zserv_init(void);
258 
259 /*
260  * Stop the Zebra API server.
261  *
262  * closes the socket
263  */
264 extern void zserv_close(void);
265 
266 /*
267  * Start Zebra API server.
268  *
269  * Allocates resources, creates the server socket and begins listening on the
270  * socket.
271  *
272  * path
273  *    where to place the Unix domain socket
274  */
275 extern void zserv_start(char *path);
276 
277 /*
278  * Send a message to a connected Zebra API client.
279  *
280  * client
281  *    the client to send to
282  *
283  * msg
284  *    the message to send
285  */
286 extern int zserv_send_message(struct zserv *client, struct stream *msg);
287 
288 /*
289  * Send a batch of messages to a connected Zebra API client.
290  *
291  * client
292  *    the client to send to
293  *
294  * fifo
295  *    the list of messages to send
296  */
297 extern int zserv_send_batch(struct zserv *client, struct stream_fifo *fifo);
298 
299 /*
300  * Retrieve a client by its protocol and instance number.
301  *
302  * proto
303  *    protocol number
304  *
305  * instance
306  *    instance number
307  *
308  * Returns:
309  *    The Zebra API client.
310  */
311 extern struct zserv *zserv_find_client(uint8_t proto, unsigned short instance);
312 
313 /*
314  * Retrieve a client by its protocol, instance number, and session id.
315  *
316  * proto
317  *    protocol number
318  *
319  * instance
320  *    instance number
321  *
322  * session_id
323  *    session id
324  *
325  * Returns:
326  *    The Zebra API client.
327  */
328 struct zserv *zserv_find_client_session(uint8_t proto, unsigned short instance,
329 					uint32_t session_id);
330 
331 /*
332  * Retrieve a client object by the complete tuple of
333  * {protocol, instance, session}. This version supports use
334  * from a different pthread: the object will be returned marked
335  * in-use. The caller *must* release the client object with the
336  * release_client() api, to ensure that the in-use marker is cleared properly.
337  *
338  * Returns:
339  *    The Zebra API client.
340  */
341 extern struct zserv *zserv_acquire_client(uint8_t proto,
342 					  unsigned short instance,
343 					  uint32_t session_id);
344 
345 /*
346  * Release a client object that was acquired with the acquire_client() api.
347  * After this has been called, the pointer must not be used - it may be freed
348  * in another pthread if the client has closed.
349  */
350 extern void zserv_release_client(struct zserv *client);
351 
352 /*
353  * Close a client.
354  *
355  * Kills a client's thread, removes the client from the client list and cleans
356  * up its resources.
357  *
358  * client
359  *    the client to close
360  */
361 extern void zserv_close_client(struct zserv *client);
362 
363 /*
364  * Log a ZAPI message hexdump.
365  *
366  * errmsg
367  *    Error message to include with packet hexdump
368  *
369  * msg
370  *    Message to log
371  *
372  * hdr
373  *    Message header
374  */
375 void zserv_log_message(const char *errmsg, struct stream *msg,
376 		       struct zmsghdr *hdr);
377 
378 /* TODO */
379 __attribute__((__noreturn__)) int zebra_finalize(struct thread *event);
380 
381 /*
382  * Graceful restart functions.
383  */
384 extern int zebra_gr_client_disconnect(struct zserv *client);
385 extern void zebra_gr_client_reconnect(struct zserv *client);
386 extern void zebra_gr_stale_client_cleanup(struct list *client_list);
387 extern void zread_client_capabilities(struct zserv *client, struct zmsghdr *hdr,
388 				      struct stream *msg,
389 				      struct zebra_vrf *zvrf);
390 
391 #ifdef __cplusplus
392 }
393 #endif
394 
395 #endif /* _ZEBRA_ZEBRA_H */
396