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