]>
Commit | Line | Data |
---|---|---|
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 | 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), | |
38 | (area, 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, | |
45 | size_t raw_pdu_len), | |
46 | (circuit, raw_pdu, raw_pdu_len)); | |
47 | DEFINE_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)); | |
51 | DEFINE_HOOK(isis_hook_adj_state_change, (const struct isis_adjacency *adj), | |
52 | (adj)); | |
53 | DEFINE_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)); | |
57 | DEFINE_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)); | |
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), | |
75 | (circuit, lsp_id)); | |
76 | DEFINE_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 | */ | |
84 | static 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 | ||
104 | static 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 | */ | |
126 | void 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 | */ | |
144 | void 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 | */ | |
170 | void 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 | 190 | void 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 | 211 | void 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 | */ | |
232 | void 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); | |
248 | data = yang_data_new(xpath_arg, raw_pdu); | |
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 | */ | |
260 | void 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); | |
273 | data = yang_data_new(xpath_arg, raw_pdu); | |
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 | */ | |
285 | void 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); | |
297 | data = yang_data_new(xpath_arg, raw_pdu); | |
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 | */ | |
309 | void 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 | */ | |
348 | void 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); | |
364 | data = yang_data_new(xpath_arg, raw_pdu); | |
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 | */ | |
375 | void 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); | |
387 | data = yang_data_new(xpath_arg, raw_pdu); | |
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 | */ | |
398 | void 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 | 429 | void 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 | */ | |
454 | void 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); | |
470 | data = yang_data_new(xpath_arg, raw_pdu); | |
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 | */ | |
482 | void 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); | |
498 | data = yang_data_new(xpath_arg, raw_pdu); | |
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 | */ | |
510 | void 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); | |
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 */ | |
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 | */ | |
540 | void 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 | */ | |
563 | void 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 | } |