diff options
Diffstat (limited to 'ospfd/ospf_te.c')
| -rw-r--r-- | ospfd/ospf_te.c | 4262 | 
1 files changed, 2119 insertions, 2143 deletions
diff --git a/ospfd/ospf_te.c b/ospfd/ospf_te.c index c34d97ff29..4ca6578eae 100644 --- a/ospfd/ospf_te.c +++ b/ospfd/ospf_te.c @@ -41,7 +41,7 @@  #include "log.h"  #include "thread.h"  #include "hash.h" -#include "sockunion.h"		/* for inet_aton() */ +#include "sockunion.h" /* for inet_aton() */  #include "network.h"  #include "ospfd/ospfd.h" @@ -68,1596 +68,1566 @@   */  struct ospf_mpls_te OspfMplsTE; -const char *mode2text[] = { "Disable", "AS", "Area", "Emulate" }; +const char *mode2text[] = {"Disable", "AS", "Area", "Emulate"}; -enum oifstate -{ -  OI_ANY, OI_DOWN, OI_UP -}; +enum oifstate { OI_ANY, OI_DOWN, OI_UP };  /*------------------------------------------------------------------------*   * Followings are initialize/terminate functions for MPLS-TE handling.   *------------------------------------------------------------------------*/ -static int ospf_mpls_te_new_if (struct interface *ifp); -static int ospf_mpls_te_del_if (struct interface *ifp); -static void ospf_mpls_te_ism_change (struct ospf_interface *oi, -                                     int old_status); -static void ospf_mpls_te_nsm_change (struct ospf_neighbor *nbr, int old_status); -static void ospf_mpls_te_config_write_router (struct vty *vty); -static void ospf_mpls_te_show_info (struct vty *vty, struct ospf_lsa *lsa); -static int ospf_mpls_te_lsa_originate_area (void *arg); -static int ospf_mpls_te_lsa_originate_as (void *arg); -static struct ospf_lsa *ospf_mpls_te_lsa_refresh (struct ospf_lsa *lsa); - -static void del_mpls_te_link (void *val); -static void ospf_mpls_te_register_vty (void); - -int -ospf_mpls_te_init (void) -{ -  int rc; - -  rc = ospf_register_opaque_functab ( -                OSPF_OPAQUE_AREA_LSA, -                OPAQUE_TYPE_TRAFFIC_ENGINEERING_LSA, -		ospf_mpls_te_new_if, -		ospf_mpls_te_del_if, -		ospf_mpls_te_ism_change, -		ospf_mpls_te_nsm_change, +static int ospf_mpls_te_new_if(struct interface *ifp); +static int ospf_mpls_te_del_if(struct interface *ifp); +static void ospf_mpls_te_ism_change(struct ospf_interface *oi, int old_status); +static void ospf_mpls_te_nsm_change(struct ospf_neighbor *nbr, int old_status); +static void ospf_mpls_te_config_write_router(struct vty *vty); +static void ospf_mpls_te_show_info(struct vty *vty, struct ospf_lsa *lsa); +static int ospf_mpls_te_lsa_originate_area(void *arg); +static int ospf_mpls_te_lsa_originate_as(void *arg); +static struct ospf_lsa *ospf_mpls_te_lsa_refresh(struct ospf_lsa *lsa); + +static void del_mpls_te_link(void *val); +static void ospf_mpls_te_register_vty(void); + +int ospf_mpls_te_init(void) +{ +	int rc; + +	rc = ospf_register_opaque_functab( +		OSPF_OPAQUE_AREA_LSA, OPAQUE_TYPE_TRAFFIC_ENGINEERING_LSA, +		ospf_mpls_te_new_if, ospf_mpls_te_del_if, +		ospf_mpls_te_ism_change, ospf_mpls_te_nsm_change,  		ospf_mpls_te_config_write_router, -		NULL,/*ospf_mpls_te_config_write_if */ -		NULL,/* ospf_mpls_te_config_write_debug */ -                ospf_mpls_te_show_info, -                ospf_mpls_te_lsa_originate_area, -                ospf_mpls_te_lsa_refresh, -		NULL,/* ospf_mpls_te_new_lsa_hook */ +		NULL, /*ospf_mpls_te_config_write_if */ +		NULL, /* ospf_mpls_te_config_write_debug */ +		ospf_mpls_te_show_info, ospf_mpls_te_lsa_originate_area, +		ospf_mpls_te_lsa_refresh, NULL, /* ospf_mpls_te_new_lsa_hook */  		NULL /* ospf_mpls_te_del_lsa_hook */); -  if (rc != 0) -    { -      zlog_warn ("ospf_mpls_te_init: Failed to register Traffic Engineering functions"); -      goto out; -    } +	if (rc != 0) { +		zlog_warn( +			"ospf_mpls_te_init: Failed to register Traffic Engineering functions"); +		goto out; +	} -  memset (&OspfMplsTE, 0, sizeof (struct ospf_mpls_te)); -  OspfMplsTE.status = disabled; -  OspfMplsTE.inter_as = Disable; -  OspfMplsTE.iflist = list_new (); -  OspfMplsTE.iflist->del = del_mpls_te_link; +	memset(&OspfMplsTE, 0, sizeof(struct ospf_mpls_te)); +	OspfMplsTE.status = disabled; +	OspfMplsTE.inter_as = Disable; +	OspfMplsTE.iflist = list_new(); +	OspfMplsTE.iflist->del = del_mpls_te_link; -  ospf_mpls_te_register_vty (); +	ospf_mpls_te_register_vty();  out: -  return rc; +	return rc;  }  /* Additional register for RFC5392 support */ -static int -ospf_mpls_te_register (enum inter_as_mode mode) +static int ospf_mpls_te_register(enum inter_as_mode mode)  { -  int rc; -  u_int8_t scope; +	int rc; +	u_int8_t scope; -  if (OspfMplsTE.inter_as != Disable) -    return 0; +	if (OspfMplsTE.inter_as != Disable) +		return 0; -  if (mode == AS) -    scope = OSPF_OPAQUE_AS_LSA; -  else -    scope = OSPF_OPAQUE_AREA_LSA; +	if (mode == AS) +		scope = OSPF_OPAQUE_AS_LSA; +	else +		scope = OSPF_OPAQUE_AREA_LSA; -  rc = ospf_register_opaque_functab (scope, -                                     OPAQUE_TYPE_INTER_AS_LSA, -                                     NULL, -                                     NULL, -                                     NULL, -                                     NULL, -                                     NULL, -                                     NULL, -                                     NULL, -                                     ospf_mpls_te_show_info, -                                     ospf_mpls_te_lsa_originate_as, -                                     ospf_mpls_te_lsa_refresh, NULL, NULL); +	rc = ospf_register_opaque_functab(scope, OPAQUE_TYPE_INTER_AS_LSA, NULL, +					  NULL, NULL, NULL, NULL, NULL, NULL, +					  ospf_mpls_te_show_info, +					  ospf_mpls_te_lsa_originate_as, +					  ospf_mpls_te_lsa_refresh, NULL, NULL); -  if (rc != 0) -    { -      zlog_warn ("ospf_router_info_init: Failed to register Inter-AS functions"); -      return rc; -    } +	if (rc != 0) { +		zlog_warn( +			"ospf_router_info_init: Failed to register Inter-AS functions"); +		return rc; +	} -  return 0; +	return 0;  } -static int -ospf_mpls_te_unregister () +static int ospf_mpls_te_unregister()  { -  u_int8_t scope; - -  if (OspfMplsTE.inter_as == Disable) -    return 0; +	u_int8_t scope; -  if (OspfMplsTE.inter_as == AS) -    scope = OSPF_OPAQUE_AS_LSA; -  else -    scope = OSPF_OPAQUE_AREA_LSA; +	if (OspfMplsTE.inter_as == Disable) +		return 0; -  ospf_delete_opaque_functab (scope, OPAQUE_TYPE_INTER_AS_LSA); +	if (OspfMplsTE.inter_as == AS) +		scope = OSPF_OPAQUE_AS_LSA; +	else +		scope = OSPF_OPAQUE_AREA_LSA; -  return 0; +	ospf_delete_opaque_functab(scope, OPAQUE_TYPE_INTER_AS_LSA); +	return 0;  } -void -ospf_mpls_te_term (void) +void ospf_mpls_te_term(void)  { -  list_delete (OspfMplsTE.iflist); -  OspfMplsTE.iflist = NULL; +	list_delete(OspfMplsTE.iflist); +	OspfMplsTE.iflist = NULL; -  ospf_delete_opaque_functab (OSPF_OPAQUE_AREA_LSA, -                              OPAQUE_TYPE_TRAFFIC_ENGINEERING_LSA); -  OspfMplsTE.status = disabled; +	ospf_delete_opaque_functab(OSPF_OPAQUE_AREA_LSA, +				   OPAQUE_TYPE_TRAFFIC_ENGINEERING_LSA); +	OspfMplsTE.status = disabled; -  ospf_mpls_te_unregister (); -  OspfMplsTE.inter_as = Disable; +	ospf_mpls_te_unregister(); +	OspfMplsTE.inter_as = Disable; -  return; +	return;  }  /*------------------------------------------------------------------------*   * Followings are control functions for MPLS-TE parameters management.   *------------------------------------------------------------------------*/ -static void -del_mpls_te_link (void *val) +static void del_mpls_te_link(void *val)  { -  XFREE (MTYPE_OSPF_MPLS_TE, val); -  return; +	XFREE(MTYPE_OSPF_MPLS_TE, val); +	return;  } -u_int32_t -get_mpls_te_instance_value (void) +u_int32_t get_mpls_te_instance_value(void)  { -  static u_int32_t seqno = 0; +	static u_int32_t seqno = 0; -  if (seqno < MAX_LEGAL_TE_INSTANCE_NUM ) -    seqno += 1; -  else -    seqno  = 1; /* Avoid zero. */ +	if (seqno < MAX_LEGAL_TE_INSTANCE_NUM) +		seqno += 1; +	else +		seqno = 1; /* Avoid zero. */ -  return seqno; +	return seqno;  } -static struct ospf_interface * -lookup_oi_by_ifp (struct interface *ifp, -                  struct ospf_area *area, enum oifstate oifstate) +static struct ospf_interface *lookup_oi_by_ifp(struct interface *ifp, +					       struct ospf_area *area, +					       enum oifstate oifstate)  { -  struct ospf_interface *oi = NULL; -  struct route_node *rn; +	struct ospf_interface *oi = NULL; +	struct route_node *rn; -  for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn)) -    { -      if ((oi = rn->info) == NULL) -        continue; +	for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next(rn)) { +		if ((oi = rn->info) == NULL) +			continue; -      switch (oifstate) -        { -        case OI_ANY: -          break; -        case OI_DOWN: -          if (ospf_if_is_enable (oi)) -            continue; -          break; -        case OI_UP: -          if (! ospf_if_is_enable (oi)) -            continue; -          break; -        default: -          zlog_warn ("lookup_oi_by_ifp: Unknown oifstate: %x", oifstate); -          goto out; -        } +		switch (oifstate) { +		case OI_ANY: +			break; +		case OI_DOWN: +			if (ospf_if_is_enable(oi)) +				continue; +			break; +		case OI_UP: +			if (!ospf_if_is_enable(oi)) +				continue; +			break; +		default: +			zlog_warn("lookup_oi_by_ifp: Unknown oifstate: %x", +				  oifstate); +			goto out; +		} -      if (area == NULL || oi->area == area) -        return oi; -    } +		if (area == NULL || oi->area == area) +			return oi; +	}  out: -  return NULL; +	return NULL;  } -static struct mpls_te_link * -lookup_linkparams_by_ifp (struct interface *ifp) +static struct mpls_te_link *lookup_linkparams_by_ifp(struct interface *ifp)  { -  struct listnode *node, *nnode; -  struct mpls_te_link *lp; +	struct listnode *node, *nnode; +	struct mpls_te_link *lp; -  for (ALL_LIST_ELEMENTS (OspfMplsTE.iflist, node, nnode, lp)) -    if (lp->ifp == ifp) -      return lp; +	for (ALL_LIST_ELEMENTS(OspfMplsTE.iflist, node, nnode, lp)) +		if (lp->ifp == ifp) +			return lp; -  return NULL; +	return NULL;  } -static struct mpls_te_link * -lookup_linkparams_by_instance (struct ospf_lsa *lsa) +static struct mpls_te_link *lookup_linkparams_by_instance(struct ospf_lsa *lsa)  { -  struct listnode *node; -  struct mpls_te_link *lp; -  unsigned int key = GET_OPAQUE_ID (ntohl (lsa->data->id.s_addr)); +	struct listnode *node; +	struct mpls_te_link *lp; +	unsigned int key = GET_OPAQUE_ID(ntohl(lsa->data->id.s_addr)); -  for (ALL_LIST_ELEMENTS_RO (OspfMplsTE.iflist, node, lp)) -    if (lp->instance == key) -      return lp; +	for (ALL_LIST_ELEMENTS_RO(OspfMplsTE.iflist, node, lp)) +		if (lp->instance == key) +			return lp; -  zlog_warn ("lookup_linkparams_by_instance: Entry not found: key(%x)", key); -  return NULL; +	zlog_warn("lookup_linkparams_by_instance: Entry not found: key(%x)", +		  key); +	return NULL;  } -static void -ospf_mpls_te_foreach_area (void (*func) -                           (struct mpls_te_link * lp, opcode_t sched_opcode), -                           opcode_t sched_opcode) +static void ospf_mpls_te_foreach_area(void (*func)(struct mpls_te_link *lp, +						   opcode_t sched_opcode), +				      opcode_t sched_opcode)  { -  struct listnode *node, *nnode;  -  struct listnode *node2; -  struct mpls_te_link *lp; -  struct ospf_area *area; +	struct listnode *node, *nnode; +	struct listnode *node2; +	struct mpls_te_link *lp; +	struct ospf_area *area; -  for (ALL_LIST_ELEMENTS (OspfMplsTE.iflist, node, nnode, lp)) -    { -      /* Skip Inter-AS TEv2 Links */ -      if (IS_INTER_AS (lp->type)) -        continue; -      if ((area = lp->area) == NULL) -        continue; -      if CHECK_FLAG (lp->flags, LPFLG_LOOKUP_DONE) continue; +	for (ALL_LIST_ELEMENTS(OspfMplsTE.iflist, node, nnode, lp)) { +		/* Skip Inter-AS TEv2 Links */ +		if (IS_INTER_AS(lp->type)) +			continue; +		if ((area = lp->area) == NULL) +			continue; +		if +			CHECK_FLAG(lp->flags, LPFLG_LOOKUP_DONE) continue; -      if (func != NULL) -        (* func)(lp, sched_opcode); +		if (func != NULL) +			(*func)(lp, sched_opcode); -      for (node2 = listnextnode (node); node2; node2 = listnextnode (node2)) -        if ((lp = listgetdata (node2)) != NULL) -          if (lp->area != NULL) -            if (IPV4_ADDR_SAME (&lp->area->area_id, &area->area_id)) -              SET_FLAG (lp->flags, LPFLG_LOOKUP_DONE); -    } +		for (node2 = listnextnode(node); node2; +		     node2 = listnextnode(node2)) +			if ((lp = listgetdata(node2)) != NULL) +				if (lp->area != NULL) +					if (IPV4_ADDR_SAME(&lp->area->area_id, +							   &area->area_id)) +						SET_FLAG(lp->flags, +							 LPFLG_LOOKUP_DONE); +	} -  for (ALL_LIST_ELEMENTS_RO (OspfMplsTE.iflist, node, lp)) -    if (lp->area != NULL) -      UNSET_FLAG (lp->flags, LPFLG_LOOKUP_DONE); +	for (ALL_LIST_ELEMENTS_RO(OspfMplsTE.iflist, node, lp)) +		if (lp->area != NULL) +			UNSET_FLAG(lp->flags, LPFLG_LOOKUP_DONE); -  return; +	return;  } -static void -set_mpls_te_router_addr (struct in_addr ipv4) +static void set_mpls_te_router_addr(struct in_addr ipv4)  { -  OspfMplsTE.router_addr.header.type   = htons (TE_TLV_ROUTER_ADDR); -  OspfMplsTE.router_addr.header.length = htons (TE_LINK_SUBTLV_DEF_SIZE); -  OspfMplsTE.router_addr.value = ipv4; -  return; +	OspfMplsTE.router_addr.header.type = htons(TE_TLV_ROUTER_ADDR); +	OspfMplsTE.router_addr.header.length = htons(TE_LINK_SUBTLV_DEF_SIZE); +	OspfMplsTE.router_addr.value = ipv4; +	return;  } -static void -set_linkparams_link_header (struct mpls_te_link *lp) +static void set_linkparams_link_header(struct mpls_te_link *lp)  { -  u_int16_t length = 0; +	u_int16_t length = 0; -  /* TE_LINK_SUBTLV_LINK_TYPE */ -  if (ntohs (lp->link_type.header.type) != 0) -    length += TLV_SIZE (&lp->link_type.header); +	/* TE_LINK_SUBTLV_LINK_TYPE */ +	if (ntohs(lp->link_type.header.type) != 0) +		length += TLV_SIZE(&lp->link_type.header); -  /* TE_LINK_SUBTLV_LINK_ID */ -  if (ntohs (lp->link_id.header.type) != 0) -    length += TLV_SIZE (&lp->link_id.header); +	/* TE_LINK_SUBTLV_LINK_ID */ +	if (ntohs(lp->link_id.header.type) != 0) +		length += TLV_SIZE(&lp->link_id.header); -  /* TE_LINK_SUBTLV_LCLIF_IPADDR */ -  if (lp->lclif_ipaddr.header.type != 0) -    length += TLV_SIZE (&lp->lclif_ipaddr.header); +	/* TE_LINK_SUBTLV_LCLIF_IPADDR */ +	if (lp->lclif_ipaddr.header.type != 0) +		length += TLV_SIZE(&lp->lclif_ipaddr.header); -  /* TE_LINK_SUBTLV_RMTIF_IPADDR */ -  if (lp->rmtif_ipaddr.header.type != 0) -    length += TLV_SIZE (&lp->rmtif_ipaddr.header); +	/* TE_LINK_SUBTLV_RMTIF_IPADDR */ +	if (lp->rmtif_ipaddr.header.type != 0) +		length += TLV_SIZE(&lp->rmtif_ipaddr.header); -  /* TE_LINK_SUBTLV_TE_METRIC */ -  if (ntohs (lp->te_metric.header.type) != 0) -    length += TLV_SIZE (&lp->te_metric.header); +	/* TE_LINK_SUBTLV_TE_METRIC */ +	if (ntohs(lp->te_metric.header.type) != 0) +		length += TLV_SIZE(&lp->te_metric.header); -  /* TE_LINK_SUBTLV_MAX_BW */ -  if (ntohs (lp->max_bw.header.type) != 0) -    length += TLV_SIZE (&lp->max_bw.header); +	/* TE_LINK_SUBTLV_MAX_BW */ +	if (ntohs(lp->max_bw.header.type) != 0) +		length += TLV_SIZE(&lp->max_bw.header); -  /* TE_LINK_SUBTLV_MAX_RSV_BW */ -  if (ntohs (lp->max_rsv_bw.header.type) != 0) -    length += TLV_SIZE (&lp->max_rsv_bw.header); +	/* TE_LINK_SUBTLV_MAX_RSV_BW */ +	if (ntohs(lp->max_rsv_bw.header.type) != 0) +		length += TLV_SIZE(&lp->max_rsv_bw.header); -  /* TE_LINK_SUBTLV_UNRSV_BW */ -  if (ntohs (lp->unrsv_bw.header.type) != 0) -    length += TLV_SIZE (&lp->unrsv_bw.header); +	/* TE_LINK_SUBTLV_UNRSV_BW */ +	if (ntohs(lp->unrsv_bw.header.type) != 0) +		length += TLV_SIZE(&lp->unrsv_bw.header); -  /* TE_LINK_SUBTLV_RSC_CLSCLR */ -  if (ntohs (lp->rsc_clsclr.header.type) != 0) -    length += TLV_SIZE (&lp->rsc_clsclr.header); - -  /* TE_LINK_SUBTLV_LLRI */ -  if (ntohs (lp->llri.header.type) != 0) -    length += TLV_SIZE (&lp->llri.header); - -  /* TE_LINK_SUBTLV_RIP */ -  if (ntohs (lp->rip.header.type) != 0) -    length += TLV_SIZE (&lp->rip.header); - -  /* TE_LINK_SUBTLV_RAS */ -  if (ntohs (lp->ras.header.type) != 0) -    length += TLV_SIZE (&lp->ras.header); - -  /* TE_LINK_SUBTLV_LRRID */ -  if (ntohs (lp->lrrid.header.type) != 0) -    length += TLV_SIZE (&lp->lrrid.header); - -  /* TE_LINK_SUBTLV_AV_DELAY */ -  if (ntohs (lp->av_delay.header.type) != 0) -    length += TLV_SIZE (&lp->av_delay.header); - -  /* TE_LINK_SUBTLV_MM_DELAY */ -  if (ntohs (lp->mm_delay.header.type) != 0) -    length += TLV_SIZE (&lp->mm_delay.header); - -  /* TE_LINK_SUBTLV_DELAY_VAR */ -  if (ntohs (lp->delay_var.header.type) != 0) -    length += TLV_SIZE (&lp->delay_var.header); - -  /* TE_LINK_SUBTLV_PKT_LOSS */ -  if (ntohs (lp->pkt_loss.header.type) != 0) -    length += TLV_SIZE (&lp->pkt_loss.header); - -  /* TE_LINK_SUBTLV_RES_BW */ -  if (ntohs (lp->res_bw.header.type) != 0) -    length += TLV_SIZE (&lp->res_bw.header); - -  /* TE_LINK_SUBTLV_AVA_BW */ -  if (ntohs (lp->ava_bw.header.type) != 0) -    length += TLV_SIZE (&lp->ava_bw.header); - -  /* TE_LINK_SUBTLV_USE_BW */ -  if (ntohs (lp->use_bw.header.type) != 0) -    length += TLV_SIZE (&lp->use_bw.header); - -  lp->link_header.header.type   = htons (TE_TLV_LINK); -  lp->link_header.header.length = htons (length); +	/* TE_LINK_SUBTLV_RSC_CLSCLR */ +	if (ntohs(lp->rsc_clsclr.header.type) != 0) +		length += TLV_SIZE(&lp->rsc_clsclr.header); + +	/* TE_LINK_SUBTLV_LLRI */ +	if (ntohs(lp->llri.header.type) != 0) +		length += TLV_SIZE(&lp->llri.header); + +	/* TE_LINK_SUBTLV_RIP */ +	if (ntohs(lp->rip.header.type) != 0) +		length += TLV_SIZE(&lp->rip.header); + +	/* TE_LINK_SUBTLV_RAS */ +	if (ntohs(lp->ras.header.type) != 0) +		length += TLV_SIZE(&lp->ras.header); + +	/* TE_LINK_SUBTLV_LRRID */ +	if (ntohs(lp->lrrid.header.type) != 0) +		length += TLV_SIZE(&lp->lrrid.header); + +	/* TE_LINK_SUBTLV_AV_DELAY */ +	if (ntohs(lp->av_delay.header.type) != 0) +		length += TLV_SIZE(&lp->av_delay.header); + +	/* TE_LINK_SUBTLV_MM_DELAY */ +	if (ntohs(lp->mm_delay.header.type) != 0) +		length += TLV_SIZE(&lp->mm_delay.header); + +	/* TE_LINK_SUBTLV_DELAY_VAR */ +	if (ntohs(lp->delay_var.header.type) != 0) +		length += TLV_SIZE(&lp->delay_var.header); + +	/* TE_LINK_SUBTLV_PKT_LOSS */ +	if (ntohs(lp->pkt_loss.header.type) != 0) +		length += TLV_SIZE(&lp->pkt_loss.header); + +	/* TE_LINK_SUBTLV_RES_BW */ +	if (ntohs(lp->res_bw.header.type) != 0) +		length += TLV_SIZE(&lp->res_bw.header); + +	/* TE_LINK_SUBTLV_AVA_BW */ +	if (ntohs(lp->ava_bw.header.type) != 0) +		length += TLV_SIZE(&lp->ava_bw.header); + +	/* TE_LINK_SUBTLV_USE_BW */ +	if (ntohs(lp->use_bw.header.type) != 0) +		length += TLV_SIZE(&lp->use_bw.header); -  return; +	lp->link_header.header.type = htons(TE_TLV_LINK); +	lp->link_header.header.length = htons(length); + +	return;  } - -static void -set_linkparams_link_type (struct ospf_interface *oi, struct mpls_te_link *lp) -{ -  lp->link_type.header.type   = htons (TE_LINK_SUBTLV_LINK_TYPE); -  lp->link_type.header.length = htons (TE_LINK_SUBTLV_TYPE_SIZE); - -  switch (oi->type) -    { -    case OSPF_IFTYPE_POINTOPOINT: -      lp->link_type.link_type.value = LINK_TYPE_SUBTLV_VALUE_PTP; -      break; -    case OSPF_IFTYPE_BROADCAST: -    case OSPF_IFTYPE_NBMA: -      lp->link_type.link_type.value = LINK_TYPE_SUBTLV_VALUE_MA; -      break; -    default: -      /* Not supported yet. *//* XXX */ -      lp->link_type.header.type = htons (0); -      break; -    } -  return; + +static void set_linkparams_link_type(struct ospf_interface *oi, +				     struct mpls_te_link *lp) +{ +	lp->link_type.header.type = htons(TE_LINK_SUBTLV_LINK_TYPE); +	lp->link_type.header.length = htons(TE_LINK_SUBTLV_TYPE_SIZE); + +	switch (oi->type) { +	case OSPF_IFTYPE_POINTOPOINT: +		lp->link_type.link_type.value = LINK_TYPE_SUBTLV_VALUE_PTP; +		break; +	case OSPF_IFTYPE_BROADCAST: +	case OSPF_IFTYPE_NBMA: +		lp->link_type.link_type.value = LINK_TYPE_SUBTLV_VALUE_MA; +		break; +	default: +		/* Not supported yet. */ /* XXX */ +		lp->link_type.header.type = htons(0); +		break; +	} +	return;  } - -static void -set_linkparams_link_id (struct ospf_interface *oi, struct mpls_te_link *lp) + +static void set_linkparams_link_id(struct ospf_interface *oi, +				   struct mpls_te_link *lp)  { -  struct ospf_neighbor *nbr; -  int done = 0; - -  lp->link_id.header.type   = htons (TE_LINK_SUBTLV_LINK_ID); -  lp->link_id.header.length = htons (TE_LINK_SUBTLV_DEF_SIZE); +	struct ospf_neighbor *nbr; +	int done = 0; -  /* -   * The Link ID is identical to the contents of the Link ID field -   * in the Router LSA for these link types. -   */ -  switch (oi->type) -    { -    case OSPF_IFTYPE_POINTOPOINT: -      /* Take the router ID of the neighbor. */ -      if ((nbr = ospf_nbr_lookup_ptop (oi)) && nbr->state == NSM_Full) -        { -          lp->link_id.value = nbr->router_id; -          done = 1; -        } -      break; -    case OSPF_IFTYPE_BROADCAST: -    case OSPF_IFTYPE_NBMA: -      /* Take the interface address of the designated router. */ -      if ((nbr = ospf_nbr_lookup_by_addr (oi->nbrs, &DR (oi))) == NULL) -        break; +	lp->link_id.header.type = htons(TE_LINK_SUBTLV_LINK_ID); +	lp->link_id.header.length = htons(TE_LINK_SUBTLV_DEF_SIZE); -      if (nbr->state == NSM_Full -      || (IPV4_ADDR_SAME (&oi->address->u.prefix4, &DR (oi)) -      &&  ospf_nbr_count (oi, NSM_Full) > 0)) -        { -          lp->link_id.value = DR (oi); -          done = 1; -        } -      break; -    default: -      /* Not supported yet. *//* XXX */ -      lp->link_id.header.type = htons (0); -      break; -    } +	/* +	 * The Link ID is identical to the contents of the Link ID field +	 * in the Router LSA for these link types. +	 */ +	switch (oi->type) { +	case OSPF_IFTYPE_POINTOPOINT: +		/* Take the router ID of the neighbor. */ +		if ((nbr = ospf_nbr_lookup_ptop(oi)) +		    && nbr->state == NSM_Full) { +			lp->link_id.value = nbr->router_id; +			done = 1; +		} +		break; +	case OSPF_IFTYPE_BROADCAST: +	case OSPF_IFTYPE_NBMA: +		/* Take the interface address of the designated router. */ +		if ((nbr = ospf_nbr_lookup_by_addr(oi->nbrs, &DR(oi))) == NULL) +			break; -  if (! done) -    { -      struct in_addr mask; -      masklen2ip (oi->address->prefixlen, &mask); -      lp->link_id.value.s_addr = oi->address->u.prefix4.s_addr & mask.s_addr; -     } -  return; +		if (nbr->state == NSM_Full +		    || (IPV4_ADDR_SAME(&oi->address->u.prefix4, &DR(oi)) +			&& ospf_nbr_count(oi, NSM_Full) > 0)) { +			lp->link_id.value = DR(oi); +			done = 1; +		} +		break; +	default: +		/* Not supported yet. */ /* XXX */ +		lp->link_id.header.type = htons(0); +		break; +	} + +	if (!done) { +		struct in_addr mask; +		masklen2ip(oi->address->prefixlen, &mask); +		lp->link_id.value.s_addr = +			oi->address->u.prefix4.s_addr & mask.s_addr; +	} +	return;  } -static void -set_linkparams_lclif_ipaddr (struct mpls_te_link *lp, struct in_addr lclif) +static void set_linkparams_lclif_ipaddr(struct mpls_te_link *lp, +					struct in_addr lclif)  { -  lp->lclif_ipaddr.header.type = htons (TE_LINK_SUBTLV_LCLIF_IPADDR); -  lp->lclif_ipaddr.header.length = htons (TE_LINK_SUBTLV_DEF_SIZE); -  lp->lclif_ipaddr.value[0] = lclif; -  return; +	lp->lclif_ipaddr.header.type = htons(TE_LINK_SUBTLV_LCLIF_IPADDR); +	lp->lclif_ipaddr.header.length = htons(TE_LINK_SUBTLV_DEF_SIZE); +	lp->lclif_ipaddr.value[0] = lclif; +	return;  } -static void -set_linkparams_rmtif_ipaddr (struct mpls_te_link *lp, struct in_addr rmtif) +static void set_linkparams_rmtif_ipaddr(struct mpls_te_link *lp, +					struct in_addr rmtif)  { -  lp->rmtif_ipaddr.header.type = htons (TE_LINK_SUBTLV_RMTIF_IPADDR); -  lp->rmtif_ipaddr.header.length = htons (TE_LINK_SUBTLV_DEF_SIZE); -  lp->rmtif_ipaddr.value[0] = rmtif; -  return; +	lp->rmtif_ipaddr.header.type = htons(TE_LINK_SUBTLV_RMTIF_IPADDR); +	lp->rmtif_ipaddr.header.length = htons(TE_LINK_SUBTLV_DEF_SIZE); +	lp->rmtif_ipaddr.value[0] = rmtif; +	return;  } -static void -set_linkparams_te_metric (struct mpls_te_link *lp, u_int32_t te_metric) +static void set_linkparams_te_metric(struct mpls_te_link *lp, +				     u_int32_t te_metric)  { -  lp->te_metric.header.type   = htons (TE_LINK_SUBTLV_TE_METRIC); -  lp->te_metric.header.length = htons (TE_LINK_SUBTLV_DEF_SIZE); -  lp->te_metric.value = htonl (te_metric); -  return; +	lp->te_metric.header.type = htons(TE_LINK_SUBTLV_TE_METRIC); +	lp->te_metric.header.length = htons(TE_LINK_SUBTLV_DEF_SIZE); +	lp->te_metric.value = htonl(te_metric); +	return;  } -static void -set_linkparams_max_bw (struct mpls_te_link *lp, float fp) +static void set_linkparams_max_bw(struct mpls_te_link *lp, float fp)  { -  lp->max_bw.header.type   = htons (TE_LINK_SUBTLV_MAX_BW); -  lp->max_bw.header.length = htons (TE_LINK_SUBTLV_DEF_SIZE); -  lp->max_bw.value = htonf (fp); -  return; +	lp->max_bw.header.type = htons(TE_LINK_SUBTLV_MAX_BW); +	lp->max_bw.header.length = htons(TE_LINK_SUBTLV_DEF_SIZE); +	lp->max_bw.value = htonf(fp); +	return;  } -static void -set_linkparams_max_rsv_bw (struct mpls_te_link *lp, float fp) +static void set_linkparams_max_rsv_bw(struct mpls_te_link *lp, float fp)  { -  lp->max_rsv_bw.header.type   = htons (TE_LINK_SUBTLV_MAX_RSV_BW); -  lp->max_rsv_bw.header.length = htons (TE_LINK_SUBTLV_DEF_SIZE); -  lp->max_rsv_bw.value = htonf (fp); -  return; +	lp->max_rsv_bw.header.type = htons(TE_LINK_SUBTLV_MAX_RSV_BW); +	lp->max_rsv_bw.header.length = htons(TE_LINK_SUBTLV_DEF_SIZE); +	lp->max_rsv_bw.value = htonf(fp); +	return;  } -static void -set_linkparams_unrsv_bw (struct mpls_te_link *lp, int priority, float fp) +static void set_linkparams_unrsv_bw(struct mpls_te_link *lp, int priority, +				    float fp)  { -  /* Note that TLV-length field is the size of array. */ -  lp->unrsv_bw.header.type   = htons (TE_LINK_SUBTLV_UNRSV_BW); -  lp->unrsv_bw.header.length = htons (TE_LINK_SUBTLV_UNRSV_SIZE); -  lp->unrsv_bw.value [priority] = htonf (fp); -  return; +	/* Note that TLV-length field is the size of array. */ +	lp->unrsv_bw.header.type = htons(TE_LINK_SUBTLV_UNRSV_BW); +	lp->unrsv_bw.header.length = htons(TE_LINK_SUBTLV_UNRSV_SIZE); +	lp->unrsv_bw.value[priority] = htonf(fp); +	return;  } -static void -set_linkparams_rsc_clsclr (struct mpls_te_link *lp, u_int32_t classcolor) +static void set_linkparams_rsc_clsclr(struct mpls_te_link *lp, +				      u_int32_t classcolor)  { -  lp->rsc_clsclr.header.type   = htons (TE_LINK_SUBTLV_RSC_CLSCLR); -  lp->rsc_clsclr.header.length = htons (TE_LINK_SUBTLV_DEF_SIZE); -  lp->rsc_clsclr.value = htonl (classcolor); -  return; +	lp->rsc_clsclr.header.type = htons(TE_LINK_SUBTLV_RSC_CLSCLR); +	lp->rsc_clsclr.header.length = htons(TE_LINK_SUBTLV_DEF_SIZE); +	lp->rsc_clsclr.value = htonl(classcolor); +	return;  } -static void -set_linkparams_inter_as (struct mpls_te_link *lp, struct in_addr addr, -                         u_int32_t as) +static void set_linkparams_inter_as(struct mpls_te_link *lp, +				    struct in_addr addr, u_int32_t as)  { -  /* Set the Remote ASBR IP address and then the associated AS number */ -  lp->rip.header.type = htons (TE_LINK_SUBTLV_RIP); -  lp->rip.header.length = htons (TE_LINK_SUBTLV_DEF_SIZE); -  lp->rip.value = addr; +	/* Set the Remote ASBR IP address and then the associated AS number */ +	lp->rip.header.type = htons(TE_LINK_SUBTLV_RIP); +	lp->rip.header.length = htons(TE_LINK_SUBTLV_DEF_SIZE); +	lp->rip.value = addr; -  lp->ras.header.type = htons (TE_LINK_SUBTLV_RAS); -  lp->ras.header.length = htons (TE_LINK_SUBTLV_DEF_SIZE); -  lp->ras.value = htonl (as); +	lp->ras.header.type = htons(TE_LINK_SUBTLV_RAS); +	lp->ras.header.length = htons(TE_LINK_SUBTLV_DEF_SIZE); +	lp->ras.value = htonl(as);  } -static void -unset_linkparams_inter_as (struct mpls_te_link *lp) +static void unset_linkparams_inter_as(struct mpls_te_link *lp)  { -  /* Reset the Remote ASBR IP address and then the associated AS number */ -  lp->rip.header.type = htons (0); -  lp->rip.header.length = htons (0); -  lp->rip.value.s_addr = htonl (0); +	/* Reset the Remote ASBR IP address and then the associated AS number */ +	lp->rip.header.type = htons(0); +	lp->rip.header.length = htons(0); +	lp->rip.value.s_addr = htonl(0); -  lp->ras.header.type = htons (0); -  lp->ras.header.length = htons (0); -  lp->ras.value = htonl (0); +	lp->ras.header.type = htons(0); +	lp->ras.header.length = htons(0); +	lp->ras.value = htonl(0);  } -void -set_linkparams_llri (struct mpls_te_link *lp, u_int32_t local, -                     u_int32_t remote) +void set_linkparams_llri(struct mpls_te_link *lp, u_int32_t local, +			 u_int32_t remote)  { -  lp->llri.header.type = htons (TE_LINK_SUBTLV_LLRI); -  lp->llri.header.length = htons (TE_LINK_SUBTLV_LLRI_SIZE); -  lp->llri.local = htonl (local); -  lp->llri.remote = htonl (remote); +	lp->llri.header.type = htons(TE_LINK_SUBTLV_LLRI); +	lp->llri.header.length = htons(TE_LINK_SUBTLV_LLRI_SIZE); +	lp->llri.local = htonl(local); +	lp->llri.remote = htonl(remote);  } -void -set_linkparams_lrrid (struct mpls_te_link *lp, struct in_addr local, -                           struct in_addr remote) +void set_linkparams_lrrid(struct mpls_te_link *lp, struct in_addr local, +			  struct in_addr remote)  { -  lp->lrrid.header.type = htons (TE_LINK_SUBTLV_LRRID); -  lp->lrrid.header.length = htons (TE_LINK_SUBTLV_LRRID_SIZE); -  lp->lrrid.local.s_addr = local.s_addr; -  lp->lrrid.remote.s_addr = remote.s_addr; +	lp->lrrid.header.type = htons(TE_LINK_SUBTLV_LRRID); +	lp->lrrid.header.length = htons(TE_LINK_SUBTLV_LRRID_SIZE); +	lp->lrrid.local.s_addr = local.s_addr; +	lp->lrrid.remote.s_addr = remote.s_addr;  } -static void -set_linkparams_av_delay (struct mpls_te_link *lp, u_int32_t delay, u_char anormal) +static void set_linkparams_av_delay(struct mpls_te_link *lp, u_int32_t delay, +				    u_char anormal)  { -  u_int32_t tmp; -  /* Note that TLV-length field is the size of array. */ -  lp->av_delay.header.type = htons (TE_LINK_SUBTLV_AV_DELAY); -  lp->av_delay.header.length = htons (TE_LINK_SUBTLV_DEF_SIZE); -  tmp = delay & TE_EXT_MASK; -  if (anormal) -    tmp |= TE_EXT_ANORMAL; -  lp->av_delay.value = htonl (tmp); -  return; +	u_int32_t tmp; +	/* Note that TLV-length field is the size of array. */ +	lp->av_delay.header.type = htons(TE_LINK_SUBTLV_AV_DELAY); +	lp->av_delay.header.length = htons(TE_LINK_SUBTLV_DEF_SIZE); +	tmp = delay & TE_EXT_MASK; +	if (anormal) +		tmp |= TE_EXT_ANORMAL; +	lp->av_delay.value = htonl(tmp); +	return;  } -static void -set_linkparams_mm_delay (struct mpls_te_link *lp, u_int32_t low, u_int32_t high, u_char anormal) +static void set_linkparams_mm_delay(struct mpls_te_link *lp, u_int32_t low, +				    u_int32_t high, u_char anormal)  { -  u_int32_t tmp; -  /* Note that TLV-length field is the size of array. */ -  lp->mm_delay.header.type = htons (TE_LINK_SUBTLV_MM_DELAY); -  lp->mm_delay.header.length = htons (TE_LINK_SUBTLV_MM_DELAY_SIZE); -  tmp = low & TE_EXT_MASK; -  if (anormal) -    tmp |= TE_EXT_ANORMAL; -  lp->mm_delay.low = htonl (tmp); -  lp->mm_delay.high = htonl (high); -  return; +	u_int32_t tmp; +	/* Note that TLV-length field is the size of array. */ +	lp->mm_delay.header.type = htons(TE_LINK_SUBTLV_MM_DELAY); +	lp->mm_delay.header.length = htons(TE_LINK_SUBTLV_MM_DELAY_SIZE); +	tmp = low & TE_EXT_MASK; +	if (anormal) +		tmp |= TE_EXT_ANORMAL; +	lp->mm_delay.low = htonl(tmp); +	lp->mm_delay.high = htonl(high); +	return;  } -static void -set_linkparams_delay_var (struct mpls_te_link *lp, u_int32_t jitter) +static void set_linkparams_delay_var(struct mpls_te_link *lp, u_int32_t jitter)  { -  /* Note that TLV-length field is the size of array. */ -  lp->delay_var.header.type = htons (TE_LINK_SUBTLV_DELAY_VAR); -  lp->delay_var.header.length = htons (TE_LINK_SUBTLV_DEF_SIZE); -  lp->delay_var.value = htonl (jitter & TE_EXT_MASK); -  return; +	/* Note that TLV-length field is the size of array. */ +	lp->delay_var.header.type = htons(TE_LINK_SUBTLV_DELAY_VAR); +	lp->delay_var.header.length = htons(TE_LINK_SUBTLV_DEF_SIZE); +	lp->delay_var.value = htonl(jitter & TE_EXT_MASK); +	return;  } -static void -set_linkparams_pkt_loss (struct mpls_te_link *lp, u_int32_t loss, u_char anormal) +static void set_linkparams_pkt_loss(struct mpls_te_link *lp, u_int32_t loss, +				    u_char anormal)  { -  u_int32_t tmp; -  /* Note that TLV-length field is the size of array. */ -  lp->pkt_loss.header.type = htons (TE_LINK_SUBTLV_PKT_LOSS); -  lp->pkt_loss.header.length = htons (TE_LINK_SUBTLV_DEF_SIZE); -  tmp = loss & TE_EXT_MASK; -  if (anormal) -    tmp |= TE_EXT_ANORMAL; -  lp->pkt_loss.value = htonl (tmp); -  return; +	u_int32_t tmp; +	/* Note that TLV-length field is the size of array. */ +	lp->pkt_loss.header.type = htons(TE_LINK_SUBTLV_PKT_LOSS); +	lp->pkt_loss.header.length = htons(TE_LINK_SUBTLV_DEF_SIZE); +	tmp = loss & TE_EXT_MASK; +	if (anormal) +		tmp |= TE_EXT_ANORMAL; +	lp->pkt_loss.value = htonl(tmp); +	return;  } -static void -set_linkparams_res_bw (struct mpls_te_link *lp, float fp) +static void set_linkparams_res_bw(struct mpls_te_link *lp, float fp)  { -  /* Note that TLV-length field is the size of array. */ -  lp->res_bw.header.type = htons (TE_LINK_SUBTLV_RES_BW); -  lp->res_bw.header.length = htons (TE_LINK_SUBTLV_DEF_SIZE); -  lp->res_bw.value = htonf (fp); -  return; +	/* Note that TLV-length field is the size of array. */ +	lp->res_bw.header.type = htons(TE_LINK_SUBTLV_RES_BW); +	lp->res_bw.header.length = htons(TE_LINK_SUBTLV_DEF_SIZE); +	lp->res_bw.value = htonf(fp); +	return;  } -static void -set_linkparams_ava_bw (struct mpls_te_link *lp, float fp) +static void set_linkparams_ava_bw(struct mpls_te_link *lp, float fp)  { -  /* Note that TLV-length field is the size of array. */ -  lp->ava_bw.header.type = htons (TE_LINK_SUBTLV_AVA_BW); -  lp->ava_bw.header.length = htons (TE_LINK_SUBTLV_DEF_SIZE); -  lp->ava_bw.value = htonf (fp); -  return; +	/* Note that TLV-length field is the size of array. */ +	lp->ava_bw.header.type = htons(TE_LINK_SUBTLV_AVA_BW); +	lp->ava_bw.header.length = htons(TE_LINK_SUBTLV_DEF_SIZE); +	lp->ava_bw.value = htonf(fp); +	return;  } -static void -set_linkparams_use_bw (struct mpls_te_link *lp, float fp) +static void set_linkparams_use_bw(struct mpls_te_link *lp, float fp)  { -  /* Note that TLV-length field is the size of array. */ -  lp->use_bw.header.type = htons (TE_LINK_SUBTLV_USE_BW); -  lp->use_bw.header.length = htons (TE_LINK_SUBTLV_DEF_SIZE); -  lp->use_bw.value = htonf (fp); -  return; +	/* Note that TLV-length field is the size of array. */ +	lp->use_bw.header.type = htons(TE_LINK_SUBTLV_USE_BW); +	lp->use_bw.header.length = htons(TE_LINK_SUBTLV_DEF_SIZE); +	lp->use_bw.value = htonf(fp); +	return;  }  /* Update TE parameters from Interface */ -static void -update_linkparams(struct mpls_te_link *lp) -{ -  int i; -  struct interface *ifp; - -  /* Get the Interface structure */ -  if ((ifp = lp->ifp) == NULL) -    { -      if (IS_DEBUG_OSPF_TE) -	zlog_debug("OSPF MPLS-TE: Abort update TE parameters: no interface associated to Link Parameters"); -      return; -    } -  if (!HAS_LINK_PARAMS(ifp)) -    { -      if (IS_DEBUG_OSPF_TE) -	zlog_debug("OSPF MPLS-TE: Abort update TE parameters: no Link Parameters for interface"); -      return; -    } - -  /* RFC3630 metrics */ -  if (IS_PARAM_SET(ifp->link_params, LP_ADM_GRP)) -    set_linkparams_rsc_clsclr (lp, ifp->link_params->admin_grp); -  else -    TLV_TYPE(lp->rsc_clsclr) = 0; - -  if (IS_PARAM_SET(ifp->link_params, LP_MAX_BW)) -    set_linkparams_max_bw (lp, ifp->link_params->max_bw); -  else -    TLV_TYPE(lp->max_bw) = 0; - -  if (IS_PARAM_SET(ifp->link_params, LP_MAX_RSV_BW)) -    set_linkparams_max_rsv_bw (lp, ifp->link_params->max_rsv_bw); -  else -    TLV_TYPE(lp->max_rsv_bw) = 0; - -  if (IS_PARAM_SET(ifp->link_params, LP_UNRSV_BW)) -    for (i = 0; i < MAX_CLASS_TYPE; i++) -      set_linkparams_unrsv_bw (lp, i, ifp->link_params->unrsv_bw[i]); -  else -    TLV_TYPE(lp->unrsv_bw) = 0; - -  if (IS_PARAM_SET(ifp->link_params, LP_TE_METRIC)) -    set_linkparams_te_metric(lp, ifp->link_params->te_metric); -  else -    TLV_TYPE(lp->te_metric) = 0; - -  /* TE metric Extensions */ -  if (IS_PARAM_SET(ifp->link_params, LP_DELAY)) -    set_linkparams_av_delay(lp, ifp->link_params->av_delay, 0); -  else -    TLV_TYPE(lp->av_delay) = 0; - -  if (IS_PARAM_SET(ifp->link_params, LP_MM_DELAY)) -    set_linkparams_mm_delay(lp, ifp->link_params->min_delay, ifp->link_params->max_delay, 0); -  else -    TLV_TYPE(lp->mm_delay) = 0; - -  if (IS_PARAM_SET(ifp->link_params, LP_DELAY_VAR)) -    set_linkparams_delay_var(lp, ifp->link_params->delay_var); -  else -    TLV_TYPE(lp->delay_var) = 0; - -  if (IS_PARAM_SET(ifp->link_params, LP_PKT_LOSS)) -    set_linkparams_pkt_loss(lp, ifp->link_params->pkt_loss, 0); -  else -    TLV_TYPE(lp->pkt_loss) = 0; - -  if (IS_PARAM_SET(ifp->link_params, LP_RES_BW)) -    set_linkparams_res_bw(lp, ifp->link_params->res_bw); -  else -    TLV_TYPE(lp->res_bw) = 0; - -  if (IS_PARAM_SET(ifp->link_params, LP_AVA_BW)) -    set_linkparams_ava_bw(lp, ifp->link_params->ava_bw); -  else -    TLV_TYPE(lp->ava_bw) = 0; - -  if (IS_PARAM_SET(ifp->link_params, LP_USE_BW)) -    set_linkparams_use_bw(lp, ifp->link_params->use_bw); -  else -    TLV_TYPE(lp->use_bw) = 0; - -  /* RFC5392 */ -  if (IS_PARAM_SET(ifp->link_params, LP_RMT_AS)) -    { -      /* Flush LSA if it engaged and was previously a STD_TE one */ -      if (IS_STD_TE(lp->type) && CHECK_FLAG (lp->flags, LPFLG_LSA_ENGAGED)) -        { -          if (IS_DEBUG_OSPF_TE) -            zlog_debug("OSPF MPLS-TE Update IF: Switch from Standard LSA to INTER-AS for %s[%d/%d]", -              ifp->name, lp->flags, lp->type); - -          ospf_mpls_te_lsa_schedule (lp, FLUSH_THIS_LSA); -          /* Then, switch it to INTER-AS */ -          if (OspfMplsTE.inter_as == AS) -            lp->flags = INTER_AS | FLOOD_AS; -          else -            { -              lp->flags = INTER_AS | FLOOD_AREA; -              lp->area = ospf_area_lookup_by_area_id (ospf_lookup(), OspfMplsTE.interas_areaid); -            } -        } -      set_linkparams_inter_as(lp, ifp->link_params->rmt_ip, ifp->link_params->rmt_as); -    } -  else -    { -      if (IS_DEBUG_OSPF_TE) -        zlog_debug("OSPF MPLS-TE Update IF: Switch from INTER-AS LSA to Standard for %s[%d/%d]", -          ifp->name, lp->flags, lp->type); - -      /* reset inter-as TE params */ -      /* Flush LSA if it engaged and was previously an INTER_AS one */ -      if (IS_INTER_AS(lp->type) && CHECK_FLAG (lp->flags, LPFLG_LSA_ENGAGED)) -        { -          ospf_mpls_te_lsa_schedule (lp, FLUSH_THIS_LSA); -          /* Then, switch it to Standard TE */ -          lp->flags = STD_TE | FLOOD_AREA; -        } -      unset_linkparams_inter_as (lp); -    } -} - -static void -initialize_linkparams (struct mpls_te_link *lp) -{ -  struct interface *ifp = lp->ifp; -  struct ospf_interface *oi; - -  if (IS_DEBUG_OSPF_TE) -    zlog_debug("MPLS-TE(initialize_linkparams) Initialize Link Parameters for interface %s", -                ifp->name); - -  if ((oi = lookup_oi_by_ifp (ifp, NULL, OI_ANY)) == NULL) -    { -      if (IS_DEBUG_OSPF_TE) -        zlog_warn("MPLS-TE(initialize_linkparams) Could not find corresponding OSPF Interface for %s", -                  ifp->name); -      return; -    } - -  /* -   * Try to set initial values those can be derived from -   * zebra-interface information. -   */ -  set_linkparams_link_type (oi, lp); - -  /* Set local IP addr */ -  set_linkparams_lclif_ipaddr (lp, oi->address->u.prefix4); - -  /* Set Remote IP addr if Point to Point Interface */ -  if (oi->type == LINK_TYPE_SUBTLV_VALUE_PTP) -    { -      struct prefix *pref = CONNECTED_PREFIX(oi->connected); -      if (pref != NULL) -        set_linkparams_rmtif_ipaddr(lp, pref->u.prefix4); -    } - -  /* Keep Area information in combination with link parameters. */ -  lp->area = oi->area; - -  return; -} - -static int -is_mandated_params_set (struct mpls_te_link *lp) -{ -  int rc = 0; - -  if (ntohs (OspfMplsTE.router_addr.header.type) == 0) -    { -      zlog_warn ("MPLS-TE(is_mandated_params_set) Missing Router Address"); -    goto out; -    } - -  if (ntohs (lp->link_type.header.type) == 0) -    { -      zlog_warn ("MPLS-TE(is_mandated_params_set) Missing Link Type"); -    goto out; -    } - -  if (!IS_INTER_AS (lp->type) && (ntohs (lp->link_id.header.type) == 0)) -    { -      zlog_warn ("MPLS-TE(is_mandated_params_set) Missing Link ID"); -    goto out; -    } - -  rc = 1; +static void update_linkparams(struct mpls_te_link *lp) +{ +	int i; +	struct interface *ifp; + +	/* Get the Interface structure */ +	if ((ifp = lp->ifp) == NULL) { +		if (IS_DEBUG_OSPF_TE) +			zlog_debug( +				"OSPF MPLS-TE: Abort update TE parameters: no interface associated to Link Parameters"); +		return; +	} +	if (!HAS_LINK_PARAMS(ifp)) { +		if (IS_DEBUG_OSPF_TE) +			zlog_debug( +				"OSPF MPLS-TE: Abort update TE parameters: no Link Parameters for interface"); +		return; +	} + +	/* RFC3630 metrics */ +	if (IS_PARAM_SET(ifp->link_params, LP_ADM_GRP)) +		set_linkparams_rsc_clsclr(lp, ifp->link_params->admin_grp); +	else +		TLV_TYPE(lp->rsc_clsclr) = 0; + +	if (IS_PARAM_SET(ifp->link_params, LP_MAX_BW)) +		set_linkparams_max_bw(lp, ifp->link_params->max_bw); +	else +		TLV_TYPE(lp->max_bw) = 0; + +	if (IS_PARAM_SET(ifp->link_params, LP_MAX_RSV_BW)) +		set_linkparams_max_rsv_bw(lp, ifp->link_params->max_rsv_bw); +	else +		TLV_TYPE(lp->max_rsv_bw) = 0; + +	if (IS_PARAM_SET(ifp->link_params, LP_UNRSV_BW)) +		for (i = 0; i < MAX_CLASS_TYPE; i++) +			set_linkparams_unrsv_bw(lp, i, +						ifp->link_params->unrsv_bw[i]); +	else +		TLV_TYPE(lp->unrsv_bw) = 0; + +	if (IS_PARAM_SET(ifp->link_params, LP_TE_METRIC)) +		set_linkparams_te_metric(lp, ifp->link_params->te_metric); +	else +		TLV_TYPE(lp->te_metric) = 0; + +	/* TE metric Extensions */ +	if (IS_PARAM_SET(ifp->link_params, LP_DELAY)) +		set_linkparams_av_delay(lp, ifp->link_params->av_delay, 0); +	else +		TLV_TYPE(lp->av_delay) = 0; + +	if (IS_PARAM_SET(ifp->link_params, LP_MM_DELAY)) +		set_linkparams_mm_delay(lp, ifp->link_params->min_delay, +					ifp->link_params->max_delay, 0); +	else +		TLV_TYPE(lp->mm_delay) = 0; + +	if (IS_PARAM_SET(ifp->link_params, LP_DELAY_VAR)) +		set_linkparams_delay_var(lp, ifp->link_params->delay_var); +	else +		TLV_TYPE(lp->delay_var) = 0; + +	if (IS_PARAM_SET(ifp->link_params, LP_PKT_LOSS)) +		set_linkparams_pkt_loss(lp, ifp->link_params->pkt_loss, 0); +	else +		TLV_TYPE(lp->pkt_loss) = 0; + +	if (IS_PARAM_SET(ifp->link_params, LP_RES_BW)) +		set_linkparams_res_bw(lp, ifp->link_params->res_bw); +	else +		TLV_TYPE(lp->res_bw) = 0; + +	if (IS_PARAM_SET(ifp->link_params, LP_AVA_BW)) +		set_linkparams_ava_bw(lp, ifp->link_params->ava_bw); +	else +		TLV_TYPE(lp->ava_bw) = 0; + +	if (IS_PARAM_SET(ifp->link_params, LP_USE_BW)) +		set_linkparams_use_bw(lp, ifp->link_params->use_bw); +	else +		TLV_TYPE(lp->use_bw) = 0; + +	/* RFC5392 */ +	if (IS_PARAM_SET(ifp->link_params, LP_RMT_AS)) { +		/* Flush LSA if it engaged and was previously a STD_TE one */ +		if (IS_STD_TE(lp->type) +		    && CHECK_FLAG(lp->flags, LPFLG_LSA_ENGAGED)) { +			if (IS_DEBUG_OSPF_TE) +				zlog_debug( +					"OSPF MPLS-TE Update IF: Switch from Standard LSA to INTER-AS for %s[%d/%d]", +					ifp->name, lp->flags, lp->type); + +			ospf_mpls_te_lsa_schedule(lp, FLUSH_THIS_LSA); +			/* Then, switch it to INTER-AS */ +			if (OspfMplsTE.inter_as == AS) +				lp->flags = INTER_AS | FLOOD_AS; +			else { +				lp->flags = INTER_AS | FLOOD_AREA; +				lp->area = ospf_area_lookup_by_area_id( +					ospf_lookup(), +					OspfMplsTE.interas_areaid); +			} +		} +		set_linkparams_inter_as(lp, ifp->link_params->rmt_ip, +					ifp->link_params->rmt_as); +	} else { +		if (IS_DEBUG_OSPF_TE) +			zlog_debug( +				"OSPF MPLS-TE Update IF: Switch from INTER-AS LSA to Standard for %s[%d/%d]", +				ifp->name, lp->flags, lp->type); + +		/* reset inter-as TE params */ +		/* Flush LSA if it engaged and was previously an INTER_AS one */ +		if (IS_INTER_AS(lp->type) +		    && CHECK_FLAG(lp->flags, LPFLG_LSA_ENGAGED)) { +			ospf_mpls_te_lsa_schedule(lp, FLUSH_THIS_LSA); +			/* Then, switch it to Standard TE */ +			lp->flags = STD_TE | FLOOD_AREA; +		} +		unset_linkparams_inter_as(lp); +	} +} + +static void initialize_linkparams(struct mpls_te_link *lp) +{ +	struct interface *ifp = lp->ifp; +	struct ospf_interface *oi; + +	if (IS_DEBUG_OSPF_TE) +		zlog_debug( +			"MPLS-TE(initialize_linkparams) Initialize Link Parameters for interface %s", +			ifp->name); + +	if ((oi = lookup_oi_by_ifp(ifp, NULL, OI_ANY)) == NULL) { +		if (IS_DEBUG_OSPF_TE) +			zlog_warn( +				"MPLS-TE(initialize_linkparams) Could not find corresponding OSPF Interface for %s", +				ifp->name); +		return; +	} + +	/* +	 * Try to set initial values those can be derived from +	 * zebra-interface information. +	 */ +	set_linkparams_link_type(oi, lp); + +	/* Set local IP addr */ +	set_linkparams_lclif_ipaddr(lp, oi->address->u.prefix4); + +	/* Set Remote IP addr if Point to Point Interface */ +	if (oi->type == LINK_TYPE_SUBTLV_VALUE_PTP) { +		struct prefix *pref = CONNECTED_PREFIX(oi->connected); +		if (pref != NULL) +			set_linkparams_rmtif_ipaddr(lp, pref->u.prefix4); +	} + +	/* Keep Area information in combination with link parameters. */ +	lp->area = oi->area; + +	return; +} + +static int is_mandated_params_set(struct mpls_te_link *lp) +{ +	int rc = 0; + +	if (ntohs(OspfMplsTE.router_addr.header.type) == 0) { +		zlog_warn( +			"MPLS-TE(is_mandated_params_set) Missing Router Address"); +		goto out; +	} + +	if (ntohs(lp->link_type.header.type) == 0) { +		zlog_warn("MPLS-TE(is_mandated_params_set) Missing Link Type"); +		goto out; +	} + +	if (!IS_INTER_AS(lp->type) && (ntohs(lp->link_id.header.type) == 0)) { +		zlog_warn("MPLS-TE(is_mandated_params_set) Missing Link ID"); +		goto out; +	} + +	rc = 1;  out: -  return rc; +	return rc;  }  /*------------------------------------------------------------------------*   * Followings are callback functions against generic Opaque-LSAs handling.   *------------------------------------------------------------------------*/ -static int -ospf_mpls_te_new_if (struct interface *ifp) +static int ospf_mpls_te_new_if(struct interface *ifp)  { -  struct mpls_te_link *new; -  int rc = -1; +	struct mpls_te_link *new; +	int rc = -1; -  if (IS_DEBUG_OSPF_TE) -    zlog_debug ("MPLS-TE(ospf_mpls_te_new_if) Add new %s interface %s to MPLS-TE list", -                 ifp->link_params ? "Active" : "Inactive", ifp->name); +	if (IS_DEBUG_OSPF_TE) +		zlog_debug( +			"MPLS-TE(ospf_mpls_te_new_if) Add new %s interface %s to MPLS-TE list", +			ifp->link_params ? "Active" : "Inactive", ifp->name); -  if (lookup_linkparams_by_ifp (ifp) != NULL) -    { -      zlog_warn ("ospf_mpls_te_new_if: ifp(%p) already in use?", (void *)ifp); -      rc = 0; /* Do nothing here. */ -      goto out; -    } +	if (lookup_linkparams_by_ifp(ifp) != NULL) { +		zlog_warn("ospf_mpls_te_new_if: ifp(%p) already in use?", +			  (void *)ifp); +		rc = 0; /* Do nothing here. */ +		goto out; +	} -  new = XCALLOC (MTYPE_OSPF_MPLS_TE, sizeof (struct mpls_te_link)); -  if (new == NULL) -    { -      zlog_warn ("ospf_mpls_te_new_if: XMALLOC: %s", safe_strerror (errno)); -      goto out; -    } +	new = XCALLOC(MTYPE_OSPF_MPLS_TE, sizeof(struct mpls_te_link)); +	if (new == NULL) { +		zlog_warn("ospf_mpls_te_new_if: XMALLOC: %s", +			  safe_strerror(errno)); +		goto out; +	} -  new->instance = get_mpls_te_instance_value (); -  new->ifp = ifp; -  /* By default TE-Link is RFC3630 compatible flooding in Area and not active */ -  /* This default behavior will be adapted with call to ospf_mpls_te_update_if() */ -  new->type = STD_TE | FLOOD_AREA; -  new->flags = LPFLG_LSA_INACTIVE; +	new->instance = get_mpls_te_instance_value(); +	new->ifp = ifp; +	/* By default TE-Link is RFC3630 compatible flooding in Area and not +	 * active */ +	/* This default behavior will be adapted with call to +	 * ospf_mpls_te_update_if() */ +	new->type = STD_TE | FLOOD_AREA; +	new->flags = LPFLG_LSA_INACTIVE; -  /* Initialize Link Parameters from Interface */ -  initialize_linkparams(new); +	/* Initialize Link Parameters from Interface */ +	initialize_linkparams(new); -  /* Set TE Parameters from Interface */ -  update_linkparams(new); +	/* Set TE Parameters from Interface */ +	update_linkparams(new); -  /* Add Link Parameters structure to the list */ -  listnode_add (OspfMplsTE.iflist, new); +	/* Add Link Parameters structure to the list */ +	listnode_add(OspfMplsTE.iflist, new); -  if (IS_DEBUG_OSPF_TE) -    zlog_debug("OSPF MPLS-TE New IF: Add new LP context for %s[%d/%d]", -      ifp->name, new->flags, new->type); +	if (IS_DEBUG_OSPF_TE) +		zlog_debug( +			"OSPF MPLS-TE New IF: Add new LP context for %s[%d/%d]", +			ifp->name, new->flags, new->type); -  /* Schedule Opaque-LSA refresh. *//* XXX */ +	/* Schedule Opaque-LSA refresh. */ /* XXX */ -  rc = 0; +	rc = 0;  out: -  return rc; +	return rc;  } -static int -ospf_mpls_te_del_if (struct interface *ifp) +static int ospf_mpls_te_del_if(struct interface *ifp)  { -  struct mpls_te_link *lp; -  int rc = -1; +	struct mpls_te_link *lp; +	int rc = -1; -  if ((lp = lookup_linkparams_by_ifp (ifp)) != NULL) -    { -      struct list *iflist = OspfMplsTE.iflist; +	if ((lp = lookup_linkparams_by_ifp(ifp)) != NULL) { +		struct list *iflist = OspfMplsTE.iflist; -      /* Dequeue listnode entry from the list. */ -      listnode_delete (iflist, lp); +		/* Dequeue listnode entry from the list. */ +		listnode_delete(iflist, lp); -      /* Avoid misjudgement in the next lookup. */ -      if (listcount (iflist) == 0) -        iflist->head = iflist->tail = NULL; +		/* Avoid misjudgement in the next lookup. */ +		if (listcount(iflist) == 0) +			iflist->head = iflist->tail = NULL; -      XFREE (MTYPE_OSPF_MPLS_TE, lp); -    } +		XFREE(MTYPE_OSPF_MPLS_TE, lp); +	} -  /* Schedule Opaque-LSA refresh. *//* XXX */ +	/* Schedule Opaque-LSA refresh. */ /* XXX */ -  rc = 0; -/*out:*/ -  return rc; +	rc = 0; +	/*out:*/ +	return rc;  }  /* Main initialization / update function of the MPLS TE Link context */  /* Call when interface TE Link parameters are modified */ -void -ospf_mpls_te_update_if (struct interface *ifp) -{ -  struct mpls_te_link *lp; - -  if (IS_DEBUG_OSPF_TE) -    zlog_debug ("OSPF MPLS-TE: Update LSA parameters for interface %s [%s]", -        ifp->name, HAS_LINK_PARAMS(ifp) ? "ON" : "OFF"); - -  /* Get Link context from interface */ -  if ((lp = lookup_linkparams_by_ifp(ifp)) == NULL) -    { -      if (IS_DEBUG_OSPF_TE) -        zlog_warn ("OSPF MPLS-TE Update: Did not find Link Parameters context for interface %s", ifp->name); -      return; -    } - -  /* Fulfill MPLS-TE Link TLV from Interface TE Link parameters */ -  if (HAS_LINK_PARAMS(ifp)) -    { -      SET_FLAG (lp->flags, LPFLG_LSA_ACTIVE); - -      /* Update TE parameters */ -      update_linkparams(lp); - -      /* Finally Re-Originate or Refresh Opaque LSA if MPLS_TE is enabled */ -      if (OspfMplsTE.status == enabled) -        if (lp->area != NULL) -          { -            if CHECK_FLAG (lp->flags, LPFLG_LSA_ENGAGED) -                ospf_mpls_te_lsa_schedule (lp, REFRESH_THIS_LSA); -            else -                ospf_mpls_te_lsa_schedule (lp, REORIGINATE_THIS_LSA); -          } -    } -  else -    { -      /* If MPLS TE is disable on this interface, flush LSA if it is already engaged */ -      if CHECK_FLAG (lp->flags, LPFLG_LSA_ENGAGED) -          ospf_mpls_te_lsa_schedule (lp, FLUSH_THIS_LSA); -      else -        /* Reset Activity flag */ -        lp->flags = LPFLG_LSA_INACTIVE; -    } - -  return; -} - -static void -ospf_mpls_te_ism_change (struct ospf_interface *oi, int old_state) -{ -  struct te_link_subtlv_link_type old_type; -  struct te_link_subtlv_link_id   old_id; -  struct mpls_te_link *lp; - -  if ((lp = lookup_linkparams_by_ifp (oi->ifp)) == NULL) -    { -      zlog_warn ("ospf_mpls_te_ism_change: Cannot get linkparams from OI(%s)?", IF_NAME (oi)); -      goto out; -    } - -  if (oi->area == NULL || oi->area->ospf == NULL) -    { -      zlog_warn ("ospf_mpls_te_ism_change: Cannot refer to OSPF from OI(%s)?", IF_NAME (oi)); -      goto out; -    } +void ospf_mpls_te_update_if(struct interface *ifp) +{ +	struct mpls_te_link *lp; + +	if (IS_DEBUG_OSPF_TE) +		zlog_debug( +			"OSPF MPLS-TE: Update LSA parameters for interface %s [%s]", +			ifp->name, HAS_LINK_PARAMS(ifp) ? "ON" : "OFF"); + +	/* Get Link context from interface */ +	if ((lp = lookup_linkparams_by_ifp(ifp)) == NULL) { +		if (IS_DEBUG_OSPF_TE) +			zlog_warn( +				"OSPF MPLS-TE Update: Did not find Link Parameters context for interface %s", +				ifp->name); +		return; +	} + +	/* Fulfill MPLS-TE Link TLV from Interface TE Link parameters */ +	if (HAS_LINK_PARAMS(ifp)) { +		SET_FLAG(lp->flags, LPFLG_LSA_ACTIVE); + +		/* Update TE parameters */ +		update_linkparams(lp); + +		/* Finally Re-Originate or Refresh Opaque LSA if MPLS_TE is +		 * enabled */ +		if (OspfMplsTE.status == enabled) +			if (lp->area != NULL) { +				if +					CHECK_FLAG(lp->flags, LPFLG_LSA_ENGAGED) +				ospf_mpls_te_lsa_schedule(lp, REFRESH_THIS_LSA); +				else ospf_mpls_te_lsa_schedule( +					lp, REORIGINATE_THIS_LSA); +			} +	} else { +		/* If MPLS TE is disable on this interface, flush LSA if it is +		 * already engaged */ +		if +			CHECK_FLAG(lp->flags, LPFLG_LSA_ENGAGED) +		ospf_mpls_te_lsa_schedule(lp, FLUSH_THIS_LSA); +		else +			/* Reset Activity flag */ +			lp->flags = LPFLG_LSA_INACTIVE; +	} + +	return; +} + +static void ospf_mpls_te_ism_change(struct ospf_interface *oi, int old_state) +{ +	struct te_link_subtlv_link_type old_type; +	struct te_link_subtlv_link_id old_id; +	struct mpls_te_link *lp; + +	if ((lp = lookup_linkparams_by_ifp(oi->ifp)) == NULL) { +		zlog_warn( +			"ospf_mpls_te_ism_change: Cannot get linkparams from OI(%s)?", +			IF_NAME(oi)); +		goto out; +	} + +	if (oi->area == NULL || oi->area->ospf == NULL) { +		zlog_warn( +			"ospf_mpls_te_ism_change: Cannot refer to OSPF from OI(%s)?", +			IF_NAME(oi)); +		goto out; +	}  #ifdef notyet -  if ((lp->area != NULL -  &&   ! IPV4_ADDR_SAME (&lp->area->area_id, &oi->area->area_id)) -  || (lp->area != NULL && oi->area == NULL)) -    { -      /* How should we consider this case? */ -      zlog_warn ("MPLS-TE: Area for OI(%s) has changed to [%s], flush previous LSAs", -         IF_NAME (oi), oi->area ? inet_ntoa (oi->area->area_id) : "N/A"); -      ospf_mpls_te_lsa_schedule (lp, FLUSH_THIS_LSA); -    } +	if ((lp->area != NULL +	     && !IPV4_ADDR_SAME(&lp->area->area_id, &oi->area->area_id)) +	    || (lp->area != NULL && oi->area == NULL)) { +		/* How should we consider this case? */ +		zlog_warn( +			"MPLS-TE: Area for OI(%s) has changed to [%s], flush previous LSAs", +			IF_NAME(oi), +			oi->area ? inet_ntoa(oi->area->area_id) : "N/A"); +		ospf_mpls_te_lsa_schedule(lp, FLUSH_THIS_LSA); +	}  #endif -  /* Keep Area information in combination with linkparams. */ -  lp->area = oi->area; - -  /* Keep interface MPLS-TE status */ -  lp->flags = HAS_LINK_PARAMS(oi->ifp); - -  switch (oi->state) -    { -    case ISM_PointToPoint: -    case ISM_DROther: -    case ISM_Backup: -    case ISM_DR: -      old_type = lp->link_type; -      old_id   = lp->link_id; - -      /* Set Link type, Link ID, Local and Remote IP addr */ -      set_linkparams_link_type (oi, lp); -      set_linkparams_link_id (oi, lp); -      set_linkparams_lclif_ipaddr (lp, oi->address->u.prefix4); - -      if (oi->type == LINK_TYPE_SUBTLV_VALUE_PTP) -        { -          struct prefix *pref = CONNECTED_PREFIX(oi->connected); -          if (pref != NULL) -            set_linkparams_rmtif_ipaddr(lp, pref->u.prefix4); -        } - -      /* Update TE parameters */ -      update_linkparams(lp); - -      /* Try to Schedule LSA */ -      if ((ntohs (old_type.header.type) != ntohs (lp->link_type.header.type) -      ||   old_type.link_type.value     != lp->link_type.link_type.value) -      ||  (ntohs (old_id.header.type)   != ntohs (lp->link_id.header.type) -              || ntohl (old_id.value.s_addr) != -              ntohl (lp->link_id.value.s_addr))) -        { -          if CHECK_FLAG (lp->flags, LPFLG_LSA_ENGAGED) -            ospf_mpls_te_lsa_schedule (lp, REFRESH_THIS_LSA); -          else -            ospf_mpls_te_lsa_schedule (lp, REORIGINATE_THIS_LSA); - -        } -      break; -    default: -      lp->link_type.header.type = htons (0); -      lp->link_id.header.type   = htons (0); - -      if CHECK_FLAG (lp->flags, LPFLG_LSA_ENGAGED) -        ospf_mpls_te_lsa_schedule (lp, FLUSH_THIS_LSA); -      break; -    } +	/* Keep Area information in combination with linkparams. */ +	lp->area = oi->area; + +	/* Keep interface MPLS-TE status */ +	lp->flags = HAS_LINK_PARAMS(oi->ifp); + +	switch (oi->state) { +	case ISM_PointToPoint: +	case ISM_DROther: +	case ISM_Backup: +	case ISM_DR: +		old_type = lp->link_type; +		old_id = lp->link_id; + +		/* Set Link type, Link ID, Local and Remote IP addr */ +		set_linkparams_link_type(oi, lp); +		set_linkparams_link_id(oi, lp); +		set_linkparams_lclif_ipaddr(lp, oi->address->u.prefix4); + +		if (oi->type == LINK_TYPE_SUBTLV_VALUE_PTP) { +			struct prefix *pref = CONNECTED_PREFIX(oi->connected); +			if (pref != NULL) +				set_linkparams_rmtif_ipaddr(lp, +							    pref->u.prefix4); +		} + +		/* Update TE parameters */ +		update_linkparams(lp); + +		/* Try to Schedule LSA */ +		if ((ntohs(old_type.header.type) +			     != ntohs(lp->link_type.header.type) +		     || old_type.link_type.value +				!= lp->link_type.link_type.value) +		    || (ntohs(old_id.header.type) +				!= ntohs(lp->link_id.header.type) +			|| ntohl(old_id.value.s_addr) +				   != ntohl(lp->link_id.value.s_addr))) { +			if +				CHECK_FLAG(lp->flags, LPFLG_LSA_ENGAGED) +			ospf_mpls_te_lsa_schedule(lp, REFRESH_THIS_LSA); +			else ospf_mpls_te_lsa_schedule(lp, +						       REORIGINATE_THIS_LSA); +		} +		break; +	default: +		lp->link_type.header.type = htons(0); +		lp->link_id.header.type = htons(0); + +		if +			CHECK_FLAG(lp->flags, LPFLG_LSA_ENGAGED) +		ospf_mpls_te_lsa_schedule(lp, FLUSH_THIS_LSA); +		break; +	}  out: -  return; - +	return;  } -static void -ospf_mpls_te_nsm_change (struct ospf_neighbor *nbr, int old_state) +static void ospf_mpls_te_nsm_change(struct ospf_neighbor *nbr, int old_state)  { -  /* Nothing to do here */ -  return; +	/* Nothing to do here */ +	return;  }  /*------------------------------------------------------------------------*   * Followings are OSPF protocol processing functions for MPLS-TE.   *------------------------------------------------------------------------*/ -static void -build_tlv_header (struct stream *s, struct te_tlv_header *tlvh) -{ -  stream_put (s, tlvh, sizeof (struct te_tlv_header)); -  return; -} - -static void -build_router_tlv (struct stream *s) -{ -  struct te_tlv_header *tlvh = &OspfMplsTE.router_addr.header; -  if (ntohs (tlvh->type) != 0) -    { -      build_tlv_header (s, tlvh); -      stream_put (s, tlvh+1, TLV_BODY_SIZE (tlvh)); -    } -  return; -} - -static void -build_link_subtlv (struct stream *s, struct te_tlv_header *tlvh) -    { - -  if ((tlvh != NULL) && (ntohs (tlvh->type) != 0)) -    { -      build_tlv_header (s, tlvh); -      stream_put (s, tlvh+1, TLV_BODY_SIZE (tlvh)); -    } -  return; -} - -static void -build_link_tlv (struct stream *s, struct mpls_te_link *lp) -{ -  set_linkparams_link_header (lp); -  build_tlv_header (s, &lp->link_header.header); - -  build_link_subtlv (s, &lp->link_type.header); -  build_link_subtlv (s, &lp->link_id.header); -  build_link_subtlv (s, &lp->lclif_ipaddr.header); -  build_link_subtlv (s, &lp->rmtif_ipaddr.header); -  build_link_subtlv (s, &lp->te_metric.header); -  build_link_subtlv (s, &lp->max_bw.header); -  build_link_subtlv (s, &lp->max_rsv_bw.header); -  build_link_subtlv (s, &lp->unrsv_bw.header); -  build_link_subtlv (s, &lp->rsc_clsclr.header); -  build_link_subtlv (s, &lp->lrrid.header); -  build_link_subtlv (s, &lp->llri.header); -  build_link_subtlv (s, &lp->rip.header); -  build_link_subtlv (s, &lp->ras.header); -  build_link_subtlv (s, &lp->av_delay.header); -  build_link_subtlv (s, &lp->mm_delay.header); -  build_link_subtlv (s, &lp->delay_var.header); -  build_link_subtlv (s, &lp->pkt_loss.header); -  build_link_subtlv (s, &lp->res_bw.header); -  build_link_subtlv (s, &lp->ava_bw.header); -  build_link_subtlv (s, &lp->use_bw.header); - -  return; -} - -static void -ospf_mpls_te_lsa_body_set (struct stream *s, struct mpls_te_link *lp) -{ -  /* -   * The router address TLV is type 1, and ... -   *                                      It must appear in exactly one -   * Traffic Engineering LSA originated by a router. -   */ -  build_router_tlv (s); - -  /* -   * Only one Link TLV shall be carried in each LSA, allowing for fine -   * granularity changes in topology. -   */ -  build_link_tlv (s, lp); -  return; +static void build_tlv_header(struct stream *s, struct te_tlv_header *tlvh) +{ +	stream_put(s, tlvh, sizeof(struct te_tlv_header)); +	return; +} + +static void build_router_tlv(struct stream *s) +{ +	struct te_tlv_header *tlvh = &OspfMplsTE.router_addr.header; +	if (ntohs(tlvh->type) != 0) { +		build_tlv_header(s, tlvh); +		stream_put(s, tlvh + 1, TLV_BODY_SIZE(tlvh)); +	} +	return; +} + +static void build_link_subtlv(struct stream *s, struct te_tlv_header *tlvh) +{ + +	if ((tlvh != NULL) && (ntohs(tlvh->type) != 0)) { +		build_tlv_header(s, tlvh); +		stream_put(s, tlvh + 1, TLV_BODY_SIZE(tlvh)); +	} +	return; +} + +static void build_link_tlv(struct stream *s, struct mpls_te_link *lp) +{ +	set_linkparams_link_header(lp); +	build_tlv_header(s, &lp->link_header.header); + +	build_link_subtlv(s, &lp->link_type.header); +	build_link_subtlv(s, &lp->link_id.header); +	build_link_subtlv(s, &lp->lclif_ipaddr.header); +	build_link_subtlv(s, &lp->rmtif_ipaddr.header); +	build_link_subtlv(s, &lp->te_metric.header); +	build_link_subtlv(s, &lp->max_bw.header); +	build_link_subtlv(s, &lp->max_rsv_bw.header); +	build_link_subtlv(s, &lp->unrsv_bw.header); +	build_link_subtlv(s, &lp->rsc_clsclr.header); +	build_link_subtlv(s, &lp->lrrid.header); +	build_link_subtlv(s, &lp->llri.header); +	build_link_subtlv(s, &lp->rip.header); +	build_link_subtlv(s, &lp->ras.header); +	build_link_subtlv(s, &lp->av_delay.header); +	build_link_subtlv(s, &lp->mm_delay.header); +	build_link_subtlv(s, &lp->delay_var.header); +	build_link_subtlv(s, &lp->pkt_loss.header); +	build_link_subtlv(s, &lp->res_bw.header); +	build_link_subtlv(s, &lp->ava_bw.header); +	build_link_subtlv(s, &lp->use_bw.header); + +	return; +} + +static void ospf_mpls_te_lsa_body_set(struct stream *s, struct mpls_te_link *lp) +{ +	/* +	 * The router address TLV is type 1, and ... +	 *                                      It must appear in exactly one +	 * Traffic Engineering LSA originated by a router. +	 */ +	build_router_tlv(s); + +	/* +	 * Only one Link TLV shall be carried in each LSA, allowing for fine +	 * granularity changes in topology. +	 */ +	build_link_tlv(s, lp); +	return;  }  /* Create new opaque-LSA. */ -static struct ospf_lsa * -ospf_mpls_te_lsa_new (struct ospf_area *area, struct mpls_te_link *lp) -{ -  struct stream *s; -  struct lsa_header *lsah; -  struct ospf_lsa *new = NULL; -  u_char options, lsa_type = 0; -  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_mpls_te_lsa_new: stream_new() ?"); -      goto out; -    } -  lsah = (struct lsa_header *) STREAM_DATA (s); - -  options = OSPF_OPTION_O;      /* Don't forget this :-) */ - -  /* Set opaque-LSA header fields depending of the type of RFC */ -  if (IS_INTER_AS (lp->type)) -    { -      if IS_FLOOD_AS (lp->type) -        { -          options |= OSPF_OPTION_E;     /* Enable AS external as we flood Inter-AS with Opaque Type 11 */ -          lsa_type = OSPF_OPAQUE_AS_LSA; -        } -      else -        { -          options |= LSA_OPTIONS_GET (area);    /* Get area default option */ -          options |= LSA_OPTIONS_NSSA_GET (area); -          lsa_type = OSPF_OPAQUE_AREA_LSA; -        } -      tmp = SET_OPAQUE_LSID (OPAQUE_TYPE_INTER_AS_LSA, lp->instance); -      lsa_id.s_addr = htonl (tmp); - -      struct ospf *top = ospf_lookup (); - -      lsa_header_set (s, options, lsa_type, lsa_id, top->router_id); -    } -  else -    { -      options |= LSA_OPTIONS_GET (area);        /* Get area default option */ -      options |= LSA_OPTIONS_NSSA_GET (area); -      lsa_type = OSPF_OPAQUE_AREA_LSA; -      tmp = SET_OPAQUE_LSID (OPAQUE_TYPE_TRAFFIC_ENGINEERING_LSA, lp->instance); -      lsa_id.s_addr = htonl (tmp); -      lsa_header_set (s, options, lsa_type, lsa_id, area->ospf->router_id); -    } - -  if (IS_DEBUG_OSPF (lsa, LSA_GENERATE)) -    zlog_debug ("LSA[Type%d:%s]: Create an Opaque-LSA/MPLS-TE instance", -                lsa_type, inet_ntoa (lsa_id)); - -  /* Set opaque-LSA body fields. */ -  ospf_mpls_te_lsa_body_set (s, lp); - -  /* 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_mpls_te_lsa_new: ospf_lsa_new() ?"); -      stream_free (s); -      goto out; -    } -  if ((new->data = ospf_lsa_data_new (length)) == NULL) -    { -      zlog_warn ("ospf_mpls_te_lsa_new: ospf_lsa_data_new() ?"); -      ospf_lsa_unlock (&new); -      new = NULL; -      stream_free (s); -      goto out; -    } - -  new->area = area; -  SET_FLAG (new->flags, OSPF_LSA_SELF); -  memcpy (new->data, lsah, length); -  stream_free (s); +static struct ospf_lsa *ospf_mpls_te_lsa_new(struct ospf_area *area, +					     struct mpls_te_link *lp) +{ +	struct stream *s; +	struct lsa_header *lsah; +	struct ospf_lsa *new = NULL; +	u_char options, lsa_type = 0; +	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_mpls_te_lsa_new: stream_new() ?"); +		goto out; +	} +	lsah = (struct lsa_header *)STREAM_DATA(s); + +	options = OSPF_OPTION_O; /* Don't forget this :-) */ + +	/* Set opaque-LSA header fields depending of the type of RFC */ +	if (IS_INTER_AS(lp->type)) { +		if +			IS_FLOOD_AS(lp->type) +			{ +				options |= OSPF_OPTION_E; /* Enable AS external +							     as we flood +							     Inter-AS with +							     Opaque Type 11 */ +				lsa_type = OSPF_OPAQUE_AS_LSA; +			} +		else { +			options |= LSA_OPTIONS_GET( +				area); /* Get area default option */ +			options |= LSA_OPTIONS_NSSA_GET(area); +			lsa_type = OSPF_OPAQUE_AREA_LSA; +		} +		tmp = SET_OPAQUE_LSID(OPAQUE_TYPE_INTER_AS_LSA, lp->instance); +		lsa_id.s_addr = htonl(tmp); + +		struct ospf *top = ospf_lookup(); + +		lsa_header_set(s, options, lsa_type, lsa_id, top->router_id); +	} else { +		options |= LSA_OPTIONS_GET(area); /* Get area default option */ +		options |= LSA_OPTIONS_NSSA_GET(area); +		lsa_type = OSPF_OPAQUE_AREA_LSA; +		tmp = SET_OPAQUE_LSID(OPAQUE_TYPE_TRAFFIC_ENGINEERING_LSA, +				      lp->instance); +		lsa_id.s_addr = htonl(tmp); +		lsa_header_set(s, options, lsa_type, lsa_id, +			       area->ospf->router_id); +	} + +	if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) +		zlog_debug( +			"LSA[Type%d:%s]: Create an Opaque-LSA/MPLS-TE instance", +			lsa_type, inet_ntoa(lsa_id)); + +	/* Set opaque-LSA body fields. */ +	ospf_mpls_te_lsa_body_set(s, lp); + +	/* 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_mpls_te_lsa_new: ospf_lsa_new() ?"); +		stream_free(s); +		goto out; +	} +	if ((new->data = ospf_lsa_data_new(length)) == NULL) { +		zlog_warn("ospf_mpls_te_lsa_new: ospf_lsa_data_new() ?"); +		ospf_lsa_unlock(&new); +		new = NULL; +		stream_free(s); +		goto out; +	} + +	new->area = area; +	SET_FLAG(new->flags, OSPF_LSA_SELF); +	memcpy(new->data, lsah, length); +	stream_free(s);  out: -  return new; -} - -static int -ospf_mpls_te_lsa_originate1 (struct ospf_area *area, struct mpls_te_link *lp) -{ -  struct ospf_lsa *new; -  int rc = -1; - -  /* Create new Opaque-LSA/MPLS-TE instance. */ -  if ((new = ospf_mpls_te_lsa_new (area, lp)) == NULL) -    { -      zlog_warn ("ospf_mpls_te_lsa_originate1: ospf_mpls_te_lsa_new() ?"); -      goto out; -    } - -  /* Install this LSA into LSDB. */ -  if (ospf_lsa_install (area->ospf, NULL/*oi*/, new) == NULL) -    { -      zlog_warn ("ospf_mpls_te_lsa_originate1: ospf_lsa_install() ?"); -      ospf_lsa_unlock (&new); -      goto out; -    } - -  /* Now this link-parameter entry has associated LSA. */ -  SET_FLAG (lp->flags, LPFLG_LSA_ENGAGED); -  /* Update new LSA origination count. */ -  area->ospf->lsa_originate_count++; - -  /* Flood new LSA through area. */ -  ospf_flood_through_area (area, NULL/*nbr*/, new); - -  if (IS_DEBUG_OSPF (lsa, LSA_GENERATE)) -    { -      char area_id[INET_ADDRSTRLEN]; -      strcpy (area_id, inet_ntoa (area->area_id)); -      zlog_debug ("LSA[Type%d:%s]: Originate Opaque-LSA/MPLS-TE: Area(%s), Link(%s)", -                   new->data->type, inet_ntoa (new->data->id), area_id, lp->ifp->name); -      ospf_lsa_header_dump (new->data); -    } - -  rc = 0; +	return new; +} + +static int ospf_mpls_te_lsa_originate1(struct ospf_area *area, +				       struct mpls_te_link *lp) +{ +	struct ospf_lsa *new; +	int rc = -1; + +	/* Create new Opaque-LSA/MPLS-TE instance. */ +	if ((new = ospf_mpls_te_lsa_new(area, lp)) == NULL) { +		zlog_warn( +			"ospf_mpls_te_lsa_originate1: ospf_mpls_te_lsa_new() ?"); +		goto out; +	} + +	/* Install this LSA into LSDB. */ +	if (ospf_lsa_install(area->ospf, NULL /*oi*/, new) == NULL) { +		zlog_warn("ospf_mpls_te_lsa_originate1: ospf_lsa_install() ?"); +		ospf_lsa_unlock(&new); +		goto out; +	} + +	/* Now this link-parameter entry has associated LSA. */ +	SET_FLAG(lp->flags, LPFLG_LSA_ENGAGED); +	/* Update new LSA origination count. */ +	area->ospf->lsa_originate_count++; + +	/* Flood new LSA through area. */ +	ospf_flood_through_area(area, NULL /*nbr*/, new); + +	if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) { +		char area_id[INET_ADDRSTRLEN]; +		strcpy(area_id, inet_ntoa(area->area_id)); +		zlog_debug( +			"LSA[Type%d:%s]: Originate Opaque-LSA/MPLS-TE: Area(%s), Link(%s)", +			new->data->type, inet_ntoa(new->data->id), area_id, +			lp->ifp->name); +		ospf_lsa_header_dump(new->data); +	} + +	rc = 0;  out: -  return rc; -} - -static int -ospf_mpls_te_lsa_originate_area (void *arg) -{ -  struct ospf_area *area = (struct ospf_area *) arg; -  struct listnode *node, *nnode; -  struct mpls_te_link *lp; -  int rc = -1; - -  if (OspfMplsTE.status == disabled) -    { -      zlog_info ("ospf_mpls_te_lsa_originate_area: MPLS-TE is disabled now."); -      rc = 0; /* This is not an error case. */ -      goto out; -    } - -  for (ALL_LIST_ELEMENTS (OspfMplsTE.iflist, node, nnode, lp)) -    { -      /* Process only enabled LSA with area scope flooding */ -      if (!CHECK_FLAG (lp->flags, LPFLG_LSA_ACTIVE) || IS_FLOOD_AS (lp->type)) -        continue; - -      if (lp->area == NULL) -        continue; - -      if (! IPV4_ADDR_SAME (&lp->area->area_id, &area->area_id)) -        continue; - -      if CHECK_FLAG (lp->flags, LPFLG_LSA_ENGAGED) -        { -          if CHECK_FLAG (lp->flags, LPFLG_LSA_FORCED_REFRESH) -            { -              UNSET_FLAG (lp->flags, LPFLG_LSA_FORCED_REFRESH); -              zlog_warn ("OSPF MPLS-TE (ospf_mpls_te_lsa_originate_area): Refresh instead of Originate"); -              ospf_mpls_te_lsa_schedule (lp, REFRESH_THIS_LSA); -            } -          continue; -        } -      if (! is_mandated_params_set (lp)) -        { -          zlog_warn ("ospf_mpls_te_lsa_originate_area: Link(%s) lacks some mandated MPLS-TE parameters.", -              lp->ifp ? lp->ifp->name : "?"); -          continue; -        } - -      /* Ok, let's try to originate an LSA for this area and Link. */ -      if (IS_DEBUG_OSPF_TE) -        zlog_debug ("MPLS-TE(ospf_mpls_te_lsa_originate_area) Let's finally reoriginate the LSA %d through the Area %s for Link %s", -                     lp->instance, inet_ntoa (area->area_id), lp->ifp ? lp->ifp->name : "?"); -      if (ospf_mpls_te_lsa_originate1 (area, lp) != 0) -        goto out; -    } - -  rc = 0; +	return rc; +} + +static int ospf_mpls_te_lsa_originate_area(void *arg) +{ +	struct ospf_area *area = (struct ospf_area *)arg; +	struct listnode *node, *nnode; +	struct mpls_te_link *lp; +	int rc = -1; + +	if (OspfMplsTE.status == disabled) { +		zlog_info( +			"ospf_mpls_te_lsa_originate_area: MPLS-TE is disabled now."); +		rc = 0; /* This is not an error case. */ +		goto out; +	} + +	for (ALL_LIST_ELEMENTS(OspfMplsTE.iflist, node, nnode, lp)) { +		/* Process only enabled LSA with area scope flooding */ +		if (!CHECK_FLAG(lp->flags, LPFLG_LSA_ACTIVE) +		    || IS_FLOOD_AS(lp->type)) +			continue; + +		if (lp->area == NULL) +			continue; + +		if (!IPV4_ADDR_SAME(&lp->area->area_id, &area->area_id)) +			continue; + +		if +			CHECK_FLAG(lp->flags, LPFLG_LSA_ENGAGED) +			{ +				if +					CHECK_FLAG(lp->flags, +						   LPFLG_LSA_FORCED_REFRESH) +					{ +						UNSET_FLAG( +							lp->flags, +							LPFLG_LSA_FORCED_REFRESH); +						zlog_warn( +							"OSPF MPLS-TE (ospf_mpls_te_lsa_originate_area): Refresh instead of Originate"); +						ospf_mpls_te_lsa_schedule( +							lp, REFRESH_THIS_LSA); +					} +				continue; +			} +		if (!is_mandated_params_set(lp)) { +			zlog_warn( +				"ospf_mpls_te_lsa_originate_area: Link(%s) lacks some mandated MPLS-TE parameters.", +				lp->ifp ? lp->ifp->name : "?"); +			continue; +		} + +		/* Ok, let's try to originate an LSA for this area and Link. */ +		if (IS_DEBUG_OSPF_TE) +			zlog_debug( +				"MPLS-TE(ospf_mpls_te_lsa_originate_area) Let's finally reoriginate the LSA %d through the Area %s for Link %s", +				lp->instance, inet_ntoa(area->area_id), +				lp->ifp ? lp->ifp->name : "?"); +		if (ospf_mpls_te_lsa_originate1(area, lp) != 0) +			goto out; +	} + +	rc = 0;  out: -  return rc; -} - -static int -ospf_mpls_te_lsa_originate2 (struct ospf *top, struct mpls_te_link *lp) -{ -  struct ospf_lsa *new; -  int rc = -1; - -  /* Create new Opaque-LSA/Inter-AS instance. */ -  if ((new = ospf_mpls_te_lsa_new (NULL, lp)) == NULL) -    { -      zlog_warn ("ospf_mpls_te_lsa_originate2: ospf_router_info_lsa_new() ?"); -      goto out; -    } - -  /* Install this LSA into LSDB. */ -  if (ospf_lsa_install (top, NULL /*oi */ , new) == NULL) -    { -      zlog_warn ("ospf_mpls_te_lsa_originate2: ospf_lsa_install() ?"); -      ospf_lsa_unlock (&new); -      goto out; -    } - -  /* Now this Router Info parameter entry has associated LSA. */ -  SET_FLAG (lp->flags, LPFLG_LSA_ENGAGED); -  /* Update new LSA origination count. */ -  top->lsa_originate_count++; - -  /* Flood new LSA through AS. */ -  ospf_flood_through_as (top, NULL /*nbr */ , new); - -  if (IS_DEBUG_OSPF (lsa, LSA_GENERATE)) -    { -      zlog_debug ("LSA[Type%d:%s]: Originate Opaque-LSA/MPLS-TE Inter-AS", -                  new->data->type, inet_ntoa (new->data->id)); -      ospf_lsa_header_dump (new->data); -    } - -  rc = 0; -out:return rc; -} - -static int -ospf_mpls_te_lsa_originate_as (void *arg) -{ -  struct ospf *top; -  struct ospf_area *area; -  struct listnode *node, *nnode; -  struct mpls_te_link *lp; -  int rc = -1; - -  if ((OspfMplsTE.status == disabled) || (OspfMplsTE.inter_as == Disable)) -    { -      zlog_info -        ("ospf_mpls_te_lsa_originate_as: MPLS-TE Inter-AS is disabled for now."); -      rc = 0;                   /* This is not an error case. */ -      goto out; -    } - -  for (ALL_LIST_ELEMENTS (OspfMplsTE.iflist, node, nnode, lp)) -    { -      /* Process only enabled INTER_AS Links or Pseudo-Links */ -      if (!CHECK_FLAG (lp->flags, LPFLG_LSA_ACTIVE) || !IS_INTER_AS (lp->type)) -        continue; - -      if CHECK_FLAG (lp->flags, LPFLG_LSA_ENGAGED) -        { -          if CHECK_FLAG (lp->flags, LPFLG_LSA_FORCED_REFRESH) -            { -              UNSET_FLAG (lp->flags, LPFLG_LSA_FORCED_REFRESH); -              ospf_mpls_te_lsa_schedule (lp, REFRESH_THIS_LSA); -            } -          continue; -        } -      if (!is_mandated_params_set (lp)) -        { -          zlog_warn ("ospf_mpls_te_lsa_originate_as: Link(%s) lacks some mandated MPLS-TE parameters.", -             lp->ifp ? lp->ifp->name : "?"); -          continue; -        } - -      /* Ok, let's try to originate an LSA for this AS and Link. */ -      if (IS_DEBUG_OSPF_TE) -        zlog_debug ("MPLS-TE(ospf_mpls_te_lsa_originate_as) Let's finally re-originate the Inter-AS LSA %d through the %s for Link %s", -                    lp->instance, IS_FLOOD_AS (lp->type) ? "AS" : "Area", lp->ifp ? lp->ifp->name : "Unknown"); - -      if (IS_FLOOD_AS (lp->type)) -        { -          top = (struct ospf *) arg; -          ospf_mpls_te_lsa_originate2 (top, lp); -        } -      else -        { -          area = (struct ospf_area *) arg; -          ospf_mpls_te_lsa_originate1 (area, lp); -        } -    } - -  rc = 0; -out:return rc; -} - -static struct ospf_lsa * -ospf_mpls_te_lsa_refresh (struct ospf_lsa *lsa) -{ -  struct mpls_te_link *lp; -  struct ospf_area *area = lsa->area; -  struct ospf *top; -  struct ospf_lsa *new = NULL; - -  if (OspfMplsTE.status == disabled) -    { -      /* -       * This LSA must have flushed before due to MPLS-TE status change. -       * It seems a slip among routers in the routing domain. -       */ -      zlog_info ("ospf_mpls_te_lsa_refresh: MPLS-TE is disabled now."); -      lsa->data->ls_age = htons (OSPF_LSA_MAXAGE); /* Flush it anyway. */ -    } - -  /* At first, resolve lsa/lp relationship. */ -  if ((lp = lookup_linkparams_by_instance (lsa)) == NULL) -    { -      zlog_warn ("ospf_mpls_te_lsa_refresh: Invalid parameter?"); -      lsa->data->ls_age = htons (OSPF_LSA_MAXAGE); /* Flush it anyway. */ -    } - -  /* Check if lp was not disable in the interval */ -  if (!CHECK_FLAG (lp->flags, LPFLG_LSA_ACTIVE)) -    { -      zlog_warn ("ospf_mpls_te_lsa_refresh: lp was disabled: Flush it!"); -      lsa->data->ls_age = htons (OSPF_LSA_MAXAGE); /* Flush it anyway. */ -    } - -  /* If the lsa's age reached to MaxAge, start flushing procedure. */ -  if (IS_LSA_MAXAGE (lsa)) -    { -      if (lp) -        UNSET_FLAG (lp->flags, LPFLG_LSA_ENGAGED); -      ospf_opaque_lsa_flush_schedule (lsa); -      goto out; -    } - -  /* Create new Opaque-LSA/MPLS-TE instance. */ -  if ((new = ospf_mpls_te_lsa_new (area, lp)) == NULL) -    { -      zlog_warn ("ospf_mpls_te_lsa_refresh: ospf_mpls_te_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. */ -  /* As area could be NULL i.e. when using OPAQUE_LSA_AS, we prefer to use ospf_lookup() to get ospf instance */ -  if (area) -    top = area->ospf; -  else -    top = ospf_lookup (); - -  if (ospf_lsa_install (top, NULL /*oi */ , new) == NULL) -    { -      zlog_warn ("ospf_mpls_te_lsa_refresh: ospf_lsa_install() ?"); -      ospf_lsa_unlock (&new); -      goto out; -    } - -  /* Flood updated LSA through AS or Area depending of the RFC of the link */ -  if (IS_FLOOD_AS (lp->type)) -    ospf_flood_through_as (top, NULL, new); -  else -    ospf_flood_through_area (area, NULL/*nbr*/, new); - -  /* Debug logging. */ -  if (IS_DEBUG_OSPF (lsa, LSA_GENERATE)) -    { -      zlog_debug ("LSA[Type%d:%s]: Refresh Opaque-LSA/MPLS-TE", -		 new->data->type, inet_ntoa (new->data->id)); -      ospf_lsa_header_dump (new->data); -    } +	return rc; +} +static int ospf_mpls_te_lsa_originate2(struct ospf *top, +				       struct mpls_te_link *lp) +{ +	struct ospf_lsa *new; +	int rc = -1; + +	/* Create new Opaque-LSA/Inter-AS instance. */ +	if ((new = ospf_mpls_te_lsa_new(NULL, lp)) == NULL) { +		zlog_warn( +			"ospf_mpls_te_lsa_originate2: ospf_router_info_lsa_new() ?"); +		goto out; +	} + +	/* Install this LSA into LSDB. */ +	if (ospf_lsa_install(top, NULL /*oi */, new) == NULL) { +		zlog_warn("ospf_mpls_te_lsa_originate2: ospf_lsa_install() ?"); +		ospf_lsa_unlock(&new); +		goto out; +	} + +	/* Now this Router Info parameter entry has associated LSA. */ +	SET_FLAG(lp->flags, LPFLG_LSA_ENGAGED); +	/* Update new LSA origination count. */ +	top->lsa_originate_count++; + +	/* Flood new LSA through AS. */ +	ospf_flood_through_as(top, NULL /*nbr */, new); + +	if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) { +		zlog_debug( +			"LSA[Type%d:%s]: Originate Opaque-LSA/MPLS-TE Inter-AS", +			new->data->type, inet_ntoa(new->data->id)); +		ospf_lsa_header_dump(new->data); +	} + +	rc = 0; +out: +	return rc; +} + +static int ospf_mpls_te_lsa_originate_as(void *arg) +{ +	struct ospf *top; +	struct ospf_area *area; +	struct listnode *node, *nnode; +	struct mpls_te_link *lp; +	int rc = -1; + +	if ((OspfMplsTE.status == disabled) +	    || (OspfMplsTE.inter_as == Disable)) { +		zlog_info( +			"ospf_mpls_te_lsa_originate_as: MPLS-TE Inter-AS is disabled for now."); +		rc = 0; /* This is not an error case. */ +		goto out; +	} + +	for (ALL_LIST_ELEMENTS(OspfMplsTE.iflist, node, nnode, lp)) { +		/* Process only enabled INTER_AS Links or Pseudo-Links */ +		if (!CHECK_FLAG(lp->flags, LPFLG_LSA_ACTIVE) +		    || !IS_INTER_AS(lp->type)) +			continue; + +		if +			CHECK_FLAG(lp->flags, LPFLG_LSA_ENGAGED) +			{ +				if +					CHECK_FLAG(lp->flags, +						   LPFLG_LSA_FORCED_REFRESH) +					{ +						UNSET_FLAG( +							lp->flags, +							LPFLG_LSA_FORCED_REFRESH); +						ospf_mpls_te_lsa_schedule( +							lp, REFRESH_THIS_LSA); +					} +				continue; +			} +		if (!is_mandated_params_set(lp)) { +			zlog_warn( +				"ospf_mpls_te_lsa_originate_as: Link(%s) lacks some mandated MPLS-TE parameters.", +				lp->ifp ? lp->ifp->name : "?"); +			continue; +		} + +		/* Ok, let's try to originate an LSA for this AS and Link. */ +		if (IS_DEBUG_OSPF_TE) +			zlog_debug( +				"MPLS-TE(ospf_mpls_te_lsa_originate_as) Let's finally re-originate the Inter-AS LSA %d through the %s for Link %s", +				lp->instance, +				IS_FLOOD_AS(lp->type) ? "AS" : "Area", +				lp->ifp ? lp->ifp->name : "Unknown"); + +		if (IS_FLOOD_AS(lp->type)) { +			top = (struct ospf *)arg; +			ospf_mpls_te_lsa_originate2(top, lp); +		} else { +			area = (struct ospf_area *)arg; +			ospf_mpls_te_lsa_originate1(area, lp); +		} +	} + +	rc = 0;  out: -  return new; -} - -void -ospf_mpls_te_lsa_schedule (struct mpls_te_link *lp, 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)); -  top = ospf_lookup (); - -  /* Check if the pseudo link is ready to flood */ -  if (!(CHECK_FLAG (lp->flags, LPFLG_LSA_ACTIVE)) -      || !(IS_FLOOD_AREA (lp->type) || IS_FLOOD_AS (lp->type))) { -    return; -  } - -  lsa.area = lp->area; -  lsa.data = &lsah; -  if (IS_FLOOD_AS (lp->type)) -    { -      lsah.type = OSPF_OPAQUE_AS_LSA; -      tmp = SET_OPAQUE_LSID (OPAQUE_TYPE_INTER_AS_LSA, lp->instance); -      lsah.id.s_addr = htonl (tmp); -    } -  else -    { -      lsah.type = OSPF_OPAQUE_AREA_LSA; -      if (IS_INTER_AS (lp->type)) -        { -          /* Set the area context if not know */ -          if (lp->area == NULL) -            lp->area = ospf_area_lookup_by_area_id (top, OspfMplsTE.interas_areaid); -          /* Unable to set the area context. Abort! */ -          if (lp->area == NULL) -            { -              zlog_warn ("MPLS-TE(ospf_mpls_te_lsa_schedule) Area context is null. Abort !"); -              return; -            } -          tmp = SET_OPAQUE_LSID (OPAQUE_TYPE_INTER_AS_LSA, lp->instance); -        } -      else -        tmp = SET_OPAQUE_LSID (OPAQUE_TYPE_TRAFFIC_ENGINEERING_LSA, lp->instance); -      lsah.id.s_addr = htonl (tmp); -    } - -  switch (opcode) -    { -    case REORIGINATE_THIS_LSA: -      if (IS_FLOOD_AS (lp->type)) -        { -          ospf_opaque_lsa_reoriginate_schedule ((void *) top, OSPF_OPAQUE_AS_LSA, -              OPAQUE_TYPE_INTER_AS_LSA); -          break; -        } - -      if (IS_FLOOD_AREA (lp->type)) -        { -          if (IS_INTER_AS (lp->type)) -            ospf_opaque_lsa_reoriginate_schedule ((void *) lp->area, OSPF_OPAQUE_AREA_LSA, -                OPAQUE_TYPE_INTER_AS_LSA); -          else -            ospf_opaque_lsa_reoriginate_schedule ((void *) lp->area, OSPF_OPAQUE_AREA_LSA, -                OPAQUE_TYPE_TRAFFIC_ENGINEERING_LSA); -          break; -        } -      break; -    case REFRESH_THIS_LSA: -      ospf_opaque_lsa_refresh_schedule (&lsa); -      break; -    case FLUSH_THIS_LSA: -      /* Reset Activity flag */ -      lp->flags = LPFLG_LSA_INACTIVE; -      ospf_opaque_lsa_flush_schedule (&lsa); -      break; -    default: -      zlog_warn ("ospf_mpls_te_lsa_schedule: Unknown opcode (%u)", opcode); -      break; -    } - -  return; +	return rc; +} + +static struct ospf_lsa *ospf_mpls_te_lsa_refresh(struct ospf_lsa *lsa) +{ +	struct mpls_te_link *lp; +	struct ospf_area *area = lsa->area; +	struct ospf *top; +	struct ospf_lsa *new = NULL; + +	if (OspfMplsTE.status == disabled) { +		/* +		 * This LSA must have flushed before due to MPLS-TE status +		 * change. +		 * It seems a slip among routers in the routing domain. +		 */ +		zlog_info("ospf_mpls_te_lsa_refresh: MPLS-TE is disabled now."); +		lsa->data->ls_age = +			htons(OSPF_LSA_MAXAGE); /* Flush it anyway. */ +	} + +	/* At first, resolve lsa/lp relationship. */ +	if ((lp = lookup_linkparams_by_instance(lsa)) == NULL) { +		zlog_warn("ospf_mpls_te_lsa_refresh: Invalid parameter?"); +		lsa->data->ls_age = +			htons(OSPF_LSA_MAXAGE); /* Flush it anyway. */ +	} + +	/* Check if lp was not disable in the interval */ +	if (!CHECK_FLAG(lp->flags, LPFLG_LSA_ACTIVE)) { +		zlog_warn( +			"ospf_mpls_te_lsa_refresh: lp was disabled: Flush it!"); +		lsa->data->ls_age = +			htons(OSPF_LSA_MAXAGE); /* Flush it anyway. */ +	} + +	/* If the lsa's age reached to MaxAge, start flushing procedure. */ +	if (IS_LSA_MAXAGE(lsa)) { +		if (lp) +			UNSET_FLAG(lp->flags, LPFLG_LSA_ENGAGED); +		ospf_opaque_lsa_flush_schedule(lsa); +		goto out; +	} + +	/* Create new Opaque-LSA/MPLS-TE instance. */ +	if ((new = ospf_mpls_te_lsa_new(area, lp)) == NULL) { +		zlog_warn("ospf_mpls_te_lsa_refresh: ospf_mpls_te_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. */ +	/* As area could be NULL i.e. when using OPAQUE_LSA_AS, we prefer to use +	 * ospf_lookup() to get ospf instance */ +	if (area) +		top = area->ospf; +	else +		top = ospf_lookup(); + +	if (ospf_lsa_install(top, NULL /*oi */, new) == NULL) { +		zlog_warn("ospf_mpls_te_lsa_refresh: ospf_lsa_install() ?"); +		ospf_lsa_unlock(&new); +		goto out; +	} + +	/* Flood updated LSA through AS or Area depending of the RFC of the link +	 */ +	if (IS_FLOOD_AS(lp->type)) +		ospf_flood_through_as(top, NULL, new); +	else +		ospf_flood_through_area(area, NULL /*nbr*/, new); + +	/* Debug logging. */ +	if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) { +		zlog_debug("LSA[Type%d:%s]: Refresh Opaque-LSA/MPLS-TE", +			   new->data->type, inet_ntoa(new->data->id)); +		ospf_lsa_header_dump(new->data); +	} + +out: +	return new; +} + +void ospf_mpls_te_lsa_schedule(struct mpls_te_link *lp, 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)); +	top = ospf_lookup(); + +	/* Check if the pseudo link is ready to flood */ +	if (!(CHECK_FLAG(lp->flags, LPFLG_LSA_ACTIVE)) +	    || !(IS_FLOOD_AREA(lp->type) || IS_FLOOD_AS(lp->type))) { +		return; +	} + +	lsa.area = lp->area; +	lsa.data = &lsah; +	if (IS_FLOOD_AS(lp->type)) { +		lsah.type = OSPF_OPAQUE_AS_LSA; +		tmp = SET_OPAQUE_LSID(OPAQUE_TYPE_INTER_AS_LSA, lp->instance); +		lsah.id.s_addr = htonl(tmp); +	} else { +		lsah.type = OSPF_OPAQUE_AREA_LSA; +		if (IS_INTER_AS(lp->type)) { +			/* Set the area context if not know */ +			if (lp->area == NULL) +				lp->area = ospf_area_lookup_by_area_id( +					top, OspfMplsTE.interas_areaid); +			/* Unable to set the area context. Abort! */ +			if (lp->area == NULL) { +				zlog_warn( +					"MPLS-TE(ospf_mpls_te_lsa_schedule) Area context is null. Abort !"); +				return; +			} +			tmp = SET_OPAQUE_LSID(OPAQUE_TYPE_INTER_AS_LSA, +					      lp->instance); +		} else +			tmp = SET_OPAQUE_LSID( +				OPAQUE_TYPE_TRAFFIC_ENGINEERING_LSA, +				lp->instance); +		lsah.id.s_addr = htonl(tmp); +	} + +	switch (opcode) { +	case REORIGINATE_THIS_LSA: +		if (IS_FLOOD_AS(lp->type)) { +			ospf_opaque_lsa_reoriginate_schedule( +				(void *)top, OSPF_OPAQUE_AS_LSA, +				OPAQUE_TYPE_INTER_AS_LSA); +			break; +		} + +		if (IS_FLOOD_AREA(lp->type)) { +			if (IS_INTER_AS(lp->type)) +				ospf_opaque_lsa_reoriginate_schedule( +					(void *)lp->area, OSPF_OPAQUE_AREA_LSA, +					OPAQUE_TYPE_INTER_AS_LSA); +			else +				ospf_opaque_lsa_reoriginate_schedule( +					(void *)lp->area, OSPF_OPAQUE_AREA_LSA, +					OPAQUE_TYPE_TRAFFIC_ENGINEERING_LSA); +			break; +		} +		break; +	case REFRESH_THIS_LSA: +		ospf_opaque_lsa_refresh_schedule(&lsa); +		break; +	case FLUSH_THIS_LSA: +		/* Reset Activity flag */ +		lp->flags = LPFLG_LSA_INACTIVE; +		ospf_opaque_lsa_flush_schedule(&lsa); +		break; +	default: +		zlog_warn("ospf_mpls_te_lsa_schedule: Unknown opcode (%u)", +			  opcode); +		break; +	} + +	return;  } @@ -1665,583 +1635,594 @@ ospf_mpls_te_lsa_schedule (struct mpls_te_link *lp, opcode_t opcode)   * Followings are vty session control functions.   *------------------------------------------------------------------------*/ -static u_int16_t -show_vty_router_addr (struct vty *vty, struct te_tlv_header *tlvh) +static u_int16_t show_vty_router_addr(struct vty *vty, +				      struct te_tlv_header *tlvh)  { -  struct te_tlv_router_addr *top = (struct te_tlv_router_addr *) tlvh; +	struct te_tlv_router_addr *top = (struct te_tlv_router_addr *)tlvh; -  if (vty != NULL) -    vty_out (vty, "  Router-Address: %s\n",inet_ntoa(top->value)); -    else -      zlog_debug ("    Router-Address: %s", inet_ntoa (top->value)); +	if (vty != NULL) +		vty_out(vty, "  Router-Address: %s\n", inet_ntoa(top->value)); +	else +		zlog_debug("    Router-Address: %s", inet_ntoa(top->value)); -  return TLV_SIZE (tlvh); +	return TLV_SIZE(tlvh);  } -static u_int16_t -show_vty_link_header (struct vty *vty, struct te_tlv_header *tlvh) +static u_int16_t show_vty_link_header(struct vty *vty, +				      struct te_tlv_header *tlvh)  { -  struct te_tlv_link *top = (struct te_tlv_link *) tlvh; +	struct te_tlv_link *top = (struct te_tlv_link *)tlvh; -  if (vty != NULL) -    vty_out (vty, "  Link: %u octets of data\n",ntohs(top->header.length)); -    else -      zlog_debug ("    Link: %u octets of data", ntohs (top->header.length)); +	if (vty != NULL) +		vty_out(vty, "  Link: %u octets of data\n", +			ntohs(top->header.length)); +	else +		zlog_debug("    Link: %u octets of data", +			   ntohs(top->header.length)); -  return TLV_HDR_SIZE;	/* Here is special, not "TLV_SIZE". */ +	return TLV_HDR_SIZE; /* Here is special, not "TLV_SIZE". */  } -static u_int16_t -show_vty_link_subtlv_link_type (struct vty *vty, struct te_tlv_header *tlvh) +static u_int16_t show_vty_link_subtlv_link_type(struct vty *vty, +						struct te_tlv_header *tlvh)  { -  struct te_link_subtlv_link_type *top; -  const char *cp = "Unknown"; +	struct te_link_subtlv_link_type *top; +	const char *cp = "Unknown"; -  top = (struct te_link_subtlv_link_type *) tlvh; -  switch (top->link_type.value) -    { -    case LINK_TYPE_SUBTLV_VALUE_PTP: -      cp = "Point-to-point"; -      break; -    case LINK_TYPE_SUBTLV_VALUE_MA: -      cp = "Multiaccess"; -      break; -    default: -      break; -    } +	top = (struct te_link_subtlv_link_type *)tlvh; +	switch (top->link_type.value) { +	case LINK_TYPE_SUBTLV_VALUE_PTP: +		cp = "Point-to-point"; +		break; +	case LINK_TYPE_SUBTLV_VALUE_MA: +		cp = "Multiaccess"; +		break; +	default: +		break; +	} -  if (vty != NULL) -    vty_out (vty, "  Link-Type: %s (%u)\n", cp,top->link_type.value); -  else -    zlog_debug ("    Link-Type: %s (%u)", cp, top->link_type.value); +	if (vty != NULL) +		vty_out(vty, "  Link-Type: %s (%u)\n", cp, +			top->link_type.value); +	else +		zlog_debug("    Link-Type: %s (%u)", cp, top->link_type.value); -  return TLV_SIZE (tlvh); +	return TLV_SIZE(tlvh);  } -static u_int16_t -show_vty_link_subtlv_link_id (struct vty *vty, struct te_tlv_header *tlvh) +static u_int16_t show_vty_link_subtlv_link_id(struct vty *vty, +					      struct te_tlv_header *tlvh)  { -  struct te_link_subtlv_link_id *top; +	struct te_link_subtlv_link_id *top; -  top = (struct te_link_subtlv_link_id *) tlvh; -  if (vty != NULL) -    vty_out (vty, "  Link-ID: %s\n", inet_ntoa(top->value)); -    else -      zlog_debug ("    Link-ID: %s", inet_ntoa (top->value)); +	top = (struct te_link_subtlv_link_id *)tlvh; +	if (vty != NULL) +		vty_out(vty, "  Link-ID: %s\n", inet_ntoa(top->value)); +	else +		zlog_debug("    Link-ID: %s", inet_ntoa(top->value)); -  return TLV_SIZE (tlvh); +	return TLV_SIZE(tlvh);  } -static u_int16_t -show_vty_link_subtlv_lclif_ipaddr (struct vty *vty, -                                   struct te_tlv_header *tlvh) +static u_int16_t show_vty_link_subtlv_lclif_ipaddr(struct vty *vty, +						   struct te_tlv_header *tlvh)  { -  struct te_link_subtlv_lclif_ipaddr *top; -  int i, n; +	struct te_link_subtlv_lclif_ipaddr *top; +	int i, n; -  top = (struct te_link_subtlv_lclif_ipaddr *) tlvh; -  n = ntohs (tlvh->length) / sizeof (top->value[0]); +	top = (struct te_link_subtlv_lclif_ipaddr *)tlvh; +	n = ntohs(tlvh->length) / sizeof(top->value[0]); -  if (vty != NULL) -    vty_out (vty, "  Local Interface IP Address(es): %d\n", n); -  else -    zlog_debug ("    Local Interface IP Address(es): %d", n); +	if (vty != NULL) +		vty_out(vty, "  Local Interface IP Address(es): %d\n", n); +	else +		zlog_debug("    Local Interface IP Address(es): %d", n); -  for (i = 0; i < n; i++) -    { -      if (vty != NULL) -        vty_out (vty, "    #%d: %s\n", i,inet_ntoa(top->value[i])); -        else -          zlog_debug ("      #%d: %s", i, inet_ntoa (top->value[i])); -    } -  return TLV_SIZE (tlvh); +	for (i = 0; i < n; i++) { +		if (vty != NULL) +			vty_out(vty, "    #%d: %s\n", i, +				inet_ntoa(top->value[i])); +		else +			zlog_debug("      #%d: %s", i, +				   inet_ntoa(top->value[i])); +	} +	return TLV_SIZE(tlvh);  } -static u_int16_t -show_vty_link_subtlv_rmtif_ipaddr (struct vty *vty, -                                   struct te_tlv_header *tlvh) +static u_int16_t show_vty_link_subtlv_rmtif_ipaddr(struct vty *vty, +						   struct te_tlv_header *tlvh)  { -  struct te_link_subtlv_rmtif_ipaddr *top; -  int i, n; +	struct te_link_subtlv_rmtif_ipaddr *top; +	int i, n; -  top = (struct te_link_subtlv_rmtif_ipaddr *) tlvh; -  n = ntohs (tlvh->length) / sizeof (top->value[0]); -  if (vty != NULL) -    vty_out (vty, "  Remote Interface IP Address(es): %d\n", n); -  else -    zlog_debug ("    Remote Interface IP Address(es): %d", n); +	top = (struct te_link_subtlv_rmtif_ipaddr *)tlvh; +	n = ntohs(tlvh->length) / sizeof(top->value[0]); +	if (vty != NULL) +		vty_out(vty, "  Remote Interface IP Address(es): %d\n", n); +	else +		zlog_debug("    Remote Interface IP Address(es): %d", n); -  for (i = 0; i < n; i++) -    { -      if (vty != NULL) -        vty_out (vty, "    #%d: %s\n", i,inet_ntoa(top->value[i])); -        else -          zlog_debug ("      #%d: %s", i, inet_ntoa (top->value[i])); -    } -  return TLV_SIZE (tlvh); +	for (i = 0; i < n; i++) { +		if (vty != NULL) +			vty_out(vty, "    #%d: %s\n", i, +				inet_ntoa(top->value[i])); +		else +			zlog_debug("      #%d: %s", i, +				   inet_ntoa(top->value[i])); +	} +	return TLV_SIZE(tlvh);  } -static u_int16_t -show_vty_link_subtlv_te_metric (struct vty *vty, struct te_tlv_header *tlvh) +static u_int16_t show_vty_link_subtlv_te_metric(struct vty *vty, +						struct te_tlv_header *tlvh)  { -  struct te_link_subtlv_te_metric *top; +	struct te_link_subtlv_te_metric *top; -  top = (struct te_link_subtlv_te_metric *) tlvh; -  if (vty != NULL) -    vty_out (vty, "  Traffic Engineering Metric: %u\n", -             (u_int32_t)ntohl(top->value)); -      else -        zlog_debug ("    Traffic Engineering Metric: %u", -		                (u_int32_t) ntohl (top->value)); +	top = (struct te_link_subtlv_te_metric *)tlvh; +	if (vty != NULL) +		vty_out(vty, "  Traffic Engineering Metric: %u\n", +			(u_int32_t)ntohl(top->value)); +	else +		zlog_debug("    Traffic Engineering Metric: %u", +			   (u_int32_t)ntohl(top->value)); -  return TLV_SIZE (tlvh); +	return TLV_SIZE(tlvh);  } -static u_int16_t -show_vty_link_subtlv_max_bw (struct vty *vty, struct te_tlv_header *tlvh) +static u_int16_t show_vty_link_subtlv_max_bw(struct vty *vty, +					     struct te_tlv_header *tlvh)  { -  struct te_link_subtlv_max_bw *top; -  float fval; +	struct te_link_subtlv_max_bw *top; +	float fval; -  top = (struct te_link_subtlv_max_bw *) tlvh; -  fval = ntohf (top->value); +	top = (struct te_link_subtlv_max_bw *)tlvh; +	fval = ntohf(top->value); -  if (vty != NULL) -    vty_out (vty, "  Maximum Bandwidth: %g (Bytes/sec)\n", fval); -  else -    zlog_debug ("    Maximum Bandwidth: %g (Bytes/sec)", fval); +	if (vty != NULL) +		vty_out(vty, "  Maximum Bandwidth: %g (Bytes/sec)\n", fval); +	else +		zlog_debug("    Maximum Bandwidth: %g (Bytes/sec)", fval); -  return TLV_SIZE (tlvh); +	return TLV_SIZE(tlvh);  } -static u_int16_t -show_vty_link_subtlv_max_rsv_bw (struct vty *vty, struct te_tlv_header *tlvh) +static u_int16_t show_vty_link_subtlv_max_rsv_bw(struct vty *vty, +						 struct te_tlv_header *tlvh)  { -  struct te_link_subtlv_max_rsv_bw *top; -  float fval; +	struct te_link_subtlv_max_rsv_bw *top; +	float fval; -  top = (struct te_link_subtlv_max_rsv_bw *) tlvh; -  fval = ntohf (top->value); +	top = (struct te_link_subtlv_max_rsv_bw *)tlvh; +	fval = ntohf(top->value); -  if (vty != NULL) -    vty_out (vty, "  Maximum Reservable Bandwidth: %g (Bytes/sec)\n",fval); -  else -    zlog_debug ("    Maximum Reservable Bandwidth: %g (Bytes/sec)", fval); +	if (vty != NULL) +		vty_out(vty, "  Maximum Reservable Bandwidth: %g (Bytes/sec)\n", +			fval); +	else +		zlog_debug("    Maximum Reservable Bandwidth: %g (Bytes/sec)", +			   fval); -  return TLV_SIZE (tlvh); +	return TLV_SIZE(tlvh);  } -static u_int16_t -show_vty_link_subtlv_unrsv_bw (struct vty *vty, struct te_tlv_header *tlvh) +static u_int16_t show_vty_link_subtlv_unrsv_bw(struct vty *vty, +					       struct te_tlv_header *tlvh)  { -  struct te_link_subtlv_unrsv_bw *top; -  float fval1, fval2; -  int i; +	struct te_link_subtlv_unrsv_bw *top; +	float fval1, fval2; +	int i; -  top = (struct te_link_subtlv_unrsv_bw *) tlvh; -  if (vty != NULL) -    vty_out (vty, "  Unreserved Bandwidth per Class Type in Byte/s:\n"); -  else -    zlog_debug ("    Unreserved Bandwidth per Class Type in Byte/s:"); -  for (i = 0; i < MAX_CLASS_TYPE; i+=2) -    { -      fval1 = ntohf (top->value[i]); -      fval2 = ntohf (top->value[i+1]); +	top = (struct te_link_subtlv_unrsv_bw *)tlvh; +	if (vty != NULL) +		vty_out(vty, +			"  Unreserved Bandwidth per Class Type in Byte/s:\n"); +	else +		zlog_debug( +			"    Unreserved Bandwidth per Class Type in Byte/s:"); +	for (i = 0; i < MAX_CLASS_TYPE; i += 2) { +		fval1 = ntohf(top->value[i]); +		fval2 = ntohf(top->value[i + 1]); -      if (vty != NULL) -        vty_out (vty, "    [%d]: %g (Bytes/sec),\t[%d]: %g (Bytes/sec)\n", -                i, fval1, i+1, fval2); -      else -        zlog_debug ("      [%d]: %g (Bytes/sec),\t[%d]: %g (Bytes/sec)", -                    i, fval1, i+1, fval2); -    } +		if (vty != NULL) +			vty_out(vty, +				"    [%d]: %g (Bytes/sec),\t[%d]: %g (Bytes/sec)\n", +				i, fval1, i + 1, fval2); +		else +			zlog_debug( +				"      [%d]: %g (Bytes/sec),\t[%d]: %g (Bytes/sec)", +				i, fval1, i + 1, fval2); +	} -  return TLV_SIZE (tlvh); +	return TLV_SIZE(tlvh);  } -static u_int16_t -show_vty_link_subtlv_rsc_clsclr (struct vty *vty, struct te_tlv_header *tlvh) +static u_int16_t show_vty_link_subtlv_rsc_clsclr(struct vty *vty, +						 struct te_tlv_header *tlvh)  { -  struct te_link_subtlv_rsc_clsclr *top; +	struct te_link_subtlv_rsc_clsclr *top; -  top = (struct te_link_subtlv_rsc_clsclr *) tlvh; -  if (vty != NULL) -    vty_out (vty, "  Resource class/color: 0x%x\n", -             (u_int32_t)ntohl(top->value)); -      else -        zlog_debug ("    Resource Class/Color: 0x%x", -		                (u_int32_t) ntohl (top->value)); +	top = (struct te_link_subtlv_rsc_clsclr *)tlvh; +	if (vty != NULL) +		vty_out(vty, "  Resource class/color: 0x%x\n", +			(u_int32_t)ntohl(top->value)); +	else +		zlog_debug("    Resource Class/Color: 0x%x", +			   (u_int32_t)ntohl(top->value)); -  return TLV_SIZE (tlvh); +	return TLV_SIZE(tlvh);  } -static u_int16_t -show_vty_link_subtlv_lrrid (struct vty *vty, struct te_tlv_header *tlvh) +static u_int16_t show_vty_link_subtlv_lrrid(struct vty *vty, +					    struct te_tlv_header *tlvh)  { -  struct te_link_subtlv_lrrid *top; +	struct te_link_subtlv_lrrid *top; -  top = (struct te_link_subtlv_lrrid *) tlvh; +	top = (struct te_link_subtlv_lrrid *)tlvh; -  if (vty != NULL) -    { -      vty_out (vty, "  Local  TE Router ID: %s\n",inet_ntoa(top->local)); -      vty_out (vty, "  Remote TE Router ID: %s\n",inet_ntoa(top->remote)); -    } -  else -    { -      zlog_debug ("    Local  TE Router ID: %s", inet_ntoa (top->local)); -      zlog_debug ("    Remote TE Router ID: %s", inet_ntoa (top->remote)); -    } +	if (vty != NULL) { +		vty_out(vty, "  Local  TE Router ID: %s\n", +			inet_ntoa(top->local)); +		vty_out(vty, "  Remote TE Router ID: %s\n", +			inet_ntoa(top->remote)); +	} else { +		zlog_debug("    Local  TE Router ID: %s", +			   inet_ntoa(top->local)); +		zlog_debug("    Remote TE Router ID: %s", +			   inet_ntoa(top->remote)); +	} -  return TLV_SIZE (tlvh); +	return TLV_SIZE(tlvh);  } -static u_int16_t -show_vty_link_subtlv_llri (struct vty *vty, struct te_tlv_header *tlvh) +static u_int16_t show_vty_link_subtlv_llri(struct vty *vty, +					   struct te_tlv_header *tlvh)  { -  struct te_link_subtlv_llri *top; +	struct te_link_subtlv_llri *top; -  top = (struct te_link_subtlv_llri *) tlvh; +	top = (struct te_link_subtlv_llri *)tlvh; -  if (vty != NULL) -    { -      vty_out (vty, "  Link Local  ID: %d\n",(u_int32_t)ntohl(top->local)); -      vty_out (vty, "  Link Remote ID: %d\n",(u_int32_t)ntohl(top->remote)); -    } -  else -    { -      zlog_debug ("    Link Local  ID: %d", (u_int32_t) ntohl (top->local)); -      zlog_debug ("    Link Remote ID: %d", (u_int32_t) ntohl (top->remote)); -    } +	if (vty != NULL) { +		vty_out(vty, "  Link Local  ID: %d\n", +			(u_int32_t)ntohl(top->local)); +		vty_out(vty, "  Link Remote ID: %d\n", +			(u_int32_t)ntohl(top->remote)); +	} else { +		zlog_debug("    Link Local  ID: %d", +			   (u_int32_t)ntohl(top->local)); +		zlog_debug("    Link Remote ID: %d", +			   (u_int32_t)ntohl(top->remote)); +	} -  return TLV_SIZE (tlvh); +	return TLV_SIZE(tlvh);  } -static u_int16_t -show_vty_link_subtlv_rip (struct vty *vty, struct te_tlv_header *tlvh) +static u_int16_t show_vty_link_subtlv_rip(struct vty *vty, +					  struct te_tlv_header *tlvh)  { -  struct te_link_subtlv_rip *top; +	struct te_link_subtlv_rip *top; -  top = (struct te_link_subtlv_rip *) tlvh; +	top = (struct te_link_subtlv_rip *)tlvh; -  if (vty != NULL) -    vty_out (vty, "  Inter-AS TE Remote ASBR IP address: %s\n", -             inet_ntoa(top->value)); -    else -      zlog_debug ("    Inter-AS TE Remote ASBR IP address: %s", -	                inet_ntoa (top->value)); +	if (vty != NULL) +		vty_out(vty, "  Inter-AS TE Remote ASBR IP address: %s\n", +			inet_ntoa(top->value)); +	else +		zlog_debug("    Inter-AS TE Remote ASBR IP address: %s", +			   inet_ntoa(top->value)); -  return TLV_SIZE (tlvh); +	return TLV_SIZE(tlvh);  } -static u_int16_t -show_vty_link_subtlv_ras (struct vty *vty, struct te_tlv_header *tlvh) +static u_int16_t show_vty_link_subtlv_ras(struct vty *vty, +					  struct te_tlv_header *tlvh)  { -  struct te_link_subtlv_ras *top; +	struct te_link_subtlv_ras *top; -  top = (struct te_link_subtlv_ras *) tlvh; +	top = (struct te_link_subtlv_ras *)tlvh; -  if (vty != NULL) -    vty_out (vty, "  Inter-AS TE Remote AS number: %u\n",ntohl(top->value)); -    else -      zlog_debug ("    Inter-AS TE Remote AS number: %u", ntohl (top->value)); +	if (vty != NULL) +		vty_out(vty, "  Inter-AS TE Remote AS number: %u\n", +			ntohl(top->value)); +	else +		zlog_debug("    Inter-AS TE Remote AS number: %u", +			   ntohl(top->value)); -  return TLV_SIZE (tlvh); +	return TLV_SIZE(tlvh);  } -static u_int16_t -show_vty_link_subtlv_av_delay (struct vty *vty, struct te_tlv_header *tlvh) +static u_int16_t show_vty_link_subtlv_av_delay(struct vty *vty, +					       struct te_tlv_header *tlvh)  { -  struct te_link_subtlv_av_delay *top; -  u_int32_t delay; -  u_int32_t anomalous; +	struct te_link_subtlv_av_delay *top; +	u_int32_t delay; +	u_int32_t anomalous; -  top = (struct te_link_subtlv_av_delay *) tlvh; -  delay = (u_int32_t) ntohl (top->value) & TE_EXT_MASK; -  anomalous = (u_int32_t) ntohl (top->value) & TE_EXT_ANORMAL; +	top = (struct te_link_subtlv_av_delay *)tlvh; +	delay = (u_int32_t)ntohl(top->value) & TE_EXT_MASK; +	anomalous = (u_int32_t)ntohl(top->value) & TE_EXT_ANORMAL; -  if (vty != NULL) -    vty_out (vty, "  %s Average Link Delay: %d (micro-sec)\n", -             anomalous ? "Anomalous" : "Normal", delay); -  else -    zlog_debug ("    %s Average Link Delay: %d (micro-sec)", -                anomalous ? "Anomalous" : "Normal", delay); +	if (vty != NULL) +		vty_out(vty, "  %s Average Link Delay: %d (micro-sec)\n", +			anomalous ? "Anomalous" : "Normal", delay); +	else +		zlog_debug("    %s Average Link Delay: %d (micro-sec)", +			   anomalous ? "Anomalous" : "Normal", delay); -  return TLV_SIZE (tlvh); +	return TLV_SIZE(tlvh);  } -static u_int16_t -show_vty_link_subtlv_mm_delay (struct vty *vty, struct te_tlv_header *tlvh) +static u_int16_t show_vty_link_subtlv_mm_delay(struct vty *vty, +					       struct te_tlv_header *tlvh)  { -  struct te_link_subtlv_mm_delay *top; -  u_int32_t low, high; -  u_int32_t anomalous; +	struct te_link_subtlv_mm_delay *top; +	u_int32_t low, high; +	u_int32_t anomalous; -  top = (struct te_link_subtlv_mm_delay *) tlvh; -  low = (u_int32_t) ntohl (top->low) & TE_EXT_MASK; -  anomalous = (u_int32_t) ntohl (top->low) & TE_EXT_ANORMAL; -  high = (u_int32_t) ntohl (top->high); +	top = (struct te_link_subtlv_mm_delay *)tlvh; +	low = (u_int32_t)ntohl(top->low) & TE_EXT_MASK; +	anomalous = (u_int32_t)ntohl(top->low) & TE_EXT_ANORMAL; +	high = (u_int32_t)ntohl(top->high); -  if (vty != NULL) -    vty_out (vty, "  %s Min/Max Link Delay: %d/%d (micro-sec)\n", -             anomalous ? "Anomalous" : "Normal", low, high); -  else -    zlog_debug ("    %s Min/Max Link Delay: %d/%d (micro-sec)", -                anomalous ? "Anomalous" : "Normal", low, high); +	if (vty != NULL) +		vty_out(vty, "  %s Min/Max Link Delay: %d/%d (micro-sec)\n", +			anomalous ? "Anomalous" : "Normal", low, high); +	else +		zlog_debug("    %s Min/Max Link Delay: %d/%d (micro-sec)", +			   anomalous ? "Anomalous" : "Normal", low, high); -  return TLV_SIZE (tlvh); +	return TLV_SIZE(tlvh);  } -static u_int16_t -show_vty_link_subtlv_delay_var (struct vty *vty, struct te_tlv_header *tlvh) +static u_int16_t show_vty_link_subtlv_delay_var(struct vty *vty, +						struct te_tlv_header *tlvh)  { -  struct te_link_subtlv_delay_var *top; -  u_int32_t jitter; +	struct te_link_subtlv_delay_var *top; +	u_int32_t jitter; -  top = (struct te_link_subtlv_delay_var *) tlvh; -  jitter = (u_int32_t) ntohl (top->value) & TE_EXT_MASK; +	top = (struct te_link_subtlv_delay_var *)tlvh; +	jitter = (u_int32_t)ntohl(top->value) & TE_EXT_MASK; -  if (vty != NULL) -    vty_out (vty, "  Delay Variation: %d (micro-sec)\n", jitter); -  else -    zlog_debug ("    Delay Variation: %d (micro-sec)", jitter); +	if (vty != NULL) +		vty_out(vty, "  Delay Variation: %d (micro-sec)\n", jitter); +	else +		zlog_debug("    Delay Variation: %d (micro-sec)", jitter); -  return TLV_SIZE (tlvh); +	return TLV_SIZE(tlvh);  } -static u_int16_t -show_vty_link_subtlv_pkt_loss (struct vty *vty, struct te_tlv_header *tlvh) +static u_int16_t show_vty_link_subtlv_pkt_loss(struct vty *vty, +					       struct te_tlv_header *tlvh)  { -  struct te_link_subtlv_pkt_loss *top; -  u_int32_t loss; -  u_int32_t anomalous; -  float fval; +	struct te_link_subtlv_pkt_loss *top; +	u_int32_t loss; +	u_int32_t anomalous; +	float fval; -  top = (struct te_link_subtlv_pkt_loss *) tlvh; -  loss = (u_int32_t) ntohl (top->value) & TE_EXT_MASK; -  fval = (float) (loss * LOSS_PRECISION); -  anomalous = (u_int32_t) ntohl (top->value) & TE_EXT_ANORMAL; +	top = (struct te_link_subtlv_pkt_loss *)tlvh; +	loss = (u_int32_t)ntohl(top->value) & TE_EXT_MASK; +	fval = (float)(loss * LOSS_PRECISION); +	anomalous = (u_int32_t)ntohl(top->value) & TE_EXT_ANORMAL; -  if (vty != NULL) -    vty_out (vty, "  %s Link Loss: %g (%%)\n", anomalous ? "Anomalous" : "Normal", -             fval); -  else -    zlog_debug ("    %s Link Loss: %g (%%)", anomalous ? "Anomalous" : "Normal", -                fval); +	if (vty != NULL) +		vty_out(vty, "  %s Link Loss: %g (%%)\n", +			anomalous ? "Anomalous" : "Normal", fval); +	else +		zlog_debug("    %s Link Loss: %g (%%)", +			   anomalous ? "Anomalous" : "Normal", fval); -  return TLV_SIZE (tlvh); +	return TLV_SIZE(tlvh);  } -static u_int16_t -show_vty_link_subtlv_res_bw (struct vty *vty, struct te_tlv_header *tlvh) +static u_int16_t show_vty_link_subtlv_res_bw(struct vty *vty, +					     struct te_tlv_header *tlvh)  { -  struct te_link_subtlv_res_bw *top; -  float fval; - -  top = (struct te_link_subtlv_res_bw *) tlvh; -  fval = ntohf (top->value); +	struct te_link_subtlv_res_bw *top; +	float fval; -  if (vty != NULL) -    vty_out (vty, "  Unidirectional Residual Bandwidth: %g (Bytes/sec)\n", -             fval); -  else -    zlog_debug ("    Unidirectional Residual Bandwidth: %g (Bytes/sec)", -                fval); +	top = (struct te_link_subtlv_res_bw *)tlvh; +	fval = ntohf(top->value); -  return TLV_SIZE (tlvh); -} - -static u_int16_t -show_vty_link_subtlv_ava_bw (struct vty *vty, struct te_tlv_header *tlvh) -{ -  struct te_link_subtlv_ava_bw *top; -  float fval; - -  top = (struct te_link_subtlv_ava_bw *) tlvh; -  fval = ntohf (top->value); - -  if (vty != NULL) -    vty_out (vty, "  Unidirectional Available Bandwidth: %g (Bytes/sec)\n", -             fval); -  else -    zlog_debug ("    Unidirectional Available Bandwidth: %g (Bytes/sec)", -                fval); - -  return TLV_SIZE (tlvh); -} - -static u_int16_t -show_vty_link_subtlv_use_bw (struct vty *vty, struct te_tlv_header *tlvh) -{ -  struct te_link_subtlv_use_bw *top; -  float fval; - -  top = (struct te_link_subtlv_use_bw *) tlvh; -  fval = ntohf (top->value); - -  if (vty != NULL) -    vty_out (vty, "  Unidirectional Utilized Bandwidth: %g (Bytes/sec)\n", -             fval); -  else -    zlog_debug ("    Unidirectional Utilized Bandwidth: %g (Bytes/sec)", -                fval); - -  return TLV_SIZE (tlvh); -} - -static u_int16_t -show_vty_unknown_tlv (struct vty *vty, struct te_tlv_header *tlvh) -{ -  if (vty != NULL) -    vty_out (vty, "  Unknown TLV: [type(0x%x), length(0x%x)]\n", -             ntohs (tlvh->type), ntohs(tlvh->length)); -    else -      zlog_debug ("    Unknown TLV: [type(0x%x), length(0x%x)]", -	                ntohs (tlvh->type), ntohs (tlvh->length)); - -  return TLV_SIZE (tlvh); -} - -static u_int16_t -ospf_mpls_te_show_link_subtlv (struct vty *vty, struct te_tlv_header *tlvh0, -                               u_int16_t subtotal, u_int16_t total) -{ -  struct te_tlv_header *tlvh, *next; -  u_int16_t sum = subtotal; - -  for (tlvh = tlvh0; sum < total; tlvh = (next ? next : TLV_HDR_NEXT (tlvh))) -    { -      next = NULL; -      switch (ntohs (tlvh->type)) -        { -        case TE_LINK_SUBTLV_LINK_TYPE: -          sum += show_vty_link_subtlv_link_type (vty, tlvh); -          break; -        case TE_LINK_SUBTLV_LINK_ID: -          sum += show_vty_link_subtlv_link_id (vty, tlvh); -          break; -        case TE_LINK_SUBTLV_LCLIF_IPADDR: -          sum += show_vty_link_subtlv_lclif_ipaddr (vty, tlvh); -          break; -        case TE_LINK_SUBTLV_RMTIF_IPADDR: -          sum += show_vty_link_subtlv_rmtif_ipaddr (vty, tlvh); -          break; -        case TE_LINK_SUBTLV_TE_METRIC: -          sum += show_vty_link_subtlv_te_metric (vty, tlvh); -          break; -        case TE_LINK_SUBTLV_MAX_BW: -          sum += show_vty_link_subtlv_max_bw (vty, tlvh); -          break; -        case TE_LINK_SUBTLV_MAX_RSV_BW: -          sum += show_vty_link_subtlv_max_rsv_bw (vty, tlvh); -          break; -        case TE_LINK_SUBTLV_UNRSV_BW: -          sum += show_vty_link_subtlv_unrsv_bw (vty, tlvh); -          break; -        case TE_LINK_SUBTLV_RSC_CLSCLR: -          sum += show_vty_link_subtlv_rsc_clsclr (vty, tlvh); -          break; -        case TE_LINK_SUBTLV_LRRID: -          sum += show_vty_link_subtlv_lrrid (vty, tlvh); -          break; -        case TE_LINK_SUBTLV_LLRI: -          sum += show_vty_link_subtlv_llri (vty, tlvh); -          break; -        case TE_LINK_SUBTLV_RIP: -          sum += show_vty_link_subtlv_rip (vty, tlvh); -          break; -        case TE_LINK_SUBTLV_RAS: -          sum += show_vty_link_subtlv_ras (vty, tlvh); -          break; -        case TE_LINK_SUBTLV_AV_DELAY: -          sum += show_vty_link_subtlv_av_delay (vty, tlvh); -          break; -        case TE_LINK_SUBTLV_MM_DELAY: -          sum += show_vty_link_subtlv_mm_delay (vty, tlvh); -          break; -        case TE_LINK_SUBTLV_DELAY_VAR: -          sum += show_vty_link_subtlv_delay_var (vty, tlvh); -          break; -        case TE_LINK_SUBTLV_PKT_LOSS: -          sum += show_vty_link_subtlv_pkt_loss (vty, tlvh); -          break; -        case TE_LINK_SUBTLV_RES_BW: -          sum += show_vty_link_subtlv_res_bw (vty, tlvh); -          break; -        case TE_LINK_SUBTLV_AVA_BW: -          sum += show_vty_link_subtlv_ava_bw (vty, tlvh); -          break; -        case TE_LINK_SUBTLV_USE_BW: -          sum += show_vty_link_subtlv_use_bw (vty, tlvh); -          break; -        default: -          sum += show_vty_unknown_tlv (vty, tlvh); -          break; -        } -    } -  return sum; -} - -static void -ospf_mpls_te_show_info (struct vty *vty, struct ospf_lsa *lsa) -{ -  struct lsa_header *lsah = (struct lsa_header *) lsa->data; -  struct te_tlv_header *tlvh, *next; -  u_int16_t sum, total; -  u_int16_t (* subfunc)(struct vty *vty, struct te_tlv_header *tlvh, -                        u_int16_t subtotal, u_int16_t total) = NULL; - -  sum = 0; -  total = ntohs (lsah->length) - OSPF_LSA_HEADER_SIZE; - -  for (tlvh = TLV_HDR_TOP (lsah); sum < total; -			tlvh = (next ? next : TLV_HDR_NEXT (tlvh))) -    { -      if (subfunc != NULL) -        { -          sum = (* subfunc)(vty, tlvh, sum, total); -	  next = (struct te_tlv_header *)((char *) tlvh + sum); -          subfunc = NULL; -          continue; -        } - -      next = NULL; -      switch (ntohs (tlvh->type)) -        { -        case TE_TLV_ROUTER_ADDR: -          sum += show_vty_router_addr (vty, tlvh); -          break; -        case TE_TLV_LINK: -          sum += show_vty_link_header (vty, tlvh); -	  subfunc = ospf_mpls_te_show_link_subtlv; -	  next = tlvh + 1; -          break; -        default: -          sum += show_vty_unknown_tlv (vty, tlvh); -          break; -        } -    } -  return; -} - -static void -ospf_mpls_te_config_write_router (struct vty *vty) -{ - -  if (OspfMplsTE.status == enabled) -    { -      vty_out (vty, " mpls-te on\n"); -      vty_out (vty, " mpls-te router-address %s\n", -               inet_ntoa(OspfMplsTE.router_addr.value)); -    } - -  if (OspfMplsTE.inter_as == AS) -    vty_out (vty, "  mpls-te inter-as as\n"); -  if (OspfMplsTE.inter_as == Area) -    vty_out (vty, "  mpls-te inter-as area %s \n", -             inet_ntoa(OspfMplsTE.interas_areaid)); - -  return; +	if (vty != NULL) +		vty_out(vty, +			"  Unidirectional Residual Bandwidth: %g (Bytes/sec)\n", +			fval); +	else +		zlog_debug( +			"    Unidirectional Residual Bandwidth: %g (Bytes/sec)", +			fval); + +	return TLV_SIZE(tlvh); +} + +static u_int16_t show_vty_link_subtlv_ava_bw(struct vty *vty, +					     struct te_tlv_header *tlvh) +{ +	struct te_link_subtlv_ava_bw *top; +	float fval; + +	top = (struct te_link_subtlv_ava_bw *)tlvh; +	fval = ntohf(top->value); + +	if (vty != NULL) +		vty_out(vty, +			"  Unidirectional Available Bandwidth: %g (Bytes/sec)\n", +			fval); +	else +		zlog_debug( +			"    Unidirectional Available Bandwidth: %g (Bytes/sec)", +			fval); + +	return TLV_SIZE(tlvh); +} + +static u_int16_t show_vty_link_subtlv_use_bw(struct vty *vty, +					     struct te_tlv_header *tlvh) +{ +	struct te_link_subtlv_use_bw *top; +	float fval; + +	top = (struct te_link_subtlv_use_bw *)tlvh; +	fval = ntohf(top->value); + +	if (vty != NULL) +		vty_out(vty, +			"  Unidirectional Utilized Bandwidth: %g (Bytes/sec)\n", +			fval); +	else +		zlog_debug( +			"    Unidirectional Utilized Bandwidth: %g (Bytes/sec)", +			fval); + +	return TLV_SIZE(tlvh); +} + +static u_int16_t show_vty_unknown_tlv(struct vty *vty, +				      struct te_tlv_header *tlvh) +{ +	if (vty != NULL) +		vty_out(vty, "  Unknown TLV: [type(0x%x), length(0x%x)]\n", +			ntohs(tlvh->type), ntohs(tlvh->length)); +	else +		zlog_debug("    Unknown TLV: [type(0x%x), length(0x%x)]", +			   ntohs(tlvh->type), ntohs(tlvh->length)); + +	return TLV_SIZE(tlvh); +} + +static u_int16_t ospf_mpls_te_show_link_subtlv(struct vty *vty, +					       struct te_tlv_header *tlvh0, +					       u_int16_t subtotal, +					       u_int16_t total) +{ +	struct te_tlv_header *tlvh, *next; +	u_int16_t sum = subtotal; + +	for (tlvh = tlvh0; sum < total; +	     tlvh = (next ? next : TLV_HDR_NEXT(tlvh))) { +		next = NULL; +		switch (ntohs(tlvh->type)) { +		case TE_LINK_SUBTLV_LINK_TYPE: +			sum += show_vty_link_subtlv_link_type(vty, tlvh); +			break; +		case TE_LINK_SUBTLV_LINK_ID: +			sum += show_vty_link_subtlv_link_id(vty, tlvh); +			break; +		case TE_LINK_SUBTLV_LCLIF_IPADDR: +			sum += show_vty_link_subtlv_lclif_ipaddr(vty, tlvh); +			break; +		case TE_LINK_SUBTLV_RMTIF_IPADDR: +			sum += show_vty_link_subtlv_rmtif_ipaddr(vty, tlvh); +			break; +		case TE_LINK_SUBTLV_TE_METRIC: +			sum += show_vty_link_subtlv_te_metric(vty, tlvh); +			break; +		case TE_LINK_SUBTLV_MAX_BW: +			sum += show_vty_link_subtlv_max_bw(vty, tlvh); +			break; +		case TE_LINK_SUBTLV_MAX_RSV_BW: +			sum += show_vty_link_subtlv_max_rsv_bw(vty, tlvh); +			break; +		case TE_LINK_SUBTLV_UNRSV_BW: +			sum += show_vty_link_subtlv_unrsv_bw(vty, tlvh); +			break; +		case TE_LINK_SUBTLV_RSC_CLSCLR: +			sum += show_vty_link_subtlv_rsc_clsclr(vty, tlvh); +			break; +		case TE_LINK_SUBTLV_LRRID: +			sum += show_vty_link_subtlv_lrrid(vty, tlvh); +			break; +		case TE_LINK_SUBTLV_LLRI: +			sum += show_vty_link_subtlv_llri(vty, tlvh); +			break; +		case TE_LINK_SUBTLV_RIP: +			sum += show_vty_link_subtlv_rip(vty, tlvh); +			break; +		case TE_LINK_SUBTLV_RAS: +			sum += show_vty_link_subtlv_ras(vty, tlvh); +			break; +		case TE_LINK_SUBTLV_AV_DELAY: +			sum += show_vty_link_subtlv_av_delay(vty, tlvh); +			break; +		case TE_LINK_SUBTLV_MM_DELAY: +			sum += show_vty_link_subtlv_mm_delay(vty, tlvh); +			break; +		case TE_LINK_SUBTLV_DELAY_VAR: +			sum += show_vty_link_subtlv_delay_var(vty, tlvh); +			break; +		case TE_LINK_SUBTLV_PKT_LOSS: +			sum += show_vty_link_subtlv_pkt_loss(vty, tlvh); +			break; +		case TE_LINK_SUBTLV_RES_BW: +			sum += show_vty_link_subtlv_res_bw(vty, tlvh); +			break; +		case TE_LINK_SUBTLV_AVA_BW: +			sum += show_vty_link_subtlv_ava_bw(vty, tlvh); +			break; +		case TE_LINK_SUBTLV_USE_BW: +			sum += show_vty_link_subtlv_use_bw(vty, tlvh); +			break; +		default: +			sum += show_vty_unknown_tlv(vty, tlvh); +			break; +		} +	} +	return sum; +} + +static void ospf_mpls_te_show_info(struct vty *vty, struct ospf_lsa *lsa) +{ +	struct lsa_header *lsah = (struct lsa_header *)lsa->data; +	struct te_tlv_header *tlvh, *next; +	u_int16_t sum, total; +	u_int16_t (*subfunc)(struct vty * vty, struct te_tlv_header * tlvh, +			     u_int16_t subtotal, u_int16_t total) = NULL; + +	sum = 0; +	total = ntohs(lsah->length) - OSPF_LSA_HEADER_SIZE; + +	for (tlvh = TLV_HDR_TOP(lsah); sum < total; +	     tlvh = (next ? next : TLV_HDR_NEXT(tlvh))) { +		if (subfunc != NULL) { +			sum = (*subfunc)(vty, tlvh, sum, total); +			next = (struct te_tlv_header *)((char *)tlvh + sum); +			subfunc = NULL; +			continue; +		} + +		next = NULL; +		switch (ntohs(tlvh->type)) { +		case TE_TLV_ROUTER_ADDR: +			sum += show_vty_router_addr(vty, tlvh); +			break; +		case TE_TLV_LINK: +			sum += show_vty_link_header(vty, tlvh); +			subfunc = ospf_mpls_te_show_link_subtlv; +			next = tlvh + 1; +			break; +		default: +			sum += show_vty_unknown_tlv(vty, tlvh); +			break; +		} +	} +	return; +} + +static void ospf_mpls_te_config_write_router(struct vty *vty) +{ + +	if (OspfMplsTE.status == enabled) { +		vty_out(vty, " mpls-te on\n"); +		vty_out(vty, " mpls-te router-address %s\n", +			inet_ntoa(OspfMplsTE.router_addr.value)); +	} + +	if (OspfMplsTE.inter_as == AS) +		vty_out(vty, "  mpls-te inter-as as\n"); +	if (OspfMplsTE.inter_as == Area) +		vty_out(vty, "  mpls-te inter-as area %s \n", +			inet_ntoa(OspfMplsTE.interas_areaid)); + +	return;  }  /*------------------------------------------------------------------------* @@ -2254,34 +2235,33 @@ DEFUN (ospf_mpls_te_on,         MPLS_TE_STR         "Enable the MPLS-TE functionality\n")  { -  VTY_DECLVAR_CONTEXT(ospf, ospf); -  struct listnode *node; -  struct mpls_te_link *lp; +	VTY_DECLVAR_CONTEXT(ospf, ospf); +	struct listnode *node; +	struct mpls_te_link *lp; -  if (OspfMplsTE.status == enabled) -    return CMD_SUCCESS; +	if (OspfMplsTE.status == enabled) +		return CMD_SUCCESS; -  if (IS_DEBUG_OSPF_EVENT) -    zlog_debug ("MPLS-TE: OFF -> ON"); +	if (IS_DEBUG_OSPF_EVENT) +		zlog_debug("MPLS-TE: OFF -> ON"); -  OspfMplsTE.status = enabled; +	OspfMplsTE.status = enabled; -  /* Reoriginate RFC3630 & RFC6827 Links */ -  ospf_mpls_te_foreach_area (ospf_mpls_te_lsa_schedule, REORIGINATE_THIS_LSA); +	/* Reoriginate RFC3630 & RFC6827 Links */ +	ospf_mpls_te_foreach_area(ospf_mpls_te_lsa_schedule, +				  REORIGINATE_THIS_LSA); -  /* Reoriginate LSA if INTER-AS is always on */ -  if (OspfMplsTE.inter_as != Disable) -    { -      for (ALL_LIST_ELEMENTS_RO (OspfMplsTE.iflist, node, lp)) -        { -          if (IS_INTER_AS (lp->type)) -            { -              ospf_mpls_te_lsa_schedule (lp, REORIGINATE_THIS_LSA); -            } -        } -    } +	/* Reoriginate LSA if INTER-AS is always on */ +	if (OspfMplsTE.inter_as != Disable) { +		for (ALL_LIST_ELEMENTS_RO(OspfMplsTE.iflist, node, lp)) { +			if (IS_INTER_AS(lp->type)) { +				ospf_mpls_te_lsa_schedule(lp, +							  REORIGINATE_THIS_LSA); +			} +		} +	} -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (no_ospf_mpls_te, @@ -2291,23 +2271,24 @@ DEFUN (no_ospf_mpls_te,         MPLS_TE_STR         "Disable the MPLS-TE functionality\n")  { -  VTY_DECLVAR_CONTEXT(ospf, ospf); -  struct listnode *node, *nnode; -  struct mpls_te_link *lp; +	VTY_DECLVAR_CONTEXT(ospf, ospf); +	struct listnode *node, *nnode; +	struct mpls_te_link *lp; -  if (OspfMplsTE.status == disabled) -    return CMD_SUCCESS; +	if (OspfMplsTE.status == disabled) +		return CMD_SUCCESS; -  if (IS_DEBUG_OSPF_EVENT) -    zlog_debug ("MPLS-TE: ON -> OFF"); +	if (IS_DEBUG_OSPF_EVENT) +		zlog_debug("MPLS-TE: ON -> OFF"); -  OspfMplsTE.status = disabled; +	OspfMplsTE.status = disabled; -  for (ALL_LIST_ELEMENTS (OspfMplsTE.iflist, node, nnode, lp)) -    if CHECK_FLAG (lp->flags, LPFLG_LSA_ENGAGED) -        ospf_mpls_te_lsa_schedule (lp, FLUSH_THIS_LSA); +	for (ALL_LIST_ELEMENTS(OspfMplsTE.iflist, node, nnode, lp)) +		if +			CHECK_FLAG(lp->flags, LPFLG_LSA_ENGAGED) +	ospf_mpls_te_lsa_schedule(lp, FLUSH_THIS_LSA); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  } @@ -2318,127 +2299,118 @@ DEFUN (ospf_mpls_te_router_addr,         "Stable IP address of the advertising router\n"         "MPLS-TE router address in IPv4 address format\n")  { -  VTY_DECLVAR_CONTEXT(ospf, ospf); -  int idx_ipv4 = 2; -  struct te_tlv_router_addr *ra = &OspfMplsTE.router_addr; -  struct in_addr value; - -  if (! inet_aton (argv[idx_ipv4]->arg, &value)) -    { -      vty_out (vty, "Please specify Router-Addr by A.B.C.D\n"); -      return CMD_WARNING; -    } - -  if (ntohs (ra->header.type) == 0 -      || ntohl (ra->value.s_addr) != ntohl (value.s_addr)) -    { -      struct listnode *node, *nnode; -      struct mpls_te_link *lp; -      int need_to_reoriginate = 0; - -      set_mpls_te_router_addr (value); - -      if (OspfMplsTE.status == disabled) -        goto out; - -      for (ALL_LIST_ELEMENTS (OspfMplsTE.iflist, node, nnode, lp)) -        { -          if ((lp->area == NULL) || IS_FLOOD_AS (lp->type)) -            continue; - -          if (!CHECK_FLAG (lp->flags, LPFLG_LSA_ENGAGED)) -            { -              need_to_reoriginate = 1; -              break; -            } -        } -       -      for (ALL_LIST_ELEMENTS (OspfMplsTE.iflist, node, nnode, lp)) -        { -          if ((lp->area == NULL) || IS_FLOOD_AS (lp->type)) -            continue; - -          if (need_to_reoriginate) -            SET_FLAG (lp->flags, LPFLG_LSA_FORCED_REFRESH); -          else -            ospf_mpls_te_lsa_schedule (lp, REFRESH_THIS_LSA); -        } - -      if (need_to_reoriginate) -        ospf_mpls_te_foreach_area (ospf_mpls_te_lsa_schedule, REORIGINATE_THIS_LSA); -    } +	VTY_DECLVAR_CONTEXT(ospf, ospf); +	int idx_ipv4 = 2; +	struct te_tlv_router_addr *ra = &OspfMplsTE.router_addr; +	struct in_addr value; + +	if (!inet_aton(argv[idx_ipv4]->arg, &value)) { +		vty_out(vty, "Please specify Router-Addr by A.B.C.D\n"); +		return CMD_WARNING; +	} + +	if (ntohs(ra->header.type) == 0 +	    || ntohl(ra->value.s_addr) != ntohl(value.s_addr)) { +		struct listnode *node, *nnode; +		struct mpls_te_link *lp; +		int need_to_reoriginate = 0; + +		set_mpls_te_router_addr(value); + +		if (OspfMplsTE.status == disabled) +			goto out; + +		for (ALL_LIST_ELEMENTS(OspfMplsTE.iflist, node, nnode, lp)) { +			if ((lp->area == NULL) || IS_FLOOD_AS(lp->type)) +				continue; + +			if (!CHECK_FLAG(lp->flags, LPFLG_LSA_ENGAGED)) { +				need_to_reoriginate = 1; +				break; +			} +		} + +		for (ALL_LIST_ELEMENTS(OspfMplsTE.iflist, node, nnode, lp)) { +			if ((lp->area == NULL) || IS_FLOOD_AS(lp->type)) +				continue; + +			if (need_to_reoriginate) +				SET_FLAG(lp->flags, LPFLG_LSA_FORCED_REFRESH); +			else +				ospf_mpls_te_lsa_schedule(lp, REFRESH_THIS_LSA); +		} + +		if (need_to_reoriginate) +			ospf_mpls_te_foreach_area(ospf_mpls_te_lsa_schedule, +						  REORIGINATE_THIS_LSA); +	}  out: -  return CMD_SUCCESS; -} - -static int -set_inter_as_mode (struct vty *vty, const char *mode_name, -                   const char *area_id) -{ -  enum inter_as_mode mode; -  struct listnode *node; -  struct mpls_te_link *lp; -  int format; - -  if (OspfMplsTE.status == enabled) -    { - -      /* Read and Check inter_as mode */ -      if (strcmp (mode_name, "as") == 0) -        mode = AS; -      else if (strcmp (mode_name, "area") == 0) -        { -          mode = Area; -          VTY_GET_OSPF_AREA_ID (OspfMplsTE.interas_areaid, format, area_id); -        } -      else -        { -          vty_out (vty,"Unknown mode. Please choose between as or area\n"); -          return CMD_WARNING; -        } - -      if (IS_DEBUG_OSPF_EVENT) -        zlog_debug ("MPLS-TE: Inter-AS enable with %s flooding support", -                    mode2text[mode]); - -      /* Register new callbacks regarding the flooding scope (AS or Area) */ -      if (ospf_mpls_te_register (mode) < 0) -        { -          vty_out (vty, -                     "Internal error: Unable to register Inter-AS functions\n"); -          return CMD_WARNING; -        } - -      /* Enable mode and re-originate LSA if needed */ -      if ((OspfMplsTE.inter_as == Disable) && (mode != OspfMplsTE.inter_as)) -        { -          OspfMplsTE.inter_as = mode; -          /* Re-originate all InterAS-TEv2 LSA */ -          for (ALL_LIST_ELEMENTS_RO (OspfMplsTE.iflist, node, lp)) -            { -              if (IS_INTER_AS (lp->type)) -                { -                  if (mode == AS) -                    lp->type |= FLOOD_AS; -                  else -                    lp->type |= FLOOD_AREA; -                  ospf_mpls_te_lsa_schedule (lp, REORIGINATE_THIS_LSA); -                } -            } -        } -      else -        { -          vty_out (vty, "Please change Inter-AS support to disable first before going to mode %s\n", -                   mode2text[mode]); -          return CMD_WARNING; -        } -    } -  else -    { -      vty_out (vty, "mpls-te has not been turned on\n"); -      return CMD_WARNING; -    } -  return CMD_SUCCESS; +	return CMD_SUCCESS; +} + +static int set_inter_as_mode(struct vty *vty, const char *mode_name, +			     const char *area_id) +{ +	enum inter_as_mode mode; +	struct listnode *node; +	struct mpls_te_link *lp; +	int format; + +	if (OspfMplsTE.status == enabled) { + +		/* Read and Check inter_as mode */ +		if (strcmp(mode_name, "as") == 0) +			mode = AS; +		else if (strcmp(mode_name, "area") == 0) { +			mode = Area; +			VTY_GET_OSPF_AREA_ID(OspfMplsTE.interas_areaid, format, +					     area_id); +		} else { +			vty_out(vty, +				"Unknown mode. Please choose between as or area\n"); +			return CMD_WARNING; +		} + +		if (IS_DEBUG_OSPF_EVENT) +			zlog_debug( +				"MPLS-TE: Inter-AS enable with %s flooding support", +				mode2text[mode]); + +		/* Register new callbacks regarding the flooding scope (AS or +		 * Area) */ +		if (ospf_mpls_te_register(mode) < 0) { +			vty_out(vty, +				"Internal error: Unable to register Inter-AS functions\n"); +			return CMD_WARNING; +		} + +		/* Enable mode and re-originate LSA if needed */ +		if ((OspfMplsTE.inter_as == Disable) +		    && (mode != OspfMplsTE.inter_as)) { +			OspfMplsTE.inter_as = mode; +			/* Re-originate all InterAS-TEv2 LSA */ +			for (ALL_LIST_ELEMENTS_RO(OspfMplsTE.iflist, node, +						  lp)) { +				if (IS_INTER_AS(lp->type)) { +					if (mode == AS) +						lp->type |= FLOOD_AS; +					else +						lp->type |= FLOOD_AREA; +					ospf_mpls_te_lsa_schedule( +						lp, REORIGINATE_THIS_LSA); +				} +			} +		} else { +			vty_out(vty, +				"Please change Inter-AS support to disable first before going to mode %s\n", +				mode2text[mode]); +			return CMD_WARNING; +		} +	} else { +		vty_out(vty, "mpls-te has not been turned on\n"); +		return CMD_WARNING; +	} +	return CMD_SUCCESS;  } @@ -2449,7 +2421,7 @@ DEFUN (ospf_mpls_te_inter_as_as,         "Configure MPLS-TE Inter-AS support\n"         "AS native mode self originate INTER_AS LSA with Type 11 (as flooding scope)\n")  { -  return set_inter_as_mode (vty, "as", ""); +	return set_inter_as_mode(vty, "as", "");  }  DEFUN (ospf_mpls_te_inter_as_area, @@ -2461,8 +2433,8 @@ DEFUN (ospf_mpls_te_inter_as_area,         "OSPF area ID in IP format\n"         "OSPF area ID as decimal value\n")  { -  int idx_ipv4_number = 3; -  return set_inter_as_mode (vty, "area", argv[idx_ipv4_number]->arg); +	int idx_ipv4_number = 3; +	return set_inter_as_mode(vty, "area", argv[idx_ipv4_number]->arg);  }  DEFUN (no_ospf_mpls_te_inter_as, @@ -2473,25 +2445,26 @@ DEFUN (no_ospf_mpls_te_inter_as,         "Disable MPLS-TE Inter-AS support\n")  { -  struct listnode *node, *nnode; -  struct mpls_te_link *lp; +	struct listnode *node, *nnode; +	struct mpls_te_link *lp; -  if (IS_DEBUG_OSPF_EVENT) -    zlog_debug ("MPLS-TE: Inter-AS support OFF"); +	if (IS_DEBUG_OSPF_EVENT) +		zlog_debug("MPLS-TE: Inter-AS support OFF"); -  if ((OspfMplsTE.status == enabled) && (OspfMplsTE.inter_as != Disable)) -    { -      OspfMplsTE.inter_as = Disable; -      /* Flush all Inter-AS LSA */ -      for (ALL_LIST_ELEMENTS (OspfMplsTE.iflist, node, nnode, lp)) -        if (IS_INTER_AS (lp->type) && CHECK_FLAG (lp->flags, LPFLG_LSA_ENGAGED)) -          ospf_mpls_te_lsa_schedule (lp, FLUSH_THIS_LSA); -    } +	if ((OspfMplsTE.status == enabled) +	    && (OspfMplsTE.inter_as != Disable)) { +		OspfMplsTE.inter_as = Disable; +		/* Flush all Inter-AS LSA */ +		for (ALL_LIST_ELEMENTS(OspfMplsTE.iflist, node, nnode, lp)) +			if (IS_INTER_AS(lp->type) +			    && CHECK_FLAG(lp->flags, LPFLG_LSA_ENGAGED)) +				ospf_mpls_te_lsa_schedule(lp, FLUSH_THIS_LSA); +	} -  /* Deregister the Callbacks for Inter-AS suport */ -  ospf_mpls_te_unregister (); +	/* Deregister the Callbacks for Inter-AS suport */ +	ospf_mpls_te_unregister(); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (show_ip_ospf_mpls_te_router, @@ -2503,97 +2476,100 @@ DEFUN (show_ip_ospf_mpls_te_router,         "MPLS-TE information\n"         "MPLS-TE Router parameters\n")  { -  if (OspfMplsTE.status == enabled) -    { -      vty_out (vty, "--- MPLS-TE router parameters ---\n"); - -      if (ntohs (OspfMplsTE.router_addr.header.type) != 0) -        show_vty_router_addr (vty, &OspfMplsTE.router_addr.header); -      else if (vty != NULL) -        vty_out (vty, "  N/A\n"); -    } -  return CMD_SUCCESS; -} - -static void -show_mpls_te_link_sub (struct vty *vty, struct interface *ifp) -{ -  struct mpls_te_link *lp; - -  if ((OspfMplsTE.status == enabled) -      && HAS_LINK_PARAMS(ifp) -      && !if_is_loopback (ifp) -      && if_is_up (ifp) -      && ((lp = lookup_linkparams_by_ifp (ifp)) != NULL)) -    { -      /* Continue only if interface is not passive or support Inter-AS TEv2 */ -      if (!(ospf_oi_count (ifp) > 0)) -        { -          if (IS_INTER_AS (lp->type)) -            { -              vty_out (vty, "-- Inter-AS TEv2 link parameters for %s --\n", -                       ifp->name); -            } -          else -            { -              /* MPLS-TE is not activate on this interface */ -              /* or this interface is passive and Inter-AS TEv2 is not activate */ -              vty_out (vty, "  %s: MPLS-TE is disabled on this interface\n", -                       ifp->name); -              return; -            } -        } -      else -        { -      vty_out (vty, "-- MPLS-TE link parameters for %s --\n", -               ifp->name); -        } - -      if (TLV_TYPE(lp->link_type) != 0) -        show_vty_link_subtlv_link_type (vty, &lp->link_type.header); -      if (TLV_TYPE(lp->link_id) != 0) -        show_vty_link_subtlv_link_id (vty, &lp->link_id.header); -      if (TLV_TYPE(lp->lclif_ipaddr) != 0) -        show_vty_link_subtlv_lclif_ipaddr (vty, &lp->lclif_ipaddr.header); -      if (TLV_TYPE(lp->rmtif_ipaddr) != 0) -        show_vty_link_subtlv_rmtif_ipaddr (vty, &lp->rmtif_ipaddr.header); -      if (TLV_TYPE(lp->rip) != 0) -        show_vty_link_subtlv_rip (vty, &lp->rip.header); -      if (TLV_TYPE(lp->ras) != 0) -        show_vty_link_subtlv_ras (vty, &lp->ras.header); -      if (TLV_TYPE(lp->te_metric) != 0) -        show_vty_link_subtlv_te_metric (vty, &lp->te_metric.header); -      if (TLV_TYPE(lp->max_bw) != 0) -        show_vty_link_subtlv_max_bw (vty, &lp->max_bw.header); -      if (TLV_TYPE(lp->max_rsv_bw) != 0) -        show_vty_link_subtlv_max_rsv_bw (vty, &lp->max_rsv_bw.header); -      if (TLV_TYPE(lp->unrsv_bw) != 0) -        show_vty_link_subtlv_unrsv_bw (vty, &lp->unrsv_bw.header); -      if (TLV_TYPE(lp->rsc_clsclr) != 0) -        show_vty_link_subtlv_rsc_clsclr (vty, &lp->rsc_clsclr.header); -      if (TLV_TYPE(lp->av_delay) != 0) -        show_vty_link_subtlv_av_delay (vty, &lp->av_delay.header); -      if (TLV_TYPE(lp->mm_delay) != 0) -        show_vty_link_subtlv_mm_delay (vty, &lp->mm_delay.header); -      if (TLV_TYPE(lp->delay_var) != 0) -        show_vty_link_subtlv_delay_var (vty, &lp->delay_var.header); -      if (TLV_TYPE(lp->pkt_loss) != 0) -        show_vty_link_subtlv_pkt_loss (vty, &lp->pkt_loss.header); -      if (TLV_TYPE(lp->res_bw) != 0) -        show_vty_link_subtlv_res_bw (vty, &lp->res_bw.header); -      if (TLV_TYPE(lp->ava_bw) != 0) -        show_vty_link_subtlv_ava_bw (vty, &lp->ava_bw.header); -      if (TLV_TYPE(lp->use_bw) != 0) -        show_vty_link_subtlv_use_bw (vty, &lp->use_bw.header); -      vty_out (vty, "---------------\n\n"); -    } -  else -    { -      vty_out (vty, "  %s: MPLS-TE is disabled on this interface\n", -               ifp->name); -    } - -  return; +	if (OspfMplsTE.status == enabled) { +		vty_out(vty, "--- MPLS-TE router parameters ---\n"); + +		if (ntohs(OspfMplsTE.router_addr.header.type) != 0) +			show_vty_router_addr(vty, +					     &OspfMplsTE.router_addr.header); +		else if (vty != NULL) +			vty_out(vty, "  N/A\n"); +	} +	return CMD_SUCCESS; +} + +static void show_mpls_te_link_sub(struct vty *vty, struct interface *ifp) +{ +	struct mpls_te_link *lp; + +	if ((OspfMplsTE.status == enabled) && HAS_LINK_PARAMS(ifp) +	    && !if_is_loopback(ifp) && if_is_up(ifp) +	    && ((lp = lookup_linkparams_by_ifp(ifp)) != NULL)) { +		/* Continue only if interface is not passive or support Inter-AS +		 * TEv2 */ +		if (!(ospf_oi_count(ifp) > 0)) { +			if (IS_INTER_AS(lp->type)) { +				vty_out(vty, +					"-- Inter-AS TEv2 link parameters for %s --\n", +					ifp->name); +			} else { +				/* MPLS-TE is not activate on this interface */ +				/* or this interface is passive and Inter-AS +				 * TEv2 is not activate */ +				vty_out(vty, +					"  %s: MPLS-TE is disabled on this interface\n", +					ifp->name); +				return; +			} +		} else { +			vty_out(vty, "-- MPLS-TE link parameters for %s --\n", +				ifp->name); +		} + +		if (TLV_TYPE(lp->link_type) != 0) +			show_vty_link_subtlv_link_type(vty, +						       &lp->link_type.header); +		if (TLV_TYPE(lp->link_id) != 0) +			show_vty_link_subtlv_link_id(vty, &lp->link_id.header); +		if (TLV_TYPE(lp->lclif_ipaddr) != 0) +			show_vty_link_subtlv_lclif_ipaddr( +				vty, &lp->lclif_ipaddr.header); +		if (TLV_TYPE(lp->rmtif_ipaddr) != 0) +			show_vty_link_subtlv_rmtif_ipaddr( +				vty, &lp->rmtif_ipaddr.header); +		if (TLV_TYPE(lp->rip) != 0) +			show_vty_link_subtlv_rip(vty, &lp->rip.header); +		if (TLV_TYPE(lp->ras) != 0) +			show_vty_link_subtlv_ras(vty, &lp->ras.header); +		if (TLV_TYPE(lp->te_metric) != 0) +			show_vty_link_subtlv_te_metric(vty, +						       &lp->te_metric.header); +		if (TLV_TYPE(lp->max_bw) != 0) +			show_vty_link_subtlv_max_bw(vty, &lp->max_bw.header); +		if (TLV_TYPE(lp->max_rsv_bw) != 0) +			show_vty_link_subtlv_max_rsv_bw(vty, +							&lp->max_rsv_bw.header); +		if (TLV_TYPE(lp->unrsv_bw) != 0) +			show_vty_link_subtlv_unrsv_bw(vty, +						      &lp->unrsv_bw.header); +		if (TLV_TYPE(lp->rsc_clsclr) != 0) +			show_vty_link_subtlv_rsc_clsclr(vty, +							&lp->rsc_clsclr.header); +		if (TLV_TYPE(lp->av_delay) != 0) +			show_vty_link_subtlv_av_delay(vty, +						      &lp->av_delay.header); +		if (TLV_TYPE(lp->mm_delay) != 0) +			show_vty_link_subtlv_mm_delay(vty, +						      &lp->mm_delay.header); +		if (TLV_TYPE(lp->delay_var) != 0) +			show_vty_link_subtlv_delay_var(vty, +						       &lp->delay_var.header); +		if (TLV_TYPE(lp->pkt_loss) != 0) +			show_vty_link_subtlv_pkt_loss(vty, +						      &lp->pkt_loss.header); +		if (TLV_TYPE(lp->res_bw) != 0) +			show_vty_link_subtlv_res_bw(vty, &lp->res_bw.header); +		if (TLV_TYPE(lp->ava_bw) != 0) +			show_vty_link_subtlv_ava_bw(vty, &lp->ava_bw.header); +		if (TLV_TYPE(lp->use_bw) != 0) +			show_vty_link_subtlv_use_bw(vty, &lp->use_bw.header); +		vty_out(vty, "---------------\n\n"); +	} else { +		vty_out(vty, "  %s: MPLS-TE is disabled on this interface\n", +			ifp->name); +	} + +	return;  }  DEFUN (show_ip_ospf_mpls_te_link, @@ -2606,40 +2582,40 @@ DEFUN (show_ip_ospf_mpls_te_link,         "Interface information\n"         "Interface name\n")  { -  int idx_interface = 5; -  struct interface *ifp; -  struct listnode *node, *nnode; - -  /* Show All Interfaces. */ -  if (argc == 5) -    { -      for (ALL_LIST_ELEMENTS (vrf_iflist (VRF_DEFAULT), node, nnode, ifp)) -        show_mpls_te_link_sub (vty, ifp); -    } -  /* Interface name is specified. */ -  else -    { -      if ((ifp = if_lookup_by_name (argv[idx_interface]->arg, VRF_DEFAULT)) == NULL) -        vty_out (vty, "No such interface name\n"); -      else -        show_mpls_te_link_sub (vty, ifp); -    } - -  return CMD_SUCCESS; -} - -static void -ospf_mpls_te_register_vty (void) -{ -  install_element (VIEW_NODE, &show_ip_ospf_mpls_te_router_cmd); -  install_element (VIEW_NODE, &show_ip_ospf_mpls_te_link_cmd); - -  install_element (OSPF_NODE, &ospf_mpls_te_on_cmd); -  install_element (OSPF_NODE, &no_ospf_mpls_te_cmd); -  install_element (OSPF_NODE, &ospf_mpls_te_router_addr_cmd); -  install_element (OSPF_NODE, &ospf_mpls_te_inter_as_cmd); -  install_element (OSPF_NODE, &ospf_mpls_te_inter_as_area_cmd); -  install_element (OSPF_NODE, &no_ospf_mpls_te_inter_as_cmd); - -  return; +	int idx_interface = 5; +	struct interface *ifp; +	struct listnode *node, *nnode; + +	/* Show All Interfaces. */ +	if (argc == 5) { +		for (ALL_LIST_ELEMENTS(vrf_iflist(VRF_DEFAULT), node, nnode, +				       ifp)) +			show_mpls_te_link_sub(vty, ifp); +	} +	/* Interface name is specified. */ +	else { +		if ((ifp = if_lookup_by_name(argv[idx_interface]->arg, +					     VRF_DEFAULT)) +		    == NULL) +			vty_out(vty, "No such interface name\n"); +		else +			show_mpls_te_link_sub(vty, ifp); +	} + +	return CMD_SUCCESS; +} + +static void ospf_mpls_te_register_vty(void) +{ +	install_element(VIEW_NODE, &show_ip_ospf_mpls_te_router_cmd); +	install_element(VIEW_NODE, &show_ip_ospf_mpls_te_link_cmd); + +	install_element(OSPF_NODE, &ospf_mpls_te_on_cmd); +	install_element(OSPF_NODE, &no_ospf_mpls_te_cmd); +	install_element(OSPF_NODE, &ospf_mpls_te_router_addr_cmd); +	install_element(OSPF_NODE, &ospf_mpls_te_inter_as_cmd); +	install_element(OSPF_NODE, &ospf_mpls_te_inter_as_area_cmd); +	install_element(OSPF_NODE, &no_ospf_mpls_te_inter_as_cmd); + +	return;  }  | 
