1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2018 Volta Networks
9 #include "northbound.h"
12 #include "isisd/isisd.h"
13 #include "isisd/isis_nb.h"
14 #include "isisd/isis_circuit.h"
15 #include "isisd/isis_adjacency.h"
16 #include "isisd/isis_misc.h"
19 * XPath: /frr-interface:lib/interface/state/frr-isisd:isis
22 lib_interface_state_isis_get_elem(struct nb_cb_get_elem_args
*args
)
24 struct interface
*ifp
;
25 struct isis_circuit
*circuit
;
27 ifp
= (struct interface
*)args
->list_entry
;
31 circuit
= circuit_scan_by_ifp(ifp
);
32 if (!circuit
|| !circuit
->area
)
35 return yang_data_new(args
->xpath
, NULL
);
40 * /frr-interface:lib/interface/state/frr-isisd:isis/adjacencies/adjacency
42 const void *lib_interface_state_isis_adjacencies_adjacency_get_next(
43 struct nb_cb_get_next_args
*args
)
45 struct interface
*ifp
;
46 struct isis_circuit
*circuit
;
47 struct isis_adjacency
*adj
= NULL
, *adj_next
= NULL
;
49 struct listnode
*node
, *node_next
;
51 /* Get first adjacency. */
52 if (args
->list_entry
== NULL
) {
53 ifp
= (struct interface
*)args
->parent_list_entry
;
57 circuit
= circuit_scan_by_ifp(ifp
);
61 switch (circuit
->circ_type
) {
62 case CIRCUIT_T_BROADCAST
:
63 for (int level
= ISIS_LEVEL1
; level
<= ISIS_LEVELS
;
67 adjdb
= circuit
->u
.bc
.adjdb
[level
- 1];
69 adj
= listnode_head(adjdb
);
76 adj
= circuit
->u
.p2p
.neighbor
;
85 /* Get next adjacency. */
86 adj
= (struct isis_adjacency
*)args
->list_entry
;
87 circuit
= adj
->circuit
;
88 switch (circuit
->circ_type
) {
89 case CIRCUIT_T_BROADCAST
:
90 list
= circuit
->u
.bc
.adjdb
[adj
->level
- 1];
91 node
= listnode_lookup(list
, adj
);
92 node_next
= listnextnode(node
);
94 adj_next
= listgetdata(node_next
);
95 else if (adj
->level
== ISIS_LEVEL1
) {
97 * Once we finish the L1 adjacencies, move to the L2
100 list
= circuit
->u
.bc
.adjdb
[ISIS_LEVEL2
- 1];
101 adj_next
= listnode_head(list
);
105 /* P2P circuits have at most one adjacency. */
115 * /frr-interface:lib/interface/state/frr-isisd:isis/adjacencies/adjacency/neighbor-sys-type
118 lib_interface_state_isis_adjacencies_adjacency_neighbor_sys_type_get_elem(
119 struct nb_cb_get_elem_args
*args
)
121 const struct isis_adjacency
*adj
= args
->list_entry
;
123 return yang_data_new_enum(args
->xpath
, adj
->level
);
128 * /frr-interface:lib/interface/state/frr-isisd:isis/adjacencies/adjacency/neighbor-sysid
131 lib_interface_state_isis_adjacencies_adjacency_neighbor_sysid_get_elem(
132 struct nb_cb_get_elem_args
*args
)
134 const struct isis_adjacency
*adj
= args
->list_entry
;
136 return yang_data_new_string(args
->xpath
, sysid_print(adj
->sysid
));
141 * /frr-interface:lib/interface/state/frr-isisd:isis/adjacencies/adjacency/neighbor-extended-circuit-id
144 lib_interface_state_isis_adjacencies_adjacency_neighbor_extended_circuit_id_get_elem(
145 struct nb_cb_get_elem_args
*args
)
147 const struct isis_adjacency
*adj
= args
->list_entry
;
149 return yang_data_new_uint32(args
->xpath
, adj
->circuit
->circuit_id
);
154 * /frr-interface:lib/interface/state/frr-isisd:isis/adjacencies/adjacency/neighbor-snpa
157 lib_interface_state_isis_adjacencies_adjacency_neighbor_snpa_get_elem(
158 struct nb_cb_get_elem_args
*args
)
160 const struct isis_adjacency
*adj
= args
->list_entry
;
162 return yang_data_new_string(args
->xpath
, snpa_print(adj
->snpa
));
167 * /frr-interface:lib/interface/state/frr-isisd:isis/adjacencies/adjacency/hold-timer
170 lib_interface_state_isis_adjacencies_adjacency_hold_timer_get_elem(
171 struct nb_cb_get_elem_args
*args
)
173 const struct isis_adjacency
*adj
= args
->list_entry
;
175 return yang_data_new_uint16(args
->xpath
, adj
->hold_time
);
180 * /frr-interface:lib/interface/state/frr-isisd:isis/adjacencies/adjacency/neighbor-priority
183 lib_interface_state_isis_adjacencies_adjacency_neighbor_priority_get_elem(
184 struct nb_cb_get_elem_args
*args
)
186 const struct isis_adjacency
*adj
= args
->list_entry
;
188 return yang_data_new_uint8(args
->xpath
, adj
->prio
[adj
->level
- 1]);
193 * /frr-interface:lib/interface/state/frr-isisd:isis/adjacencies/adjacency/state
195 struct yang_data
*lib_interface_state_isis_adjacencies_adjacency_state_get_elem(
196 struct nb_cb_get_elem_args
*args
)
198 const struct isis_adjacency
*adj
= args
->list_entry
;
200 return yang_data_new_string(args
->xpath
,
201 isis_adj_yang_state(adj
->adj_state
));
206 * /frr-interface:lib/interface/state/frr-isisd:isis/adjacencies/adjacency/adjacency-sids/adjacency-sid
209 lib_interface_state_isis_adjacencies_adjacency_adjacency_sids_adjacency_sid_get_next(
210 struct nb_cb_get_next_args
*args
)
212 const struct isis_adjacency
*adj
= args
->parent_list_entry
;
213 const struct sr_adjacency
*sra
= args
->list_entry
, *sra_next
= NULL
;
214 struct listnode
*node
, *node_next
;
216 if (args
->list_entry
== NULL
)
217 sra_next
= listnode_head(adj
->adj_sids
);
219 node
= listnode_lookup(adj
->adj_sids
, sra
);
220 node_next
= listnextnode(node
);
222 sra_next
= listgetdata(node_next
);
230 * /frr-interface:lib/interface/state/frr-isisd:isis/adjacencies/adjacency/adjacency-sids/adjacency-sid/af
233 lib_interface_state_isis_adjacencies_adjacency_adjacency_sids_adjacency_sid_af_get_elem(
234 struct nb_cb_get_elem_args
*args
)
236 const struct sr_adjacency
*sra
= args
->list_entry
;
238 switch (sra
->adj
->circuit
->circ_type
) {
239 case CIRCUIT_T_BROADCAST
:
240 /* Adjacency SID is not published with circuit type Broadcast */
243 return yang_data_new_uint8(args
->xpath
, sra
->u
.adj_sid
->family
);
251 * /frr-interface:lib/interface/state/frr-isisd:isis/adjacencies/adjacency/adjacency-sids/adjacency-sid/value
254 lib_interface_state_isis_adjacencies_adjacency_adjacency_sids_adjacency_sid_value_get_elem(
255 struct nb_cb_get_elem_args
*args
)
257 const struct sr_adjacency
*sra
= args
->list_entry
;
259 switch (sra
->adj
->circuit
->circ_type
) {
260 case CIRCUIT_T_BROADCAST
:
261 /* Adjacency SID is not published with circuit type Broadcast */
264 return yang_data_new_uint32(args
->xpath
, sra
->u
.adj_sid
->sid
);
272 * /frr-interface:lib/interface/state/frr-isisd:isis/adjacencies/adjacency/adjacency-sids/adjacency-sid/weight
275 lib_interface_state_isis_adjacencies_adjacency_adjacency_sids_adjacency_sid_weight_get_elem(
276 struct nb_cb_get_elem_args
*args
)
278 const struct sr_adjacency
*sra
= args
->list_entry
;
280 switch (sra
->adj
->circuit
->circ_type
) {
281 case CIRCUIT_T_BROADCAST
:
282 /* Adjacency SID is not published with circuit type Broadcast */
285 return yang_data_new_uint8(args
->xpath
, sra
->u
.adj_sid
->weight
);
293 * /frr-interface:lib/interface/state/frr-isisd:isis/adjacencies/adjacency/adjacency-sids/adjacency-sid/protection-requested
296 lib_interface_state_isis_adjacencies_adjacency_adjacency_sids_adjacency_sid_protection_requested_get_elem(
297 struct nb_cb_get_elem_args
*args
)
299 const struct sr_adjacency
*sra
= args
->list_entry
;
301 switch (sra
->adj
->circuit
->circ_type
) {
302 case CIRCUIT_T_BROADCAST
:
303 /* Adjacency SID is not published with circuit type Broadcast */
306 return yang_data_new_bool(args
->xpath
,
307 sra
->u
.adj_sid
->flags
&
308 EXT_SUBTLV_LINK_ADJ_SID_BFLG
);
316 * /frr-interface:lib/interface/state/frr-isisd:isis/adjacencies/adjacency/lan-adjacency-sids/lan-adjacency-sid
319 lib_interface_state_isis_adjacencies_adjacency_lan_adjacency_sids_lan_adjacency_sid_get_next(
320 struct nb_cb_get_next_args
*args
)
322 const struct isis_adjacency
*adj
= args
->parent_list_entry
;
323 const struct sr_adjacency
*sra
= args
->list_entry
, *sra_next
= NULL
;
324 struct listnode
*node
, *node_next
;
326 if (args
->list_entry
== NULL
)
327 sra_next
= listnode_head(adj
->adj_sids
);
329 node
= listnode_lookup(adj
->adj_sids
, sra
);
330 node_next
= listnextnode(node
);
332 sra_next
= listgetdata(node_next
);
340 * /frr-interface:lib/interface/state/frr-isisd:isis/adjacencies/adjacency/lan-adjacency-sids/lan-adjacency-sid/af
343 lib_interface_state_isis_adjacencies_adjacency_lan_adjacency_sids_lan_adjacency_sid_af_get_elem(
344 struct nb_cb_get_elem_args
*args
)
346 const struct sr_adjacency
*sra
= args
->list_entry
;
348 switch (sra
->adj
->circuit
->circ_type
) {
349 case CIRCUIT_T_BROADCAST
:
350 return yang_data_new_uint8(args
->xpath
,
351 sra
->u
.ladj_sid
->family
);
353 /* LAN adjacency SID is not published with circuit type P2P */
362 * /frr-interface:lib/interface/state/frr-isisd:isis/adjacencies/adjacency/lan-adjacency-sids/lan-adjacency-sid/value
365 lib_interface_state_isis_adjacencies_adjacency_lan_adjacency_sids_lan_adjacency_sid_value_get_elem(
366 struct nb_cb_get_elem_args
*args
)
368 const struct sr_adjacency
*sra
= args
->list_entry
;
370 switch (sra
->adj
->circuit
->circ_type
) {
371 case CIRCUIT_T_BROADCAST
:
372 return yang_data_new_uint32(args
->xpath
, sra
->u
.ladj_sid
->sid
);
374 /* LAN adjacency SID is not published with circuit type P2P */
383 * /frr-interface:lib/interface/state/frr-isisd:isis/adjacencies/adjacency/lan-adjacency-sids/lan-adjacency-sid/weight
386 lib_interface_state_isis_adjacencies_adjacency_lan_adjacency_sids_lan_adjacency_sid_weight_get_elem(
387 struct nb_cb_get_elem_args
*args
)
389 const struct sr_adjacency
*sra
= args
->list_entry
;
391 switch (sra
->adj
->circuit
->circ_type
) {
392 case CIRCUIT_T_BROADCAST
:
393 return yang_data_new_uint8(args
->xpath
,
394 sra
->u
.ladj_sid
->weight
);
396 /* LAN adjacency SID is not published with circuit type P2P */
405 * /frr-interface:lib/interface/state/frr-isisd:isis/adjacencies/adjacency/lan-adjacency-sids/lan-adjacency-sid/protection-requested
408 lib_interface_state_isis_adjacencies_adjacency_lan_adjacency_sids_lan_adjacency_sid_protection_requested_get_elem(
409 struct nb_cb_get_elem_args
*args
)
411 const struct sr_adjacency
*sra
= args
->list_entry
;
413 switch (sra
->adj
->circuit
->circ_type
) {
414 case CIRCUIT_T_BROADCAST
:
415 return yang_data_new_bool(args
->xpath
,
416 sra
->u
.ladj_sid
->flags
&
417 EXT_SUBTLV_LINK_ADJ_SID_BFLG
);
419 /* LAN adjacency SID is not published with circuit type P2P */
428 * /frr-interface:lib/interface/state/frr-isisd:isis/event-counters/adjacency-changes
431 lib_interface_state_isis_event_counters_adjacency_changes_get_elem(
432 struct nb_cb_get_elem_args
*args
)
434 struct interface
*ifp
;
435 struct isis_circuit
*circuit
;
437 ifp
= (struct interface
*)args
->list_entry
;
441 circuit
= circuit_scan_by_ifp(ifp
);
445 return yang_data_new_uint32(args
->xpath
, circuit
->adj_state_changes
);
450 * /frr-interface:lib/interface/state/frr-isisd:isis/event-counters/adjacency-number
453 lib_interface_state_isis_event_counters_adjacency_number_get_elem(
454 struct nb_cb_get_elem_args
*args
)
456 struct interface
*ifp
;
457 struct isis_circuit
*circuit
;
458 struct isis_adjacency
*adj
;
459 struct listnode
*node
;
462 ifp
= (struct interface
*)args
->list_entry
;
466 circuit
= circuit_scan_by_ifp(ifp
);
471 * TODO: keep track of the number of adjacencies instead of calculating
474 switch (circuit
->circ_type
) {
475 case CIRCUIT_T_BROADCAST
:
476 for (int level
= ISIS_LEVEL1
; level
<= ISIS_LEVELS
; level
++) {
477 for (ALL_LIST_ELEMENTS_RO(
478 circuit
->u
.bc
.adjdb
[level
- 1], node
, adj
))
483 adj
= circuit
->u
.p2p
.neighbor
;
491 return yang_data_new_uint32(args
->xpath
, total
);
496 * /frr-interface:lib/interface/state/frr-isisd:isis/event-counters/init-fails
498 struct yang_data
*lib_interface_state_isis_event_counters_init_fails_get_elem(
499 struct nb_cb_get_elem_args
*args
)
501 struct interface
*ifp
;
502 struct isis_circuit
*circuit
;
504 ifp
= (struct interface
*)args
->list_entry
;
508 circuit
= circuit_scan_by_ifp(ifp
);
512 return yang_data_new_uint32(args
->xpath
, circuit
->init_failures
);
517 * /frr-interface:lib/interface/state/frr-isisd:isis/event-counters/adjacency-rejects
520 lib_interface_state_isis_event_counters_adjacency_rejects_get_elem(
521 struct nb_cb_get_elem_args
*args
)
523 struct interface
*ifp
;
524 struct isis_circuit
*circuit
;
526 ifp
= (struct interface
*)args
->list_entry
;
530 circuit
= circuit_scan_by_ifp(ifp
);
534 return yang_data_new_uint32(args
->xpath
, circuit
->rej_adjacencies
);
539 * /frr-interface:lib/interface/state/frr-isisd:isis/event-counters/id-len-mismatch
542 lib_interface_state_isis_event_counters_id_len_mismatch_get_elem(
543 struct nb_cb_get_elem_args
*args
)
545 struct interface
*ifp
;
546 struct isis_circuit
*circuit
;
548 ifp
= (struct interface
*)args
->list_entry
;
552 circuit
= circuit_scan_by_ifp(ifp
);
556 return yang_data_new_uint32(args
->xpath
, circuit
->id_len_mismatches
);
561 * /frr-interface:lib/interface/state/frr-isisd:isis/event-counters/max-area-addresses-mismatch
564 lib_interface_state_isis_event_counters_max_area_addresses_mismatch_get_elem(
565 struct nb_cb_get_elem_args
*args
)
567 struct interface
*ifp
;
568 struct isis_circuit
*circuit
;
570 ifp
= (struct interface
*)args
->list_entry
;
574 circuit
= circuit_scan_by_ifp(ifp
);
578 return yang_data_new_uint32(args
->xpath
,
579 circuit
->max_area_addr_mismatches
);
584 * /frr-interface:lib/interface/state/frr-isisd:isis/event-counters/authentication-type-fails
587 lib_interface_state_isis_event_counters_authentication_type_fails_get_elem(
588 struct nb_cb_get_elem_args
*args
)
590 struct interface
*ifp
;
591 struct isis_circuit
*circuit
;
593 ifp
= (struct interface
*)args
->list_entry
;
597 circuit
= circuit_scan_by_ifp(ifp
);
601 return yang_data_new_uint32(args
->xpath
, circuit
->auth_type_failures
);
606 * /frr-interface:lib/interface/state/frr-isisd:isis/event-counters/authentication-fails
609 lib_interface_state_isis_event_counters_authentication_fails_get_elem(
610 struct nb_cb_get_elem_args
*args
)
612 struct interface
*ifp
;
613 struct isis_circuit
*circuit
;
615 ifp
= (struct interface
*)args
->list_entry
;
619 circuit
= circuit_scan_by_ifp(ifp
);
623 return yang_data_new_uint32(args
->xpath
, circuit
->auth_failures
);