mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-15 21:57:36 +00:00
isisd, yang: implement read-only list of adjacencies
The new "adjacency-state" grouping is almost a 1:1 copy of the same grouping from the IETF IS-IS module, except for the "usage" and "lastuptime" leafs that were skipped (more work needs to be done to support those). Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
This commit is contained in:
parent
e206450bd9
commit
aec5ef490c
@ -48,6 +48,23 @@
|
|||||||
#include "lib/lib_errors.h"
|
#include "lib/lib_errors.h"
|
||||||
#include "lib/vrf.h"
|
#include "lib/vrf.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Helper functions.
|
||||||
|
*/
|
||||||
|
static const char *isis_yang_adj_state(enum isis_adj_state state)
|
||||||
|
{
|
||||||
|
switch (state) {
|
||||||
|
case ISIS_ADJ_DOWN:
|
||||||
|
return "down";
|
||||||
|
case ISIS_ADJ_UP:
|
||||||
|
return "up";
|
||||||
|
case ISIS_ADJ_INITIALIZING:
|
||||||
|
return "init";
|
||||||
|
default:
|
||||||
|
return "failed";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* XPath: /frr-isisd:isis/instance
|
* XPath: /frr-isisd:isis/instance
|
||||||
*/
|
*/
|
||||||
@ -2303,6 +2320,169 @@ static int lib_interface_isis_multi_topology_ipv6_dstsrc_modify(
|
|||||||
ISIS_MT_IPV6_DSTSRC);
|
ISIS_MT_IPV6_DSTSRC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* XPath: /frr-interface:lib/interface/frr-isisd:isis/adjacencies/adjacency
|
||||||
|
*/
|
||||||
|
static const void *
|
||||||
|
lib_interface_isis_adjacencies_adjacency_get_next(const void *parent_list_entry,
|
||||||
|
const void *list_entry)
|
||||||
|
{
|
||||||
|
struct interface *ifp;
|
||||||
|
struct isis_circuit *circuit;
|
||||||
|
struct isis_adjacency *adj, *adj_next = NULL;
|
||||||
|
struct list *list;
|
||||||
|
struct listnode *node, *node_next;
|
||||||
|
|
||||||
|
/* Get first adjacency. */
|
||||||
|
if (list_entry == NULL) {
|
||||||
|
ifp = (struct interface *)parent_list_entry;
|
||||||
|
if (!ifp)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
circuit = circuit_scan_by_ifp(ifp);
|
||||||
|
if (!circuit)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
switch (circuit->circ_type) {
|
||||||
|
case CIRCUIT_T_BROADCAST:
|
||||||
|
for (int level = ISIS_LEVEL1; level <= ISIS_LEVELS;
|
||||||
|
level++) {
|
||||||
|
adj = listnode_head(
|
||||||
|
circuit->u.bc.adjdb[level - 1]);
|
||||||
|
if (adj)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CIRCUIT_T_P2P:
|
||||||
|
adj = circuit->u.p2p.neighbor;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
adj = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return adj;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get next adjacency. */
|
||||||
|
adj = (struct isis_adjacency *)list_entry;
|
||||||
|
circuit = adj->circuit;
|
||||||
|
switch (circuit->circ_type) {
|
||||||
|
case CIRCUIT_T_BROADCAST:
|
||||||
|
list = circuit->u.bc.adjdb[adj->level - 1];
|
||||||
|
node = listnode_lookup(list, adj);
|
||||||
|
node_next = listnextnode(node);
|
||||||
|
if (node_next)
|
||||||
|
adj_next = listgetdata(node_next);
|
||||||
|
else if (adj->level == ISIS_LEVEL1) {
|
||||||
|
/*
|
||||||
|
* Once we finish the L1 adjacencies, move to the L2
|
||||||
|
* adjacencies list.
|
||||||
|
*/
|
||||||
|
list = circuit->u.bc.adjdb[ISIS_LEVEL2 - 1];
|
||||||
|
adj_next = listnode_head(list);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CIRCUIT_T_P2P:
|
||||||
|
/* P2P circuits have at most one adjacency. */
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return adj_next;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* XPath:
|
||||||
|
* /frr-interface:lib/interface/frr-isisd:isis/adjacencies/adjacency/neighbor-sys-type
|
||||||
|
*/
|
||||||
|
static struct yang_data *
|
||||||
|
lib_interface_isis_adjacencies_adjacency_neighbor_sys_type_get_elem(
|
||||||
|
const char *xpath, const void *list_entry)
|
||||||
|
{
|
||||||
|
const struct isis_adjacency *adj = list_entry;
|
||||||
|
|
||||||
|
return yang_data_new_enum(xpath, adj->level);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* XPath:
|
||||||
|
* /frr-interface:lib/interface/frr-isisd:isis/adjacencies/adjacency/neighbor-sysid
|
||||||
|
*/
|
||||||
|
static struct yang_data *
|
||||||
|
lib_interface_isis_adjacencies_adjacency_neighbor_sysid_get_elem(
|
||||||
|
const char *xpath, const void *list_entry)
|
||||||
|
{
|
||||||
|
const struct isis_adjacency *adj = list_entry;
|
||||||
|
|
||||||
|
return yang_data_new_string(xpath, sysid_print(adj->sysid));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* XPath:
|
||||||
|
* /frr-interface:lib/interface/frr-isisd:isis/adjacencies/adjacency/neighbor-extended-circuit-id
|
||||||
|
*/
|
||||||
|
static struct yang_data *
|
||||||
|
lib_interface_isis_adjacencies_adjacency_neighbor_extended_circuit_id_get_elem(
|
||||||
|
const char *xpath, const void *list_entry)
|
||||||
|
{
|
||||||
|
const struct isis_adjacency *adj = list_entry;
|
||||||
|
|
||||||
|
return yang_data_new_uint32(xpath, adj->circuit->circuit_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* XPath:
|
||||||
|
* /frr-interface:lib/interface/frr-isisd:isis/adjacencies/adjacency/neighbor-snpa
|
||||||
|
*/
|
||||||
|
static struct yang_data *
|
||||||
|
lib_interface_isis_adjacencies_adjacency_neighbor_snpa_get_elem(
|
||||||
|
const char *xpath, const void *list_entry)
|
||||||
|
{
|
||||||
|
const struct isis_adjacency *adj = list_entry;
|
||||||
|
|
||||||
|
return yang_data_new_string(xpath, snpa_print(adj->snpa));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* XPath:
|
||||||
|
* /frr-interface:lib/interface/frr-isisd:isis/adjacencies/adjacency/hold-timer
|
||||||
|
*/
|
||||||
|
static struct yang_data *
|
||||||
|
lib_interface_isis_adjacencies_adjacency_hold_timer_get_elem(
|
||||||
|
const char *xpath, const void *list_entry)
|
||||||
|
{
|
||||||
|
const struct isis_adjacency *adj = list_entry;
|
||||||
|
|
||||||
|
return yang_data_new_uint16(xpath, adj->hold_time);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* XPath:
|
||||||
|
* /frr-interface:lib/interface/frr-isisd:isis/adjacencies/adjacency/neighbor-priority
|
||||||
|
*/
|
||||||
|
static struct yang_data *
|
||||||
|
lib_interface_isis_adjacencies_adjacency_neighbor_priority_get_elem(
|
||||||
|
const char *xpath, const void *list_entry)
|
||||||
|
{
|
||||||
|
const struct isis_adjacency *adj = list_entry;
|
||||||
|
|
||||||
|
return yang_data_new_uint8(xpath, adj->prio[adj->level - 1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* XPath:
|
||||||
|
* /frr-interface:lib/interface/frr-isisd:isis/adjacencies/adjacency/state
|
||||||
|
*/
|
||||||
|
static struct yang_data *
|
||||||
|
lib_interface_isis_adjacencies_adjacency_state_get_elem(const char *xpath,
|
||||||
|
const void *list_entry)
|
||||||
|
{
|
||||||
|
const struct isis_adjacency *adj = list_entry;
|
||||||
|
|
||||||
|
return yang_data_new_string(xpath, isis_yang_adj_state(adj->adj_state));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NOTIFICATIONS
|
* NOTIFICATIONS
|
||||||
*/
|
*/
|
||||||
@ -2545,19 +2725,7 @@ void isis_notif_adj_state_change(const struct isis_adjacency *adj,
|
|||||||
listnode_add(arguments, data);
|
listnode_add(arguments, data);
|
||||||
|
|
||||||
snprintf(xpath_arg, sizeof(xpath_arg), "%s/state", xpath);
|
snprintf(xpath_arg, sizeof(xpath_arg), "%s/state", xpath);
|
||||||
switch (new_state) {
|
data = yang_data_new_string(xpath_arg, isis_yang_adj_state(new_state));
|
||||||
case ISIS_ADJ_DOWN:
|
|
||||||
data = yang_data_new_string(xpath_arg, "down");
|
|
||||||
break;
|
|
||||||
case ISIS_ADJ_UP:
|
|
||||||
data = yang_data_new_string(xpath_arg, "up");
|
|
||||||
break;
|
|
||||||
case ISIS_ADJ_INITIALIZING:
|
|
||||||
data = yang_data_new_string(xpath_arg, "init");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
data = yang_data_new_string(xpath_arg, "failed");
|
|
||||||
}
|
|
||||||
listnode_add(arguments, data);
|
listnode_add(arguments, data);
|
||||||
if (new_state == ISIS_ADJ_DOWN) {
|
if (new_state == ISIS_ADJ_DOWN) {
|
||||||
snprintf(xpath_arg, sizeof(xpath_arg), "%s/reason", xpath);
|
snprintf(xpath_arg, sizeof(xpath_arg), "%s/reason", xpath);
|
||||||
@ -3483,6 +3651,54 @@ const struct frr_yang_module_info frr_isisd_info = {
|
|||||||
.modify = lib_interface_isis_multi_topology_ipv6_dstsrc_modify,
|
.modify = lib_interface_isis_multi_topology_ipv6_dstsrc_modify,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/adjacencies/adjacency",
|
||||||
|
.cbs = {
|
||||||
|
.get_next = lib_interface_isis_adjacencies_adjacency_get_next,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/adjacencies/adjacency/neighbor-sys-type",
|
||||||
|
.cbs = {
|
||||||
|
.get_elem = lib_interface_isis_adjacencies_adjacency_neighbor_sys_type_get_elem,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/adjacencies/adjacency/neighbor-sysid",
|
||||||
|
.cbs = {
|
||||||
|
.get_elem = lib_interface_isis_adjacencies_adjacency_neighbor_sysid_get_elem,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/adjacencies/adjacency/neighbor-extended-circuit-id",
|
||||||
|
.cbs = {
|
||||||
|
.get_elem = lib_interface_isis_adjacencies_adjacency_neighbor_extended_circuit_id_get_elem,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/adjacencies/adjacency/neighbor-snpa",
|
||||||
|
.cbs = {
|
||||||
|
.get_elem = lib_interface_isis_adjacencies_adjacency_neighbor_snpa_get_elem,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/adjacencies/adjacency/hold-timer",
|
||||||
|
.cbs = {
|
||||||
|
.get_elem = lib_interface_isis_adjacencies_adjacency_hold_timer_get_elem,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/adjacencies/adjacency/neighbor-priority",
|
||||||
|
.cbs = {
|
||||||
|
.get_elem = lib_interface_isis_adjacencies_adjacency_neighbor_priority_get_elem,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.xpath = "/frr-interface:lib/interface/frr-isisd:isis/adjacencies/adjacency/state",
|
||||||
|
.cbs = {
|
||||||
|
.get_elem = lib_interface_isis_adjacencies_adjacency_state_get_elem,
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.xpath = NULL,
|
.xpath = NULL,
|
||||||
},
|
},
|
||||||
|
@ -61,6 +61,13 @@ module frr-isisd {
|
|||||||
"This type defines IS-IS level of an object.";
|
"This type defines IS-IS level of an object.";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef extended-circuit-id {
|
||||||
|
type uint32;
|
||||||
|
description
|
||||||
|
"This type defines the extended circuit ID
|
||||||
|
associated with an interface.";
|
||||||
|
}
|
||||||
|
|
||||||
typedef network-type {
|
typedef network-type {
|
||||||
type enumeration {
|
type enumeration {
|
||||||
enum "unknown" {
|
enum "unknown" {
|
||||||
@ -95,6 +102,20 @@ module frr-isisd {
|
|||||||
pattern, An example LSP ID is 0143.0438.AeF0.02-01";
|
pattern, An example LSP ID is 0143.0438.AeF0.02-01";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef snpa {
|
||||||
|
type string {
|
||||||
|
length "0 .. 20";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"This type defines the Subnetwork Point
|
||||||
|
of Attachment (SNPA) format.
|
||||||
|
The SNPA should be encoded according to the rules
|
||||||
|
specified for the particular type of subnetwork
|
||||||
|
being used. As an example, for an ethernet subnetwork,
|
||||||
|
the SNPA is encoded as a MAC address like
|
||||||
|
'00aa.bbcc.ddee'.";
|
||||||
|
}
|
||||||
|
|
||||||
typedef system-id {
|
typedef system-id {
|
||||||
type string {
|
type string {
|
||||||
pattern "[0-9A-Fa-f]{4}\\.[0-9A-Fa-f]{4}\\.[0-9A-Fa-f]{4}";
|
pattern "[0-9A-Fa-f]{4}\\.[0-9A-Fa-f]{4}\\.[0-9A-Fa-f]{4}";
|
||||||
@ -544,6 +565,70 @@ module frr-isisd {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
grouping adjacency-state {
|
||||||
|
container adjacencies {
|
||||||
|
config false;
|
||||||
|
list adjacency {
|
||||||
|
leaf neighbor-sys-type {
|
||||||
|
type level;
|
||||||
|
description
|
||||||
|
"Level capability of neighboring system";
|
||||||
|
}
|
||||||
|
leaf neighbor-sysid {
|
||||||
|
type system-id;
|
||||||
|
description
|
||||||
|
"The system-id of the neighbor";
|
||||||
|
}
|
||||||
|
leaf neighbor-extended-circuit-id {
|
||||||
|
type extended-circuit-id;
|
||||||
|
description
|
||||||
|
"Circuit ID of the neighbor";
|
||||||
|
}
|
||||||
|
leaf neighbor-snpa {
|
||||||
|
type snpa;
|
||||||
|
description
|
||||||
|
"SNPA of the neighbor";
|
||||||
|
}
|
||||||
|
leaf hold-timer {
|
||||||
|
type uint16;
|
||||||
|
units seconds;
|
||||||
|
description
|
||||||
|
"The holding time in seconds for this
|
||||||
|
adjacency. This value is based on
|
||||||
|
received hello PDUs and the elapsed
|
||||||
|
time since receipt.";
|
||||||
|
}
|
||||||
|
leaf neighbor-priority {
|
||||||
|
type uint8 {
|
||||||
|
range "0 .. 127";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Priority of the neighboring IS for becoming
|
||||||
|
the DIS.";
|
||||||
|
}
|
||||||
|
leaf state {
|
||||||
|
type adj-state-type;
|
||||||
|
description
|
||||||
|
"This leaf describes the state of the interface.";
|
||||||
|
}
|
||||||
|
|
||||||
|
description
|
||||||
|
"List of operational adjacencies.";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"This container lists the adjacencies of
|
||||||
|
the local node.";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Adjacency state";
|
||||||
|
}
|
||||||
|
|
||||||
|
grouping interface-state {
|
||||||
|
description
|
||||||
|
"IS-IS interface operational state.";
|
||||||
|
uses adjacency-state;
|
||||||
|
}
|
||||||
|
|
||||||
grouping notification-instance-hdr {
|
grouping notification-instance-hdr {
|
||||||
description
|
description
|
||||||
"Instance specific IS-IS notification data grouping";
|
"Instance specific IS-IS notification data grouping";
|
||||||
@ -582,7 +667,7 @@ module frr-isisd {
|
|||||||
}
|
}
|
||||||
|
|
||||||
leaf extended-circuit-id {
|
leaf extended-circuit-id {
|
||||||
type uint32;
|
type extended-circuit-id;
|
||||||
description
|
description
|
||||||
"Eextended circuit-id of the interface.";
|
"Eextended circuit-id of the interface.";
|
||||||
}
|
}
|
||||||
@ -1003,6 +1088,7 @@ module frr-isisd {
|
|||||||
description
|
description
|
||||||
"IS-IS interface parameters.";
|
"IS-IS interface parameters.";
|
||||||
uses interface-config;
|
uses interface-config;
|
||||||
|
uses interface-state;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user