]> git.proxmox.com Git - mirror_frr.git/blame - isisd/isis_nb_notifications.c
zebra: Fix label manager memory leak (#5680)
[mirror_frr.git] / isisd / isis_nb_notifications.c
CommitLineData
2a1c520e
RW
1/*
2 * Copyright (C) 2018 Volta Networks
3 * Emanuele Di Pascale
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the Free
7 * Software Foundation; either version 2 of the License, or (at your option)
8 * any later version.
9 *
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13 * more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; see the file COPYING; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18 */
19
20#include <zebra.h>
21
22#include "northbound.h"
23#include "log.h"
24
25#include "isisd/isisd.h"
26#include "isisd/isis_nb.h"
27#include "isisd/isis_adjacency.h"
28#include "isisd/isis_dynhn.h"
29#include "isisd/isis_misc.h"
30
31/*
32 * Helper functions.
33 */
34static void notif_prep_instance_hdr(const char *xpath,
35 const struct isis_area *area,
36 const char *routing_instance,
37 struct list *args)
38{
39 char xpath_arg[XPATH_MAXLEN];
40 struct yang_data *data;
41
42 snprintf(xpath_arg, sizeof(xpath_arg), "%s/routing-instance", xpath);
43 data = yang_data_new_string(xpath_arg, routing_instance);
44 listnode_add(args, data);
45 snprintf(xpath_arg, sizeof(xpath_arg), "%s/routing-protocol-name",
46 xpath);
47 data = yang_data_new_string(xpath_arg, area->area_tag);
48 listnode_add(args, data);
49 snprintf(xpath_arg, sizeof(xpath_arg), "%s/isis-level", xpath);
50 data = yang_data_new_enum(xpath_arg, area->is_type);
51 listnode_add(args, data);
52}
53
54static void notif_prepr_iface_hdr(const char *xpath,
55 const struct isis_circuit *circuit,
56 struct list *args)
57{
58 char xpath_arg[XPATH_MAXLEN];
59 struct yang_data *data;
60
61 snprintf(xpath_arg, sizeof(xpath_arg), "%s/interface-name", xpath);
62 data = yang_data_new_string(xpath_arg, circuit->interface->name);
63 listnode_add(args, data);
64 snprintf(xpath_arg, sizeof(xpath_arg), "%s/interface-level", xpath);
65 data = yang_data_new_enum(xpath_arg, circuit->is_type);
66 listnode_add(args, data);
67 snprintf(xpath_arg, sizeof(xpath_arg), "%s/extended-circuit-id", xpath);
68 /* we do not seem to have the extended version of the circuit_id */
69 data = yang_data_new_uint32(xpath_arg, (uint32_t)circuit->circuit_id);
70 listnode_add(args, data);
71}
72
73/*
74 * XPath: /frr-isisd:database-overload
75 */
76void isis_notif_db_overload(const struct isis_area *area, bool overload)
77{
78 const char *xpath = "/frr-isisd:database-overload";
79 struct list *arguments = yang_data_list_new();
80 char xpath_arg[XPATH_MAXLEN];
81 struct yang_data *data;
82
83 notif_prep_instance_hdr(xpath, area, "default", arguments);
84 snprintf(xpath_arg, sizeof(xpath_arg), "%s/overload", xpath);
85 data = yang_data_new_enum(xpath_arg, !!overload);
86 listnode_add(arguments, data);
87
88 nb_notification_send(xpath, arguments);
89}
90
91/*
92 * XPath: /frr-isisd:lsp-too-large
93 */
94void isis_notif_lsp_too_large(const struct isis_circuit *circuit,
95 uint32_t pdu_size, const char *lsp_id)
96{
97 const char *xpath = "/frr-isisd:lsp-too-large";
98 struct list *arguments = yang_data_list_new();
99 char xpath_arg[XPATH_MAXLEN];
100 struct yang_data *data;
101 struct isis_area *area = circuit->area;
102
103 notif_prep_instance_hdr(xpath, area, "default", arguments);
104 notif_prepr_iface_hdr(xpath, circuit, arguments);
105 snprintf(xpath_arg, sizeof(xpath_arg), "%s/pdu-size", xpath);
106 data = yang_data_new_uint32(xpath_arg, pdu_size);
107 listnode_add(arguments, data);
108 snprintf(xpath_arg, sizeof(xpath_arg), "%s/lsp-id", xpath);
109 data = yang_data_new_string(xpath_arg, lsp_id);
110 listnode_add(arguments, data);
111
112 nb_notification_send(xpath, arguments);
113}
114
115/*
116 * XPath: /frr-isisd:if-state-change
117 */
118void isis_notif_if_state_change(const struct isis_circuit *circuit, bool down)
119{
120 const char *xpath = "/frr-isisd:if-state-change";
121 struct list *arguments = yang_data_list_new();
122 char xpath_arg[XPATH_MAXLEN];
123 struct yang_data *data;
124 struct isis_area *area = circuit->area;
125
126 notif_prep_instance_hdr(xpath, area, "default", arguments);
127 notif_prepr_iface_hdr(xpath, circuit, arguments);
128 snprintf(xpath_arg, sizeof(xpath_arg), "%s/state", xpath);
129 data = yang_data_new_enum(xpath_arg, !!down);
130 listnode_add(arguments, data);
131
132 nb_notification_send(xpath, arguments);
133}
134
135/*
136 * XPath: /frr-isisd:corrupted-lsp-detected
137 */
138void isis_notif_corrupted_lsp(const struct isis_area *area, const char *lsp_id)
139{
140 const char *xpath = "/frr-isisd:corrupted-lsp-detected";
141 struct list *arguments = yang_data_list_new();
142 char xpath_arg[XPATH_MAXLEN];
143 struct yang_data *data;
144
145 notif_prep_instance_hdr(xpath, area, "default", arguments);
146 snprintf(xpath_arg, sizeof(xpath_arg), "%s/lsp-id", xpath);
147 data = yang_data_new_string(xpath_arg, lsp_id);
148 listnode_add(arguments, data);
149
150 nb_notification_send(xpath, arguments);
151}
152
153/*
154 * XPath: /frr-isisd:attempt-to-exceed-max-sequence
155 */
156void isis_notif_lsp_exceed_max(const struct isis_area *area, const char *lsp_id)
157{
158 const char *xpath = "/frr-isisd:attempt-to-exceed-max-sequence";
159 struct list *arguments = yang_data_list_new();
160 char xpath_arg[XPATH_MAXLEN];
161 struct yang_data *data;
162
163 notif_prep_instance_hdr(xpath, area, "default", arguments);
164 snprintf(xpath_arg, sizeof(xpath_arg), "%s/lsp-id", xpath);
165 data = yang_data_new_string(xpath_arg, lsp_id);
166 listnode_add(arguments, data);
167
168 nb_notification_send(xpath, arguments);
169}
170
171/*
172 * XPath: /frr-isisd:max-area-addresses-mismatch
173 */
174void isis_notif_max_area_addr_mismatch(const struct isis_circuit *circuit,
175 uint8_t max_area_addrs,
176 const char *raw_pdu)
177{
178 const char *xpath = "/frr-isisd:max-area-addresses-mismatch";
179 struct list *arguments = yang_data_list_new();
180 char xpath_arg[XPATH_MAXLEN];
181 struct yang_data *data;
182 struct isis_area *area = circuit->area;
183
184 notif_prep_instance_hdr(xpath, area, "default", arguments);
185 notif_prepr_iface_hdr(xpath, circuit, arguments);
186 snprintf(xpath_arg, sizeof(xpath_arg), "%s/max-area-addresses", xpath);
187 data = yang_data_new_uint8(xpath_arg, max_area_addrs);
188 listnode_add(arguments, data);
189 snprintf(xpath_arg, sizeof(xpath_arg), "%s/raw-pdu", xpath);
190 data = yang_data_new(xpath_arg, raw_pdu);
191 listnode_add(arguments, data);
192
193 nb_notification_send(xpath, arguments);
194}
195
196/*
197 * XPath: /frr-isisd:authentication-type-failure
198 */
199void isis_notif_authentication_type_failure(const struct isis_circuit *circuit,
200 const char *raw_pdu)
201{
202 const char *xpath = "/frr-isisd:authentication-type-failure";
203 struct list *arguments = yang_data_list_new();
204 char xpath_arg[XPATH_MAXLEN];
205 struct yang_data *data;
206 struct isis_area *area = circuit->area;
207
208 notif_prep_instance_hdr(xpath, area, "default", arguments);
209 notif_prepr_iface_hdr(xpath, circuit, arguments);
210 snprintf(xpath_arg, sizeof(xpath_arg), "%s/raw-pdu", xpath);
211 data = yang_data_new(xpath_arg, raw_pdu);
212 listnode_add(arguments, data);
213
214 nb_notification_send(xpath, arguments);
215}
216
217/*
218 * XPath: /frr-isisd:authentication-failure
219 */
220void isis_notif_authentication_failure(const struct isis_circuit *circuit,
221 const char *raw_pdu)
222{
223 const char *xpath = "/frr-isisd:authentication-failure";
224 struct list *arguments = yang_data_list_new();
225 char xpath_arg[XPATH_MAXLEN];
226 struct yang_data *data;
227 struct isis_area *area = circuit->area;
228
229 notif_prep_instance_hdr(xpath, area, "default", arguments);
230 notif_prepr_iface_hdr(xpath, circuit, arguments);
231 snprintf(xpath_arg, sizeof(xpath_arg), "%s/raw-pdu", xpath);
232 data = yang_data_new(xpath_arg, raw_pdu);
233 listnode_add(arguments, data);
234
235 nb_notification_send(xpath, arguments);
236}
237
238/*
239 * XPath: /frr-isisd:adjacency-state-change
240 */
241void isis_notif_adj_state_change(const struct isis_adjacency *adj,
242 int new_state, const char *reason)
243{
244 const char *xpath = "/frr-isisd:adjacency-state-change";
245 struct list *arguments = yang_data_list_new();
246 char xpath_arg[XPATH_MAXLEN];
247 struct yang_data *data;
248 struct isis_circuit *circuit = adj->circuit;
249 struct isis_area *area = circuit->area;
250 struct isis_dynhn *dyn = dynhn_find_by_id(adj->sysid);
251
252 notif_prep_instance_hdr(xpath, area, "default", arguments);
253 notif_prepr_iface_hdr(xpath, circuit, arguments);
254 if (dyn) {
255 snprintf(xpath_arg, sizeof(xpath_arg), "%s/neighbor", xpath);
256 data = yang_data_new_string(xpath_arg, dyn->hostname);
257 listnode_add(arguments, data);
258 }
259 snprintf(xpath_arg, sizeof(xpath_arg), "%s/neighbor-system-id", xpath);
260 data = yang_data_new_string(xpath_arg, sysid_print(adj->sysid));
261 listnode_add(arguments, data);
262
263 snprintf(xpath_arg, sizeof(xpath_arg), "%s/state", xpath);
264 data = yang_data_new_string(xpath_arg, isis_adj_yang_state(new_state));
265 listnode_add(arguments, data);
266 if (new_state == ISIS_ADJ_DOWN) {
267 snprintf(xpath_arg, sizeof(xpath_arg), "%s/reason", xpath);
268 data = yang_data_new_string(xpath_arg, reason);
269 listnode_add(arguments, data);
270 }
271
272 nb_notification_send(xpath, arguments);
273}
274
275/*
276 * XPath: /frr-isisd:rejected-adjacency
277 */
278void isis_notif_reject_adjacency(const struct isis_circuit *circuit,
279 const char *reason, const char *raw_pdu)
280{
281 const char *xpath = "/frr-isisd:rejected-adjacency";
282 struct list *arguments = yang_data_list_new();
283 char xpath_arg[XPATH_MAXLEN];
284 struct yang_data *data;
285 struct isis_area *area = circuit->area;
286
287 notif_prep_instance_hdr(xpath, area, "default", arguments);
288 notif_prepr_iface_hdr(xpath, circuit, arguments);
289 snprintf(xpath_arg, sizeof(xpath_arg), "%s/reason", xpath);
290 data = yang_data_new_string(xpath_arg, reason);
291 listnode_add(arguments, data);
292 snprintf(xpath_arg, sizeof(xpath_arg), "%s/raw-pdu", xpath);
293 data = yang_data_new(xpath_arg, raw_pdu);
294 listnode_add(arguments, data);
295
296 nb_notification_send(xpath, arguments);
297}
298
299/*
300 * XPath: /frr-isisd:area-mismatch
301 */
302void isis_notif_area_mismatch(const struct isis_circuit *circuit,
303 const char *raw_pdu)
304{
305 const char *xpath = "/frr-isisd:area-mismatch";
306 struct list *arguments = yang_data_list_new();
307 char xpath_arg[XPATH_MAXLEN];
308 struct yang_data *data;
309 struct isis_area *area = circuit->area;
310
311 notif_prep_instance_hdr(xpath, area, "default", arguments);
312 notif_prepr_iface_hdr(xpath, circuit, arguments);
313 snprintf(xpath_arg, sizeof(xpath_arg), "%s/raw-pdu", xpath);
314 data = yang_data_new(xpath_arg, raw_pdu);
315 listnode_add(arguments, data);
316
317 nb_notification_send(xpath, arguments);
318}
319
320/*
321 * XPath: /frr-isisd:lsp-received
322 */
323void isis_notif_lsp_received(const struct isis_circuit *circuit,
324 const char *lsp_id, uint32_t seqno,
325 uint32_t timestamp, const char *sys_id)
326{
327 const char *xpath = "/frr-isisd:lsp-received";
328 struct list *arguments = yang_data_list_new();
329 char xpath_arg[XPATH_MAXLEN];
330 struct yang_data *data;
331 struct isis_area *area = circuit->area;
332
333 notif_prep_instance_hdr(xpath, area, "default", arguments);
334 notif_prepr_iface_hdr(xpath, circuit, arguments);
335 snprintf(xpath_arg, sizeof(xpath_arg), "%s/lsp-id", xpath);
336 data = yang_data_new_string(xpath_arg, lsp_id);
337 listnode_add(arguments, data);
338 snprintf(xpath_arg, sizeof(xpath_arg), "%s/sequence", xpath);
339 data = yang_data_new_uint32(xpath_arg, seqno);
340 listnode_add(arguments, data);
341 snprintf(xpath_arg, sizeof(xpath_arg), "%s/received-timestamp", xpath);
342 data = yang_data_new_uint32(xpath_arg, timestamp);
343 listnode_add(arguments, data);
344 snprintf(xpath_arg, sizeof(xpath_arg), "%s/neighbor-system-id", xpath);
345 data = yang_data_new_string(xpath_arg, sys_id);
346 listnode_add(arguments, data);
347
348 nb_notification_send(xpath, arguments);
349}
350
351/*
352 * XPath: /frr-isisd:lsp-generation
353 */
354void isis_notif_lsp_gen(const struct isis_area *area, const char *lsp_id,
355 uint32_t seqno, uint32_t timestamp)
356{
357 const char *xpath = "/frr-isisd:lsp-generation";
358 struct list *arguments = yang_data_list_new();
359 char xpath_arg[XPATH_MAXLEN];
360 struct yang_data *data;
361
362 notif_prep_instance_hdr(xpath, area, "default", arguments);
363 snprintf(xpath_arg, sizeof(xpath_arg), "%s/lsp-id", xpath);
364 data = yang_data_new_string(xpath_arg, lsp_id);
365 listnode_add(arguments, data);
366 snprintf(xpath_arg, sizeof(xpath_arg), "%s/sequence", xpath);
367 data = yang_data_new_uint32(xpath_arg, seqno);
368 listnode_add(arguments, data);
369 snprintf(xpath_arg, sizeof(xpath_arg), "%s/send-timestamp", xpath);
370 data = yang_data_new_uint32(xpath_arg, timestamp);
371 listnode_add(arguments, data);
372
373 nb_notification_send(xpath, arguments);
374}
375
376/*
377 * XPath: /frr-isisd:id-len-mismatch
378 */
379void isis_notif_id_len_mismatch(const struct isis_circuit *circuit,
380 uint8_t rcv_id_len, const char *raw_pdu)
381{
382 const char *xpath = "/frr-isisd:id-len-mismatch";
383 struct list *arguments = yang_data_list_new();
384 char xpath_arg[XPATH_MAXLEN];
385 struct yang_data *data;
386 struct isis_area *area = circuit->area;
387
388 notif_prep_instance_hdr(xpath, area, "default", arguments);
389 notif_prepr_iface_hdr(xpath, circuit, arguments);
390 snprintf(xpath_arg, sizeof(xpath_arg), "%s/pdu-field-len", xpath);
391 data = yang_data_new_uint8(xpath_arg, rcv_id_len);
392 listnode_add(arguments, data);
393 snprintf(xpath_arg, sizeof(xpath_arg), "%s/raw-pdu", xpath);
394 data = yang_data_new(xpath_arg, raw_pdu);
395 listnode_add(arguments, data);
396
397 nb_notification_send(xpath, arguments);
398}
399
400/*
401 * XPath: /frr-isisd:version-skew
402 */
403void isis_notif_version_skew(const struct isis_circuit *circuit,
404 uint8_t version, const char *raw_pdu)
405{
406 const char *xpath = "/frr-isisd:version-skew";
407 struct list *arguments = yang_data_list_new();
408 char xpath_arg[XPATH_MAXLEN];
409 struct yang_data *data;
410 struct isis_area *area = circuit->area;
411
412 notif_prep_instance_hdr(xpath, area, "default", arguments);
413 notif_prepr_iface_hdr(xpath, circuit, arguments);
414 snprintf(xpath_arg, sizeof(xpath_arg), "%s/protocol-version", xpath);
415 data = yang_data_new_uint8(xpath_arg, version);
416 listnode_add(arguments, data);
417 snprintf(xpath_arg, sizeof(xpath_arg), "%s/raw-pdu", xpath);
418 data = yang_data_new(xpath_arg, raw_pdu);
419 listnode_add(arguments, data);
420
421 nb_notification_send(xpath, arguments);
422}
423
424/*
425 * XPath: /frr-isisd:lsp-error-detected
426 */
427void isis_notif_lsp_error(const struct isis_circuit *circuit,
428 const char *lsp_id, const char *raw_pdu,
429 __attribute__((unused)) uint32_t offset,
430 __attribute__((unused)) uint8_t tlv_type)
431{
432 const char *xpath = "/frr-isisd:lsp-error-detected";
433 struct list *arguments = yang_data_list_new();
434 char xpath_arg[XPATH_MAXLEN];
435 struct yang_data *data;
436 struct isis_area *area = circuit->area;
437
438 notif_prep_instance_hdr(xpath, area, "default", arguments);
439 notif_prepr_iface_hdr(xpath, circuit, arguments);
440 snprintf(xpath_arg, sizeof(xpath_arg), "%s/lsp-id", xpath);
441 data = yang_data_new_string(xpath_arg, lsp_id);
442 listnode_add(arguments, data);
443 snprintf(xpath_arg, sizeof(xpath_arg), "%s/raw-pdu", xpath);
444 data = yang_data_new(xpath_arg, raw_pdu);
445 listnode_add(arguments, data);
446 /* ignore offset and tlv_type which cannot be set properly */
447
448 nb_notification_send(xpath, arguments);
449}
450
451/*
452 * XPath: /frr-isisd:sequence-number-skipped
453 */
454void isis_notif_seqno_skipped(const struct isis_circuit *circuit,
455 const char *lsp_id)
456{
457 const char *xpath = "/frr-isisd:sequence-number-skipped";
458 struct list *arguments = yang_data_list_new();
459 char xpath_arg[XPATH_MAXLEN];
460 struct yang_data *data;
461 struct isis_area *area = circuit->area;
462
463 notif_prep_instance_hdr(xpath, area, "default", arguments);
464 notif_prepr_iface_hdr(xpath, circuit, arguments);
465 snprintf(xpath_arg, sizeof(xpath_arg), "%s/lsp-id", xpath);
466 data = yang_data_new_string(xpath_arg, lsp_id);
467 listnode_add(arguments, data);
468
469 nb_notification_send(xpath, arguments);
470}
471
472/*
473 * XPath: /frr-isisd:own-lsp-purge
474 */
475void isis_notif_own_lsp_purge(const struct isis_circuit *circuit,
476 const char *lsp_id)
477{
478 const char *xpath = "/frr-isisd:own-lsp-purge";
479 struct list *arguments = yang_data_list_new();
480 char xpath_arg[XPATH_MAXLEN];
481 struct yang_data *data;
482 struct isis_area *area = circuit->area;
483
484 notif_prep_instance_hdr(xpath, area, "default", arguments);
485 notif_prepr_iface_hdr(xpath, circuit, arguments);
486 snprintf(xpath_arg, sizeof(xpath_arg), "%s/lsp-id", xpath);
487 data = yang_data_new_string(xpath_arg, lsp_id);
488 listnode_add(arguments, data);
489
490 nb_notification_send(xpath, arguments);
491}