* id for OSPF and the ISO System id plus the IS-IS level for IS-IS.
*/
+/* external reference */
+struct zapi_opaque_reg_info;
+struct zclient;
+
/* Link State Common definitions */
#define MAX_NAME_LENGTH 256
#define ISO_SYS_ID_LEN 6
/* Type of Node */
enum ls_node_type {
+ NONE = 0, /* Unknown */
STANDARD, /* a P or PE node */
ABR, /* an Array Border Node */
ASBR, /* an Autonomous System Border Node */
- PSEUDO, /* a Pseudo Node */
+ RMT_ASBR, /* Remote ASBR */
+ PSEUDO /* a Pseudo Node */
};
/* Origin of the Link State information */
-enum ls_origin {NONE = 0, ISIS_L1, ISIS_L2, OSPFv2, DIRECT, STATIC};
+enum ls_origin { UNKNOWN = 0, ISIS_L1, ISIS_L2, OSPFv2, DIRECT, STATIC };
/**
* Link State Node Identifier as:
uint8_t level; /* ISIS Level */
uint8_t padding;
} iso;
- } id __attribute__((aligned(8)));
+ } id;
};
+/**
+ * Check if two Link State Node IDs are equal. Note that this routine has the
+ * same return value sense as '==' (which is different from a comparison).
+ *
+ * @param i1 First Link State Node Identifier
+ * @param i2 Second Link State Node Identifier
+ * @return 1 if equal, 0 otherwise
+ */
+extern int ls_node_id_same(struct ls_node_id i1, struct ls_node_id i2);
+
/* Link State flags to indicate which Node parameters are valid */
#define LS_NODE_UNSET 0x0000
#define LS_NODE_NAME 0x0001
struct ls_node_id adv; /* Adv. Router of this Link State */
char name[MAX_NAME_LENGTH]; /* Name of the Node (IS-IS only) */
struct in_addr router_id; /* IPv4 Router ID */
- struct in6_addr router6_id; /* IPv6 Router ID */
+ struct in6_addr router_id6; /* IPv6 Router ID */
uint8_t node_flag; /* IS-IS or OSPF Node flag */
- enum node_type type; /* Type of Node */
+ enum ls_node_type type; /* Type of Node */
uint32_t as_number; /* Local or neighbor AS number */
- struct { /* Segment Routing Global Block */
+ struct ls_srgb { /* Segment Routing Global Block */
uint32_t lower_bound; /* MPLS label lower bound */
uint32_t range_size; /* MPLS label range size */
uint8_t flag; /* IS-IS SRGB flags */
} srgb;
-#define LS_NODE_SRGB_SIZE 9
- struct { /* Segment Routing Local Block */
+ struct ls_srlb { /* Segment Routing Local Block */
uint32_t lower_bound; /* MPLS label lower bound */
uint32_t range_size; /* MPLS label range size */
} srlb;
-#define LS_NODE_SRLB_SIZE 8
uint8_t algo[2]; /* Segment Routing Algorithms */
uint8_t msd; /* Maximum Stack Depth */
};
#define LS_ATTR_AVA_BW 0x00100000
#define LS_ATTR_RSV_BW 0x00200000
#define LS_ATTR_USE_BW 0x00400000
-#define LS_ATTR_ADJ_SID 0x00800000
-#define LS_ATTR_BCK_ADJ_SID 0x01000000
-#define LS_ATTR_SRLG 0x02000000
+#define LS_ATTR_ADJ_SID 0x01000000
+#define LS_ATTR_BCK_ADJ_SID 0x02000000
+#define LS_ATTR_ADJ_SID6 0x04000000
+#define LS_ATTR_BCK_ADJ_SID6 0x08000000
+#define LS_ATTR_SRLG 0x10000000
/* Link State Attributes */
struct ls_attributes {
uint32_t flags; /* Flag for parameters validity */
struct ls_node_id adv; /* Adv. Router of this Link State */
char name[MAX_NAME_LENGTH]; /* Name of the Edge. Could be null */
- struct { /* Standard TE metrics */
- uint32_t metric; /* IGP standard metric */
+ uint32_t metric; /* IGP standard metric */
+ struct ls_standard { /* Standard TE metrics */
uint32_t te_metric; /* Traffic Engineering metric */
uint32_t admin_group; /* Administrative Group */
struct in_addr local; /* Local IPv4 address */
struct in_addr remote_addr; /* Remote IPv4 address */
struct in6_addr remote_addr6; /* Remote IPv6 address */
} standard;
-#define LS_ATTR_STANDARD_SIZE 124
- struct { /* Extended TE Metrics */
+ struct ls_extended { /* Extended TE Metrics */
uint32_t delay; /* Unidirectional average delay */
uint32_t min_delay; /* Unidirectional minimum delay */
uint32_t max_delay; /* Unidirectional maximum delay */
float rsv_bw; /* Reserved Bandwidth */
float used_bw; /* Utilized Bandwidth */
} extended;
-#define LS_ATTR_EXTENDED_SIZE 32
- struct { /* (LAN)-Adjacency SID for OSPF */
+#define ADJ_PRI_IPV4 0
+#define ADJ_BCK_IPV4 1
+#define ADJ_PRI_IPV6 2
+#define ADJ_BCK_IPV6 3
+#define LS_ADJ_MAX 4
+ struct ls_adjacency { /* (LAN)-Adjacency SID for OSPF */
uint32_t sid; /* SID as MPLS label or index */
uint8_t flags; /* Flags */
uint8_t weight; /* Administrative weight */
struct in_addr addr; /* Neighbor @IP for OSPF */
uint8_t sysid[ISO_SYS_ID_LEN]; /* or Sys-ID for ISIS */
} neighbor;
- } adj_sid[2]; /* Primary & Backup (LAN)-Adj. SID */
-#define LS_ATTR_ADJ_SID_SIZE 120
+ } adj_sid[4]; /* IPv4/IPv6 & Primary/Backup (LAN)-Adj. SID */
uint32_t *srlgs; /* List of Shared Risk Link Group */
uint8_t srlg_len; /* number of SRLG in the list */
};
uint32_t route_tag; /* IGP Route Tag */
uint64_t extended_tag; /* IGP Extended Route Tag */
uint32_t metric; /* Route metric for this prefix */
- struct {
+ struct ls_sid {
uint32_t sid; /* Segment Routing ID */
uint8_t sid_flag; /* Segment Routing Flags */
uint8_t algo; /* Algorithm for Segment Routing */
struct in6_addr local6,
uint32_t local_id);
+/**
+ * Remove SRLGs from Link State Attributes if defined.
+ *
+ * @param attr Pointer to a valid Link State Attribute structure
+ */
+extern void ls_attributes_srlg_del(struct ls_attributes *attr);
+
/**
* Remove Link State Attributes. Data structure is freed.
*
- * @param attr Pointer to a valid Link State Attribute structure
+ * @param attr Pointer to a valid Link State Attribute structure
*/
extern void ls_attributes_del(struct ls_attributes *attr);
extern int ls_attributes_same(struct ls_attributes *a1,
struct ls_attributes *a2);
+/**
+ * Create a new Link State Prefix. Structure is dynamically allocated.
+ *
+ * @param adv Mandatory Link State Node ID i.e. advertise router ID
+ * @param p Mandatory Prefix
+ *
+ * @return New Link State Prefix
+ */
+extern struct ls_prefix *ls_prefix_new(struct ls_node_id adv, struct prefix p);
+
+/**
+ * Remove Link State Prefix. Data Structure is freed.
+ *
+ * @param pref Pointer to a valid Link State Attribute Prefix.
+ */
+extern void ls_prefix_del(struct ls_prefix *pref);
+
+/**
+ * Check if two Link State Prefix are equal. Note that this routine has the
+ * same return value sense as '==' (which is different from a comparison).
+ *
+ * @param p1 First Link State Prefix to be compare
+ * @param p2 Second Link State Prefix to be compare
+ *
+ * @return 1 if equal, 0 otherwise
+ */
+extern int ls_prefix_same(struct ls_prefix *p1, struct ls_prefix *p2);
+
/**
* In addition a Graph model is defined as an overlay on top of link state
* database in order to ease Path Computation algorithm implementation.
*
*/
+enum ls_status { UNSET = 0, NEW, UPDATE, DELETE, SYNC, ORPHAN };
+enum ls_type { GENERIC = 0, VERTEX, EDGE, SUBNET };
+
/* Link State Vertex structure */
-PREDECL_RBTREE_UNIQ(vertices)
+PREDECL_RBTREE_UNIQ(vertices);
struct ls_vertex {
+ enum ls_type type; /* Link State Type */
+ enum ls_status status; /* Status of the Vertex in the TED */
struct vertices_item entry; /* Entry in RB Tree */
uint64_t key; /* Unique Key identifier */
struct ls_node *node; /* Link State Node */
};
/* Link State Edge structure */
-PREDECL_RBTREE_UNIQ(edges)
+PREDECL_RBTREE_UNIQ(edges);
struct ls_edge {
+ enum ls_type type; /* Link State Type */
+ enum ls_status status; /* Status of the Edge in the TED */
struct edges_item entry; /* Entry in RB tree */
uint64_t key; /* Unique Key identifier */
struct ls_attributes *attributes; /* Link State attributes */
};
/* Link State Subnet structure */
-PREDECL_RBTREE_UNIQ(subnets)
+PREDECL_RBTREE_UNIQ(subnets);
struct ls_subnet {
+ enum ls_type type; /* Link State Type */
+ enum ls_status status; /* Status of the Subnet in the TED */
struct subnets_item entry; /* Entry in RB tree */
struct prefix key; /* Unique Key identifier */
- struct ls_vertex *vertex; /* Back pointer to the Vertex owner */
struct ls_prefix *ls_pref; /* Link State Prefix */
+ struct ls_vertex *vertex; /* Back pointer to the Vertex owner */
};
/* Declaration of Vertices, Edges and Prefixes RB Trees */
macro_inline int vertex_cmp(const struct ls_vertex *node1,
const struct ls_vertex *node2)
{
- return (node1->key - node2->key);
+ return numcmp(node1->key, node2->key);
}
-DECLARE_RBTREE_UNIQ(vertices, struct ls_vertex, entry, vertex_cmp)
+DECLARE_RBTREE_UNIQ(vertices, struct ls_vertex, entry, vertex_cmp);
macro_inline int edge_cmp(const struct ls_edge *edge1,
const struct ls_edge *edge2)
{
- return (edge1->key - edge2->key);
+ return numcmp(edge1->key, edge2->key);
}
-DECLARE_RBTREE_UNIQ(edges, struct ls_edge, entry, edge_cmp)
+DECLARE_RBTREE_UNIQ(edges, struct ls_edge, entry, edge_cmp);
+/*
+ * Prefix comparison are done to the host part so, 10.0.0.1/24
+ * and 10.0.0.2/24 are considered come different
+ */
macro_inline int subnet_cmp(const struct ls_subnet *a,
- const struct ls_subnet *b)
+ const struct ls_subnet *b)
{
- return prefix_cmp(&a->key, &b->key);
+ if (a->key.family != b->key.family)
+ return numcmp(a->key.family, b->key.family);
+
+ if (a->key.prefixlen != b->key.prefixlen)
+ return numcmp(a->key.prefixlen, b->key.prefixlen);
+
+ if (a->key.family == AF_INET)
+ return memcmp(&a->key.u.val, &b->key.u.val, 4);
+
+ return memcmp(&a->key.u.val, &b->key.u.val, 16);
}
-DECLARE_RBTREE_UNIQ(subnets, struct ls_subnet, entry, subnet_cmp)
+DECLARE_RBTREE_UNIQ(subnets, struct ls_subnet, entry, subnet_cmp);
/* Link State TED Structure */
struct ls_ted {
struct subnets_head subnets; /* List of Subnets */
};
+/* Generic Link State Element */
+struct ls_element {
+ enum ls_type type; /* Link State Element Type */
+ enum ls_status status; /* Link State Status in the TED */
+ void *data; /* Link State payload */
+};
+
/**
- * Create a new Link State Vertex structure and initialize is with the Link
- * State Node parameter.
+ * Add new vertex to the Link State DB. Vertex is created from the Link State
+ * Node. Vertex data structure is dynamically allocated.
*
+ * @param ted Traffic Engineering Database structure
* @param node Link State Node
*
- * @return New Vertex
+ * @return New Vertex or NULL in case of error
*/
-extern struct ls_vertex *ls_vertex_new(struct ls_node *node);
+extern struct ls_vertex *ls_vertex_add(struct ls_ted *ted,
+ struct ls_node *node);
/**
* Delete Link State Vertex. This function clean internal Vertex lists (incoming
- * and outgoing Link State Edge and Link State Subnet). Note that referenced
- * objects of the different lists (Edges & SubNet) are not removed as they could
- * be connected to other Vertices.
+ * and outgoing Link State Edge and Link State Subnet). Vertex Data structure
+ * is freed but not the Link State Node. Link State DB is not modified if Vertex
+ * is NULL or not found in the Data Base. Note that referenced to Link State
+ * Edges & SubNets are not removed as they could be connected to other Vertices.
*
+ * @param ted Traffic Engineering Database structure
* @param vertex Link State Vertex to be removed
*/
-extern void ls_vertex_del(struct ls_vertex *vertex);
+extern void ls_vertex_del(struct ls_ted *ted, struct ls_vertex *vertex);
/**
- * Add new vertex to the Link State DB. Vertex is created from the Link State
- * Node. Vertex data structure is dynamically allocated.
- *
- * @param ted Traffic Engineering Database structure
- * @param node Link State Node
+ * Delete Link State Vertex as ls_vertex_del() but also removed associated
+ * Link State Node.
*
- * @return New Vertex or NULL in case of error
+ * @param ted Traffic Engineering Database structure
+ * @param vertex Link State Vertex to be removed
*/
-extern struct ls_vertex *ls_vertex_add(struct ls_ted *ted,
- struct ls_node *node);
+extern void ls_vertex_del_all(struct ls_ted *ted, struct ls_vertex *vertex);
/**
* Update Vertex with the Link State Node. A new vertex is created if no one
struct ls_node *node);
/**
- * Remove Vertex from the Link State DB. Vertex Data structure is freed but
- * not the Link State Node. Link State DB is not modified if Vertex is NULL or
- * not found in the Data Base.
+ * Clean Vertex structure by removing all Edges and Subnets marked as ORPHAN
+ * from this vertex. Link State Update message is sent if zclient is not NULL.
*
* @param ted Link State Data Base
- * @param vertex Vertex to be removed
+ * @param vertex Link State Vertex to be cleaned
+ * @param zclient Reference to Zebra Client
*/
-extern void ls_vertex_remove(struct ls_ted *ted, struct ls_vertex *vertex);
+extern void ls_vertex_clean(struct ls_ted *ted, struct ls_vertex *vertex,
+ struct zclient *zclient);
+
+/**
+ * This function convert the ISIS ISO system ID into a 64 bits unsigned integer
+ * following the architecture dependent byte order.
+ *
+ * @param sysid The ISO system ID
+ * @return Key as 64 bits unsigned integer
+ */
+extern uint64_t sysid_to_key(const uint8_t sysid[ISO_SYS_ID_LEN]);
/**
* Find Vertex in the Link State DB by its unique key.
extern struct ls_edge *ls_edge_update(struct ls_ted *ted,
struct ls_attributes *attributes);
+/**
+ * Check if two Edges are equal. Note that this routine has the same return
+ * value sense as '==' (which is different from a comparison).
+ *
+ * @param e1 First edge to compare
+ * @param e2 Second edge to compare
+ *
+ * @return 1 if equal, 0 otherwise
+ */
+extern int ls_edge_same(struct ls_edge *e1, struct ls_edge *e2);
+
/**
* Remove Edge from the Link State DB. Edge data structure is freed but not the
* Link State Attributes data structure. Link State DB is not modified if Edge
*/
extern void ls_edge_del(struct ls_ted *ted, struct ls_edge *edge);
+/**
+ * Remove Edge and associated Link State Attributes from the Link State DB.
+ * Link State DB is not modified if Edge is NULL or not found.
+ *
+ * @param ted Link State Data Base
+ * @param edge Edge to be removed
+ */
+extern void ls_edge_del_all(struct ls_ted *ted, struct ls_edge *edge);
+
/**
* Find Edge in the Link State Data Base by Edge key.
*
/**
* Find Edge in the Link State Data Base by the source (local IPv4 or IPv6
- * address or local ID) informations of the Link
- * State Attributes
+ * address or local ID) informations of the Link State Attributes
*
* @param ted Link State Data Base
* @param attributes Link State Attributes
extern struct ls_subnet *ls_subnet_add(struct ls_ted *ted,
struct ls_prefix *pref);
+/**
+ * Update the Link State Prefix information of an existing Subnet. If there is
+ * no corresponding Subnet in the Link State Data Base, a new Subnet is created.
+ *
+ * @param ted Link State Data Base
+ * @param pref Link State Prefix
+ *
+ * @return Updated Link State Subnet, or NULL in case of error
+ */
+extern struct ls_subnet *ls_subnet_update(struct ls_ted *ted,
+ struct ls_prefix *pref);
+
+/**
+ * Check if two Subnets are equal. Note that this routine has the same return
+ * value sense as '==' (which is different from a comparison).
+ *
+ * @param s1 First subnet to compare
+ * @param s2 Second subnet to compare
+ *
+ * @return 1 if equal, 0 otherwise
+ */
+extern int ls_subnet_same(struct ls_subnet *s1, struct ls_subnet *s2);
+
/**
* Remove Subnet from the Link State DB. Subnet data structure is freed but
* not the Link State prefix data structure. Link State DB is not modified
*/
extern void ls_subnet_del(struct ls_ted *ted, struct ls_subnet *subnet);
+/**
+ * Remove Subnet and the associated Link State Prefix from the Link State DB.
+ * Link State DB is not modified if Subnet is NULL or not found.
+ *
+ * @param ted Link State Data Base
+ * @param subnet Subnet to be removed
+ */
+extern void ls_subnet_del_all(struct ls_ted *ted, struct ls_subnet *subnet);
+
/**
* Find Subnet in the Link State Data Base by prefix.
*
*
* @param key Unique key of the data base. Must be different from 0
* @param name Name of the data base (may be NULL)
- * @param asn AS Number for this data base. Must be different from 0
+ * @param asn AS Number for this data base. 0 if unknown
*
* @return New Link State Database or NULL in case of error
*/
uint32_t asn);
/**
- * Delete existing Link State Data Base.
+ * Delete existing Link State Data Base. Vertices, Edges, and Subnets are not
+ * removed.
*
* @param ted Link State Data Base
*/
extern void ls_ted_del(struct ls_ted *ted);
+/**
+ * Delete all Link State Vertices, Edges and SubNets and the Link State DB.
+ *
+ * @param ted Link State Data Base
+ */
+extern void ls_ted_del_all(struct ls_ted **ted);
+
+/**
+ * Clean Link State Data Base by removing all Vertices, Edges and SubNets marked
+ * as ORPHAN.
+ *
+ * @param ted Link State Data Base
+ */
+extern void ls_ted_clean(struct ls_ted *ted);
+
/**
* Connect Source and Destination Vertices by given Edge. Only non NULL source
* and destination vertices are connected.
*/
/* ZAPI Opaque Link State Message Event */
+#define LS_MSG_EVENT_UNDEF 0
#define LS_MSG_EVENT_SYNC 1
#define LS_MSG_EVENT_ADD 2
#define LS_MSG_EVENT_UPDATE 3
} data;
};
+/**
+ * Register Link State daemon as a server or client for Zebra OPAQUE API.
+ *
+ * @param zclient Zebra client structure
+ * @param server Register daemon as a server (true) or as a client (false)
+ *
+ * @return 0 if success, -1 otherwise
+ */
+extern int ls_register(struct zclient *zclient, bool server);
+
+/**
+ * Unregister Link State daemon as a server or client for Zebra OPAQUE API.
+ *
+ * @param zclient Zebra client structure
+ * @param server Unregister daemon as a server (true) or as a client (false)
+ *
+ * @return 0 if success, -1 otherwise
+ */
+extern int ls_unregister(struct zclient *zclient, bool server);
+
+/**
+ * Send Link State SYNC message to request the complete Link State Database.
+ *
+ * @param zclient Zebra client
+ *
+ * @return 0 if success, -1 otherwise
+ */
+extern int ls_request_sync(struct zclient *zclient);
+
/**
* Parse Link State Message from stream. Used this function once receiving a
* new ZAPI Opaque message of type Link State.
extern struct ls_message *ls_parse_msg(struct stream *s);
/**
- * Delete existing message, freeing all substructure.
+ * Delete existing message. Data structure is freed.
*
* @param msg Link state message to be deleted
*/
extern struct ls_message *ls_subnet2msg(struct ls_message *msg,
struct ls_subnet *subnet);
+/**
+ * Convert Link State Message into Vertex and update TED accordingly to
+ * the message event: SYNC, ADD, UPDATE or DELETE.
+ *
+ * @param ted Link State Database
+ * @param msg Link State Message
+ * @param delete True to delete the Link State Vertex from the Database,
+ * False otherwise. If true, return value is NULL in case
+ * of deletion.
+ *
+ * @return Vertex if success, NULL otherwise or if Vertex is removed
+ */
+extern struct ls_vertex *ls_msg2vertex(struct ls_ted *ted,
+ struct ls_message *msg, bool delete);
+
+/**
+ * Convert Link State Message into Edge and update TED accordingly to
+ * the message event: SYNC, ADD, UPDATE or DELETE.
+ *
+ * @param ted Link State Database
+ * @param msg Link State Message
+ * @param delete True to delete the Link State Edge from the Database,
+ * False otherwise. If true, return value is NULL in case
+ * of deletion.
+ *
+ * @return Edge if success, NULL otherwise or if Edge is removed
+ */
+extern struct ls_edge *ls_msg2edge(struct ls_ted *ted, struct ls_message *msg,
+ bool delete);
+
+/**
+ * Convert Link State Message into Subnet and update TED accordingly to
+ * the message event: SYNC, ADD, UPDATE or DELETE.
+ *
+ * @param ted Link State Database
+ * @param msg Link State Message
+ * @param delete True to delete the Link State Subnet from the Database,
+ * False otherwise. If true, return value is NULL in case
+ * of deletion.
+ *
+ * @return Subnet if success, NULL otherwise or if Subnet is removed
+ */
+extern struct ls_subnet *ls_msg2subnet(struct ls_ted *ted,
+ struct ls_message *msg, bool delete);
+
+/**
+ * Convert Link State Message into Link State element (Vertex, Edge or Subnet)
+ * and update TED accordingly to the message event: SYNC, ADD, UPDATE or DELETE.
+ *
+ * @param ted Link State Database
+ * @param msg Link State Message
+ * @param delete True to delete the Link State Element from the Database,
+ * False otherwise. If true, return value is NULL in case
+ * of deletion.
+ *
+ * @return Element if success, NULL otherwise or if Element is removed
+ */
+extern struct ls_element *ls_msg2ted(struct ls_ted *ted, struct ls_message *msg,
+ bool delete);
+
+/**
+ * Convert stream buffer into Link State element (Vertex, Edge or Subnet) and
+ * update TED accordingly to the message event: SYNC, ADD, UPDATE or DELETE.
+ *
+ * @param ted Link State Database
+ * @param s Stream buffer
+ * @param delete True to delete the Link State Element from the Database,
+ * False otherwise. If true, return value is NULL in case
+ * of deletion.
+ *
+ * @return Element if success, NULL otherwise or if Element is removed
+ */
+extern struct ls_element *ls_stream2ted(struct ls_ted *ted, struct stream *s,
+ bool delete);
+
/**
* Send all the content of the Link State Data Base to the given destination.
* Link State content is sent is this order: Vertices, Edges, Subnet.
extern int ls_sync_ted(struct ls_ted *ted, struct zclient *zclient,
struct zapi_opaque_reg_info *dst);
+struct json_object;
+struct vty;
+/**
+ * Show Link State Vertex information. If both vty and json are specified,
+ * Json format output supersedes standard vty output.
+ *
+ * @param vertex Link State Vertex to show. Must not be NULL
+ * @param vty Pointer to vty output, could be NULL
+ * @param json Pointer to json output, could be NULL
+ * @param verbose Set to true for more detail
+ */
+extern void ls_show_vertex(struct ls_vertex *vertex, struct vty *vty,
+ struct json_object *json, bool verbose);
+
+/**
+ * Show all Link State Vertices information. If both vty and json are specified,
+ * Json format output supersedes standard vty output.
+ *
+ * @param ted Link State Data Base. Must not be NULL
+ * @param vty Pointer to vty output, could be NULL
+ * @param json Pointer to json output, could be NULL
+ * @param verbose Set to true for more detail
+ */
+extern void ls_show_vertices(struct ls_ted *ted, struct vty *vty,
+ struct json_object *json, bool verbose);
+
+/**
+ * Show Link State Edge information. If both vty and json are specified,
+ * Json format output supersedes standard vty output.
+ *
+ * @param edge Link State Edge to show. Must not be NULL
+ * @param vty Pointer to vty output, could be NULL
+ * @param json Pointer to json output, could be NULL
+ * @param verbose Set to true for more detail
+ */
+extern void ls_show_edge(struct ls_edge *edge, struct vty *vty,
+ struct json_object *json, bool verbose);
+
+/**
+ * Show all Link State Edges information. If both vty and json are specified,
+ * Json format output supersedes standard vty output.
+ *
+ * @param ted Link State Data Base. Must not be NULL
+ * @param vty Pointer to vty output, could be NULL
+ * @param json Pointer to json output, could be NULL
+ * @param verbose Set to true for more detail
+ */
+extern void ls_show_edges(struct ls_ted *ted, struct vty *vty,
+ struct json_object *json, bool verbose);
+
+/**
+ * Show Link State Subnets information. If both vty and json are specified,
+ * Json format output supersedes standard vty output.
+ *
+ * @param subnet Link State Subnet to show. Must not be NULL
+ * @param vty Pointer to vty output, could be NULL
+ * @param json Pointer to json output, could be NULL
+ * @param verbose Set to true for more detail
+ */
+extern void ls_show_subnet(struct ls_subnet *subnet, struct vty *vty,
+ struct json_object *json, bool verbose);
+
+/**
+ * Show all Link State Subnet information. If both vty and json are specified,
+ * Json format output supersedes standard vty output.
+ *
+ * @param ted Link State Data Base. Must not be NULL
+ * @param vty Pointer to vty output, could be NULL
+ * @param json Pointer to json output, could be NULL
+ * @param verbose Set to true for more detail
+ */
+extern void ls_show_subnets(struct ls_ted *ted, struct vty *vty,
+ struct json_object *json, bool verbose);
+
+/**
+ * Show Link State Data Base information. If both vty and json are specified,
+ * Json format output supersedes standard vty output.
+ *
+ * @param ted Link State Data Base to show. Must not be NULL
+ * @param vty Pointer to vty output, could be NULL
+ * @param json Pointer to json output, could be NULL
+ * @param verbose Set to true for more detail
+ */
+extern void ls_show_ted(struct ls_ted *ted, struct vty *vty,
+ struct json_object *json, bool verbose);
+
/**
* Dump all Link State Data Base elements for debugging purposes
*