diff options
Diffstat (limited to 'ospfd/ospf_ri.c')
| -rw-r--r-- | ospfd/ospf_ri.c | 2350 | 
1 files changed, 1138 insertions, 1212 deletions
diff --git a/ospfd/ospf_ri.c b/ospfd/ospf_ri.c index 883ea7cad9..70f5bda76c 100644 --- a/ospfd/ospf_ri.c +++ b/ospfd/ospf_ri.c @@ -39,7 +39,7 @@  #include "log.h"  #include "thread.h"  #include "hash.h" -#include "sockunion.h"          /* for inet_aton() */ +#include "sockunion.h" /* for inet_aton() */  #include "ospfd/ospfd.h"  #include "ospfd/ospf_interface.h" @@ -59,41 +59,39 @@  #include "ospfd/ospf_ri.h"  #include "ospfd/ospf_te.h" -struct ospf_pce_info -{ +struct ospf_pce_info { -  /* Store Router Information PCE TLV and SubTLV in network byte order. */ -  struct ri_tlv_pce pce_header; -  struct ri_pce_subtlv_address pce_address; -  struct ri_pce_subtlv_path_scope pce_scope; -  struct list *pce_domain; -  struct list *pce_neighbor; -  struct ri_pce_subtlv_cap_flag pce_cap_flag; +	/* Store Router Information PCE TLV and SubTLV in network byte order. */ +	struct ri_tlv_pce pce_header; +	struct ri_pce_subtlv_address pce_address; +	struct ri_pce_subtlv_path_scope pce_scope; +	struct list *pce_domain; +	struct list *pce_neighbor; +	struct ri_pce_subtlv_cap_flag pce_cap_flag;  };  /* Following structure are internal use only. */ -struct ospf_router_info -{ -  status_t status; +struct ospf_router_info { +	status_t status; -  u_int8_t registered; -  u_int8_t scope; +	u_int8_t registered; +	u_int8_t scope; -  /* Flags to manage this router information. */ +/* Flags to manage this router information. */  #define RIFLG_LOOKUP_DONE			0x1  #define RIFLG_LSA_ENGAGED			0x2  #define RIFLG_LSA_FORCED_REFRESH	0x4 -  u_int32_t flags; +	u_int32_t flags; -  /* area pointer if flooding is Type 10 Null if flooding is AS scope */ -  struct ospf_area *area; -  struct in_addr area_id; +	/* area pointer if flooding is Type 10 Null if flooding is AS scope */ +	struct ospf_area *area; +	struct in_addr area_id; -  /* Store Router Information Capabilities LSA */ -  struct ri_tlv_router_cap router_cap; +	/* Store Router Information Capabilities LSA */ +	struct ri_tlv_router_cap router_cap; -  /* Store PCE capability LSA */ -  struct ospf_pce_info pce_info; +	/* Store PCE capability LSA */ +	struct ospf_pce_info pce_info;  };  /* @@ -103,1071 +101,1011 @@ struct ospf_router_info  static struct ospf_router_info OspfRI;  /*------------------------------------------------------------------------------* - * Followings are initialize/terminate functions for Router Information handling. + * Followings are initialize/terminate functions for Router Information + *handling.   *------------------------------------------------------------------------------*/ -static void ospf_router_info_ism_change (struct ospf_interface *oi, -                                         int old_status); -static void ospf_router_info_nsm_change (struct ospf_neighbor *nbr, -                                         int old_status); -static void ospf_router_info_config_write_router (struct vty *vty); -static void ospf_router_info_show_info (struct vty *vty, -                                        struct ospf_lsa *lsa); -static int ospf_router_info_lsa_originate (void *arg); -static struct ospf_lsa *ospf_router_info_lsa_refresh (struct ospf_lsa *lsa); -static void ospf_router_info_lsa_schedule (opcode_t opcode); -static void ospf_router_info_register_vty (void); -static void del_pce_info (void *val); - -int -ospf_router_info_init (void) +static void ospf_router_info_ism_change(struct ospf_interface *oi, +					int old_status); +static void ospf_router_info_nsm_change(struct ospf_neighbor *nbr, +					int old_status); +static void ospf_router_info_config_write_router(struct vty *vty); +static void ospf_router_info_show_info(struct vty *vty, struct ospf_lsa *lsa); +static int ospf_router_info_lsa_originate(void *arg); +static struct ospf_lsa *ospf_router_info_lsa_refresh(struct ospf_lsa *lsa); +static void ospf_router_info_lsa_schedule(opcode_t opcode); +static void ospf_router_info_register_vty(void); +static void del_pce_info(void *val); + +int ospf_router_info_init(void)  { -  memset (&OspfRI, 0, sizeof (struct ospf_router_info)); -  OspfRI.status = disabled; -  OspfRI.registered = 0; -  OspfRI.scope = OSPF_OPAQUE_AS_LSA; -  OspfRI.flags = 0; +	memset(&OspfRI, 0, sizeof(struct ospf_router_info)); +	OspfRI.status = disabled; +	OspfRI.registered = 0; +	OspfRI.scope = OSPF_OPAQUE_AS_LSA; +	OspfRI.flags = 0; -  /* Initialize pce domain and neighbor list */ -  OspfRI.pce_info.pce_domain = list_new (); -  OspfRI.pce_info.pce_domain->del = del_pce_info; -  OspfRI.pce_info.pce_neighbor = list_new (); -  OspfRI.pce_info.pce_neighbor->del = del_pce_info; +	/* Initialize pce domain and neighbor list */ +	OspfRI.pce_info.pce_domain = list_new(); +	OspfRI.pce_info.pce_domain->del = del_pce_info; +	OspfRI.pce_info.pce_neighbor = list_new(); +	OspfRI.pce_info.pce_neighbor->del = del_pce_info; -  ospf_router_info_register_vty (); +	ospf_router_info_register_vty(); -  return 0; +	return 0;  } -static int -ospf_router_info_register (u_int8_t scope) +static int ospf_router_info_register(u_int8_t scope)  { -  int rc = 0; - -  if (OspfRI.registered) -    return 0; - -  zlog_info ("Register Router Information with scope %s(%d)", -             scope == OSPF_OPAQUE_AREA_LSA ? "Area" : "AS", scope); -  rc = ospf_register_opaque_functab (scope, -                                     OPAQUE_TYPE_ROUTER_INFORMATION_LSA, -                                     NULL,    /* new interface */ -                                     NULL,    /* del interface */ -                                     ospf_router_info_ism_change, -                                     ospf_router_info_nsm_change, -                                     ospf_router_info_config_write_router, -                                     NULL,    /* Config. write interface */ -                                     NULL,    /* Config. write debug */ -                                     ospf_router_info_show_info, -                                     ospf_router_info_lsa_originate, -                                     ospf_router_info_lsa_refresh, -                                     NULL,    /* new_lsa_hook */ -                                     NULL);   /* del_lsa_hook */ - -  if (rc != 0) -    { -      zlog_warn ("ospf_router_info_init: Failed to register functions"); -      return rc; -    } - -  OspfRI.registered = 1; -  OspfRI.scope = scope; -  return 0; +	int rc = 0; + +	if (OspfRI.registered) +		return 0; + +	zlog_info("Register Router Information with scope %s(%d)", +		  scope == OSPF_OPAQUE_AREA_LSA ? "Area" : "AS", scope); +	rc = ospf_register_opaque_functab( +		scope, OPAQUE_TYPE_ROUTER_INFORMATION_LSA, +		NULL, /* new interface */ +		NULL, /* del interface */ +		ospf_router_info_ism_change, ospf_router_info_nsm_change, +		ospf_router_info_config_write_router, +		NULL, /* Config. write interface */ +		NULL, /* Config. write debug */ +		ospf_router_info_show_info, ospf_router_info_lsa_originate, +		ospf_router_info_lsa_refresh, NULL, /* new_lsa_hook */ +		NULL);				    /* del_lsa_hook */ + +	if (rc != 0) { +		zlog_warn( +			"ospf_router_info_init: Failed to register functions"); +		return rc; +	} + +	OspfRI.registered = 1; +	OspfRI.scope = scope; +	return 0;  } -static int -ospf_router_info_unregister () +static int ospf_router_info_unregister()  { -  if ((OspfRI.scope != OSPF_OPAQUE_AS_LSA) -      && (OspfRI.scope != OSPF_OPAQUE_AREA_LSA)) -    { -      zlog_warn ("Unable to unregister Router Info functions: Wrong scope!"); -      return -1; -    } - -  ospf_delete_opaque_functab (OspfRI.scope, -                              OPAQUE_TYPE_ROUTER_INFORMATION_LSA); +	if ((OspfRI.scope != OSPF_OPAQUE_AS_LSA) +	    && (OspfRI.scope != OSPF_OPAQUE_AREA_LSA)) { +		zlog_warn( +			"Unable to unregister Router Info functions: Wrong scope!"); +		return -1; +	} -  OspfRI.registered = 0; -  return 0; +	ospf_delete_opaque_functab(OspfRI.scope, +				   OPAQUE_TYPE_ROUTER_INFORMATION_LSA); +	OspfRI.registered = 0; +	return 0;  } -void -ospf_router_info_term (void) +void ospf_router_info_term(void)  { -  list_delete (OspfRI.pce_info.pce_domain); -  list_delete (OspfRI.pce_info.pce_neighbor); +	list_delete(OspfRI.pce_info.pce_domain); +	list_delete(OspfRI.pce_info.pce_neighbor); -  OspfRI.pce_info.pce_domain = NULL; -  OspfRI.pce_info.pce_neighbor = NULL; -  OspfRI.status = disabled; +	OspfRI.pce_info.pce_domain = NULL; +	OspfRI.pce_info.pce_neighbor = NULL; +	OspfRI.status = disabled; -  ospf_router_info_unregister (); +	ospf_router_info_unregister(); -  return; +	return;  } -static void -del_pce_info (void *val) +static void del_pce_info(void *val)  { -  XFREE (MTYPE_OSPF_PCE_PARAMS, val); -  return; +	XFREE(MTYPE_OSPF_PCE_PARAMS, val); +	return;  }  /*------------------------------------------------------------------------* - * Followings are control functions for ROUTER INFORMATION parameters management. + * Followings are control functions for ROUTER INFORMATION parameters + *management.   *------------------------------------------------------------------------*/ -static void -set_router_info_capabilities (struct ri_tlv_router_cap *ric, u_int32_t cap) +static void set_router_info_capabilities(struct ri_tlv_router_cap *ric, +					 u_int32_t cap)  { -  ric->header.type = htons (RI_TLV_CAPABILITIES); -  ric->header.length = htons (RI_TLV_LENGTH); -  ric->value = htonl (cap); -  return; +	ric->header.type = htons(RI_TLV_CAPABILITIES); +	ric->header.length = htons(RI_TLV_LENGTH); +	ric->value = htonl(cap); +	return;  } -static int -set_pce_header (struct ospf_pce_info *pce) +static int set_pce_header(struct ospf_pce_info *pce)  { -  u_int16_t length = 0; -  struct listnode *node; -  struct ri_pce_subtlv_domain *domain; -  struct ri_pce_subtlv_neighbor *neighbor; - -  /* PCE Address */ -  if (ntohs (pce->pce_address.header.type) != 0) -    length += RI_TLV_SIZE (&pce->pce_address.header); - -  /* PCE Path Scope */ -  if (ntohs (pce->pce_scope.header.type) != 0) -    length += RI_TLV_SIZE (&pce->pce_scope.header); - -  /* PCE Domain */ -  for (ALL_LIST_ELEMENTS_RO (pce->pce_domain, node, domain)) -    { -      if (ntohs (domain->header.type) != 0) -        length += RI_TLV_SIZE (&domain->header); -    } - -  /* PCE Neighbor */ -  for (ALL_LIST_ELEMENTS_RO (pce->pce_neighbor, node, neighbor)) -    { -      if (ntohs (neighbor->header.type) != 0) -        length += RI_TLV_SIZE (&neighbor->header); -    } - -  /* PCE Capabilities */ -  if (ntohs (pce->pce_cap_flag.header.type) != 0) -    length += RI_TLV_SIZE (&pce->pce_cap_flag.header); - -  if (length != 0) -    { -      pce->pce_header.header.type = htons (RI_TLV_PCE); -      pce->pce_header.header.length = htons (length); -    } -  else -    { -      pce->pce_header.header.type = 0; -      pce->pce_header.header.length = 0; -    } - -  return length; +	u_int16_t length = 0; +	struct listnode *node; +	struct ri_pce_subtlv_domain *domain; +	struct ri_pce_subtlv_neighbor *neighbor; + +	/* PCE Address */ +	if (ntohs(pce->pce_address.header.type) != 0) +		length += RI_TLV_SIZE(&pce->pce_address.header); + +	/* PCE Path Scope */ +	if (ntohs(pce->pce_scope.header.type) != 0) +		length += RI_TLV_SIZE(&pce->pce_scope.header); + +	/* PCE Domain */ +	for (ALL_LIST_ELEMENTS_RO(pce->pce_domain, node, domain)) { +		if (ntohs(domain->header.type) != 0) +			length += RI_TLV_SIZE(&domain->header); +	} + +	/* PCE Neighbor */ +	for (ALL_LIST_ELEMENTS_RO(pce->pce_neighbor, node, neighbor)) { +		if (ntohs(neighbor->header.type) != 0) +			length += RI_TLV_SIZE(&neighbor->header); +	} + +	/* PCE Capabilities */ +	if (ntohs(pce->pce_cap_flag.header.type) != 0) +		length += RI_TLV_SIZE(&pce->pce_cap_flag.header); + +	if (length != 0) { +		pce->pce_header.header.type = htons(RI_TLV_PCE); +		pce->pce_header.header.length = htons(length); +	} else { +		pce->pce_header.header.type = 0; +		pce->pce_header.header.length = 0; +	} + +	return length;  } -static void -set_pce_address (struct in_addr ipv4, struct ospf_pce_info *pce) +static void set_pce_address(struct in_addr ipv4, struct ospf_pce_info *pce)  { -  /* Enable PCE Info */ -  pce->pce_header.header.type = htons (RI_TLV_PCE); -  /* Set PCE Address */ -  pce->pce_address.header.type = htons (RI_PCE_SUBTLV_ADDRESS); -  pce->pce_address.header.length = htons (PCE_ADDRESS_LENGTH_IPV4); -  pce->pce_address.address.type = htons (PCE_ADDRESS_TYPE_IPV4); -  pce->pce_address.address.value = ipv4; +	/* Enable PCE Info */ +	pce->pce_header.header.type = htons(RI_TLV_PCE); +	/* Set PCE Address */ +	pce->pce_address.header.type = htons(RI_PCE_SUBTLV_ADDRESS); +	pce->pce_address.header.length = htons(PCE_ADDRESS_LENGTH_IPV4); +	pce->pce_address.address.type = htons(PCE_ADDRESS_TYPE_IPV4); +	pce->pce_address.address.value = ipv4; -  return; +	return;  } -static void -set_pce_path_scope (u_int32_t scope, struct ospf_pce_info *pce) +static void set_pce_path_scope(u_int32_t scope, struct ospf_pce_info *pce)  { -  /* Enable PCE Info */ -  pce->pce_header.header.type = htons (RI_TLV_PCE); -  /* Set PCE Scope */ -  pce->pce_scope.header.type = htons (RI_PCE_SUBTLV_PATH_SCOPE); -  pce->pce_scope.header.length = htons (RI_TLV_LENGTH); -  pce->pce_scope.value = htonl (scope); +	/* Enable PCE Info */ +	pce->pce_header.header.type = htons(RI_TLV_PCE); +	/* Set PCE Scope */ +	pce->pce_scope.header.type = htons(RI_PCE_SUBTLV_PATH_SCOPE); +	pce->pce_scope.header.length = htons(RI_TLV_LENGTH); +	pce->pce_scope.value = htonl(scope); -  return; +	return;  } -static void -set_pce_domain (u_int16_t type, u_int32_t domain, struct ospf_pce_info *pce) +static void set_pce_domain(u_int16_t type, u_int32_t domain, +			   struct ospf_pce_info *pce)  { -  struct ri_pce_subtlv_domain *new; +	struct ri_pce_subtlv_domain *new; -  /* Enable PCE Info */ -  pce->pce_header.header.type = htons (RI_TLV_PCE); +	/* Enable PCE Info */ +	pce->pce_header.header.type = htons(RI_TLV_PCE); -  /* Create new domain info */ -  new = -    XCALLOC (MTYPE_OSPF_PCE_PARAMS, -             sizeof (struct ri_pce_subtlv_domain)); +	/* Create new domain info */ +	new = XCALLOC(MTYPE_OSPF_PCE_PARAMS, +		      sizeof(struct ri_pce_subtlv_domain)); -  new->header.type = htons (RI_PCE_SUBTLV_DOMAIN); -  new->header.length = htons (PCE_ADDRESS_LENGTH_IPV4); -  new->type = htons (type); -  new->value = htonl (domain); +	new->header.type = htons(RI_PCE_SUBTLV_DOMAIN); +	new->header.length = htons(PCE_ADDRESS_LENGTH_IPV4); +	new->type = htons(type); +	new->value = htonl(domain); -  /* Add new domain to the list */ -  listnode_add (pce->pce_domain, new); +	/* Add new domain to the list */ +	listnode_add(pce->pce_domain, new); -  return; +	return;  } -static void -unset_pce_domain (u_int16_t type, u_int32_t domain, struct ospf_pce_info *pce) +static void unset_pce_domain(u_int16_t type, u_int32_t domain, +			     struct ospf_pce_info *pce)  { -  struct listnode *node; -  struct ri_pce_subtlv_domain *old = NULL; -  int found = 0; - -  /* Search the corresponding node */ -  for (ALL_LIST_ELEMENTS_RO (pce->pce_domain, node, old)) -    { -      if ((old->type == htons (type)) && (old->value == htonl (domain))) -        { -          found = 1; -          break; -        } -    } - -  /* if found remove it */ -  if (found) -    { -      listnode_delete (pce->pce_domain, old); - -      /* Avoid misjudgement in the next lookup. */ -      if (listcount (pce->pce_domain) == 0) -        pce->pce_domain->head = pce->pce_domain->tail = NULL; - -      /* Finally free the old domain */ -      XFREE (MTYPE_OSPF_PCE_PARAMS, old); -    } +	struct listnode *node; +	struct ri_pce_subtlv_domain *old = NULL; +	int found = 0; + +	/* Search the corresponding node */ +	for (ALL_LIST_ELEMENTS_RO(pce->pce_domain, node, old)) { +		if ((old->type == htons(type)) +		    && (old->value == htonl(domain))) { +			found = 1; +			break; +		} +	} + +	/* if found remove it */ +	if (found) { +		listnode_delete(pce->pce_domain, old); + +		/* Avoid misjudgement in the next lookup. */ +		if (listcount(pce->pce_domain) == 0) +			pce->pce_domain->head = pce->pce_domain->tail = NULL; + +		/* Finally free the old domain */ +		XFREE(MTYPE_OSPF_PCE_PARAMS, old); +	}  } -static void -set_pce_neighbor (u_int16_t type, u_int32_t domain, struct ospf_pce_info *pce) +static void set_pce_neighbor(u_int16_t type, u_int32_t domain, +			     struct ospf_pce_info *pce)  { -  struct ri_pce_subtlv_neighbor *new; +	struct ri_pce_subtlv_neighbor *new; -  /* Enable PCE Info */ -  pce->pce_header.header.type = htons (RI_TLV_PCE); +	/* Enable PCE Info */ +	pce->pce_header.header.type = htons(RI_TLV_PCE); -  /* Create new neighbor info */ -  new = -    XCALLOC (MTYPE_OSPF_PCE_PARAMS, -             sizeof (struct ri_pce_subtlv_neighbor)); +	/* Create new neighbor info */ +	new = XCALLOC(MTYPE_OSPF_PCE_PARAMS, +		      sizeof(struct ri_pce_subtlv_neighbor)); -  new->header.type = htons (RI_PCE_SUBTLV_NEIGHBOR); -  new->header.length = htons (PCE_ADDRESS_LENGTH_IPV4); -  new->type = htons (type); -  new->value = htonl (domain); +	new->header.type = htons(RI_PCE_SUBTLV_NEIGHBOR); +	new->header.length = htons(PCE_ADDRESS_LENGTH_IPV4); +	new->type = htons(type); +	new->value = htonl(domain); -  /* Add new domain to the list */ -  listnode_add (pce->pce_neighbor, new); +	/* Add new domain to the list */ +	listnode_add(pce->pce_neighbor, new); -  return; +	return;  } -static void -unset_pce_neighbor (u_int16_t type, u_int32_t domain, -                    struct ospf_pce_info *pce) +static void unset_pce_neighbor(u_int16_t type, u_int32_t domain, +			       struct ospf_pce_info *pce)  { -  struct listnode *node; -  struct ri_pce_subtlv_neighbor *old = NULL; -  int found = 0; - -  /* Search the corresponding node */ -  for (ALL_LIST_ELEMENTS_RO (pce->pce_neighbor, node, old)) -    { -      if ((old->type == htons (type)) && (old->value == htonl (domain))) -        { -          found = 1; -          break; -        } -    } - -  /* if found remove it */ -  if (found) -    { -      listnode_delete (pce->pce_neighbor, old); - -      /* Avoid misjudgement in the next lookup. */ -      if (listcount (pce->pce_neighbor) == 0) -        pce->pce_neighbor->head = pce->pce_neighbor->tail = NULL; - -      /* Finally free the old domain */ -      XFREE (MTYPE_OSPF_PCE_PARAMS, old); -    } +	struct listnode *node; +	struct ri_pce_subtlv_neighbor *old = NULL; +	int found = 0; + +	/* Search the corresponding node */ +	for (ALL_LIST_ELEMENTS_RO(pce->pce_neighbor, node, old)) { +		if ((old->type == htons(type)) +		    && (old->value == htonl(domain))) { +			found = 1; +			break; +		} +	} + +	/* if found remove it */ +	if (found) { +		listnode_delete(pce->pce_neighbor, old); + +		/* Avoid misjudgement in the next lookup. */ +		if (listcount(pce->pce_neighbor) == 0) +			pce->pce_neighbor->head = pce->pce_neighbor->tail = +				NULL; + +		/* Finally free the old domain */ +		XFREE(MTYPE_OSPF_PCE_PARAMS, old); +	}  } -static void -set_pce_cap_flag (u_int32_t cap, struct ospf_pce_info *pce) +static void set_pce_cap_flag(u_int32_t cap, struct ospf_pce_info *pce)  { -  /* Enable PCE Info */ -  pce->pce_header.header.type = htons (RI_TLV_PCE); -  /* Set PCE Capabilities flag */ -  pce->pce_cap_flag.header.type = htons (RI_PCE_SUBTLV_CAP_FLAG); -  pce->pce_cap_flag.header.length = htons (RI_TLV_LENGTH); -  pce->pce_cap_flag.value = htonl (cap); +	/* Enable PCE Info */ +	pce->pce_header.header.type = htons(RI_TLV_PCE); +	/* Set PCE Capabilities flag */ +	pce->pce_cap_flag.header.type = htons(RI_PCE_SUBTLV_CAP_FLAG); +	pce->pce_cap_flag.header.length = htons(RI_TLV_LENGTH); +	pce->pce_cap_flag.value = htonl(cap); -  return; +	return;  } -static void -unset_param (struct ri_tlv_header *tlv) +static void unset_param(struct ri_tlv_header *tlv)  { -  tlv->type = 0; -  /* Fill the Value to 0 */ -  memset ((tlv + RI_TLV_HDR_SIZE), 0, RI_TLV_BODY_SIZE (tlv)); -  tlv->length = 0; +	tlv->type = 0; +	/* Fill the Value to 0 */ +	memset((tlv + RI_TLV_HDR_SIZE), 0, RI_TLV_BODY_SIZE(tlv)); +	tlv->length = 0; -  return; +	return;  } -static void -initialize_params (struct ospf_router_info *ori) +static void initialize_params(struct ospf_router_info *ori)  { -  u_int32_t cap; -  struct ospf *top; - -  /* -   * Initialize default Router Information Capabilities. -   */ -  cap = 0; -  cap = cap | RI_TE_SUPPORT; - -  set_router_info_capabilities (&ori->router_cap, cap); - -  /* If Area address is not null and exist, retrieve corresponding structure */ -  top = ospf_lookup (); -  zlog_info ("RI-> Initialize Router Info for %s scope within area %s", -             OspfRI.scope == OSPF_OPAQUE_AREA_LSA ? "Area" : "AS", -             inet_ntoa (OspfRI.area_id)); - -  /* Try to get the Area context at this step. Do it latter if not available */ -  if ((OspfRI.scope == OSPF_OPAQUE_AREA_LSA) && (OspfRI.area == NULL)) -    OspfRI.area = ospf_area_lookup_by_area_id (top, OspfRI.area_id); - -  /* -   * Initialize default PCE Information values -   */ -  /* PCE address == OSPF Router ID */ -  set_pce_address (top->router_id, &ori->pce_info); - -  /* PCE scope */ -  cap = 7;                      /* Set L, R and Rd bits to one = intra & inter-area path computation */ -  set_pce_path_scope (cap, &ori->pce_info); - -  /* PCE Capabilities */ -  cap = -    PCE_CAP_BIDIRECTIONAL | PCE_CAP_DIVERSE_PATH | PCE_CAP_OBJECTIVES | -    PCE_CAP_ADDITIVE | PCE_CAP_MULTIPLE_REQ; -  set_pce_cap_flag (cap, &ori->pce_info); - -  /* Finally compute PCE header */ -  set_pce_header (&ori->pce_info); - -  return; +	u_int32_t cap; +	struct ospf *top; + +	/* +	 * Initialize default Router Information Capabilities. +	 */ +	cap = 0; +	cap = cap | RI_TE_SUPPORT; + +	set_router_info_capabilities(&ori->router_cap, cap); + +	/* If Area address is not null and exist, retrieve corresponding +	 * structure */ +	top = ospf_lookup(); +	zlog_info("RI-> Initialize Router Info for %s scope within area %s", +		  OspfRI.scope == OSPF_OPAQUE_AREA_LSA ? "Area" : "AS", +		  inet_ntoa(OspfRI.area_id)); + +	/* Try to get the Area context at this step. Do it latter if not +	 * available */ +	if ((OspfRI.scope == OSPF_OPAQUE_AREA_LSA) && (OspfRI.area == NULL)) +		OspfRI.area = ospf_area_lookup_by_area_id(top, OspfRI.area_id); + +	/* +	 * Initialize default PCE Information values +	 */ +	/* PCE address == OSPF Router ID */ +	set_pce_address(top->router_id, &ori->pce_info); + +	/* PCE scope */ +	cap = 7; /* Set L, R and Rd bits to one = intra & inter-area path +		    computation */ +	set_pce_path_scope(cap, &ori->pce_info); + +	/* PCE Capabilities */ +	cap = PCE_CAP_BIDIRECTIONAL | PCE_CAP_DIVERSE_PATH | PCE_CAP_OBJECTIVES +	      | PCE_CAP_ADDITIVE | PCE_CAP_MULTIPLE_REQ; +	set_pce_cap_flag(cap, &ori->pce_info); + +	/* Finally compute PCE header */ +	set_pce_header(&ori->pce_info); + +	return;  } -static int -is_mandated_params_set (struct ospf_router_info ori) +static int is_mandated_params_set(struct ospf_router_info ori)  { -  int rc = 0; +	int rc = 0; -  if (ntohs (ori.router_cap.header.type) == 0) -    goto out; +	if (ntohs(ori.router_cap.header.type) == 0) +		goto out; -  if ((ntohs (ori.pce_info.pce_header.header.type) == RI_TLV_PCE) -      && (ntohs (ori.pce_info.pce_address.header.type) == 0) -      && (ntohs (ori.pce_info.pce_cap_flag.header.type) == 0)) -    goto out; +	if ((ntohs(ori.pce_info.pce_header.header.type) == RI_TLV_PCE) +	    && (ntohs(ori.pce_info.pce_address.header.type) == 0) +	    && (ntohs(ori.pce_info.pce_cap_flag.header.type) == 0)) +		goto out; -  rc = 1; +	rc = 1;  out: -  return rc; +	return rc;  }  /*------------------------------------------------------------------------*   * Followings are callback functions against generic Opaque-LSAs handling.   *------------------------------------------------------------------------*/ -static void -ospf_router_info_ism_change (struct ospf_interface *oi, int old_state) +static void ospf_router_info_ism_change(struct ospf_interface *oi, +					int old_state)  { -  /* So far, nothing to do here. */ -  return; - +	/* So far, nothing to do here. */ +	return;  } -static void -ospf_router_info_nsm_change (struct ospf_neighbor *nbr, int old_state) +static void ospf_router_info_nsm_change(struct ospf_neighbor *nbr, +					int old_state)  { -  /* So far, nothing to do here. */ -  return; +	/* So far, nothing to do here. */ +	return;  }  /*------------------------------------------------------------------------*   * Followings are OSPF protocol processing functions for ROUTER INFORMATION   *------------------------------------------------------------------------*/ -static void -build_tlv_header (struct stream *s, struct ri_tlv_header *tlvh) +static void build_tlv_header(struct stream *s, struct ri_tlv_header *tlvh)  { -  stream_put (s, tlvh, sizeof (struct ri_tlv_header)); -  return; +	stream_put(s, tlvh, sizeof(struct ri_tlv_header)); +	return;  } -static void -build_tlv (struct stream *s, struct ri_tlv_header *tlvh) +static void build_tlv(struct stream *s, struct ri_tlv_header *tlvh)  { -  if (ntohs (tlvh->type) != 0) -    { -      build_tlv_header (s, tlvh); -      stream_put (s, tlvh + 1, RI_TLV_BODY_SIZE (tlvh)); -    } -  return; +	if (ntohs(tlvh->type) != 0) { +		build_tlv_header(s, tlvh); +		stream_put(s, tlvh + 1, RI_TLV_BODY_SIZE(tlvh)); +	} +	return;  } -static void -ospf_router_info_lsa_body_set (struct stream *s) +static void ospf_router_info_lsa_body_set(struct stream *s)  { -  struct listnode *node; -  struct ri_pce_subtlv_domain *domain; -  struct ri_pce_subtlv_neighbor *neighbor; +	struct listnode *node; +	struct ri_pce_subtlv_domain *domain; +	struct ri_pce_subtlv_neighbor *neighbor; -  /* Build Router Information TLV */ -  build_tlv (s, &OspfRI.router_cap.header); +	/* Build Router Information TLV */ +	build_tlv(s, &OspfRI.router_cap.header); -  /* Add RI PCE TLV if it is set */ -  /* Compute PCE Info header first */ -  if ((set_pce_header (&OspfRI.pce_info)) != 0) -    { +	/* Add RI PCE TLV if it is set */ +	/* Compute PCE Info header first */ +	if ((set_pce_header(&OspfRI.pce_info)) != 0) { -      /* Build PCE TLV */ -      build_tlv_header (s, &OspfRI.pce_info.pce_header.header); +		/* Build PCE TLV */ +		build_tlv_header(s, &OspfRI.pce_info.pce_header.header); -      /* Build PCE address sub-tlv */ -      build_tlv (s, &OspfRI.pce_info.pce_address.header); +		/* Build PCE address sub-tlv */ +		build_tlv(s, &OspfRI.pce_info.pce_address.header); -      /* Build PCE path scope sub-tlv */ -      build_tlv (s, &OspfRI.pce_info.pce_scope.header); +		/* Build PCE path scope sub-tlv */ +		build_tlv(s, &OspfRI.pce_info.pce_scope.header); -      /* Build PCE domain sub-tlv */ -      for (ALL_LIST_ELEMENTS_RO (OspfRI.pce_info.pce_domain, node, domain)) -        build_tlv (s, &domain->header); +		/* Build PCE domain sub-tlv */ +		for (ALL_LIST_ELEMENTS_RO(OspfRI.pce_info.pce_domain, node, +					  domain)) +			build_tlv(s, &domain->header); -      /* Build PCE neighbor sub-tlv */ -      for (ALL_LIST_ELEMENTS_RO -           (OspfRI.pce_info.pce_neighbor, node, neighbor)) -        build_tlv (s, &neighbor->header); +		/* Build PCE neighbor sub-tlv */ +		for (ALL_LIST_ELEMENTS_RO(OspfRI.pce_info.pce_neighbor, node, +					  neighbor)) +			build_tlv(s, &neighbor->header); -      /* Build PCE cap flag sub-tlv */ -      build_tlv (s, &OspfRI.pce_info.pce_cap_flag.header); -    } +		/* Build PCE cap flag sub-tlv */ +		build_tlv(s, &OspfRI.pce_info.pce_cap_flag.header); +	} -  return; +	return;  }  /* Create new opaque-LSA. */ -static struct ospf_lsa * -ospf_router_info_lsa_new () +static struct ospf_lsa *ospf_router_info_lsa_new()  { -  struct ospf *top; -  struct stream *s; -  struct lsa_header *lsah; -  struct ospf_lsa *new = NULL; -  u_char options, lsa_type; -  struct in_addr lsa_id; -  u_int32_t tmp; -  u_int16_t length; - -  /* Create a stream for LSA. */ -  if ((s = stream_new (OSPF_MAX_LSA_SIZE)) == NULL) -    { -      zlog_warn ("ospf_router_info_lsa_new: stream_new() ?"); -      goto out; -    } -  lsah = (struct lsa_header *) STREAM_DATA (s); - -  options = OSPF_OPTION_E;      /* Enable AS external as we flood RI with Opaque Type 11 */ -  options |= OSPF_OPTION_O;     /* Don't forget this :-) */ - -  lsa_type = OspfRI.scope; -  /* LSA ID == 0 for Router Information see RFC 4970 */ -  tmp = SET_OPAQUE_LSID (OPAQUE_TYPE_ROUTER_INFORMATION_LSA, 0); -  lsa_id.s_addr = htonl (tmp); - -  if (IS_DEBUG_OSPF (lsa, LSA_GENERATE)) -    zlog_debug -      ("LSA[Type%d:%s]: Create an Opaque-LSA/ROUTER INFORMATION instance", -       lsa_type, inet_ntoa (lsa_id)); - -  top = ospf_lookup (); - -  /* Set opaque-LSA header fields. */ -  lsa_header_set (s, options, lsa_type, lsa_id, top->router_id); - -  /* Set opaque-LSA body fields. */ -  ospf_router_info_lsa_body_set (s); - -  /* Set length. */ -  length = stream_get_endp (s); -  lsah->length = htons (length); - -  /* Now, create an OSPF LSA instance. */ -  if ((new = ospf_lsa_new ()) == NULL) -    { -      zlog_warn ("ospf_router_info_lsa_new: ospf_lsa_new() ?"); -      stream_free (s); -      goto out; -    } -  if ((new->data = ospf_lsa_data_new (length)) == NULL) -    { -      zlog_warn ("ospf_router_info_lsa_new: ospf_lsa_data_new() ?"); -      ospf_lsa_unlock (&new); -      new = NULL; -      stream_free (s); -      goto out; -    } - -  new->area = OspfRI.area;      /* Area must be null if the Opaque type is AS scope, fulfill otherwise */ - -  SET_FLAG (new->flags, OSPF_LSA_SELF); -  memcpy (new->data, lsah, length); -  stream_free (s); - -out:return new; +	struct ospf *top; +	struct stream *s; +	struct lsa_header *lsah; +	struct ospf_lsa *new = NULL; +	u_char options, lsa_type; +	struct in_addr lsa_id; +	u_int32_t tmp; +	u_int16_t length; + +	/* Create a stream for LSA. */ +	if ((s = stream_new(OSPF_MAX_LSA_SIZE)) == NULL) { +		zlog_warn("ospf_router_info_lsa_new: stream_new() ?"); +		goto out; +	} +	lsah = (struct lsa_header *)STREAM_DATA(s); + +	options = OSPF_OPTION_E;  /* Enable AS external as we flood RI with +				     Opaque Type 11 */ +	options |= OSPF_OPTION_O; /* Don't forget this :-) */ + +	lsa_type = OspfRI.scope; +	/* LSA ID == 0 for Router Information see RFC 4970 */ +	tmp = SET_OPAQUE_LSID(OPAQUE_TYPE_ROUTER_INFORMATION_LSA, 0); +	lsa_id.s_addr = htonl(tmp); + +	if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) +		zlog_debug( +			"LSA[Type%d:%s]: Create an Opaque-LSA/ROUTER INFORMATION instance", +			lsa_type, inet_ntoa(lsa_id)); + +	top = ospf_lookup(); + +	/* Set opaque-LSA header fields. */ +	lsa_header_set(s, options, lsa_type, lsa_id, top->router_id); + +	/* Set opaque-LSA body fields. */ +	ospf_router_info_lsa_body_set(s); + +	/* Set length. */ +	length = stream_get_endp(s); +	lsah->length = htons(length); + +	/* Now, create an OSPF LSA instance. */ +	if ((new = ospf_lsa_new()) == NULL) { +		zlog_warn("ospf_router_info_lsa_new: ospf_lsa_new() ?"); +		stream_free(s); +		goto out; +	} +	if ((new->data = ospf_lsa_data_new(length)) == NULL) { +		zlog_warn("ospf_router_info_lsa_new: ospf_lsa_data_new() ?"); +		ospf_lsa_unlock(&new); +		new = NULL; +		stream_free(s); +		goto out; +	} + +	new->area = OspfRI.area; /* Area must be null if the Opaque type is AS +				    scope, fulfill otherwise */ + +	SET_FLAG(new->flags, OSPF_LSA_SELF); +	memcpy(new->data, lsah, length); +	stream_free(s); + +out: +	return new;  } -static int -ospf_router_info_lsa_originate1 (void *arg) +static int ospf_router_info_lsa_originate1(void *arg)  { -  struct ospf_lsa *new; -  struct ospf *top; -  struct ospf_area *area; -  int rc = -1; - -  /* First check if the area is known if flooding scope is Area */ -  if (OspfRI.scope == OSPF_OPAQUE_AREA_LSA) -    { -      area = (struct ospf_area *) arg; -      if (area->area_id.s_addr != OspfRI.area_id.s_addr) -        { -          zlog_debug -            ("RI -> This is not the Router Information Area. Stop processing"); -          goto out; -        } -      OspfRI.area = area; -    } - -  /* Create new Opaque-LSA/ROUTER INFORMATION instance. */ -  if ((new = ospf_router_info_lsa_new ()) == NULL) -    { -      zlog_warn -        ("ospf_router_info_lsa_originate1: ospf_router_info_lsa_new() ?"); -      goto out; -    } - -  /* Get ospf info */ -  top = ospf_lookup (); - -  /* Install this LSA into LSDB. */ -  if (ospf_lsa_install (top, NULL /*oi */ , new) == NULL) -    { -      zlog_warn ("ospf_router_info_lsa_originate1: ospf_lsa_install() ?"); -      ospf_lsa_unlock (&new); -      goto out; -    } - -  /* Now this Router Info parameter entry has associated LSA. */ -  SET_FLAG (OspfRI.flags, RIFLG_LSA_ENGAGED); - -  /* Update new LSA origination count. */ -  top->lsa_originate_count++; - -  /* Flood new LSA through AS. */ -  if (OspfRI.scope == OSPF_OPAQUE_AS_LSA) -    ospf_flood_through_as (top, NULL /*nbr */ , new); -  else -    ospf_flood_through_area (OspfRI.area, NULL /*nbr */ , new); - -  if (IS_DEBUG_OSPF (lsa, LSA_GENERATE)) -    { -      zlog_debug ("LSA[Type%d:%s]: Originate Opaque-LSA/ROUTER INFORMATION", -                  new->data->type, inet_ntoa (new->data->id)); -      ospf_lsa_header_dump (new->data); -    } - -  rc = 0; -out:return rc; +	struct ospf_lsa *new; +	struct ospf *top; +	struct ospf_area *area; +	int rc = -1; + +	/* First check if the area is known if flooding scope is Area */ +	if (OspfRI.scope == OSPF_OPAQUE_AREA_LSA) { +		area = (struct ospf_area *)arg; +		if (area->area_id.s_addr != OspfRI.area_id.s_addr) { +			zlog_debug( +				"RI -> This is not the Router Information Area. Stop processing"); +			goto out; +		} +		OspfRI.area = area; +	} + +	/* Create new Opaque-LSA/ROUTER INFORMATION instance. */ +	if ((new = ospf_router_info_lsa_new()) == NULL) { +		zlog_warn( +			"ospf_router_info_lsa_originate1: ospf_router_info_lsa_new() ?"); +		goto out; +	} + +	/* Get ospf info */ +	top = ospf_lookup(); + +	/* Install this LSA into LSDB. */ +	if (ospf_lsa_install(top, NULL /*oi */, new) == NULL) { +		zlog_warn( +			"ospf_router_info_lsa_originate1: ospf_lsa_install() ?"); +		ospf_lsa_unlock(&new); +		goto out; +	} + +	/* Now this Router Info parameter entry has associated LSA. */ +	SET_FLAG(OspfRI.flags, RIFLG_LSA_ENGAGED); + +	/* Update new LSA origination count. */ +	top->lsa_originate_count++; + +	/* Flood new LSA through AS. */ +	if (OspfRI.scope == OSPF_OPAQUE_AS_LSA) +		ospf_flood_through_as(top, NULL /*nbr */, new); +	else +		ospf_flood_through_area(OspfRI.area, NULL /*nbr */, new); + +	if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) { +		zlog_debug( +			"LSA[Type%d:%s]: Originate Opaque-LSA/ROUTER INFORMATION", +			new->data->type, inet_ntoa(new->data->id)); +		ospf_lsa_header_dump(new->data); +	} + +	rc = 0; +out: +	return rc;  } -static int -ospf_router_info_lsa_originate (void *arg) +static int ospf_router_info_lsa_originate(void *arg)  { -  int rc = -1; - -  if (OspfRI.status == disabled) -    { -      zlog_info -        ("ospf_router_info_lsa_originate: ROUTER INFORMATION is disabled now."); -      rc = 0;                   /* This is not an error case. */ -      goto out; -    } - -  /* Check if Router Information LSA is already engaged */ -  if (OspfRI.flags & RIFLG_LSA_ENGAGED) -    { -      if (OspfRI.flags & RIFLG_LSA_FORCED_REFRESH) -        { -          OspfRI.flags &= ~RIFLG_LSA_FORCED_REFRESH; -          ospf_router_info_lsa_schedule (REFRESH_THIS_LSA); -        } -    } -  else -    { -      if (!is_mandated_params_set (OspfRI)) -        zlog_warn -          ("ospf_router_info_lsa_originate: lacks mandated ROUTER INFORMATION parameters"); - -      /* Ok, let's try to originate an LSA */ -      if (ospf_router_info_lsa_originate1 (arg) != 0) -        goto out; -    } - -  rc = 0; -out:return rc; +	int rc = -1; + +	if (OspfRI.status == disabled) { +		zlog_info( +			"ospf_router_info_lsa_originate: ROUTER INFORMATION is disabled now."); +		rc = 0; /* This is not an error case. */ +		goto out; +	} + +	/* Check if Router Information LSA is already engaged */ +	if (OspfRI.flags & RIFLG_LSA_ENGAGED) { +		if (OspfRI.flags & RIFLG_LSA_FORCED_REFRESH) { +			OspfRI.flags &= ~RIFLG_LSA_FORCED_REFRESH; +			ospf_router_info_lsa_schedule(REFRESH_THIS_LSA); +		} +	} else { +		if (!is_mandated_params_set(OspfRI)) +			zlog_warn( +				"ospf_router_info_lsa_originate: lacks mandated ROUTER INFORMATION parameters"); + +		/* Ok, let's try to originate an LSA */ +		if (ospf_router_info_lsa_originate1(arg) != 0) +			goto out; +	} + +	rc = 0; +out: +	return rc;  } -static struct ospf_lsa * -ospf_router_info_lsa_refresh (struct ospf_lsa *lsa) +static struct ospf_lsa *ospf_router_info_lsa_refresh(struct ospf_lsa *lsa)  { -  struct ospf_lsa *new = NULL; -  struct ospf *top; - -  if (OspfRI.status == disabled) -    { -      /* -       * This LSA must have flushed before due to ROUTER INFORMATION status change. -       * It seems a slip among routers in the routing domain. -       */ -      zlog_info -        ("ospf_router_info_lsa_refresh: ROUTER INFORMATION is disabled now."); -      lsa->data->ls_age = htons (OSPF_LSA_MAXAGE);      /* Flush it anyway. */ -    } - -  /* Verify that the Router Information ID is supported */ -  if (GET_OPAQUE_ID (ntohl (lsa->data->id.s_addr)) != 0) -    { -      zlog_warn -        ("ospf_router_info_lsa_refresh: Unsupported Router Information ID"); -      goto out; -    } - -  /* If the lsa's age reached to MaxAge, start flushing procedure. */ -  if (IS_LSA_MAXAGE (lsa)) -    { -      OspfRI.flags &= ~RIFLG_LSA_ENGAGED; -      ospf_opaque_lsa_flush_schedule (lsa); -      goto out; -    } - -  /* Create new Opaque-LSA/ROUTER INFORMATION instance. */ -  if ((new = ospf_router_info_lsa_new ()) == NULL) -    { -      zlog_warn -        ("ospf_router_info_lsa_refresh: ospf_router_info_lsa_new() ?"); -      goto out; -    } -  new->data->ls_seqnum = lsa_seqnum_increment (lsa); - -  /* Install this LSA into LSDB. */ -  /* Given "lsa" will be freed in the next function. */ -  top = ospf_lookup (); -  if (ospf_lsa_install (top, NULL /*oi */ , new) == NULL) -    { -      zlog_warn ("ospf_router_info_lsa_refresh: ospf_lsa_install() ?"); -      ospf_lsa_unlock (&new); -      goto out; -    } - -  /* Flood updated LSA through AS or AREA depending of OspfRI.scope. */ -  if (OspfRI.scope == OSPF_OPAQUE_AS_LSA) -    ospf_flood_through_as (top, NULL /*nbr */ , new); -  else -    ospf_flood_through_area (OspfRI.area, NULL /*nbr */ , new); - -  /* Debug logging. */ -  if (IS_DEBUG_OSPF (lsa, LSA_GENERATE)) -    { -      zlog_debug ("LSA[Type%d:%s]: Refresh Opaque-LSA/ROUTER INFORMATION", -                  new->data->type, inet_ntoa (new->data->id)); -      ospf_lsa_header_dump (new->data); -    } - -out:return new; +	struct ospf_lsa *new = NULL; +	struct ospf *top; + +	if (OspfRI.status == disabled) { +		/* +		 * This LSA must have flushed before due to ROUTER INFORMATION +		 * status change. +		 * It seems a slip among routers in the routing domain. +		 */ +		zlog_info( +			"ospf_router_info_lsa_refresh: ROUTER INFORMATION is disabled now."); +		lsa->data->ls_age = +			htons(OSPF_LSA_MAXAGE); /* Flush it anyway. */ +	} + +	/* Verify that the Router Information ID is supported */ +	if (GET_OPAQUE_ID(ntohl(lsa->data->id.s_addr)) != 0) { +		zlog_warn( +			"ospf_router_info_lsa_refresh: Unsupported Router Information ID"); +		goto out; +	} + +	/* If the lsa's age reached to MaxAge, start flushing procedure. */ +	if (IS_LSA_MAXAGE(lsa)) { +		OspfRI.flags &= ~RIFLG_LSA_ENGAGED; +		ospf_opaque_lsa_flush_schedule(lsa); +		goto out; +	} + +	/* Create new Opaque-LSA/ROUTER INFORMATION instance. */ +	if ((new = ospf_router_info_lsa_new()) == NULL) { +		zlog_warn( +			"ospf_router_info_lsa_refresh: ospf_router_info_lsa_new() ?"); +		goto out; +	} +	new->data->ls_seqnum = lsa_seqnum_increment(lsa); + +	/* Install this LSA into LSDB. */ +	/* Given "lsa" will be freed in the next function. */ +	top = ospf_lookup(); +	if (ospf_lsa_install(top, NULL /*oi */, new) == NULL) { +		zlog_warn("ospf_router_info_lsa_refresh: ospf_lsa_install() ?"); +		ospf_lsa_unlock(&new); +		goto out; +	} + +	/* Flood updated LSA through AS or AREA depending of OspfRI.scope. */ +	if (OspfRI.scope == OSPF_OPAQUE_AS_LSA) +		ospf_flood_through_as(top, NULL /*nbr */, new); +	else +		ospf_flood_through_area(OspfRI.area, NULL /*nbr */, new); + +	/* Debug logging. */ +	if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) { +		zlog_debug( +			"LSA[Type%d:%s]: Refresh Opaque-LSA/ROUTER INFORMATION", +			new->data->type, inet_ntoa(new->data->id)); +		ospf_lsa_header_dump(new->data); +	} + +out: +	return new;  } -static void -ospf_router_info_lsa_schedule (opcode_t opcode) +static void ospf_router_info_lsa_schedule(opcode_t opcode)  { -  struct ospf_lsa lsa; -  struct lsa_header lsah; -  struct ospf *top; -  u_int32_t tmp; - -  memset (&lsa, 0, sizeof (lsa)); -  memset (&lsah, 0, sizeof (lsah)); - -  zlog_debug ("RI-> LSA schedule %s%s%s", -              opcode == REORIGINATE_THIS_LSA ? "Re-Originate" : "", -              opcode == REFRESH_THIS_LSA ? "Refresh" : "", -              opcode == FLUSH_THIS_LSA ? "Flush" : ""); - -  top = ospf_lookup (); -  if ((OspfRI.scope == OSPF_OPAQUE_AREA_LSA) && (OspfRI.area == NULL)) -    { -      zlog_warn -        ("ospf_router_info_lsa_schedule(): Router Info is Area scope flooding but area is not set"); -      OspfRI.area = ospf_area_lookup_by_area_id (top, OspfRI.area_id); -    } -  lsa.area = OspfRI.area; -  lsa.data = &lsah; -  lsah.type = OspfRI.scope; - -  /* LSA ID is set to 0 for the Router Information. See RFC 4970 */ -  tmp = SET_OPAQUE_LSID (OPAQUE_TYPE_ROUTER_INFORMATION_LSA, 0); -  lsah.id.s_addr = htonl (tmp); - -  switch (opcode) -    { -    case REORIGINATE_THIS_LSA: -      if (OspfRI.scope == OSPF_OPAQUE_AREA_LSA) -        ospf_opaque_lsa_reoriginate_schedule ((void *) OspfRI.area, -                                              OSPF_OPAQUE_AREA_LSA, -                                              OPAQUE_TYPE_ROUTER_INFORMATION_LSA); -      else -        ospf_opaque_lsa_reoriginate_schedule ((void *) top, -                                              OSPF_OPAQUE_AS_LSA, -                                              OPAQUE_TYPE_ROUTER_INFORMATION_LSA); -      break; -    case REFRESH_THIS_LSA: -      ospf_opaque_lsa_refresh_schedule (&lsa); -      break; -    case FLUSH_THIS_LSA: -      OspfRI.flags &= ~RIFLG_LSA_ENGAGED; -      ospf_opaque_lsa_flush_schedule (&lsa); -      break; -    default: -      zlog_warn ("ospf_router_info_lsa_schedule: Unknown opcode (%u)", -                 opcode); -      break; -    } - -  return; +	struct ospf_lsa lsa; +	struct lsa_header lsah; +	struct ospf *top; +	u_int32_t tmp; + +	memset(&lsa, 0, sizeof(lsa)); +	memset(&lsah, 0, sizeof(lsah)); + +	zlog_debug("RI-> LSA schedule %s%s%s", +		   opcode == REORIGINATE_THIS_LSA ? "Re-Originate" : "", +		   opcode == REFRESH_THIS_LSA ? "Refresh" : "", +		   opcode == FLUSH_THIS_LSA ? "Flush" : ""); + +	top = ospf_lookup(); +	if ((OspfRI.scope == OSPF_OPAQUE_AREA_LSA) && (OspfRI.area == NULL)) { +		zlog_warn( +			"ospf_router_info_lsa_schedule(): Router Info is Area scope flooding but area is not set"); +		OspfRI.area = ospf_area_lookup_by_area_id(top, OspfRI.area_id); +	} +	lsa.area = OspfRI.area; +	lsa.data = &lsah; +	lsah.type = OspfRI.scope; + +	/* LSA ID is set to 0 for the Router Information. See RFC 4970 */ +	tmp = SET_OPAQUE_LSID(OPAQUE_TYPE_ROUTER_INFORMATION_LSA, 0); +	lsah.id.s_addr = htonl(tmp); + +	switch (opcode) { +	case REORIGINATE_THIS_LSA: +		if (OspfRI.scope == OSPF_OPAQUE_AREA_LSA) +			ospf_opaque_lsa_reoriginate_schedule( +				(void *)OspfRI.area, OSPF_OPAQUE_AREA_LSA, +				OPAQUE_TYPE_ROUTER_INFORMATION_LSA); +		else +			ospf_opaque_lsa_reoriginate_schedule( +				(void *)top, OSPF_OPAQUE_AS_LSA, +				OPAQUE_TYPE_ROUTER_INFORMATION_LSA); +		break; +	case REFRESH_THIS_LSA: +		ospf_opaque_lsa_refresh_schedule(&lsa); +		break; +	case FLUSH_THIS_LSA: +		OspfRI.flags &= ~RIFLG_LSA_ENGAGED; +		ospf_opaque_lsa_flush_schedule(&lsa); +		break; +	default: +		zlog_warn("ospf_router_info_lsa_schedule: Unknown opcode (%u)", +			  opcode); +		break; +	} + +	return;  }  /*------------------------------------------------------------------------*   * Followings are vty session control functions.   *------------------------------------------------------------------------*/ -static u_int16_t -show_vty_router_cap (struct vty *vty, struct ri_tlv_header *tlvh) +static u_int16_t show_vty_router_cap(struct vty *vty, +				     struct ri_tlv_header *tlvh)  { -  struct ri_tlv_router_cap *top = (struct ri_tlv_router_cap *) tlvh; +	struct ri_tlv_router_cap *top = (struct ri_tlv_router_cap *)tlvh; -  if (vty != NULL) -    vty_out (vty, "  Router Capabilities: 0x%x%s", ntohl (top->value), -             VTY_NEWLINE); -  else -    zlog_debug ("    Router Capabilities: 0x%x", ntohl (top->value)); +	if (vty != NULL) +		vty_out(vty, "  Router Capabilities: 0x%x%s", ntohl(top->value), +			VTY_NEWLINE); +	else +		zlog_debug("    Router Capabilities: 0x%x", ntohl(top->value)); -  return RI_TLV_SIZE (tlvh); +	return RI_TLV_SIZE(tlvh);  } -static u_int16_t -show_vty_pce_subtlv_address (struct vty *vty, struct ri_tlv_header *tlvh) +static u_int16_t show_vty_pce_subtlv_address(struct vty *vty, +					     struct ri_tlv_header *tlvh)  { -  struct ri_pce_subtlv_address *top = (struct ri_pce_subtlv_address *) tlvh; - -  if (ntohs (top->address.type) == PCE_ADDRESS_TYPE_IPV4) -    { -      if (vty != NULL) -        vty_out (vty, "  PCE Address: %s%s", inet_ntoa (top->address.value), -                 VTY_NEWLINE); -      else -        zlog_debug ("    PCE Address: %s", inet_ntoa (top->address.value)); -    } -  else -    { -      /* TODO: Add support to IPv6 with inet_ntop() */ -      if (vty != NULL) -        vty_out (vty, "  PCE Address: 0x%x%s", -                 ntohl (top->address.value.s_addr), VTY_NEWLINE); -      else -        zlog_debug ("    PCE Address: 0x%x", -                    ntohl (top->address.value.s_addr)); -    } - -  return RI_TLV_SIZE (tlvh); +	struct ri_pce_subtlv_address *top = +		(struct ri_pce_subtlv_address *)tlvh; + +	if (ntohs(top->address.type) == PCE_ADDRESS_TYPE_IPV4) { +		if (vty != NULL) +			vty_out(vty, "  PCE Address: %s%s", +				inet_ntoa(top->address.value), VTY_NEWLINE); +		else +			zlog_debug("    PCE Address: %s", +				   inet_ntoa(top->address.value)); +	} else { +		/* TODO: Add support to IPv6 with inet_ntop() */ +		if (vty != NULL) +			vty_out(vty, "  PCE Address: 0x%x%s", +				ntohl(top->address.value.s_addr), VTY_NEWLINE); +		else +			zlog_debug("    PCE Address: 0x%x", +				   ntohl(top->address.value.s_addr)); +	} + +	return RI_TLV_SIZE(tlvh);  } -static u_int16_t -show_vty_pce_subtlv_path_scope (struct vty *vty, struct ri_tlv_header *tlvh) +static u_int16_t show_vty_pce_subtlv_path_scope(struct vty *vty, +						struct ri_tlv_header *tlvh)  { -  struct ri_pce_subtlv_path_scope *top = -    (struct ri_pce_subtlv_path_scope *) tlvh; +	struct ri_pce_subtlv_path_scope *top = +		(struct ri_pce_subtlv_path_scope *)tlvh; -  if (vty != NULL) -    vty_out (vty, "  PCE Path Scope: 0x%x%s", ntohl (top->value), -             VTY_NEWLINE); -  else -    zlog_debug ("    PCE Path Scope: 0x%x", ntohl (top->value)); +	if (vty != NULL) +		vty_out(vty, "  PCE Path Scope: 0x%x%s", ntohl(top->value), +			VTY_NEWLINE); +	else +		zlog_debug("    PCE Path Scope: 0x%x", ntohl(top->value)); -  return RI_TLV_SIZE (tlvh); +	return RI_TLV_SIZE(tlvh);  } -static u_int16_t -show_vty_pce_subtlv_domain (struct vty *vty, struct ri_tlv_header *tlvh) +static u_int16_t show_vty_pce_subtlv_domain(struct vty *vty, +					    struct ri_tlv_header *tlvh)  { -  struct ri_pce_subtlv_domain *top = (struct ri_pce_subtlv_domain *) tlvh; -  struct in_addr tmp; - -  if (ntohs (top->type) == PCE_DOMAIN_TYPE_AREA) -    { -      tmp.s_addr = top->value; -      if (vty != NULL) -        vty_out (vty, "  PCE domain Area: %s%s", inet_ntoa (tmp), -                 VTY_NEWLINE); -      else -        zlog_debug ("    PCE domain Area: %s", inet_ntoa (tmp)); -    } -  else -    { -      if (vty != NULL) -        vty_out (vty, "  PCE domain AS: %d%s", ntohl (top->value), -                 VTY_NEWLINE); -      else -        zlog_debug ("    PCE domain AS: %d", ntohl (top->value)); -    } -  return RI_TLV_SIZE (tlvh); +	struct ri_pce_subtlv_domain *top = (struct ri_pce_subtlv_domain *)tlvh; +	struct in_addr tmp; + +	if (ntohs(top->type) == PCE_DOMAIN_TYPE_AREA) { +		tmp.s_addr = top->value; +		if (vty != NULL) +			vty_out(vty, "  PCE domain Area: %s%s", inet_ntoa(tmp), +				VTY_NEWLINE); +		else +			zlog_debug("    PCE domain Area: %s", inet_ntoa(tmp)); +	} else { +		if (vty != NULL) +			vty_out(vty, "  PCE domain AS: %d%s", ntohl(top->value), +				VTY_NEWLINE); +		else +			zlog_debug("    PCE domain AS: %d", ntohl(top->value)); +	} +	return RI_TLV_SIZE(tlvh);  } -static u_int16_t -show_vty_pce_subtlv_neighbor (struct vty *vty, struct ri_tlv_header *tlvh) +static u_int16_t show_vty_pce_subtlv_neighbor(struct vty *vty, +					      struct ri_tlv_header *tlvh)  { -  struct ri_pce_subtlv_neighbor *top = (struct ri_pce_subtlv_neighbor *) tlvh; -  struct in_addr tmp; - -  if (ntohs (top->type) == PCE_DOMAIN_TYPE_AREA) -    { -      tmp.s_addr = top->value; -      if (vty != NULL) -        vty_out (vty, "  PCE neighbor Area: %s%s", inet_ntoa (tmp), -                 VTY_NEWLINE); -      else -        zlog_debug ("    PCE neighbor Area: %s", inet_ntoa (tmp)); -    } -  else -    { -      if (vty != NULL) -        vty_out (vty, "  PCE neighbor AS: %d%s", ntohl (top->value), -                 VTY_NEWLINE); -      else -        zlog_debug ("    PCE neighbor AS: %d", ntohl (top->value)); -    } -  return RI_TLV_SIZE (tlvh); +	struct ri_pce_subtlv_neighbor *top = +		(struct ri_pce_subtlv_neighbor *)tlvh; +	struct in_addr tmp; + +	if (ntohs(top->type) == PCE_DOMAIN_TYPE_AREA) { +		tmp.s_addr = top->value; +		if (vty != NULL) +			vty_out(vty, "  PCE neighbor Area: %s%s", +				inet_ntoa(tmp), VTY_NEWLINE); +		else +			zlog_debug("    PCE neighbor Area: %s", inet_ntoa(tmp)); +	} else { +		if (vty != NULL) +			vty_out(vty, "  PCE neighbor AS: %d%s", +				ntohl(top->value), VTY_NEWLINE); +		else +			zlog_debug("    PCE neighbor AS: %d", +				   ntohl(top->value)); +	} +	return RI_TLV_SIZE(tlvh);  } -static u_int16_t -show_vty_pce_subtlv_cap_flag (struct vty *vty, struct ri_tlv_header *tlvh) +static u_int16_t show_vty_pce_subtlv_cap_flag(struct vty *vty, +					      struct ri_tlv_header *tlvh)  { -  struct ri_pce_subtlv_cap_flag *top = (struct ri_pce_subtlv_cap_flag *) tlvh; +	struct ri_pce_subtlv_cap_flag *top = +		(struct ri_pce_subtlv_cap_flag *)tlvh; -  if (vty != NULL) -    vty_out (vty, "  PCE Capabilities Flag: 0x%x%s", ntohl (top->value), -             VTY_NEWLINE); -  else -    zlog_debug ("    PCE Capabilities Flag: 0x%x", ntohl (top->value)); +	if (vty != NULL) +		vty_out(vty, "  PCE Capabilities Flag: 0x%x%s", +			ntohl(top->value), VTY_NEWLINE); +	else +		zlog_debug("    PCE Capabilities Flag: 0x%x", +			   ntohl(top->value)); -  return RI_TLV_SIZE (tlvh); +	return RI_TLV_SIZE(tlvh);  } -static u_int16_t -show_vty_unknown_tlv (struct vty *vty, struct ri_tlv_header *tlvh) +static u_int16_t show_vty_unknown_tlv(struct vty *vty, +				      struct ri_tlv_header *tlvh)  { -  if (vty != NULL) -    vty_out (vty, "  Unknown TLV: [type(0x%x), length(0x%x)]%s", -             ntohs (tlvh->type), ntohs (tlvh->length), VTY_NEWLINE); -  else -    zlog_debug ("    Unknown TLV: [type(0x%x), length(0x%x)]", -                ntohs (tlvh->type), ntohs (tlvh->length)); - -  return RI_TLV_SIZE (tlvh); +	if (vty != NULL) +		vty_out(vty, "  Unknown TLV: [type(0x%x), length(0x%x)]%s", +			ntohs(tlvh->type), ntohs(tlvh->length), VTY_NEWLINE); +	else +		zlog_debug("    Unknown TLV: [type(0x%x), length(0x%x)]", +			   ntohs(tlvh->type), ntohs(tlvh->length)); + +	return RI_TLV_SIZE(tlvh);  } -static u_int16_t -show_vty_pce_info (struct vty *vty, struct ri_tlv_header *ri, uint32_t total) +static u_int16_t show_vty_pce_info(struct vty *vty, struct ri_tlv_header *ri, +				   uint32_t total)  { -  struct ri_tlv_header *tlvh; -  u_int16_t sum = 0; - -  for (tlvh = ri; sum < total; tlvh = RI_TLV_HDR_NEXT (tlvh)) -    { -      switch (ntohs (tlvh->type)) -        { -        case RI_PCE_SUBTLV_ADDRESS: -          sum += show_vty_pce_subtlv_address (vty, tlvh); -          break; -        case RI_PCE_SUBTLV_PATH_SCOPE: -          sum += show_vty_pce_subtlv_path_scope (vty, tlvh); -          break; -        case RI_PCE_SUBTLV_DOMAIN: -          sum += show_vty_pce_subtlv_domain (vty, tlvh); -          break; -        case RI_PCE_SUBTLV_NEIGHBOR: -          sum += show_vty_pce_subtlv_neighbor (vty, tlvh); -          break; -        case RI_PCE_SUBTLV_CAP_FLAG: -          sum += show_vty_pce_subtlv_cap_flag (vty, tlvh); -          break; -        default: -          sum += show_vty_unknown_tlv (vty, tlvh); -          break; -        } -    } -  return sum; +	struct ri_tlv_header *tlvh; +	u_int16_t sum = 0; + +	for (tlvh = ri; sum < total; tlvh = RI_TLV_HDR_NEXT(tlvh)) { +		switch (ntohs(tlvh->type)) { +		case RI_PCE_SUBTLV_ADDRESS: +			sum += show_vty_pce_subtlv_address(vty, tlvh); +			break; +		case RI_PCE_SUBTLV_PATH_SCOPE: +			sum += show_vty_pce_subtlv_path_scope(vty, tlvh); +			break; +		case RI_PCE_SUBTLV_DOMAIN: +			sum += show_vty_pce_subtlv_domain(vty, tlvh); +			break; +		case RI_PCE_SUBTLV_NEIGHBOR: +			sum += show_vty_pce_subtlv_neighbor(vty, tlvh); +			break; +		case RI_PCE_SUBTLV_CAP_FLAG: +			sum += show_vty_pce_subtlv_cap_flag(vty, tlvh); +			break; +		default: +			sum += show_vty_unknown_tlv(vty, tlvh); +			break; +		} +	} +	return sum;  } -static void -ospf_router_info_show_info (struct vty *vty, struct ospf_lsa *lsa) +static void ospf_router_info_show_info(struct vty *vty, struct ospf_lsa *lsa)  { -  struct lsa_header *lsah = (struct lsa_header *) lsa->data; -  struct ri_tlv_header *tlvh; -  u_int16_t length = 0, sum = 0; - -  /* Initialize TLV browsing */ -  length = ntohs (lsah->length) - OSPF_LSA_HEADER_SIZE; - -  for (tlvh = RI_TLV_HDR_TOP (lsah); sum < length; -       tlvh = RI_TLV_HDR_NEXT (tlvh)) -    { -      switch (ntohs (tlvh->type)) -        { -        case RI_TLV_CAPABILITIES: -          sum += show_vty_router_cap (vty, tlvh); -          break; -        case RI_TLV_PCE: -          tlvh++; -          sum += RI_TLV_HDR_SIZE; -          sum += show_vty_pce_info (vty, tlvh, length - sum); -          break; -        default: -          sum += show_vty_unknown_tlv (vty, tlvh); -          break; -        } -    } - -  return; +	struct lsa_header *lsah = (struct lsa_header *)lsa->data; +	struct ri_tlv_header *tlvh; +	u_int16_t length = 0, sum = 0; + +	/* Initialize TLV browsing */ +	length = ntohs(lsah->length) - OSPF_LSA_HEADER_SIZE; + +	for (tlvh = RI_TLV_HDR_TOP(lsah); sum < length; +	     tlvh = RI_TLV_HDR_NEXT(tlvh)) { +		switch (ntohs(tlvh->type)) { +		case RI_TLV_CAPABILITIES: +			sum += show_vty_router_cap(vty, tlvh); +			break; +		case RI_TLV_PCE: +			tlvh++; +			sum += RI_TLV_HDR_SIZE; +			sum += show_vty_pce_info(vty, tlvh, length - sum); +			break; +		default: +			sum += show_vty_unknown_tlv(vty, tlvh); +			break; +		} +	} + +	return;  } -static void -ospf_router_info_config_write_router (struct vty *vty) +static void ospf_router_info_config_write_router(struct vty *vty)  { -  struct ospf_pce_info *pce = &OspfRI.pce_info; -  struct listnode *node; -  struct ri_pce_subtlv_domain *domain; -  struct ri_pce_subtlv_neighbor *neighbor; -  struct in_addr tmp; - -  if (OspfRI.status == enabled) -    { -      if (OspfRI.scope == OSPF_OPAQUE_AS_LSA) -        vty_out (vty, " router-info as%s", VTY_NEWLINE); -      else -        vty_out (vty, " router-info area %s%s", inet_ntoa (OspfRI.area_id), -                 VTY_NEWLINE); - -      if (pce->pce_address.header.type != 0) -        vty_out (vty, "  pce address %s%s", -                 inet_ntoa (pce->pce_address.address.value), VTY_NEWLINE); - -      if (pce->pce_cap_flag.header.type != 0) -        vty_out (vty, "  pce flag 0x%x%s", ntohl (pce->pce_cap_flag.value), -                 VTY_NEWLINE); - -      for (ALL_LIST_ELEMENTS_RO (pce->pce_domain, node, domain)) -        { -          if (domain->header.type != 0) -            { -              if (domain->type == PCE_DOMAIN_TYPE_AREA) -                { -                  tmp.s_addr = domain->value; -                  vty_out (vty, "  pce domain area %s%s", inet_ntoa (tmp), -                           VTY_NEWLINE); -                } -              else -                { -                  vty_out (vty, "  pce domain as %d%s", ntohl (domain->value), -                           VTY_NEWLINE); -                } -            } -        } - -      for (ALL_LIST_ELEMENTS_RO (pce->pce_neighbor, node, neighbor)) -        { -          if (neighbor->header.type != 0) -            { -              if (neighbor->type == PCE_DOMAIN_TYPE_AREA) -                { -                  tmp.s_addr = neighbor->value; -                  vty_out (vty, "  pce neighbor area %s%s", inet_ntoa (tmp), -                           VTY_NEWLINE); -                } -              else -                { -                  vty_out (vty, "  pce neighbor as %d%s", -                           ntohl (neighbor->value), VTY_NEWLINE); -                } -            } -        } - -      if (pce->pce_scope.header.type != 0) -        vty_out (vty, "  pce scope 0x%x%s", -                 ntohl (OspfRI.pce_info.pce_scope.value), VTY_NEWLINE); -    } -  return; +	struct ospf_pce_info *pce = &OspfRI.pce_info; +	struct listnode *node; +	struct ri_pce_subtlv_domain *domain; +	struct ri_pce_subtlv_neighbor *neighbor; +	struct in_addr tmp; + +	if (OspfRI.status == enabled) { +		if (OspfRI.scope == OSPF_OPAQUE_AS_LSA) +			vty_out(vty, " router-info as%s", VTY_NEWLINE); +		else +			vty_out(vty, " router-info area %s%s", +				inet_ntoa(OspfRI.area_id), VTY_NEWLINE); + +		if (pce->pce_address.header.type != 0) +			vty_out(vty, "  pce address %s%s", +				inet_ntoa(pce->pce_address.address.value), +				VTY_NEWLINE); + +		if (pce->pce_cap_flag.header.type != 0) +			vty_out(vty, "  pce flag 0x%x%s", +				ntohl(pce->pce_cap_flag.value), VTY_NEWLINE); + +		for (ALL_LIST_ELEMENTS_RO(pce->pce_domain, node, domain)) { +			if (domain->header.type != 0) { +				if (domain->type == PCE_DOMAIN_TYPE_AREA) { +					tmp.s_addr = domain->value; +					vty_out(vty, "  pce domain area %s%s", +						inet_ntoa(tmp), VTY_NEWLINE); +				} else { +					vty_out(vty, "  pce domain as %d%s", +						ntohl(domain->value), +						VTY_NEWLINE); +				} +			} +		} + +		for (ALL_LIST_ELEMENTS_RO(pce->pce_neighbor, node, neighbor)) { +			if (neighbor->header.type != 0) { +				if (neighbor->type == PCE_DOMAIN_TYPE_AREA) { +					tmp.s_addr = neighbor->value; +					vty_out(vty, "  pce neighbor area %s%s", +						inet_ntoa(tmp), VTY_NEWLINE); +				} else { +					vty_out(vty, "  pce neighbor as %d%s", +						ntohl(neighbor->value), +						VTY_NEWLINE); +				} +			} +		} + +		if (pce->pce_scope.header.type != 0) +			vty_out(vty, "  pce scope 0x%x%s", +				ntohl(OspfRI.pce_info.pce_scope.value), +				VTY_NEWLINE); +	} +	return;  }  /*------------------------------------------------------------------------* @@ -1182,56 +1120,54 @@ DEFUN (router_info,         "Enable the Router Information functionality with Area flooding scope\n"         "OSPF area ID in IP format")  { -  int idx_ipv4 = 2; -  char *area = (argc == 3) ? argv[idx_ipv4]->arg : NULL; - -  u_int8_t scope; - -  if (OspfRI.status == enabled) -    return CMD_SUCCESS; - -  /* Check and get Area value if present */ -  if (area) -    { -      inet_aton (area, &OspfRI.area_id); -      scope = OSPF_OPAQUE_AREA_LSA; -    } -  else -    { -      OspfRI.area_id.s_addr = 0; -      scope = OSPF_OPAQUE_AS_LSA; -    } - -  /* First start to register Router Information callbacks */ -  if ((ospf_router_info_register (scope)) != 0) -    { -      zlog_warn ("Enable to register Router Information callbacks. Abort!"); -      return CMD_WARNING; -    } - -  OspfRI.status = enabled; - -  if (IS_DEBUG_OSPF_EVENT) -    zlog_debug ("RI-> Router Information (%s flooding): OFF -> ON", -                 OspfRI.scope == OSPF_OPAQUE_AREA_LSA ? "Area" : "AS"); - -  /* -   * Following code is intended to handle two cases; -   * -   * 1) Router Information was disabled at startup time, but now become enabled. -   * 2) Router Information was once enabled then disabled, and now enabled again. -   */ - -  initialize_params (&OspfRI); - -  /* Refresh RI LSA if already engaged */ -  if (OspfRI.flags & RIFLG_LSA_ENGAGED) -    { -      zlog_debug ("RI-> Initial origination following configuration"); -      ospf_router_info_lsa_schedule (REORIGINATE_THIS_LSA); -    } -  return CMD_SUCCESS; - +	int idx_ipv4 = 2; +	char *area = (argc == 3) ? argv[idx_ipv4]->arg : NULL; + +	u_int8_t scope; + +	if (OspfRI.status == enabled) +		return CMD_SUCCESS; + +	/* Check and get Area value if present */ +	if (area) { +		inet_aton(area, &OspfRI.area_id); +		scope = OSPF_OPAQUE_AREA_LSA; +	} else { +		OspfRI.area_id.s_addr = 0; +		scope = OSPF_OPAQUE_AS_LSA; +	} + +	/* First start to register Router Information callbacks */ +	if ((ospf_router_info_register(scope)) != 0) { +		zlog_warn( +			"Enable to register Router Information callbacks. Abort!"); +		return CMD_WARNING; +	} + +	OspfRI.status = enabled; + +	if (IS_DEBUG_OSPF_EVENT) +		zlog_debug("RI-> Router Information (%s flooding): OFF -> ON", +			   OspfRI.scope == OSPF_OPAQUE_AREA_LSA ? "Area" +								: "AS"); + +	/* +	 * Following code is intended to handle two cases; +	 * +	 * 1) Router Information was disabled at startup time, but now become +	 * enabled. +	 * 2) Router Information was once enabled then disabled, and now enabled +	 * again. +	 */ + +	initialize_params(&OspfRI); + +	/* Refresh RI LSA if already engaged */ +	if (OspfRI.flags & RIFLG_LSA_ENGAGED) { +		zlog_debug("RI-> Initial origination following configuration"); +		ospf_router_info_lsa_schedule(REORIGINATE_THIS_LSA); +	} +	return CMD_SUCCESS;  } @@ -1242,33 +1178,32 @@ DEFUN (no_router_info,         "Disable the Router Information functionality\n")  { -  if (OspfRI.status == disabled) -    return CMD_SUCCESS; +	if (OspfRI.status == disabled) +		return CMD_SUCCESS; -  if (IS_DEBUG_OSPF_EVENT) -    zlog_debug ("RI-> Router Information: ON -> OFF"); +	if (IS_DEBUG_OSPF_EVENT) +		zlog_debug("RI-> Router Information: ON -> OFF"); -  if (OspfRI.flags & RIFLG_LSA_ENGAGED) -    ospf_router_info_lsa_schedule (FLUSH_THIS_LSA); +	if (OspfRI.flags & RIFLG_LSA_ENGAGED) +		ospf_router_info_lsa_schedule(FLUSH_THIS_LSA); -  /* Unregister the callbacks */ -  ospf_router_info_unregister (); +	/* Unregister the callbacks */ +	ospf_router_info_unregister(); -  OspfRI.status = disabled; +	OspfRI.status = disabled; -  return CMD_SUCCESS; +	return CMD_SUCCESS;  } -static int -ospf_ri_enabled (struct vty *vty) +static int ospf_ri_enabled(struct vty *vty)  { -  if (OspfRI.status == enabled) -    return 1; +	if (OspfRI.status == enabled) +		return 1; -  if (vty) -    vty_out (vty, "%% OSPF RI is not turned on%s", VTY_NEWLINE); +	if (vty) +		vty_out(vty, "%% OSPF RI is not turned on%s", VTY_NEWLINE); -  return 0; +	return 0;  }  DEFUN (pce_address, @@ -1278,31 +1213,31 @@ DEFUN (pce_address,         "Stable IP address of the PCE\n"         "PCE address in IPv4 address format\n")  { -  int idx_ipv4 = 2; -  struct in_addr value; -  struct ospf_pce_info *pi = &OspfRI.pce_info; +	int idx_ipv4 = 2; +	struct in_addr value; +	struct ospf_pce_info *pi = &OspfRI.pce_info; -  if (!ospf_ri_enabled (vty)) -    return CMD_WARNING; +	if (!ospf_ri_enabled(vty)) +		return CMD_WARNING; -  if (!inet_aton (argv[idx_ipv4]->arg, &value)) -    { -      vty_out (vty, "Please specify PCE Address by A.B.C.D%s", VTY_NEWLINE); -      return CMD_WARNING; -    } +	if (!inet_aton(argv[idx_ipv4]->arg, &value)) { +		vty_out(vty, "Please specify PCE Address by A.B.C.D%s", +			VTY_NEWLINE); +		return CMD_WARNING; +	} -  if (ntohs (pi->pce_address.header.type) == 0 -      || ntohl (pi->pce_address.address.value.s_addr) != ntohl (value.s_addr)) -    { +	if (ntohs(pi->pce_address.header.type) == 0 +	    || ntohl(pi->pce_address.address.value.s_addr) +		       != ntohl(value.s_addr)) { -      set_pce_address (value, pi); +		set_pce_address(value, pi); -      /* Refresh RI LSA if already engaged */ -      if (OspfRI.flags & RIFLG_LSA_ENGAGED) -        ospf_router_info_lsa_schedule (REFRESH_THIS_LSA); -    } +		/* Refresh RI LSA if already engaged */ +		if (OspfRI.flags & RIFLG_LSA_ENGAGED) +			ospf_router_info_lsa_schedule(REFRESH_THIS_LSA); +	} -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (no_pce_address, @@ -1314,13 +1249,13 @@ DEFUN (no_pce_address,         "PCE address in IPv4 address format\n")  { -  unset_param (&OspfRI.pce_info.pce_address.header); +	unset_param(&OspfRI.pce_info.pce_address.header); -  /* Refresh RI LSA if already engaged */ -  if ((OspfRI.status == enabled) && (OspfRI.flags & RIFLG_LSA_ENGAGED)) -    ospf_router_info_lsa_schedule (REFRESH_THIS_LSA); +	/* Refresh RI LSA if already engaged */ +	if ((OspfRI.status == enabled) && (OspfRI.flags & RIFLG_LSA_ENGAGED)) +		ospf_router_info_lsa_schedule(REFRESH_THIS_LSA); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (pce_path_scope, @@ -1330,30 +1265,29 @@ DEFUN (pce_path_scope,         "Path scope visibilities of the PCE for path computation\n"         "32-bit Hexadecimal value\n")  { -  int idx_bitpattern = 2; -  uint32_t scope; -  struct ospf_pce_info *pi = &OspfRI.pce_info; - -  if (!ospf_ri_enabled (vty)) -    return CMD_WARNING; - -  if (sscanf (argv[idx_bitpattern]->arg, "0x%x", &scope) != 1) -    { -      vty_out (vty, "pce_path_scope: fscanf: %s%s", safe_strerror (errno), -               VTY_NEWLINE); -      return CMD_WARNING; -    } - -  if (ntohl (pi->pce_scope.header.type) == 0 || scope != pi->pce_scope.value) -    { -      set_pce_path_scope (scope, pi); - -      /* Refresh RI LSA if already engaged */ -      if (OspfRI.flags & RIFLG_LSA_ENGAGED) -        ospf_router_info_lsa_schedule (REFRESH_THIS_LSA); -    } - -  return CMD_SUCCESS; +	int idx_bitpattern = 2; +	uint32_t scope; +	struct ospf_pce_info *pi = &OspfRI.pce_info; + +	if (!ospf_ri_enabled(vty)) +		return CMD_WARNING; + +	if (sscanf(argv[idx_bitpattern]->arg, "0x%x", &scope) != 1) { +		vty_out(vty, "pce_path_scope: fscanf: %s%s", +			safe_strerror(errno), VTY_NEWLINE); +		return CMD_WARNING; +	} + +	if (ntohl(pi->pce_scope.header.type) == 0 +	    || scope != pi->pce_scope.value) { +		set_pce_path_scope(scope, pi); + +		/* Refresh RI LSA if already engaged */ +		if (OspfRI.flags & RIFLG_LSA_ENGAGED) +			ospf_router_info_lsa_schedule(REFRESH_THIS_LSA); +	} + +	return CMD_SUCCESS;  }  DEFUN (no_pce_path_scope, @@ -1365,13 +1299,13 @@ DEFUN (no_pce_path_scope,         "32-bit Hexadecimal value\n")  { -  unset_param (&OspfRI.pce_info.pce_address.header); +	unset_param(&OspfRI.pce_info.pce_address.header); -  /* Refresh RI LSA if already engaged */ -  if ((OspfRI.status == enabled) && (OspfRI.flags & RIFLG_LSA_ENGAGED)) -    ospf_router_info_lsa_schedule (REFRESH_THIS_LSA); +	/* Refresh RI LSA if already engaged */ +	if ((OspfRI.status == enabled) && (OspfRI.flags & RIFLG_LSA_ENGAGED)) +		ospf_router_info_lsa_schedule(REFRESH_THIS_LSA); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (pce_domain, @@ -1382,38 +1316,36 @@ DEFUN (pce_domain,         "AS number where the PCE as visibilities for path computation\n"         "AS number in decimal <0-65535>\n")  { -  int idx_number = 3; - -  uint32_t as; -  struct ospf_pce_info *pce = &OspfRI.pce_info; -  struct listnode *node; -  struct ri_pce_subtlv_domain *domain; - -  if (!ospf_ri_enabled (vty)) -    return CMD_WARNING; - -  if (sscanf (argv[idx_number]->arg, "%d", &as) != 1) -    { -      vty_out (vty, "pce_domain: fscanf: %s%s", safe_strerror (errno), -               VTY_NEWLINE); -      return CMD_WARNING; -    } - -  /* Check if the domain is not already in the domain list */ -  for (ALL_LIST_ELEMENTS_RO (pce->pce_domain, node, domain)) -    { -      if (ntohl (domain->header.type) == 0 && as == domain->value) -        return CMD_SUCCESS; -    } - -  /* Create new domain if not found */ -  set_pce_domain (PCE_DOMAIN_TYPE_AS, as, pce); - -  /* Refresh RI LSA if already engaged */ -  if (OspfRI.flags & RIFLG_LSA_ENGAGED) -    ospf_router_info_lsa_schedule (REFRESH_THIS_LSA); - -  return CMD_SUCCESS; +	int idx_number = 3; + +	uint32_t as; +	struct ospf_pce_info *pce = &OspfRI.pce_info; +	struct listnode *node; +	struct ri_pce_subtlv_domain *domain; + +	if (!ospf_ri_enabled(vty)) +		return CMD_WARNING; + +	if (sscanf(argv[idx_number]->arg, "%d", &as) != 1) { +		vty_out(vty, "pce_domain: fscanf: %s%s", safe_strerror(errno), +			VTY_NEWLINE); +		return CMD_WARNING; +	} + +	/* Check if the domain is not already in the domain list */ +	for (ALL_LIST_ELEMENTS_RO(pce->pce_domain, node, domain)) { +		if (ntohl(domain->header.type) == 0 && as == domain->value) +			return CMD_SUCCESS; +	} + +	/* Create new domain if not found */ +	set_pce_domain(PCE_DOMAIN_TYPE_AS, as, pce); + +	/* Refresh RI LSA if already engaged */ +	if (OspfRI.flags & RIFLG_LSA_ENGAGED) +		ospf_router_info_lsa_schedule(REFRESH_THIS_LSA); + +	return CMD_SUCCESS;  }  DEFUN (no_pce_domain, @@ -1425,26 +1357,25 @@ DEFUN (no_pce_domain,         "AS number where the PCE as visibilities for path computation\n"         "AS number in decimal <0-65535>\n")  { -  int idx_number = 4; +	int idx_number = 4; -  uint32_t as; -  struct ospf_pce_info *pce = &OspfRI.pce_info; +	uint32_t as; +	struct ospf_pce_info *pce = &OspfRI.pce_info; -  if (sscanf (argv[idx_number]->arg, "%d", &as) != 1) -    { -      vty_out (vty, "no_pce_domain: fscanf: %s%s", safe_strerror (errno), -               VTY_NEWLINE); -      return CMD_WARNING; -    } +	if (sscanf(argv[idx_number]->arg, "%d", &as) != 1) { +		vty_out(vty, "no_pce_domain: fscanf: %s%s", +			safe_strerror(errno), VTY_NEWLINE); +		return CMD_WARNING; +	} -  /* Unset corresponding PCE domain */ -  unset_pce_domain (PCE_DOMAIN_TYPE_AS, as, pce); +	/* Unset corresponding PCE domain */ +	unset_pce_domain(PCE_DOMAIN_TYPE_AS, as, pce); -  /* Refresh RI LSA if already engaged */ -  if ((OspfRI.status == enabled) && (OspfRI.flags & RIFLG_LSA_ENGAGED)) -    ospf_router_info_lsa_schedule (REFRESH_THIS_LSA); +	/* Refresh RI LSA if already engaged */ +	if ((OspfRI.status == enabled) && (OspfRI.flags & RIFLG_LSA_ENGAGED)) +		ospf_router_info_lsa_schedule(REFRESH_THIS_LSA); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (pce_neigbhor, @@ -1455,38 +1386,36 @@ DEFUN (pce_neigbhor,         "AS number of PCE neighbors\n"         "AS number in decimal <0-65535>\n")  { -  int idx_number = 3; - -  uint32_t as; -  struct ospf_pce_info *pce = &OspfRI.pce_info; -  struct listnode *node; -  struct ri_pce_subtlv_neighbor *neighbor; - -  if (!ospf_ri_enabled (vty)) -    return CMD_WARNING; - -  if (sscanf (argv[idx_number]->arg, "%d", &as) != 1) -    { -      vty_out (vty, "pce_neighbor: fscanf: %s%s", safe_strerror (errno), -               VTY_NEWLINE); -      return CMD_WARNING; -    } - -  /* Check if the domain is not already in the domain list */ -  for (ALL_LIST_ELEMENTS_RO (pce->pce_neighbor, node, neighbor)) -    { -      if (ntohl (neighbor->header.type) == 0 && as == neighbor->value) -        return CMD_SUCCESS; -    } - -  /* Create new domain if not found */ -  set_pce_neighbor (PCE_DOMAIN_TYPE_AS, as, pce); - -  /* Refresh RI LSA if already engaged */ -  if (OspfRI.flags & RIFLG_LSA_ENGAGED) -    ospf_router_info_lsa_schedule (REFRESH_THIS_LSA); - -  return CMD_SUCCESS; +	int idx_number = 3; + +	uint32_t as; +	struct ospf_pce_info *pce = &OspfRI.pce_info; +	struct listnode *node; +	struct ri_pce_subtlv_neighbor *neighbor; + +	if (!ospf_ri_enabled(vty)) +		return CMD_WARNING; + +	if (sscanf(argv[idx_number]->arg, "%d", &as) != 1) { +		vty_out(vty, "pce_neighbor: fscanf: %s%s", safe_strerror(errno), +			VTY_NEWLINE); +		return CMD_WARNING; +	} + +	/* Check if the domain is not already in the domain list */ +	for (ALL_LIST_ELEMENTS_RO(pce->pce_neighbor, node, neighbor)) { +		if (ntohl(neighbor->header.type) == 0 && as == neighbor->value) +			return CMD_SUCCESS; +	} + +	/* Create new domain if not found */ +	set_pce_neighbor(PCE_DOMAIN_TYPE_AS, as, pce); + +	/* Refresh RI LSA if already engaged */ +	if (OspfRI.flags & RIFLG_LSA_ENGAGED) +		ospf_router_info_lsa_schedule(REFRESH_THIS_LSA); + +	return CMD_SUCCESS;  }  DEFUN (no_pce_neighbor, @@ -1498,26 +1427,25 @@ DEFUN (no_pce_neighbor,         "AS number of PCE neighbor\n"         "AS number in decimal <0-65535>\n")  { -  int idx_number = 4; +	int idx_number = 4; -  uint32_t as; -  struct ospf_pce_info *pce = &OspfRI.pce_info; +	uint32_t as; +	struct ospf_pce_info *pce = &OspfRI.pce_info; -  if (sscanf (argv[idx_number]->arg, "%d", &as) != 1) -    { -      vty_out (vty, "no_pce_neighbor: fscanf: %s%s", safe_strerror (errno), -               VTY_NEWLINE); -      return CMD_WARNING; -    } +	if (sscanf(argv[idx_number]->arg, "%d", &as) != 1) { +		vty_out(vty, "no_pce_neighbor: fscanf: %s%s", +			safe_strerror(errno), VTY_NEWLINE); +		return CMD_WARNING; +	} -  /* Unset corresponding PCE domain */ -  unset_pce_neighbor (PCE_DOMAIN_TYPE_AS, as, pce); +	/* Unset corresponding PCE domain */ +	unset_pce_neighbor(PCE_DOMAIN_TYPE_AS, as, pce); -  /* Refresh RI LSA if already engaged */ -  if ((OspfRI.status == enabled) && (OspfRI.flags & RIFLG_LSA_ENGAGED)) -    ospf_router_info_lsa_schedule (REFRESH_THIS_LSA); +	/* Refresh RI LSA if already engaged */ +	if ((OspfRI.status == enabled) && (OspfRI.flags & RIFLG_LSA_ENGAGED)) +		ospf_router_info_lsa_schedule(REFRESH_THIS_LSA); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (pce_cap_flag, @@ -1527,32 +1455,30 @@ DEFUN (pce_cap_flag,         "Capabilities of the PCE for path computation\n"         "32-bit Hexadecimal value\n")  { -  int idx_bitpattern = 2; +	int idx_bitpattern = 2; -  uint32_t cap; -  struct ospf_pce_info *pce = &OspfRI.pce_info; +	uint32_t cap; +	struct ospf_pce_info *pce = &OspfRI.pce_info; -  if (!ospf_ri_enabled (vty)) -    return CMD_WARNING; +	if (!ospf_ri_enabled(vty)) +		return CMD_WARNING; -  if (sscanf (argv[idx_bitpattern]->arg, "0x%x", &cap) != 1) -    { -      vty_out (vty, "pce_cap_flag: fscanf: %s%s", safe_strerror (errno), -               VTY_NEWLINE); -      return CMD_WARNING; -    } +	if (sscanf(argv[idx_bitpattern]->arg, "0x%x", &cap) != 1) { +		vty_out(vty, "pce_cap_flag: fscanf: %s%s", safe_strerror(errno), +			VTY_NEWLINE); +		return CMD_WARNING; +	} -  if (ntohl (pce->pce_cap_flag.header.type) == 0 -      || cap != pce->pce_cap_flag.value) -    { -      set_pce_cap_flag (cap, pce); +	if (ntohl(pce->pce_cap_flag.header.type) == 0 +	    || cap != pce->pce_cap_flag.value) { +		set_pce_cap_flag(cap, pce); -      /* Refresh RI LSA if already engaged */ -      if (OspfRI.flags & RIFLG_LSA_ENGAGED) -        ospf_router_info_lsa_schedule (REFRESH_THIS_LSA); -    } +		/* Refresh RI LSA if already engaged */ +		if (OspfRI.flags & RIFLG_LSA_ENGAGED) +			ospf_router_info_lsa_schedule(REFRESH_THIS_LSA); +	} -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (no_pce_cap_flag, @@ -1563,13 +1489,13 @@ DEFUN (no_pce_cap_flag,         "Disable PCE capabilities\n")  { -  unset_param (&OspfRI.pce_info.pce_cap_flag.header); +	unset_param(&OspfRI.pce_info.pce_cap_flag.header); -  /* Refresh RI LSA if already engaged */ -  if ((OspfRI.status == enabled) && (OspfRI.flags & RIFLG_LSA_ENGAGED)) -    ospf_router_info_lsa_schedule (REFRESH_THIS_LSA); +	/* Refresh RI LSA if already engaged */ +	if ((OspfRI.status == enabled) && (OspfRI.flags & RIFLG_LSA_ENGAGED)) +		ospf_router_info_lsa_schedule(REFRESH_THIS_LSA); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (show_ip_ospf_router_info, @@ -1581,17 +1507,17 @@ DEFUN (show_ip_ospf_router_info,         "Router Information\n")  { -  if (OspfRI.status == enabled) -    { -      vty_out (vty, "--- Router Information parameters ---%s", VTY_NEWLINE); -      show_vty_router_cap (vty, &OspfRI.router_cap.header); -    } -  else -    { -      if (vty != NULL) -        vty_out (vty, "  Router Information is disabled on this router%s", VTY_NEWLINE); -    } -  return CMD_SUCCESS; +	if (OspfRI.status == enabled) { +		vty_out(vty, "--- Router Information parameters ---%s", +			VTY_NEWLINE); +		show_vty_router_cap(vty, &OspfRI.router_cap.header); +	} else { +		if (vty != NULL) +			vty_out(vty, +				"  Router Information is disabled on this router%s", +				VTY_NEWLINE); +	} +	return CMD_SUCCESS;  }  DEFUN (show_ip_opsf_router_info_pce, @@ -1604,65 +1530,65 @@ DEFUN (show_ip_opsf_router_info_pce,         "PCE information\n")  { -  struct ospf_pce_info *pce = &OspfRI.pce_info; -  struct listnode *node; -  struct ri_pce_subtlv_domain *domain; -  struct ri_pce_subtlv_neighbor *neighbor; - -  if (OspfRI.status == enabled) -    { -      vty_out (vty, "--- PCE parameters ---%s", VTY_NEWLINE); - -      if (pce->pce_address.header.type != 0) -        show_vty_pce_subtlv_address (vty, &pce->pce_address.header); - -      if (pce->pce_scope.header.type != 0) -        show_vty_pce_subtlv_path_scope (vty, &pce->pce_scope.header); - -      for (ALL_LIST_ELEMENTS_RO (pce->pce_domain, node, domain)) -        { -          if (domain->header.type != 0) -            show_vty_pce_subtlv_domain (vty, &domain->header); -        } - -      for (ALL_LIST_ELEMENTS_RO (pce->pce_neighbor, node, neighbor)) -        { -          if (neighbor->header.type != 0) -            show_vty_pce_subtlv_neighbor (vty, &neighbor->header); -        } - -      if (pce->pce_cap_flag.header.type != 0) -        show_vty_pce_subtlv_cap_flag (vty, &pce->pce_cap_flag.header); - -    } -  else -    { -      vty_out (vty, "  Router Information is disabled on this router%s", -               VTY_NEWLINE); -    } - -  return CMD_SUCCESS; +	struct ospf_pce_info *pce = &OspfRI.pce_info; +	struct listnode *node; +	struct ri_pce_subtlv_domain *domain; +	struct ri_pce_subtlv_neighbor *neighbor; + +	if (OspfRI.status == enabled) { +		vty_out(vty, "--- PCE parameters ---%s", VTY_NEWLINE); + +		if (pce->pce_address.header.type != 0) +			show_vty_pce_subtlv_address(vty, +						    &pce->pce_address.header); + +		if (pce->pce_scope.header.type != 0) +			show_vty_pce_subtlv_path_scope(vty, +						       &pce->pce_scope.header); + +		for (ALL_LIST_ELEMENTS_RO(pce->pce_domain, node, domain)) { +			if (domain->header.type != 0) +				show_vty_pce_subtlv_domain(vty, +							   &domain->header); +		} + +		for (ALL_LIST_ELEMENTS_RO(pce->pce_neighbor, node, neighbor)) { +			if (neighbor->header.type != 0) +				show_vty_pce_subtlv_neighbor(vty, +							     &neighbor->header); +		} + +		if (pce->pce_cap_flag.header.type != 0) +			show_vty_pce_subtlv_cap_flag(vty, +						     &pce->pce_cap_flag.header); + +	} else { +		vty_out(vty, +			"  Router Information is disabled on this router%s", +			VTY_NEWLINE); +	} + +	return CMD_SUCCESS;  }  /* Install new CLI commands */ -static void -ospf_router_info_register_vty (void) +static void ospf_router_info_register_vty(void)  { -  install_element (VIEW_NODE, &show_ip_ospf_router_info_cmd); -  install_element (VIEW_NODE, &show_ip_ospf_router_info_pce_cmd); - -  install_element (OSPF_NODE, &router_info_area_cmd); -  install_element (OSPF_NODE, &no_router_info_cmd); -  install_element (OSPF_NODE, &pce_address_cmd); -  install_element (OSPF_NODE, &no_pce_address_cmd); -  install_element (OSPF_NODE, &pce_path_scope_cmd); -  install_element (OSPF_NODE, &no_pce_path_scope_cmd); -  install_element (OSPF_NODE, &pce_domain_cmd); -  install_element (OSPF_NODE, &no_pce_domain_cmd); -  install_element (OSPF_NODE, &pce_neighbor_cmd); -  install_element (OSPF_NODE, &no_pce_neighbor_cmd); -  install_element (OSPF_NODE, &pce_cap_flag_cmd); -  install_element (OSPF_NODE, &no_pce_cap_flag_cmd); - -  return; +	install_element(VIEW_NODE, &show_ip_ospf_router_info_cmd); +	install_element(VIEW_NODE, &show_ip_ospf_router_info_pce_cmd); + +	install_element(OSPF_NODE, &router_info_area_cmd); +	install_element(OSPF_NODE, &no_router_info_cmd); +	install_element(OSPF_NODE, &pce_address_cmd); +	install_element(OSPF_NODE, &no_pce_address_cmd); +	install_element(OSPF_NODE, &pce_path_scope_cmd); +	install_element(OSPF_NODE, &no_pce_path_scope_cmd); +	install_element(OSPF_NODE, &pce_domain_cmd); +	install_element(OSPF_NODE, &no_pce_domain_cmd); +	install_element(OSPF_NODE, &pce_neighbor_cmd); +	install_element(OSPF_NODE, &no_pce_neighbor_cmd); +	install_element(OSPF_NODE, &pce_cap_flag_cmd); +	install_element(OSPF_NODE, &no_pce_cap_flag_cmd); + +	return;  }  | 
