diff options
Diffstat (limited to 'ospf6d/ospf6_area.c')
| -rw-r--r-- | ospf6d/ospf6_area.c | 1360 | 
1 files changed, 645 insertions, 715 deletions
diff --git a/ospf6d/ospf6_area.c b/ospf6d/ospf6_area.c index 8e6408bf40..a4cc0bf420 100644 --- a/ospf6d/ospf6_area.c +++ b/ospf6d/ospf6_area.c @@ -45,163 +45,146 @@  #include "ospf6_asbr.h"  #include "ospf6d.h" -int -ospf6_area_cmp (void *va, void *vb) +int ospf6_area_cmp(void *va, void *vb)  { -  struct ospf6_area *oa = (struct ospf6_area *) va; -  struct ospf6_area *ob = (struct ospf6_area *) vb; -  return (ntohl (oa->area_id) < ntohl (ob->area_id) ? -1 : 1); +	struct ospf6_area *oa = (struct ospf6_area *)va; +	struct ospf6_area *ob = (struct ospf6_area *)vb; +	return (ntohl(oa->area_id) < ntohl(ob->area_id) ? -1 : 1);  }  /* schedule routing table recalculation */ -static void -ospf6_area_lsdb_hook_add (struct ospf6_lsa *lsa) -{ -  switch (ntohs (lsa->header->type)) -    { -    case OSPF6_LSTYPE_ROUTER: -    case OSPF6_LSTYPE_NETWORK: -      if (IS_OSPF6_DEBUG_EXAMIN_TYPE (lsa->header->type)) -        { -          zlog_debug ("Examin %s", lsa->name); -          zlog_debug ("Schedule SPF Calculation for %s", -		      OSPF6_AREA (lsa->lsdb->data)->name); -        } -      ospf6_spf_schedule (OSPF6_PROCESS(OSPF6_AREA (lsa->lsdb->data)->ospf6), -			  ospf6_lsadd_to_spf_reason(lsa)); -      break; - -    case OSPF6_LSTYPE_INTRA_PREFIX: -      ospf6_intra_prefix_lsa_add (lsa); -      break; - -    case OSPF6_LSTYPE_INTER_PREFIX: -    case OSPF6_LSTYPE_INTER_ROUTER: -      ospf6_abr_examin_summary (lsa, (struct ospf6_area *) lsa->lsdb->data); -      break; - -    default: -      break; -    } +static void ospf6_area_lsdb_hook_add(struct ospf6_lsa *lsa) +{ +	switch (ntohs(lsa->header->type)) { +	case OSPF6_LSTYPE_ROUTER: +	case OSPF6_LSTYPE_NETWORK: +		if (IS_OSPF6_DEBUG_EXAMIN_TYPE(lsa->header->type)) { +			zlog_debug("Examin %s", lsa->name); +			zlog_debug("Schedule SPF Calculation for %s", +				   OSPF6_AREA(lsa->lsdb->data)->name); +		} +		ospf6_spf_schedule( +			OSPF6_PROCESS(OSPF6_AREA(lsa->lsdb->data)->ospf6), +			ospf6_lsadd_to_spf_reason(lsa)); +		break; + +	case OSPF6_LSTYPE_INTRA_PREFIX: +		ospf6_intra_prefix_lsa_add(lsa); +		break; + +	case OSPF6_LSTYPE_INTER_PREFIX: +	case OSPF6_LSTYPE_INTER_ROUTER: +		ospf6_abr_examin_summary(lsa, +					 (struct ospf6_area *)lsa->lsdb->data); +		break; + +	default: +		break; +	}  } -static void -ospf6_area_lsdb_hook_remove (struct ospf6_lsa *lsa) -{ -  switch (ntohs (lsa->header->type)) -    { -    case OSPF6_LSTYPE_ROUTER: -    case OSPF6_LSTYPE_NETWORK: -      if (IS_OSPF6_DEBUG_EXAMIN_TYPE (lsa->header->type)) -        { -          zlog_debug ("LSA disappearing: %s", lsa->name); -          zlog_debug ("Schedule SPF Calculation for %s", -                     OSPF6_AREA (lsa->lsdb->data)->name); -        } -      ospf6_spf_schedule (OSPF6_PROCESS(OSPF6_AREA (lsa->lsdb->data)->ospf6), -			  ospf6_lsremove_to_spf_reason(lsa)); -      break; - -    case OSPF6_LSTYPE_INTRA_PREFIX: -      ospf6_intra_prefix_lsa_remove (lsa); -      break; - -    case OSPF6_LSTYPE_INTER_PREFIX: -    case OSPF6_LSTYPE_INTER_ROUTER: -      ospf6_abr_examin_summary (lsa, (struct ospf6_area *) lsa->lsdb->data); -      break; - -    default: -      break; -    } +static void ospf6_area_lsdb_hook_remove(struct ospf6_lsa *lsa) +{ +	switch (ntohs(lsa->header->type)) { +	case OSPF6_LSTYPE_ROUTER: +	case OSPF6_LSTYPE_NETWORK: +		if (IS_OSPF6_DEBUG_EXAMIN_TYPE(lsa->header->type)) { +			zlog_debug("LSA disappearing: %s", lsa->name); +			zlog_debug("Schedule SPF Calculation for %s", +				   OSPF6_AREA(lsa->lsdb->data)->name); +		} +		ospf6_spf_schedule( +			OSPF6_PROCESS(OSPF6_AREA(lsa->lsdb->data)->ospf6), +			ospf6_lsremove_to_spf_reason(lsa)); +		break; + +	case OSPF6_LSTYPE_INTRA_PREFIX: +		ospf6_intra_prefix_lsa_remove(lsa); +		break; + +	case OSPF6_LSTYPE_INTER_PREFIX: +	case OSPF6_LSTYPE_INTER_ROUTER: +		ospf6_abr_examin_summary(lsa, +					 (struct ospf6_area *)lsa->lsdb->data); +		break; + +	default: +		break; +	}  } -static void -ospf6_area_route_hook_add (struct ospf6_route *route) +static void ospf6_area_route_hook_add(struct ospf6_route *route)  { -  struct ospf6_route *copy = ospf6_route_copy (route); -  ospf6_route_add (copy, ospf6->route_table); +	struct ospf6_route *copy = ospf6_route_copy(route); +	ospf6_route_add(copy, ospf6->route_table);  } -static void -ospf6_area_route_hook_remove (struct ospf6_route *route) +static void ospf6_area_route_hook_remove(struct ospf6_route *route)  { -  struct ospf6_route *copy; +	struct ospf6_route *copy; -  copy = ospf6_route_lookup_identical (route, ospf6->route_table); -  if (copy) -    ospf6_route_remove (copy, ospf6->route_table); +	copy = ospf6_route_lookup_identical(route, ospf6->route_table); +	if (copy) +		ospf6_route_remove(copy, ospf6->route_table);  } -static void -ospf6_area_stub_update (struct ospf6_area *area) +static void ospf6_area_stub_update(struct ospf6_area *area)  { -  if (IS_AREA_STUB (area)) -    { -      if (IS_OSPF6_DEBUG_ORIGINATE (ROUTER)) -	zlog_debug ("Stubbing out area for if %s\n", area->name); -      OSPF6_OPT_CLEAR (area->options, OSPF6_OPT_E); -    } -  else if (IS_AREA_ENABLED (area)) -    { -      if (IS_OSPF6_DEBUG_ORIGINATE (ROUTER)) -	zlog_debug ("Normal area for if %s\n", area->name); -      OSPF6_OPT_SET (area->options, OSPF6_OPT_E); -      ospf6_asbr_send_externals_to_area (area); -    } - -  OSPF6_ROUTER_LSA_SCHEDULE(area); +	if (IS_AREA_STUB(area)) { +		if (IS_OSPF6_DEBUG_ORIGINATE(ROUTER)) +			zlog_debug("Stubbing out area for if %s\n", area->name); +		OSPF6_OPT_CLEAR(area->options, OSPF6_OPT_E); +	} else if (IS_AREA_ENABLED(area)) { +		if (IS_OSPF6_DEBUG_ORIGINATE(ROUTER)) +			zlog_debug("Normal area for if %s\n", area->name); +		OSPF6_OPT_SET(area->options, OSPF6_OPT_E); +		ospf6_asbr_send_externals_to_area(area); +	} + +	OSPF6_ROUTER_LSA_SCHEDULE(area);  } -static int -ospf6_area_stub_set (struct ospf6 *ospf6, struct ospf6_area *area) +static int ospf6_area_stub_set(struct ospf6 *ospf6, struct ospf6_area *area)  { -  if (!IS_AREA_STUB(area)) -    { -      SET_FLAG (area->flag, OSPF6_AREA_STUB); -      ospf6_area_stub_update (area); -    } +	if (!IS_AREA_STUB(area)) { +		SET_FLAG(area->flag, OSPF6_AREA_STUB); +		ospf6_area_stub_update(area); +	} -  return (1); +	return (1);  } -static void -ospf6_area_stub_unset (struct ospf6 *ospf6, struct ospf6_area *area) +static void ospf6_area_stub_unset(struct ospf6 *ospf6, struct ospf6_area *area)  { -  if (IS_AREA_STUB (area)) -    { -      UNSET_FLAG (area->flag, OSPF6_AREA_STUB); -      ospf6_area_stub_update (area); -    } +	if (IS_AREA_STUB(area)) { +		UNSET_FLAG(area->flag, OSPF6_AREA_STUB); +		ospf6_area_stub_update(area); +	}  } -static void -ospf6_area_no_summary_set (struct ospf6 *ospf6, struct ospf6_area *area) +static void ospf6_area_no_summary_set(struct ospf6 *ospf6, +				      struct ospf6_area *area)  { -  if (area) -    { -      if (!area->no_summary) -	{ -	  area->no_summary = 1; -	  ospf6_abr_range_reset_cost (ospf6); -	  ospf6_abr_prefix_resummarize (ospf6); +	if (area) { +		if (!area->no_summary) { +			area->no_summary = 1; +			ospf6_abr_range_reset_cost(ospf6); +			ospf6_abr_prefix_resummarize(ospf6); +		}  	} -    }  } -static void -ospf6_area_no_summary_unset (struct ospf6 *ospf6, struct ospf6_area *area) +static void ospf6_area_no_summary_unset(struct ospf6 *ospf6, +					struct ospf6_area *area)  { -  if (area) -    { -      if (area->no_summary) -	{ -	  area->no_summary = 0; -	  ospf6_abr_range_reset_cost (ospf6); -	  ospf6_abr_prefix_resummarize (ospf6); +	if (area) { +		if (area->no_summary) { +			area->no_summary = 0; +			ospf6_abr_range_reset_cost(ospf6); +			ospf6_abr_prefix_resummarize(ospf6); +		}  	} -    }  }  /** @@ -211,221 +194,199 @@ ospf6_area_no_summary_unset (struct ospf6 *ospf6, struct ospf6_area *area)   * @param o - ospf6 instance   * @param df - display format for area ID   */ -struct ospf6_area * -ospf6_area_create (u_int32_t area_id, struct ospf6 *o, int df) +struct ospf6_area *ospf6_area_create(u_int32_t area_id, struct ospf6 *o, int df)  { -  struct ospf6_area *oa; - -  oa = XCALLOC (MTYPE_OSPF6_AREA, sizeof (struct ospf6_area)); - -  switch (df) -    { -      case OSPF6_AREA_FMT_DECIMAL: -        snprintf (oa->name, sizeof (oa->name), "%u", ntohl (area_id)); -        break; -      default: -      case OSPF6_AREA_FMT_DOTTEDQUAD: -        inet_ntop (AF_INET, &area_id, oa->name, sizeof (oa->name)); -        break; -    } - -  oa->area_id = area_id; -  oa->if_list = list_new (); - -  oa->lsdb = ospf6_lsdb_create (oa); -  oa->lsdb->hook_add = ospf6_area_lsdb_hook_add; -  oa->lsdb->hook_remove = ospf6_area_lsdb_hook_remove; -  oa->lsdb_self = ospf6_lsdb_create (oa); - -  oa->spf_table = OSPF6_ROUTE_TABLE_CREATE (AREA, SPF_RESULTS); -  oa->spf_table->scope = oa; -  oa->route_table = OSPF6_ROUTE_TABLE_CREATE (AREA, ROUTES); -  oa->route_table->scope = oa; -  oa->route_table->hook_add = ospf6_area_route_hook_add; -  oa->route_table->hook_remove = ospf6_area_route_hook_remove; - -  oa->range_table = OSPF6_ROUTE_TABLE_CREATE (AREA, PREFIX_RANGES); -  oa->range_table->scope = oa; -  bf_init(oa->range_table->idspace, 32); -  oa->summary_prefix = OSPF6_ROUTE_TABLE_CREATE (AREA, SUMMARY_PREFIXES); -  oa->summary_prefix->scope = oa; -  oa->summary_router = OSPF6_ROUTE_TABLE_CREATE (AREA, SUMMARY_ROUTERS); -  oa->summary_router->scope = oa; - -  /* set default options */ -  if (CHECK_FLAG (o->flag, OSPF6_STUB_ROUTER)) -    { -      OSPF6_OPT_CLEAR (oa->options, OSPF6_OPT_V6); -      OSPF6_OPT_CLEAR (oa->options, OSPF6_OPT_R); -    } -  else -    { -      OSPF6_OPT_SET (oa->options, OSPF6_OPT_V6); -      OSPF6_OPT_SET (oa->options, OSPF6_OPT_R); -    } - -  OSPF6_OPT_SET (oa->options, OSPF6_OPT_E); - -  SET_FLAG (oa->flag, OSPF6_AREA_ACTIVE); -  SET_FLAG (oa->flag, OSPF6_AREA_ENABLE); - -  oa->ospf6 = o; -  listnode_add_sort (o->area_list, oa); - -  if (area_id == OSPF_AREA_BACKBONE) -    { -      o->backbone = oa; -    } - -  return oa; +	struct ospf6_area *oa; + +	oa = XCALLOC(MTYPE_OSPF6_AREA, sizeof(struct ospf6_area)); + +	switch (df) { +	case OSPF6_AREA_FMT_DECIMAL: +		snprintf(oa->name, sizeof(oa->name), "%u", ntohl(area_id)); +		break; +	default: +	case OSPF6_AREA_FMT_DOTTEDQUAD: +		inet_ntop(AF_INET, &area_id, oa->name, sizeof(oa->name)); +		break; +	} + +	oa->area_id = area_id; +	oa->if_list = list_new(); + +	oa->lsdb = ospf6_lsdb_create(oa); +	oa->lsdb->hook_add = ospf6_area_lsdb_hook_add; +	oa->lsdb->hook_remove = ospf6_area_lsdb_hook_remove; +	oa->lsdb_self = ospf6_lsdb_create(oa); + +	oa->spf_table = OSPF6_ROUTE_TABLE_CREATE(AREA, SPF_RESULTS); +	oa->spf_table->scope = oa; +	oa->route_table = OSPF6_ROUTE_TABLE_CREATE(AREA, ROUTES); +	oa->route_table->scope = oa; +	oa->route_table->hook_add = ospf6_area_route_hook_add; +	oa->route_table->hook_remove = ospf6_area_route_hook_remove; + +	oa->range_table = OSPF6_ROUTE_TABLE_CREATE(AREA, PREFIX_RANGES); +	oa->range_table->scope = oa; +	bf_init(oa->range_table->idspace, 32); +	oa->summary_prefix = OSPF6_ROUTE_TABLE_CREATE(AREA, SUMMARY_PREFIXES); +	oa->summary_prefix->scope = oa; +	oa->summary_router = OSPF6_ROUTE_TABLE_CREATE(AREA, SUMMARY_ROUTERS); +	oa->summary_router->scope = oa; + +	/* set default options */ +	if (CHECK_FLAG(o->flag, OSPF6_STUB_ROUTER)) { +		OSPF6_OPT_CLEAR(oa->options, OSPF6_OPT_V6); +		OSPF6_OPT_CLEAR(oa->options, OSPF6_OPT_R); +	} else { +		OSPF6_OPT_SET(oa->options, OSPF6_OPT_V6); +		OSPF6_OPT_SET(oa->options, OSPF6_OPT_R); +	} + +	OSPF6_OPT_SET(oa->options, OSPF6_OPT_E); + +	SET_FLAG(oa->flag, OSPF6_AREA_ACTIVE); +	SET_FLAG(oa->flag, OSPF6_AREA_ENABLE); + +	oa->ospf6 = o; +	listnode_add_sort(o->area_list, oa); + +	if (area_id == OSPF_AREA_BACKBONE) { +		o->backbone = oa; +	} + +	return oa;  } -void -ospf6_area_delete (struct ospf6_area *oa) +void ospf6_area_delete(struct ospf6_area *oa)  { -  struct listnode *n; -  struct ospf6_interface *oi; +	struct listnode *n; +	struct ospf6_interface *oi; -  /* The ospf6_interface structs store configuration -   * information which should not be lost/reset when -   * deleting an area. -   * So just detach the interface from the area and -   * keep it around. */ -  for (ALL_LIST_ELEMENTS_RO (oa->if_list, n, oi)) -    oi->area = NULL; +	/* The ospf6_interface structs store configuration +	 * information which should not be lost/reset when +	 * deleting an area. +	 * So just detach the interface from the area and +	 * keep it around. */ +	for (ALL_LIST_ELEMENTS_RO(oa->if_list, n, oi)) +		oi->area = NULL; -  list_delete (oa->if_list); +	list_delete(oa->if_list); -  ospf6_lsdb_delete (oa->lsdb); -  ospf6_lsdb_delete (oa->lsdb_self); +	ospf6_lsdb_delete(oa->lsdb); +	ospf6_lsdb_delete(oa->lsdb_self); -  ospf6_spf_table_finish (oa->spf_table); -  ospf6_route_table_delete (oa->spf_table); -  ospf6_route_table_delete (oa->route_table); +	ospf6_spf_table_finish(oa->spf_table); +	ospf6_route_table_delete(oa->spf_table); +	ospf6_route_table_delete(oa->route_table); -  ospf6_route_table_delete (oa->range_table); -  ospf6_route_table_delete (oa->summary_prefix); -  ospf6_route_table_delete (oa->summary_router); +	ospf6_route_table_delete(oa->range_table); +	ospf6_route_table_delete(oa->summary_prefix); +	ospf6_route_table_delete(oa->summary_router); -  listnode_delete (oa->ospf6->area_list, oa); -  oa->ospf6 = NULL; +	listnode_delete(oa->ospf6->area_list, oa); +	oa->ospf6 = NULL; -  /* free area */ -  XFREE (MTYPE_OSPF6_AREA, oa); +	/* free area */ +	XFREE(MTYPE_OSPF6_AREA, oa);  } -struct ospf6_area * -ospf6_area_lookup (u_int32_t area_id, struct ospf6 *ospf6) +struct ospf6_area *ospf6_area_lookup(u_int32_t area_id, struct ospf6 *ospf6)  { -  struct ospf6_area *oa; -  struct listnode *n; +	struct ospf6_area *oa; +	struct listnode *n; -  for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, n, oa)) -    if (oa->area_id == area_id) -      return oa; +	for (ALL_LIST_ELEMENTS_RO(ospf6->area_list, n, oa)) +		if (oa->area_id == area_id) +			return oa; -  return (struct ospf6_area *) NULL; +	return (struct ospf6_area *)NULL;  } -void -ospf6_area_enable (struct ospf6_area *oa) +void ospf6_area_enable(struct ospf6_area *oa)  { -  struct listnode *node, *nnode; -  struct ospf6_interface *oi; +	struct listnode *node, *nnode; +	struct ospf6_interface *oi; -  SET_FLAG (oa->flag, OSPF6_AREA_ENABLE); +	SET_FLAG(oa->flag, OSPF6_AREA_ENABLE); -  for (ALL_LIST_ELEMENTS (oa->if_list, node, nnode, oi)) -    ospf6_interface_enable (oi); -  ospf6_abr_enable_area (oa); +	for (ALL_LIST_ELEMENTS(oa->if_list, node, nnode, oi)) +		ospf6_interface_enable(oi); +	ospf6_abr_enable_area(oa);  } -void -ospf6_area_disable (struct ospf6_area *oa) +void ospf6_area_disable(struct ospf6_area *oa)  { -  struct listnode *node, *nnode; -  struct ospf6_interface *oi; +	struct listnode *node, *nnode; +	struct ospf6_interface *oi; -  UNSET_FLAG (oa->flag, OSPF6_AREA_ENABLE); +	UNSET_FLAG(oa->flag, OSPF6_AREA_ENABLE); -  for (ALL_LIST_ELEMENTS (oa->if_list, node, nnode, oi)) -    ospf6_interface_disable (oi); +	for (ALL_LIST_ELEMENTS(oa->if_list, node, nnode, oi)) +		ospf6_interface_disable(oi); -  ospf6_abr_disable_area (oa); -  ospf6_lsdb_remove_all (oa->lsdb); -  ospf6_lsdb_remove_all (oa->lsdb_self); +	ospf6_abr_disable_area(oa); +	ospf6_lsdb_remove_all(oa->lsdb); +	ospf6_lsdb_remove_all(oa->lsdb_self); -  ospf6_spf_table_finish(oa->spf_table); -  ospf6_route_remove_all(oa->route_table); +	ospf6_spf_table_finish(oa->spf_table); +	ospf6_route_remove_all(oa->route_table); -  THREAD_OFF (oa->thread_router_lsa); -  THREAD_OFF (oa->thread_intra_prefix_lsa); +	THREAD_OFF(oa->thread_router_lsa); +	THREAD_OFF(oa->thread_intra_prefix_lsa);  } -void -ospf6_area_show (struct vty *vty, struct ospf6_area *oa) +void ospf6_area_show(struct vty *vty, struct ospf6_area *oa)  { -  struct listnode *i; -  struct ospf6_interface *oi; -  unsigned long result; - -  if (!IS_AREA_STUB (oa)) -    vty_out (vty, " Area %s\n", oa->name); -  else -    { -      if (oa->no_summary) -	{ -	  vty_out (vty, " Area %s[Stub, No Summary]\n", oa->name); -	} -      else -	{ -	  vty_out (vty, " Area %s[Stub]\n", oa->name); -	} -    } -  vty_out (vty, "     Number of Area scoped LSAs is %u\n", -           oa->lsdb->count); - -  vty_out (vty, "     Interface attached to this area:"); -  for (ALL_LIST_ELEMENTS_RO (oa->if_list, i, oi)) -    vty_out (vty, " %s", oi->interface->name); -  vty_out (vty, "\n"); - -  if (oa->ts_spf.tv_sec || oa->ts_spf.tv_usec) -    { -      result = monotime_since(&oa->ts_spf, NULL); -      if (result/TIMER_SECOND_MICRO > 0) -	{ -	  vty_out (vty, "SPF last executed %ld.%lds ago\n", -		   result/TIMER_SECOND_MICRO, -		   result % TIMER_SECOND_MICRO); +	struct listnode *i; +	struct ospf6_interface *oi; +	unsigned long result; + +	if (!IS_AREA_STUB(oa)) +		vty_out(vty, " Area %s\n", oa->name); +	else { +		if (oa->no_summary) { +			vty_out(vty, " Area %s[Stub, No Summary]\n", oa->name); +		} else { +			vty_out(vty, " Area %s[Stub]\n", oa->name); +		}  	} -      else -	{ -	  vty_out (vty, "SPF last executed %ldus ago\n", -		   result); +	vty_out(vty, "     Number of Area scoped LSAs is %u\n", +		oa->lsdb->count); + +	vty_out(vty, "     Interface attached to this area:"); +	for (ALL_LIST_ELEMENTS_RO(oa->if_list, i, oi)) +		vty_out(vty, " %s", oi->interface->name); +	vty_out(vty, "\n"); + +	if (oa->ts_spf.tv_sec || oa->ts_spf.tv_usec) { +		result = monotime_since(&oa->ts_spf, NULL); +		if (result / TIMER_SECOND_MICRO > 0) { +			vty_out(vty, "SPF last executed %ld.%lds ago\n", +				result / TIMER_SECOND_MICRO, +				result % TIMER_SECOND_MICRO); +		} else { +			vty_out(vty, "SPF last executed %ldus ago\n", result); +		} +	} else +		vty_out(vty, "SPF has not been run\n"); +} + + +#define OSPF6_CMD_AREA_GET(str, oa)                                            \ +	{                                                                      \ +		char *ep;                                                      \ +		u_int32_t area_id = htonl(strtoul(str, &ep, 10));              \ +		if (*ep && inet_pton(AF_INET, str, &area_id) != 1) {           \ +			vty_out(vty, "Malformed Area-ID: %s\n", str);          \ +			return CMD_SUCCESS;                                    \ +		}                                                              \ +		int format = !*ep ? OSPF6_AREA_FMT_DECIMAL                     \ +				  : OSPF6_AREA_FMT_DOTTEDQUAD;                 \ +		oa = ospf6_area_lookup(area_id, ospf6);                        \ +		if (oa == NULL)                                                \ +			oa = ospf6_area_create(area_id, ospf6, format);        \  	} -    } -  else -    vty_out (vty, "SPF has not been run\n"); -} - - -#define OSPF6_CMD_AREA_GET(str, oa)                        \ -{                                                          \ -  char *ep;                                                \ -  u_int32_t area_id = htonl (strtoul (str, &ep, 10));      \ -  if (*ep && inet_pton (AF_INET, str, &area_id) != 1)      \ -    {                                                      \ -      vty_out (vty, "Malformed Area-ID: %s\n", str);  \ -      return CMD_SUCCESS;                                  \ -    }                                                      \ -  int format = !*ep ? OSPF6_AREA_FMT_DECIMAL :             \ -                      OSPF6_AREA_FMT_DOTTEDQUAD;           \ -  oa = ospf6_area_lookup (area_id, ospf6);                 \ -  if (oa == NULL)                                          \ -    oa = ospf6_area_create (area_id, ospf6, format);       \ -}  DEFUN (area_range,         area_range_cmd, @@ -440,66 +401,58 @@ DEFUN (area_range,         "User specified metric for this range\n"         "Advertised metric for this range\n")  { -  int idx_ipv4 = 1; -  int idx_ipv6_prefixlen = 3; -  int idx_type = 4; -  int ret; -  struct ospf6_area *oa; -  struct prefix prefix; -  struct ospf6_route *range; -  u_int32_t cost = OSPF_AREA_RANGE_COST_UNSPEC; - -  OSPF6_CMD_AREA_GET (argv[idx_ipv4]->arg, oa); - -  ret = str2prefix (argv[idx_ipv6_prefixlen]->arg, &prefix); -  if (ret != 1 || prefix.family != AF_INET6) -    { -      vty_out (vty, "Malformed argument: %s\n", argv[idx_ipv6_prefixlen]->arg); -      return CMD_SUCCESS; -    } - -  range = ospf6_route_lookup (&prefix, oa->range_table); -  if (range == NULL) -    { -      range = ospf6_route_create (); -      range->type = OSPF6_DEST_TYPE_RANGE; -      range->prefix = prefix; -      range->path.area_id = oa->area_id; -      range->path.cost = OSPF_AREA_RANGE_COST_UNSPEC; -    } - -  if (argc > idx_type) -    { -      if (strmatch (argv[idx_type]->text, "not-advertise")) -	{ -	  SET_FLAG (range->flag, OSPF6_ROUTE_DO_NOT_ADVERTISE); +	int idx_ipv4 = 1; +	int idx_ipv6_prefixlen = 3; +	int idx_type = 4; +	int ret; +	struct ospf6_area *oa; +	struct prefix prefix; +	struct ospf6_route *range; +	u_int32_t cost = OSPF_AREA_RANGE_COST_UNSPEC; + +	OSPF6_CMD_AREA_GET(argv[idx_ipv4]->arg, oa); + +	ret = str2prefix(argv[idx_ipv6_prefixlen]->arg, &prefix); +	if (ret != 1 || prefix.family != AF_INET6) { +		vty_out(vty, "Malformed argument: %s\n", +			argv[idx_ipv6_prefixlen]->arg); +		return CMD_SUCCESS;  	} -      else if (strmatch (argv[idx_type]->text, "advertise")) -	{ -	  UNSET_FLAG (range->flag, OSPF6_ROUTE_DO_NOT_ADVERTISE); + +	range = ospf6_route_lookup(&prefix, oa->range_table); +	if (range == NULL) { +		range = ospf6_route_create(); +		range->type = OSPF6_DEST_TYPE_RANGE; +		range->prefix = prefix; +		range->path.area_id = oa->area_id; +		range->path.cost = OSPF_AREA_RANGE_COST_UNSPEC;  	} -      else -	{ -	  cost = strtoul(argv[5]->arg, NULL, 10); -	  UNSET_FLAG (range->flag, OSPF6_ROUTE_DO_NOT_ADVERTISE); + +	if (argc > idx_type) { +		if (strmatch(argv[idx_type]->text, "not-advertise")) { +			SET_FLAG(range->flag, OSPF6_ROUTE_DO_NOT_ADVERTISE); +		} else if (strmatch(argv[idx_type]->text, "advertise")) { +			UNSET_FLAG(range->flag, OSPF6_ROUTE_DO_NOT_ADVERTISE); +		} else { +			cost = strtoul(argv[5]->arg, NULL, 10); +			UNSET_FLAG(range->flag, OSPF6_ROUTE_DO_NOT_ADVERTISE); +		}  	} -    } -  range->path.u.cost_config = cost; +	range->path.u.cost_config = cost; -  zlog_debug ("%s: for prefix %s, flag = %x\n", __func__, argv[idx_ipv6_prefixlen]->arg, range->flag); -  if (range->rnode == NULL) -    { -      ospf6_route_add (range, oa->range_table); -    } +	zlog_debug("%s: for prefix %s, flag = %x\n", __func__, +		   argv[idx_ipv6_prefixlen]->arg, range->flag); +	if (range->rnode == NULL) { +		ospf6_route_add(range, oa->range_table); +	} -  if (ospf6_is_router_abr (ospf6)) -    { -      /* Redo summaries if required */ -      ospf6_abr_prefix_resummarize (ospf6); -    } +	if (ospf6_is_router_abr(ospf6)) { +		/* Redo summaries if required */ +		ospf6_abr_prefix_resummarize(ospf6); +	} -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (no_area_range, @@ -516,96 +469,91 @@ DEFUN (no_area_range,         "User specified metric for this range\n"         "Advertised metric for this range\n")  { -  int idx_ipv4 = 2; -  int idx_ipv6 = 4; -  int ret; -  struct ospf6_area *oa; -  struct prefix prefix; -  struct ospf6_route *range, *route; - -  OSPF6_CMD_AREA_GET (argv[idx_ipv4]->arg, oa); - -  ret = str2prefix (argv[idx_ipv6]->arg, &prefix); -  if (ret != 1 || prefix.family != AF_INET6) -    { -      vty_out (vty, "Malformed argument: %s\n", argv[idx_ipv6]->arg); -      return CMD_SUCCESS; -    } - -  range = ospf6_route_lookup (&prefix, oa->range_table); -  if (range == NULL) -    { -      vty_out (vty, "Range %s does not exists.\n", argv[idx_ipv6]->arg); -      return CMD_SUCCESS; -    } - -  if (ospf6_is_router_abr(oa->ospf6)) -    { -      /* Blow away the aggregated LSA and route */ -      SET_FLAG (range->flag, OSPF6_ROUTE_REMOVE); - -      /* Redo summaries if required */ -      for (route = ospf6_route_head (ospf6->route_table); route; -	   route = ospf6_route_next (route)) -	ospf6_abr_originate_summary(route); - -      /* purge the old aggregated summary LSA */ -      ospf6_abr_originate_summary(range); -    } -  ospf6_route_remove (range, oa->range_table); - -  return CMD_SUCCESS; -} +	int idx_ipv4 = 2; +	int idx_ipv6 = 4; +	int ret; +	struct ospf6_area *oa; +	struct prefix prefix; +	struct ospf6_route *range, *route; -void -ospf6_area_config_write (struct vty *vty) -{ -  struct listnode *node; -  struct ospf6_area *oa; -  struct ospf6_route *range; -  char buf[PREFIX2STR_BUFFER]; - -  for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, node, oa)) -    { -      for (range = ospf6_route_head (oa->range_table); range; -           range = ospf6_route_next (range)) -        { -          prefix2str (&range->prefix, buf, sizeof (buf)); -          vty_out (vty, " area %s range %s", oa->name, buf); - -          if (CHECK_FLAG (range->flag, OSPF6_ROUTE_DO_NOT_ADVERTISE)) -            { -              vty_out (vty, " not-advertise"); -            } -          else -            { -              // "advertise" is the default so we do not display it -              if (range->path.u.cost_config != OSPF_AREA_RANGE_COST_UNSPEC) -                vty_out (vty, " cost %d", range->path.u.cost_config); -            } -          vty_out (vty, "\n"); - -        } -      if (IS_AREA_STUB (oa)) -	{ -	  if (oa->no_summary) -	    vty_out (vty, " area %s stub no-summary\n", oa->name); -	  else -	    vty_out (vty, " area %s stub\n", oa->name); +	OSPF6_CMD_AREA_GET(argv[idx_ipv4]->arg, oa); + +	ret = str2prefix(argv[idx_ipv6]->arg, &prefix); +	if (ret != 1 || prefix.family != AF_INET6) { +		vty_out(vty, "Malformed argument: %s\n", argv[idx_ipv6]->arg); +		return CMD_SUCCESS; +	} + +	range = ospf6_route_lookup(&prefix, oa->range_table); +	if (range == NULL) { +		vty_out(vty, "Range %s does not exists.\n", +			argv[idx_ipv6]->arg); +		return CMD_SUCCESS; +	} + +	if (ospf6_is_router_abr(oa->ospf6)) { +		/* Blow away the aggregated LSA and route */ +		SET_FLAG(range->flag, OSPF6_ROUTE_REMOVE); + +		/* Redo summaries if required */ +		for (route = ospf6_route_head(ospf6->route_table); route; +		     route = ospf6_route_next(route)) +			ospf6_abr_originate_summary(route); + +		/* purge the old aggregated summary LSA */ +		ospf6_abr_originate_summary(range); +	} +	ospf6_route_remove(range, oa->range_table); + +	return CMD_SUCCESS; +} + +void ospf6_area_config_write(struct vty *vty) +{ +	struct listnode *node; +	struct ospf6_area *oa; +	struct ospf6_route *range; +	char buf[PREFIX2STR_BUFFER]; + +	for (ALL_LIST_ELEMENTS_RO(ospf6->area_list, node, oa)) { +		for (range = ospf6_route_head(oa->range_table); range; +		     range = ospf6_route_next(range)) { +			prefix2str(&range->prefix, buf, sizeof(buf)); +			vty_out(vty, " area %s range %s", oa->name, buf); + +			if (CHECK_FLAG(range->flag, +				       OSPF6_ROUTE_DO_NOT_ADVERTISE)) { +				vty_out(vty, " not-advertise"); +			} else { +				// "advertise" is the default so we do not +				// display it +				if (range->path.u.cost_config +				    != OSPF_AREA_RANGE_COST_UNSPEC) +					vty_out(vty, " cost %d", +						range->path.u.cost_config); +			} +			vty_out(vty, "\n"); +		} +		if (IS_AREA_STUB(oa)) { +			if (oa->no_summary) +				vty_out(vty, " area %s stub no-summary\n", +					oa->name); +			else +				vty_out(vty, " area %s stub\n", oa->name); +		} +		if (PREFIX_NAME_IN(oa)) +			vty_out(vty, " area %s filter-list prefix %s in\n", +				oa->name, PREFIX_NAME_IN(oa)); +		if (PREFIX_NAME_OUT(oa)) +			vty_out(vty, " area %s filter-list prefix %s out\n", +				oa->name, PREFIX_NAME_OUT(oa)); +		if (IMPORT_NAME(oa)) +			vty_out(vty, " area %s import-list %s\n", oa->name, +				IMPORT_NAME(oa)); +		if (EXPORT_NAME(oa)) +			vty_out(vty, " area %s export-list %s\n", oa->name, +				EXPORT_NAME(oa));  	} -      if (PREFIX_NAME_IN (oa)) -        vty_out (vty, " area %s filter-list prefix %s in\n", -                 oa->name, PREFIX_NAME_IN (oa)); -      if (PREFIX_NAME_OUT (oa)) -        vty_out (vty, " area %s filter-list prefix %s out\n", -                 oa->name, PREFIX_NAME_OUT (oa)); -      if (IMPORT_NAME (oa)) -        vty_out (vty, " area %s import-list %s\n", -                 oa->name, IMPORT_NAME (oa)); -      if (EXPORT_NAME (oa)) -        vty_out (vty, " area %s export-list %s\n", -                 oa->name, EXPORT_NAME (oa)); -    }  }  DEFUN (area_filter_list, @@ -619,38 +567,35 @@ DEFUN (area_filter_list,         "Filter networks sent to this area\n"         "Filter networks sent from this area\n")  { -  char *inout = argv[argc - 1]->text; -  char *areaid = argv[1]->arg; -  char *plistname = argv[4]->arg; - -  struct ospf6_area *area; -  struct prefix_list *plist; - -  OSPF6_CMD_AREA_GET (areaid, area); - -  plist = prefix_list_lookup (AFI_IP6, plistname); -  if (strmatch (inout, "in")) -    { -      PREFIX_LIST_IN (area) = plist; -      if (PREFIX_NAME_IN (area)) -	free (PREFIX_NAME_IN (area)); - -      PREFIX_NAME_IN (area) = strdup (plistname); -      ospf6_abr_reimport (area); -    } -  else -    { -      PREFIX_LIST_OUT (area) = plist; -      if (PREFIX_NAME_OUT (area)) -	free (PREFIX_NAME_OUT (area)); - -      PREFIX_NAME_OUT (area) = strdup (plistname); -      ospf6_abr_enable_area (area); -    } - -  return CMD_SUCCESS; +	char *inout = argv[argc - 1]->text; +	char *areaid = argv[1]->arg; +	char *plistname = argv[4]->arg; + +	struct ospf6_area *area; +	struct prefix_list *plist; + +	OSPF6_CMD_AREA_GET(areaid, area); + +	plist = prefix_list_lookup(AFI_IP6, plistname); +	if (strmatch(inout, "in")) { +		PREFIX_LIST_IN(area) = plist; +		if (PREFIX_NAME_IN(area)) +			free(PREFIX_NAME_IN(area)); + +		PREFIX_NAME_IN(area) = strdup(plistname); +		ospf6_abr_reimport(area); +	} else { +		PREFIX_LIST_OUT(area) = plist; +		if (PREFIX_NAME_OUT(area)) +			free(PREFIX_NAME_OUT(area)); + +		PREFIX_NAME_OUT(area) = strdup(plistname); +		ospf6_abr_enable_area(area); +	} + +	return CMD_SUCCESS;  } -      +  DEFUN (no_area_filter_list,         no_area_filter_list_cmd,         "no area A.B.C.D filter-list prefix WORD <in|out>", @@ -663,42 +608,39 @@ DEFUN (no_area_filter_list,         "Filter networks sent to this area\n"         "Filter networks sent from this area\n")  { -  char *inout = argv[argc - 1]->text; -  char *areaid = argv[2]->arg; -  char *plistname = argv[5]->arg; - -  struct ospf6_area *area; - -  OSPF6_CMD_AREA_GET (areaid, area); - -  if (strmatch (inout, "in")) -    { -      if (PREFIX_NAME_IN (area)) -	if (!strmatch (PREFIX_NAME_IN (area), plistname)) -	  return CMD_SUCCESS; - -      PREFIX_LIST_IN (area) = NULL; -      if (PREFIX_NAME_IN (area)) -	free (PREFIX_NAME_IN (area)); - -      PREFIX_NAME_IN (area) = NULL; -      ospf6_abr_reimport (area); -    } -  else -    { -      if (PREFIX_NAME_OUT (area)) -	if (!strmatch (PREFIX_NAME_OUT (area), plistname)) -	  return CMD_SUCCESS; - -      PREFIX_LIST_OUT (area) = NULL; -      if (PREFIX_NAME_OUT (area)) -	free (PREFIX_NAME_OUT (area)); - -      PREFIX_NAME_OUT (area) = NULL; -      ospf6_abr_enable_area (area); -    } - -  return CMD_SUCCESS; +	char *inout = argv[argc - 1]->text; +	char *areaid = argv[2]->arg; +	char *plistname = argv[5]->arg; + +	struct ospf6_area *area; + +	OSPF6_CMD_AREA_GET(areaid, area); + +	if (strmatch(inout, "in")) { +		if (PREFIX_NAME_IN(area)) +			if (!strmatch(PREFIX_NAME_IN(area), plistname)) +				return CMD_SUCCESS; + +		PREFIX_LIST_IN(area) = NULL; +		if (PREFIX_NAME_IN(area)) +			free(PREFIX_NAME_IN(area)); + +		PREFIX_NAME_IN(area) = NULL; +		ospf6_abr_reimport(area); +	} else { +		if (PREFIX_NAME_OUT(area)) +			if (!strmatch(PREFIX_NAME_OUT(area), plistname)) +				return CMD_SUCCESS; + +		PREFIX_LIST_OUT(area) = NULL; +		if (PREFIX_NAME_OUT(area)) +			free(PREFIX_NAME_OUT(area)); + +		PREFIX_NAME_OUT(area) = NULL; +		ospf6_abr_enable_area(area); +	} + +	return CMD_SUCCESS;  }  DEFUN (area_import_list, @@ -709,24 +651,24 @@ DEFUN (area_import_list,         "Set the filter for networks from other areas announced to the specified one\n"         "Name of the acess-list\n")  { -  int idx_ipv4 = 1; -  int idx_name = 3; -  struct ospf6_area *area; -  struct access_list *list; +	int idx_ipv4 = 1; +	int idx_name = 3; +	struct ospf6_area *area; +	struct access_list *list; -  OSPF6_CMD_AREA_GET(argv[idx_ipv4]->arg, area); +	OSPF6_CMD_AREA_GET(argv[idx_ipv4]->arg, area); -  list = access_list_lookup (AFI_IP6, argv[idx_name]->arg); +	list = access_list_lookup(AFI_IP6, argv[idx_name]->arg); -  IMPORT_LIST (area) = list; +	IMPORT_LIST(area) = list; -  if (IMPORT_NAME (area)) -    free (IMPORT_NAME (area)); +	if (IMPORT_NAME(area)) +		free(IMPORT_NAME(area)); -  IMPORT_NAME (area) = strdup (argv[idx_name]->arg); -  ospf6_abr_reimport (area); +	IMPORT_NAME(area) = strdup(argv[idx_name]->arg); +	ospf6_abr_reimport(area); -  return CMD_SUCCESS;  +	return CMD_SUCCESS;  }  DEFUN (no_area_import_list, @@ -738,20 +680,20 @@ DEFUN (no_area_import_list,         "Unset the filter for networks announced to other areas\n"         "Name of the access-list\n")  { -  int idx_ipv4 = 2; -  struct ospf6_area *area; +	int idx_ipv4 = 2; +	struct ospf6_area *area; -  OSPF6_CMD_AREA_GET(argv[idx_ipv4]->arg, area); +	OSPF6_CMD_AREA_GET(argv[idx_ipv4]->arg, area); -  IMPORT_LIST (area) = 0; +	IMPORT_LIST(area) = 0; -  if (IMPORT_NAME (area)) -    free (IMPORT_NAME (area)); +	if (IMPORT_NAME(area)) +		free(IMPORT_NAME(area)); -  IMPORT_NAME (area) = NULL; -  ospf6_abr_reimport (area); +	IMPORT_NAME(area) = NULL; +	ospf6_abr_reimport(area); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (area_export_list, @@ -762,24 +704,24 @@ DEFUN (area_export_list,         "Set the filter for networks announced to other areas\n"         "Name of the acess-list\n")  { -  int idx_ipv4 = 1; -  int idx_name = 3; -  struct ospf6_area *area; -  struct access_list *list; +	int idx_ipv4 = 1; +	int idx_name = 3; +	struct ospf6_area *area; +	struct access_list *list; -  OSPF6_CMD_AREA_GET(argv[idx_ipv4]->arg, area); +	OSPF6_CMD_AREA_GET(argv[idx_ipv4]->arg, area); -  list = access_list_lookup (AFI_IP6, argv[idx_name]->arg); +	list = access_list_lookup(AFI_IP6, argv[idx_name]->arg); -  EXPORT_LIST (area) = list; +	EXPORT_LIST(area) = list; -  if (EXPORT_NAME (area)) -    free (EXPORT_NAME (area)); +	if (EXPORT_NAME(area)) +		free(EXPORT_NAME(area)); -  EXPORT_NAME (area) = strdup (argv[idx_name]->arg); -  ospf6_abr_enable_area (area); +	EXPORT_NAME(area) = strdup(argv[idx_name]->arg); +	ospf6_abr_enable_area(area); -  return CMD_SUCCESS;  +	return CMD_SUCCESS;  }  DEFUN (no_area_export_list, @@ -791,20 +733,20 @@ DEFUN (no_area_export_list,         "Unset the filter for networks announced to other areas\n"         "Name of the access-list\n")  { -  int idx_ipv4 = 2; -  struct ospf6_area *area; +	int idx_ipv4 = 2; +	struct ospf6_area *area; -  OSPF6_CMD_AREA_GET(argv[idx_ipv4]->arg, area); +	OSPF6_CMD_AREA_GET(argv[idx_ipv4]->arg, area); -  EXPORT_LIST (area) = 0; +	EXPORT_LIST(area) = 0; -  if (EXPORT_NAME (area)) -    free (EXPORT_NAME (area)); +	if (EXPORT_NAME(area)) +		free(EXPORT_NAME(area)); -  EXPORT_NAME (area) = NULL; -  ospf6_abr_enable_area (area); +	EXPORT_NAME(area) = NULL; +	ospf6_abr_enable_area(area); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (show_ipv6_ospf6_spf_tree, @@ -816,30 +758,28 @@ DEFUN (show_ipv6_ospf6_spf_tree,         "Shortest Path First caculation\n"         "Show SPF tree\n")  { -  struct listnode *node; -  struct ospf6_area *oa; -  struct ospf6_vertex *root; -  struct ospf6_route *route; -  struct prefix prefix; - -  OSPF6_CMD_CHECK_RUNNING (); - -  ospf6_linkstate_prefix (ospf6->router_id, htonl (0), &prefix); - -  for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, node, oa)) -    { -      route = ospf6_route_lookup (&prefix, oa->spf_table); -      if (route == NULL) -        { -          vty_out (vty, "LS entry for root not found in area %s\n", -                   oa->name); -          continue; -        } -      root = (struct ospf6_vertex *) route->route_option; -      ospf6_spf_display_subtree (vty, "", 0, root); -    } - -  return CMD_SUCCESS; +	struct listnode *node; +	struct ospf6_area *oa; +	struct ospf6_vertex *root; +	struct ospf6_route *route; +	struct prefix prefix; + +	OSPF6_CMD_CHECK_RUNNING(); + +	ospf6_linkstate_prefix(ospf6->router_id, htonl(0), &prefix); + +	for (ALL_LIST_ELEMENTS_RO(ospf6->area_list, node, oa)) { +		route = ospf6_route_lookup(&prefix, oa->spf_table); +		if (route == NULL) { +			vty_out(vty, "LS entry for root not found in area %s\n", +				oa->name); +			continue; +		} +		root = (struct ospf6_vertex *)route->route_option; +		ospf6_spf_display_subtree(vty, "", 0, root); +	} + +	return CMD_SUCCESS;  }  DEFUN (show_ipv6_ospf6_area_spf_tree, @@ -853,40 +793,37 @@ DEFUN (show_ipv6_ospf6_area_spf_tree,         "Shortest Path First caculation\n"         "Show SPF tree\n")  { -  int idx_ipv4 = 4; -  u_int32_t area_id; -  struct ospf6_area *oa; -  struct ospf6_vertex *root; -  struct ospf6_route *route; -  struct prefix prefix; - -  OSPF6_CMD_CHECK_RUNNING (); - -  ospf6_linkstate_prefix (ospf6->router_id, htonl (0), &prefix); - -  if (inet_pton (AF_INET, argv[idx_ipv4]->arg, &area_id) != 1) -    { -      vty_out (vty, "Malformed Area-ID: %s\n", argv[idx_ipv4]->arg); -      return CMD_SUCCESS; -    } -  oa = ospf6_area_lookup (area_id, ospf6); -  if (oa == NULL) -    { -      vty_out (vty, "No such Area: %s\n", argv[idx_ipv4]->arg); -      return CMD_SUCCESS; -    } - -  route = ospf6_route_lookup (&prefix, oa->spf_table); -  if (route == NULL) -    { -      vty_out (vty, "LS entry for root not found in area %s\n", -               oa->name); -      return CMD_SUCCESS; -    } -  root = (struct ospf6_vertex *) route->route_option; -  ospf6_spf_display_subtree (vty, "", 0, root); - -  return CMD_SUCCESS; +	int idx_ipv4 = 4; +	u_int32_t area_id; +	struct ospf6_area *oa; +	struct ospf6_vertex *root; +	struct ospf6_route *route; +	struct prefix prefix; + +	OSPF6_CMD_CHECK_RUNNING(); + +	ospf6_linkstate_prefix(ospf6->router_id, htonl(0), &prefix); + +	if (inet_pton(AF_INET, argv[idx_ipv4]->arg, &area_id) != 1) { +		vty_out(vty, "Malformed Area-ID: %s\n", argv[idx_ipv4]->arg); +		return CMD_SUCCESS; +	} +	oa = ospf6_area_lookup(area_id, ospf6); +	if (oa == NULL) { +		vty_out(vty, "No such Area: %s\n", argv[idx_ipv4]->arg); +		return CMD_SUCCESS; +	} + +	route = ospf6_route_lookup(&prefix, oa->spf_table); +	if (route == NULL) { +		vty_out(vty, "LS entry for root not found in area %s\n", +			oa->name); +		return CMD_SUCCESS; +	} +	root = (struct ospf6_vertex *)route->route_option; +	ospf6_spf_display_subtree(vty, "", 0, root); + +	return CMD_SUCCESS;  }  DEFUN (show_ipv6_ospf6_simulate_spf_tree_root, @@ -901,56 +838,53 @@ DEFUN (show_ipv6_ospf6_simulate_spf_tree_root,         "OSPF6 area parameters\n"         OSPF6_AREA_ID_STR)  { -  int idx_ipv4 = 5; -  int idx_ipv4_2 = 7; -  u_int32_t area_id; -  struct ospf6_area *oa; -  struct ospf6_vertex *root; -  struct ospf6_route *route; -  struct prefix prefix; -  u_int32_t router_id; -  struct ospf6_route_table *spf_table; -  unsigned char tmp_debug_ospf6_spf = 0; - -  OSPF6_CMD_CHECK_RUNNING (); - -  inet_pton (AF_INET, argv[idx_ipv4]->arg, &router_id); -  ospf6_linkstate_prefix (router_id, htonl (0), &prefix); - -  if (inet_pton (AF_INET, argv[idx_ipv4_2]->arg, &area_id) != 1) -    { -      vty_out (vty, "Malformed Area-ID: %s\n", argv[idx_ipv4_2]->arg); -      return CMD_SUCCESS; -    } -  oa = ospf6_area_lookup (area_id, ospf6); -  if (oa == NULL) -    { -      vty_out (vty, "No such Area: %s\n", argv[idx_ipv4_2]->arg); -      return CMD_SUCCESS; -    } - -  tmp_debug_ospf6_spf = conf_debug_ospf6_spf; -  conf_debug_ospf6_spf = 0; - -  spf_table = OSPF6_ROUTE_TABLE_CREATE (NONE, SPF_RESULTS); -  ospf6_spf_calculation (router_id, spf_table, oa); - -  conf_debug_ospf6_spf = tmp_debug_ospf6_spf; - -  route = ospf6_route_lookup (&prefix, spf_table); -  if (route == NULL) -    { -      ospf6_spf_table_finish (spf_table); -      ospf6_route_table_delete (spf_table); -      return CMD_SUCCESS; -    } -  root = (struct ospf6_vertex *) route->route_option; -  ospf6_spf_display_subtree (vty, "", 0, root); - -  ospf6_spf_table_finish (spf_table); -  ospf6_route_table_delete (spf_table); - -  return CMD_SUCCESS; +	int idx_ipv4 = 5; +	int idx_ipv4_2 = 7; +	u_int32_t area_id; +	struct ospf6_area *oa; +	struct ospf6_vertex *root; +	struct ospf6_route *route; +	struct prefix prefix; +	u_int32_t router_id; +	struct ospf6_route_table *spf_table; +	unsigned char tmp_debug_ospf6_spf = 0; + +	OSPF6_CMD_CHECK_RUNNING(); + +	inet_pton(AF_INET, argv[idx_ipv4]->arg, &router_id); +	ospf6_linkstate_prefix(router_id, htonl(0), &prefix); + +	if (inet_pton(AF_INET, argv[idx_ipv4_2]->arg, &area_id) != 1) { +		vty_out(vty, "Malformed Area-ID: %s\n", argv[idx_ipv4_2]->arg); +		return CMD_SUCCESS; +	} +	oa = ospf6_area_lookup(area_id, ospf6); +	if (oa == NULL) { +		vty_out(vty, "No such Area: %s\n", argv[idx_ipv4_2]->arg); +		return CMD_SUCCESS; +	} + +	tmp_debug_ospf6_spf = conf_debug_ospf6_spf; +	conf_debug_ospf6_spf = 0; + +	spf_table = OSPF6_ROUTE_TABLE_CREATE(NONE, SPF_RESULTS); +	ospf6_spf_calculation(router_id, spf_table, oa); + +	conf_debug_ospf6_spf = tmp_debug_ospf6_spf; + +	route = ospf6_route_lookup(&prefix, spf_table); +	if (route == NULL) { +		ospf6_spf_table_finish(spf_table); +		ospf6_route_table_delete(spf_table); +		return CMD_SUCCESS; +	} +	root = (struct ospf6_vertex *)route->route_option; +	ospf6_spf_display_subtree(vty, "", 0, root); + +	ospf6_spf_table_finish(spf_table); +	ospf6_route_table_delete(spf_table); + +	return CMD_SUCCESS;  }  DEFUN (ospf6_area_stub, @@ -961,20 +895,20 @@ DEFUN (ospf6_area_stub,         "OSPF6 area ID as a decimal value\n"         "Configure OSPF6 area as stub\n")  { -  int idx_ipv4_number = 1; -  struct ospf6_area *area; +	int idx_ipv4_number = 1; +	struct ospf6_area *area; -  OSPF6_CMD_AREA_GET(argv[idx_ipv4_number]->arg, area); +	OSPF6_CMD_AREA_GET(argv[idx_ipv4_number]->arg, area); -  if (!ospf6_area_stub_set (ospf6, area)) -    { -      vty_out (vty,"First deconfigure all virtual link through this area\n"); -      return CMD_WARNING_CONFIG_FAILED; -    } +	if (!ospf6_area_stub_set(ospf6, area)) { +		vty_out(vty, +			"First deconfigure all virtual link through this area\n"); +		return CMD_WARNING_CONFIG_FAILED; +	} -  ospf6_area_no_summary_unset (ospf6, area); +	ospf6_area_no_summary_unset(ospf6, area); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (ospf6_area_stub_no_summary, @@ -986,20 +920,20 @@ DEFUN (ospf6_area_stub_no_summary,         "Configure OSPF6 area as stub\n"         "Do not inject inter-area routes into stub\n")  { -  int idx_ipv4_number = 1; -  struct ospf6_area *area; +	int idx_ipv4_number = 1; +	struct ospf6_area *area; -  OSPF6_CMD_AREA_GET(argv[idx_ipv4_number]->arg, area); +	OSPF6_CMD_AREA_GET(argv[idx_ipv4_number]->arg, area); -  if (!ospf6_area_stub_set (ospf6, area)) -    { -      vty_out (vty,"First deconfigure all virtual link through this area\n"); -      return CMD_WARNING_CONFIG_FAILED; -    } +	if (!ospf6_area_stub_set(ospf6, area)) { +		vty_out(vty, +			"First deconfigure all virtual link through this area\n"); +		return CMD_WARNING_CONFIG_FAILED; +	} -  ospf6_area_no_summary_set (ospf6, area); +	ospf6_area_no_summary_set(ospf6, area); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (no_ospf6_area_stub, @@ -1011,15 +945,15 @@ DEFUN (no_ospf6_area_stub,         "OSPF6 area ID as a decimal value\n"         "Configure OSPF6 area as stub\n")  { -  int idx_ipv4_number = 2; -  struct ospf6_area *area; +	int idx_ipv4_number = 2; +	struct ospf6_area *area; -  OSPF6_CMD_AREA_GET(argv[idx_ipv4_number]->arg, area); +	OSPF6_CMD_AREA_GET(argv[idx_ipv4_number]->arg, area); -  ospf6_area_stub_unset (ospf6, area); -  ospf6_area_no_summary_unset (ospf6, area); +	ospf6_area_stub_unset(ospf6, area); +	ospf6_area_no_summary_unset(ospf6, area); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (no_ospf6_area_stub_no_summary, @@ -1032,40 +966,36 @@ DEFUN (no_ospf6_area_stub_no_summary,         "Configure OSPF6 area as stub\n"         "Do not inject inter-area routes into area\n")  { -  int idx_ipv4_number = 2; -  struct ospf6_area *area; +	int idx_ipv4_number = 2; +	struct ospf6_area *area; -  OSPF6_CMD_AREA_GET(argv[idx_ipv4_number]->arg, area); +	OSPF6_CMD_AREA_GET(argv[idx_ipv4_number]->arg, area); -  ospf6_area_stub_unset (ospf6, area); -  ospf6_area_no_summary_unset (ospf6, area); +	ospf6_area_stub_unset(ospf6, area); +	ospf6_area_no_summary_unset(ospf6, area); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  } -void -ospf6_area_init (void) +void ospf6_area_init(void)  { -  install_element (VIEW_NODE, &show_ipv6_ospf6_spf_tree_cmd); -  install_element (VIEW_NODE, &show_ipv6_ospf6_area_spf_tree_cmd); -  install_element (VIEW_NODE, &show_ipv6_ospf6_simulate_spf_tree_root_cmd); - -  install_element (OSPF6_NODE, &area_range_cmd); -  install_element (OSPF6_NODE, &no_area_range_cmd); -  install_element (OSPF6_NODE, &ospf6_area_stub_no_summary_cmd); -  install_element (OSPF6_NODE, &ospf6_area_stub_cmd); -  install_element (OSPF6_NODE, &no_ospf6_area_stub_no_summary_cmd); -  install_element (OSPF6_NODE, &no_ospf6_area_stub_cmd); +	install_element(VIEW_NODE, &show_ipv6_ospf6_spf_tree_cmd); +	install_element(VIEW_NODE, &show_ipv6_ospf6_area_spf_tree_cmd); +	install_element(VIEW_NODE, &show_ipv6_ospf6_simulate_spf_tree_root_cmd); +	install_element(OSPF6_NODE, &area_range_cmd); +	install_element(OSPF6_NODE, &no_area_range_cmd); +	install_element(OSPF6_NODE, &ospf6_area_stub_no_summary_cmd); +	install_element(OSPF6_NODE, &ospf6_area_stub_cmd); +	install_element(OSPF6_NODE, &no_ospf6_area_stub_no_summary_cmd); +	install_element(OSPF6_NODE, &no_ospf6_area_stub_cmd); -  install_element (OSPF6_NODE, &area_import_list_cmd); -  install_element (OSPF6_NODE, &no_area_import_list_cmd); -  install_element (OSPF6_NODE, &area_export_list_cmd); -  install_element (OSPF6_NODE, &no_area_export_list_cmd); -  install_element (OSPF6_NODE, &area_filter_list_cmd); -  install_element (OSPF6_NODE, &no_area_filter_list_cmd); +	install_element(OSPF6_NODE, &area_import_list_cmd); +	install_element(OSPF6_NODE, &no_area_import_list_cmd); +	install_element(OSPF6_NODE, &area_export_list_cmd); +	install_element(OSPF6_NODE, &no_area_export_list_cmd); +	install_element(OSPF6_NODE, &area_filter_list_cmd); +	install_element(OSPF6_NODE, &no_area_filter_list_cmd);  } - -  | 
