2 * Copyright (C) 2018 Volta Networks
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)
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
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
22 #include "northbound.h"
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"
31 DEFINE_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
));
35 DEFINE_HOOK(isis_hook_corrupted_lsp
, (const struct isis_area
*area
), (area
));
36 DEFINE_HOOK(isis_hook_lsp_exceed_max
,
37 (const struct isis_area
*area
, const uint8_t *lsp_id
),
39 DEFINE_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
));
43 DEFINE_HOOK(isis_hook_authentication_type_failure
,
44 (const struct isis_circuit
*circuit
, const char *raw_pdu
,
46 (circuit
, raw_pdu
, raw_pdu_len
));
47 DEFINE_HOOK(isis_hook_authentication_failure
,
48 (const struct isis_circuit
*circuit
, const char *raw_pdu
,
50 (circuit
, raw_pdu
, raw_pdu_len
));
51 DEFINE_HOOK(isis_hook_adj_state_change
, (const struct isis_adjacency
*adj
),
53 DEFINE_HOOK(isis_hook_reject_adjacency
,
54 (const struct isis_circuit
*circuit
, const char *raw_pdu
,
56 (circuit
, raw_pdu
, raw_pdu_len
));
57 DEFINE_HOOK(isis_hook_area_mismatch
,
58 (const struct isis_circuit
*circuit
, const char *raw_pdu
,
60 (circuit
, raw_pdu
, raw_pdu_len
));
61 DEFINE_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
));
65 DEFINE_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
));
69 DEFINE_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
));
73 DEFINE_HOOK(isis_hook_seqno_skipped
,
74 (const struct isis_circuit
*circuit
, const uint8_t *lsp_id
),
76 DEFINE_HOOK(isis_hook_own_lsp_purge
,
77 (const struct isis_circuit
*circuit
, const uint8_t *lsp_id
),
84 static void notif_prep_instance_hdr(const char *xpath
,
85 const struct isis_area
*area
,
86 const char *routing_instance
,
89 char xpath_arg
[XPATH_MAXLEN
];
90 struct yang_data
*data
;
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",
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
);
104 static void notif_prepr_iface_hdr(const char *xpath
,
105 const struct isis_circuit
*circuit
,
108 char xpath_arg
[XPATH_MAXLEN
];
109 struct yang_data
*data
;
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
);
124 * XPath: /frr-isisd:database-overload
126 void isis_notif_db_overload(const struct isis_area
*area
, bool overload
)
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
;
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
);
138 nb_notification_send(xpath
, arguments
);
142 * XPath: /frr-isisd:lsp-too-large
144 void isis_notif_lsp_too_large(const struct isis_circuit
*circuit
,
145 uint32_t pdu_size
, const uint8_t *lsp_id
)
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
;
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
);
159 data
= yang_data_new_string(xpath_arg
, rawlspid_print(lsp_id
));
160 listnode_add(arguments
, data
);
162 hook_call(isis_hook_lsp_too_large
, circuit
, pdu_size
, lsp_id
);
164 nb_notification_send(xpath
, arguments
);
168 * XPath: /frr-isisd:if-state-change
170 void isis_notif_if_state_change(const struct isis_circuit
*circuit
, bool down
)
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
;
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
);
184 nb_notification_send(xpath
, arguments
);
188 * XPath: /frr-isisd:corrupted-lsp-detected
190 void isis_notif_corrupted_lsp(const struct isis_area
*area
,
191 const uint8_t *lsp_id
)
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
;
198 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
199 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/lsp-id", xpath
);
200 data
= yang_data_new_string(xpath_arg
, rawlspid_print(lsp_id
));
201 listnode_add(arguments
, data
);
203 hook_call(isis_hook_corrupted_lsp
, area
);
205 nb_notification_send(xpath
, arguments
);
209 * XPath: /frr-isisd:attempt-to-exceed-max-sequence
211 void isis_notif_lsp_exceed_max(const struct isis_area
*area
,
212 const uint8_t *lsp_id
)
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
;
219 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
220 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/lsp-id", xpath
);
221 data
= yang_data_new_string(xpath_arg
, rawlspid_print(lsp_id
));
222 listnode_add(arguments
, data
);
224 hook_call(isis_hook_lsp_exceed_max
, area
, lsp_id
);
226 nb_notification_send(xpath
, arguments
);
230 * XPath: /frr-isisd:max-area-addresses-mismatch
232 void isis_notif_max_area_addr_mismatch(const struct isis_circuit
*circuit
,
233 uint8_t max_area_addrs
,
234 const char *raw_pdu
, size_t raw_pdu_len
)
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
;
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
);
248 data
= yang_data_new(xpath_arg
, raw_pdu
);
249 listnode_add(arguments
, data
);
251 hook_call(isis_hook_max_area_addr_mismatch
, circuit
, max_area_addrs
,
252 raw_pdu
, raw_pdu_len
);
254 nb_notification_send(xpath
, arguments
);
258 * XPath: /frr-isisd:authentication-type-failure
260 void isis_notif_authentication_type_failure(const struct isis_circuit
*circuit
,
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
;
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
);
273 data
= yang_data_new(xpath_arg
, raw_pdu
);
274 listnode_add(arguments
, data
);
276 hook_call(isis_hook_authentication_type_failure
, circuit
, raw_pdu
,
279 nb_notification_send(xpath
, arguments
);
283 * XPath: /frr-isisd:authentication-failure
285 void isis_notif_authentication_failure(const struct isis_circuit
*circuit
,
286 const char *raw_pdu
, size_t raw_pdu_len
)
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
;
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
);
297 data
= yang_data_new(xpath_arg
, raw_pdu
);
298 listnode_add(arguments
, data
);
300 hook_call(isis_hook_authentication_failure
, circuit
, raw_pdu
,
303 nb_notification_send(xpath
, arguments
);
307 * XPath: /frr-isisd:adjacency-state-change
309 void isis_notif_adj_state_change(const struct isis_adjacency
*adj
,
310 int new_state
, const char *reason
)
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
;
318 struct isis_dynhn
*dyn
= dynhn_find_by_id(adj
->sysid
);
320 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
321 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
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
);
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
);
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
);
340 hook_call(isis_hook_adj_state_change
, adj
);
342 nb_notification_send(xpath
, arguments
);
346 * XPath: /frr-isisd:rejected-adjacency
348 void isis_notif_reject_adjacency(const struct isis_circuit
*circuit
,
349 const char *reason
, const char *raw_pdu
,
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
;
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
);
364 data
= yang_data_new(xpath_arg
, raw_pdu
);
365 listnode_add(arguments
, data
);
367 hook_call(isis_hook_reject_adjacency
, circuit
, raw_pdu
, raw_pdu_len
);
369 nb_notification_send(xpath
, arguments
);
373 * XPath: /frr-isisd:area-mismatch
375 void isis_notif_area_mismatch(const struct isis_circuit
*circuit
,
376 const char *raw_pdu
, size_t raw_pdu_len
)
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
;
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
);
387 data
= yang_data_new(xpath_arg
, raw_pdu
);
388 listnode_add(arguments
, data
);
390 hook_call(isis_hook_area_mismatch
, circuit
, raw_pdu
, raw_pdu_len
);
392 nb_notification_send(xpath
, arguments
);
396 * XPath: /frr-isisd:lsp-received
398 void isis_notif_lsp_received(const struct isis_circuit
*circuit
,
399 const uint8_t *lsp_id
, uint32_t seqno
,
400 uint32_t timestamp
, const char *sys_id
)
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
;
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
);
411 data
= yang_data_new_string(xpath_arg
, rawlspid_print(lsp_id
));
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
);
423 nb_notification_send(xpath
, arguments
);
427 * XPath: /frr-isisd:lsp-generation
429 void isis_notif_lsp_gen(const struct isis_area
*area
, const uint8_t *lsp_id
,
430 uint32_t seqno
, uint32_t timestamp
)
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
;
437 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
438 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/lsp-id", xpath
);
439 data
= yang_data_new_string(xpath_arg
, rawlspid_print(lsp_id
));
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
);
448 nb_notification_send(xpath
, arguments
);
452 * XPath: /frr-isisd:id-len-mismatch
454 void isis_notif_id_len_mismatch(const struct isis_circuit
*circuit
,
455 uint8_t rcv_id_len
, const char *raw_pdu
,
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
;
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
);
470 data
= yang_data_new(xpath_arg
, raw_pdu
);
471 listnode_add(arguments
, data
);
473 hook_call(isis_hook_id_len_mismatch
, circuit
, rcv_id_len
, raw_pdu
,
476 nb_notification_send(xpath
, arguments
);
480 * XPath: /frr-isisd:version-skew
482 void isis_notif_version_skew(const struct isis_circuit
*circuit
,
483 uint8_t version
, const char *raw_pdu
,
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
;
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
);
498 data
= yang_data_new(xpath_arg
, raw_pdu
);
499 listnode_add(arguments
, data
);
501 hook_call(isis_hook_version_skew
, circuit
, version
, raw_pdu
,
504 nb_notification_send(xpath
, arguments
);
508 * XPath: /frr-isisd:lsp-error-detected
510 void isis_notif_lsp_error(const struct isis_circuit
*circuit
,
511 const uint8_t *lsp_id
, const char *raw_pdu
,
513 __attribute__((unused
)) uint32_t offset
,
514 __attribute__((unused
)) uint8_t tlv_type
)
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
;
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
);
525 data
= yang_data_new_string(xpath_arg
, rawlspid_print(lsp_id
));
526 listnode_add(arguments
, data
);
527 snprintf(xpath_arg
, sizeof(xpath_arg
), "%s/raw-pdu", xpath
);
528 data
= yang_data_new(xpath_arg
, raw_pdu
);
529 listnode_add(arguments
, data
);
530 /* ignore offset and tlv_type which cannot be set properly */
532 hook_call(isis_hook_lsp_error
, circuit
, lsp_id
, raw_pdu
, raw_pdu_len
);
534 nb_notification_send(xpath
, arguments
);
538 * XPath: /frr-isisd:sequence-number-skipped
540 void isis_notif_seqno_skipped(const struct isis_circuit
*circuit
,
541 const uint8_t *lsp_id
)
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
;
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
);
552 data
= yang_data_new_string(xpath_arg
, rawlspid_print(lsp_id
));
553 listnode_add(arguments
, data
);
555 hook_call(isis_hook_seqno_skipped
, circuit
, lsp_id
);
557 nb_notification_send(xpath
, arguments
);
561 * XPath: /frr-isisd:own-lsp-purge
563 void isis_notif_own_lsp_purge(const struct isis_circuit
*circuit
,
564 const uint8_t *lsp_id
)
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
;
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
);
575 data
= yang_data_new_string(xpath_arg
, rawlspid_print(lsp_id
));
576 listnode_add(arguments
, data
);
578 hook_call(isis_hook_own_lsp_purge
, circuit
, lsp_id
);
580 nb_notification_send(xpath
, arguments
);