]> git.proxmox.com Git - mirror_frr.git/blame - isisd/isis_nb_notifications.c
Merge pull request #10447 from ton31337/fix/json_with_whitespaces
[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
1ee746d9 31DEFINE_HOOK(isis_hook_lsp_too_large,
32 (const struct isis_circuit *circuit, uint32_t pdu_size,
33 const uint8_t *lsp_id),
34 (circuit, pdu_size, lsp_id));
35DEFINE_HOOK(isis_hook_corrupted_lsp, (const struct isis_area *area), (area));
36DEFINE_HOOK(isis_hook_lsp_exceed_max,
37 (const struct isis_area *area, const uint8_t *lsp_id),
38 (area, lsp_id));
39DEFINE_HOOK(isis_hook_max_area_addr_mismatch,
40 (const struct isis_circuit *circuit, uint8_t max_addrs,
41 const char *raw_pdu, size_t raw_pdu_len),
42 (circuit, max_addrs, raw_pdu, raw_pdu_len));
43DEFINE_HOOK(isis_hook_authentication_type_failure,
44 (const struct isis_circuit *circuit, const char *raw_pdu,
45 size_t raw_pdu_len),
46 (circuit, raw_pdu, raw_pdu_len));
47DEFINE_HOOK(isis_hook_authentication_failure,
48 (const struct isis_circuit *circuit, const char *raw_pdu,
49 size_t raw_pdu_len),
50 (circuit, raw_pdu, raw_pdu_len));
51DEFINE_HOOK(isis_hook_adj_state_change, (const struct isis_adjacency *adj),
52 (adj));
53DEFINE_HOOK(isis_hook_reject_adjacency,
54 (const struct isis_circuit *circuit, const char *raw_pdu,
55 size_t raw_pdu_len),
56 (circuit, raw_pdu, raw_pdu_len));
57DEFINE_HOOK(isis_hook_area_mismatch,
58 (const struct isis_circuit *circuit, const char *raw_pdu,
59 size_t raw_pdu_len),
60 (circuit, raw_pdu, raw_pdu_len));
61DEFINE_HOOK(isis_hook_id_len_mismatch,
62 (const struct isis_circuit *circuit, uint8_t rcv_id_len,
63 const char *raw_pdu, size_t raw_pdu_len),
64 (circuit, rcv_id_len, raw_pdu, raw_pdu_len));
65DEFINE_HOOK(isis_hook_version_skew,
66 (const struct isis_circuit *circuit, uint8_t version,
67 const char *raw_pdu, size_t raw_pdu_len),
68 (circuit, version, raw_pdu, raw_pdu_len));
69DEFINE_HOOK(isis_hook_lsp_error,
70 (const struct isis_circuit *circuit, const uint8_t *lsp_id,
71 const char *raw_pdu, size_t raw_pdu_len),
72 (circuit, lsp_id, raw_pdu, raw_pdu_len));
73DEFINE_HOOK(isis_hook_seqno_skipped,
74 (const struct isis_circuit *circuit, const uint8_t *lsp_id),
75 (circuit, lsp_id));
76DEFINE_HOOK(isis_hook_own_lsp_purge,
77 (const struct isis_circuit *circuit, const uint8_t *lsp_id),
78 (circuit, lsp_id));
79
80
2a1c520e
RW
81/*
82 * Helper functions.
83 */
84static void notif_prep_instance_hdr(const char *xpath,
85 const struct isis_area *area,
86 const char *routing_instance,
87 struct list *args)
88{
89 char xpath_arg[XPATH_MAXLEN];
90 struct yang_data *data;
91
92 snprintf(xpath_arg, sizeof(xpath_arg), "%s/routing-instance", xpath);
93 data = yang_data_new_string(xpath_arg, routing_instance);
94 listnode_add(args, data);
95 snprintf(xpath_arg, sizeof(xpath_arg), "%s/routing-protocol-name",
96 xpath);
97 data = yang_data_new_string(xpath_arg, area->area_tag);
98 listnode_add(args, data);
99 snprintf(xpath_arg, sizeof(xpath_arg), "%s/isis-level", xpath);
100 data = yang_data_new_enum(xpath_arg, area->is_type);
101 listnode_add(args, data);
102}
103
104static void notif_prepr_iface_hdr(const char *xpath,
105 const struct isis_circuit *circuit,
106 struct list *args)
107{
108 char xpath_arg[XPATH_MAXLEN];
109 struct yang_data *data;
110
111 snprintf(xpath_arg, sizeof(xpath_arg), "%s/interface-name", xpath);
112 data = yang_data_new_string(xpath_arg, circuit->interface->name);
113 listnode_add(args, data);
114 snprintf(xpath_arg, sizeof(xpath_arg), "%s/interface-level", xpath);
115 data = yang_data_new_enum(xpath_arg, circuit->is_type);
116 listnode_add(args, data);
117 snprintf(xpath_arg, sizeof(xpath_arg), "%s/extended-circuit-id", xpath);
118 /* we do not seem to have the extended version of the circuit_id */
119 data = yang_data_new_uint32(xpath_arg, (uint32_t)circuit->circuit_id);
120 listnode_add(args, data);
121}
122
123/*
124 * XPath: /frr-isisd:database-overload
125 */
126void isis_notif_db_overload(const struct isis_area *area, bool overload)
127{
128 const char *xpath = "/frr-isisd:database-overload";
129 struct list *arguments = yang_data_list_new();
130 char xpath_arg[XPATH_MAXLEN];
131 struct yang_data *data;
132
133 notif_prep_instance_hdr(xpath, area, "default", arguments);
134 snprintf(xpath_arg, sizeof(xpath_arg), "%s/overload", xpath);
135 data = yang_data_new_enum(xpath_arg, !!overload);
136 listnode_add(arguments, data);
137
138 nb_notification_send(xpath, arguments);
139}
140
141/*
142 * XPath: /frr-isisd:lsp-too-large
143 */
144void isis_notif_lsp_too_large(const struct isis_circuit *circuit,
1ee746d9 145 uint32_t pdu_size, const uint8_t *lsp_id)
2a1c520e
RW
146{
147 const char *xpath = "/frr-isisd:lsp-too-large";
148 struct list *arguments = yang_data_list_new();
149 char xpath_arg[XPATH_MAXLEN];
150 struct yang_data *data;
151 struct isis_area *area = circuit->area;
152
153 notif_prep_instance_hdr(xpath, area, "default", arguments);
154 notif_prepr_iface_hdr(xpath, circuit, arguments);
155 snprintf(xpath_arg, sizeof(xpath_arg), "%s/pdu-size", xpath);
156 data = yang_data_new_uint32(xpath_arg, pdu_size);
157 listnode_add(arguments, data);
158 snprintf(xpath_arg, sizeof(xpath_arg), "%s/lsp-id", xpath);
1ee746d9 159 data = yang_data_new_string(xpath_arg, rawlspid_print(lsp_id));
2a1c520e
RW
160 listnode_add(arguments, data);
161
1ee746d9 162 hook_call(isis_hook_lsp_too_large, circuit, pdu_size, lsp_id);
163
2a1c520e
RW
164 nb_notification_send(xpath, arguments);
165}
166
167/*
168 * XPath: /frr-isisd:if-state-change
169 */
170void isis_notif_if_state_change(const struct isis_circuit *circuit, bool down)
171{
172 const char *xpath = "/frr-isisd:if-state-change";
173 struct list *arguments = yang_data_list_new();
174 char xpath_arg[XPATH_MAXLEN];
175 struct yang_data *data;
176 struct isis_area *area = circuit->area;
177
178 notif_prep_instance_hdr(xpath, area, "default", arguments);
179 notif_prepr_iface_hdr(xpath, circuit, arguments);
180 snprintf(xpath_arg, sizeof(xpath_arg), "%s/state", xpath);
181 data = yang_data_new_enum(xpath_arg, !!down);
182 listnode_add(arguments, data);
183
184 nb_notification_send(xpath, arguments);
185}
186
187/*
188 * XPath: /frr-isisd:corrupted-lsp-detected
189 */
1ee746d9 190void isis_notif_corrupted_lsp(const struct isis_area *area,
191 const uint8_t *lsp_id)
2a1c520e
RW
192{
193 const char *xpath = "/frr-isisd:corrupted-lsp-detected";
194 struct list *arguments = yang_data_list_new();
195 char xpath_arg[XPATH_MAXLEN];
196 struct yang_data *data;
197
198 notif_prep_instance_hdr(xpath, area, "default", arguments);
199 snprintf(xpath_arg, sizeof(xpath_arg), "%s/lsp-id", xpath);
1ee746d9 200 data = yang_data_new_string(xpath_arg, rawlspid_print(lsp_id));
2a1c520e
RW
201 listnode_add(arguments, data);
202
1ee746d9 203 hook_call(isis_hook_corrupted_lsp, area);
204
2a1c520e
RW
205 nb_notification_send(xpath, arguments);
206}
207
208/*
209 * XPath: /frr-isisd:attempt-to-exceed-max-sequence
210 */
1ee746d9 211void isis_notif_lsp_exceed_max(const struct isis_area *area,
212 const uint8_t *lsp_id)
2a1c520e
RW
213{
214 const char *xpath = "/frr-isisd:attempt-to-exceed-max-sequence";
215 struct list *arguments = yang_data_list_new();
216 char xpath_arg[XPATH_MAXLEN];
217 struct yang_data *data;
218
219 notif_prep_instance_hdr(xpath, area, "default", arguments);
220 snprintf(xpath_arg, sizeof(xpath_arg), "%s/lsp-id", xpath);
1ee746d9 221 data = yang_data_new_string(xpath_arg, rawlspid_print(lsp_id));
2a1c520e
RW
222 listnode_add(arguments, data);
223
1ee746d9 224 hook_call(isis_hook_lsp_exceed_max, area, lsp_id);
225
2a1c520e
RW
226 nb_notification_send(xpath, arguments);
227}
228
229/*
230 * XPath: /frr-isisd:max-area-addresses-mismatch
231 */
232void isis_notif_max_area_addr_mismatch(const struct isis_circuit *circuit,
233 uint8_t max_area_addrs,
1ee746d9 234 const char *raw_pdu, size_t raw_pdu_len)
2a1c520e
RW
235{
236 const char *xpath = "/frr-isisd:max-area-addresses-mismatch";
237 struct list *arguments = yang_data_list_new();
238 char xpath_arg[XPATH_MAXLEN];
239 struct yang_data *data;
240 struct isis_area *area = circuit->area;
241
242 notif_prep_instance_hdr(xpath, area, "default", arguments);
243 notif_prepr_iface_hdr(xpath, circuit, arguments);
244 snprintf(xpath_arg, sizeof(xpath_arg), "%s/max-area-addresses", xpath);
245 data = yang_data_new_uint8(xpath_arg, max_area_addrs);
246 listnode_add(arguments, data);
247 snprintf(xpath_arg, sizeof(xpath_arg), "%s/raw-pdu", xpath);
ac313345 248 data = yang_data_new_binary(xpath_arg, raw_pdu, raw_pdu_len);
2a1c520e
RW
249 listnode_add(arguments, data);
250
1ee746d9 251 hook_call(isis_hook_max_area_addr_mismatch, circuit, max_area_addrs,
252 raw_pdu, raw_pdu_len);
253
2a1c520e
RW
254 nb_notification_send(xpath, arguments);
255}
256
257/*
258 * XPath: /frr-isisd:authentication-type-failure
259 */
260void isis_notif_authentication_type_failure(const struct isis_circuit *circuit,
1ee746d9 261 const char *raw_pdu,
262 size_t raw_pdu_len)
2a1c520e
RW
263{
264 const char *xpath = "/frr-isisd:authentication-type-failure";
265 struct list *arguments = yang_data_list_new();
266 char xpath_arg[XPATH_MAXLEN];
267 struct yang_data *data;
268 struct isis_area *area = circuit->area;
269
270 notif_prep_instance_hdr(xpath, area, "default", arguments);
271 notif_prepr_iface_hdr(xpath, circuit, arguments);
272 snprintf(xpath_arg, sizeof(xpath_arg), "%s/raw-pdu", xpath);
ac313345 273 data = yang_data_new_binary(xpath_arg, raw_pdu, raw_pdu_len);
2a1c520e
RW
274 listnode_add(arguments, data);
275
1ee746d9 276 hook_call(isis_hook_authentication_type_failure, circuit, raw_pdu,
277 raw_pdu_len);
278
2a1c520e
RW
279 nb_notification_send(xpath, arguments);
280}
281
282/*
283 * XPath: /frr-isisd:authentication-failure
284 */
285void isis_notif_authentication_failure(const struct isis_circuit *circuit,
1ee746d9 286 const char *raw_pdu, size_t raw_pdu_len)
2a1c520e
RW
287{
288 const char *xpath = "/frr-isisd:authentication-failure";
289 struct list *arguments = yang_data_list_new();
290 char xpath_arg[XPATH_MAXLEN];
291 struct yang_data *data;
292 struct isis_area *area = circuit->area;
293
294 notif_prep_instance_hdr(xpath, area, "default", arguments);
295 notif_prepr_iface_hdr(xpath, circuit, arguments);
296 snprintf(xpath_arg, sizeof(xpath_arg), "%s/raw-pdu", xpath);
ac313345 297 data = yang_data_new_binary(xpath_arg, raw_pdu, raw_pdu_len);
2a1c520e
RW
298 listnode_add(arguments, data);
299
1ee746d9 300 hook_call(isis_hook_authentication_failure, circuit, raw_pdu,
301 raw_pdu_len);
302
2a1c520e
RW
303 nb_notification_send(xpath, arguments);
304}
305
306/*
307 * XPath: /frr-isisd:adjacency-state-change
308 */
309void isis_notif_adj_state_change(const struct isis_adjacency *adj,
310 int new_state, const char *reason)
311{
312 const char *xpath = "/frr-isisd:adjacency-state-change";
313 struct list *arguments = yang_data_list_new();
314 char xpath_arg[XPATH_MAXLEN];
315 struct yang_data *data;
316 struct isis_circuit *circuit = adj->circuit;
317 struct isis_area *area = circuit->area;
240f48b3 318 struct isis_dynhn *dyn = dynhn_find_by_id(circuit->isis, adj->sysid);
2a1c520e
RW
319
320 notif_prep_instance_hdr(xpath, area, "default", arguments);
321 notif_prepr_iface_hdr(xpath, circuit, arguments);
322 if (dyn) {
323 snprintf(xpath_arg, sizeof(xpath_arg), "%s/neighbor", xpath);
324 data = yang_data_new_string(xpath_arg, dyn->hostname);
325 listnode_add(arguments, data);
326 }
327 snprintf(xpath_arg, sizeof(xpath_arg), "%s/neighbor-system-id", xpath);
328 data = yang_data_new_string(xpath_arg, sysid_print(adj->sysid));
329 listnode_add(arguments, data);
330
331 snprintf(xpath_arg, sizeof(xpath_arg), "%s/state", xpath);
332 data = yang_data_new_string(xpath_arg, isis_adj_yang_state(new_state));
333 listnode_add(arguments, data);
334 if (new_state == ISIS_ADJ_DOWN) {
335 snprintf(xpath_arg, sizeof(xpath_arg), "%s/reason", xpath);
336 data = yang_data_new_string(xpath_arg, reason);
337 listnode_add(arguments, data);
338 }
339
1ee746d9 340 hook_call(isis_hook_adj_state_change, adj);
341
2a1c520e
RW
342 nb_notification_send(xpath, arguments);
343}
344
345/*
346 * XPath: /frr-isisd:rejected-adjacency
347 */
348void isis_notif_reject_adjacency(const struct isis_circuit *circuit,
1ee746d9 349 const char *reason, const char *raw_pdu,
350 size_t raw_pdu_len)
2a1c520e
RW
351{
352 const char *xpath = "/frr-isisd:rejected-adjacency";
353 struct list *arguments = yang_data_list_new();
354 char xpath_arg[XPATH_MAXLEN];
355 struct yang_data *data;
356 struct isis_area *area = circuit->area;
357
358 notif_prep_instance_hdr(xpath, area, "default", arguments);
359 notif_prepr_iface_hdr(xpath, circuit, arguments);
360 snprintf(xpath_arg, sizeof(xpath_arg), "%s/reason", xpath);
361 data = yang_data_new_string(xpath_arg, reason);
362 listnode_add(arguments, data);
363 snprintf(xpath_arg, sizeof(xpath_arg), "%s/raw-pdu", xpath);
ac313345 364 data = yang_data_new_binary(xpath_arg, raw_pdu, raw_pdu_len);
2a1c520e
RW
365 listnode_add(arguments, data);
366
1ee746d9 367 hook_call(isis_hook_reject_adjacency, circuit, raw_pdu, raw_pdu_len);
368
2a1c520e
RW
369 nb_notification_send(xpath, arguments);
370}
371
372/*
373 * XPath: /frr-isisd:area-mismatch
374 */
375void isis_notif_area_mismatch(const struct isis_circuit *circuit,
1ee746d9 376 const char *raw_pdu, size_t raw_pdu_len)
2a1c520e
RW
377{
378 const char *xpath = "/frr-isisd:area-mismatch";
379 struct list *arguments = yang_data_list_new();
380 char xpath_arg[XPATH_MAXLEN];
381 struct yang_data *data;
382 struct isis_area *area = circuit->area;
383
384 notif_prep_instance_hdr(xpath, area, "default", arguments);
385 notif_prepr_iface_hdr(xpath, circuit, arguments);
386 snprintf(xpath_arg, sizeof(xpath_arg), "%s/raw-pdu", xpath);
ac313345 387 data = yang_data_new_binary(xpath_arg, raw_pdu, raw_pdu_len);
2a1c520e
RW
388 listnode_add(arguments, data);
389
1ee746d9 390 hook_call(isis_hook_area_mismatch, circuit, raw_pdu, raw_pdu_len);
391
2a1c520e
RW
392 nb_notification_send(xpath, arguments);
393}
394
395/*
396 * XPath: /frr-isisd:lsp-received
397 */
398void isis_notif_lsp_received(const struct isis_circuit *circuit,
1ee746d9 399 const uint8_t *lsp_id, uint32_t seqno,
2a1c520e
RW
400 uint32_t timestamp, const char *sys_id)
401{
402 const char *xpath = "/frr-isisd:lsp-received";
403 struct list *arguments = yang_data_list_new();
404 char xpath_arg[XPATH_MAXLEN];
405 struct yang_data *data;
406 struct isis_area *area = circuit->area;
407
408 notif_prep_instance_hdr(xpath, area, "default", arguments);
409 notif_prepr_iface_hdr(xpath, circuit, arguments);
410 snprintf(xpath_arg, sizeof(xpath_arg), "%s/lsp-id", xpath);
1ee746d9 411 data = yang_data_new_string(xpath_arg, rawlspid_print(lsp_id));
2a1c520e
RW
412 listnode_add(arguments, data);
413 snprintf(xpath_arg, sizeof(xpath_arg), "%s/sequence", xpath);
414 data = yang_data_new_uint32(xpath_arg, seqno);
415 listnode_add(arguments, data);
416 snprintf(xpath_arg, sizeof(xpath_arg), "%s/received-timestamp", xpath);
417 data = yang_data_new_uint32(xpath_arg, timestamp);
418 listnode_add(arguments, data);
419 snprintf(xpath_arg, sizeof(xpath_arg), "%s/neighbor-system-id", xpath);
420 data = yang_data_new_string(xpath_arg, sys_id);
421 listnode_add(arguments, data);
422
423 nb_notification_send(xpath, arguments);
424}
425
426/*
427 * XPath: /frr-isisd:lsp-generation
428 */
1ee746d9 429void isis_notif_lsp_gen(const struct isis_area *area, const uint8_t *lsp_id,
2a1c520e
RW
430 uint32_t seqno, uint32_t timestamp)
431{
432 const char *xpath = "/frr-isisd:lsp-generation";
433 struct list *arguments = yang_data_list_new();
434 char xpath_arg[XPATH_MAXLEN];
435 struct yang_data *data;
436
437 notif_prep_instance_hdr(xpath, area, "default", arguments);
438 snprintf(xpath_arg, sizeof(xpath_arg), "%s/lsp-id", xpath);
1ee746d9 439 data = yang_data_new_string(xpath_arg, rawlspid_print(lsp_id));
2a1c520e
RW
440 listnode_add(arguments, data);
441 snprintf(xpath_arg, sizeof(xpath_arg), "%s/sequence", xpath);
442 data = yang_data_new_uint32(xpath_arg, seqno);
443 listnode_add(arguments, data);
444 snprintf(xpath_arg, sizeof(xpath_arg), "%s/send-timestamp", xpath);
445 data = yang_data_new_uint32(xpath_arg, timestamp);
446 listnode_add(arguments, data);
447
448 nb_notification_send(xpath, arguments);
449}
450
451/*
452 * XPath: /frr-isisd:id-len-mismatch
453 */
454void isis_notif_id_len_mismatch(const struct isis_circuit *circuit,
1ee746d9 455 uint8_t rcv_id_len, const char *raw_pdu,
456 size_t raw_pdu_len)
2a1c520e
RW
457{
458 const char *xpath = "/frr-isisd:id-len-mismatch";
459 struct list *arguments = yang_data_list_new();
460 char xpath_arg[XPATH_MAXLEN];
461 struct yang_data *data;
462 struct isis_area *area = circuit->area;
463
464 notif_prep_instance_hdr(xpath, area, "default", arguments);
465 notif_prepr_iface_hdr(xpath, circuit, arguments);
466 snprintf(xpath_arg, sizeof(xpath_arg), "%s/pdu-field-len", xpath);
467 data = yang_data_new_uint8(xpath_arg, rcv_id_len);
468 listnode_add(arguments, data);
469 snprintf(xpath_arg, sizeof(xpath_arg), "%s/raw-pdu", xpath);
ac313345 470 data = yang_data_new_binary(xpath_arg, raw_pdu, raw_pdu_len);
2a1c520e
RW
471 listnode_add(arguments, data);
472
1ee746d9 473 hook_call(isis_hook_id_len_mismatch, circuit, rcv_id_len, raw_pdu,
474 raw_pdu_len);
475
2a1c520e
RW
476 nb_notification_send(xpath, arguments);
477}
478
479/*
480 * XPath: /frr-isisd:version-skew
481 */
482void isis_notif_version_skew(const struct isis_circuit *circuit,
1ee746d9 483 uint8_t version, const char *raw_pdu,
484 size_t raw_pdu_len)
2a1c520e
RW
485{
486 const char *xpath = "/frr-isisd:version-skew";
487 struct list *arguments = yang_data_list_new();
488 char xpath_arg[XPATH_MAXLEN];
489 struct yang_data *data;
490 struct isis_area *area = circuit->area;
491
492 notif_prep_instance_hdr(xpath, area, "default", arguments);
493 notif_prepr_iface_hdr(xpath, circuit, arguments);
494 snprintf(xpath_arg, sizeof(xpath_arg), "%s/protocol-version", xpath);
495 data = yang_data_new_uint8(xpath_arg, version);
496 listnode_add(arguments, data);
497 snprintf(xpath_arg, sizeof(xpath_arg), "%s/raw-pdu", xpath);
ac313345 498 data = yang_data_new_binary(xpath_arg, raw_pdu, raw_pdu_len);
2a1c520e
RW
499 listnode_add(arguments, data);
500
1ee746d9 501 hook_call(isis_hook_version_skew, circuit, version, raw_pdu,
502 raw_pdu_len);
503
2a1c520e
RW
504 nb_notification_send(xpath, arguments);
505}
506
507/*
508 * XPath: /frr-isisd:lsp-error-detected
509 */
510void isis_notif_lsp_error(const struct isis_circuit *circuit,
1ee746d9 511 const uint8_t *lsp_id, const char *raw_pdu,
512 size_t raw_pdu_len,
2a1c520e
RW
513 __attribute__((unused)) uint32_t offset,
514 __attribute__((unused)) uint8_t tlv_type)
515{
516 const char *xpath = "/frr-isisd:lsp-error-detected";
517 struct list *arguments = yang_data_list_new();
518 char xpath_arg[XPATH_MAXLEN];
519 struct yang_data *data;
520 struct isis_area *area = circuit->area;
521
522 notif_prep_instance_hdr(xpath, area, "default", arguments);
523 notif_prepr_iface_hdr(xpath, circuit, arguments);
524 snprintf(xpath_arg, sizeof(xpath_arg), "%s/lsp-id", xpath);
1ee746d9 525 data = yang_data_new_string(xpath_arg, rawlspid_print(lsp_id));
2a1c520e
RW
526 listnode_add(arguments, data);
527 snprintf(xpath_arg, sizeof(xpath_arg), "%s/raw-pdu", xpath);
ac313345 528 data = yang_data_new_binary(xpath_arg, raw_pdu, raw_pdu_len);
2a1c520e
RW
529 listnode_add(arguments, data);
530 /* ignore offset and tlv_type which cannot be set properly */
531
1ee746d9 532 hook_call(isis_hook_lsp_error, circuit, lsp_id, raw_pdu, raw_pdu_len);
533
2a1c520e
RW
534 nb_notification_send(xpath, arguments);
535}
536
537/*
538 * XPath: /frr-isisd:sequence-number-skipped
539 */
540void isis_notif_seqno_skipped(const struct isis_circuit *circuit,
1ee746d9 541 const uint8_t *lsp_id)
2a1c520e
RW
542{
543 const char *xpath = "/frr-isisd:sequence-number-skipped";
544 struct list *arguments = yang_data_list_new();
545 char xpath_arg[XPATH_MAXLEN];
546 struct yang_data *data;
547 struct isis_area *area = circuit->area;
548
549 notif_prep_instance_hdr(xpath, area, "default", arguments);
550 notif_prepr_iface_hdr(xpath, circuit, arguments);
551 snprintf(xpath_arg, sizeof(xpath_arg), "%s/lsp-id", xpath);
1ee746d9 552 data = yang_data_new_string(xpath_arg, rawlspid_print(lsp_id));
2a1c520e
RW
553 listnode_add(arguments, data);
554
1ee746d9 555 hook_call(isis_hook_seqno_skipped, circuit, lsp_id);
556
2a1c520e
RW
557 nb_notification_send(xpath, arguments);
558}
559
560/*
561 * XPath: /frr-isisd:own-lsp-purge
562 */
563void isis_notif_own_lsp_purge(const struct isis_circuit *circuit,
1ee746d9 564 const uint8_t *lsp_id)
2a1c520e
RW
565{
566 const char *xpath = "/frr-isisd:own-lsp-purge";
567 struct list *arguments = yang_data_list_new();
568 char xpath_arg[XPATH_MAXLEN];
569 struct yang_data *data;
570 struct isis_area *area = circuit->area;
571
572 notif_prep_instance_hdr(xpath, area, "default", arguments);
573 notif_prepr_iface_hdr(xpath, circuit, arguments);
574 snprintf(xpath_arg, sizeof(xpath_arg), "%s/lsp-id", xpath);
1ee746d9 575 data = yang_data_new_string(xpath_arg, rawlspid_print(lsp_id));
2a1c520e
RW
576 listnode_add(arguments, data);
577
1ee746d9 578 hook_call(isis_hook_own_lsp_purge, circuit, lsp_id);
579
2a1c520e
RW
580 nb_notification_send(xpath, arguments);
581}