]>
git.proxmox.com Git - mirror_frr.git/blob - isisd/isis_nb_notifications.c
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"
34 static void notif_prep_instance_hdr(const char *xpath
,
35 const struct isis_area
*area
,
36 const char *routing_instance
,
39 char xpath_arg
[XPATH_MAXLEN
];
40 struct yang_data
*data
;
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",
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
);
54 static void notif_prepr_iface_hdr(const char *xpath
,
55 const struct isis_circuit
*circuit
,
58 char xpath_arg
[XPATH_MAXLEN
];
59 struct yang_data
*data
;
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
);
74 * XPath: /frr-isisd:database-overload
76 void isis_notif_db_overload(const struct isis_area
*area
, bool overload
)
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
;
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
);
88 nb_notification_send(xpath
, arguments
);
92 * XPath: /frr-isisd:lsp-too-large
94 void isis_notif_lsp_too_large(const struct isis_circuit
*circuit
,
95 uint32_t pdu_size
, const char *lsp_id
)
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
;
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
);
112 nb_notification_send(xpath
, arguments
);
116 * XPath: /frr-isisd:if-state-change
118 void isis_notif_if_state_change(const struct isis_circuit
*circuit
, bool down
)
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
;
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
);
132 nb_notification_send(xpath
, arguments
);
136 * XPath: /frr-isisd:corrupted-lsp-detected
138 void isis_notif_corrupted_lsp(const struct isis_area
*area
, const char *lsp_id
)
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
;
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
);
150 nb_notification_send(xpath
, arguments
);
154 * XPath: /frr-isisd:attempt-to-exceed-max-sequence
156 void isis_notif_lsp_exceed_max(const struct isis_area
*area
, const char *lsp_id
)
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
;
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
);
168 nb_notification_send(xpath
, arguments
);
172 * XPath: /frr-isisd:max-area-addresses-mismatch
174 void isis_notif_max_area_addr_mismatch(const struct isis_circuit
*circuit
,
175 uint8_t max_area_addrs
,
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
;
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
);
193 nb_notification_send(xpath
, arguments
);
197 * XPath: /frr-isisd:authentication-type-failure
199 void isis_notif_authentication_type_failure(const struct isis_circuit
*circuit
,
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
;
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
);
214 nb_notification_send(xpath
, arguments
);
218 * XPath: /frr-isisd:authentication-failure
220 void isis_notif_authentication_failure(const struct isis_circuit
*circuit
,
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
;
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
);
235 nb_notification_send(xpath
, arguments
);
239 * XPath: /frr-isisd:adjacency-state-change
241 void isis_notif_adj_state_change(const struct isis_adjacency
*adj
,
242 int new_state
, const char *reason
)
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
);
252 notif_prep_instance_hdr(xpath
, area
, "default", arguments
);
253 notif_prepr_iface_hdr(xpath
, circuit
, arguments
);
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
);
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
);
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
);
272 nb_notification_send(xpath
, arguments
);
276 * XPath: /frr-isisd:rejected-adjacency
278 void isis_notif_reject_adjacency(const struct isis_circuit
*circuit
,
279 const char *reason
, const char *raw_pdu
)
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
;
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
);
296 nb_notification_send(xpath
, arguments
);
300 * XPath: /frr-isisd:area-mismatch
302 void isis_notif_area_mismatch(const struct isis_circuit
*circuit
,
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
;
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
);
317 nb_notification_send(xpath
, arguments
);
321 * XPath: /frr-isisd:lsp-received
323 void 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
)
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
;
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
);
348 nb_notification_send(xpath
, arguments
);
352 * XPath: /frr-isisd:lsp-generation
354 void isis_notif_lsp_gen(const struct isis_area
*area
, const char *lsp_id
,
355 uint32_t seqno
, uint32_t timestamp
)
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
;
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
);
373 nb_notification_send(xpath
, arguments
);
377 * XPath: /frr-isisd:id-len-mismatch
379 void isis_notif_id_len_mismatch(const struct isis_circuit
*circuit
,
380 uint8_t rcv_id_len
, const char *raw_pdu
)
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
;
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
);
397 nb_notification_send(xpath
, arguments
);
401 * XPath: /frr-isisd:version-skew
403 void isis_notif_version_skew(const struct isis_circuit
*circuit
,
404 uint8_t version
, const char *raw_pdu
)
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
;
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
);
421 nb_notification_send(xpath
, arguments
);
425 * XPath: /frr-isisd:lsp-error-detected
427 void 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
)
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
;
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 */
448 nb_notification_send(xpath
, arguments
);
452 * XPath: /frr-isisd:sequence-number-skipped
454 void isis_notif_seqno_skipped(const struct isis_circuit
*circuit
,
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
;
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
);
469 nb_notification_send(xpath
, arguments
);
473 * XPath: /frr-isisd:own-lsp-purge
475 void isis_notif_own_lsp_purge(const struct isis_circuit
*circuit
,
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
;
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
);
490 nb_notification_send(xpath
, arguments
);