]> git.proxmox.com Git - mirror_frr.git/blobdiff - isisd/isis_nb_state.c
Merge pull request #13183 from Pdoijode/pdoijode/pim-json-changes
[mirror_frr.git] / isisd / isis_nb_state.c
index 4e325ed8da087139bb352536cf425e7a27d95ad8..b7c33ed27b8b7b1b89fd11aec1d8f9af32a25beb 100644 (file)
@@ -1,20 +1,7 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
 /*
  * Copyright (C) 2018        Volta Networks
  *                           Emanuele Di Pascale
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; see the file COPYING; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <zebra.h>
@@ -145,8 +132,11 @@ lib_interface_state_isis_adjacencies_adjacency_neighbor_sysid_get_elem(
        struct nb_cb_get_elem_args *args)
 {
        const struct isis_adjacency *adj = args->list_entry;
+       char xpath_value[ISO_SYSID_STRLEN];
 
-       return yang_data_new_string(args->xpath, sysid_print(adj->sysid));
+       snprintfrr(xpath_value, ISO_SYSID_STRLEN, "%pSY", adj->sysid);
+
+       return yang_data_new_string(args->xpath, xpath_value);
 }
 
 /*
@@ -171,8 +161,11 @@ lib_interface_state_isis_adjacencies_adjacency_neighbor_snpa_get_elem(
        struct nb_cb_get_elem_args *args)
 {
        const struct isis_adjacency *adj = args->list_entry;
+       char xpath_value[ISO_SYSID_STRLEN];
+
+       snprintfrr(xpath_value, ISO_SYSID_STRLEN, "%pSY", adj->snpa);
 
-       return yang_data_new_string(args->xpath, snpa_print(adj->snpa));
+       return yang_data_new_string(args->xpath, xpath_value);
 }
 
 /*
@@ -214,6 +207,228 @@ struct yang_data *lib_interface_state_isis_adjacencies_adjacency_state_get_elem(
                                    isis_adj_yang_state(adj->adj_state));
 }
 
+/*
+ * XPath:
+ * /frr-interface:lib/interface/state/frr-isisd:isis/adjacencies/adjacency/adjacency-sids/adjacency-sid
+ */
+const void *
+lib_interface_state_isis_adjacencies_adjacency_adjacency_sids_adjacency_sid_get_next(
+       struct nb_cb_get_next_args *args)
+{
+       const struct isis_adjacency *adj = args->parent_list_entry;
+       const struct sr_adjacency *sra = args->list_entry, *sra_next = NULL;
+       struct listnode *node, *node_next;
+
+       if (args->list_entry == NULL)
+               sra_next = listnode_head(adj->adj_sids);
+       else {
+               node = listnode_lookup(adj->adj_sids, sra);
+               node_next = listnextnode(node);
+               if (node_next)
+                       sra_next = listgetdata(node_next);
+       }
+
+       return sra_next;
+}
+
+/*
+ * XPath:
+ * /frr-interface:lib/interface/state/frr-isisd:isis/adjacencies/adjacency/adjacency-sids/adjacency-sid/af
+ */
+struct yang_data *
+lib_interface_state_isis_adjacencies_adjacency_adjacency_sids_adjacency_sid_af_get_elem(
+       struct nb_cb_get_elem_args *args)
+{
+       const struct sr_adjacency *sra = args->list_entry;
+
+       switch (sra->adj->circuit->circ_type) {
+       case CIRCUIT_T_BROADCAST:
+               /* Adjacency SID is not published with circuit type Broadcast */
+               return NULL;
+       case CIRCUIT_T_P2P:
+               return yang_data_new_uint8(args->xpath, sra->u.adj_sid->family);
+       }
+
+       return NULL;
+}
+
+/*
+ * XPath:
+ * /frr-interface:lib/interface/state/frr-isisd:isis/adjacencies/adjacency/adjacency-sids/adjacency-sid/value
+ */
+struct yang_data *
+lib_interface_state_isis_adjacencies_adjacency_adjacency_sids_adjacency_sid_value_get_elem(
+       struct nb_cb_get_elem_args *args)
+{
+       const struct sr_adjacency *sra = args->list_entry;
+
+       switch (sra->adj->circuit->circ_type) {
+       case CIRCUIT_T_BROADCAST:
+               /* Adjacency SID is not published with circuit type Broadcast */
+               return NULL;
+       case CIRCUIT_T_P2P:
+               return yang_data_new_uint32(args->xpath, sra->u.adj_sid->sid);
+       }
+
+       return NULL;
+}
+
+/*
+ * XPath:
+ * /frr-interface:lib/interface/state/frr-isisd:isis/adjacencies/adjacency/adjacency-sids/adjacency-sid/weight
+ */
+struct yang_data *
+lib_interface_state_isis_adjacencies_adjacency_adjacency_sids_adjacency_sid_weight_get_elem(
+       struct nb_cb_get_elem_args *args)
+{
+       const struct sr_adjacency *sra = args->list_entry;
+
+       switch (sra->adj->circuit->circ_type) {
+       case CIRCUIT_T_BROADCAST:
+               /* Adjacency SID is not published with circuit type Broadcast */
+               return NULL;
+       case CIRCUIT_T_P2P:
+               return yang_data_new_uint8(args->xpath, sra->u.adj_sid->weight);
+       }
+
+       return NULL;
+}
+
+/*
+ * XPath:
+ * /frr-interface:lib/interface/state/frr-isisd:isis/adjacencies/adjacency/adjacency-sids/adjacency-sid/protection-requested
+ */
+struct yang_data *
+lib_interface_state_isis_adjacencies_adjacency_adjacency_sids_adjacency_sid_protection_requested_get_elem(
+       struct nb_cb_get_elem_args *args)
+{
+       const struct sr_adjacency *sra = args->list_entry;
+
+       switch (sra->adj->circuit->circ_type) {
+       case CIRCUIT_T_BROADCAST:
+               /* Adjacency SID is not published with circuit type Broadcast */
+               return NULL;
+       case CIRCUIT_T_P2P:
+               return yang_data_new_bool(args->xpath,
+                                         sra->u.adj_sid->flags &
+                                                 EXT_SUBTLV_LINK_ADJ_SID_BFLG);
+       }
+
+       return NULL;
+}
+
+/*
+ * XPath:
+ * /frr-interface:lib/interface/state/frr-isisd:isis/adjacencies/adjacency/lan-adjacency-sids/lan-adjacency-sid
+ */
+const void *
+lib_interface_state_isis_adjacencies_adjacency_lan_adjacency_sids_lan_adjacency_sid_get_next(
+       struct nb_cb_get_next_args *args)
+{
+       const struct isis_adjacency *adj = args->parent_list_entry;
+       const struct sr_adjacency *sra = args->list_entry, *sra_next = NULL;
+       struct listnode *node, *node_next;
+
+       if (args->list_entry == NULL)
+               sra_next = listnode_head(adj->adj_sids);
+       else {
+               node = listnode_lookup(adj->adj_sids, sra);
+               node_next = listnextnode(node);
+               if (node_next)
+                       sra_next = listgetdata(node_next);
+       }
+
+       return sra_next;
+}
+
+/*
+ * XPath:
+ * /frr-interface:lib/interface/state/frr-isisd:isis/adjacencies/adjacency/lan-adjacency-sids/lan-adjacency-sid/af
+ */
+struct yang_data *
+lib_interface_state_isis_adjacencies_adjacency_lan_adjacency_sids_lan_adjacency_sid_af_get_elem(
+       struct nb_cb_get_elem_args *args)
+{
+       const struct sr_adjacency *sra = args->list_entry;
+
+       switch (sra->adj->circuit->circ_type) {
+       case CIRCUIT_T_BROADCAST:
+               return yang_data_new_uint8(args->xpath,
+                                          sra->u.ladj_sid->family);
+       case CIRCUIT_T_P2P:
+               /* LAN adjacency SID is not published with circuit type P2P */
+               return NULL;
+       }
+
+       return NULL;
+}
+
+/*
+ * XPath:
+ * /frr-interface:lib/interface/state/frr-isisd:isis/adjacencies/adjacency/lan-adjacency-sids/lan-adjacency-sid/value
+ */
+struct yang_data *
+lib_interface_state_isis_adjacencies_adjacency_lan_adjacency_sids_lan_adjacency_sid_value_get_elem(
+       struct nb_cb_get_elem_args *args)
+{
+       const struct sr_adjacency *sra = args->list_entry;
+
+       switch (sra->adj->circuit->circ_type) {
+       case CIRCUIT_T_BROADCAST:
+               return yang_data_new_uint32(args->xpath, sra->u.ladj_sid->sid);
+       case CIRCUIT_T_P2P:
+               /* LAN adjacency SID is not published with circuit type P2P */
+               return NULL;
+       }
+
+       return NULL;
+}
+
+/*
+ * XPath:
+ * /frr-interface:lib/interface/state/frr-isisd:isis/adjacencies/adjacency/lan-adjacency-sids/lan-adjacency-sid/weight
+ */
+struct yang_data *
+lib_interface_state_isis_adjacencies_adjacency_lan_adjacency_sids_lan_adjacency_sid_weight_get_elem(
+       struct nb_cb_get_elem_args *args)
+{
+       const struct sr_adjacency *sra = args->list_entry;
+
+       switch (sra->adj->circuit->circ_type) {
+       case CIRCUIT_T_BROADCAST:
+               return yang_data_new_uint8(args->xpath,
+                                          sra->u.ladj_sid->weight);
+       case CIRCUIT_T_P2P:
+               /* LAN adjacency SID is not published with circuit type P2P */
+               return NULL;
+       }
+
+       return NULL;
+}
+
+/*
+ * XPath:
+ * /frr-interface:lib/interface/state/frr-isisd:isis/adjacencies/adjacency/lan-adjacency-sids/lan-adjacency-sid/protection-requested
+ */
+struct yang_data *
+lib_interface_state_isis_adjacencies_adjacency_lan_adjacency_sids_lan_adjacency_sid_protection_requested_get_elem(
+       struct nb_cb_get_elem_args *args)
+{
+       const struct sr_adjacency *sra = args->list_entry;
+
+       switch (sra->adj->circuit->circ_type) {
+       case CIRCUIT_T_BROADCAST:
+               return yang_data_new_bool(args->xpath,
+                                         sra->u.ladj_sid->flags &
+                                                 EXT_SUBTLV_LINK_ADJ_SID_BFLG);
+       case CIRCUIT_T_P2P:
+               /* LAN adjacency SID is not published with circuit type P2P */
+               return NULL;
+       }
+
+       return NULL;
+}
+
 /*
  * XPath:
  * /frr-interface:lib/interface/state/frr-isisd:isis/event-counters/adjacency-changes