1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
|
/*
* Zebra API server.
* Portions:
* Copyright (C) 1997-1999 Kunihiro Ishiguro
* Copyright (C) 2015-2018 Cumulus Networks, Inc.
* et al.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; see the file COPYING; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef _ZEBRA_ZSERV_H
#define _ZEBRA_ZSERV_H
/* clang-format off */
#include <stdint.h> /* for uint32_t, uint8_t */
#include <time.h> /* for time_t */
#include "lib/route_types.h" /* for ZEBRA_ROUTE_MAX */
#include "lib/zebra.h" /* for AFI_MAX */
#include "lib/vrf.h" /* for vrf_bitmap_t */
#include "lib/zclient.h" /* for redist_proto */
#include "lib/stream.h" /* for stream, stream_fifo */
#include "lib/thread.h" /* for thread, thread_master */
#include "lib/linklist.h" /* for list */
#include "lib/workqueue.h" /* for work_queue */
#include "lib/hook.h" /* for DECLARE_HOOK, DECLARE_KOOH */
#include "zebra/zebra_vrf.h" /* for zebra_vrf */
/* clang-format on */
/* Default port information. */
#define ZEBRA_VTY_PORT 2601
/* Default configuration filename. */
#define DEFAULT_CONFIG_FILE "zebra.conf"
#define ZEBRA_RMAP_DEFAULT_UPDATE_TIMER 5 /* disabled by default */
/* Client structure. */
struct zserv {
/* Client pthread */
struct frr_pthread *pthread;
/* Whether the thread is waiting to be killed */
_Atomic bool dead;
/* Client file descriptor. */
int sock;
/* Input/output buffer to the client. */
pthread_mutex_t ibuf_mtx;
struct stream_fifo *ibuf_fifo;
pthread_mutex_t obuf_mtx;
struct stream_fifo *obuf_fifo;
/* Private I/O buffers */
struct stream *ibuf_work;
struct stream *obuf_work;
/* Buffer of data waiting to be written to client. */
struct buffer *wb;
/* Threads for read/write. */
struct thread *t_read;
struct thread *t_write;
/* default routing table this client munges */
int rtm_table;
/* This client's redistribute flag. */
struct redist_proto mi_redist[AFI_MAX][ZEBRA_ROUTE_MAX];
vrf_bitmap_t redist[AFI_MAX][ZEBRA_ROUTE_MAX];
/* Redistribute default route flag. */
vrf_bitmap_t redist_default;
/* Interface information. */
vrf_bitmap_t ifinfo;
/* Router-id information. */
vrf_bitmap_t ridinfo;
bool notify_owner;
/* client's protocol */
uint8_t proto;
uint16_t instance;
uint8_t is_synchronous;
/* Statistics */
uint32_t redist_v4_add_cnt;
uint32_t redist_v4_del_cnt;
uint32_t redist_v6_add_cnt;
uint32_t redist_v6_del_cnt;
uint32_t v4_route_add_cnt;
uint32_t v4_route_upd8_cnt;
uint32_t v4_route_del_cnt;
uint32_t v6_route_add_cnt;
uint32_t v6_route_del_cnt;
uint32_t v6_route_upd8_cnt;
uint32_t connected_rt_add_cnt;
uint32_t connected_rt_del_cnt;
uint32_t ifup_cnt;
uint32_t ifdown_cnt;
uint32_t ifadd_cnt;
uint32_t ifdel_cnt;
uint32_t if_bfd_cnt;
uint32_t bfd_peer_add_cnt;
uint32_t bfd_peer_upd8_cnt;
uint32_t bfd_peer_del_cnt;
uint32_t bfd_peer_replay_cnt;
uint32_t vrfadd_cnt;
uint32_t vrfdel_cnt;
uint32_t if_vrfchg_cnt;
uint32_t bfd_client_reg_cnt;
uint32_t vniadd_cnt;
uint32_t vnidel_cnt;
uint32_t l3vniadd_cnt;
uint32_t l3vnidel_cnt;
uint32_t macipadd_cnt;
uint32_t macipdel_cnt;
uint32_t prefixadd_cnt;
uint32_t prefixdel_cnt;
time_t nh_reg_time;
time_t nh_dereg_time;
time_t nh_last_upd_time;
/*
* Session information.
*
* These are not synchronous with respect to each other. For instance,
* last_read_cmd may contain a value that has been read in the future
* relative to last_read_time.
*/
/* monotime of client creation */
_Atomic uint32_t connect_time;
/* monotime of last message received */
_Atomic uint32_t last_read_time;
/* monotime of last message sent */
_Atomic uint32_t last_write_time;
/* command code of last message read */
_Atomic uint16_t last_read_cmd;
/* command code of last message written */
_Atomic uint16_t last_write_cmd;
};
#define ZAPI_HANDLER_ARGS \
struct zserv *client, struct zmsghdr *hdr, struct stream *msg, \
struct zebra_vrf *zvrf
/* Hooks for client connect / disconnect */
DECLARE_HOOK(zserv_client_connect, (struct zserv *client), (client));
DECLARE_KOOH(zserv_client_close, (struct zserv *client), (client));
/* Zebra instance */
struct zebra_t {
/* Thread master */
struct thread_master *master;
struct list *client_list;
/* Socket */
int sock;
/* default table */
uint32_t rtm_table_default;
/* rib work queue */
#define ZEBRA_RIB_PROCESS_HOLD_TIME 10
struct work_queue *ribq;
struct meta_queue *mq;
/* LSP work queue */
struct work_queue *lsp_process_q;
#define ZEBRA_ZAPI_PACKETS_TO_PROCESS 1000
_Atomic uint32_t packets_to_process;
};
extern struct zebra_t zebrad;
extern unsigned int multipath_num;
/*
* Initialize Zebra API server.
*
* Installs CLI commands and creates the client list.
*/
extern void zserv_init(void);
/*
* Start Zebra API server.
*
* Allocates resources, creates the server socket and begins listening on the
* socket.
*
* path
* where to place the Unix domain socket
*/
extern void zserv_start(char *path);
/*
* Send a message to a connected Zebra API client.
*
* client
* the client to send to
*
* msg
* the message to send
*/
extern int zserv_send_message(struct zserv *client, struct stream *msg);
/*
* Retrieve a client by its protocol and instance number.
*
* proto
* protocol number
*
* instance
* instance number
*
* Returns:
* The Zebra API client.
*/
extern struct zserv *zserv_find_client(uint8_t proto, unsigned short instance);
#if defined(HANDLE_ZAPI_FUZZING)
extern void zserv_read_file(char *input);
#endif
#endif /* _ZEBRA_ZEBRA_H */
|