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